forked from router-for-me/CLIProxyAPIPlus
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsdk-access.html
More file actions
74 lines (72 loc) · 66.6 KB
/
sdk-access.html
File metadata and controls
74 lines (72 loc) · 66.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>@sdk/access SDK Reference | cliproxy++</title>
<meta name="description" content="cliproxyapi-plusplus documentation">
<meta name="generator" content="VitePress v1.6.4">
<link rel="preload stylesheet" href="/assets/style.Cv8KQT_A.css" as="style">
<link rel="preload stylesheet" href="/vp-icons.css" as="style">
<script type="module" src="/assets/app.DAWI9Mei.js"></script>
<link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/assets/chunks/theme.npqyt1PR.js">
<link rel="modulepreload" href="/assets/chunks/framework.DM0yugQT.js">
<link rel="modulepreload" href="/assets/sdk-access.md.R1OmYGl1.lean.js">
<link rel="icon" href="/favicon.ico">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-d8b57b2d><!--[--><!--]--><!--[--><span tabindex="-1" data-v-fcbfc0e0></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-fcbfc0e0>Skip to content</a><!--]--><!----><header class="VPNav" data-v-d8b57b2d data-v-7ad780c2><div class="VPNavBar" data-v-7ad780c2 data-v-9fd4d1dd><div class="wrapper" data-v-9fd4d1dd><div class="container" data-v-9fd4d1dd><div class="title" data-v-9fd4d1dd><div class="VPNavBarTitle has-sidebar" data-v-9fd4d1dd data-v-9f43907a><a class="title" href="/" data-v-9f43907a><!--[--><!--]--><!----><span data-v-9f43907a>cliproxy++</span><!--[--><!--]--></a></div></div><div class="content" data-v-9fd4d1dd><div class="content-body" data-v-9fd4d1dd><!--[--><!--]--><div class="VPNavBarSearch search" data-v-9fd4d1dd><!--[--><!----><div id="local-search"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><span class="vp-icon DocSearch-Search-Icon"></span><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-9fd4d1dd data-v-afb2845e><span id="main-nav-aria-label" class="visually-hidden" data-v-afb2845e> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Home</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/start-here" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Start Here</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/tutorials/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Tutorials</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/how-to/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>How-to</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/explanation/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Explanation</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Getting Started</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/provider-usage" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Providers</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/provider-catalog" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Provider Catalog</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operations/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Operations</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/routing-reference" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Reference</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/api/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>API</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/docsets/" tabindex="0" data-v-afb2845e data-v-815115f5><!--[--><span data-v-815115f5>Docsets</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-9fd4d1dd data-v-3f90c1a5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-3f90c1a5 data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-9fd4d1dd data-v-ef6192dc data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/kooshapari/cliproxyapi-plusplus" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-9fd4d1dd data-v-f953d92f data-v-bfe7971f><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-bfe7971f><span class="vpi-more-horizontal icon" data-v-bfe7971f></span></button><div class="menu" data-v-bfe7971f><div class="VPMenu" data-v-bfe7971f data-v-20ed86d6><!----><!--[--><!--[--><!----><div class="group" data-v-f953d92f><div class="item appearance" data-v-f953d92f><p class="label" data-v-f953d92f>Appearance</p><div class="appearance-action" data-v-f953d92f><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-f953d92f data-v-be9742d9 data-v-b4ccac88><span class="check" data-v-b4ccac88><span class="icon" data-v-b4ccac88><!--[--><span class="vpi-sun sun" data-v-be9742d9></span><span class="vpi-moon moon" data-v-be9742d9></span><!--]--></span></span></button></div></div></div><div class="group" data-v-f953d92f><div class="item social-links" data-v-f953d92f><div class="VPSocialLinks social-links-list" data-v-f953d92f data-v-e71e869c><!--[--><a class="VPSocialLink no-icon" href="https://github.com/kooshapari/cliproxyapi-plusplus" aria-label="github" target="_blank" rel="noopener" data-v-e71e869c data-v-60a9a2d3><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-9fd4d1dd data-v-6bee1efd><span class="container" data-v-6bee1efd><span class="top" data-v-6bee1efd></span><span class="middle" data-v-6bee1efd></span><span class="bottom" data-v-6bee1efd></span></span></button></div></div></div></div><div class="divider" data-v-9fd4d1dd><div class="divider-line" data-v-9fd4d1dd></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-d8b57b2d data-v-2488c25a><div class="container" data-v-2488c25a><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-2488c25a><span class="vpi-align-left menu-icon" data-v-2488c25a></span><span class="menu-text" data-v-2488c25a>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-2488c25a data-v-6b867909><button data-v-6b867909>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-d8b57b2d data-v-42c4c606><div class="curtain" data-v-42c4c606></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-42c4c606><span class="visually-hidden" id="sidebar-aria-label" data-v-42c4c606> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Guide</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Overview</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/getting-started" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Getting Started</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/install" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Install</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/provider-usage" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Provider Usage</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/provider-catalog" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Provider Catalog</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/provider-operations" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Provider Operations</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/troubleshooting" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Troubleshooting</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/planning/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Planning Boards</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>Reference</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/routing-reference" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Routing and Models</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/features/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Feature Guides</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/docsets/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Docsets</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-51288d80><section class="VPSidebarItem level-0" data-v-51288d80 data-v-0009425e><div class="item" role="button" tabindex="0" data-v-0009425e><div class="indicator" data-v-0009425e></div><h2 class="text" data-v-0009425e>API</h2><!----></div><div class="items" data-v-0009425e><!--[--><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/api/" data-v-0009425e><!--[--><p class="text" data-v-0009425e>API Index</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/api/openai-compatible" data-v-0009425e><!--[--><p class="text" data-v-0009425e>OpenAI-Compatible API</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/api/management" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Management API</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-0009425e data-v-0009425e><div class="item" data-v-0009425e><div class="indicator" data-v-0009425e></div><a class="VPLink link link" href="/api/operations" data-v-0009425e><!--[--><p class="text" data-v-0009425e>Operations API</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-d8b57b2d data-v-9a6c75ad><div class="VPDoc has-sidebar has-aside" data-v-9a6c75ad data-v-e6f2a212><!--[--><!--]--><div class="container" data-v-e6f2a212><div class="aside" data-v-e6f2a212><div class="aside-curtain" data-v-e6f2a212></div><div class="aside-container" data-v-e6f2a212><div class="aside-content" data-v-e6f2a212><div class="VPDocAside" data-v-e6f2a212 data-v-cb998dce><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-cb998dce data-v-f610f197><div class="content" data-v-f610f197><div class="outline-marker" data-v-f610f197></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-f610f197>On this page</div><ul class="VPDocOutlineItem root" data-v-f610f197 data-v-53c99d69><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-cb998dce></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e6f2a212><div class="content-container" data-v-e6f2a212><!--[--><!--]--><main class="main" data-v-e6f2a212><div style="position:relative;" class="vp-doc _sdk-access" data-v-e6f2a212><div><h1 id="sdk-access-sdk-reference" tabindex="-1">@sdk/access SDK Reference <a class="header-anchor" href="#sdk-access-sdk-reference" aria-label="Permalink to "@sdk/access SDK Reference""></a></h1><p>The <code>github.com/router-for-me/CLIProxyAPI/v6/sdk/access</code> package centralizes inbound request authentication for the proxy. It offers a lightweight manager that chains credential providers, so servers can reuse the same access control logic inside or outside the CLI runtime.</p><h2 id="importing" tabindex="-1">Importing <a class="header-anchor" href="#importing" aria-label="Permalink to "Importing""></a></h2><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">github.com/router-for-me/CLIProxyAPI/v6/sdk/access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><p>Add the module with <code>go get github.com/router-for-me/CLIProxyAPI/v6/sdk/access</code>.</p><h2 id="provider-registry" tabindex="-1">Provider Registry <a class="header-anchor" href="#provider-registry" aria-label="Permalink to "Provider Registry""></a></h2><p>Providers are registered globally and then attached to a <code>Manager</code> as a snapshot:</p><ul><li><code>RegisterProvider(type, provider)</code> installs a pre-initialized provider instance.</li><li>Registration order is preserved the first time each <code>type</code> is seen.</li><li><code>RegisteredProviders()</code> returns the providers in that order.</li></ul><h2 id="manager-lifecycle" tabindex="-1">Manager Lifecycle <a class="header-anchor" href="#manager-lifecycle" aria-label="Permalink to "Manager Lifecycle""></a></h2><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">manager </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">NewManager</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">manager.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SetProviders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">RegisteredProviders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">())</span></span></code></pre></div><ul><li><code>NewManager</code> constructs an empty manager.</li><li><code>SetProviders</code> replaces the provider slice using a defensive copy.</li><li><code>Providers</code> retrieves a snapshot that can be iterated safely from other goroutines.</li></ul><p>If the manager itself is <code>nil</code> or no providers are configured, the call returns <code>nil, nil</code>, allowing callers to treat access control as disabled.</p><h2 id="authenticating-requests" tabindex="-1">Authenticating Requests <a class="header-anchor" href="#authenticating-requests" aria-label="Permalink to "Authenticating Requests""></a></h2><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">result, authErr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> manager.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Authenticate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(ctx, req)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">switch</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> authErr </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> nil</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Authentication succeeded; result describes the provider and principal.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">IsAuthErrorCode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(authErr, sdkaccess.AuthErrorCodeNoCredentials):</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // No recognizable credentials were supplied.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">case</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">IsAuthErrorCode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(authErr, sdkaccess.AuthErrorCodeInvalidCredential):</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Supplied credentials were present but rejected.</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Internal/transport failure was returned by a provider.</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p><code>Manager.Authenticate</code> walks the configured providers in order. It returns on the first success, skips providers that return <code>AuthErrorCodeNotHandled</code>, and aggregates <code>AuthErrorCodeNoCredentials</code> / <code>AuthErrorCodeInvalidCredential</code> for a final result.</p><p>Each <code>Result</code> includes the provider identifier, the resolved principal, and optional metadata (for example, which header carried the credential).</p><h2 id="built-in-config-api-key-provider" tabindex="-1">Built-in <code>config-api-key</code> Provider <a class="header-anchor" href="#built-in-config-api-key-provider" aria-label="Permalink to "Built-in `config-api-key` Provider""></a></h2><p>The proxy includes one built-in access provider:</p><ul><li><code>config-api-key</code>: Validates API keys declared under top-level <code>api-keys</code>. <ul><li>Credential sources: <code>Authorization: Bearer</code>, <code>X-Goog-Api-Key</code>, <code>X-Api-Key</code>, <code>?key=</code>, <code>?auth_token=</code></li><li>Metadata: <code>Result.Metadata["source"]</code> is set to the matched source label.</li></ul></li></ul><p>In the CLI server and <code>sdk/cliproxy</code>, this provider is registered automatically based on the loaded configuration.</p><div class="language-yaml vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">yaml</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#22863A;--shiki-dark:#85E89D;">api-keys</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">sk-test-123</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> - </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">sk-prod-456</span></span></code></pre></div><h2 id="loading-providers-from-external-go-modules" tabindex="-1">Loading Providers from External Go Modules <a class="header-anchor" href="#loading-providers-from-external-go-modules" aria-label="Permalink to "Loading Providers from External Go Modules""></a></h2><p>To consume a provider shipped in another Go module, import it for its registration side effect:</p><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> _ </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">github.com/acme/xplatform/sdk/access/providers/partner</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // registers partner-token</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">github.com/router-for-me/CLIProxyAPI/v6/sdk/access</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span></code></pre></div><p>The blank identifier import ensures <code>init</code> runs so <code>sdkaccess.RegisterProvider</code> executes before you call <code>RegisteredProviders()</code> (or before <code>cliproxy.NewBuilder().Build()</code>).</p><h3 id="metadata-and-auditing" tabindex="-1">Metadata and auditing <a class="header-anchor" href="#metadata-and-auditing" aria-label="Permalink to "Metadata and auditing""></a></h3><p><code>Result.Metadata</code> carries provider-specific context. The built-in <code>config-api-key</code> provider, for example, stores the credential source (<code>authorization</code>, <code>x-goog-api-key</code>, <code>x-api-key</code>, <code>query-key</code>, <code>query-auth-token</code>). Populate this map in custom providers to enrich logs and downstream auditing.</p><h2 id="writing-custom-providers" tabindex="-1">Writing Custom Providers <a class="header-anchor" href="#writing-custom-providers" aria-label="Permalink to "Writing Custom Providers""></a></h2><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> customProvider</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> struct</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">func</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">customProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">return</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "my-provider"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">func</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">p </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">customProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Authenticate</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">ctx</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> context</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Context</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">r</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> *</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">http</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Request</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sdkaccess</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sdkaccess</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">AuthError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> token </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> r.Header.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Get</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"X-Custom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> token </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> ""</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> nil</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">NewNotHandledError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> token </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "expected"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> nil</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">NewInvalidCredentialError</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">sdkaccess</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Result</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Provider: p.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Identifier</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(),</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Principal: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"service-user"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> Metadata: </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"source"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"x-custom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">nil</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">func</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> init</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">() {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">RegisterProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"custom"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">customProvider</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{})</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>A provider must implement <code>Identifier()</code> and <code>Authenticate()</code>. To make it available to the access manager, call <code>RegisterProvider</code> inside <code>init</code> with an initialized provider instance.</p><h2 id="error-semantics" tabindex="-1">Error Semantics <a class="header-anchor" href="#error-semantics" aria-label="Permalink to "Error Semantics""></a></h2><ul><li><code>NewNoCredentialsError()</code> (<code>AuthErrorCodeNoCredentials</code>): no credentials were present or recognized. (HTTP 401)</li><li><code>NewInvalidCredentialError()</code> (<code>AuthErrorCodeInvalidCredential</code>): credentials were present but rejected. (HTTP 401)</li><li><code>NewNotHandledError()</code> (<code>AuthErrorCodeNotHandled</code>): fall through to the next provider.</li><li><code>NewInternalAuthError(message, cause)</code> (<code>AuthErrorCodeInternal</code>): transport/system failure. (HTTP 500)</li></ul><p>Errors propagate immediately to the caller unless they are classified as <code>not_handled</code> / <code>no_credentials</code> / <code>invalid_credential</code> and can be aggregated by the manager.</p><h2 id="integration-with-cliproxy-service" tabindex="-1">Integration with cliproxy Service <a class="header-anchor" href="#integration-with-cliproxy-service" aria-label="Permalink to "Integration with cliproxy Service""></a></h2><p><code>sdk/cliproxy</code> wires <code>@sdk/access</code> automatically when you build a CLI service via <code>cliproxy.NewBuilder</code>. Supplying a manager lets you reuse the same instance in your host process:</p><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">coreCfg, _ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> config.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">LoadConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"config.yaml"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">accessManager </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">NewManager</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">svc, _ </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cliproxy.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">NewBuilder</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">().</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> WithConfig</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(coreCfg).</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> WithConfigPath</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"config.yaml"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">).</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> WithRequestAccessManager</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(accessManager).</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Build</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">()</span></span></code></pre></div><p>Register any custom providers (typically via blank imports) before calling <code>Build()</code> so they are present in the global registry snapshot.</p><h3 id="hot-reloading" tabindex="-1">Hot reloading <a class="header-anchor" href="#hot-reloading" aria-label="Permalink to "Hot reloading""></a></h3><p>When configuration changes, refresh any config-backed providers and then reset the manager's provider chain:</p><div class="language-go vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">go</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// configaccess is github.com/router-for-me/CLIProxyAPI/v6/internal/access/config_access</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">configaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Register</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">newCfg.SDKConfig)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">accessManager.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">SetProviders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(sdkaccess.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">RegisteredProviders</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">())</span></span></code></pre></div><p>This mirrors the behaviour in <code>internal/access.ApplyAccessProviders</code>, enabling runtime updates without restarting the process.</p></div></div></main><footer class="VPDocFooter" data-v-e6f2a212 data-v-1bcd8184><!--[--><!--]--><div class="edit-info" data-v-1bcd8184><div class="edit-link" data-v-1bcd8184><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/kooshapari/cliproxyapi-plusplus/edit/main/docs/sdk-access.md" target="_blank" rel="noreferrer" data-v-1bcd8184><!--[--><span class="vpi-square-pen edit-link-icon" data-v-1bcd8184></span> Edit this page on GitHub<!--]--></a></div><div class="last-updated" data-v-1bcd8184><p class="VPLastUpdated" data-v-1bcd8184 data-v-1bb0c8a8>Last updated: <time datetime="2026-02-23T19:30:03.000Z" data-v-1bb0c8a8></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-1bcd8184><span class="visually-hidden" id="doc-footer-aria-label" data-v-1bcd8184>Pager</span><div class="pager" data-v-1bcd8184><!----></div><div class="pager" data-v-1bcd8184><a class="VPLink link pager-link next" href="/" data-v-1bcd8184><!--[--><span class="desc" data-v-1bcd8184>Next page</span><span class="title" data-v-1bcd8184>Overview</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-d8b57b2d data-v-566314d4><div class="container" data-v-566314d4><p class="message" data-v-566314d4>MIT Licensed</p><p class="copyright" data-v-566314d4>Copyright © KooshaPari</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api_index.md\":\"ImrqiJgr\",\"api_management.md\":\"lGGkN-0C\",\"api_openai-compatible.md\":\"Dhu44ytv\",\"api_operations.md\":\"9Qla852d\",\"changelog.md\":\"Cc6QY3br\",\"docsets_agent_index.md\":\"CxN-_8SL\",\"docsets_agent_operating-model.md\":\"CYYY60ot\",\"docsets_developer_external_index.md\":\"B69TCsc8\",\"docsets_developer_external_integration-quickstart.md\":\"BGItAi6b\",\"docsets_developer_internal_architecture.md\":\"BwBu7YTK\",\"docsets_developer_internal_index.md\":\"C2tqXsI_\",\"docsets_index.md\":\"CU2OxJch\",\"docsets_user_index.md\":\"vyTQrykk\",\"docsets_user_quickstart.md\":\"BFPqrbuL\",\"explanation_index.md\":\"BEHIMD2E\",\"fa-latn_index.md\":\"D-x2KJWe\",\"fa_index.md\":\"CKTYSxdB\",\"feature_changes_plusplus.md\":\"Upjze_uT\",\"features_architecture_dev.md\":\"BleYaY8C\",\"features_architecture_fragemented_dev.md\":\"FClrr7kh\",\"features_architecture_fragemented_explanation.md\":\"CqMvGe1x\",\"features_architecture_fragemented_index.md\":\"BZSwbl5P\",\"features_architecture_fragemented_merged.md\":\"9Fe0IB0f\",\"features_architecture_fragemented_readme.md\":\"BaeSeE74\",\"features_architecture_fragemented_spec.md\":\"Dj96mGpc\",\"features_architecture_fragemented_user.md\":\"DiIY5f3S\",\"features_architecture_spec.md\":\"FkdurEmc\",\"features_architecture_user.md\":\"DrFQnjSR\",\"features_auth_dev.md\":\"6KaG4NWf\",\"features_auth_index.md\":\"CIWeGGHR\",\"features_auth_spec.md\":\"BWcPcd5W\",\"features_auth_user.md\":\"D-T6l7qu\",\"features_index.md\":\"CBCLnxOR\",\"features_operations_index.md\":\"1ZyZSTPT\",\"features_operations_spec.md\":\"DjgJMF_x\",\"features_operations_user.md\":\"DCjF3cjx\",\"features_providers_cpb-0782-opus-4-5-quickstart.md\":\"TBbi64Hn\",\"features_providers_cpb-0786-nano-banana-quickstart.md\":\"DSgIfjjW\",\"features_providers_fragemented_explanation.md\":\"C8Ic-hm-\",\"features_providers_fragemented_index.md\":\"CzWjP81k\",\"features_providers_fragemented_merged.md\":\"D6JUiY_n\",\"features_providers_fragemented_readme.md\":\"OrNypMgw\",\"features_providers_fragemented_spec.md\":\"YXL6s0P2\",\"features_providers_fragemented_user.md\":\"DZlqq6tE\",\"features_providers_spec.md\":\"nziW2bAK\",\"features_providers_user.md\":\"BgI_CAAo\",\"features_security_index.md\":\"txR9tRVd\",\"features_security_spec.md\":\"uSw1u2Ag\",\"features_security_user.md\":\"t3NIHGY9\",\"getting-started.md\":\"PuI7pHY9\",\"guides_changelog_entry_template.md\":\"BCmLEHv7\",\"guides_changelog_process.md\":\"D3GQPR-S\",\"guides_cpb-0701-0710-lane-e3-notes.md\":\"YXsbmv0a\",\"guides_cpb-0711-0720-lane-e4-notes.md\":\"DZ31y_fG\",\"guides_cpb-0721-0730-lane-d4-notes.md\":\"BHXHCmF_\",\"guides_cpb-0721-0730-lane-e5-notes.md\":\"Ttx_2FI0\",\"guides_project_setup_style.md\":\"Cll19vtq\",\"guides_quick-start_arm64_docker_provider_quickstart.md\":\"DfhW8tk6\",\"guides_release-batching.md\":\"CvbSAiVR\",\"how-to_index.md\":\"B6zNMS4d\",\"index.md\":\"CS04zCJ3\",\"install.md\":\"jl1-fBL5\",\"operations_auth-refresh-failure-symptom-fix.md\":\"BNffTl5J\",\"operations_checks-owner-responder-map.md\":\"C4JcFFgR\",\"operations_cpb-0783-gemini-3-pro-preview-hmr.md\":\"IMVbKucA\",\"operations_critical-endpoints-curl-pack.md\":\"BPbXRuul\",\"operations_distributed-fs-compute-status.md\":\"DPDO7Pb4\",\"operations_index.md\":\"mulfDN8D\",\"operations_kiro-idc-refresh-rollout.md\":\"BD3bRH7i\",\"operations_provider-outage-triage-quick-guide.md\":\"DL2H-TPt\",\"operations_release-governance.md\":\"BL3o7W1p\",\"operations_required-branch-check-ownership.md\":\"ByL2VfAw\",\"optimization_plan_2026-02-23.md\":\"Dk6KdPbt\",\"planning_agentapi-cliproxy-integration-research-2026-02-22.md\":\"B-06U1N3\",\"planning_board-workflow.md\":\"VnaMui1z\",\"planning_cliproxyapi_1000_item_board_2026-02-22.md\":\"DSlp_J8R\",\"planning_cliproxyapi_2000_item_execution_board_2026-02-22.md\":\"D0xvUGu3\",\"planning_coder-org-plus-relative-300-inventory-2026-02-22.md\":\"DvvIl2qT\",\"planning_coverage-gaps.md\":\"C_glORxB\",\"planning_docs_parity_p1_p2_plan_2026-02-23.md\":\"C2RDN_jr\",\"planning_index.md\":\"DTXn_2gw\",\"planning_issue-lanes-cliproxy-1000-2026-02-22.md\":\"BQy14v_o\",\"planning_issue-wave-codescan-0139-2026-02-23.md\":\"6oC46oFM\",\"planning_issue-wave-codescan-progress-2026-02-23.md\":\"BpfVFz9F\",\"planning_issue-wave-cpb-0001-0035-2026-02-22.md\":\"cytXPgg7\",\"planning_issue-wave-cpb-0036-0105-2026-02-22.md\":\"CtA7w5v_\",\"planning_issue-wave-cpb-0106-0175-2026-02-22.md\":\"BwnDAVVy\",\"planning_issue-wave-cpb-0176-0245-2026-02-22.md\":\"Ta48Sh7j\",\"planning_issue-wave-cpb-0246-0280-2026-02-22.md\":\"CD-k7yja\",\"planning_issue-wave-cpb-0281-0315-2026-02-22.md\":\"-u1qmiFk\",\"planning_issue-wave-cpb-0316-0350-2026-02-22.md\":\"CZhBsAaT\",\"planning_issue-wave-cpb-0351-0385-2026-02-22.md\":\"p0KR3l_L\",\"planning_issue-wave-cpb-0386-0420-2026-02-22.md\":\"DFol-ERm\",\"planning_issue-wave-cpb-0421-0455-2026-02-22.md\":\"CB_xFU0u\",\"planning_issue-wave-cpb-0456-0490-2026-02-22.md\":\"Ij0XRnk9\",\"planning_issue-wave-gh-35-2026-02-22.md\":\"BhNy4Jp1\",\"planning_issue-wave-gh-next21-2026-02-22.md\":\"DZJFfVyE\",\"planning_issue-wave-gh-next32-2026-02-22.md\":\"DIkXmxpU\",\"planning_readme.md\":\"BOzIPdcE\",\"planning_reports_fragemented_explanation.md\":\"CgCUuHzD\",\"planning_reports_fragemented_index.md\":\"BaweTIi6\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-1.md\":\"BaCA2Dn4\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-2.md\":\"DY5tGqIC\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-3.md\":\"BTCj0flT\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-4.md\":\"DEUUlEsl\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-5.md\":\"DHA_vryO\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-6.md\":\"HDh7asA5\",\"planning_reports_fragemented_issue-wave-cpb-0001-0035-lane-7.md\":\"DL65VYVI\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-1.md\":\"1--JMXis\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-2.md\":\"C1NEkcty\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-3.md\":\"9qaH7GY_\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-4.md\":\"DVwKtv96\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-5.md\":\"CIJ3jwoI\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-6.md\":\"633STijE\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-lane-7.md\":\"hlcrB-gZ\",\"planning_reports_fragemented_issue-wave-cpb-0036-0105-next-70-summary.md\":\"DFzY_O-F\",\"planning_reports_fragemented_issue-wave-gh-35-integration-summary-2026-02-22.md\":\"Bxq01nm4\",\"planning_reports_fragemented_issue-wave-gh-35-lane-1-self.md\":\"B_QVcMyq\",\"planning_reports_fragemented_issue-wave-gh-35-lane-1.md\":\"CVlXGf8o\",\"planning_reports_fragemented_issue-wave-gh-35-lane-2.md\":\"BrBTKj1L\",\"planning_reports_fragemented_issue-wave-gh-35-lane-3.md\":\"K_mYFfeW\",\"planning_reports_fragemented_issue-wave-gh-35-lane-4.md\":\"kTMNTfI6\",\"planning_reports_fragemented_issue-wave-gh-35-lane-5.md\":\"Qhut3FI4\",\"planning_reports_fragemented_issue-wave-gh-35-lane-6.md\":\"Nc9tQ9lP\",\"planning_reports_fragemented_issue-wave-gh-35-lane-7.md\":\"DOMMXX6r\",\"planning_reports_fragemented_merged.md\":\"CfzJZ6Ul\",\"planning_reports_fragemented_readme.md\":\"DfMtEHU8\",\"planning_reports_issue-wave-cp2k-0040-0050-lane-4-2026-02-23.md\":\"DhW5GZjA\",\"planning_reports_issue-wave-cp2k-next30-execution-summary-2026-02-23.md\":\"B3gIvzD0\",\"planning_reports_issue-wave-cp2k-next50-lane-2-2026-02-23.md\":\"CkmYfdvj\",\"planning_reports_issue-wave-cpb-0001-0035-lane-1.md\":\"Cp3Y1aHQ\",\"planning_reports_issue-wave-cpb-0001-0035-lane-2.md\":\"BmDYfEqO\",\"planning_reports_issue-wave-cpb-0001-0035-lane-3.md\":\"BIgKyIxp\",\"planning_reports_issue-wave-cpb-0001-0035-lane-4.md\":\"DrWUPi4A\",\"planning_reports_issue-wave-cpb-0001-0035-lane-5.md\":\"CUI7OxMy\",\"planning_reports_issue-wave-cpb-0001-0035-lane-6.md\":\"WIjHaO-h\",\"planning_reports_issue-wave-cpb-0001-0035-lane-7.md\":\"DDfJZp0H\",\"planning_reports_issue-wave-cpb-0036-0105-lane-1.md\":\"Bnkxfjzg\",\"planning_reports_issue-wave-cpb-0036-0105-lane-2.md\":\"jCPRg-fp\",\"planning_reports_issue-wave-cpb-0036-0105-lane-3.md\":\"CrXU1bR-\",\"planning_reports_issue-wave-cpb-0036-0105-lane-4.md\":\"CTbJxC6G\",\"planning_reports_issue-wave-cpb-0036-0105-lane-5.md\":\"DrtvrKSZ\",\"planning_reports_issue-wave-cpb-0036-0105-lane-6.md\":\"y5xfHXhM\",\"planning_reports_issue-wave-cpb-0036-0105-lane-7.md\":\"DoNtnN-F\",\"planning_reports_issue-wave-cpb-0036-0105-next-70-summary.md\":\"ZkbaBJg2\",\"planning_reports_issue-wave-cpb-0106-0175-lane-1.md\":\"BBxJ9y4y\",\"planning_reports_issue-wave-cpb-0106-0175-lane-2.md\":\"CnHehFRj\",\"planning_reports_issue-wave-cpb-0106-0175-lane-3.md\":\"CBx9LBJa\",\"planning_reports_issue-wave-cpb-0106-0175-lane-4.md\":\"pgwSsqgF\",\"planning_reports_issue-wave-cpb-0106-0175-lane-5.md\":\"QkeyKfUL\",\"planning_reports_issue-wave-cpb-0106-0175-lane-6.md\":\"xHfEiA96\",\"planning_reports_issue-wave-cpb-0106-0175-lane-7.md\":\"CjcqWjrn\",\"planning_reports_issue-wave-cpb-0106-0175-next-70-summary.md\":\"D4H_AsX4\",\"planning_reports_issue-wave-cpb-0138-0147-lane-1.md\":\"kkMP98GU\",\"planning_reports_issue-wave-cpb-0176-0245-lane-1.md\":\"bCreyPO7\",\"planning_reports_issue-wave-cpb-0176-0245-lane-2.md\":\"CUmP9Nux\",\"planning_reports_issue-wave-cpb-0176-0245-lane-3.md\":\"DvOdqrVe\",\"planning_reports_issue-wave-cpb-0176-0245-lane-4.md\":\"BV-_COVF\",\"planning_reports_issue-wave-cpb-0176-0245-lane-5.md\":\"DmMCfLyF\",\"planning_reports_issue-wave-cpb-0176-0245-lane-6.md\":\"C_jS6iez\",\"planning_reports_issue-wave-cpb-0176-0245-lane-7.md\":\"Diq-_qg8\",\"planning_reports_issue-wave-cpb-0176-0245-next-70-summary.md\":\"B-wwwLqS\",\"planning_reports_issue-wave-cpb-0246-0280-lane-1.md\":\"987gMsNB\",\"planning_reports_issue-wave-cpb-0246-0280-lane-2.md\":\"CiqwdfBK\",\"planning_reports_issue-wave-cpb-0246-0280-lane-3.md\":\"SNATAYxC\",\"planning_reports_issue-wave-cpb-0246-0280-lane-4.md\":\"BfO9yUSO\",\"planning_reports_issue-wave-cpb-0246-0280-lane-5.md\":\"d6uf1Ubc\",\"planning_reports_issue-wave-cpb-0246-0280-lane-6.md\":\"bJT_bGPi\",\"planning_reports_issue-wave-cpb-0246-0280-lane-7.md\":\"DXkDqLIH\",\"planning_reports_issue-wave-cpb-0246-0280-next-35-summary.md\":\"C23BTF6R\",\"planning_reports_issue-wave-cpb-0281-0315-lane-1.md\":\"CkpmkoC6\",\"planning_reports_issue-wave-cpb-0281-0315-lane-2.md\":\"CL8LE50h\",\"planning_reports_issue-wave-cpb-0281-0315-lane-3.md\":\"m1uri2TJ\",\"planning_reports_issue-wave-cpb-0281-0315-lane-4.md\":\"CDhi2Gt0\",\"planning_reports_issue-wave-cpb-0281-0315-lane-5.md\":\"Q9V8Pt1y\",\"planning_reports_issue-wave-cpb-0281-0315-lane-6.md\":\"DH38F4k0\",\"planning_reports_issue-wave-cpb-0281-0315-lane-7.md\":\"BnbNNy0M\",\"planning_reports_issue-wave-cpb-0281-0315-next-35-summary.md\":\"Cy5kcWX-\",\"planning_reports_issue-wave-cpb-0316-0350-lane-1.md\":\"DWkYQ3H1\",\"planning_reports_issue-wave-cpb-0316-0350-lane-2.md\":\"BzMzQdOB\",\"planning_reports_issue-wave-cpb-0316-0350-lane-3.md\":\"DgxDo7Lk\",\"planning_reports_issue-wave-cpb-0316-0350-lane-4.md\":\"BvEyJ096\",\"planning_reports_issue-wave-cpb-0316-0350-lane-5.md\":\"DfV0iijL\",\"planning_reports_issue-wave-cpb-0316-0350-lane-6.md\":\"Bsku0T-T\",\"planning_reports_issue-wave-cpb-0316-0350-lane-7.md\":\"BS3z-J5X\",\"planning_reports_issue-wave-cpb-0316-0350-next-35-summary.md\":\"CjiS80zK\",\"planning_reports_issue-wave-cpb-0327-0376-next-50-summary.md\":\"410jfk_2\",\"planning_reports_issue-wave-cpb-0351-0385-lane-1.md\":\"8RFbd2tO\",\"planning_reports_issue-wave-cpb-0351-0385-lane-2.md\":\"CUhUA8VV\",\"planning_reports_issue-wave-cpb-0351-0385-lane-3.md\":\"DCYCG9LE\",\"planning_reports_issue-wave-cpb-0351-0385-lane-4.md\":\"C5fEESOx\",\"planning_reports_issue-wave-cpb-0351-0385-lane-5.md\":\"DfA-s6Mx\",\"planning_reports_issue-wave-cpb-0351-0385-lane-6.md\":\"EgUYUHwF\",\"planning_reports_issue-wave-cpb-0351-0385-lane-7.md\":\"CtQ7ypdg\",\"planning_reports_issue-wave-cpb-0351-0385-next-35-summary.md\":\"UDHE_2hj\",\"planning_reports_issue-wave-cpb-0386-0420-lane-1.md\":\"OYzfmNfE\",\"planning_reports_issue-wave-cpb-0386-0420-lane-2.md\":\"3IPRnkwc\",\"planning_reports_issue-wave-cpb-0386-0420-lane-3.md\":\"BRc5k_5h\",\"planning_reports_issue-wave-cpb-0386-0420-lane-4.md\":\"xwLTvuIn\",\"planning_reports_issue-wave-cpb-0386-0420-lane-5.md\":\"CFEkMCVB\",\"planning_reports_issue-wave-cpb-0386-0420-lane-6.md\":\"C8PoPDJa\",\"planning_reports_issue-wave-cpb-0386-0420-lane-7.md\":\"atWmURZk\",\"planning_reports_issue-wave-cpb-0386-0420-next-35-summary.md\":\"C2ARgQ25\",\"planning_reports_issue-wave-cpb-0421-0455-lane-1.md\":\"jzg0BXrF\",\"planning_reports_issue-wave-cpb-0421-0455-lane-2.md\":\"D3QjYlSO\",\"planning_reports_issue-wave-cpb-0421-0455-lane-3.md\":\"CxvDqouL\",\"planning_reports_issue-wave-cpb-0421-0455-lane-4.md\":\"Da58bRsN\",\"planning_reports_issue-wave-cpb-0421-0455-lane-5.md\":\"CjXnkBjq\",\"planning_reports_issue-wave-cpb-0421-0455-lane-6.md\":\"CSq6llN5\",\"planning_reports_issue-wave-cpb-0421-0455-lane-7.md\":\"DEta9zTo\",\"planning_reports_issue-wave-cpb-0421-0455-next-35-summary.md\":\"DdshkDjI\",\"planning_reports_issue-wave-cpb-0456-0490-lane-1.md\":\"BhW57VVL\",\"planning_reports_issue-wave-cpb-0456-0490-lane-2.md\":\"DkOXnuCf\",\"planning_reports_issue-wave-cpb-0456-0490-lane-3.md\":\"KSVgTNmT\",\"planning_reports_issue-wave-cpb-0456-0490-lane-4.md\":\"CIM2izXS\",\"planning_reports_issue-wave-cpb-0456-0490-lane-5.md\":\"Cdes0-kt\",\"planning_reports_issue-wave-cpb-0456-0490-lane-6.md\":\"BOsCLWDM\",\"planning_reports_issue-wave-cpb-0456-0490-lane-7.md\":\"DcOgXSUc\",\"planning_reports_issue-wave-cpb-0456-0490-next-35-summary.md\":\"UgHJJK9v\",\"planning_reports_issue-wave-cpb-0491-0540-lane-1.md\":\"vEQ3xC8q\",\"planning_reports_issue-wave-cpb-0491-0540-lane-2.md\":\"Bp8RKAiq\",\"planning_reports_issue-wave-cpb-0491-0540-lane-3.md\":\"DupmSEoV\",\"planning_reports_issue-wave-cpb-0491-0540-lane-4.md\":\"BlvFGfC9\",\"planning_reports_issue-wave-cpb-0491-0540-lane-5.md\":\"BPAUSI6J\",\"planning_reports_issue-wave-cpb-0491-0540-lane-6.md\":\"XAg7Kbaw\",\"planning_reports_issue-wave-cpb-0491-0540-lane-7.md\":\"BOtIWc5I\",\"planning_reports_issue-wave-cpb-0491-0540-lane-8.md\":\"C85Dq_XV\",\"planning_reports_issue-wave-cpb-0541-0590-lane-1.md\":\"UisJnuG-\",\"planning_reports_issue-wave-cpb-0541-0590-lane-10.md\":\"DtxVQvFu\",\"planning_reports_issue-wave-cpb-0541-0590-lane-2.md\":\"i8SFguNH\",\"planning_reports_issue-wave-cpb-0541-0590-lane-3.md\":\"BigPN3CX\",\"planning_reports_issue-wave-cpb-0541-0590-lane-4.md\":\"D3LuPTk9\",\"planning_reports_issue-wave-cpb-0541-0590-lane-5.md\":\"BbmJmKar\",\"planning_reports_issue-wave-cpb-0541-0590-lane-6.md\":\"kW1gYw0q\",\"planning_reports_issue-wave-cpb-0541-0590-lane-7.md\":\"B6ibyz7N\",\"planning_reports_issue-wave-cpb-0541-0590-lane-8.md\":\"CqgVz_gC\",\"planning_reports_issue-wave-cpb-0541-0590-lane-9.md\":\"vEwHKO3T\",\"planning_reports_issue-wave-cpb-0541-0590-next-50-summary.md\":\"CwNHocVt\",\"planning_reports_issue-wave-cpb-0546-0555-lane-f-implementation-2026-02-23.md\":\"qHkbsbsI\",\"planning_reports_issue-wave-cpb-0556-0610-lane-d-implementation-2026-02-23.md\":\"CsIUkBV6\",\"planning_reports_issue-wave-cpb-0581-0590-lane-e-implementation-2026-02-23.md\":\"RoArpSmD\",\"planning_reports_issue-wave-cpb-0591-0640-lane-1.md\":\"CUei2vrs\",\"planning_reports_issue-wave-cpb-0591-0640-lane-10.md\":\"A7qkaf-w\",\"planning_reports_issue-wave-cpb-0591-0640-lane-2.md\":\"iVprr5_q\",\"planning_reports_issue-wave-cpb-0591-0640-lane-3.md\":\"B7OskrYl\",\"planning_reports_issue-wave-cpb-0591-0640-lane-4.md\":\"DDIHp0s5\",\"planning_reports_issue-wave-cpb-0591-0640-lane-5.md\":\"D4bBval6\",\"planning_reports_issue-wave-cpb-0591-0640-lane-6.md\":\"1qrTUwQ_\",\"planning_reports_issue-wave-cpb-0591-0640-lane-7.md\":\"D1Za5qQN\",\"planning_reports_issue-wave-cpb-0591-0640-lane-8.md\":\"Di4pPXat\",\"planning_reports_issue-wave-cpb-0591-0640-lane-9.md\":\"D5M8sKYB\",\"planning_reports_issue-wave-cpb-0591-0640-next-50-summary.md\":\"GfclWLN2\",\"planning_reports_issue-wave-cpb-0641-0690-lane-1.md\":\"BWjIgRJW\",\"planning_reports_issue-wave-cpb-0641-0690-lane-10.md\":\"CsadUCw0\",\"planning_reports_issue-wave-cpb-0641-0690-lane-2.md\":\"DyvTYSdP\",\"planning_reports_issue-wave-cpb-0641-0690-lane-3.md\":\"CgMw2pAu\",\"planning_reports_issue-wave-cpb-0641-0690-lane-4.md\":\"BAHF6v4B\",\"planning_reports_issue-wave-cpb-0641-0690-lane-5.md\":\"tJhXbhXA\",\"planning_reports_issue-wave-cpb-0641-0690-lane-6.md\":\"BNnXFS6h\",\"planning_reports_issue-wave-cpb-0641-0690-lane-7.md\":\"DGPhH1ti\",\"planning_reports_issue-wave-cpb-0641-0690-lane-8.md\":\"Bargda68\",\"planning_reports_issue-wave-cpb-0641-0690-lane-9.md\":\"CtXRcDrr\",\"planning_reports_issue-wave-cpb-0641-0690-next-50-summary.md\":\"DNQGhQdt\",\"planning_reports_issue-wave-cpb-0691-0700-lane-f2-implementation-2026-02-23.md\":\"7awOpRaH\",\"planning_reports_issue-wave-cpb-0701-0710-lane-e3.md\":\"C_Q9VSoO\",\"planning_reports_issue-wave-cpb-0711-0720-lane-e4.md\":\"dhztHtT_\",\"planning_reports_issue-wave-cpb-0721-0730-lane-e5.md\":\"6MmY3TpF\",\"planning_reports_issue-wave-cpb-0731-0780-lane-a.md\":\"CDg9mtRM\",\"planning_reports_issue-wave-cpb-0731-0780-lane-b.md\":\"BhLeRGoL\",\"planning_reports_issue-wave-cpb-0731-0780-lane-c.md\":\"-Q9J5hbo\",\"planning_reports_issue-wave-cpb-0731-0780-lane-d.md\":\"dP996xjD\",\"planning_reports_issue-wave-cpb-0731-0780-lane-e.md\":\"EfWrVuU7\",\"planning_reports_issue-wave-cpb-0731-0780-lane-f.md\":\"D96QriwK\",\"planning_reports_issue-wave-cpb-0731-0780-next-50-summary.md\":\"CAaGmIIR\",\"planning_reports_issue-wave-cpb-0741-0750-lane-d8.md\":\"B0-P1WCe\",\"planning_reports_issue-wave-cpb-0745-0754-lane-d7.md\":\"SwMiKzpN\",\"planning_reports_issue-wave-cpb-0781-0790-lane-d9.md\":\"wt0jgaF-\",\"planning_reports_issue-wave-cpb-0781-0830-implementation-batch-1.md\":\"BUxNw-mA\",\"planning_reports_issue-wave-cpb-0781-0830-implementation-batch-2.md\":\"CkXCV3sW\",\"planning_reports_issue-wave-cpb-0781-0830-implementation-batch-3.md\":\"jmjsPnW5\",\"planning_reports_issue-wave-cpb-0781-0830-implementation-batch-4-code.md\":\"BV5gU6XA\",\"planning_reports_issue-wave-cpb-0781-0830-lane-a.md\":\"d0IIl9Bu\",\"planning_reports_issue-wave-cpb-0781-0830-lane-b.md\":\"CTYMg8Iw\",\"planning_reports_issue-wave-cpb-0781-0830-lane-c.md\":\"BT2R7I_D\",\"planning_reports_issue-wave-cpb-0781-0830-lane-d.md\":\"XCSxbOqw\",\"planning_reports_issue-wave-cpb-0781-0830-lane-e.md\":\"Cwin3iXB\",\"planning_reports_issue-wave-cpb-0781-0830-lane-e10-implementation-2026-02-23.md\":\"BiE-Symc\",\"planning_reports_issue-wave-cpb-0781-0830-lane-f.md\":\"BPFQECLS\",\"planning_reports_issue-wave-cpb-0781-0830-next-50-summary.md\":\"DqcZypC8\",\"planning_reports_issue-wave-cpb-0784-0785-lane-d10.md\":\"xlQ1IETx\",\"planning_reports_issue-wave-cpb-0981-1000-next-20-summary.md\":\"BgU5VnNR\",\"planning_reports_issue-wave-gh-35-integration-summary-2026-02-22.md\":\"CBKk1zIk\",\"planning_reports_issue-wave-gh-35-lane-1-self.md\":\"DfhtPtl2\",\"planning_reports_issue-wave-gh-35-lane-1.md\":\"D5nErqVG\",\"planning_reports_issue-wave-gh-35-lane-2.md\":\"CcNGRvFL\",\"planning_reports_issue-wave-gh-35-lane-3.md\":\"DAQgaCKe\",\"planning_reports_issue-wave-gh-35-lane-4.md\":\"B12RFh86\",\"planning_reports_issue-wave-gh-35-lane-5.md\":\"BD8OH8gI\",\"planning_reports_issue-wave-gh-35-lane-6.md\":\"nRD_HGSO\",\"planning_reports_issue-wave-gh-35-lane-7.md\":\"DxxhBIAG\",\"planning_reports_issue-wave-gh-next20-lane-f7.md\":\"N9DAWS8Q\",\"planning_reports_issue-wave-gh-next21-lane-1.md\":\"75i6yJDq\",\"planning_reports_issue-wave-gh-next21-lane-2.md\":\"DUrM9pQd\",\"planning_reports_issue-wave-gh-next21-lane-3.md\":\"CopjXRED\",\"planning_reports_issue-wave-gh-next21-lane-4.md\":\"CjHeHuTN\",\"planning_reports_issue-wave-gh-next21-lane-5.md\":\"CqVRPNUn\",\"planning_reports_issue-wave-gh-next21-lane-6.md\":\"C438_6JP\",\"planning_reports_issue-wave-gh-next21-lane-7.md\":\"DTcmOMBk\",\"planning_reports_issue-wave-gh-next32-lane-2.md\":\"ZD5oOf3G\",\"planning_reports_issue-wave-gh-next32-lane-3.md\":\"LxHtuy60\",\"planning_reports_issue-wave-gh-next32-lane-4.md\":\"CtyGhGkg\",\"planning_reports_issue-wave-gh-next32-lane-5.md\":\"CeBXhVqs\",\"planning_reports_issue-wave-gh-next32-lane-6.md\":\"jdmIezy7\",\"planning_reports_issue-wave-gh-next32-lane-7.md\":\"DfDxztub\",\"planning_reports_issue-wave-gh-next32-merge-2026-02-23.md\":\"EHBmEKUY\",\"planning_reports_issue-wave-gh-next32-merge-wave2-2026-02-23.md\":\"BTHFS68W\",\"planning_reports_lane-b-quality-governance-doc-parity-2026-02-23.md\":\"DtLwg33o\",\"planning_reports_next-50-wave1-execution-2026-02-23.md\":\"Dt17zylC\",\"planning_reports_next-50-wave2-execution-2026-02-23.md\":\"HiNJQ0zI\",\"planning_reports_next-50-wave3-execution-2026-02-23.md\":\"bbtdXM_K\",\"planning_reports_next-50-wave4-execution-2026-02-23.md\":\"DXJp55L-\",\"planning_reports_next-50-wave5-execution-2026-02-23.md\":\"B-AVm7G2\",\"planning_reports_next-50-work-items-2026-02-23.md\":\"C6CJFBE_\",\"prd.md\":\"BMTE8K32\",\"provider-catalog.md\":\"B964qiaQ\",\"provider-operations.md\":\"D5ZF3hib\",\"provider-quickstarts.md\":\"C051m4Fo\",\"provider-usage.md\":\"CXJJ-jkb\",\"readme.md\":\"Dj28aGZX\",\"reference_changelog_entry_template.md\":\"Cj1hkkNl\",\"reference_docs_ia_contract.md\":\"BjVwUZt1\",\"reference_docs_migration_matrix.md\":\"DDc-QnaQ\",\"reports_fragemented_explanation.md\":\"CvCEqZfc\",\"reports_fragemented_index.md\":\"1rd9A5eK\",\"reports_fragemented_merged.md\":\"DhTtvTtQ\",\"reports_fragemented_open_items_validation_2026-02-22.md\":\"CDAi-pKU\",\"reports_fragemented_readme.md\":\"DDR_hWRY\",\"reports_open_items_validation_2026-02-22.md\":\"Bi1fZycI\",\"reports_open_items_validation_fork_2026-02-22.md\":\"9oz5QZyI\",\"routing-reference.md\":\"Cm1uQgdF\",\"sdk-access.md\":\"R1OmYGl1\",\"sdk-access_cn.md\":\"C4HDi2HV\",\"sdk-access_fa.md\":\"CewhlDh6\",\"sdk-advanced.md\":\"D-UkRBT3\",\"sdk-advanced_cn.md\":\"DlxV9RMB\",\"sdk-advanced_fa.md\":\"BERu-0Es\",\"sdk-usage.md\":\"CxV176R2\",\"sdk-usage_cn.md\":\"Ct_kjhJx\",\"sdk-usage_fa.md\":\"BLR81jKC\",\"sdk-watcher.md\":\"ivt7FeWG\",\"sdk-watcher_cn.md\":\"D5F7iFnL\",\"sdk-watcher_fa.md\":\"BPSSoX3E\",\"spec.md\":\"CCwohbF1\",\"start-here.md\":\"CkRxFJyh\",\"troubleshooting.md\":\"B2HQYNGa\",\"tutorials_index.md\":\"Bpo6-08b\",\"worklog.md\":\"B-uMnQEw\",\"zh-cn_index.md\":\"zP9zk4aR\",\"zh-tw_index.md\":\"ByOwnU7A\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"cliproxy++\",\"description\":\"cliproxyapi-plusplus documentation\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Start Here\",\"link\":\"/start-here\"},{\"text\":\"Tutorials\",\"link\":\"/tutorials/\"},{\"text\":\"How-to\",\"link\":\"/how-to/\"},{\"text\":\"Explanation\",\"link\":\"/explanation/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Providers\",\"link\":\"/provider-usage\"},{\"text\":\"Provider Catalog\",\"link\":\"/provider-catalog\"},{\"text\":\"Operations\",\"link\":\"/operations/\"},{\"text\":\"Reference\",\"link\":\"/routing-reference\"},{\"text\":\"API\",\"link\":\"/api/\"},{\"text\":\"Docsets\",\"link\":\"/docsets/\"}],\"sidebar\":[{\"text\":\"Guide\",\"items\":[{\"text\":\"Overview\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/getting-started\"},{\"text\":\"Install\",\"link\":\"/install\"},{\"text\":\"Provider Usage\",\"link\":\"/provider-usage\"},{\"text\":\"Provider Catalog\",\"link\":\"/provider-catalog\"},{\"text\":\"Provider Operations\",\"link\":\"/provider-operations\"},{\"text\":\"Troubleshooting\",\"link\":\"/troubleshooting\"},{\"text\":\"Planning Boards\",\"link\":\"/planning/\"}]},{\"text\":\"Reference\",\"items\":[{\"text\":\"Routing and Models\",\"link\":\"/routing-reference\"},{\"text\":\"Feature Guides\",\"link\":\"/features/\"},{\"text\":\"Docsets\",\"link\":\"/docsets/\"}]},{\"text\":\"API\",\"items\":[{\"text\":\"API Index\",\"link\":\"/api/\"},{\"text\":\"OpenAI-Compatible API\",\"link\":\"/api/openai-compatible\"},{\"text\":\"Management API\",\"link\":\"/api/management\"},{\"text\":\"Operations API\",\"link\":\"/api/operations\"}]}],\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"MIT Licensed\",\"copyright\":\"Copyright © KooshaPari\"},\"editLink\":{\"pattern\":\"https://github.com/kooshapari/cliproxyapi-plusplus/edit/main/docs/:path\",\"text\":\"Edit this page on GitHub\"},\"outline\":{\"level\":[2,3]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/kooshapari/cliproxyapi-plusplus\"}]},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
</body>
</html>