@fengye404/termpilot 0.1.7 → 0.1.9

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.
Files changed (59) hide show
  1. package/README.md +49 -200
  2. package/dist/cli.js +45 -29
  3. package/docs/.vitepress/config.mts +64 -0
  4. package/docs/.vitepress/dist/404.html +23 -0
  5. package/docs/.vitepress/dist/README.html +26 -0
  6. package/docs/.vitepress/dist/architecture.html +42 -0
  7. package/docs/.vitepress/dist/assets/README.md.B4-OJVNQ.js +1 -0
  8. package/docs/.vitepress/dist/assets/README.md.B4-OJVNQ.lean.js +1 -0
  9. package/docs/.vitepress/dist/assets/app.BG4pRgiG.js +1 -0
  10. package/docs/.vitepress/dist/assets/architecture.md.JnC1zyYV.js +17 -0
  11. package/docs/.vitepress/dist/assets/architecture.md.JnC1zyYV.lean.js +1 -0
  12. package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.l5vdUGaZ.js +1 -0
  13. package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.DMeTzGam.js +9 -0
  14. package/docs/.vitepress/dist/assets/chunks/framework.BZohXCq9.js +19 -0
  15. package/docs/.vitepress/dist/assets/chunks/theme.D0_6rd9F.js +2 -0
  16. package/docs/.vitepress/dist/assets/development.md.iwUVjeO6.js +7 -0
  17. package/docs/.vitepress/dist/assets/development.md.iwUVjeO6.lean.js +1 -0
  18. package/docs/.vitepress/dist/assets/getting-started.md.Cirp1CHi.js +1 -0
  19. package/docs/.vitepress/dist/assets/getting-started.md.Cirp1CHi.lean.js +1 -0
  20. package/docs/.vitepress/dist/assets/index.md.D9XElNRh.js +1 -0
  21. package/docs/.vitepress/dist/assets/index.md.D9XElNRh.lean.js +1 -0
  22. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  23. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  24. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  25. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  26. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  27. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  28. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  29. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  30. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  31. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  32. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  33. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  34. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  35. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  36. package/docs/.vitepress/dist/assets/operations-guide.md.DfNiIg5F.js +18 -0
  37. package/docs/.vitepress/dist/assets/operations-guide.md.DfNiIg5F.lean.js +1 -0
  38. package/docs/.vitepress/dist/assets/protocol.md.CCXFJUPR.js +40 -0
  39. package/docs/.vitepress/dist/assets/protocol.md.CCXFJUPR.lean.js +1 -0
  40. package/docs/.vitepress/dist/assets/style.B0lvUXq1.css +1 -0
  41. package/docs/.vitepress/dist/assets/tech-selection-2026.md.Dk_ymWTx.js +1 -0
  42. package/docs/.vitepress/dist/assets/tech-selection-2026.md.Dk_ymWTx.lean.js +1 -0
  43. package/docs/.vitepress/dist/development.html +32 -0
  44. package/docs/.vitepress/dist/favicon.svg +6 -0
  45. package/docs/.vitepress/dist/getting-started.html +26 -0
  46. package/docs/.vitepress/dist/hashmap.json +1 -0
  47. package/docs/.vitepress/dist/index.html +26 -0
  48. package/docs/.vitepress/dist/operations-guide.html +43 -0
  49. package/docs/.vitepress/dist/protocol.html +65 -0
  50. package/docs/.vitepress/dist/tech-selection-2026.html +26 -0
  51. package/docs/.vitepress/dist/vp-icons.css +1 -0
  52. package/docs/.vitepress/theme/custom.css +42 -0
  53. package/docs/.vitepress/theme/index.ts +10 -0
  54. package/docs/README.md +10 -7
  55. package/docs/getting-started.md +136 -0
  56. package/docs/index.md +57 -0
  57. package/docs/operations-guide.md +6 -6
  58. package/docs/public/favicon.svg +6 -0
  59. package/package.json +6 -2
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <html lang="zh-CN" dir="ltr">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>TermPilot 当前代码架构 | TermPilot</title>
7
+ <meta name="description" content="手机和电脑共享同一个 tmux 会话的终端远程控制工具。">
8
+ <meta name="generator" content="VitePress v1.6.4">
9
+ <link rel="preload stylesheet" href="/assets/style.B0lvUXq1.css" as="style">
10
+ <link rel="preload stylesheet" href="/vp-icons.css" as="style">
11
+
12
+ <script type="module" src="/assets/app.BG4pRgiG.js"></script>
13
+ <link rel="preload" href="/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
14
+ <link rel="modulepreload" href="/assets/chunks/theme.D0_6rd9F.js">
15
+ <link rel="modulepreload" href="/assets/chunks/framework.BZohXCq9.js">
16
+ <link rel="modulepreload" href="/assets/architecture.md.JnC1zyYV.lean.js">
17
+ <meta name="theme-color" content="#1f7a53">
18
+ <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>
19
+ <script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
20
+ </head>
21
+ <body>
22
+ <div id="app"><div class="Layout" data-v-1bdd7537><!--[--><!--]--><!--[--><span tabindex="-1" data-v-0a4b5d46></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-0a4b5d46>Skip to content</a><!--]--><!----><header class="VPNav" data-v-1bdd7537 data-v-07e0ee65><div class="VPNavBar" data-v-07e0ee65 data-v-bfcfe748><div class="wrapper" data-v-bfcfe748><div class="container" data-v-bfcfe748><div class="title" data-v-bfcfe748><div class="VPNavBarTitle has-sidebar" data-v-bfcfe748 data-v-6ce24249><a class="title" href="/" data-v-6ce24249><!--[--><!--]--><!--[--><img class="VPImage logo" src="/favicon.svg" alt data-v-105fdaa6><!--]--><span data-v-6ce24249>TermPilot</span><!--[--><!--]--></a></div></div><div class="content" data-v-bfcfe748><div class="content-body" data-v-bfcfe748><!--[--><!--]--><div class="VPNavBarSearch search" data-v-bfcfe748><!--[--><!----><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-bfcfe748 data-v-d1dc8fec><span id="main-nav-aria-label" class="visually-hidden" data-v-d1dc8fec> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>首页</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/getting-started" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>快速开始</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/operations-guide" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>部署与运维</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/architecture" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>架构</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/protocol" tabindex="0" data-v-d1dc8fec data-v-82ee0671><!--[--><span data-v-82ee0671>协议</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-bfcfe748 data-v-d994237e><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-d994237e data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-bfcfe748 data-v-a61e22dd data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-bfcfe748 data-v-6d16081b data-v-35350ec6><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-35350ec6><span class="vpi-more-horizontal icon" data-v-35350ec6></span></button><div class="menu" data-v-35350ec6><div class="VPMenu" data-v-35350ec6 data-v-52b08d90><!----><!--[--><!--[--><!----><div class="group" data-v-6d16081b><div class="item appearance" data-v-6d16081b><p class="label" data-v-6d16081b>Appearance</p><div class="appearance-action" data-v-6d16081b><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6d16081b data-v-9a85cf30 data-v-b1949eaf><span class="check" data-v-b1949eaf><span class="icon" data-v-b1949eaf><!--[--><span class="vpi-sun sun" data-v-9a85cf30></span><span class="vpi-moon moon" data-v-9a85cf30></span><!--]--></span></span></button></div></div></div><div class="group" data-v-6d16081b><div class="item social-links" data-v-6d16081b><div class="VPSocialLinks social-links-list" data-v-6d16081b data-v-f3c77898><!--[--><a class="VPSocialLink no-icon" href="https://github.com/fengye404/TermPilot" aria-label="github" target="_blank" rel="noopener" data-v-f3c77898 data-v-8a10446f><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-bfcfe748 data-v-1e510fee><span class="container" data-v-1e510fee><span class="top" data-v-1e510fee></span><span class="middle" data-v-1e510fee></span><span class="bottom" data-v-1e510fee></span></span></button></div></div></div></div><div class="divider" data-v-bfcfe748><div class="divider-line" data-v-bfcfe748></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-1bdd7537 data-v-18894e30><div class="container" data-v-18894e30><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-18894e30><span class="vpi-align-left menu-icon" data-v-18894e30></span><span class="menu-text" data-v-18894e30>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-18894e30 data-v-bdfacdf2><button data-v-bdfacdf2>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-1bdd7537 data-v-1d1d7027><div class="curtain" data-v-1d1d7027></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-1d1d7027><span class="visually-hidden" id="sidebar-aria-label" data-v-1d1d7027> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>开始</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>文档首页</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/getting-started" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>快速开始</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/operations-guide" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>部署与运维指南</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-594fed9e><section class="VPSidebarItem level-0 has-active" data-v-594fed9e data-v-cd30f15d><div class="item" role="button" tabindex="0" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><h2 class="text" data-v-cd30f15d>参考</h2><!----></div><div class="items" data-v-cd30f15d><!--[--><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/architecture" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>代码架构</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/protocol" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>协议说明</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/development" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>开发文档</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-cd30f15d data-v-cd30f15d><div class="item" data-v-cd30f15d><div class="indicator" data-v-cd30f15d></div><a class="VPLink link link" href="/tech-selection-2026" data-v-cd30f15d><!--[--><p class="text" data-v-cd30f15d>技术选型</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-1bdd7537 data-v-f89b4fb6><div class="VPDoc has-sidebar has-aside" data-v-f89b4fb6 data-v-1870bdbd><!--[--><!--]--><div class="container" data-v-1870bdbd><div class="aside" data-v-1870bdbd><div class="aside-curtain" data-v-1870bdbd></div><div class="aside-container" data-v-1870bdbd><div class="aside-content" data-v-1870bdbd><div class="VPDocAside" data-v-1870bdbd data-v-2bdf3a15><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-2bdf3a15 data-v-3d03f0c2><div class="content" data-v-3d03f0c2><div class="outline-marker" data-v-3d03f0c2></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-3d03f0c2>本页目录</div><ul class="VPDocOutlineItem root" data-v-3d03f0c2 data-v-87a812ef><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-2bdf3a15></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-1870bdbd><div class="content-container" data-v-1870bdbd><!--[--><!--]--><main class="main" data-v-1870bdbd><div style="position:relative;" class="vp-doc _architecture" data-v-1870bdbd><div><h1 id="termpilot-当前代码架构" tabindex="-1">TermPilot 当前代码架构 <a class="header-anchor" href="#termpilot-当前代码架构" aria-label="Permalink to &quot;TermPilot 当前代码架构&quot;">​</a></h1><h2 id="_1-当前产品形态" tabindex="-1">1. 当前产品形态 <a class="header-anchor" href="#_1-当前产品形态" aria-label="Permalink to &quot;1. 当前产品形态&quot;">​</a></h2><ul><li>一个 npm 包:<code>termpilot</code></li><li>一个服务器命令:<code>termpilot relay</code></li><li>一个电脑命令:<code>termpilot agent</code></li><li>手机端不安装,直接打开 relay 域名</li><li>relay 同时负责 WebSocket 中继和 Web UI 托管</li></ul><p>对应拓扑:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>手机浏览器 --https/ws--&gt; relay &lt;--ws--&gt; PC 端 agent</span></span>
23
+ <span class="line"><span> |</span></span>
24
+ <span class="line"><span> 配对、设备权限、消息路由、</span></span>
25
+ <span class="line"><span> 输出缓冲、审计日志、会话元数据、</span></span>
26
+ <span class="line"><span> 静态网页托管</span></span></code></pre></div><h2 id="_2-目录结构" tabindex="-1">2. 目录结构 <a class="header-anchor" href="#_2-目录结构" aria-label="Permalink to &quot;2. 目录结构&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>src/</span></span>
27
+ <span class="line"><span> cli.ts</span></span>
28
+ <span class="line"><span>agent/</span></span>
29
+ <span class="line"><span> src/</span></span>
30
+ <span class="line"><span>app/</span></span>
31
+ <span class="line"><span> src/</span></span>
32
+ <span class="line"><span> components/</span></span>
33
+ <span class="line"><span>relay/</span></span>
34
+ <span class="line"><span> src/</span></span>
35
+ <span class="line"><span>packages/</span></span>
36
+ <span class="line"><span> protocol/</span></span>
37
+ <span class="line"><span>scripts/</span></span>
38
+ <span class="line"><span>docs/</span></span></code></pre></div><h3 id="src-cli-ts" tabindex="-1"><code>src/cli.ts</code> <a class="header-anchor" href="#src-cli-ts" aria-label="Permalink to &quot;`src/cli.ts`&quot;">​</a></h3><p>统一 CLI 入口,负责把内部多模块收敛成外部单命令产品:</p><ul><li><code>termpilot relay</code></li><li><code>termpilot agent</code></li><li><code>termpilot agent/claude code/open code/pair/create/list/attach/kill/...</code></li></ul><h3 id="agent" tabindex="-1"><code>agent/</code> <a class="header-anchor" href="#agent" aria-label="Permalink to &quot;`agent/`&quot;">​</a></h3><p>PC 端常驻进程和本地命令实现:</p><ul><li><code>src/cli.ts</code>:agent 侧命令实现</li><li><code>src/index.ts</code>:开发态入口包装</li><li><code>src/daemon.ts</code>:常驻连接、轮询 <code>tmux</code>、同步输出与状态</li><li><code>src/tmux-backend.ts</code>:<code>tmux</code> 会话创建、输入、关闭、附着、抓屏</li><li><code>src/relay-admin.ts</code>:agent 调用 relay 管理接口的轻量客户端</li><li><code>src/state-store.ts</code>:本地 JSON 状态文件</li></ul><h3 id="relay" tabindex="-1"><code>relay/</code> <a class="header-anchor" href="#relay" aria-label="Permalink to &quot;`relay/`&quot;">​</a></h3><p>中继和网页托管层:</p><ul><li><code>src/server.ts</code>:WebSocket 路由、HTTP 接口、消息转发、静态网页托管</li><li><code>src/index.ts</code>:开发态入口包装</li><li><code>src/session-store.ts</code>:会话元数据存储</li><li><code>src/auth-store.ts</code>:配对码与访问令牌存储</li><li><code>src/audit-store.ts</code>:审计事件存储</li><li><code>src/config.ts</code>:环境变量配置</li></ul><h3 id="app" tabindex="-1"><code>app/</code> <a class="header-anchor" href="#app" aria-label="Permalink to &quot;`app/`&quot;">​</a></h3><p>手机端 PWA:</p><ul><li><code>src/App.tsx</code>:状态、副作用、WebSocket 协调</li><li><code>src/components/ConnectionPanel.tsx</code>:连接与配对 UI</li><li><code>src/components/CreateSessionPanel.tsx</code>:创建会话 UI</li><li><code>src/components/SessionListPanel.tsx</code>:会话搜索、筛选、置顶、关闭</li><li><code>src/components/TerminalWorkspace.tsx</code>:终端区域、快捷键和粘贴发送</li><li><code>src/components/chrome.tsx</code>:通用面板与字段组件</li></ul><h3 id="packages-protocol" tabindex="-1"><code>packages/protocol/</code> <a class="header-anchor" href="#packages-protocol" aria-label="Permalink to &quot;`packages/protocol/`&quot;">​</a></h3><p>三端共享协议类型:</p><ul><li>会话消息</li><li>配对与令牌数据结构</li><li>审计事件结构</li></ul><h2 id="_3-运行时数据流" tabindex="-1">3. 运行时数据流 <a class="header-anchor" href="#_3-运行时数据流" aria-label="Permalink to &quot;3. 运行时数据流&quot;">​</a></h2><h3 id="启动链路" tabindex="-1">启动链路 <a class="header-anchor" href="#启动链路" aria-label="Permalink to &quot;启动链路&quot;">​</a></h3><ol><li>服务器执行 <code>termpilot relay</code></li><li>relay 监听 HTTP/WebSocket,并托管 <code>app/dist</code></li><li>电脑第一次执行 <code>termpilot agent</code>,在终端里输入 relay 域名和端口</li><li>agent 保存本地配置,并在后台启动常驻进程</li><li>以后电脑直接执行 <code>termpilot agent</code>,自动按已保存配置启动或显示状态</li><li>手机上直接打开 relay 域名</li></ol><h3 id="会话创建" tabindex="-1">会话创建 <a class="header-anchor" href="#会话创建" aria-label="Permalink to &quot;会话创建&quot;">​</a></h3><ol><li>手机端或电脑端发起 <code>session.create</code></li><li>relay 把请求转发给对应 device 的 agent</li><li>agent 在本地创建 <code>tmux</code> 会话</li><li>agent 回推 <code>session.created</code></li><li>relay 广播给有权限的 client</li></ol><h3 id="输出同步" tabindex="-1">输出同步 <a class="header-anchor" href="#输出同步" aria-label="Permalink to &quot;输出同步&quot;">​</a></h3><ol><li>agent 周期性 <code>capture-pane</code></li><li>如果缓冲变化,生成新的 <code>session.output</code></li><li>relay 缓冲最近一段输出帧</li><li>app 渲染最新快照</li><li>client 重连后可用 <code>session.replay</code> 补拉</li></ol><h3 id="配对与访问控制" tabindex="-1">配对与访问控制 <a class="header-anchor" href="#配对与访问控制" aria-label="Permalink to &quot;配对与访问控制&quot;">​</a></h3><ol><li>电脑端执行 <code>termpilot agent</code></li><li>如果本机还没有配置 relay,agent 会提示输入域名和端口,并保存到本地配置文件</li><li>relay 创建一次性配对码</li><li>手机端输入配对码,兑换设备访问令牌</li><li>client WebSocket 以后携带设备令牌</li><li>relay 只向该 client 暴露允许访问的设备和会话</li></ol><h2 id="_4-当前实现边界" tabindex="-1">4. 当前实现边界 <a class="header-anchor" href="#_4-当前实现边界" aria-label="Permalink to &quot;4. 当前实现边界&quot;">​</a></h2><ul><li>当前终端同步策略仍是“快照替换”,不是字节级增量流</li><li>relay 输出缓冲只保留最近一段,不做长期日志归档</li><li>不接管 TermPilot 体系外的历史终端</li><li>手机端定位是“查看、轻输入、轻控制”,不追求桌面级重度编辑体验</li></ul><h2 id="_5-当前代码取舍" tabindex="-1">5. 当前代码取舍 <a class="header-anchor" href="#_5-当前代码取舍" aria-label="Permalink to &quot;5. 当前代码取舍&quot;">​</a></h2><ul><li>对外形态已经统一成单一 CLI,但仓库内部仍保留 <code>agent/app/relay</code> 三个目录,方便独立开发</li><li><code>app</code> 的状态和副作用仍集中在 <code>App.tsx</code>,但渲染层已经拆到独立组件</li><li><code>relay</code> 已从单文件脚本式入口拆成 <code>server.ts + index.ts</code></li><li><code>agent</code> 已从单文件 CLI 拆成 <code>cli.ts + index.ts + daemon.ts + tmux-backend.ts</code></li></ul><h2 id="_6-当前验证方式" tabindex="-1">6. 当前验证方式 <a class="header-anchor" href="#_6-当前验证方式" aria-label="Permalink to &quot;6. 当前验证方式&quot;">​</a></h2><p>最有价值的检查命令:</p><ul><li><code>pnpm typecheck</code></li><li><code>pnpm build</code></li><li><code>pnpm test:ui-smoke</code></li><li><code>pnpm check:stability</code></li></ul><p>它们覆盖的重点是:</p><ul><li><code>termpilot relay</code> 和 <code>termpilot agent</code> 主链路</li><li>输出缓冲与重连一致性</li><li>手机端配对、切会话、关会话、清除绑定</li></ul></div></div></main><footer class="VPDocFooter" data-v-1870bdbd data-v-b170fa4f><!--[--><!--]--><div class="edit-info" data-v-b170fa4f><div class="edit-link" data-v-b170fa4f><a class="VPLink link vp-external-link-icon no-icon edit-link-button" href="https://github.com/fengye404/TermPilot/edit/main/docs/architecture.md" target="_blank" rel="noreferrer" data-v-b170fa4f><!--[--><span class="vpi-square-pen edit-link-icon" data-v-b170fa4f></span> 在 GitHub 上编辑此页<!--]--></a></div><div class="last-updated" data-v-b170fa4f><p class="VPLastUpdated" data-v-b170fa4f data-v-33a4642e>Last updated: <time datetime="2026-03-11T17:24:53.000Z" data-v-33a4642e></time></p></div></div><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-b170fa4f><span class="visually-hidden" id="doc-footer-aria-label" data-v-b170fa4f>Pager</span><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link prev" href="/operations-guide" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Previous page</span><span class="title" data-v-b170fa4f>部署与运维指南</span><!--]--></a></div><div class="pager" data-v-b170fa4f><a class="VPLink link pager-link next" href="/protocol" data-v-b170fa4f><!--[--><span class="desc" data-v-b170fa4f>Next page</span><span class="title" data-v-b170fa4f>协议说明</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-1bdd7537 data-v-9a5ea44b><div class="container" data-v-9a5ea44b><p class="message" data-v-9a5ea44b>为长期任务和跨端终端控制而构建。</p><p class="copyright" data-v-9a5ea44b>Copyright © 2026 Fengye</p></div></footer><!--[--><!--]--></div></div>
39
+ <script>window.__VP_HASH_MAP__=JSON.parse("{\"architecture.md\":\"JnC1zyYV\",\"development.md\":\"iwUVjeO6\",\"getting-started.md\":\"Cirp1CHi\",\"index.md\":\"D9XElNRh\",\"operations-guide.md\":\"DfNiIg5F\",\"protocol.md\":\"CCXFJUPR\",\"readme.md\":\"B4-OJVNQ\",\"tech-selection-2026.md\":\"Dk_ymWTx\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"zh-CN\",\"dir\":\"ltr\",\"title\":\"TermPilot\",\"description\":\"手机和电脑共享同一个 tmux 会话的终端远程控制工具。\",\"base\":\"/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"siteTitle\":\"TermPilot\",\"logo\":\"/favicon.svg\",\"nav\":[{\"text\":\"首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维\",\"link\":\"/operations-guide\"},{\"text\":\"架构\",\"link\":\"/architecture\"},{\"text\":\"协议\",\"link\":\"/protocol\"}],\"sidebar\":[{\"text\":\"开始\",\"items\":[{\"text\":\"文档首页\",\"link\":\"/\"},{\"text\":\"快速开始\",\"link\":\"/getting-started\"},{\"text\":\"部署与运维指南\",\"link\":\"/operations-guide\"}]},{\"text\":\"参考\",\"items\":[{\"text\":\"代码架构\",\"link\":\"/architecture\"},{\"text\":\"协议说明\",\"link\":\"/protocol\"},{\"text\":\"开发文档\",\"link\":\"/development\"},{\"text\":\"技术选型\",\"link\":\"/tech-selection-2026\"}]}],\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/fengye404/TermPilot\"}],\"editLink\":{\"pattern\":\"https://github.com/fengye404/TermPilot/edit/main/docs/:path\",\"text\":\"在 GitHub 上编辑此页\"},\"outline\":{\"level\":[2,3],\"label\":\"本页目录\"},\"footer\":{\"message\":\"为长期任务和跨端终端控制而构建。\",\"copyright\":\"Copyright © 2026 Fengye\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
40
+
41
+ </body>
42
+ </html>
@@ -0,0 +1 @@
1
+ import{_ as a,o as t,c as r,ag as i}from"./chunks/framework.BZohXCq9.js";const f=JSON.parse('{"title":"docs 目录","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1773250545000}'),o={name:"README.md"};function s(l,e,d,c,n,_){return t(),r("div",null,[...e[0]||(e[0]=[i('<h1 id="docs-目录" tabindex="-1">docs 目录 <a class="header-anchor" href="#docs-目录" aria-label="Permalink to &quot;docs 目录&quot;">​</a></h1><p>如果你在 GitHub 仓库里浏览源码,推荐从下面几个入口开始:</p><ul><li><a href="./">文档首页</a></li><li><a href="./getting-started">快速开始</a></li><li><a href="./operations-guide">部署与运维指南</a></li><li><a href="./architecture">代码架构</a></li><li><a href="./development">开发文档</a></li></ul><p>如果 GitHub Pages 已经启用,优先看站点版本,它会带导航、目录和搜索。</p>',4)])])}const h=a(o,[["render",s]]);export{f as __pageData,h as default};
@@ -0,0 +1 @@
1
+ import{_ as a,o as t,c as r,ag as i}from"./chunks/framework.BZohXCq9.js";const f=JSON.parse('{"title":"docs 目录","description":"","frontmatter":{},"headers":[],"relativePath":"README.md","filePath":"README.md","lastUpdated":1773250545000}'),o={name:"README.md"};function s(l,e,d,c,n,_){return t(),r("div",null,[...e[0]||(e[0]=[i("",4)])])}const h=a(o,[["render",s]]);export{f as __pageData,h as default};
@@ -0,0 +1 @@
1
+ import{t as p}from"./chunks/theme.D0_6rd9F.js";import{R as s,a2 as i,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,d as v,u as y,v as C,s as P,ac as b,ad as w,ae as R,af as E}from"./chunks/framework.BZohXCq9.js";function r(e){if(e.extends){const a=r(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const n=r(p),S=v({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&b(),w(),R(),n.setup&&n.setup(),()=>E(n.Layout)}});async function T(){globalThis.__VITEPRESS__=!0;const e=_(),a=D();a.provide(u,e);const t=c(e.route);return a.provide(l,t),a.component("Content",f),a.component("ClientOnly",d),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),n.enhanceApp&&await n.enhanceApp({app:a,router:e,siteData:m}),{app:a,router:e,data:t}}function D(){return A(S)}function _(){let e=s;return h(a=>{let t=g(a),o=null;return t&&(e&&(t=t.replace(/\.js$/,".lean.js")),o=import(t)),s&&(e=!1),o},n.NotFound)}s&&T().then(({app:e,router:a,data:t})=>{a.go().then(()=>{i(a.route,t.site),e.mount("#app")})});export{T as createApp};
@@ -0,0 +1,17 @@
1
+ import{_ as a,o as l,c as i,ag as o}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"TermPilot 当前代码架构","description":"","frontmatter":{},"headers":[],"relativePath":"architecture.md","filePath":"architecture.md","lastUpdated":1773249893000}'),s={name:"architecture.md"};function t(c,e,n,d,r,p){return l(),i("div",null,[...e[0]||(e[0]=[o(`<h1 id="termpilot-当前代码架构" tabindex="-1">TermPilot 当前代码架构 <a class="header-anchor" href="#termpilot-当前代码架构" aria-label="Permalink to &quot;TermPilot 当前代码架构&quot;">​</a></h1><h2 id="_1-当前产品形态" tabindex="-1">1. 当前产品形态 <a class="header-anchor" href="#_1-当前产品形态" aria-label="Permalink to &quot;1. 当前产品形态&quot;">​</a></h2><ul><li>一个 npm 包:<code>termpilot</code></li><li>一个服务器命令:<code>termpilot relay</code></li><li>一个电脑命令:<code>termpilot agent</code></li><li>手机端不安装,直接打开 relay 域名</li><li>relay 同时负责 WebSocket 中继和 Web UI 托管</li></ul><p>对应拓扑:</p><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>手机浏览器 --https/ws--&gt; relay &lt;--ws--&gt; PC 端 agent</span></span>
2
+ <span class="line"><span> |</span></span>
3
+ <span class="line"><span> 配对、设备权限、消息路由、</span></span>
4
+ <span class="line"><span> 输出缓冲、审计日志、会话元数据、</span></span>
5
+ <span class="line"><span> 静态网页托管</span></span></code></pre></div><h2 id="_2-目录结构" tabindex="-1">2. 目录结构 <a class="header-anchor" href="#_2-目录结构" aria-label="Permalink to &quot;2. 目录结构&quot;">​</a></h2><div class="language-text vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>src/</span></span>
6
+ <span class="line"><span> cli.ts</span></span>
7
+ <span class="line"><span>agent/</span></span>
8
+ <span class="line"><span> src/</span></span>
9
+ <span class="line"><span>app/</span></span>
10
+ <span class="line"><span> src/</span></span>
11
+ <span class="line"><span> components/</span></span>
12
+ <span class="line"><span>relay/</span></span>
13
+ <span class="line"><span> src/</span></span>
14
+ <span class="line"><span>packages/</span></span>
15
+ <span class="line"><span> protocol/</span></span>
16
+ <span class="line"><span>scripts/</span></span>
17
+ <span class="line"><span>docs/</span></span></code></pre></div><h3 id="src-cli-ts" tabindex="-1"><code>src/cli.ts</code> <a class="header-anchor" href="#src-cli-ts" aria-label="Permalink to &quot;\`src/cli.ts\`&quot;">​</a></h3><p>统一 CLI 入口,负责把内部多模块收敛成外部单命令产品:</p><ul><li><code>termpilot relay</code></li><li><code>termpilot agent</code></li><li><code>termpilot agent/claude code/open code/pair/create/list/attach/kill/...</code></li></ul><h3 id="agent" tabindex="-1"><code>agent/</code> <a class="header-anchor" href="#agent" aria-label="Permalink to &quot;\`agent/\`&quot;">​</a></h3><p>PC 端常驻进程和本地命令实现:</p><ul><li><code>src/cli.ts</code>:agent 侧命令实现</li><li><code>src/index.ts</code>:开发态入口包装</li><li><code>src/daemon.ts</code>:常驻连接、轮询 <code>tmux</code>、同步输出与状态</li><li><code>src/tmux-backend.ts</code>:<code>tmux</code> 会话创建、输入、关闭、附着、抓屏</li><li><code>src/relay-admin.ts</code>:agent 调用 relay 管理接口的轻量客户端</li><li><code>src/state-store.ts</code>:本地 JSON 状态文件</li></ul><h3 id="relay" tabindex="-1"><code>relay/</code> <a class="header-anchor" href="#relay" aria-label="Permalink to &quot;\`relay/\`&quot;">​</a></h3><p>中继和网页托管层:</p><ul><li><code>src/server.ts</code>:WebSocket 路由、HTTP 接口、消息转发、静态网页托管</li><li><code>src/index.ts</code>:开发态入口包装</li><li><code>src/session-store.ts</code>:会话元数据存储</li><li><code>src/auth-store.ts</code>:配对码与访问令牌存储</li><li><code>src/audit-store.ts</code>:审计事件存储</li><li><code>src/config.ts</code>:环境变量配置</li></ul><h3 id="app" tabindex="-1"><code>app/</code> <a class="header-anchor" href="#app" aria-label="Permalink to &quot;\`app/\`&quot;">​</a></h3><p>手机端 PWA:</p><ul><li><code>src/App.tsx</code>:状态、副作用、WebSocket 协调</li><li><code>src/components/ConnectionPanel.tsx</code>:连接与配对 UI</li><li><code>src/components/CreateSessionPanel.tsx</code>:创建会话 UI</li><li><code>src/components/SessionListPanel.tsx</code>:会话搜索、筛选、置顶、关闭</li><li><code>src/components/TerminalWorkspace.tsx</code>:终端区域、快捷键和粘贴发送</li><li><code>src/components/chrome.tsx</code>:通用面板与字段组件</li></ul><h3 id="packages-protocol" tabindex="-1"><code>packages/protocol/</code> <a class="header-anchor" href="#packages-protocol" aria-label="Permalink to &quot;\`packages/protocol/\`&quot;">​</a></h3><p>三端共享协议类型:</p><ul><li>会话消息</li><li>配对与令牌数据结构</li><li>审计事件结构</li></ul><h2 id="_3-运行时数据流" tabindex="-1">3. 运行时数据流 <a class="header-anchor" href="#_3-运行时数据流" aria-label="Permalink to &quot;3. 运行时数据流&quot;">​</a></h2><h3 id="启动链路" tabindex="-1">启动链路 <a class="header-anchor" href="#启动链路" aria-label="Permalink to &quot;启动链路&quot;">​</a></h3><ol><li>服务器执行 <code>termpilot relay</code></li><li>relay 监听 HTTP/WebSocket,并托管 <code>app/dist</code></li><li>电脑第一次执行 <code>termpilot agent</code>,在终端里输入 relay 域名和端口</li><li>agent 保存本地配置,并在后台启动常驻进程</li><li>以后电脑直接执行 <code>termpilot agent</code>,自动按已保存配置启动或显示状态</li><li>手机上直接打开 relay 域名</li></ol><h3 id="会话创建" tabindex="-1">会话创建 <a class="header-anchor" href="#会话创建" aria-label="Permalink to &quot;会话创建&quot;">​</a></h3><ol><li>手机端或电脑端发起 <code>session.create</code></li><li>relay 把请求转发给对应 device 的 agent</li><li>agent 在本地创建 <code>tmux</code> 会话</li><li>agent 回推 <code>session.created</code></li><li>relay 广播给有权限的 client</li></ol><h3 id="输出同步" tabindex="-1">输出同步 <a class="header-anchor" href="#输出同步" aria-label="Permalink to &quot;输出同步&quot;">​</a></h3><ol><li>agent 周期性 <code>capture-pane</code></li><li>如果缓冲变化,生成新的 <code>session.output</code></li><li>relay 缓冲最近一段输出帧</li><li>app 渲染最新快照</li><li>client 重连后可用 <code>session.replay</code> 补拉</li></ol><h3 id="配对与访问控制" tabindex="-1">配对与访问控制 <a class="header-anchor" href="#配对与访问控制" aria-label="Permalink to &quot;配对与访问控制&quot;">​</a></h3><ol><li>电脑端执行 <code>termpilot agent</code></li><li>如果本机还没有配置 relay,agent 会提示输入域名和端口,并保存到本地配置文件</li><li>relay 创建一次性配对码</li><li>手机端输入配对码,兑换设备访问令牌</li><li>client WebSocket 以后携带设备令牌</li><li>relay 只向该 client 暴露允许访问的设备和会话</li></ol><h2 id="_4-当前实现边界" tabindex="-1">4. 当前实现边界 <a class="header-anchor" href="#_4-当前实现边界" aria-label="Permalink to &quot;4. 当前实现边界&quot;">​</a></h2><ul><li>当前终端同步策略仍是“快照替换”,不是字节级增量流</li><li>relay 输出缓冲只保留最近一段,不做长期日志归档</li><li>不接管 TermPilot 体系外的历史终端</li><li>手机端定位是“查看、轻输入、轻控制”,不追求桌面级重度编辑体验</li></ul><h2 id="_5-当前代码取舍" tabindex="-1">5. 当前代码取舍 <a class="header-anchor" href="#_5-当前代码取舍" aria-label="Permalink to &quot;5. 当前代码取舍&quot;">​</a></h2><ul><li>对外形态已经统一成单一 CLI,但仓库内部仍保留 <code>agent/app/relay</code> 三个目录,方便独立开发</li><li><code>app</code> 的状态和副作用仍集中在 <code>App.tsx</code>,但渲染层已经拆到独立组件</li><li><code>relay</code> 已从单文件脚本式入口拆成 <code>server.ts + index.ts</code></li><li><code>agent</code> 已从单文件 CLI 拆成 <code>cli.ts + index.ts + daemon.ts + tmux-backend.ts</code></li></ul><h2 id="_6-当前验证方式" tabindex="-1">6. 当前验证方式 <a class="header-anchor" href="#_6-当前验证方式" aria-label="Permalink to &quot;6. 当前验证方式&quot;">​</a></h2><p>最有价值的检查命令:</p><ul><li><code>pnpm typecheck</code></li><li><code>pnpm build</code></li><li><code>pnpm test:ui-smoke</code></li><li><code>pnpm check:stability</code></li></ul><p>它们覆盖的重点是:</p><ul><li><code>termpilot relay</code> 和 <code>termpilot agent</code> 主链路</li><li>输出缓冲与重连一致性</li><li>手机端配对、切会话、关会话、清除绑定</li></ul>`,40)])])}const m=a(s,[["render",t]]);export{u as __pageData,m as default};
@@ -0,0 +1 @@
1
+ import{_ as a,o as l,c as i,ag as o}from"./chunks/framework.BZohXCq9.js";const u=JSON.parse('{"title":"TermPilot 当前代码架构","description":"","frontmatter":{},"headers":[],"relativePath":"architecture.md","filePath":"architecture.md","lastUpdated":1773249893000}'),s={name:"architecture.md"};function t(c,e,n,d,r,p){return l(),i("div",null,[...e[0]||(e[0]=[o("",40)])])}const m=a(s,[["render",t]]);export{u as __pageData,m as default};
@@ -0,0 +1 @@
1
+ const t='{"documentCount":93,"nextId":93,"documentIds":{"0":"/README#docs-目录","1":"/getting-started#快速开始","2":"/getting-started#_1-你需要准备什么","3":"/getting-started#_2-在服务器启动-relay","4":"/getting-started#_3-在电脑启动-agent","5":"/getting-started#_4-在手机完成配对","6":"/getting-started#_5-直接跑一个可同步的任务","7":"/getting-started#_6-第一次跑通后你应该验证什么","8":"/getting-started#_7-常见问题","9":"/getting-started#termpilot-relay-为什么不占当前窗口","10":"/getting-started#termpilot-agent-为什么第二次执行没有再问域名","11":"/getting-started#为什么普通-iterm-标签页不会出现在手机上","12":"/getting-started#_8-下一步看什么","13":"/#你会怎么用它","14":"/#文档地图","15":"/#推荐阅读顺序","16":"/development#开发文档","17":"/development#本地开发","18":"/development#常用检查","19":"/development#当前仓库形态","20":"/development#发布流程","21":"/architecture#termpilot-当前代码架构","22":"/architecture#_1-当前产品形态","23":"/architecture#_2-目录结构","24":"/architecture#src-cli-ts","25":"/architecture#agent","26":"/architecture#relay","27":"/architecture#app","28":"/architecture#packages-protocol","29":"/architecture#_3-运行时数据流","30":"/architecture#启动链路","31":"/architecture#会话创建","32":"/architecture#输出同步","33":"/architecture#配对与访问控制","34":"/architecture#_4-当前实现边界","35":"/architecture#_5-当前代码取舍","36":"/architecture#_6-当前验证方式","37":"/operations-guide#termpilot-部署与运维指南","38":"/operations-guide#_0-阅读这份文档前-你应该已经知道什么","39":"/operations-guide#_1-适用场景","40":"/operations-guide#_2-部署清单","41":"/operations-guide#_3-运行模型","42":"/operations-guide#_4-推荐部署模式","43":"/operations-guide#模式-a-最低成本验证","44":"/operations-guide#模式-b-推荐生产模式","45":"/operations-guide#_5-生产部署步骤","46":"/operations-guide#_5-1-域名解析","47":"/operations-guide#_5-2-服务器启动-relay","48":"/operations-guide#_5-3-反向代理","49":"/operations-guide#_5-4-电脑启动-agent","50":"/operations-guide#_5-5-首次上线后的验收","51":"/operations-guide#_6-目录、数据与状态文件","52":"/operations-guide#_7-推荐的日常工作流","53":"/operations-guide#_7-1-服务器","54":"/operations-guide#_7-2-电脑","55":"/operations-guide#_7-3-手机","56":"/operations-guide#_8-运维动作速查","57":"/operations-guide#_8-1-relay","58":"/operations-guide#_8-2-agent","59":"/operations-guide#_8-3-会话","60":"/operations-guide#_9-故障排查","61":"/operations-guide#_9-1-手机打开域名-但页面进不去","62":"/operations-guide#_9-2-电脑端执行-termpilot-agent-后手机还是看不到设备","63":"/operations-guide#_9-3-手机端看不到某个任务","64":"/operations-guide#_9-4-想重新绑定手机","65":"/operations-guide#_9-5-relay-或-agent-想看实时日志","66":"/operations-guide#_9-6-我改了域名或端口-电脑还是连旧地址","67":"/operations-guide#_10-安全建议","68":"/operations-guide#_11-升级建议","69":"/operations-guide#_12-建议的文档阅读顺序","70":"/protocol#termpilot-当前协议","71":"/protocol#_1-连接入口","72":"/protocol#_2-当前消息类型","73":"/protocol#_3-会话模型","74":"/protocol#_4-输入与快捷键","75":"/protocol#_5-输出同步策略","76":"/protocol#_6-http-接口","77":"/protocol#创建一次性配对码","78":"/protocol#兑换配对码","79":"/protocol#查看当前设备已发出的访问令牌","80":"/protocol#撤销访问令牌","81":"/protocol#查看审计事件","82":"/protocol#健康检查","83":"/protocol#_7-当前产品入口与协议的关系","84":"/protocol#_8-当前协议边界","85":"/protocol#_9-会话状态消息","86":"/protocol#_10-输出补拉","87":"/tech-selection-2026#termpilot-全栈技术选型-2026-版","88":"/tech-selection-2026#最终方案","89":"/tech-selection-2026#为什么是这套","90":"/tech-selection-2026#为什么不再加别的","91":"/tech-selection-2026#当前代码与选型的对应关系","92":"/tech-selection-2026#一句话总结"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,16],"1":[1,1,8],"2":[2,1,16],"3":[3,1,15],"4":[3,1,19],"5":[2,1,16],"6":[2,1,22],"7":[2,1,11],"8":[2,1,1],"9":[3,3,7],"10":[3,3,4],"11":[3,3,10],"12":[2,1,6],"13":[1,1,20],"14":[1,1,6],"15":[1,1,9],"16":[1,1,1],"17":[1,1,8],"18":[1,1,22],"19":[1,1,14],"20":[1,1,19],"21":[2,1,1],"22":[2,2,34],"23":[2,2,13],"24":[3,4,16],"25":[2,4,30],"26":[2,4,22],"27":[2,4,26],"28":[3,4,5],"29":[2,2,1],"30":[1,4,20],"31":[1,4,16],"32":[1,4,17],"33":[1,4,16],"34":[2,2,15],"35":[2,2,24],"36":[2,2,21],"37":[2,1,21],"38":[3,2,11],"39":[2,2,20],"40":[2,2,24],"41":[2,2,29],"42":[2,2,1],"43":[3,4,20],"44":[3,4,20],"45":[2,2,1],"46":[3,4,10],"47":[4,4,19],"48":[3,4,16],"49":[4,4,19],"50":[2,4,27],"51":[3,2,25],"52":[2,2,1],"53":[3,4,6],"54":[3,4,10],"55":[3,4,8],"56":[2,2,1],"57":[3,4,8],"58":[3,4,10],"59":[3,4,22],"60":[2,2,1],"61":[4,4,20],"62":[6,4,11],"63":[3,4,23],"64":[3,4,11],"65":[6,4,6],"66":[4,4,11],"67":[2,2,19],"68":[2,2,23],"69":[2,2,5],"70":[2,1,1],"71":[2,2,32],"72":[2,2,19],"73":[2,2,16],"74":[2,2,29],"75":[2,2,35],"76":[3,2,1],"77":[1,5,17],"78":[1,5,10],"79":[1,5,6],"80":[1,5,7],"81":[1,5,8],"82":[1,5,9],"83":[2,2,27],"84":[2,2,16],"85":[2,2,19],"86":[2,2,19],"87":[5,1,1],"88":[1,5,31],"89":[1,5,26],"90":[1,5,26],"91":[1,5,35],"92":[1,5,29]},"averageFieldLength":[2.1827956989247315,2.752688172043011,15.10752688172043],"storedFields":{"0":{"title":"docs 目录","titles":[]},"1":{"title":"快速开始","titles":[]},"2":{"title":"1. 你需要准备什么","titles":["快速开始"]},"3":{"title":"2. 在服务器启动 relay","titles":["快速开始"]},"4":{"title":"3. 在电脑启动 agent","titles":["快速开始"]},"5":{"title":"4. 在手机完成配对","titles":["快速开始"]},"6":{"title":"5. 直接跑一个可同步的任务","titles":["快速开始"]},"7":{"title":"6. 第一次跑通后你应该验证什么","titles":["快速开始"]},"8":{"title":"7. 常见问题","titles":["快速开始"]},"9":{"title":"termpilot relay 为什么不占当前窗口","titles":["快速开始","7. 常见问题"]},"10":{"title":"termpilot agent 为什么第二次执行没有再问域名","titles":["快速开始","7. 常见问题"]},"11":{"title":"为什么普通 iTerm 标签页不会出现在手机上","titles":["快速开始","7. 常见问题"]},"12":{"title":"8. 下一步看什么","titles":["快速开始"]},"13":{"title":"你会怎么用它","titles":[]},"14":{"title":"文档地图","titles":[]},"15":{"title":"推荐阅读顺序","titles":[]},"16":{"title":"开发文档","titles":[]},"17":{"title":"本地开发","titles":["开发文档"]},"18":{"title":"常用检查","titles":["开发文档"]},"19":{"title":"当前仓库形态","titles":["开发文档"]},"20":{"title":"发布流程","titles":["开发文档"]},"21":{"title":"TermPilot 当前代码架构","titles":[]},"22":{"title":"1. 当前产品形态","titles":["TermPilot 当前代码架构"]},"23":{"title":"2. 目录结构","titles":["TermPilot 当前代码架构"]},"24":{"title":"src/cli.ts","titles":["TermPilot 当前代码架构","2. 目录结构"]},"25":{"title":"agent/","titles":["TermPilot 当前代码架构","2. 目录结构"]},"26":{"title":"relay/","titles":["TermPilot 当前代码架构","2. 目录结构"]},"27":{"title":"app/","titles":["TermPilot 当前代码架构","2. 目录结构"]},"28":{"title":"packages/protocol/","titles":["TermPilot 当前代码架构","2. 目录结构"]},"29":{"title":"3. 运行时数据流","titles":["TermPilot 当前代码架构"]},"30":{"title":"启动链路","titles":["TermPilot 当前代码架构","3. 运行时数据流"]},"31":{"title":"会话创建","titles":["TermPilot 当前代码架构","3. 运行时数据流"]},"32":{"title":"输出同步","titles":["TermPilot 当前代码架构","3. 运行时数据流"]},"33":{"title":"配对与访问控制","titles":["TermPilot 当前代码架构","3. 运行时数据流"]},"34":{"title":"4. 当前实现边界","titles":["TermPilot 当前代码架构"]},"35":{"title":"5. 当前代码取舍","titles":["TermPilot 当前代码架构"]},"36":{"title":"6. 当前验证方式","titles":["TermPilot 当前代码架构"]},"37":{"title":"TermPilot 部署与运维指南","titles":[]},"38":{"title":"0. 阅读这份文档前,你应该已经知道什么","titles":["TermPilot 部署与运维指南"]},"39":{"title":"1. 适用场景","titles":["TermPilot 部署与运维指南"]},"40":{"title":"2. 部署清单","titles":["TermPilot 部署与运维指南"]},"41":{"title":"3. 运行模型","titles":["TermPilot 部署与运维指南"]},"42":{"title":"4. 推荐部署模式","titles":["TermPilot 部署与运维指南"]},"43":{"title":"模式 A:最低成本验证","titles":["TermPilot 部署与运维指南","4. 推荐部署模式"]},"44":{"title":"模式 B:推荐生产模式","titles":["TermPilot 部署与运维指南","4. 推荐部署模式"]},"45":{"title":"5. 生产部署步骤","titles":["TermPilot 部署与运维指南"]},"46":{"title":"5.1 域名解析","titles":["TermPilot 部署与运维指南","5. 生产部署步骤"]},"47":{"title":"5.2 服务器启动 relay","titles":["TermPilot 部署与运维指南","5. 生产部署步骤"]},"48":{"title":"5.3 反向代理","titles":["TermPilot 部署与运维指南","5. 生产部署步骤"]},"49":{"title":"5.4 电脑启动 agent","titles":["TermPilot 部署与运维指南","5. 生产部署步骤"]},"50":{"title":"5.5 首次上线后的验收","titles":["TermPilot 部署与运维指南","5. 生产部署步骤"]},"51":{"title":"6. 目录、数据与状态文件","titles":["TermPilot 部署与运维指南"]},"52":{"title":"7. 推荐的日常工作流","titles":["TermPilot 部署与运维指南"]},"53":{"title":"7.1 服务器","titles":["TermPilot 部署与运维指南","7. 推荐的日常工作流"]},"54":{"title":"7.2 电脑","titles":["TermPilot 部署与运维指南","7. 推荐的日常工作流"]},"55":{"title":"7.3 手机","titles":["TermPilot 部署与运维指南","7. 推荐的日常工作流"]},"56":{"title":"8. 运维动作速查","titles":["TermPilot 部署与运维指南"]},"57":{"title":"8.1 relay","titles":["TermPilot 部署与运维指南","8. 运维动作速查"]},"58":{"title":"8.2 agent","titles":["TermPilot 部署与运维指南","8. 运维动作速查"]},"59":{"title":"8.3 会话","titles":["TermPilot 部署与运维指南","8. 运维动作速查"]},"60":{"title":"9. 故障排查","titles":["TermPilot 部署与运维指南"]},"61":{"title":"9.1 手机打开域名,但页面进不去","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"62":{"title":"9.2 电脑端执行 termpilot agent 后手机还是看不到设备","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"63":{"title":"9.3 手机端看不到某个任务","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"64":{"title":"9.4 想重新绑定手机","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"65":{"title":"9.5 relay 或 agent 想看实时日志","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"66":{"title":"9.6 我改了域名或端口,电脑还是连旧地址","titles":["TermPilot 部署与运维指南","9. 故障排查"]},"67":{"title":"10. 安全建议","titles":["TermPilot 部署与运维指南"]},"68":{"title":"11. 升级建议","titles":["TermPilot 部署与运维指南"]},"69":{"title":"12. 建议的文档阅读顺序","titles":["TermPilot 部署与运维指南"]},"70":{"title":"TermPilot 当前协议","titles":[]},"71":{"title":"1. 连接入口","titles":["TermPilot 当前协议"]},"72":{"title":"2. 当前消息类型","titles":["TermPilot 当前协议"]},"73":{"title":"3. 会话模型","titles":["TermPilot 当前协议"]},"74":{"title":"4. 输入与快捷键","titles":["TermPilot 当前协议"]},"75":{"title":"5. 输出同步策略","titles":["TermPilot 当前协议"]},"76":{"title":"6. HTTP 接口","titles":["TermPilot 当前协议"]},"77":{"title":"创建一次性配对码","titles":["TermPilot 当前协议","6. HTTP 接口"]},"78":{"title":"兑换配对码","titles":["TermPilot 当前协议","6. HTTP 接口"]},"79":{"title":"查看当前设备已发出的访问令牌","titles":["TermPilot 当前协议","6. HTTP 接口"]},"80":{"title":"撤销访问令牌","titles":["TermPilot 当前协议","6. HTTP 接口"]},"81":{"title":"查看审计事件","titles":["TermPilot 当前协议","6. HTTP 接口"]},"82":{"title":"健康检查","titles":["TermPilot 当前协议","6. HTTP 接口"]},"83":{"title":"7. 当前产品入口与协议的关系","titles":["TermPilot 当前协议"]},"84":{"title":"8. 当前协议边界","titles":["TermPilot 当前协议"]},"85":{"title":"9. 会话状态消息","titles":["TermPilot 当前协议"]},"86":{"title":"10. 输出补拉","titles":["TermPilot 当前协议"]},"87":{"title":"TermPilot 全栈技术选型(2026 版)","titles":[]},"88":{"title":"最终方案","titles":["TermPilot 全栈技术选型(2026 版)"]},"89":{"title":"为什么是这套","titles":["TermPilot 全栈技术选型(2026 版)"]},"90":{"title":"为什么不再加别的","titles":["TermPilot 全栈技术选型(2026 版)"]},"91":{"title":"当前代码与选型的对应关系","titles":["TermPilot 全栈技术选型(2026 版)"]},"92":{"title":"一句话总结","titles":["TermPilot 全栈技术选型(2026 版)"]}},"dirtCount":0,"index":[["就是",{"2":{"92":1}}],["友好的全栈方案",{"2":{"92":1}}],["为了本地开发效率",{"2":{"91":1}}],["为什么不再加别的",{"0":{"90":1}}],["为什么不占当前窗口",{"0":{"9":1}}],["为什么是这套",{"0":{"89":1}}],["为什么普通",{"0":{"11":1}}],["为什么第二次执行没有再问域名",{"0":{"10":1}}],["未设置时",{"2":{"91":1}}],["未配对时",{"2":{"5":1}}],["时使用",{"2":{"91":1}}],["设置",{"2":{"91":1}}],["设备权限和会话元数据",{"2":{"41":1}}],["设备权限",{"2":{"22":1}}],["采用的是",{"2":{"91":1}}],["其中",{"2":{"91":1}}],["根目录",{"2":{"91":1}}],["根入口",{"2":{"19":1}}],["少框架",{"2":{"90":1}}],["少概念",{"2":{"90":1}}],["尽量少配置",{"2":{"90":1}}],["技术看起来完整",{"2":{"90":1}}],["技术多",{"2":{"89":1}}],["现在要的不是",{"2":{"90":1}}],["现在按手机视口跑",{"2":{"18":1}}],["zod",{"2":{"90":1}}],["zustand",{"2":{"90":1}}],["仓库层面用",{"2":{"89":1}}],["仓库里浏览源码",{"2":{"0":1}}],["做就够了",{"2":{"89":1}}],["足够轻也足够成熟",{"2":{"89":1}}],["路线",{"2":{"89":1}}],["路由",{"2":{"26":1}}],["v4",{"2":{"88":1}}],["vite",{"2":{"88":1,"89":1,"91":1,"92":1}}],["语言",{"2":{"88":1}}],["版",{"0":{"87":1},"1":{"88":1,"89":1,"90":1,"91":1,"92":1}}],["全栈技术选型",{"0":{"87":1},"1":{"88":1,"89":1,"90":1,"91":1,"92":1}}],["可以请求补拉最近输出",{"2":{"86":1}}],["可以设置",{"2":{"51":1}}],["用户主动关闭会话",{"2":{"85":1}}],["用手机完成一次真实配对和会话查看",{"2":{"68":1}}],["客户端收到后直接替换当前渲染内容",{"2":{"84":1}}],["递增",{"2":{"84":1}}],["字段说明",{"2":{"84":1}}],["侧仍直接处理较多状态拼装",{"2":{"84":1}}],["侧命令实现",{"2":{"25":1}}],["交互",{"2":{"83":1}}],["始终只和",{"2":{"83":1}}],["返回",{"2":{"82":1}}],["健康检查",{"0":{"82":1}}],["撤销访问令牌",{"0":{"80":1}}],["兑换配对码",{"0":{"78":1}}],["兑换设备访问令牌",{"2":{"33":1}}],["quot",{"2":{"77":4,"78":4}}],["需要",{"2":{"77":1}}],["保留最近一段输出帧",{"2":{"75":1}}],["保存本地配置",{"2":{"4":1,"30":1,"49":1}}],["mode=replace",{"2":{"84":1}}],["mode",{"2":{"75":1}}],["main",{"2":{"74":1,"75":1,"77":1,"85":2,"86":1}}],["my",{"2":{"59":1,"63":1}}],["普通输入仍走",{"2":{"74":1}}],["url",{"2":{"91":1}}],["up",{"2":{"74":1}}],["ui",{"2":{"18":2,"20":1,"22":1,"27":2,"36":1,"90":1}}],["固定为",{"2":{"73":1}}],["固定令牌或",{"2":{"71":1}}],["events",{"2":{"81":1}}],["echo",{"2":{"74":1}}],["escape",{"2":{"74":1}}],["enter",{"2":{"74":1}}],["exitcode",{"2":{"85":1}}],["exit",{"2":{"72":1,"85":1}}],["error",{"2":{"72":1}}],["系统消息",{"2":{"72":1}}],["访问令牌",{"2":{"71":1}}],["xterm",{"2":{"88":1,"91":1,"92":1}}],["x26",{"2":{"71":2}}],["x3c",{"2":{"22":1,"59":2,"63":1,"64":1,"71":4}}],["都通过",{"2":{"71":1}}],["都能正常启动",{"2":{"68":1}}],["连接时必须带",{"2":{"71":1}}],["连接入口",{"0":{"71":1}}],["连接与配对",{"2":{"27":1}}],["本文档",{"2":{"69":1}}],["本地会话状态",{"2":{"51":1}}],["本地保存的",{"2":{"51":1}}],["本地",{"2":{"25":1}}],["本地开发",{"0":{"17":1}}],["~",{"2":{"68":2}}],["升级建议",{"0":{"68":1}}],["及时撤销旧令牌",{"2":{"67":1}}],["换手机或多人共享设备后",{"2":{"67":1}}],["正式栈默认使用",{"2":{"91":1}}],["正式环境优先使用域名",{"2":{"67":1}}],["正确做法",{"2":{"63":1}}],["正确做法是从一开始就用",{"2":{"11":1}}],["安全建议",{"0":{"67":1}}],["安装",{"2":{"2":1}}],["也要确认是不是改到了另一个",{"2":{"66":1}}],["我改了域名或端口",{"0":{"66":1}}],["flutter",{"2":{"90":1}}],["fastify",{"2":{"88":1,"89":1,"91":1,"92":1}}],["foreground",{"2":{"65":1}}],["fengye404",{"2":{"2":1,"20":1,"40":1,"46":1}}],["后手机还是看不到设备",{"0":{"62":1}}],["后台",{"2":{"51":2}}],["后台启动",{"2":{"3":1,"4":1,"47":1,"49":1,"57":1}}],["是否第一次配对还没完成",{"2":{"62":1}}],["是否已经后台运行",{"2":{"62":1}}],["是否已经生效",{"2":{"61":1}}],["是否真的在跑",{"2":{"61":1}}],["是否放行",{"2":{"61":1}}],["优先检查",{"2":{"61":1,"62":1,"68":1}}],["优先看站点版本",{"2":{"0":1}}],["故障排查",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1}}],["9",{"0":{"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"85":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1}}],["手动管理会话",{"2":{"59":1}}],["手机",{"0":{"55":1}}],["手机输入配对码并进入会话列表",{"2":{"50":1}}],["手机打开域名",{"0":{"61":1}}],["手机打开",{"2":{"50":1}}],["手机访问",{"2":{"43":1,"44":1}}],["手机浏览器直接打开",{"2":{"41":1}}],["手机浏览器打开",{"2":{"5":1}}],["手机端用",{"2":{"92":1}}],["手机端重连或重新进入会话时",{"2":{"86":1}}],["手机端网页不再要求单独部署",{"2":{"83":1}}],["手机端直接访问",{"2":{"83":1}}],["手机端或浏览器端",{"2":{"71":1}}],["手机端或电脑端发起",{"2":{"31":1}}],["手机端和",{"2":{"71":1}}],["手机端看不到某个任务",{"0":{"63":1}}],["手机端配对",{"2":{"36":1}}],["手机端定位是",{"2":{"34":1}}],["手机端输入配对码",{"2":{"33":1}}],["手机端不安装",{"2":{"22":1}}],["手机端",{"2":{"19":1,"27":1,"88":1}}],["手机上直接打开",{"2":{"30":1}}],["手机上能补命令",{"2":{"13":1}}],["手机上打开",{"2":{"13":1}}],["手机上打开同一个会话",{"2":{"7":1}}],["手机上关闭这个会话",{"2":{"7":1}}],["手机上发一条短命令",{"2":{"7":1}}],["重连后用",{"2":{"75":1}}],["重连后可用",{"2":{"32":1}}],["重新生成配对码",{"2":{"58":1}}],["按本机配置启动或查看状态",{"2":{"58":1}}],["之后正常重连不应该要求重新配对",{"2":{"55":1}}],["之后你会得到",{"2":{"13":1}}],["长期固定访问",{"2":{"55":1}}],["长期保持",{"2":{"53":1}}],["长时间运行下的输出缓冲和重连一致性",{"2":{"18":1}}],["日常只记住",{"2":{"54":1}}],["日常运维",{"2":{"37":1}}],["日志",{"2":{"51":2}}],["limit=20",{"2":{"81":1}}],["list",{"2":{"24":1,"59":1,"72":2}}],["lts",{"2":{"88":1,"92":1}}],["lt",{"2":{"77":1}}],["left",{"2":{"74":1}}],["lastactivityat",{"2":{"73":1}}],["lastseq",{"2":{"73":1}}],["log",{"2":{"51":2,"68":2}}],["配置上",{"2":{"67":1}}],["配置",{"2":{"51":1}}],["配对与访问控制",{"0":{"33":1}}],["配对与令牌数据结构",{"2":{"28":1}}],["配对码与访问令牌存储",{"2":{"26":1}}],["配对",{"2":{"22":1,"41":1}}],["配对成功后",{"2":{"5":1}}],["数据与状态文件",{"0":{"51":1}}],["建议的文档阅读顺序",{"0":{"69":1}}],["建议接",{"2":{"67":1}}],["建议按下面顺序验收",{"2":{"50":1}}],["建议你已经完成过下面这件事中的至少一件",{"2":{"38":1}}],["建议你做这",{"2":{"7":1}}],["首次上线后的验收",{"0":{"50":1}}],["首页只需要做一件事",{"2":{"5":1}}],["然后在终端里输入",{"2":{"49":1}}],["然后它会自动",{"2":{"4":1}}],["网页请求",{"2":{"48":1}}],["hello",{"2":{"74":1}}],["health",{"2":{"50":1,"61":1,"68":1,"82":1}}],["host>",{"2":{"71":1}}],["host=0",{"2":{"47":1}}],["home",{"2":{"66":1}}],["home=",{"2":{"51":2}}],["https",{"2":{"5":2,"22":1,"39":1,"40":1,"41":1,"43":2,"44":1,"50":1,"55":1,"67":1}}],["http",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"2":{"5":1,"26":1,"30":1,"43":1,"50":1,"61":1,"68":1,"83":1}}],["前端走最主流的",{"2":{"89":1}}],["前台运行",{"2":{"47":1}}],["前面放一个反向代理",{"2":{"44":1}}],["停止后台",{"2":{"47":1,"57":1,"58":1}}],["记录指向服务器公网",{"2":{"46":1}}],["生产部署步骤",{"0":{"45":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1}}],["生成新的",{"2":{"32":1}}],["多设备跨网络访问",{"2":{"44":1}}],["个人长期使用",{"2":{"44":1}}],["个最小动作",{"2":{"7":1}}],["例如",{"2":{"44":1,"46":1}}],["没有事件聚合接口",{"2":{"84":1}}],["没有",{"2":{"43":1}}],["缺点",{"2":{"43":1}}],["自己先试通链路",{"2":{"43":1}}],["自动按已保存配置启动或显示状态",{"2":{"30":1}}],["模式",{"0":{"43":1,"44":1}}],["^",{"2":{"41":1}}],["反向代理是否已启动",{"2":{"61":1}}],["反向代理",{"0":{"48":1},"2":{"41":1}}],["反代跑起来",{"2":{"40":1}}],["反代",{"2":{"37":1}}],["反代后的",{"2":{"5":1}}],["中继服务用",{"2":{"92":1}}],["中继服务",{"2":{"88":1}}],["中继",{"2":{"41":1}}],["中继和网页托管层",{"2":{"26":1}}],["中继和",{"2":{"22":1}}],["负责管理本地",{"2":{"41":1}}],["负责网页托管",{"2":{"41":1}}],["负责把内部多模块收敛成外部单命令产品",{"2":{"24":1}}],["由三部分组成",{"2":{"41":1}}],["服务器检查",{"2":{"61":1}}],["服务器",{"0":{"53":1}}],["服务器本机执行",{"2":{"50":1}}],["服务器启动",{"0":{"47":1}}],["服务器上运行",{"2":{"44":1}}],["服务器上直接运行",{"2":{"43":1}}],["服务器和电脑都已经安装",{"2":{"40":1}}],["服务器已经放行",{"2":{"40":1}}],["服务器执行",{"2":{"30":1,"50":1}}],["开始之前",{"2":{"40":1}}],["开发时允许内存回退",{"2":{"91":1}}],["开发态入口包装",{"2":{"25":1,"26":1}}],["开发文档",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1},"2":{"0":1,"14":1,"15":1}}],["只有缓冲变化时才推新帧",{"2":{"75":1}}],["只有排障时才用",{"2":{"53":1}}],["只想在局域网里临时试一下",{"2":{"39":1}}],["只向该",{"2":{"33":1}}],["而不是直接用裸",{"2":{"39":1}}],["而是对当前目标来说不是最小必要集合",{"2":{"90":1}}],["而是",{"2":{"75":1,"89":1,"90":1}}],["而是把部署",{"2":{"37":1}}],["而是让你在",{"2":{"1":1}}],["暴露",{"2":{"39":1}}],["暴露允许访问的设备和会话",{"2":{"33":1}}],["准备长期跑在自己的服务器上",{"2":{"39":1}}],["准备长期部署时再看",{"2":{"15":1}}],["适合看日志",{"2":{"47":1}}],["适合",{"2":{"43":1,"44":1}}],["适合下面这些情况",{"2":{"39":1}}],["适用场景",{"0":{"39":1}}],["请求体",{"2":{"77":1,"78":1}}],["请先回到",{"2":{"38":1}}],["请用",{"2":{"9":1}}],["跑起来",{"2":{"40":1}}],["跑起来的用户",{"2":{"1":1}}],["跑通过一次",{"2":{"38":1}}],["阅读这份文档前",{"0":{"38":1}}],["排障清单和安全边界",{"2":{"37":1}}],["排障和安全边界收成一份更完整的运行手册",{"2":{"37":1}}],["运维动作速查",{"0":{"56":1},"1":{"57":1,"58":1,"59":1}}],["运维动作",{"2":{"37":1}}],["运行时",{"2":{"88":1}}],["运行时状态",{"2":{"51":2}}],["运行时数据流",{"0":{"29":1},"1":{"30":1,"31":1,"32":1,"33":1}}],["运行在你的电脑上",{"2":{"41":1}}],["运行在云服务器上",{"2":{"41":1}}],["运行模型",{"0":{"41":1}}],["运行",{"2":{"20":3}}],["部署清单",{"0":{"40":1}}],["部署步骤",{"2":{"37":1}}],["部署与运维指南",{"0":{"37":1},"1":{"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":1,"12":1,"14":1,"15":1}}],["再走",{"2":{"83":1}}],["再升级主力机器",{"2":{"68":1}}],["再重新执行一次交互配置",{"2":{"66":1}}],["再在电脑执行",{"2":{"40":1}}],["再让域名和",{"2":{"40":1}}],["再给推荐拓扑",{"2":{"37":1}}],["再次执行时",{"2":{"10":1}}],["先在一台日常不关键的机器上升级验证",{"2":{"68":1}}],["先停掉后台",{"2":{"66":1}}],["先让服务器上的",{"2":{"40":1}}],["先确认下面这些前置条件",{"2":{"40":1}}],["先说明适用场景",{"2":{"37":1}}],["先看",{"2":{"15":1}}],["分钟快速上手",{"2":{"37":1}}],["分钟内跑通第一条完整链路",{"2":{"1":1}}],["里的",{"2":{"37":1}}],["里继续运行",{"2":{"13":1}}],["关会话",{"2":{"36":1}}],["关闭",{"2":{"25":1,"27":1}}],["关闭会话",{"2":{"13":1,"18":1}}],["主链路",{"2":{"36":1}}],["它不重复",{"2":{"37":1}}],["它们覆盖的重点是",{"2":{"36":1}}],["它会直接使用本地配置启动或显示状态",{"2":{"10":1}}],["它会直接显示当前状态",{"2":{"4":1}}],["它会带导航",{"2":{"0":1}}],["最",{"2":{"92":1}}],["最容易持续参与开发",{"2":{"90":1}}],["最容易写对",{"2":{"89":1}}],["最终方案",{"0":{"88":1}}],["最常见原因",{"2":{"63":1}}],["最小配置如下",{"2":{"48":1}}],["最简单的后台启动",{"2":{"47":1}}],["最低成本验证",{"0":{"43":1}}],["最后用手机完成第一次配对",{"2":{"40":1}}],["最有价值的检查命令",{"2":{"36":1}}],["最短路径是",{"2":{"54":1}}],["最短路径只有四步",{"2":{"13":1}}],["最短路径就是",{"2":{"6":1}}],["拆成",{"2":{"35":1}}],["+",{"2":{"35":4,"67":1,"83":1,"89":1,"91":5,"92":7}}],["但页面进不去",{"0":{"61":1}}],["但渲染层已经拆到独立组件",{"2":{"35":1}}],["但仓库内部仍保留",{"2":{"35":1}}],["方便独立开发",{"2":{"35":1}}],["三端结构统一",{"2":{"90":1}}],["三端尽量共享同一种语言和同一种工程习惯",{"2":{"89":1}}],["三端共享协议类型",{"2":{"28":1}}],["三个目录",{"2":{"35":1}}],["对应实现",{"2":{"75":1}}],["对应拓扑",{"2":{"22":1}}],["对外暴露",{"2":{"43":1,"83":1}}],["对外形态已经统一成单一",{"2":{"35":1}}],["轻控制",{"2":{"34":1}}],["轻输入",{"2":{"34":1}}],["查看审计事件",{"0":{"81":1}}],["查看当前设备已发出的访问令牌",{"0":{"79":1}}],["查看后台状态",{"2":{"58":1}}],["查看后终端区进入可视区",{"2":{"18":1}}],["查看前台日志",{"2":{"57":1}}],["查看",{"2":{"34":1}}],["体系外的历史终端",{"2":{"34":1}}],["不加",{"2":{"90":7}}],["不引入多余框架",{"2":{"89":1}}],["不引入重框架",{"2":{"89":1}}],["不再保留多余备选",{"2":{"88":1}}],["不记录每一次普通输入",{"2":{"84":1}}],["不是完整历史回放",{"2":{"84":1}}],["不是字节级增量流",{"2":{"34":1}}],["不要把外网入口直接暴露到非预期端口和无",{"2":{"67":1}}],["不要长期传播手机端访问令牌",{"2":{"67":1}}],["不要长期裸露",{"2":{"67":1}}],["不适合长期使用",{"2":{"43":1}}],["不适合下面这些情况",{"2":{"39":1}}],["不想先配置域名和",{"2":{"43":1}}],["不需要单独安装",{"2":{"41":1}}],["不追求桌面级重度编辑体验",{"2":{"34":1}}],["不接管",{"2":{"34":1}}],["不做长期日志归档",{"2":{"34":1}}],["补拉",{"2":{"32":1,"75":1}}],["渲染最新快照",{"2":{"32":1}}],["缓冲最近一段输出帧",{"2":{"32":1}}],["ok",{"2":{"72":1,"82":1}}],["output",{"2":{"32":1,"72":1,"75":1}}],["open",{"2":{"6":1,"11":1,"24":1,"54":1,"59":1}}],["opencode",{"2":{"6":1}}],["周期性",{"2":{"32":1}}],["广播给有权限的",{"2":{"31":1}}],["回推",{"2":{"31":1}}],["的策略",{"2":{"91":1}}],["的同一个",{"2":{"71":1}}],["的基本流程可用",{"2":{"39":1}}],["的管理员手册来用",{"2":{"37":1}}],["的用户",{"2":{"37":1}}],["的状态和副作用仍集中在",{"2":{"35":1}}],["的",{"2":{"31":1}}],["把多模块项目管清楚",{"2":{"89":1}}],["把你的域名",{"2":{"46":1}}],["把请求转发给对应",{"2":{"31":1}}],["把命令写进这个会话",{"2":{"6":1}}],["并保存到本地配置文件",{"2":{"33":1}}],["并在后台启动常驻进程",{"2":{"30":1}}],["并托管",{"2":{"30":1}}],["监听",{"2":{"30":1}}],["启动链路",{"0":{"30":1}}],["通用面板与字段组件",{"2":{"27":1}}],["快照",{"2":{"75":1}}],["快照替换",{"2":{"34":1,"75":1}}],["快捷键和粘贴发送",{"2":{"27":1}}],["快速开始",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1},"2":{"0":1,"14":1,"15":1,"38":2,"39":1,"69":1}}],["终端区域",{"2":{"27":1}}],["终端会提示你输入",{"2":{"4":1}}],["置顶",{"2":{"27":1}}],["筛选",{"2":{"27":1}}],["创建一次性配对码",{"0":{"77":1},"2":{"33":1}}],["创建一个受",{"2":{"6":1}}],["创建会话",{"2":{"27":1}}],["协调",{"2":{"27":1}}],["协议说明",{"2":{"14":1,"69":1}}],["副作用",{"2":{"27":1}}],["状态",{"2":{"27":1}}],["状态文件",{"2":{"25":1}}],["环境变量配置",{"2":{"26":1}}],["审计目前只记录关键控制动作",{"2":{"84":1}}],["审计事件结构",{"2":{"28":1}}],["审计事件存储",{"2":{"26":1}}],["审计日志",{"2":{"22":1}}],["消息转发",{"2":{"26":1}}],["消息路由",{"2":{"22":1}}],["接口",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1},"2":{"26":1}}],["管理接口的轻量客户端",{"2":{"25":1}}],["管理的会话启动的",{"2":{"63":1}}],["管理的会话才会同步",{"2":{"11":1}}],["管理的",{"2":{"6":1}}],["调用",{"2":{"25":1}}],["抓屏",{"2":{"25":1}}],["附着",{"2":{"25":1}}],["同步输出与状态",{"2":{"25":1}}],["同时负责",{"2":{"22":1}}],["同时提供网页和",{"2":{"3":1}}],["轮询",{"2":{"25":1,"75":1}}],["kill",{"2":{"24":1,"59":1,"72":1,"83":1}}],["入口连接",{"2":{"71":1}}],["入口",{"2":{"24":1}}],["统一且克制",{"2":{"89":1}}],["统一",{"2":{"24":1}}],["静态网页托管",{"2":{"22":1,"26":1}}],["输出补拉",{"0":{"86":1}}],["输出补拉依赖最近缓冲",{"2":{"84":1}}],["输出序号",{"2":{"84":1}}],["输出一次性配对码",{"2":{"49":1}}],["输出同步策略",{"0":{"75":1}}],["输出同步",{"0":{"32":1}}],["输出缓冲与重连一致性",{"2":{"36":1}}],["输出缓冲只保留最近一段",{"2":{"34":1}}],["输出缓冲",{"2":{"22":1}}],["输入与快捷键",{"0":{"74":1}}],["输入",{"2":{"25":1}}],["输入电脑端打印出来的配对码",{"2":{"5":1}}],["|",{"2":{"22":1,"41":1}}],[">",{"2":{"22":2,"41":3,"71":1}}],["托管",{"2":{"22":1}}],["包管理",{"2":{"88":1}}],["包",{"2":{"22":1}}],["一句话总结",{"0":{"92":1}}],["一个已经解析到服务器的域名",{"2":{"40":1}}],["一个电脑命令",{"2":{"22":1}}],["一个服务器命令",{"2":{"22":1}}],["一个",{"2":{"22":1}}],["一台能被手机访问到的服务器",{"2":{"40":1}}],["一台作为主力开发机的电脑",{"2":{"2":1}}],["一台服务器",{"2":{"2":1}}],["当前最合理",{"2":{"92":1}}],["当前仓库已经按这套方案开始收敛",{"2":{"91":1}}],["当前仓库形态",{"0":{"19":1}}],["当前终端快照",{"2":{"84":1}}],["当前终端同步策略仍是",{"2":{"34":1}}],["当前审计动作包括",{"2":{"83":1}}],["当前产品入口与协议的关系",{"0":{"83":1}}],["当前产品形态",{"0":{"22":1}}],["当前不是字节级终端流",{"2":{"75":1}}],["当前支持的特殊按键",{"2":{"74":1}}],["当前",{"2":{"73":1,"75":1}}],["当前会话对象字段",{"2":{"73":1}}],["当前消息类型",{"0":{"72":1}}],["当前协议边界",{"0":{"84":1}}],["当前协议",{"0":{"70":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1}}],["当前验证方式",{"0":{"36":1}}],["当前代码与选型的对应关系",{"0":{"91":1}}],["当前代码取舍",{"0":{"35":1}}],["当前代码架构",{"0":{"21":1},"1":{"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1}}],["当前实现边界",{"0":{"34":1}}],["当前已发布包名",{"2":{"20":1}}],["native",{"2":{"90":1}}],["name",{"2":{"59":1,"63":1,"73":1}}],["next",{"2":{"90":1}}],["null",{"2":{"85":1}}],["n",{"2":{"74":1}}],["npm",{"2":{"20":1,"22":1}}],["node",{"2":{"2":1,"88":2,"91":1,"92":1}}],["执行",{"2":{"20":1}}],["提升版本号",{"2":{"20":1}}],["发布流程",{"0":{"20":1}}],["发快捷键",{"2":{"13":1}}],["共享协议类型",{"2":{"91":1}}],["共享协议",{"2":{"19":1}}],["端围绕",{"2":{"92":1}}],["端常驻进程和本地命令实现",{"2":{"25":1}}],["端",{"2":{"19":1,"22":1,"71":1,"88":1}}],["端口",{"2":{"4":1,"49":1}}],["会退回内存模式",{"2":{"91":1}}],["会自动",{"2":{"49":1}}],["会提示输入域名和端口",{"2":{"33":1}}],["会验证",{"2":{"18":1}}],["会话退出时发送",{"2":{"85":1}}],["会话状态变化时发送",{"2":{"85":1}}],["会话状态消息",{"0":{"85":1}}],["会话模型",{"0":{"73":1}}],["会话并连接",{"2":{"41":1}}],["会话消息",{"2":{"28":1,"72":1}}],["会话搜索",{"2":{"27":1}}],["会话创建",{"0":{"31":1},"2":{"25":1}}],["会话元数据存储",{"2":{"26":1}}],["会话元数据",{"2":{"22":1}}],["会话",{"0":{"59":1},"2":{"6":1,"31":1}}],["以后日常",{"2":{"49":1}}],["以后日常再次执行",{"2":{"4":1}}],["以后携带设备令牌",{"2":{"33":1}}],["以后电脑直接执行",{"2":{"30":1}}],["以及",{"2":{"18":1}}],["清除绑定",{"2":{"18":1,"36":1}}],["切会话",{"2":{"18":1,"36":1}}],["覆盖配对",{"2":{"18":1}}],["说明",{"2":{"18":1,"47":1}}],["shadcn",{"2":{"90":1}}],["shell",{"2":{"73":1}}],["s",{"2":{"71":1,"74":1,"75":1,"85":2,"86":1}}],["sid>",{"2":{"59":2,"63":1}}],["sid",{"2":{"59":2,"63":1,"73":1,"74":1,"75":1,"85":2,"86":1}}],["seq",{"2":{"75":1,"84":1}}],["sessionlistpanel",{"2":{"27":1}}],["session",{"2":{"26":1,"31":2,"32":2,"72":11,"74":1,"75":2,"83":2,"85":3,"86":1}}],["server",{"2":{"26":1,"35":1}}],["scripts",{"2":{"23":1}}],["src",{"0":{"24":1},"2":{"19":1,"23":3,"25":6,"26":6,"27":6}}],["storemode",{"2":{"82":1}}],["store",{"2":{"25":1,"26":3}}],["stop",{"2":{"3":1,"47":2,"57":1,"58":1,"66":1}}],["status",{"2":{"58":1,"62":1,"68":1,"73":1}}],["state",{"2":{"25":1,"51":1,"72":2,"85":1}}],["startedat",{"2":{"73":1}}],["start",{"2":{"47":1}}],["stability",{"2":{"18":2,"20":1,"36":1}}],["smoke",{"2":{"18":2,"20":1,"36":1}}],["bearer",{"2":{"77":1}}],["b",{"0":{"44":1}}],["backend",{"2":{"25":1,"35":1,"73":2}}],["bash",{"2":{"20":1}}],["bashpnpm",{"2":{"17":1,"18":1}}],["bashtermpilot",{"2":{"3":3,"4":2,"6":2,"9":1,"47":2,"49":3,"51":1,"53":2,"54":3,"57":3,"58":4,"59":2,"61":1,"62":1,"63":2,"64":2,"65":2,"66":1}}],["bashnpm",{"2":{"2":1}}],["build",{"2":{"18":1,"20":1,"36":1}}],["常见文件",{"2":{"51":1}}],["常见问题",{"0":{"8":1},"1":{"9":1,"10":1,"11":1}}],["常用命令",{"2":{"47":1}}],["常用检查",{"0":{"18":1}}],["常驻连接",{"2":{"25":1}}],["drizzle",{"2":{"90":1}}],["delete",{"2":{"80":1}}],["devices",{"2":{"79":1,"80":1,"81":1}}],["deviceid",{"2":{"71":2,"73":1,"74":1,"75":1,"77":1,"79":1,"80":1,"81":1,"85":2,"86":1}}],["deviceid=",{"2":{"71":1}}],["device",{"2":{"31":1}}],["dev",{"2":{"17":3}}],["database",{"2":{"91":1}}],["data",{"2":{"75":1,"84":1}}],["daemon",{"2":{"25":1,"35":1}}],["d",{"2":{"74":1}}],["dns",{"2":{"61":1}}],["dist",{"2":{"30":1}}],["down",{"2":{"74":1}}],["domain",{"2":{"5":2,"44":2,"50":1,"55":1}}],["docs",{"0":{"0":1},"2":{"23":1}}],["post",{"2":{"77":1,"78":1}}],["postgresql",{"2":{"67":1,"88":1,"91":2,"92":1}}],["port=8787",{"2":{"47":1}}],["project",{"2":{"59":1,"63":1}}],["proxy",{"2":{"48":1}}],["protocol",{"0":{"28":1},"2":{"19":1,"23":1,"91":1}}],["pwa",{"2":{"27":1,"88":1}}],["public",{"2":{"20":1}}],["publish",{"2":{"20":1}}],["payload",{"2":{"74":1,"75":1,"85":2,"86":1}}],["path",{"2":{"51":2,"59":1,"63":1}}],["pane",{"2":{"32":1,"75":2}}],["pairingcode",{"2":{"78":1}}],["pairings",{"2":{"78":1}}],["pairing",{"2":{"77":1,"83":2}}],["pair",{"2":{"24":1,"49":1,"58":1,"64":1}}],["packages",{"0":{"28":1},"2":{"19":1,"23":1,"91":1}}],["pages",{"2":{"0":1}}],["pc",{"2":{"19":1,"22":1,"25":1,"71":1,"74":1,"75":1,"77":1,"85":2,"86":1,"88":1,"92":1}}],["pnpm",{"2":{"17":3,"18":5,"20":3,"36":4,"88":1,"89":1,"91":1,"92":1}}],["和端口",{"2":{"39":1}}],["和",{"2":{"15":1,"36":1,"40":1,"68":1}}],["推荐的升级节奏",{"2":{"68":1}}],["推荐的日常工作流",{"0":{"52":1},"1":{"53":1,"54":1,"55":1}}],["推荐用",{"2":{"48":1}}],["推荐生产模式",{"0":{"44":1}}],["推荐部署模式",{"0":{"42":1},"1":{"43":1,"44":1}}],["推荐拓扑",{"2":{"41":1}}],["推荐你按这个顺序推进",{"2":{"40":1}}],["推荐阅读顺序",{"0":{"15":1}}],["推荐从下面几个入口开始",{"2":{"0":1}}],["文档风格参考了成熟开源项目常见的写法",{"2":{"37":1}}],["文档地图",{"0":{"14":1}}],["文档首页",{"2":{"0":1}}],["任务仍然在",{"2":{"13":1}}],["电脑还是连旧地址",{"0":{"66":1}}],["电脑检查",{"2":{"62":1}}],["电脑是否真的能连到",{"2":{"62":1}}],["电脑",{"0":{"54":1}}],["电脑执行",{"2":{"50":2}}],["电脑启动",{"0":{"49":1}}],["电脑连接",{"2":{"43":1,"44":1}}],["电脑端已经安装",{"2":{"40":1}}],["电脑端执行",{"0":{"62":1},"2":{"33":1}}],["电脑第一次执行",{"2":{"30":1}}],["电脑离开当前桌面后",{"2":{"13":1}}],["电脑和手机同步看到同一个会话输出",{"2":{"13":1}}],["电脑上看到任务开始流式输出",{"2":{"7":1}}],["电脑上已经安装",{"2":{"2":1}}],["域名解析",{"0":{"46":1}}],["域名直接指向服务器",{"2":{"44":1}}],["域名和端口",{"2":{"30":1}}],["域名",{"2":{"22":1,"30":1,"41":2,"83":1}}],["域名并输入配对码",{"2":{"13":1}}],["域名或",{"2":{"4":1,"49":1}}],["想看实时日志",{"0":{"65":1}}],["想重新绑定手机",{"0":{"64":1}}],["想降低手机端访问阻力",{"2":{"44":1}}],["想改代码时看",{"2":{"15":1}}],["想了解内部结构",{"2":{"12":1}}],["想长期部署",{"2":{"12":1}}],["看",{"2":{"12":2}}],["下一步看什么",{"0":{"12":1}}],["80",{"2":{"40":1,"61":1}}],["8",{"0":{"12":1,"56":1,"57":1,"58":1,"59":1,"84":1},"1":{"57":1,"58":1,"59":1},"2":{"86":1}}],["8787",{"2":{"3":1,"4":1,"5":1,"43":3,"48":1,"49":1,"50":1,"61":1,"67":1,"68":1}}],["标签页不会出现在手机上",{"0":{"11":1}}],["因为它们不是当前必须项",{"2":{"90":1}}],["因为它默认是后台启动",{"2":{"9":1}}],["因为只有",{"2":{"11":1}}],["因为第一次配置已经保存到了本地",{"2":{"10":1}}],["要看实时日志",{"2":{"9":1}}],["7",{"0":{"8":1,"52":1,"53":1,"54":1,"55":1,"83":1},"1":{"9":1,"10":1,"11":1,"53":1,"54":1,"55":1}}],["确认",{"2":{"68":1}}],["确认手机端能看到同一个会话的输出",{"2":{"50":1}}],["确认终端里已经打印出配对码",{"2":{"50":1}}],["确认后台已启动",{"2":{"50":1}}],["确认电脑端也同步结束",{"2":{"7":1}}],["确认会进入同一个会话",{"2":{"7":1}}],["确认输出同步",{"2":{"7":1}}],["第一次用配对码",{"2":{"55":1}}],["第一次",{"2":{"49":1}}],["第一次使用请先看",{"2":{"39":1}}],["第一次体验产品",{"2":{"39":1}}],["第一次跑通后你应该验证什么",{"0":{"7":1}}],["第一次运行时",{"2":{"4":1}}],["6",{"0":{"7":1,"36":1,"51":1,"66":1,"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1}}],["此时手机上会看到同一个会话输出",{"2":{"6":1}}],["到这个会话",{"2":{"6":1}}],["ai",{"2":{"89":1,"90":1,"92":1}}],["afterseq",{"2":{"86":1}}],["abc",{"2":{"78":1}}],["api",{"2":{"77":1,"78":1,"79":1,"80":1,"81":1,"83":1}}],["app",{"0":{"27":1},"2":{"17":1,"19":1,"23":1,"27":1,"30":1,"32":1,"35":3,"41":2,"88":1,"91":1}}],["arrow",{"2":{"74":4}}],["a",{"0":{"43":1},"2":{"46":1}}],["audit",{"2":{"26":1,"81":1}}],["authorization",{"2":{"77":1}}],["auth",{"2":{"26":1,"72":1}}],["admin",{"2":{"25":1}}],["accesstoken",{"2":{"80":1}}],["accesstoken>",{"2":{"64":1}}],["access",{"2":{"20":1}}],["attach",{"2":{"6":1,"24":1,"59":1,"63":1}}],["agentsonline",{"2":{"82":1}}],["agent|client>",{"2":{"71":1}}],["agent",{"0":{"4":1,"10":1,"25":1,"49":1,"58":1,"62":1,"65":1},"2":{"4":4,"13":1,"17":1,"18":1,"19":1,"22":2,"23":1,"24":2,"25":2,"30":3,"31":3,"32":1,"33":2,"35":2,"36":1,"38":1,"40":1,"41":2,"49":4,"50":1,"51":6,"54":1,"58":5,"62":3,"64":1,"65":2,"66":3,"68":3,"71":4,"75":1,"77":1,"83":1,"88":1,"89":1,"91":1}}],["让当前终端直接",{"2":{"6":1}}],["这些技术不是不好",{"2":{"90":1}}],["这次我刻意把一些名字收掉了",{"2":{"90":1}}],["这次技术选型只保留已经拍板的方案",{"2":{"88":1}}],["这套方案最重要的优点不是",{"2":{"89":1}}],["这个任务不是通过",{"2":{"63":1}}],["这会同时转发",{"2":{"48":1}}],["这份文档面向准备长期使用",{"2":{"37":1}}],["这份文档面向第一次真正把",{"2":{"1":1}}],["这两条命令都会",{"2":{"6":1}}],["css",{"2":{"88":1,"91":1,"92":1}}],["c",{"2":{"74":1}}],["ctrl",{"2":{"74":2}}],["cwd",{"2":{"59":1,"63":1,"73":1}}],["curl",{"2":{"50":1,"61":1,"68":1}}],["caddyfilefengye404",{"2":{"48":1}}],["caddy",{"2":{"44":1,"48":1}}],["capture",{"2":{"32":1,"75":1}}],["chrome",{"2":{"27":1}}],["check",{"2":{"18":2,"20":1,"36":1}}],["clientsonline",{"2":{"82":1}}],["client",{"2":{"31":1,"32":1,"33":2,"71":2,"75":1,"84":1}}],["cli",{"0":{"24":1},"2":{"19":1,"23":1,"24":1,"25":1,"35":3}}],["claude",{"2":{"6":2,"11":1,"13":1,"24":1,"50":1,"54":1,"59":1,"63":1}}],["created",{"2":{"31":1,"72":1,"83":1}}],["createsessionpanel",{"2":{"27":1}}],["create",{"2":{"11":1,"24":1,"31":1,"59":1,"63":1,"72":1,"83":1}}],["connectionpanel",{"2":{"27":1}}],["config",{"2":{"26":1,"51":1}}],["codes",{"2":{"77":1}}],["code",{"2":{"6":3,"11":2,"13":1,"24":2,"50":1,"54":2,"59":2,"63":1,"83":1}}],["components",{"2":{"23":1,"27":5}}],["com",{"2":{"5":2,"44":2,"50":1,"55":1}}],["直接围绕",{"2":{"89":1}}],["直接启动常见任务",{"2":{"59":1}}],["直接打开",{"2":{"22":1}}],["直接跑一个可同步的任务",{"0":{"6":1}}],["直接回车默认",{"2":{"4":1,"49":1}}],["你的服务器公网",{"2":{"46":1}}],["你需要给自己或团队整理一份可维护的运行说明",{"2":{"39":1}}],["你需要准备什么",{"0":{"2":1}}],["你希望用域名和",{"2":{"39":1}}],["你已经确认",{"2":{"39":1}}],["你应该已经知道什么",{"0":{"38":1}}],["你可以把它当成",{"2":{"37":1}}],["你会怎么用它",{"0":{"13":1}}],["你会直接进入会话列表",{"2":{"5":1}}],["或者",{"2":{"54":1}}],["或者一台手机能访问到的局域网机器",{"2":{"2":1}}],["或",{"0":{"65":1},"2":{"47":1,"63":1}}],["或配置",{"2":{"5":1}}],["your",{"2":{"5":2,"43":2,"44":2,"50":1,"51":2,"55":1}}],["443",{"2":{"40":1,"61":1}}],["4",{"0":{"5":1,"34":1,"42":1,"49":1,"64":1,"74":1},"1":{"43":1,"44":1},"2":{"7":1}}],["已经看过",{"2":{"38":1}}],["已经启用",{"2":{"0":1}}],["已从单文件",{"2":{"35":1}}],["已从单文件脚本式入口拆成",{"2":{"35":1}}],["已存在",{"2":{"4":1}}],["打印一次性配对码",{"2":{"4":1}}],["input",{"2":{"72":1,"74":1}}],["index",{"2":{"25":1,"26":1,"35":2}}],["install",{"2":{"2":1,"17":1}}],["iterm",{"0":{"11":1}}],["ip",{"2":{"4":1,"39":1,"43":2,"46":2,"49":1,"67":1}}],["在此基础上",{"2":{"92":1}}],["在业务消息里指定",{"2":{"71":1}}],["在本地把",{"2":{"38":1}}],["在本地创建",{"2":{"31":1}}],["在终端里输入",{"2":{"30":1}}],["在电脑执行",{"2":{"13":2}}],["在电脑启动",{"0":{"4":1}}],["在服务器执行",{"2":{"13":1}}],["在服务器启动",{"0":{"3":1}}],["在手机完成配对",{"0":{"5":1}}],["3",{"0":{"4":1,"29":1,"41":1,"48":1,"55":1,"59":1,"63":1,"73":1},"1":{"30":1,"31":1,"32":1,"33":1}}],["right",{"2":{"74":1}}],["role=client",{"2":{"71":1}}],["role=agent",{"2":{"71":1}}],["role=",{"2":{"71":1}}],["req",{"2":{"86":1}}],["reqid",{"2":{"86":1}}],["requested",{"2":{"83":2}}],["react",{"2":{"88":1,"89":1,"90":1,"91":1,"92":1}}],["reason",{"2":{"85":1}}],["readme",{"2":{"37":1}}],["redeemed",{"2":{"83":1}}],["redeem",{"2":{"78":1}}],["replace",{"2":{"75":1}}],["replay",{"2":{"32":1,"72":1,"75":1,"86":2}}],["resize",{"2":{"72":1}}],["result",{"2":{"72":1}}],["revoked",{"2":{"83":1}}],["revoke",{"2":{"64":1}}],["reverse",{"2":{"48":1}}],["relay",{"0":{"3":1,"9":1,"26":1,"47":1,"57":1,"65":1},"2":{"3":3,"4":1,"9":1,"13":2,"17":1,"18":1,"19":2,"22":4,"23":1,"24":1,"25":2,"30":4,"31":2,"32":1,"33":3,"34":1,"35":2,"36":1,"38":1,"39":1,"40":1,"41":4,"43":1,"44":1,"47":9,"49":1,"50":1,"51":6,"53":2,"57":4,"61":2,"62":1,"65":2,"67":1,"68":2,"71":2,"72":1,"75":1,"83":2,"88":1,"89":1,"91":2}}],["runtime",{"2":{"51":2}}],["run",{"2":{"3":1,"9":1,"47":2,"53":1,"57":1,"65":1}}],["workspace",{"2":{"88":1,"89":1,"91":1,"92":1}}],["webuiready",{"2":{"82":1}}],["web",{"2":{"22":1}}],["websocket",{"2":{"3":1,"22":1,"26":1,"27":1,"30":1,"33":1,"41":1,"48":1,"71":1,"83":1,"88":1,"91":1,"92":1}}],["wss",{"2":{"39":1,"41":2,"43":1,"44":1,"67":1}}],["ws",{"2":{"3":1,"22":2,"41":1,"43":2,"44":1,"48":1,"67":2,"71":1,"83":2}}],["001",{"2":{"86":1}}],["0",{"0":{"38":1},"2":{"3":4,"47":3,"48":2,"50":2,"61":2,"68":2}}],["默认状态目录",{"2":{"51":1}}],["默认监听",{"2":{"3":1,"47":1}}],["默认行为",{"2":{"3":1}}],["24",{"2":{"88":1,"92":1}}],["2026",{"0":{"87":1},"1":{"88":1,"89":1,"90":1,"91":1,"92":1}}],["234",{"2":{"78":1}}],["2",{"0":{"3":1,"23":1,"40":1,"47":1,"54":1,"58":1,"62":1,"72":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1}}],["grant",{"2":{"83":1}}],["grants",{"2":{"64":1,"79":1,"80":1}}],["get",{"2":{"79":1,"81":1,"82":1}}],["gt",{"2":{"46":1,"77":1}}],["g",{"2":{"2":1}}],["github",{"2":{"0":2}}],["json",{"2":{"25":1,"51":4,"74":1,"75":1,"85":2,"86":1}}],["js",{"2":{"2":1,"88":3,"90":1,"91":2,"92":2}}],["两端都安装了",{"2":{"2":1}}],["typescript",{"2":{"88":1,"92":1}}],["type",{"2":{"74":1,"75":1,"85":2,"86":1}}],["typecheck",{"2":{"18":1,"36":1}}],["tailwind",{"2":{"88":1,"91":1,"92":1}}],["tab",{"2":{"74":1}}],["task",{"2":{"59":1,"63":1}}],["tls",{"2":{"67":1}}],["token>",{"2":{"71":1}}],["token=",{"2":{"71":1}}],["token",{"2":{"64":1,"71":1,"77":1}}],["to",{"2":{"59":1,"63":1}}],["top",{"2":{"46":1,"48":1}}],["tsx",{"2":{"27":6,"35":1}}],["ts",{"0":{"24":1},"2":{"19":1,"23":1,"25":6,"26":6,"35":6}}],["terminalworkspace",{"2":{"27":1}}],["termpilot",{"0":{"9":1,"10":1,"21":1,"37":1,"62":1,"70":1,"87":1},"1":{"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"88":1,"89":1,"90":1,"91":1,"92":1},"2":{"1":1,"2":2,"6":1,"11":4,"13":3,"20":1,"22":3,"24":3,"30":3,"33":1,"34":1,"36":2,"37":2,"38":2,"39":1,"40":3,"41":1,"43":1,"44":1,"47":6,"49":1,"50":3,"51":4,"59":4,"61":1,"62":1,"63":2,"64":1,"66":2,"68":5,"83":2,"90":1,"92":1}}],["text",{"2":{"74":1}}],["textws",{"2":{"71":1}}],["text~",{"2":{"51":1}}],["textsrc",{"2":{"23":1}}],["text手机浏览器",{"2":{"22":1,"41":1}}],["test",{"2":{"18":2,"20":1,"36":1}}],["tmuxsessionname",{"2":{"73":1}}],["tmux",{"2":{"2":1,"6":1,"13":1,"25":3,"31":1,"35":1,"40":1,"41":1,"73":1,"75":1,"88":1,"89":1,"91":1,"92":1}}],["123",{"2":{"74":1,"75":1,"85":2,"86":1}}],["12",{"0":{"69":1},"2":{"75":1}}],["127",{"2":{"48":1,"50":1,"61":1,"68":1}}],["11",{"0":{"68":1}}],["10",{"0":{"67":1,"86":1}}],["1",{"0":{"2":1,"22":1,"39":1,"46":1,"53":1,"57":1,"61":1,"71":1},"2":{"48":1,"50":1,"61":1,"68":1}}],["5",{"0":{"6":1,"35":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":2,"65":1,"75":1},"1":{"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"1":1,"37":1}}],["目标不是解释所有细节",{"2":{"1":1}}],["目录结构",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1}}],["目录和搜索",{"2":{"0":1}}],["目录",{"0":{"0":1,"51":1}}],["如果升级后出现异常",{"2":{"68":1}}],["如果准备长期保存会话元数据",{"2":{"67":1}}],["如果要撤销旧设备访问令牌",{"2":{"64":1}}],["如果本机还没有配置",{"2":{"33":1}}],["如果缓冲变化",{"2":{"32":1}}],["如果后台",{"2":{"4":1}}],["如果你使用了自定义状态目录",{"2":{"66":1}}],["如果你想切换状态目录",{"2":{"51":1}}],["如果你刚完成一套新部署",{"2":{"50":1}}],["如果你只想重新生成一个配对码",{"2":{"49":1}}],["如果你还没有跑通过最小链路",{"2":{"38":1}}],["如果你主要跑",{"2":{"6":1}}],["如果你平时主要跑",{"2":{"6":1}}],["如果你要跑任务",{"2":{"54":1}}],["如果你要前台看日志",{"2":{"3":1}}],["如果你要停掉它",{"2":{"3":1}}],["如果你在",{"2":{"0":1}}],["如果",{"2":{"0":1}}],["代码架构",{"2":{"0":1,"12":1,"14":1,"15":1,"69":1}}]],"serializationVersion":2}';export{t as default};
@@ -0,0 +1,9 @@
1
+ var Ot=Object.defineProperty;var At=(a,e,t)=>e in a?Ot(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Me=(a,e,t)=>At(a,typeof e!="symbol"?e+"":e,t);import{V as Ct,q as Be,ah as Mt,h as be,ai as nt,aj as Lt,ak as Dt,al as Pt,G as ce,d as zt,am as rt,p as he,an as Vt,ao as jt,s as $t,ap as Bt,v as Le,P as ve,O as xe,aq as Wt,ar as Kt,W as Jt,R as qt,$ as Ut,o as q,b as Ht,j as T,a0 as Gt,k as P,as as Qt,at as Yt,au as Zt,c as Q,n as st,e as _e,B as it,F as at,a as pe,t as me,av as Xt,aw as ot,ax as en,a5 as tn,aa as nn,ay as rn,_ as sn}from"./framework.BZohXCq9.js";import{u as an,c as on}from"./theme.D0_6rd9F.js";const ln={root:()=>Ct(()=>import("./@localSearchIndexroot.l5vdUGaZ.js"),[])};/*!
2
+ * tabbable 6.4.0
3
+ * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE
4
+ */var gt=["input:not([inert]):not([inert] *)","select:not([inert]):not([inert] *)","textarea:not([inert]):not([inert] *)","a[href]:not([inert]):not([inert] *)","button:not([inert]):not([inert] *)","[tabindex]:not(slot):not([inert]):not([inert] *)","audio[controls]:not([inert]):not([inert] *)","video[controls]:not([inert]):not([inert] *)",'[contenteditable]:not([contenteditable="false"]):not([inert]):not([inert] *)',"details>summary:first-of-type:not([inert]):not([inert] *)","details:not([inert]):not([inert] *)"],ke=gt.join(","),bt=typeof Element>"u",ae=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!bt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Fe=function(e,t){var n;t===void 0&&(t=!0);var r=e==null||(n=e.getAttribute)===null||n===void 0?void 0:n.call(e,"inert"),i=r===""||r==="true",s=i||t&&e&&(typeof e.closest=="function"?e.closest("[inert]"):Fe(e.parentNode));return s},cn=function(e){var t,n=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return n===""||n==="true"},yt=function(e,t,n){if(Fe(e))return[];var r=Array.prototype.slice.apply(e.querySelectorAll(ke));return t&&ae.call(e,ke)&&r.unshift(e),r=r.filter(n),r},Re=function(e,t,n){for(var r=[],i=Array.from(e);i.length;){var s=i.shift();if(!Fe(s,!1))if(s.tagName==="SLOT"){var o=s.assignedElements(),l=o.length?o:s.children,c=Re(l,!0,n);n.flatten?r.push.apply(r,c):r.push({scopeParent:s,candidates:c})}else{var h=ae.call(s,ke);h&&n.filter(s)&&(t||!e.includes(s))&&r.push(s);var m=s.shadowRoot||typeof n.getShadowRoot=="function"&&n.getShadowRoot(s),p=!Fe(m,!1)&&(!n.shadowRootFilter||n.shadowRootFilter(s));if(m&&p){var b=Re(m===!0?s.children:m.children,!0,n);n.flatten?r.push.apply(r,b):r.push({scopeParent:s,candidates:b})}else i.unshift.apply(i,s.children)}}return r},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},ie=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||cn(e))&&!wt(e)?0:e.tabIndex},un=function(e,t){var n=ie(e);return n<0&&t&&!wt(e)?0:n},dn=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},St=function(e){return e.tagName==="INPUT"},fn=function(e){return St(e)&&e.type==="hidden"},hn=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(n){return n.tagName==="SUMMARY"});return t},vn=function(e,t){for(var n=0;n<e.length;n++)if(e[n].checked&&e[n].form===t)return e[n]},pn=function(e){if(!e.name)return!0;var t=e.form||Ne(e),n=function(o){return t.querySelectorAll('input[type="radio"][name="'+o+'"]')},r;if(typeof window<"u"&&typeof window.CSS<"u"&&typeof window.CSS.escape=="function")r=n(window.CSS.escape(e.name));else try{r=n(e.name)}catch(s){return console.error("Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s",s.message),!1}var i=vn(r,e.form);return!i||i===e},mn=function(e){return St(e)&&e.type==="radio"},gn=function(e){return mn(e)&&!pn(e)},bn=function(e){var t,n=e&&Ne(e),r=(t=n)===null||t===void 0?void 0:t.host,i=!1;if(n&&n!==e){var s,o,l;for(i=!!((s=r)!==null&&s!==void 0&&(o=s.ownerDocument)!==null&&o!==void 0&&o.contains(r)||e!=null&&(l=e.ownerDocument)!==null&&l!==void 0&&l.contains(e));!i&&r;){var c,h,m;n=Ne(r),r=(c=n)===null||c===void 0?void 0:c.host,i=!!((h=r)!==null&&h!==void 0&&(m=h.ownerDocument)!==null&&m!==void 0&&m.contains(r))}}return i},lt=function(e){var t=e.getBoundingClientRect(),n=t.width,r=t.height;return n===0&&r===0},yn=function(e,t){var n=t.displayCheck,r=t.getShadowRoot;if(n==="full-native"&&"checkVisibility"in e){var i=e.checkVisibility({checkOpacity:!1,opacityProperty:!1,contentVisibilityAuto:!0,visibilityProperty:!0,checkVisibilityCSS:!0});return!i}if(getComputedStyle(e).visibility==="hidden")return!0;var s=ae.call(e,"details>summary:first-of-type"),o=s?e.parentElement:e;if(ae.call(o,"details:not([open]) *"))return!0;if(!n||n==="full"||n==="full-native"||n==="legacy-full"){if(typeof r=="function"){for(var l=e;e;){var c=e.parentElement,h=Ne(e);if(c&&!c.shadowRoot&&r(c)===!0)return lt(e);e.assignedSlot?e=e.assignedSlot:!c&&h!==e.ownerDocument?e=h.host:e=c}e=l}if(bn(e))return!e.getClientRects().length;if(n!=="legacy-full")return!0}else if(n==="non-zero-area")return lt(e);return!1},wn=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var n=0;n<t.children.length;n++){var r=t.children.item(n);if(r.tagName==="LEGEND")return ae.call(t,"fieldset[disabled] *")?!0:!r.contains(e)}return!0}t=t.parentElement}return!1},Oe=function(e,t){return!(t.disabled||fn(t)||yn(t,e)||hn(t)||wn(t))},We=function(e,t){return!(gn(t)||ie(t)<0||!Oe(e,t))},Sn=function(e){var t=parseInt(e.getAttribute("tabindex"),10);return!!(isNaN(t)||t>=0)},xt=function(e){var t=[],n=[];return e.forEach(function(r,i){var s=!!r.scopeParent,o=s?r.scopeParent:r,l=un(o,s),c=s?xt(r.candidates):o;l===0?s?t.push.apply(t,c):t.push(o):n.push({documentOrder:i,tabIndex:l,item:r,isScope:s,content:c})}),n.sort(dn).reduce(function(r,i){return i.isScope?r.push.apply(r,i.content):r.push(i.content),r},[]).concat(t)},xn=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:Sn}):n=yt(e,t.includeContainer,We.bind(null,t)),xt(n)},_n=function(e,t){t=t||{};var n;return t.getShadowRoot?n=Re([e],t.includeContainer,{filter:Oe.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):n=yt(e,t.includeContainer,Oe.bind(null,t)),n},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,ke)===!1?!1:We(t,e)},Tn=gt.concat("iframe:not([inert]):not([inert] *)").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Tn)===!1?!1:Oe(t,e)};/*!
5
+ * focus-trap 7.8.0
6
+ * @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE
7
+ */function Ke(a,e){(e==null||e>a.length)&&(e=a.length);for(var t=0,n=Array(e);t<e;t++)n[t]=a[t];return n}function En(a){if(Array.isArray(a))return Ke(a)}function ct(a,e){var t=typeof Symbol<"u"&&a[Symbol.iterator]||a["@@iterator"];if(!t){if(Array.isArray(a)||(t=_t(a))||e){t&&(a=t);var n=0,r=function(){};return{s:r,n:function(){return n>=a.length?{done:!0}:{done:!1,value:a[n++]}},e:function(l){throw l},f:r}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.
8
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var i,s=!0,o=!1;return{s:function(){t=t.call(a)},n:function(){var l=t.next();return s=l.done,l},e:function(l){o=!0,i=l},f:function(){try{s||t.return==null||t.return()}finally{if(o)throw i}}}}function In(a,e,t){return(e=On(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function kn(a){if(typeof Symbol<"u"&&a[Symbol.iterator]!=null||a["@@iterator"]!=null)return Array.from(a)}function Nn(){throw new TypeError(`Invalid attempt to spread non-iterable instance.
9
+ In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function ut(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(a);e&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(a,r).enumerable})),t.push.apply(t,n)}return t}function dt(a){for(var e=1;e<arguments.length;e++){var t=arguments[e]!=null?arguments[e]:{};e%2?ut(Object(t),!0).forEach(function(n){In(a,n,t[n])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(t)):ut(Object(t)).forEach(function(n){Object.defineProperty(a,n,Object.getOwnPropertyDescriptor(t,n))})}return a}function Fn(a){return En(a)||kn(a)||_t(a)||Nn()}function Rn(a,e){if(typeof a!="object"||!a)return a;var t=a[Symbol.toPrimitive];if(t!==void 0){var n=t.call(a,e);if(typeof n!="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(e==="string"?String:Number)(a)}function On(a){var e=Rn(a,"string");return typeof e=="symbol"?e:e+""}function _t(a,e){if(a){if(typeof a=="string")return Ke(a,e);var t={}.toString.call(a).slice(8,-1);return t==="Object"&&a.constructor&&(t=a.constructor.name),t==="Map"||t==="Set"?Array.from(a):t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?Ke(a,e):void 0}}var U={getActiveTrap:function(e){return(e==null?void 0:e.length)>0?e[e.length-1]:null},activateTrap:function(e,t){var n=U.getActiveTrap(e);t!==n&&U.pauseTrap(e);var r=e.indexOf(t);r===-1||e.splice(r,1),e.push(t)},deactivateTrap:function(e,t){var n=e.indexOf(t);n!==-1&&e.splice(n,1),U.unpauseTrap(e)},pauseTrap:function(e){var t=U.getActiveTrap(e);t==null||t._setPausedState(!0)},unpauseTrap:function(e){var t=U.getActiveTrap(e);t&&!t._isManuallyPaused()&&t._setPausedState(!1)}},An=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Cn=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},ye=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Mn=function(e){return ye(e)&&!e.shiftKey},Ln=function(e){return ye(e)&&e.shiftKey},ft=function(e){return setTimeout(e,0)},ge=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return typeof e=="function"?e.apply(void 0,n):e},Te=function(e){return e.target.shadowRoot&&typeof e.composedPath=="function"?e.composedPath()[0]:e.target},Dn=[],Pn=function(e,t){var n=(t==null?void 0:t.document)||document,r=(t==null?void 0:t.trapStack)||Dn,i=dt({returnFocusOnDeactivate:!0,escapeDeactivates:!0,delayInitialFocus:!0,isolateSubtrees:!1,isKeyForward:Mn,isKeyBackward:Ln},t),s={containers:[],containerGroups:[],tabbableGroups:[],adjacentElements:new Set,alreadySilent:new Set,nodeFocusedBeforeActivation:null,mostRecentlyFocusedNode:null,active:!1,paused:!1,manuallyPaused:!1,delayInitialFocusTimer:void 0,recentNavEvent:void 0},o,l=function(u,f,g){return u&&u[f]!==void 0?u[f]:i[g||f]},c=function(u,f){var g=typeof(f==null?void 0:f.composedPath)=="function"?f.composedPath():void 0;return s.containerGroups.findIndex(function(E){var _=E.container,I=E.tabbableNodes;return _.contains(u)||(g==null?void 0:g.includes(_))||I.find(function(S){return S===u})})},h=function(u){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},g=f.hasFallback,E=g===void 0?!1:g,_=f.params,I=_===void 0?[]:_,S=i[u];if(typeof S=="function"&&(S=S.apply(void 0,Fn(I))),S===!0&&(S=void 0),!S){if(S===void 0||S===!1)return S;throw new Error("`".concat(u,"` was specified but was not a node, or did not return a node"))}var v=S;if(typeof S=="string"){try{v=n.querySelector(S)}catch(d){throw new Error("`".concat(u,'` appears to be an invalid selector; error="').concat(d.message,'"'))}if(!v&&!E)throw new Error("`".concat(u,"` as selector refers to no known node"))}return v},m=function(){var u=h("initialFocus",{hasFallback:!0});if(u===!1)return!1;if(u===void 0||u&&!De(u,i.tabbableOptions))if(c(n.activeElement)>=0)u=n.activeElement;else{var f=s.tabbableGroups[0],g=f&&f.firstTabbableNode;u=g||h("fallbackFocus")}else u===null&&(u=h("fallbackFocus"));if(!u)throw new Error("Your focus-trap needs to have at least one focusable element");return u},p=function(){if(s.containerGroups=s.containers.map(function(u){var f=xn(u,i.tabbableOptions),g=_n(u,i.tabbableOptions),E=f.length>0?f[0]:void 0,_=f.length>0?f[f.length-1]:void 0,I=g.find(function(d){return oe(d)}),S=g.slice().reverse().find(function(d){return oe(d)}),v=!!f.find(function(d){return ie(d)>0});return{container:u,tabbableNodes:f,focusableNodes:g,posTabIndexesFound:v,firstTabbableNode:E,lastTabbableNode:_,firstDomTabbableNode:I,lastDomTabbableNode:S,nextTabbableNode:function(x){var R=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,A=f.indexOf(x);return A<0?R?g.slice(g.indexOf(x)+1).find(function(C){return oe(C)}):g.slice(0,g.indexOf(x)).reverse().find(function(C){return oe(C)}):f[A+(R?1:-1)]}}}),s.tabbableGroups=s.containerGroups.filter(function(u){return u.tabbableNodes.length>0}),s.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(s.containerGroups.find(function(u){return u.posTabIndexesFound})&&s.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(u){var f=u.activeElement;if(f)return f.shadowRoot&&f.shadowRoot.activeElement!==null?b(f.shadowRoot):f},w=function(u){if(u!==!1&&u!==b(document)){if(!u||!u.focus){w(m());return}u.focus({preventScroll:!!i.preventScroll}),s.mostRecentlyFocusedNode=u,An(u)&&u.select()}},k=function(u){var f=h("setReturnFocus",{params:[u]});return f||(f===!1?!1:u)},y=function(u){var f=u.target,g=u.event,E=u.isBackward,_=E===void 0?!1:E;f=f||Te(g),p();var I=null;if(s.tabbableGroups.length>0){var S=c(f,g),v=S>=0?s.containerGroups[S]:void 0;if(S<0)_?I=s.tabbableGroups[s.tabbableGroups.length-1].lastTabbableNode:I=s.tabbableGroups[0].firstTabbableNode;else if(_){var d=s.tabbableGroups.findIndex(function(F){var V=F.firstTabbableNode;return f===V});if(d<0&&(v.container===f||De(f,i.tabbableOptions)&&!oe(f,i.tabbableOptions)&&!v.nextTabbableNode(f,!1))&&(d=S),d>=0){var x=d===0?s.tabbableGroups.length-1:d-1,R=s.tabbableGroups[x];I=ie(f)>=0?R.lastTabbableNode:R.lastDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f,!1))}else{var A=s.tabbableGroups.findIndex(function(F){var V=F.lastTabbableNode;return f===V});if(A<0&&(v.container===f||De(f,i.tabbableOptions)&&!oe(f,i.tabbableOptions)&&!v.nextTabbableNode(f))&&(A=S),A>=0){var C=A===s.tabbableGroups.length-1?0:A+1,D=s.tabbableGroups[C];I=ie(f)>=0?D.firstTabbableNode:D.firstDomTabbableNode}else ye(g)||(I=v.nextTabbableNode(f))}}else I=h("fallbackFocus");return I},O=function(u){var f=Te(u);if(!(c(f,u)>=0)){if(ge(i.clickOutsideDeactivates,u)){o.deactivate({returnFocus:i.returnFocusOnDeactivate});return}ge(i.allowOutsideClick,u)||u.preventDefault()}},L=function(u){var f=Te(u),g=c(f,u)>=0;if(g||f instanceof Document)g&&(s.mostRecentlyFocusedNode=f);else{u.stopImmediatePropagation();var E,_=!0;if(s.mostRecentlyFocusedNode)if(ie(s.mostRecentlyFocusedNode)>0){var I=c(s.mostRecentlyFocusedNode),S=s.containerGroups[I].tabbableNodes;if(S.length>0){var v=S.findIndex(function(d){return d===s.mostRecentlyFocusedNode});v>=0&&(i.isKeyForward(s.recentNavEvent)?v+1<S.length&&(E=S[v+1],_=!1):v-1>=0&&(E=S[v-1],_=!1))}}else s.containerGroups.some(function(d){return d.tabbableNodes.some(function(x){return ie(x)>0})})||(_=!1);else _=!1;_&&(E=y({target:s.mostRecentlyFocusedNode,isBackward:i.isKeyBackward(s.recentNavEvent)})),w(E||s.mostRecentlyFocusedNode||m())}s.recentNavEvent=void 0},K=function(u){var f=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;s.recentNavEvent=u;var g=y({event:u,isBackward:f});g&&(ye(u)&&u.preventDefault(),w(g))},H=function(u){(i.isKeyForward(u)||i.isKeyBackward(u))&&K(u,i.isKeyBackward(u))},W=function(u){Cn(u)&&ge(i.escapeDeactivates,u)!==!1&&(u.preventDefault(),o.deactivate())},j=function(u){var f=Te(u);c(f,u)>=0||ge(i.clickOutsideDeactivates,u)||ge(i.allowOutsideClick,u)||(u.preventDefault(),u.stopImmediatePropagation())},$=function(){if(s.active)return U.activateTrap(r,o),s.delayInitialFocusTimer=i.delayInitialFocus?ft(function(){w(m())}):w(m()),n.addEventListener("focusin",L,!0),n.addEventListener("mousedown",O,{capture:!0,passive:!1}),n.addEventListener("touchstart",O,{capture:!0,passive:!1}),n.addEventListener("click",j,{capture:!0,passive:!1}),n.addEventListener("keydown",H,{capture:!0,passive:!1}),n.addEventListener("keydown",W),o},Ce=function(u){s.active&&!s.paused&&o._setSubtreeIsolation(!1),s.adjacentElements.clear(),s.alreadySilent.clear();var f=new Set,g=new Set,E=ct(u),_;try{for(E.s();!(_=E.n()).done;){var I=_.value;f.add(I);for(var S=typeof ShadowRoot<"u"&&I.getRootNode()instanceof ShadowRoot,v=I;v;){f.add(v);var d=v.parentElement,x=[];d?x=d.children:!d&&S&&(x=v.getRootNode().children,d=v.getRootNode().host,S=typeof ShadowRoot<"u"&&d.getRootNode()instanceof ShadowRoot);var R=ct(x),A;try{for(R.s();!(A=R.n()).done;){var C=A.value;g.add(C)}}catch(D){R.e(D)}finally{R.f()}v=d}}}catch(D){E.e(D)}finally{E.f()}f.forEach(function(D){g.delete(D)}),s.adjacentElements=g},M=function(){if(s.active)return n.removeEventListener("focusin",L,!0),n.removeEventListener("mousedown",O,!0),n.removeEventListener("touchstart",O,!0),n.removeEventListener("click",j,!0),n.removeEventListener("keydown",H,!0),n.removeEventListener("keydown",W),o},Z=function(u){var f=u.some(function(g){var E=Array.from(g.removedNodes);return E.some(function(_){return _===s.mostRecentlyFocusedNode})});f&&w(m())},X=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(Z):void 0,ee=function(){X&&(X.disconnect(),s.active&&!s.paused&&s.containers.map(function(u){X.observe(u,{subtree:!0,childList:!0})}))};return o={get active(){return s.active},get paused(){return s.paused},activate:function(u){if(s.active)return this;var f=l(u,"onActivate"),g=l(u,"onPostActivate"),E=l(u,"checkCanFocusTrap"),_=U.getActiveTrap(r),I=!1;if(_&&!_.paused){var S;(S=_._setSubtreeIsolation)===null||S===void 0||S.call(_,!1),I=!0}try{E||p(),s.active=!0,s.paused=!1,s.nodeFocusedBeforeActivation=b(n),f==null||f();var v=function(){E&&p(),$(),ee(),i.isolateSubtrees&&o._setSubtreeIsolation(!0),g==null||g()};if(E)return E(s.containers.concat()).then(v,v),this;v()}catch(x){if(_===U.getActiveTrap(r)&&I){var d;(d=_._setSubtreeIsolation)===null||d===void 0||d.call(_,!0)}throw x}return this},deactivate:function(u){if(!s.active)return this;var f=dt({onDeactivate:i.onDeactivate,onPostDeactivate:i.onPostDeactivate,checkCanReturnFocus:i.checkCanReturnFocus},u);clearTimeout(s.delayInitialFocusTimer),s.delayInitialFocusTimer=void 0,s.paused||o._setSubtreeIsolation(!1),s.alreadySilent.clear(),M(),s.active=!1,s.paused=!1,ee(),U.deactivateTrap(r,o);var g=l(f,"onDeactivate"),E=l(f,"onPostDeactivate"),_=l(f,"checkCanReturnFocus"),I=l(f,"returnFocus","returnFocusOnDeactivate");g==null||g();var S=function(){ft(function(){I&&w(k(s.nodeFocusedBeforeActivation)),E==null||E()})};return I&&_?(_(k(s.nodeFocusedBeforeActivation)).then(S,S),this):(S(),this)},pause:function(u){return s.active?(s.manuallyPaused=!0,this._setPausedState(!0,u)):this},unpause:function(u){return s.active?(s.manuallyPaused=!1,r[r.length-1]!==this?this:this._setPausedState(!1,u)):this},updateContainerElements:function(u){var f=[].concat(u).filter(Boolean);return s.containers=f.map(function(g){return typeof g=="string"?n.querySelector(g):g}),i.isolateSubtrees&&Ce(s.containers),s.active&&(p(),i.isolateSubtrees&&!s.paused&&o._setSubtreeIsolation(!0)),ee(),this}},Object.defineProperties(o,{_isManuallyPaused:{value:function(){return s.manuallyPaused}},_setPausedState:{value:function(u,f){if(s.paused===u)return this;if(s.paused=u,u){var g=l(f,"onPause"),E=l(f,"onPostPause");g==null||g(),M(),ee(),o._setSubtreeIsolation(!1),E==null||E()}else{var _=l(f,"onUnpause"),I=l(f,"onPostUnpause");_==null||_(),o._setSubtreeIsolation(!0),p(),$(),ee(),I==null||I()}return this}},_setSubtreeIsolation:{value:function(u){i.isolateSubtrees&&s.adjacentElements.forEach(function(f){var g;if(u)switch(i.isolateSubtrees){case"aria-hidden":(f.ariaHidden==="true"||((g=f.getAttribute("aria-hidden"))===null||g===void 0?void 0:g.toLowerCase())==="true")&&s.alreadySilent.add(f),f.setAttribute("aria-hidden","true");break;default:(f.inert||f.hasAttribute("inert"))&&s.alreadySilent.add(f),f.setAttribute("inert",!0);break}else if(!s.alreadySilent.has(f))switch(i.isolateSubtrees){case"aria-hidden":f.removeAttribute("aria-hidden");break;default:f.removeAttribute("inert");break}})}}}),o.updateContainerElements(e),o};function zn(a,e={}){let t;const{immediate:n,...r}=e,i=ce(!1),s=ce(!1),o=p=>t&&t.activate(p),l=p=>t&&t.deactivate(p),c=()=>{t&&(t.pause(),s.value=!0)},h=()=>{t&&(t.unpause(),s.value=!1)},m=be(()=>{const p=nt(a);return Lt(p).map(b=>{const w=nt(b);return typeof w=="string"?w:Dt(w)}).filter(Pt)});return Be(m,p=>{p.length&&(t=Pn(p,{...r,onActivate(){i.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){i.value=!1,e.onDeactivate&&e.onDeactivate()}}),n&&o())},{flush:"post"}),Mt(()=>l()),{hasFocus:i,isPaused:s,activate:o,deactivate:l,pause:c,unpause:h}}class ue{constructor(e,t=!0,n=[],r=5e3){this.ctx=e,this.iframes=t,this.exclude=n,this.iframesTimeout=r}static matches(e,t){const n=typeof t=="string"?[t]:t,r=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(r){let i=!1;return n.every(s=>r.call(e,s)?(i=!0,!1):!0),i}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(n=>{const r=t.filter(i=>i.contains(n)).length>0;t.indexOf(n)===-1&&!r&&t.push(n)}),t}getIframeContents(e,t,n=()=>{}){let r;try{const i=e.contentWindow;if(r=i.document,!i||!r)throw new Error("iframe inaccessible")}catch{n()}r&&t(r)}isIframeBlank(e){const t="about:blank",n=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&n!==t&&n}observeIframeLoad(e,t,n){let r=!1,i=null;const s=()=>{if(!r){r=!0,clearTimeout(i);try{this.isIframeBlank(e)||(e.removeEventListener("load",s),this.getIframeContents(e,t,n))}catch{n()}}};e.addEventListener("load",s),i=setTimeout(s,this.iframesTimeout)}onIframeReady(e,t,n){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,n):this.getIframeContents(e,t,n):this.observeIframeLoad(e,t,n)}catch{n()}}waitForIframes(e,t){let n=0;this.forEachIframe(e,()=>!0,r=>{n++,this.waitForIframes(r.querySelector("html"),()=>{--n||t()})},r=>{r||t()})}forEachIframe(e,t,n,r=()=>{}){let i=e.querySelectorAll("iframe"),s=i.length,o=0;i=Array.prototype.slice.call(i);const l=()=>{--s<=0&&r(o)};s||l(),i.forEach(c=>{ue.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,n(h)),l()},l)})}createIterator(e,t,n){return document.createNodeIterator(e,t,n,!1)}createInstanceOnIframe(e){return new ue(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,n){const r=e.compareDocumentPosition(n),i=Node.DOCUMENT_POSITION_PRECEDING;if(r&i)if(t!==null){const s=t.compareDocumentPosition(n),o=Node.DOCUMENT_POSITION_FOLLOWING;if(s&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let n;return t===null?n=e.nextNode():n=e.nextNode()&&e.nextNode(),{prevNode:t,node:n}}checkIframeFilter(e,t,n,r){let i=!1,s=!1;return r.forEach((o,l)=>{o.val===n&&(i=l,s=o.handled)}),this.compareNodeIframe(e,t,n)?(i===!1&&!s?r.push({val:n,handled:!0}):i!==!1&&!s&&(r[i].handled=!0),!0):(i===!1&&r.push({val:n,handled:!1}),!1)}handleOpenIframes(e,t,n,r){e.forEach(i=>{i.handled||this.getIframeContents(i.val,s=>{this.createInstanceOnIframe(s).forEachNode(t,n,r)})})}iterateThroughNodes(e,t,n,r,i){const s=this.createIterator(t,e,r);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(s),c);for(;m();)this.iframes&&this.forEachIframe(t,p=>this.checkIframeFilter(c,h,p,o),p=>{this.createInstanceOnIframe(p).forEachNode(e,b=>l.push(b),r)}),l.push(c);l.forEach(p=>{n(p)}),this.iframes&&this.handleOpenIframes(o,e,n,r),i()}forEachNode(e,t,n,r=()=>{}){const i=this.getContexts();let s=i.length;s||r(),i.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,n,()=>{--s<=0&&r()})};this.iframes?this.waitForIframes(o,l):l()})}}let Vn=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ue(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const n=this.opt.log;this.opt.debug&&typeof n=="object"&&typeof n[t]=="function"&&n[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,n=this.opt.caseSensitive?"":"i",r=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let i in t)if(t.hasOwnProperty(i)){const s=t[i],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(s):this.escapeStr(s);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${n}`),r+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+r))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,n,r)=>{let i=r.charAt(n+1);return/[(|)\\]/.test(i)||i===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const n=this.opt.ignorePunctuation;return Array.isArray(n)&&n.length&&t.push(this.escapeStr(n.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",n=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let r=[];return e.split("").forEach(i=>{n.every(s=>{if(s.indexOf(i)!==-1){if(r.indexOf(s)>-1)return!1;e=e.replace(new RegExp(`[${s}]`,`gm${t}`),`[${s}]`),r.push(s)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let n=this.opt.accuracy,r=typeof n=="string"?n:n.value,i=typeof n=="string"?[]:n.limiters,s="";switch(i.forEach(o=>{s+=`|${this.escapeStr(o)}`}),r){case"partially":default:return`()(${e})`;case"complementary":return s="\\s"+(s||this.escapeStr(t)),`()([^${s}]*${e}[^${s}]*)`;case"exactly":return`(^|\\s${s})(${e})(?=$|\\s${s})`}}getSeparatedKeywords(e){let t=[];return e.forEach(n=>{this.opt.separateWordSearch?n.split(" ").forEach(r=>{r.trim()&&t.indexOf(r)===-1&&t.push(r)}):n.trim()&&t.indexOf(n)===-1&&t.push(n)}),{keywords:t.sort((n,r)=>r.length-n.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let n=0;return e.sort((r,i)=>r.start-i.start).forEach(r=>{let{start:i,end:s,valid:o}=this.callNoMatchOnInvalidRanges(r,n);o&&(r.start=i,r.length=s-i,t.push(r),n=s)}),t}callNoMatchOnInvalidRanges(e,t){let n,r,i=!1;return e&&typeof e.start<"u"?(n=parseInt(e.start,10),r=n+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&r-t>0&&r-n>0?i=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:n,end:r,valid:i}}checkWhitespaceRanges(e,t,n){let r,i=!0,s=n.length,o=t-s,l=parseInt(e.start,10)-o;return l=l>s?s:l,r=l+parseInt(e.length,10),r>s&&(r=s,this.log(`End range automatically set to the max value of ${s}`)),l<0||r-l<0||l>s||r>s?(i=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):n.substring(l,r).replace(/\s+/g,"")===""&&(i=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:r,valid:i}}getTextNodes(e){let t="",n=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,r=>{n.push({start:t.length,end:(t+=r.textContent).length,node:r})},r=>this.matchesExclude(r.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:n})})}matchesExclude(e){return ue.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,n){const r=this.opt.element?this.opt.element:"mark",i=e.splitText(t),s=i.splitText(n-t);let o=document.createElement(r);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=i.textContent,i.parentNode.replaceChild(o,i),s}wrapRangeInMappedTextNode(e,t,n,r,i){e.nodes.every((s,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!r(s.node))return!1;const c=t-s.start,h=(n>s.end?s.end:n)-s.start,m=e.value.substr(0,s.start),p=e.value.substr(h+s.start);if(s.node=this.wrapRangeInTextNode(s.node,c,h),e.value=m+p,e.nodes.forEach((b,w)=>{w>=o&&(e.nodes[w].start>0&&w!==o&&(e.nodes[w].start-=h),e.nodes[w].end-=h)}),n-=h,i(s.node.previousSibling,s.start),n>s.end)t=s.end;else return!1}return!0})}wrapMatches(e,t,n,r,i){const s=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[s]!=="";){if(!n(c[s],l))continue;let h=c.index;if(s!==0)for(let m=1;m<s;m++)h+=c[m].length;l=this.wrapRangeInTextNode(l,h,h+c[s].length),r(l.previousSibling),e.lastIndex=0}}),i()})}wrapMatchesAcrossElements(e,t,n,r,i){const s=t===0?0:t+1;this.getTextNodes(o=>{let l;for(;(l=e.exec(o.value))!==null&&l[s]!=="";){let c=l.index;if(s!==0)for(let m=1;m<s;m++)c+=l[m].length;const h=c+l[s].length;this.wrapRangeInMappedTextNode(o,c,h,m=>n(l[s],m),(m,p)=>{e.lastIndex=p,r(m)})}i()})}wrapRangeFromIndex(e,t,n,r){this.getTextNodes(i=>{const s=i.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,s,i.value);m&&this.wrapRangeInMappedTextNode(i,c,h,p=>t(p,o,i.value.substring(c,h),l),p=>{n(p,o)})}),r()})}unwrapMatches(e){const t=e.parentNode;let n=document.createDocumentFragment();for(;e.firstChild;)n.appendChild(e.removeChild(e.firstChild));t.replaceChild(n,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let n=0,r="wrapMatches";const i=s=>{n++,this.opt.each(s)};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),this[r](e,this.opt.ignoreGroups,(s,o)=>this.opt.filter(o,s,n),i,()=>{n===0&&this.opt.noMatch(e),this.opt.done(n)})}mark(e,t){this.opt=t;let n=0,r="wrapMatches";const{keywords:i,length:s}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[r](h,1,(p,b)=>this.opt.filter(b,c,n,m),p=>{m++,n++,this.opt.each(p)},()=>{m===0&&this.opt.noMatch(c),i[s-1]===c?this.opt.done(n):l(i[i.indexOf(c)+1])})};this.opt.acrossElements&&(r="wrapMatchesAcrossElements"),s===0?this.opt.done(n):l(i[0])}markRanges(e,t){this.opt=t;let n=0,r=this.checkRanges(e);r&&r.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(r)),this.wrapRangeFromIndex(r,(i,s,o,l)=>this.opt.filter(i,s,o,l),(i,s)=>{n++,this.opt.each(i,s)},()=>{this.opt.done(n)})):this.opt.done(n)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,n=>{this.unwrapMatches(n)},n=>{const r=ue.matches(n,t),i=this.matchesExclude(n);return!r||i?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function jn(a){const e=new Vn(a);return this.mark=(t,n)=>(e.mark(t,n),this),this.markRegExp=(t,n)=>(e.markRegExp(t,n),this),this.markRanges=(t,n)=>(e.markRanges(t,n),this),this.unmark=t=>(e.unmark(t),this),this}const $n="ENTRIES",Tt="KEYS",Et="VALUES",z="";class Pe{constructor(e,t){const n=e._tree,r=Array.from(n.keys());this.set=e,this._type=t,this._path=r.length>0?[{node:n,keys:r}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===z)return{done:!1,value:this.result()};const n=e.get(le(t));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==z).join("")}value(){return le(this._path).node.get(z)}result(){switch(this._type){case Et:return this.value();case Tt:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Bn=(a,e,t)=>{const n=new Map;if(e===void 0)return n;const r=e.length+1,i=r+t,s=new Uint8Array(i*r).fill(t+1);for(let o=0;o<r;++o)s[o]=o;for(let o=1;o<i;++o)s[o*r]=o;return It(a,e,t,n,s,1,r,""),n},It=(a,e,t,n,r,i,s,o)=>{const l=i*s;e:for(const c of a.keys())if(c===z){const h=r[l-1];h<=t&&n.set(o,[a.get(c),h])}else{let h=i;for(let m=0;m<c.length;++m,++h){const p=c[m],b=s*h,w=b-s;let k=r[b];const y=Math.max(0,h-t-1),O=Math.min(s-1,h+t);for(let L=y;L<O;++L){const K=p!==e[L],H=r[w+L]+ +K,W=r[w+L+1]+1,j=r[b+L]+1,$=r[b+L+1]=Math.min(H,W,j);$<k&&(k=$)}if(k>t)continue e}It(a.get(c),e,t,n,r,h,s,o+c)}};class Y{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,n]=Ae(this._tree,e.slice(this._prefix.length));if(t===void 0){const[r,i]=He(n);for(const s of r.keys())if(s!==z&&s.startsWith(i)){const o=new Map;return o.set(s.slice(i.length),r.get(s)),new Y(o,e)}}return new Y(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Wn(this._tree,e)}entries(){return new Pe(this,$n)}forEach(e){for(const[t,n]of this)e(t,n,this)}fuzzyGet(e,t){return Bn(this._tree,e,t)}get(e){const t=Je(this._tree,e);return t!==void 0?t.get(z):void 0}has(e){const t=Je(this._tree,e);return t!==void 0&&t.has(z)}keys(){return new Pe(this,Tt)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(z,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);return n.set(z,t(n.get(z))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const n=ze(this._tree,e);let r=n.get(z);return r===void 0&&n.set(z,r=t()),r}values(){return new Pe(this,Et)}[Symbol.iterator](){return this.entries()}static from(e){const t=new Y;for(const[n,r]of e)t.set(n,r);return t}static fromObject(e){return Y.from(Object.entries(e))}}const Ae=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const n of a.keys())if(n!==z&&e.startsWith(n))return t.push([a,n]),Ae(a.get(n),e.slice(n.length),t);return t.push([a,e]),Ae(void 0,"",t)},Je=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==z&&e.startsWith(t))return Je(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let n=0;a&&n<t;){for(const i of a.keys())if(i!==z&&e[n]===i[0]){const s=Math.min(t-n,i.length);let o=1;for(;o<s&&e[n+o]===i[o];)++o;const l=a.get(i);if(o===i.length)a=l;else{const c=new Map;c.set(i.slice(o),l),a.set(e.slice(n,n+o),c),a.delete(i),a=c}n+=o;continue e}const r=new Map;return a.set(e.slice(n),r),r}return a},Wn=(a,e)=>{const[t,n]=Ae(a,e);if(t!==void 0){if(t.delete(z),t.size===0)kt(n);else if(t.size===1){const[r,i]=t.entries().next().value;Nt(n,r,i)}}},kt=a=>{if(a.length===0)return;const[e,t]=He(a);if(e.delete(t),e.size===0)kt(a.slice(0,-1));else if(e.size===1){const[n,r]=e.entries().next().value;n!==z&&Nt(a.slice(0,-1),n,r)}},Nt=(a,e,t)=>{if(a.length===0)return;const[n,r]=He(a);n.set(r+e,t),n.delete(r)},He=a=>a[a.length-1],Ge="or",Ft="and",Kn="and_not";class de{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?$e:e.autoVacuum;this._options={...je,...e,autoVacuum:t,searchOptions:{...ht,...e.searchOptions||{}},autoSuggestOptions:{...Gn,...e.autoSuggestOptions||{}}},this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,stringifyField:n,tokenize:r,processTerm:i,fields:s,idField:o}=this._options,l=t(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);if(this._idToShortId.has(l))throw new Error(`MiniSearch: duplicate ID ${l}`);const c=this.addDocumentId(l);this.saveStoredFields(c,e);for(const h of s){const m=t(e,h);if(m==null)continue;const p=r(n(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.addFieldLength(c,b,this._documentCount-1,w);for(const k of p){const y=i(k,h);if(Array.isArray(y))for(const O of y)this.addTerm(b,c,O);else y&&this.addTerm(b,c,y)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:n=10}=t,r={chunk:[],promise:Promise.resolve()},{chunk:i,promise:s}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%n===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),r);return s.then(()=>this.addAll(i))}remove(e){const{tokenize:t,processTerm:n,extractField:r,stringifyField:i,fields:s,idField:o}=this._options,l=r(e,o);if(l==null)throw new Error(`MiniSearch: document does not have ID field "${o}"`);const c=this._idToShortId.get(l);if(c==null)throw new Error(`MiniSearch: cannot remove document with ID ${l}: it is not in the index`);for(const h of s){const m=r(e,h);if(m==null)continue;const p=t(i(m,h),h),b=this._fieldIds[h],w=new Set(p).size;this.removeFieldLength(c,b,this._documentCount,w);for(const k of p){const y=n(k,h);if(Array.isArray(y))for(const O of y)this.removeTerm(b,c,O);else y&&this.removeTerm(b,c,y)}}this._storedFields.delete(c),this._documentIds.delete(c),this._idToShortId.delete(l),this._fieldLength.delete(c),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Y,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((n,r)=>{this.removeFieldLength(t,r,this._documentCount,n)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:n,batchWait:r}=this._options.autoVacuum;this.conditionalVacuum({batchSize:n,batchWait:r},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const n of e)this.discard(n)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:n}=this._options,r=n(e,t);this.discard(r),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const n=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}async performVacuuming(e,t){const n=this._dirtCount;if(this.vacuumConditionsMet(t)){const r=e.batchSize||qe.batchSize,i=e.batchWait||qe.batchWait;let s=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),s%r===0&&await new Promise(c=>setTimeout(c,i)),s+=1}this._dirtCount-=n}await null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:n}=e;return t=t||$e.minDirtCount,n=n||$e.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=n}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const{searchOptions:n}=this._options,r={...n,...t},i=this.executeQuery(e,t),s=[];for(const[o,{score:l,terms:c,match:h}]of i){const m=c.length||1,p={id:this._documentIds.get(o),score:l*m,terms:Object.keys(h),queryTerms:c,match:h};Object.assign(p,this._storedFields.get(o)),(r.filter==null||r.filter(p))&&s.push(p)}return e===de.wildcard&&r.boostDocument==null||s.sort(pt),s}autoSuggest(e,t={}){t={...this._options.autoSuggestOptions,...t};const n=new Map;for(const{score:i,terms:s}of this.search(e,t)){const o=s.join(" "),l=n.get(o);l!=null?(l.score+=i,l.count+=1):n.set(o,{score:i,terms:s,count:1})}const r=[];for(const[i,{score:s,terms:o,count:l}]of n)r.push({suggestion:i,terms:o,score:s/l});return r.sort(pt),r}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static async loadJSONAsync(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)}static getDefault(e){if(je.hasOwnProperty(e))return Ve(je,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:n,documentIds:r,fieldLength:i,storedFields:s,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ee(r),l._fieldLength=Ee(i),l._storedFields=Ee(s);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of n){const m=new Map;for(const p of Object.keys(h)){let b=h[p];o===1&&(b=b.ds),m.set(parseInt(p,10),Ee(b))}l._index.set(c,m)}return l}static async loadJSAsync(e,t){const{index:n,documentIds:r,fieldLength:i,storedFields:s,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=await Ie(r),l._fieldLength=await Ie(i),l._storedFields=await Ie(s);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of n){const p=new Map;for(const b of Object.keys(m)){let w=m[b];o===1&&(w=w.ds),p.set(parseInt(b,10),await Ie(w))}++c%1e3===0&&await Rt(0),l._index.set(h,p)}return l}static instantiateMiniSearch(e,t){const{documentCount:n,nextId:r,fieldIds:i,averageFieldLength:s,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new de(t);return c._documentCount=n,c._nextId=r,c._idToShortId=new Map,c._fieldIds=i,c._avgFieldLength=s,c._dirtCount=o||0,c._index=new Y,c}executeQuery(e,t={}){if(e===de.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const p={...t,...e,queries:void 0},b=e.queries.map(w=>this.executeQuery(w,p));return this.combineResults(b,p.combineWith)}const{tokenize:n,processTerm:r,searchOptions:i}=this._options,s={tokenize:n,processTerm:r,...i,...t},{tokenize:o,processTerm:l}=s,m=o(e).flatMap(p=>l(p)).filter(p=>!!p).map(Hn(s)).map(p=>this.executeQuerySpec(p,s));return this.combineResults(m,s.combineWith)}executeQuerySpec(e,t){const n={...this._options.searchOptions,...t},r=(n.fields||this._options.fields).reduce((k,y)=>({...k,[y]:Ve(n.boost,y)||1}),{}),{boostDocument:i,weights:s,maxFuzzy:o,bm25:l}=n,{fuzzy:c,prefix:h}={...ht.weights,...s},m=this._index.get(e.term),p=this.termResults(e.term,e.term,1,e.termBoost,m,r,i,l);let b,w;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const k=e.fuzzy===!0?.2:e.fuzzy,y=k<1?Math.min(o,Math.round(e.term.length*k)):k;y&&(w=this._index.fuzzyGet(e.term,y))}if(b)for(const[k,y]of b){const O=k.length-e.term.length;if(!O)continue;w==null||w.delete(k);const L=h*k.length/(k.length+.3*O);this.termResults(e.term,k,L,e.termBoost,y,r,i,l,p)}if(w)for(const k of w.keys()){const[y,O]=w.get(k);if(!O)continue;const L=c*k.length/(k.length+O);this.termResults(e.term,k,L,e.termBoost,y,r,i,l,p)}return p}executeWildcardQuery(e){const t=new Map,n={...this._options.searchOptions,...e};for(const[r,i]of this._documentIds){const s=n.boostDocument?n.boostDocument(i,"",this._storedFields.get(r)):1;t.set(r,{score:s,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const n=t.toLowerCase(),r=Jn[n];if(!r)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(r)||new Map}toJSON(){const e=[];for(const[t,n]of this._index){const r={};for(const[i,s]of n)r[i]=Object.fromEntries(s);e.push([t,r])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,n,r,i,s,o,l,c=new Map){if(i==null)return c;for(const h of Object.keys(s)){const m=s[h],p=this._fieldIds[h],b=i.get(p);if(b==null)continue;let w=b.size;const k=this._avgFieldLength[p];for(const y of b.keys()){if(!this._documentIds.has(y)){this.removeTerm(p,y,t),w-=1;continue}const O=o?o(this._documentIds.get(y),t,this._storedFields.get(y)):1;if(!O)continue;const L=b.get(y),K=this._fieldLength.get(y)[p],H=Un(L,w,this._documentCount,K,k,l),W=n*r*m*O*H,j=c.get(y);if(j){j.score+=W,Qn(j.terms,e);const $=Ve(j.match,t);$?$.push(h):j.match[t]=[h]}else c.set(y,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,n){const r=this._index.fetch(n,mt);let i=r.get(e);if(i==null)i=new Map,i.set(t,1),r.set(e,i);else{const s=i.get(t);i.set(t,(s||0)+1)}}removeTerm(e,t,n){if(!this._index.has(n)){this.warnDocumentChanged(t,e,n);return}const r=this._index.fetch(n,mt),i=r.get(e);i==null||i.get(t)==null?this.warnDocumentChanged(t,e,n):i.get(t)<=1?i.size<=1?r.delete(e):i.delete(t):i.set(t,i.get(t)-1),this._index.get(n).size===0&&this._index.delete(n)}warnDocumentChanged(e,t,n){for(const r of Object.keys(this._fieldIds))if(this._fieldIds[r]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${n}" was not present in field "${r}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;t<e.length;t++)this._fieldIds[e[t]]=t}addFieldLength(e,t,n,r){let i=this._fieldLength.get(e);i==null&&this._fieldLength.set(e,i=[]),i[t]=r;const o=(this._avgFieldLength[t]||0)*n+r;this._avgFieldLength[t]=o/(n+1)}removeFieldLength(e,t,n,r){if(n===1){this._avgFieldLength[t]=0;return}const i=this._avgFieldLength[t]*n-r;this._avgFieldLength[t]=i/(n-1)}saveStoredFields(e,t){const{storeFields:n,extractField:r}=this._options;if(n==null||n.length===0)return;let i=this._storedFields.get(e);i==null&&this._storedFields.set(e,i={});for(const s of n){const o=r(t,s);o!==void 0&&(i[s]=o)}}}de.wildcard=Symbol("*");const Ve=(a,e)=>Object.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,Jn={[Ge]:(a,e)=>{for(const t of e.keys()){const n=a.get(t);if(n==null)a.set(t,e.get(t));else{const{score:r,terms:i,match:s}=e.get(t);n.score=n.score+r,n.match=Object.assign(n.match,s),vt(n.terms,i)}}return a},[Ft]:(a,e)=>{const t=new Map;for(const n of e.keys()){const r=a.get(n);if(r==null)continue;const{score:i,terms:s,match:o}=e.get(n);vt(r.terms,s),t.set(n,{score:r.score+i,terms:r.terms,match:Object.assign(r.match,o)})}return t},[Kn]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},qn={k:1.2,b:.7,d:.5},Un=(a,e,t,n,r,i)=>{const{k:s,b:o,d:l}=i;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(s+1)/(a+s*(1-o+o*n/r)))},Hn=a=>(e,t,n)=>{const r=typeof a.fuzzy=="function"?a.fuzzy(e,t,n):a.fuzzy||!1,i=typeof a.prefix=="function"?a.prefix(e,t,n):a.prefix===!0,s=typeof a.boostTerm=="function"?a.boostTerm(e,t,n):1;return{term:e,fuzzy:r,prefix:i,termBoost:s}},je={idField:"id",extractField:(a,e)=>a[e],stringifyField:(a,e)=>a.toString(),tokenize:a=>a.split(Yn),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ht={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:qn},Gn={combineWith:Ft,prefix:(a,e,t)=>e===t.length-1},qe={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},$e={...qe,...Ue},Qn=(a,e)=>{a.includes(e)||a.push(e)},vt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},pt=({score:a},{score:e})=>e-a,mt=()=>new Map,Ee=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},Ie=async a=>{const e=new Map;let t=0;for(const n of Object.keys(a))e.set(parseInt(n,10),a[n]),++t%1e3===0&&await Rt(0);return e},Rt=a=>new Promise(e=>setTimeout(e,a)),Yn=/[\n\r\p{Z}\p{P}]+/u;class Zn{constructor(e=10){Me(this,"max");Me(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Xn=["aria-owns"],er={class:"shell"},tr=["title"],nr={class:"search-actions before"},rr=["title"],sr=["aria-activedescendant","aria-controls","placeholder"],ir={class:"search-actions"},ar=["title"],or=["disabled","title"],lr=["id","role","aria-labelledby"],cr=["id","aria-selected"],ur=["href","aria-label","onMouseenter","onFocusin","data-index"],dr={class:"titles"},fr=["innerHTML"],hr={class:"title main"},vr=["innerHTML"],pr={key:0,class:"excerpt-wrapper"},mr={key:0,class:"excerpt",inert:""},gr=["innerHTML"],br={key:0,class:"no-results"},yr={class:"search-keyboard-shortcuts"},wr=["aria-label"],Sr=["aria-label"],xr=["aria-label"],_r=["aria-label"],Tr=zt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var I,S;const t=e,n=ce(),r=ce(),i=ce(ln),s=an(),{activate:o}=zn(n,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=s,h=rt(async()=>{var v,d,x,R,A,C,D,F,V;return ot(de.loadJSON((x=await((d=(v=i.value)[l.value])==null?void 0:d.call(v)))==null?void 0:x.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((R=c.value.search)==null?void 0:R.provider)==="local"&&((C=(A=c.value.search.options)==null?void 0:A.miniSearch)==null?void 0:C.searchOptions)},...((D=c.value.search)==null?void 0:D.provider)==="local"&&((V=(F=c.value.search.options)==null?void 0:F.miniSearch)==null?void 0:V.options)}))}),p=be(()=>{var v,d;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((d=c.value.search.options)==null?void 0:d.disableQueryPersistence)===!0}).value?he(""):Vt("vitepress:local-search-filter",""),b=jt("vitepress:local-search-detailed-list",((I=c.value.search)==null?void 0:I.provider)==="local"&&((S=c.value.search.options)==null?void 0:S.detailedView)===!0),w=be(()=>{var v,d,x;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((d=c.value.search.options)==null?void 0:d.disableDetailedView)===!0||((x=c.value.search.options)==null?void 0:x.detailedView)===!1)}),k=be(()=>{var d,x,R,A,C,D,F;const v=((d=c.value.search)==null?void 0:d.options)??c.value.algolia;return((C=(A=(R=(x=v==null?void 0:v.locales)==null?void 0:x[l.value])==null?void 0:R.translations)==null?void 0:A.button)==null?void 0:C.buttonText)||((F=(D=v==null?void 0:v.translations)==null?void 0:D.button)==null?void 0:F.buttonText)||"Search"});$t(()=>{w.value&&(b.value=!1)});const y=ce([]),O=he(!1);Be(p,()=>{O.value=!1});const L=rt(async()=>{if(r.value)return ot(new jn(r.value))},null),K=new Zn(16);Bt(()=>[h.value,p.value,b.value],async([v,d,x],R,A)=>{var te,we,Qe,Ye;(R==null?void 0:R[0])!==v&&K.clear();let C=!1;if(A(()=>{C=!0}),!v)return;y.value=v.search(d).slice(0,16),O.value=!0;const D=x?await Promise.all(y.value.map(B=>H(B.id))):[];if(C)return;for(const{id:B,mod:ne}of D){const re=B.slice(0,B.indexOf("#"));let G=K.get(re);if(G)continue;G=new Map,K.set(re,G);const J=ne.default??ne;if(J!=null&&J.render||J!=null&&J.setup){const se=en(J);se.config.warnHandler=()=>{},se.provide(tn,s),Object.defineProperties(se.config.globalProperties,{$frontmatter:{get(){return s.frontmatter.value}},$params:{get(){return s.page.value.params}}});const Ze=document.createElement("div");se.mount(Ze),Ze.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var tt;const Se=(tt=fe.querySelector("a"))==null?void 0:tt.getAttribute("href"),Xe=(Se==null?void 0:Se.startsWith("#"))&&Se.slice(1);if(!Xe)return;let et="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)et+=fe.outerHTML;G.set(Xe,et)}),se.unmount()}if(C)return}const F=new Set;if(y.value=y.value.map(B=>{const[ne,re]=B.id.split("#"),G=K.get(ne),J=(G==null?void 0:G.get(re))??"";for(const se in B.match)F.add(se);return{...B,text:J}}),await ve(),C)return;await new Promise(B=>{var ne;(ne=L.value)==null||ne.unmark({done:()=>{var re;(re=L.value)==null||re.markRegExp(E(F),{done:B})}})});const V=((te=n.value)==null?void 0:te.querySelectorAll(".result .excerpt"))??[];for(const B of V)(we=B.querySelector('mark[data-markjs="true"]'))==null||we.scrollIntoView({block:"center"});(Ye=(Qe=r.value)==null?void 0:Qe.firstElementChild)==null||Ye.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function H(v){const d=nn(v.slice(0,v.indexOf("#")));try{if(!d)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(d)}}catch(x){return console.error(x),{id:v,mod:{}}}}const W=he(),j=be(()=>{var v;return((v=p.value)==null?void 0:v.length)<=0});function $(v=!0){var d,x;(d=W.value)==null||d.focus(),v&&((x=W.value)==null||x.select())}Le(()=>{$()});function Ce(v){v.pointerType==="mouse"&&$()}const M=he(-1),Z=he(!0);Be(y,v=>{M.value=v.length?0:-1,X()});function X(){ve(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}xe("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=y.value.length-1),Z.value=!0,X()}),xe("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=y.value.length&&(M.value=0),Z.value=!0,X()});const ee=Wt();xe("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const d=y.value[M.value];if(v.target instanceof HTMLInputElement&&!d){v.preventDefault();return}d&&(ee.go(d.id),t("close"))}),xe("Escape",()=>{t("close")});const u=on({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Le(()=>{window.history.pushState(null,"",null)}),Kt("popstate",v=>{v.preventDefault(),t("close")});const f=Jt(qt?document.body:null);Le(()=>{ve(()=>{f.value=!0,ve().then(()=>o())})}),Ut(()=>{f.value=!1});function g(){p.value="",ve().then(()=>$(!1))}function E(v){return new RegExp([...v].sort((d,x)=>x.length-d.length).map(d=>`(${rn(d)})`).join("|"),"gi")}function _(v){var R;if(!Z.value)return;const d=(R=v.target)==null?void 0:R.closest(".result"),x=Number.parseInt(d==null?void 0:d.dataset.index);x>=0&&x!==M.value&&(M.value=x),Z.value=!1}return(v,d)=>{var x,R,A,C,D;return q(),Ht(Xt,{to:"body"},[T("div",{ref_key:"el",ref:n,role:"button","aria-owns":(x=y.value)!=null&&x.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[T("div",{class:"backdrop",onClick:d[0]||(d[0]=F=>v.$emit("close"))}),T("div",er,[T("form",{class:"search-bar",onPointerup:d[4]||(d[4]=F=>Ce(F)),onSubmit:d[5]||(d[5]=Gt(()=>{},["prevent"]))},[T("label",{title:k.value,id:"localsearch-label",for:"localsearch-input"},[...d[7]||(d[7]=[T("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)])],8,tr),T("div",nr,[T("button",{class:"back-button",title:P(u)("modal.backButtonTitle"),onClick:d[1]||(d[1]=F=>v.$emit("close"))},[...d[8]||(d[8]=[T("span",{class:"vpi-arrow-left local-search-icon"},null,-1)])],8,rr)]),Qt(T("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":d[2]||(d[2]=F=>Zt(p)?p.value=F:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(R=y.value)!=null&&R.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:k.value,spellcheck:"false",type:"search"},null,8,sr),[[Yt,P(p)]]),T("div",ir,[w.value?_e("",!0):(q(),Q("button",{key:0,class:st(["toggle-layout-button",{"detailed-list":P(b)}]),type:"button",title:P(u)("modal.displayDetails"),onClick:d[3]||(d[3]=F=>M.value>-1&&(b.value=!P(b)))},[...d[9]||(d[9]=[T("span",{class:"vpi-layout-list local-search-icon"},null,-1)])],10,ar)),T("button",{class:"clear-button",type:"reset",disabled:j.value,title:P(u)("modal.resetButtonTitle"),onClick:g},[...d[10]||(d[10]=[T("span",{class:"vpi-delete local-search-icon"},null,-1)])],8,or)])],32),T("ul",{ref_key:"resultsEl",ref:r,id:(A=y.value)!=null&&A.length?"localsearch-list":void 0,role:(C=y.value)!=null&&C.length?"listbox":void 0,"aria-labelledby":(D=y.value)!=null&&D.length?"localsearch-label":void 0,class:"results",onMousemove:_},[(q(!0),Q(at,null,it(y.value,(F,V)=>(q(),Q("li",{key:F.id,id:"localsearch-item-"+V,"aria-selected":M.value===V?"true":"false",role:"option"},[T("a",{href:F.id,class:st(["result",{selected:M.value===V}]),"aria-label":[...F.titles,F.title].join(" > "),onMouseenter:te=>!Z.value&&(M.value=V),onFocusin:te=>M.value=V,onClick:d[6]||(d[6]=te=>v.$emit("close")),"data-index":V},[T("div",null,[T("div",dr,[d[12]||(d[12]=T("span",{class:"title-icon"},"#",-1)),(q(!0),Q(at,null,it(F.titles,(te,we)=>(q(),Q("span",{key:we,class:"title"},[T("span",{class:"text",innerHTML:te},null,8,fr),d[11]||(d[11]=T("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),T("span",hr,[T("span",{class:"text",innerHTML:F.title},null,8,vr)])]),P(b)?(q(),Q("div",pr,[F.text?(q(),Q("div",mr,[T("div",{class:"vp-doc",innerHTML:F.text},null,8,gr)])):_e("",!0),d[13]||(d[13]=T("div",{class:"excerpt-gradient-bottom"},null,-1)),d[14]||(d[14]=T("div",{class:"excerpt-gradient-top"},null,-1))])):_e("",!0)])],42,ur)],8,cr))),128)),P(p)&&!y.value.length&&O.value?(q(),Q("li",br,[pe(me(P(u)("modal.noResultsText"))+' "',1),T("strong",null,me(P(p)),1),d[15]||(d[15]=pe('" ',-1))])):_e("",!0)],40,lr),T("div",yr,[T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.navigateUpKeyAriaLabel")},[...d[16]||(d[16]=[T("span",{class:"vpi-arrow-up navigate-icon"},null,-1)])],8,wr),T("kbd",{"aria-label":P(u)("modal.footer.navigateDownKeyAriaLabel")},[...d[17]||(d[17]=[T("span",{class:"vpi-arrow-down navigate-icon"},null,-1)])],8,Sr),pe(" "+me(P(u)("modal.footer.navigateText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.selectKeyAriaLabel")},[...d[18]||(d[18]=[T("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)])],8,xr),pe(" "+me(P(u)("modal.footer.selectText")),1)]),T("span",null,[T("kbd",{"aria-label":P(u)("modal.footer.closeKeyAriaLabel")},"esc",8,_r),pe(" "+me(P(u)("modal.footer.closeText")),1)])])])],8,Xn)])}}}),Rr=sn(Tr,[["__scopeId","data-v-4fe87ed7"]]);export{Rr as default};