ai-zero-token 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/admin-ui/dist/assets/InfoRow-0ULI9iI3.js +1 -0
- package/admin-ui/dist/assets/accounts-Ddq82u6R.js +1 -0
- package/admin-ui/dist/assets/activity-D21-Xrc4.js +1 -0
- package/admin-ui/dist/assets/app-mark-nsRs4vo7.svg +8 -0
- package/admin-ui/dist/assets/circle-check-ZYtn9GqY.js +1 -0
- package/admin-ui/dist/assets/clock-3-BzDANsVk.js +1 -0
- package/admin-ui/dist/assets/docs-BRNWAMPw.css +1 -0
- package/admin-ui/dist/assets/docs-CihX3Xsm.js +1735 -0
- package/admin-ui/dist/assets/earth-DFdZaQIi.js +1 -0
- package/admin-ui/dist/assets/image-bed-BGjlDLks.js +1 -0
- package/admin-ui/dist/assets/index-CX8e0-BB.js +10 -0
- package/admin-ui/dist/assets/index-ywn2Jwpu.css +1 -0
- package/admin-ui/dist/assets/jsx-runtime-DqpGtLhh.js +1 -0
- package/admin-ui/dist/assets/launch-BWw7Odq7.js +1 -0
- package/admin-ui/dist/assets/logs-DDdgDVwo.js +1 -0
- package/admin-ui/dist/assets/network-detect-cUdjg4zk.js +1 -0
- package/admin-ui/dist/assets/overview-CsjVVcvi.js +1 -0
- package/admin-ui/dist/assets/profiles-DMOjJORP.js +1 -0
- package/admin-ui/dist/assets/refresh-cw-CAAH2rqe.js +1 -0
- package/admin-ui/dist/assets/search-B2hz41D3.js +1 -0
- package/admin-ui/dist/assets/server-BrjJPb9D.js +1 -0
- package/admin-ui/dist/assets/settings-Be99HpDD.js +1 -0
- package/admin-ui/dist/assets/tester-BIvH_8DY.js +3 -0
- package/admin-ui/dist/assets/upload-CwXb7Q1b.js +1 -0
- package/admin-ui/dist/assets/zap-B4_oDbCp.js +1 -0
- package/admin-ui/dist/index.html +5 -3
- package/build/icon.icns +0 -0
- package/build/icon.ico +0 -0
- package/build/icon.png +0 -0
- package/build/icon.svg +8 -0
- package/dist/core/context.js +3 -0
- package/dist/core/providers/http-client.js +11 -4
- package/dist/core/services/github-image-bed-service.js +264 -0
- package/dist/core/services/network-detect-service.js +189 -74
- package/dist/core/store/github-image-bed-history-store.js +68 -0
- package/dist/core/store/github-image-bed-store.js +52 -0
- package/dist/desktop/main.js +158 -6
- package/dist/server/app.js +108 -13
- package/dist/server/index.js +41 -15
- package/docs/PRODUCT_UPDATE_DESKTOP_TOOLBOX.md +2 -2
- package/package.json +5 -2
- package/admin-ui/dist/assets/app-mark-Gd2QnHMO.svg +0 -9
- package/admin-ui/dist/assets/index-CCywUil_.js +0 -1745
- package/admin-ui/dist/assets/index-DNzR8XR7.css +0 -1
- package/dist/server/admin-page.js +0 -4586
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.2 - 2026-05-07
|
|
4
|
+
|
|
5
|
+
- Added a GitHub image-bed workflow to the React desktop UI, including upload history, configuration storage, and gateway service support.
|
|
6
|
+
- Reworked the network diagnostics page around overseas app reachability for reverse-proxy scenarios, with clearer access verdicts, exit/proxy signals, DNS/WebRTC context, and a more productized matrix layout.
|
|
7
|
+
- Removed the legacy server-rendered embedded admin page; production now serves the React admin UI build only.
|
|
8
|
+
- Improved desktop and tester UI polish, routing, shared workspace state, icons, and request helpers.
|
|
9
|
+
- Hardened network detection with more resilient IPv4/IPv6 probing, DNS collection, and partial-result handling.
|
|
10
|
+
- Updated macOS desktop packaging so `dist:mac` builds a universal app, with explicit `dist:mac:arm64` and `dist:mac:x64` scripts for Apple Silicon and Intel-only installers.
|
|
11
|
+
|
|
12
|
+
## 2.0.1 - 2026-05-04
|
|
13
|
+
|
|
14
|
+
- Improved desktop sidebar navigation responsiveness by switching routes immediately and de-duplicating hash-change updates.
|
|
15
|
+
- Removed the generated skill documentation zip from Git tracking and ignored it for future commits.
|
|
16
|
+
|
|
3
17
|
## 2.0.0 - 2026-05-04
|
|
4
18
|
|
|
5
19
|
- Added the Electron desktop app, with a local gateway boot path and the management UI embedded in the desktop shell.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./jsx-runtime-DqpGtLhh.js";var t=e();function n(e){return(0,t.jsxs)(`div`,{className:`service-row`,children:[(0,t.jsx)(`label`,{children:e.label}),e.code?(0,t.jsx)(`code`,{children:e.value}):(0,t.jsx)(`strong`,{children:e.value})]})}export{n as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,r as t,t as n}from"./jsx-runtime-DqpGtLhh.js";import{t as r}from"./earth-DFdZaQIi.js";import{t as i}from"./refresh-cw-CAAH2rqe.js";import{t as a}from"./search-B2hz41D3.js";import{_ as o,a as s,b as c,d as l,f as u,g as d,h as f,i as p,m,n as h,o as g,p as _,r as v,s as y,t as b,u as x,v as S,w as C,y as w}from"./profiles-DMOjJORP.js";import{_ as T,d as E,p as D,r as O,x as k}from"./index-CX8e0-BB.js";import{t as A}from"./InfoRow-0ULI9iI3.js";var j=e(t(),1),M=n();function N(e){let t=e.config?.codex?.accountId,n=e.profiles.length<=0?``:e.profiles.length===1?`profile-count-1`:e.profiles.length===2?`profile-count-2`:e.profiles.length===3?`profile-count-3`:`profile-count-many`;return(0,M.jsxs)(`section`,{className:`card`,id:`accounts`,children:[(0,M.jsxs)(`div`,{className:`section-head`,children:[(0,M.jsxs)(`div`,{children:[(0,M.jsx)(`h2`,{children:`账号额度预览`}),(0,M.jsx)(`p`,{children:`账号信息采用卡片式布局展示,支持搜索、状态筛选和额度排序。`})]}),(0,M.jsxs)(`div`,{className:`section-actions`,children:[(0,M.jsx)(`button`,{className:`btn-secondary`,type:`button`,onClick:e.onLocate,children:`定位当前账号`}),(0,M.jsx)(`button`,{className:`btn-secondary`,type:`button`,onClick:e.onExportSelected,children:`导出所选`}),(0,M.jsx)(`button`,{className:`btn-primary`,type:`button`,onClick:e.onAddAccount,children:`新增账号`}),(0,M.jsx)(`button`,{className:`btn-secondary`,type:`button`,onClick:e.onRefreshStatus,children:`刷新状态`}),(0,M.jsx)(`button`,{className:`btn-danger`,type:`button`,onClick:e.onClearAccounts,children:`清空账号`})]})]}),(0,M.jsxs)(`div`,{className:`filter-row`,children:[(0,M.jsxs)(`label`,{className:`search-box`,children:[(0,M.jsx)(a,{size:16}),(0,M.jsx)(`input`,{value:e.filter.search,onChange:t=>e.onFilter({...e.filter,search:t.target.value}),placeholder:`搜索邮箱、账号 ID 或 Profile ID`})]}),(0,M.jsxs)(`select`,{className:`control`,value:e.filter.status,onChange:t=>e.onFilter({...e.filter,status:t.target.value}),children:[(0,M.jsx)(`option`,{value:`all`,children:`全部状态`}),(0,M.jsx)(`option`,{value:`active`,children:`使用中`}),(0,M.jsx)(`option`,{value:`healthy`,children:`健康`}),(0,M.jsx)(`option`,{value:`warning`,children:`即将耗尽`}),(0,M.jsx)(`option`,{value:`exhausted`,children:`额度耗尽`}),(0,M.jsx)(`option`,{value:`invalid`,children:`登录失效`}),(0,M.jsx)(`option`,{value:`expired`,children:`已过期`})]}),(0,M.jsxs)(`select`,{className:`control`,value:e.filter.sort,onChange:t=>e.onFilter({...e.filter,sort:t.target.value}),children:[(0,M.jsx)(`option`,{value:`quota-desc`,children:`默认排序`}),(0,M.jsx)(`option`,{value:`latency-asc`,children:`按额度更新时间`}),(0,M.jsx)(`option`,{value:`expiry-asc`,children:`按过期时间`}),(0,M.jsx)(`option`,{value:`name-asc`,children:`按名称排序`}),(0,M.jsx)(`option`,{value:`quota-asc`,children:`按剩余额度升序`}),(0,M.jsx)(`option`,{value:`plan-desc`,children:`按套餐排序`}),(0,M.jsx)(`option`,{value:`email-asc`,children:`按邮箱排序`})]}),(0,M.jsxs)(`span`,{className:`account-selected-count`,children:[`已选择 `,e.selectedCount,` 个`]})]}),(0,M.jsx)(`div`,{className:`account-grid ${n}`,children:e.profiles.length===0?(0,M.jsx)(`div`,{className:`empty-state`,children:`还没有匹配的账号。可以新增账号或调整筛选条件。`}):e.profiles.map(n=>{let a=u(n),f=l(n),v=w(n),y=!!e.expandedProfiles[n.profileId],x=!!(t&&n.accountId===t),C=c(n,x),E=g(n),D=s(n),O=typeof e.busy==`string`&&e.busy.startsWith(`profile:`)&&e.busy.endsWith(n.profileId),j=e.busy===`profile:sync-quota:${n.profileId}`;return(0,M.jsxs)(`article`,{className:`account-card plan-${h(n)} ${E?`is-auth-invalid`:``}`,"data-profile-card":n.profileId,title:E?b(n):void 0,children:[C&&(0,M.jsx)(`span`,{className:`usage-corner ${C.className}`,children:(0,M.jsx)(`span`,{children:C.label})}),(0,M.jsxs)(`div`,{className:`account-head`,children:[(0,M.jsxs)(`div`,{className:`account-title`,children:[(0,M.jsxs)(`div`,{className:`account-name`,children:[(0,M.jsx)(`span`,{className:`avatar`,children:_(n)}),(0,M.jsx)(`strong`,{children:m(n,e.showEmails)}),(0,M.jsx)(`button`,{"aria-label":`刷新额度`,className:`account-icon-btn`,disabled:O,onClick:()=>e.onAction(`sync-quota`,n),title:`刷新额度`,type:`button`,children:j?(0,M.jsx)(T,{className:`spin`,size:14}):(0,M.jsx)(i,{size:14})})]}),(0,M.jsxs)(`div`,{className:`badge-row`,children:[(0,M.jsx)(`span`,{className:`badge brand`,children:p(n)}),(0,M.jsx)(`span`,{className:`badge ${a.tone}`,children:a.label}),(0,M.jsx)(`span`,{className:`badge ${D.ok?`green`:`orange`}`,children:`gpt-image-2`})]})]}),(0,M.jsxs)(`label`,{className:`account-select`,children:[(0,M.jsx)(`input`,{type:`checkbox`,checked:!!e.selectedProfiles[n.profileId],onChange:t=>e.onSelect(n.profileId,t.target.checked)}),(0,M.jsx)(`span`,{children:`选择`})]})]}),(0,M.jsxs)(`div`,{className:`account-metrics`,children:[(0,M.jsx)(F,{label:o(n,`primary`),value:f,tone:d(f)}),(0,M.jsx)(F,{label:o(n,`secondary`),value:v,tone:d(v)})]}),(0,M.jsxs)(`div`,{className:`usage-status-row`,children:[(0,M.jsxs)(`span`,{className:`usage-status ${n.isActive?`is-active`:``}`,children:[(0,M.jsx)(r,{size:14}),(0,M.jsx)(`span`,{children:`API`}),(0,M.jsx)(`span`,{className:`usage-dot ${n.isActive?`active`:``}`}),(0,M.jsx)(`span`,{className:`usage-state-text`,children:n.isActive?`使用中`:`未使用`})]}),(0,M.jsxs)(`span`,{className:`usage-status ${x?`is-active`:``}`,children:[(0,M.jsx)(k,{size:14}),(0,M.jsx)(`span`,{children:`Codex`}),(0,M.jsx)(`span`,{className:`usage-dot ${x?`active`:``}`}),(0,M.jsx)(`span`,{className:`usage-state-text`,children:x?`使用中`:`未使用`})]})]}),(0,M.jsxs)(`div`,{className:`compact-meta-row`,children:[(0,M.jsxs)(`div`,{className:`compact-reset-list`,children:[(0,M.jsxs)(`div`,{className:`compact-meta-item`,children:[(0,M.jsx)(`label`,{children:o(n,`primary`)}),(0,M.jsx)(`strong`,{children:S(n,`primary`)})]}),(0,M.jsxs)(`div`,{className:`compact-meta-item`,children:[(0,M.jsx)(`label`,{children:o(n,`secondary`)}),(0,M.jsx)(`strong`,{children:S(n,`secondary`)})]})]}),(0,M.jsx)(`div`,{className:`compact-meta-actions`,children:(0,M.jsxs)(`button`,{className:`details-toggle ${y?`is-expanded`:``}`,type:`button`,onClick:()=>e.onToggle(n.profileId),children:[(0,M.jsx)(`span`,{children:y?`收起详情`:`查看详情`}),(0,M.jsx)(P,{})]})})]}),y&&(0,M.jsxs)(`div`,{className:`meta-grid`,children:[(0,M.jsx)(A,{label:`套餐`,value:p(n)}),(0,M.jsx)(A,{label:`Account ID`,value:(e.showEmails,n.accountId),code:!0}),(0,M.jsx)(A,{label:`Profile ID`,value:(e.showEmails,n.profileId),code:!0}),(0,M.jsx)(A,{label:`认证状态`,value:b(n)}),(0,M.jsx)(A,{label:`生图能力`,value:D.ok?`gpt-image-2 可用`:D.detail}),(0,M.jsx)(A,{label:`过期时间`,value:n.expiresAt?new Date(n.expiresAt).toLocaleString(`zh-CN`):`-`}),(0,M.jsx)(A,{label:`额度快照`,value:n.quota?.capturedAt?new Date(n.quota.capturedAt).toLocaleString(`zh-CN`):`-`})]}),(0,M.jsxs)(`div`,{className:`account-actions`,children:[(0,M.jsx)(`button`,{className:`btn-secondary ${n.isActive?`is-current`:``}`,type:`button`,onClick:()=>e.onAction(`activate`,n),disabled:n.isActive||O||E,children:E?`网关不可用`:n.isActive?`网关使用中`:`应用网关`}),(0,M.jsx)(`button`,{className:`btn-secondary ${x?`is-current codex`:``}`,type:`button`,onClick:()=>e.onAction(`apply-codex`,n),disabled:x||O||E,children:E?`Codex 不可用`:x?`Codex 使用中`:`应用 Codex`}),(0,M.jsx)(`button`,{className:`btn-secondary`,type:`button`,onClick:()=>e.onAction(`export`,n),disabled:O,children:`导出`}),(0,M.jsx)(`button`,{className:`btn-danger`,type:`button`,onClick:()=>e.onAction(`remove`,n),disabled:O,children:`删除`})]})]},n.profileId)})})]})}function P(){return(0,M.jsx)(`svg`,{viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,"aria-hidden":`true`,children:(0,M.jsx)(`path`,{d:`m6 9 6 6 6-6`})})}function F(e){return(0,M.jsxs)(`div`,{className:`quota-row`,children:[(0,M.jsxs)(`div`,{className:`quota-line`,children:[(0,M.jsxs)(`span`,{children:[e.label,` · 已用 `,e.value,`% / 剩余 `,100-e.value,`%`]}),(0,M.jsxs)(`strong`,{children:[`剩余 `,100-e.value,`%`]})]}),(0,M.jsx)(`div`,{className:`progress-track`,children:(0,M.jsx)(`div`,{className:`progress-bar ${e.tone}`,style:{width:`${e.value}%`}})})]})}function I(e){let[t,n]=(0,j.useState)({}),[r,i]=(0,j.useState)({}),[a,o]=(0,j.useState)({search:``,status:`all`,sort:`quota-desc`}),s=(0,j.useMemo)(()=>{let t=e.config?.profiles?[...e.config.profiles]:[],n=a.search.trim().toLowerCase(),r=t.filter(t=>{let r=[m(t,!0).toLowerCase(),t.accountId,t.profileId,t.email||``].join(` `).toLowerCase(),i=u(t),o=!!(e.codexAccountId&&t.accountId===e.codexAccountId);return n&&!r.includes(n)?!1:a.status===`active`?t.isActive||o:a.status===`healthy`?i.key===`healthy`:a.status===`warning`?i.key===`warning`:a.status===`exhausted`?i.key===`exhausted`:a.status===`expired`?i.key===`expired`:a.status===`invalid`?i.key===`invalid`:!0});return r.sort((t,n)=>{let r=f(t,e.codexAccountId)-f(n,e.codexAccountId);if(r!==0)return r;let i=v(n)-v(t);if(i!==0)return i;let o=x(n)-x(t);return o===0?a.sort===`latency-asc`?(n.quota?.capturedAt||0)-(t.quota?.capturedAt||0):a.sort===`expiry-asc`?(t.expiresAt||2**53-1)-(n.expiresAt||2**53-1):a.sort===`name-asc`?m(t,!0).localeCompare(m(n,!0),`zh-CN`):a.sort===`quota-asc`?100-l(n)-(100-l(t)):a.sort===`plan-desc`?v(n)-v(t):a.sort===`email-asc`?m(t,!0).localeCompare(m(n,!0)):l(n)-l(t):o}),r},[a,e.codexAccountId,e.config?.profiles]),c=Object.values(t).filter(Boolean).length;async function d(t,n){let r=await D(`/_gateway/admin/profiles/export`,{method:`POST`,headers:{"Content-Type":`application/json`},body:C(n?{profileIds:n}:{profileId:t})});E(`ai-zero-token-${n?`profiles-${n.length}`:t||`active`}.json`,r.profile),e.setStatus(n?`已导出 ${n.length} 个账号。`:`账号配置已导出。`)}async function p(t,n){if(!(t===`remove`&&!window.confirm(`确认删除 ${m(n,e.showEmails)}?`))){if((t===`activate`||t===`apply-codex`)&&g(n)){e.setStatus(`${m(n,e.showEmails)} 登录已失效,不能应用到${t===`activate`?`网关`:`Codex`}。`);return}if((t===`activate`||t===`apply-codex`)&&y(n)){let r=t===`activate`?`网关`:`Codex`;if(!window.confirm(`${m(n,e.showEmails)} 的额度看起来已耗尽,仍要应用到${r}吗?`))return}if(t===`export`){await d(n.profileId);return}e.setBusy(`profile:${t}:${n.profileId}`);try{let r=await D({activate:`/_gateway/admin/profiles/activate`,"apply-codex":`/_gateway/admin/codex/apply`,"sync-quota":`/_gateway/admin/profiles/sync-quota`,remove:`/_gateway/admin/profiles/remove`}[t],{method:`POST`,headers:{"Content-Type":`application/json`},body:C({profileId:n.profileId})});e.setConfig(`config`in r?r.config:r),e.setStatus(t===`activate`?`已应用到网关。`:t===`apply-codex`?`已应用到本机 Codex。`:t===`sync-quota`?`额度信息已同步。`:`账号已删除。`)}catch(t){e.setStatus(O(t))}finally{e.setBusy(null)}}}return(0,M.jsx)(N,{config:e.config,profiles:s,showEmails:e.showEmails,filter:a,selectedProfiles:t,expandedProfiles:r,selectedCount:c,busy:e.busy,onFilter:o,onSelect:(e,t)=>n(n=>({...n,[e]:t})),onToggle:e=>i(t=>({...t,[e]:!t[e]})),onAction:p,onLocate:()=>e.activeProfile&&document.querySelector(`[data-profile-card="${e.activeProfile.profileId}"]`)?.scrollIntoView({behavior:`smooth`,block:`center`}),onExportSelected:()=>{let n=Object.keys(t).filter(e=>t[e]);if(n.length===0){e.setStatus(`请先勾选要导出的账号。`);return}d(void 0,n).catch(t=>e.setStatus(t instanceof Error?t.message:String(t)))},onAddAccount:()=>e.setAccountModalOpen(!0),onRefreshStatus:()=>e.refreshConfig({runtime:!0}),onClearAccounts:()=>e.logout()})}export{I as AccountsPage};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./jsx-runtime-DqpGtLhh.js";var t=e(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]);export{t};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="128" height="128" fill="none"/>
|
|
3
|
+
<rect x="8" y="8" width="112" height="112" rx="26" fill="#F8FAFC"/>
|
|
4
|
+
<text x="64" y="79" text-anchor="middle" font-family="Inter, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif" font-size="38" font-weight="900" letter-spacing="-2" fill="#111827">azt</text>
|
|
5
|
+
<path d="M22 95c18 7 66 7 84 0" stroke="#22C55E" stroke-width="6" stroke-linecap="round"/>
|
|
6
|
+
<circle cx="30" cy="32" r="5" fill="#2563EB"/>
|
|
7
|
+
<circle cx="98" cy="32" r="5" fill="#F97316"/>
|
|
8
|
+
</svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./jsx-runtime-DqpGtLhh.js";var t=e(`circle-check`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m9 12 2 2 4-4`,key:`dzmm74`}]]);export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./jsx-runtime-DqpGtLhh.js";var t=e(`clock-3`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 6v6h4`,key:`135r8i`}]]);export{t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.docs-page{gap:14px;display:grid}.docs-page-head{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.docs-page-kicker{color:var(--brand);align-items:center;gap:8px;font-size:12px;font-weight:800;display:inline-flex}.docs-page-head h2{margin:6px 0 0;font-size:22px;line-height:1.2}.docs-page-head p{color:var(--text-muted);margin:8px 0 0;font-size:13px;line-height:1.6}.docs-page-actions{flex-wrap:wrap;justify-content:flex-end;gap:10px;display:flex}.docs-summary{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.docs-summary-item{border:1px solid var(--line);min-width:0;box-shadow:var(--shadow-sm);background:#ffffffeb;border-radius:14px;padding:12px 13px}.docs-summary-item span{color:var(--text-muted);font-size:11px;font-weight:800;line-height:1.3;display:block}.docs-summary-item strong{color:var(--text);overflow-wrap:anywhere;margin-top:5px;font-size:13px;line-height:1.45;display:block}.docs-layout{grid-template-columns:minmax(0,1fr);align-items:start;gap:12px;display:grid}.docs-main{gap:12px;min-width:0;display:grid}.docs-tab-bar{border:1px solid var(--line);background:#ffffffe6;border-radius:14px;align-items:center;gap:6px;width:fit-content;padding:4px;display:inline-flex}.docs-tab-bar button{min-height:34px;color:var(--text-muted);background:0 0;border:0;border-radius:10px;padding:0 12px;font-size:13px;font-weight:800}.docs-tab-bar button.is-active{color:var(--brand);background:#635bff1a}.docs-panel,.docs-snippet{border:1px solid var(--line);box-shadow:var(--shadow-sm);background:#fffffff0;border-radius:16px}.docs-panel{padding:16px}.docs-panel-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.docs-panel-wide{grid-column:1/-1}.docs-panel-head{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:14px;display:flex}.docs-panel-head h3{margin:0;font-size:15px;line-height:1.25}.docs-panel-head p,.docs-snippet p{color:var(--text-muted);margin:6px 0 0;font-size:12px;line-height:1.55}.docs-step-list{gap:12px;margin:0;padding-left:18px;display:grid}.docs-step-list li{gap:6px;display:grid}.docs-step-list strong{font-size:13px;line-height:1.3}.docs-step-list span{color:var(--text-muted);font-size:12px;line-height:1.55}.docs-step-list code,.docs-code-sample code,.docs-markdown p code,.docs-markdown li code{color:var(--brand-strong);background:#635bff14;border-radius:7px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px}.docs-mini-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-bottom:12px;display:grid}.docs-mini-copy{border:1px solid var(--line);text-align:left;min-width:0;color:var(--text);background:#f8fafc;border-radius:14px;gap:6px;padding:12px;display:grid}.docs-mini-copy span{color:var(--text-muted);font-size:11px;font-weight:800}.docs-mini-copy strong{overflow-wrap:anywhere;min-width:0;font-size:12px;line-height:1.4}.docs-mini-copy svg{color:var(--brand);justify-self:end}.docs-code-sample,.docs-snippet pre,.docs-code{border:1px solid var(--line);color:var(--text);background:#f8fafc;border-radius:14px;margin:0;overflow:auto}.docs-code-sample{padding:14px;font-size:12px;line-height:1.6}.docs-endpoint-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.docs-endpoint{border:1px solid var(--line);background:#f8fafc;border-radius:12px;justify-content:space-between;align-items:center;gap:8px;min-height:44px;padding:0 12px;font-size:12px;font-weight:800;display:flex}.docs-preview-panel{gap:14px;display:grid}.docs-skill-summary{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;display:grid}.docs-summary-tile{border:1px solid var(--line);background:#f8fafc;border-radius:14px;min-width:0;padding:12px 13px}.docs-summary-tile span{color:var(--text-muted);font-size:11px;font-weight:800;line-height:1.25;display:block}.docs-summary-tile strong{color:var(--text);overflow-wrap:anywhere;margin-top:5px;font-size:13px;line-height:1.45;display:block}.docs-source-fold{border:1px solid var(--line);background:#fff;border-radius:14px;overflow:hidden}.docs-source-fold summary{cursor:pointer;color:var(--text);justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;font-size:13px;font-weight:800;list-style:none;display:flex}.docs-source-fold summary::-webkit-details-marker{display:none}.docs-source-fold summary span{color:var(--text-muted);font-size:11px;font-weight:700}.docs-source{border-top:1px solid var(--line);max-height:420px;color:var(--text);background:#f8fafc;margin:0;padding:14px;font-size:12px;line-height:1.65;overflow:auto}.docs-source code{white-space:pre;overflow-wrap:normal;word-break:normal;color:inherit;background:0 0;padding:0}.docs-markdown{gap:10px;max-height:620px;padding-right:4px;display:grid;overflow:auto}.docs-markdown h1,.docs-markdown h2,.docs-markdown h3,.docs-markdown h4{margin:12px 0 0;line-height:1.3}.docs-markdown h1{font-size:22px}.docs-markdown h2{font-size:18px}.docs-markdown h3{font-size:15px}.docs-markdown h4{font-size:13px}.docs-markdown p,.docs-markdown li{color:var(--text-soft);margin:0;font-size:13px;line-height:1.7}.docs-markdown ul{gap:6px;margin:0;padding-left:20px;display:grid}.docs-code{padding:14px 14px 12px;font-size:12px;line-height:1.6;position:relative}.docs-code-lang{color:var(--text-muted);text-transform:uppercase;letter-spacing:0;margin-bottom:10px;font-size:11px;font-weight:800;display:inline-flex}.docs-code code{color:var(--text);white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;background:0 0;margin:0;padding:0;display:block}.docs-example-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.docs-note-panel{grid-column:1/-1;padding:16px}.docs-note-panel ul{color:var(--text-soft);gap:8px;margin:10px 0 0;padding-left:18px;font-size:13px;line-height:1.6;display:grid}.docs-action-row{flex-wrap:wrap;gap:10px;margin-top:14px;display:flex}.docs-snippet{padding:16px}.docs-snippet-head{justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:12px;display:flex}.docs-snippet-head strong{font-size:14px;line-height:1.3;display:block}.docs-snippet pre{padding:14px;font-size:12px;line-height:1.6}@media (width<=1280px){.docs-layout{grid-template-columns:minmax(0,1fr)}}@media (width<=1120px){.docs-page-head,.docs-layout,.docs-panel-grid,.docs-example-grid,.docs-summary,.docs-mini-grid,.docs-endpoint-grid{grid-template-columns:1fr}.docs-page-actions{justify-content:flex-start}}
|