benchgo-plugin 0.0.0-stage → 0.0.3

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 (180) hide show
  1. package/DEEPSEEK-LICENSE +21 -0
  2. package/LICENSE +21 -0
  3. package/NOTICE +17 -0
  4. package/PASEO-LICENSE +211 -0
  5. package/README.md +256 -2
  6. package/TOOL-CONFIG.md +33 -0
  7. package/VERIFICATION.md +297 -0
  8. package/assets/fonts/README.md +13 -0
  9. package/assets/fonts/manifest.json +437 -0
  10. package/assets/fonts/web/fangyuan-latin-238bc49130b1.woff2 +0 -0
  11. package/assets/fonts/web/fangyuan-u30-0fe8d99641c3.woff2 +0 -0
  12. package/assets/fonts/web/fangyuan-u32-202a573131a1.woff2 +0 -0
  13. package/assets/fonts/web/fangyuan-u4e-cc2f8b20be49.woff2 +0 -0
  14. package/assets/fonts/web/fangyuan-u4f-9189b5f2d321.woff2 +0 -0
  15. package/assets/fonts/web/fangyuan-u50-e2560e003872.woff2 +0 -0
  16. package/assets/fonts/web/fangyuan-u51-a9c5e7a8c7c4.woff2 +0 -0
  17. package/assets/fonts/web/fangyuan-u52-0cfd00b473c8.woff2 +0 -0
  18. package/assets/fonts/web/fangyuan-u53-18122a07f60a.woff2 +0 -0
  19. package/assets/fonts/web/fangyuan-u54-8ca41aa9cff2.woff2 +0 -0
  20. package/assets/fonts/web/fangyuan-u55-7bd55e14647e.woff2 +0 -0
  21. package/assets/fonts/web/fangyuan-u56-26f093e8a810.woff2 +0 -0
  22. package/assets/fonts/web/fangyuan-u57-36bde83a8378.woff2 +0 -0
  23. package/assets/fonts/web/fangyuan-u58-d1df14217098.woff2 +0 -0
  24. package/assets/fonts/web/fangyuan-u59-4e41ab22c51a.woff2 +0 -0
  25. package/assets/fonts/web/fangyuan-u5a-746a367174e6.woff2 +0 -0
  26. package/assets/fonts/web/fangyuan-u5b-3d1dd404d70c.woff2 +0 -0
  27. package/assets/fonts/web/fangyuan-u5c-fe0a273f69e7.woff2 +0 -0
  28. package/assets/fonts/web/fangyuan-u5d-af1f0a1c8d2d.woff2 +0 -0
  29. package/assets/fonts/web/fangyuan-u5e-598c65420e17.woff2 +0 -0
  30. package/assets/fonts/web/fangyuan-u5f-a92eaaa5265a.woff2 +0 -0
  31. package/assets/fonts/web/fangyuan-u60-48ee3d26462d.woff2 +0 -0
  32. package/assets/fonts/web/fangyuan-u61-7a57f35bc077.woff2 +0 -0
  33. package/assets/fonts/web/fangyuan-u62-d2d0b7b36631.woff2 +0 -0
  34. package/assets/fonts/web/fangyuan-u63-cade7c6635e6.woff2 +0 -0
  35. package/assets/fonts/web/fangyuan-u64-ed34e40d7f65.woff2 +0 -0
  36. package/assets/fonts/web/fangyuan-u65-e13e83e69c38.woff2 +0 -0
  37. package/assets/fonts/web/fangyuan-u66-1dbcfa5da147.woff2 +0 -0
  38. package/assets/fonts/web/fangyuan-u67-6b0a26b82da6.woff2 +0 -0
  39. package/assets/fonts/web/fangyuan-u68-1b8217cfceed.woff2 +0 -0
  40. package/assets/fonts/web/fangyuan-u69-673e63627790.woff2 +0 -0
  41. package/assets/fonts/web/fangyuan-u6a-3c94008a4640.woff2 +0 -0
  42. package/assets/fonts/web/fangyuan-u6b-44572c410fa0.woff2 +0 -0
  43. package/assets/fonts/web/fangyuan-u6c-1b323b366e88.woff2 +0 -0
  44. package/assets/fonts/web/fangyuan-u6d-cbc376d6fe3f.woff2 +0 -0
  45. package/assets/fonts/web/fangyuan-u6e-7f7e211e2fee.woff2 +0 -0
  46. package/assets/fonts/web/fangyuan-u6f-ff280ce052fa.woff2 +0 -0
  47. package/assets/fonts/web/fangyuan-u70-cb727eaf73b6.woff2 +0 -0
  48. package/assets/fonts/web/fangyuan-u71-0bb1747439fe.woff2 +0 -0
  49. package/assets/fonts/web/fangyuan-u72-cccd39590d69.woff2 +0 -0
  50. package/assets/fonts/web/fangyuan-u73-e67705133584.woff2 +0 -0
  51. package/assets/fonts/web/fangyuan-u74-03a4e7ac9df5.woff2 +0 -0
  52. package/assets/fonts/web/fangyuan-u75-a2d30b327e65.woff2 +0 -0
  53. package/assets/fonts/web/fangyuan-u76-c08fe029c988.woff2 +0 -0
  54. package/assets/fonts/web/fangyuan-u77-76f03be1f4cb.woff2 +0 -0
  55. package/assets/fonts/web/fangyuan-u78-5b721deaf582.woff2 +0 -0
  56. package/assets/fonts/web/fangyuan-u79-db7713c2eda4.woff2 +0 -0
  57. package/assets/fonts/web/fangyuan-u7a-3e40d3726a09.woff2 +0 -0
  58. package/assets/fonts/web/fangyuan-u7b-a8204d1c9dba.woff2 +0 -0
  59. package/assets/fonts/web/fangyuan-u7c-89bcdae046de.woff2 +0 -0
  60. package/assets/fonts/web/fangyuan-u7d-bcc45fa6351a.woff2 +0 -0
  61. package/assets/fonts/web/fangyuan-u7e-49fab96d9269.woff2 +0 -0
  62. package/assets/fonts/web/fangyuan-u7f-dc110e1ecbf3.woff2 +0 -0
  63. package/assets/fonts/web/fangyuan-u80-c5ce9be0335e.woff2 +0 -0
  64. package/assets/fonts/web/fangyuan-u81-b026091b3779.woff2 +0 -0
  65. package/assets/fonts/web/fangyuan-u82-a7c6960e875d.woff2 +0 -0
  66. package/assets/fonts/web/fangyuan-u83-4b7d1c2c50d4.woff2 +0 -0
  67. package/assets/fonts/web/fangyuan-u84-4119128100c8.woff2 +0 -0
  68. package/assets/fonts/web/fangyuan-u85-ca43dd4c5411.woff2 +0 -0
  69. package/assets/fonts/web/fangyuan-u86-54fc0e3158fb.woff2 +0 -0
  70. package/assets/fonts/web/fangyuan-u87-b64f5eb55720.woff2 +0 -0
  71. package/assets/fonts/web/fangyuan-u88-00feb1251f08.woff2 +0 -0
  72. package/assets/fonts/web/fangyuan-u89-db419435b316.woff2 +0 -0
  73. package/assets/fonts/web/fangyuan-u8a-06c11d45fb87.woff2 +0 -0
  74. package/assets/fonts/web/fangyuan-u8b-5c2f6fda436a.woff2 +0 -0
  75. package/assets/fonts/web/fangyuan-u8c-2b46d2d1f4cc.woff2 +0 -0
  76. package/assets/fonts/web/fangyuan-u8d-1a67d064000d.woff2 +0 -0
  77. package/assets/fonts/web/fangyuan-u8e-eb87baf0091c.woff2 +0 -0
  78. package/assets/fonts/web/fangyuan-u8f-96c1f0632da6.woff2 +0 -0
  79. package/assets/fonts/web/fangyuan-u90-86752dba8cbe.woff2 +0 -0
  80. package/assets/fonts/web/fangyuan-u91-0573b8548552.woff2 +0 -0
  81. package/assets/fonts/web/fangyuan-u92-f85ecf735974.woff2 +0 -0
  82. package/assets/fonts/web/fangyuan-u93-e7e0451735db.woff2 +0 -0
  83. package/assets/fonts/web/fangyuan-u94-f3957ff98bcd.woff2 +0 -0
  84. package/assets/fonts/web/fangyuan-u95-b31129d29013.woff2 +0 -0
  85. package/assets/fonts/web/fangyuan-u96-ca7f779c2c13.woff2 +0 -0
  86. package/assets/fonts/web/fangyuan-u97-100a25198b2c.woff2 +0 -0
  87. package/assets/fonts/web/fangyuan-u98-59e4b784a94f.woff2 +0 -0
  88. package/assets/fonts/web/fangyuan-u99-d35af6e30868.woff2 +0 -0
  89. package/assets/fonts/web/fangyuan-u9a-1eb6f7cdfcfe.woff2 +0 -0
  90. package/assets/fonts/web/fangyuan-u9b-8f428d81dcbb.woff2 +0 -0
  91. package/assets/fonts/web/fangyuan-u9c-e10f7f8f0274.woff2 +0 -0
  92. package/assets/fonts/web/fangyuan-u9e-2be65003b759.woff2 +0 -0
  93. package/assets/fonts/web/fangyuan-u9f-02c3d5224fdb.woff2 +0 -0
  94. package/assets/fonts/web/fangyuan-ufb-3eaee54bc476.woff2 +0 -0
  95. package/assets/fonts/web/fangyuan-ufe-f64da8a3acce.woff2 +0 -0
  96. package/assets/fonts/web/fangyuan-uff-0a6dcfb689fd.woff2 +0 -0
  97. package/client/assets/iconsax/LICENSE +16 -0
  98. package/client/assets/iconsax/SOURCE.md +14 -0
  99. package/config/routergo-deepseek.example.yml +25 -0
  100. package/config.example.json +24 -0
  101. package/cordis.patch.yml +5 -0
  102. package/lib/LINK-THIRD-PARTY-LICENSES.txt +1197 -0
  103. package/lib/client.js +3577 -0
  104. package/lib/link-web/app.css +92 -0
  105. package/lib/link-web/app.js +599 -0
  106. package/lib/link-web/index.html +1 -0
  107. package/lib/link-web/workbench.js +118 -0
  108. package/lib/link.mjs +244 -0
  109. package/lib/relay/ip-certificate.mjs +559 -0
  110. package/lib/relay/relay.example.json +8 -0
  111. package/lib/relay/run-relay-server.cjs +4100 -0
  112. package/lib/server/bootstrap.mjs +147 -0
  113. package/lib/server/bootstrap.sh +39 -0
  114. package/lib/server/manifest.json +8 -0
  115. package/lib/server/server-seed.tar.gz +0 -0
  116. package/locale/en.json +6 -0
  117. package/locale/zh-CN.json +6 -0
  118. package/openapi.json +629 -0
  119. package/package.json +104 -4
  120. package/shared/plugin-install.mjs +198 -0
  121. package/shared/tool-quick-settings.mjs +70 -0
  122. package/shared/update-feed.mjs +191 -0
  123. package/shared/update-public-key.pem +3 -0
  124. package/src/cli.mjs +102 -0
  125. package/src/commands.mjs +17 -0
  126. package/src/delegation.mjs +47 -0
  127. package/src/fonts.mjs +17 -0
  128. package/src/harness-adapter.mjs +228 -0
  129. package/src/harness-commands.mjs +39 -0
  130. package/src/harness-selection.mjs +5 -0
  131. package/src/harness-usage.mjs +31 -0
  132. package/src/isolated-launch.mjs +22 -0
  133. package/src/line-process.mjs +114 -0
  134. package/src/link-plugin.mjs +21 -0
  135. package/src/mcp.mjs +21 -0
  136. package/src/model-providers.mjs +125 -0
  137. package/src/models.mjs +37 -0
  138. package/src/native-auth.mjs +32 -0
  139. package/src/picker-catalog.mjs +82 -0
  140. package/src/plugin.mjs +138 -0
  141. package/src/projects.mjs +96 -0
  142. package/src/provider-access.mjs +11 -0
  143. package/src/providers/acp.mjs +138 -0
  144. package/src/providers/claude.mjs +115 -0
  145. package/src/providers/codex.mjs +134 -0
  146. package/src/providers/opencode.mjs +138 -0
  147. package/src/providers/pi-permissions.ts +24 -0
  148. package/src/providers/pi.mjs +97 -0
  149. package/src/questions.mjs +34 -0
  150. package/src/recent-workspace.mjs +36 -0
  151. package/src/runtime.mjs +421 -0
  152. package/src/session-routes.mjs +89 -0
  153. package/src/store.mjs +98 -0
  154. package/src/tool-catalog.mjs +22 -0
  155. package/src/tool-config.mjs +94 -0
  156. package/src/tool-install.mjs +31 -0
  157. package/src/tool-profiles.mjs +114 -0
  158. package/src/tooling.mjs +90 -0
  159. package/src/updates.mjs +156 -0
  160. package/src/usage-import-parsers.mjs +37 -0
  161. package/src/usage-import.mjs +114 -0
  162. package/src/usage-timeline.mjs +36 -0
  163. package/src/usage.mjs +142 -0
  164. package/src/web.mjs +274 -0
  165. package/voice/README.md +49 -0
  166. package/voice/STREAMING.md +141 -0
  167. package/voice/VERIFICATION.md +36 -0
  168. package/voice/client/audio-worklet.js +35 -0
  169. package/voice/locale/en.json +1 -0
  170. package/voice/locale/zh-CN.json +1 -0
  171. package/voice/src/asr.mjs +44 -0
  172. package/voice/src/calls.mjs +37 -0
  173. package/voice/src/config.mjs +139 -0
  174. package/voice/src/media.mjs +70 -0
  175. package/voice/src/plugin.mjs +10 -0
  176. package/voice/src/realtime-protocols.mjs +30 -0
  177. package/voice/src/realtime-socket.mjs +86 -0
  178. package/voice/src/realtime.mjs +130 -0
  179. package/voice/src/tts.mjs +16 -0
  180. package/voice/src/web.mjs +171 -0
@@ -0,0 +1,92 @@
1
+ .link-settings, .link-mobile, .link-dialog-backdrop {
2
+ --link-ink: #142029;
3
+ --link-muted: #677177;
4
+ --link-faint: #edf0ed;
5
+ --link-paper: #fffdf8;
6
+ --link-panel: #f6f7f3;
7
+ --link-accent: #2c6ee8;
8
+ --link-accent-soft: #e7efff;
9
+ --link-danger: #b34845;
10
+ --link-radius: 14px;
11
+ }
12
+ @media (prefers-color-scheme: dark) {
13
+ .link-mobile { --link-ink: #edf2f0; --link-muted: #9da9aa; --link-faint: #2c3436; --link-paper: #171b1d; --link-panel: #202628; --link-accent: #8bb3ff; --link-accent-soft: #243653; --link-danger: #f0928d; }
14
+ }
15
+ body[data-ds-dark-theme] :is(.link-settings, .link-dialog-backdrop) { --link-ink: #edf2f0; --link-muted: #9da9aa; --link-faint: #2c3436; --link-paper: #171b1d; --link-panel: #202628; --link-accent: #8bb3ff; --link-accent-soft: #243653; --link-danger: #f0928d; }
16
+ body[data-ds-dark-theme] :is(.link-settings, .link-dialog-backdrop) .link-button-primary { color: #10213e; }
17
+ .link-settings, .link-mobile, .link-dialog-backdrop { font-family: inherit; color: var(--link-ink); }
18
+ .link-settings { width: 100%; max-width: 760px; min-width: 0; box-sizing: border-box; padding: 12px 0 36px; }
19
+ .link-settings .link-heading h2 { margin: 8px 0 10px; font-size: 25px; font-weight: 600; letter-spacing: -.035em; line-height: 1.25; }
20
+ .link-settings .link-heading p { font-size: 13px; }
21
+ .link-heading, .link-mobile-copy { max-width: 600px; }
22
+ .link-kicker { display: block; color: var(--link-muted); font-size: 10px; font-weight: 700; letter-spacing: .16em; line-height: 1.3; }
23
+ .link-heading h2, .link-mobile-copy h1 { margin: 13px 0 12px; font-size: clamp(32px, 5vw, 52px); font-weight: 500; letter-spacing: -.055em; line-height: .98; }
24
+ .link-heading h2 em, .link-mobile-copy h1 em { color: var(--link-accent); font-style: normal; }
25
+ .link-heading p, .link-mobile-copy p { max-width: 48ch; margin: 0; color: var(--link-muted); line-height: 1.65; }
26
+ .link-form { display: grid; grid-template-columns: 1fr 145px; gap: 1px; margin-top: 44px; overflow: hidden; border: 1px solid var(--link-faint); border-radius: var(--link-radius); background: var(--link-faint); }
27
+ .link-field { display: grid; gap: 8px; padding: 19px 18px; background: var(--link-paper); font-size: 13px; }
28
+ .link-field span, .link-toggle-field label { font-weight: 650; }
29
+ .link-field small, .link-toggle-field small { display: block; margin-top: 4px; color: var(--link-muted); font-size: 11px; font-weight: 400; }
30
+ .link-field input { width: 100%; box-sizing: border-box; border: 0; outline: none; background: transparent; color: var(--link-ink); font: inherit; font-size: 15px; }
31
+ .link-field-wide { grid-column: 1 / -1; }
32
+ .link-toggle-field { display: flex; align-items: center; justify-content: space-between; grid-column: 1 / -1; }
33
+ .link-toggle-field input { appearance: none; position: relative; width: 40px; height: 24px; margin: 0; border-radius: 99px; background: var(--link-faint); cursor: pointer; transition: background .2s ease; }
34
+ .link-toggle-field input::after { content: ''; position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: var(--link-paper); box-shadow: 0 1px 3px #0002; transition: transform .2s ease; }
35
+ .link-toggle-field input:checked { background: var(--link-accent); }.link-toggle-field input:checked::after { transform: translateX(16px); }
36
+ .link-form-actions { display: flex; grid-column: 1 / -1; gap: 9px; padding: 14px; background: var(--link-paper); }
37
+ .link-button { display: inline-flex; align-items: center; justify-content: center; gap: 8px; min-height: 36px; padding: 8px 13px; border: 1px solid var(--link-faint); border-radius: 9px; background: transparent; color: var(--link-ink); cursor: pointer; font: inherit; font-size: 12px; transition: transform .16s ease, border-color .16s ease, background .16s ease; }
38
+ .link-button:hover:not(:disabled) { border-color: var(--link-accent); transform: translateY(-1px); }.link-button:disabled { cursor: wait; opacity: .45; }.link-button-primary { border-color: var(--link-accent); background: var(--link-accent); color: white; }.link-button-primary:hover:not(:disabled) { background: color-mix(in srgb, var(--link-accent), black 10%); }
39
+ .link-error { margin: 14px 0; color: var(--link-danger); font-size: 12px; }
40
+ .link-status-panel, .link-device-list { margin-top: 30px; padding: 22px; border: 1px solid var(--link-faint); border-radius: var(--link-radius); background: var(--link-panel); }
41
+ .link-panel-head, .link-pair-row { min-width: 0; display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; }.link-panel-head h3, .link-pair-row h3 { margin: 7px 0 5px; font-size: 17px; letter-spacing: -.025em; }.link-panel-head > span { color: var(--link-muted); font-size: 12px; }
42
+ .link-online { display: flex; align-items: center; gap: 7px; padding-top: 2px; color: var(--link-muted); font-size: 12px; }.link-status-dot { display: inline-block; width: 7px; height: 7px; flex: none; border-radius: 50%; background: var(--link-muted); }.link-status-running { background: #39ab7d; box-shadow: 0 0 0 3px #39ab7d22; }.link-status-waiting { background: #d89a3d; }.link-status-failed { background: var(--link-danger); }
43
+ .link-addresses { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 20px; }.link-addresses code, .link-pair-code { padding: 7px 9px; border-radius: 7px; background: var(--link-paper); color: var(--link-muted); font: 11px ui-monospace, SFMono-Regular, monospace; }
44
+ .link-pair-row { align-items: center; margin-top: 40px; padding: 2px 2px 22px; border-bottom: 1px solid var(--link-faint); }.link-pair-row p { max-width: 44ch; margin: 0; color: var(--link-muted); font-size: 12px; line-height: 1.6; }
45
+ .link-device-list { margin-top: 0; border-top-left-radius: 0; border-top-right-radius: 0; }.link-device { display: flex; align-items: center; gap: 11px; padding: 15px 0; border-top: 1px solid var(--link-faint); }.link-device > div:nth-child(2) { min-width: 0; flex: 1; }.link-device strong, .link-device small { display: block; }.link-device strong { font-size: 13px; }.link-device small { margin-top: 3px; color: var(--link-muted); font-size: 11px; }.link-empty { color: var(--link-muted); font-size: 12px; }
46
+ .link-dialog-backdrop { position: fixed; z-index: 2100; inset: 0; display: grid; place-items: center; padding: 20px; background: #0c151899; backdrop-filter: blur(8px); }.link-dialog { position: relative; width: min(420px, 100%); min-width: 0; box-sizing: border-box; padding: 28px; border-radius: 18px; background: var(--link-paper); box-shadow: 0 25px 80px #0004; text-align: center; }.link-dialog h3 { margin: 10px 0 5px; font-size: 24px; letter-spacing: -.04em; }.link-dialog p { margin: 0 auto 19px; color: var(--link-muted); font-size: 12px; line-height: 1.6; }.link-dialog-close { position: absolute; top: 10px; right: 10px; display: inline-flex; align-items: center; justify-content: center; width: 36px; height: 36px; padding: 8px; border: 0; border-radius: 9px; background: none; color: var(--link-muted); cursor: pointer; }.link-qr-surface { display: grid; place-items: center; width: fit-content; max-width: 100%; box-sizing: border-box; margin: 0 auto 16px; padding: 10px; border: 1px solid #e6e9e7; border-radius: 16px; background: #fffdf8; }
47
+ .link-qr { display: block; max-width: 100%; height: auto !important; aspect-ratio: 1; border-radius: 6px; }
48
+ .link-qr-error { max-width: 220px; padding: 24px 8px; color: #b34845 !important; }.link-pair-code { display: block; width: 100%; min-width: 0; max-width: 100%; box-sizing: border-box; overflow: hidden; margin: 12px 0 0; padding: 12px; color: var(--link-ink); background: var(--link-panel); font-size: 12px; line-height: 1.5; letter-spacing: .02em; text-overflow: ellipsis; white-space: nowrap; text-align: left; }.link-expiry { display: block; margin-top: 8px; color: var(--link-muted); font-size: 11px; }.link-pending-list { margin-top: 20px; text-align: left; }.link-pending-list .link-device { padding: 11px 0; }.link-pending-list .link-device > div:last-child { display: flex; gap: 5px; }
49
+ .link-mobile { min-height: 100dvh; box-sizing: border-box; padding: 28px clamp(20px, 7vw, 64px); background: var(--link-paper); }.link-mobile-pair, .link-mobile-home { display: flex; flex-direction: column; }.link-mobile-brand { display: flex; align-items: center; gap: 9px; font-size: 13px; font-weight: 700; letter-spacing: -.02em; }.link-mark { display: grid; width: 25px; height: 25px; place-items: center; border-radius: 8px; background: var(--link-ink); color: var(--link-paper); font-size: 17px; }.link-mobile-copy { margin: auto 0 32px; }.link-mobile-copy h1 { font-size: clamp(42px, 11vw, 74px); }.link-mobile-actions { display: flex; flex-wrap: wrap; gap: 9px; }.link-pair-input { display: grid; gap: 8px; max-width: 500px; margin-bottom: 18px; }.link-pair-input label { margin-top: 7px; color: var(--link-muted); font-size: 11px; }.link-pair-input input, .link-pair-input textarea, .link-composer textarea { width: 100%; box-sizing: border-box; resize: vertical; border: 1px solid var(--link-faint); border-radius: 9px; outline: none; padding: 11px; background: var(--link-panel); color: var(--link-ink); font: 13px ui-monospace, monospace; }.link-pair-input input:focus, .link-pair-input textarea:focus, .link-composer textarea:focus { border-color: var(--link-accent); }.link-pair-status { display: flex; align-items: center; gap: 8px; margin-top: 18px; color: var(--link-muted); font-size: 12px; }
50
+ .link-mobile-header { display: flex; align-items: center; justify-content: space-between; gap: 14px; }.link-mobile-header > div:nth-child(2) { display: grid; flex: 1; text-align: center; }.link-mobile-header small { margin-top: 3px; color: var(--link-muted); font-size: 10px; }.link-mobile-home .link-mobile-copy { margin-top: clamp(80px, 18vh, 180px); }.link-projects { display: grid; gap: 7px; max-width: 650px; }.link-project, .link-session { display: flex; align-items: center; gap: 12px; width: 100%; padding: 14px 15px; border: 1px solid var(--link-faint); border-radius: 10px; background: transparent; color: var(--link-ink); text-align: left; cursor: pointer; }.link-project:hover, .link-project.is-active { border-color: var(--link-accent); background: var(--link-accent-soft); }.link-project small { margin-left: auto; color: var(--link-muted); font: 10px ui-monospace, monospace; overflow: hidden; text-overflow: ellipsis; }.link-session-actions { display: grid; gap: 8px; max-width: 650px; margin-top: 26px; }.link-session { border: 0; border-top: 1px solid var(--link-faint); border-radius: 0; }.link-session small { margin-left: auto; color: var(--link-muted); }.link-mobile-chat { display: flex; flex-direction: column; }.link-messages { display: grid; align-content: start; gap: 20px; flex: 1; max-width: 720px; margin: 45px auto 25px; width: 100%; }.link-message span { color: var(--link-muted); font-size: 10px; font-weight: 700; letter-spacing: .1em; }.link-message p { margin: 5px 0 0; white-space: pre-wrap; line-height: 1.65; }.link-message-user p { color: var(--link-accent); }.link-composer { display: flex; align-items: end; gap: 8px; max-width: 720px; width: 100%; margin: 0 auto; }.link-composer textarea { min-height: 40px; max-height: 150px; resize: none; }
51
+ @media (prefers-reduced-motion: reduce) { .link-button, .link-toggle-field input, .link-toggle-field input::after { transition: none; } }
52
+ @media (max-width: 580px) { .link-settings { padding: 26px 0 60px; }.link-form { grid-template-columns: 1fr; }.link-field-wide, .link-toggle-field, .link-form-actions { grid-column: auto; }.link-pair-row { align-items: flex-start; flex-direction: column; }.link-heading h2 { font-size: 38px; }.link-panel-head { gap: 10px; }.link-project small { display: none; } }
53
+
54
+ .link-mobile { font-family: ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; padding-top: max(28px, env(safe-area-inset-top)); padding-bottom: max(28px, env(safe-area-inset-bottom)); }.link-mobile button, .link-mobile input, .link-mobile textarea, .link-mobile .dowork-select { font-family: inherit; }:is(.link-settings, .link-mobile, .link-dialog-backdrop) .cmd-ui-icon { display: inline-flex; align-items: center; justify-content: center; flex: none; color: inherit; line-height: 0; vertical-align: middle; }
55
+ :is(.link-settings, .link-mobile, .link-dialog-backdrop) .cmd-ui-icon > .cmd-ui-linear { display: inline-flex !important; width: 100%; height: 100%; }
56
+ :is(.link-settings, .link-mobile, .link-dialog-backdrop) .cmd-ui-icon svg { display: block; width: 100%; height: 100%; }
57
+ :is(.link-settings, .link-mobile, .link-dialog-backdrop) .cmd-ui-bold { display: none !important; }.link-mode-actions { display: grid; gap: 8px; min-width: 175px; }.link-mode-actions .dowork-select, .link-model-select .dowork-select { width: 100%; padding: 9px; background: var(--link-paper); border: 1px solid var(--link-faint); border-radius: 9px; color: var(--link-ink); font-size: 12px; }.link-pair-open { display: inline-flex; align-items: center; justify-content: center; gap: 6px; margin-bottom: 12px; color: var(--link-accent); font-size: 12px; }.link-pair-form { max-width: 500px; }.link-model-select { display: grid; gap: 7px; margin-bottom: 7px; font-size: 11px; color: var(--link-muted); }.link-composer-actions { display: flex; gap: 6px; }.link-send-pending { display: flex; align-items: center; justify-content: space-between; gap: 10px; max-width: 720px; margin: 0 auto 12px; color: var(--link-muted); font-size: 12px; }.link-interaction { padding: 17px; border: 1px solid var(--link-faint); border-radius: 12px; background: var(--link-panel); }.link-interaction h3 { margin: 9px 0 14px; font-size: 15px; }.link-interaction textarea { width: 100%; min-height: 60px; margin-bottom: 9px; border: 1px solid var(--link-faint); border-radius: 8px; background: var(--link-paper); color: var(--link-ink); }.link-interaction-options { display: flex; flex-wrap: wrap; gap: 7px; }.link-mobile-pair .link-mobile-copy { margin-top: max(70px, 13vh); }.link-mobile button:focus-visible, .link-settings button:focus-visible, .link-mobile .dowork-select:focus-visible, .link-settings .dowork-select:focus-visible { outline: 2px solid var(--link-accent); outline-offset: 3px; }
58
+ @media (prefers-color-scheme: dark) { .link-mobile .link-button-primary { color: #10213e; } }
59
+ @media (max-width: 580px) { .link-composer { align-items: stretch; flex-direction: column; }.link-composer-actions { justify-content: flex-end; }.link-heading h2 { line-height: 1.16; }.link-mobile-copy h1 { line-height: 1.1; } }
60
+ .link-question { display: grid; gap: 9px; min-width: 0; padding: 14px 0; border: 0; }.link-question legend { padding: 0; font-size: 14px; }.link-question label { display: flex; align-items: flex-start; gap: 8px; font-size: 13px; }.link-question label small { display: block; margin-top: 4px; color: var(--link-muted); font-size: 11px; }.link-question input { accent-color: var(--link-accent); }.link-question textarea { box-sizing: border-box; padding: 9px; }
61
+ .link-sr-only { position: absolute; width: 1px; height: 1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
62
+ .link-settings .link-status-panel { margin-top: 30px; }.link-settings .link-toggle-field { flex: none; padding-top: 5px; }.link-toggle-field input:disabled { cursor: wait; opacity: .45; }.link-status-note { margin: 15px 0 0; color: var(--link-muted); font-size: 12px; line-height: 1.6; }.link-connect-steps { margin: 12px 0; padding-left: 19px; color: var(--link-ink); font-size: 12px; line-height: 1.8; }.link-pair-row > .link-button { flex: none; min-width: 112px; }
63
+ .link-advanced { margin: 24px 0; border: 1px solid var(--link-faint); border-radius: var(--link-radius); background: var(--link-paper); }.link-advanced > summary { padding: 17px 20px; font-size: 13px; font-weight: 650; cursor: pointer; }.link-advanced[open] > summary { border-bottom: 1px solid var(--link-faint); }.link-advanced-note, .link-mode-notice { margin: 16px 20px; color: var(--link-muted); font-size: 12px; line-height: 1.65; }.link-advanced .link-form { margin: 0 16px 16px; }.link-advanced-controls { display: grid; gap: 1px; margin: 0 16px 16px; overflow: hidden; border: 1px solid var(--link-faint); border-radius: 10px; background: var(--link-faint); }.link-advanced-controls .link-field { min-width: 0; }.link-advanced-controls .dowork-select { width: 100%; box-sizing: border-box; padding: 9px; border: 1px solid var(--link-faint); border-radius: 8px; background: var(--link-paper); color: var(--link-ink); font: inherit; font-size: 12px; }.link-diagnostics { padding: 0 20px 20px; }.link-diagnostics .link-panel-head { align-items: center; }.link-diagnostics h4 { margin: 0; font-size: 12px; }.link-diagnostics p, .link-diagnostics .link-addresses > span { margin: 12px 0 0; color: var(--link-muted); font-size: 11px; line-height: 1.7; }.link-addresses code { max-width: 100%; overflow-wrap: anywhere; }.link-settings .link-device-list { margin-top: 24px; border-radius: var(--link-radius); }
64
+ .link-dialog { max-height: calc(100dvh - 40px); overflow-x: hidden; overflow-y: auto; overscroll-behavior: contain; }.link-dialog .link-pair-warning { margin: 14px 0; font-size: 11px; }.link-pair-backup { min-width: 0; padding-top: 12px; border-top: 1px solid var(--link-faint); }.link-pair-backup summary { color: var(--link-muted); font-size: 11px; cursor: pointer; }.link-pair-backup-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 12px; }
65
+ .link-pair-backup-actions .link-button { flex: 1 1 auto; margin: 0; white-space: nowrap; }
66
+ .link-dialog .link-pair-backup-note { margin: 12px 0 0; font-size: 11px; text-align: left; }
67
+ .link-dialog .link-copy-feedback { margin: 10px 0 0; font-size: 11px; }
68
+ .link-dialog .link-copy-feedback.link-error { color: var(--link-danger); }.link-settings summary:focus-visible, .link-toggle-field input:focus-visible { outline: 2px solid var(--link-accent); outline-offset: 3px; }
69
+
70
+ .link-dialog-symbol { display: inline-flex; align-items: center; justify-content: center; width: 46px; height: 46px; margin: 4px 0 8px; border-radius: 13px; color: var(--link-accent); background: var(--link-accent-soft); }
71
+ .link-dialog-close:hover { background: var(--link-panel); color: var(--link-ink); }
72
+ .link-dialog :is(button, a, summary):focus-visible { outline: 2px solid var(--link-accent); outline-offset: 3px; }
73
+ .link-dialog .link-device { flex-wrap: wrap; text-align: left; }
74
+ .link-dialog .link-device-info { flex: 1 1 110px; min-width: 0; }
75
+ .link-dialog .link-device-actions { display: flex; flex: none; gap: 6px; }
76
+ .link-dialog .link-device-actions .link-button { box-sizing: border-box; flex: none; min-width: 76px; white-space: nowrap; }
77
+ .link-device strong { overflow-wrap: anywhere; }
78
+ .link-settings :is(.link-panel-head, .link-pair-row) > div { min-width: 0; }
79
+ .link-settings .link-button { white-space: nowrap; }
80
+ @media (max-width: 580px) { .link-settings { padding: 8px 0 28px; }.link-settings .link-heading h2 { font-size: 24px; }.link-status-panel, .link-device-list { padding: 18px; }.link-settings .link-device { flex-wrap: wrap; }.link-settings .link-device > div { min-width: 0; } }
81
+ @media (max-width: 380px) { .link-dialog-backdrop { padding: 12px; }.link-dialog { max-height: calc(100dvh - 24px); padding: 24px 18px; }.link-dialog h3 { font-size: 22px; }.link-qr-surface { padding: 6px; }.link-pair-backup-actions { flex-direction: column; } }
82
+ .link-settings .link-status-panel { margin-top: 20px; }
83
+ .link-settings .link-pair-row { margin-top: 22px; padding-bottom: 20px; }
84
+ .link-host-actions { display: flex; align-items: center; gap: 10px; }
85
+ .link-error-detail { margin: 10px 0; color: var(--link-muted); font-size: 11px; overflow-wrap: anywhere; }
86
+ .link-error-detail summary { cursor: pointer; }
87
+ .link-settings .link-toggle-field input:disabled { cursor: default; }
88
+
89
+ @media (any-pointer: coarse) {
90
+ html { -webkit-tap-highlight-color: transparent; }
91
+ :is(button, a, summary, [role="button"], [tabindex]):not(input, textarea, .dowork-select, [contenteditable]):focus:not(:focus-visible) { outline: none; }
92
+ }