synabun 2.1.0 → 2.2.0

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 (317) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/README.md +1 -1
  3. package/docs/whatsapp.md +11 -11
  4. package/lib/client-config-repair.js +13 -9
  5. package/lib/external-tools.js +6 -5
  6. package/lib/update-snapshot.js +77 -3
  7. package/lib/virustotal.mjs +12 -1
  8. package/mcp-server/dist/index.js +1 -1
  9. package/mcp-server/dist/index.js.map +1 -1
  10. package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
  11. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  12. package/mcp-server/dist/services/budget-judgments.js +5 -3
  13. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  14. package/mcp-server/dist/services/identity.d.ts +2 -2
  15. package/mcp-server/dist/services/identity.js +2 -2
  16. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  17. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  18. package/mcp-server/dist/services/memory-sessions.js +28 -2
  19. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  20. package/mcp-server/dist/services/neural-interface.d.ts +2 -1
  21. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  22. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  23. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  24. package/mcp-server/dist/services/server-instructions.js +2 -1
  25. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  26. package/mcp-server/dist/services/tool-catalog.js +1 -1
  27. package/mcp-server/dist/services/tool-catalog.js.map +1 -1
  28. package/mcp-server/dist/services/tool-list.d.ts +1 -1
  29. package/mcp-server/dist/services/tool-list.d.ts.map +1 -1
  30. package/mcp-server/dist/services/tool-runtime.d.ts +2 -2
  31. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -1
  32. package/mcp-server/dist/services/tool-runtime.js +1 -1
  33. package/mcp-server/dist/services/tool-runtime.js.map +1 -1
  34. package/mcp-server/dist/services/typesafe-config.js +1 -1
  35. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  36. package/mcp-server/dist/tools/agents.d.ts +8 -8
  37. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  38. package/mcp-server/dist/tools/agents.js +10 -9
  39. package/mcp-server/dist/tools/agents.js.map +1 -1
  40. package/mcp-server/dist/tools/choice.d.ts +6 -0
  41. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  42. package/mcp-server/dist/tools/choice.js +18 -13
  43. package/mcp-server/dist/tools/choice.js.map +1 -1
  44. package/mcp-server/dist/tools/git-tools.js +2 -2
  45. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  46. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  47. package/mcp-server/dist/tools/morelogin.js +9 -6
  48. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  49. package/mcp-server/dist/tools/skill-tools.d.ts +8 -8
  50. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -1
  51. package/mcp-server/dist/tools/skill-tools.js +11 -8
  52. package/mcp-server/dist/tools/skill-tools.js.map +1 -1
  53. package/mcp-server/package-lock.json +2 -2
  54. package/mcp-server/package.json +1 -1
  55. package/mcp-server/src/index.ts +1 -1
  56. package/mcp-server/src/services/budget-judgments.ts +5 -3
  57. package/mcp-server/src/services/identity.ts +2 -2
  58. package/mcp-server/src/services/memory-sessions.ts +24 -3
  59. package/mcp-server/src/services/neural-interface.ts +2 -1
  60. package/mcp-server/src/services/server-instructions.ts +2 -1
  61. package/mcp-server/src/services/tool-catalog.ts +1 -1
  62. package/mcp-server/src/services/tool-list.ts +1 -1
  63. package/mcp-server/src/services/tool-runtime.ts +2 -2
  64. package/mcp-server/src/services/typesafe-config.ts +1 -1
  65. package/mcp-server/src/tools/agents.ts +10 -9
  66. package/mcp-server/src/tools/choice.ts +17 -12
  67. package/mcp-server/src/tools/git-tools.ts +2 -2
  68. package/mcp-server/src/tools/morelogin.ts +6 -4
  69. package/mcp-server/src/tools/skill-tools.ts +11 -8
  70. package/neural-interface/i18n/en.json +501 -39
  71. package/neural-interface/i18n/pt-BR.json +501 -39
  72. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  73. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  74. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  75. package/neural-interface/lib/antigravity/bypass.js +100 -0
  76. package/neural-interface/lib/antigravity/catalog.js +273 -0
  77. package/neural-interface/lib/antigravity/home.js +260 -0
  78. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  79. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  80. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  81. package/neural-interface/lib/antigravity/policy.js +74 -0
  82. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  83. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  84. package/neural-interface/lib/antigravity/usage.js +43 -0
  85. package/neural-interface/lib/assistant-api.js +1 -0
  86. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  87. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  88. package/neural-interface/lib/assistant-budget-split.js +42 -15
  89. package/neural-interface/lib/assistant-catalog.js +76 -9
  90. package/neural-interface/lib/assistant-config.js +6 -3
  91. package/neural-interface/lib/assistant-dispatch.js +207 -49
  92. package/neural-interface/lib/assistant-envelope.js +153 -1
  93. package/neural-interface/lib/assistant-evidence.js +80 -0
  94. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  95. package/neural-interface/lib/assistant-persona.js +16 -11
  96. package/neural-interface/lib/assistant-plan-permissions.js +15 -0
  97. package/neural-interface/lib/assistant-router.js +237 -35
  98. package/neural-interface/lib/assistant-runtime.js +158 -12
  99. package/neural-interface/lib/assistant-task-prompt.js +10 -8
  100. package/neural-interface/lib/assistant-tools.js +2 -2
  101. package/neural-interface/lib/assistant-usage.js +29 -0
  102. package/neural-interface/lib/backup-service.js +6 -1
  103. package/neural-interface/lib/browser-guard-cdp.js +5 -4
  104. package/neural-interface/lib/browser-network-guard.js +274 -82
  105. package/neural-interface/lib/browser-tool-policy.js +12 -7
  106. package/neural-interface/lib/claude-agent-bridge.js +7 -0
  107. package/neural-interface/lib/claude-history-cache.js +210 -0
  108. package/neural-interface/lib/claude-model-catalog.js +5 -1
  109. package/neural-interface/lib/cli-install-api.js +1 -1
  110. package/neural-interface/lib/cli-install.js +160 -31
  111. package/neural-interface/lib/cli-resolver.js +9 -2
  112. package/neural-interface/lib/cli-update-planner.js +25 -15
  113. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  114. package/neural-interface/lib/codex-worker-app-server.js +25 -6
  115. package/neural-interface/lib/editor-git-api.js +3 -20
  116. package/neural-interface/lib/exec-loop-command.js +9 -2
  117. package/neural-interface/lib/file-explorer-api.js +74 -40
  118. package/neural-interface/lib/file-explorer-watch.js +9 -3
  119. package/neural-interface/lib/git-bash/install.js +52 -6
  120. package/neural-interface/lib/git-bash/manager.js +59 -17
  121. package/neural-interface/lib/git-bash/pins.js +12 -0
  122. package/neural-interface/lib/git-read.js +2 -2
  123. package/neural-interface/lib/git-status-runner.js +390 -0
  124. package/neural-interface/lib/git-status-watchdog.js +40 -0
  125. package/neural-interface/lib/greeting/budgets.js +1 -0
  126. package/neural-interface/lib/greeting/engine.js +2 -2
  127. package/neural-interface/lib/greeting/sources.js +10 -12
  128. package/neural-interface/lib/greeting/writer.js +1 -1
  129. package/neural-interface/lib/mcp-client-config.js +37 -6
  130. package/neural-interface/lib/mcp-external-servers.js +13 -4
  131. package/neural-interface/lib/mcp-installer.js +2 -1
  132. package/neural-interface/lib/memory-session-capture.js +17 -3
  133. package/neural-interface/lib/morelogin.js +147 -25
  134. package/neural-interface/lib/native-loop-providers.js +420 -21
  135. package/neural-interface/lib/native-loop-runtime.js +23 -2
  136. package/neural-interface/lib/opencode-native-boundary.js +11 -2
  137. package/neural-interface/lib/owner-authority.js +1 -1
  138. package/neural-interface/lib/path-confine.js +12 -9
  139. package/neural-interface/lib/peer-identity.js +32 -2
  140. package/neural-interface/lib/pty-host/core.js +28 -1
  141. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  142. package/neural-interface/lib/pty-host/manager.js +12 -1
  143. package/neural-interface/lib/remote-policy.js +1 -1
  144. package/neural-interface/lib/request-gate.js +3 -0
  145. package/neural-interface/lib/rulesets/api.js +6 -5
  146. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  147. package/neural-interface/lib/rulesets/installer.js +89 -10
  148. package/neural-interface/lib/rulesets/render.js +1 -1
  149. package/neural-interface/lib/session-cache-builder.js +64 -1
  150. package/neural-interface/lib/skills/catalog.js +5 -1
  151. package/neural-interface/lib/skills/creation-brief.js +1 -1
  152. package/neural-interface/lib/skills/creation-sources.js +19 -1
  153. package/neural-interface/lib/skills/deploy.js +9 -4
  154. package/neural-interface/lib/skills/draft-confinement.js +3 -1
  155. package/neural-interface/lib/skills/eval-confinement.js +3 -1
  156. package/neural-interface/lib/skills/eval-trace.js +16 -0
  157. package/neural-interface/lib/skills/export.js +5 -2
  158. package/neural-interface/lib/skills/known-bridge-digests.json +58 -4
  159. package/neural-interface/lib/skills/ownership.js +1 -1
  160. package/neural-interface/lib/skills/roots.js +10 -3
  161. package/neural-interface/lib/skills/runtime-checks.js +6 -3
  162. package/neural-interface/lib/skills/service.js +15 -7
  163. package/neural-interface/lib/skills/telemetry.js +6 -0
  164. package/neural-interface/lib/synabun-version.js +1 -1
  165. package/neural-interface/lib/system-activity.js +1 -1
  166. package/neural-interface/lib/whatsapp/brain.js +7 -3
  167. package/neural-interface/lib/whatsapp/cards.js +22 -9
  168. package/neural-interface/lib/whatsapp/config.js +1 -1
  169. package/neural-interface/lib/worker-confinement.js +77 -1
  170. package/neural-interface/lib/worker-question.js +74 -0
  171. package/neural-interface/lib/worker-resume.js +13 -4
  172. package/neural-interface/lib/worker-sandbox.js +46 -16
  173. package/neural-interface/package-lock.json +18 -2
  174. package/neural-interface/package.json +2 -1
  175. package/neural-interface/public/onboarding.html +1 -1
  176. package/neural-interface/public/shared/agent-runtime-options.js +89 -11
  177. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  178. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  179. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  180. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  181. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  182. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  183. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  184. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  185. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  186. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  187. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  188. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  189. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  190. package/neural-interface/public/shared/api.js +4 -4
  191. package/neural-interface/public/shared/assistant/asst-agents-dock.js +3 -4
  192. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  193. package/neural-interface/public/shared/assistant/asst-brain-picker.js +56 -9
  194. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  195. package/neural-interface/public/shared/assistant/asst-control.js +48 -0
  196. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  197. package/neural-interface/public/shared/assistant/asst-limit-dock.js +6 -1
  198. package/neural-interface/public/shared/assistant/asst-limit-wait.js +38 -5
  199. package/neural-interface/public/shared/assistant/asst-panel.js +45 -8
  200. package/neural-interface/public/shared/assistant/asst-render.js +51 -12
  201. package/neural-interface/public/shared/assistant/asst-route.js +237 -57
  202. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  203. package/neural-interface/public/shared/assistant/asst-scenes.js +54 -1
  204. package/neural-interface/public/shared/assistant/asst-sidepanel.js +51 -7
  205. package/neural-interface/public/shared/assistant/asst-slash.js +8 -2
  206. package/neural-interface/public/shared/assistant/asst-state.js +76 -9
  207. package/neural-interface/public/shared/assistant/asst-styles.js +34 -0
  208. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +34 -7
  209. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  210. package/neural-interface/public/shared/cdx/cdx-output.js +26 -3
  211. package/neural-interface/public/shared/cdx/cdx-panel.js +14 -2
  212. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  213. package/neural-interface/public/shared/cdx/cdx-protocol.js +11 -10
  214. package/neural-interface/public/shared/cdx/cdx-render.js +10 -9
  215. package/neural-interface/public/shared/cdx/cdx-requests.js +11 -1
  216. package/neural-interface/public/shared/cdx/cdx-styles.js +4 -0
  217. package/neural-interface/public/shared/cdx/cdx-tabs.js +75 -5
  218. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  219. package/neural-interface/public/shared/cli-install-view.js +7 -4
  220. package/neural-interface/public/shared/cli-status.js +9 -8
  221. package/neural-interface/public/shared/constants.js +3 -2
  222. package/neural-interface/public/shared/context-menu-model.js +1 -0
  223. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  224. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  225. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  226. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  227. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  228. package/neural-interface/public/shared/desktop-update-view.js +1 -0
  229. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  230. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  231. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  232. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  233. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  234. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  235. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  236. package/neural-interface/public/shared/html-shell.js +21 -4
  237. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +27 -7
  238. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  239. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
  240. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -0
  241. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +46 -3
  242. package/neural-interface/public/shared/provider-icons.js +4 -2
  243. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  244. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +1 -1
  245. package/neural-interface/public/shared/settings/settings-skill-folders.js +2 -2
  246. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  247. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  248. package/neural-interface/public/shared/skills/ss-creation.js +6 -3
  249. package/neural-interface/public/shared/skills/ss-dialog.js +5 -2
  250. package/neural-interface/public/shared/skills/ss-lint.js +9 -1
  251. package/neural-interface/public/shared/skills/ss-profiles.js +44 -6
  252. package/neural-interface/public/shared/skills/ss-review-view.js +2 -2
  253. package/neural-interface/public/shared/skills/studio/sx-actions.js +1 -1
  254. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +1 -1
  255. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +2 -1
  256. package/neural-interface/public/shared/skills/studio/sx-dom.js +2 -1
  257. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  258. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  259. package/neural-interface/public/shared/skills/studio/sx-inspector.js +1 -1
  260. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +9 -6
  261. package/neural-interface/public/shared/skills/studio/sx-install.js +20 -3
  262. package/neural-interface/public/shared/skills/studio/sx-library-view.js +144 -35
  263. package/neural-interface/public/shared/skills/studio/sx-library.js +6 -2
  264. package/neural-interface/public/shared/skills/studio/sx-main.js +11 -2
  265. package/neural-interface/public/shared/skills/studio/sx-review-view.js +1 -1
  266. package/neural-interface/public/shared/skills/studio/sx-subject.js +7 -6
  267. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +6 -5
  268. package/neural-interface/public/shared/state.js +1 -1
  269. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  270. package/neural-interface/public/shared/styles.css +354 -34
  271. package/neural-interface/public/shared/text-cache.js +29 -0
  272. package/neural-interface/public/shared/tool-list-picker.js +2 -2
  273. package/neural-interface/public/shared/tool-list-view.js +2 -2
  274. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  275. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  276. package/neural-interface/public/shared/ui-assistant.js +2 -0
  277. package/neural-interface/public/shared/ui-automation-studio.js +20 -12
  278. package/neural-interface/public/shared/ui-claude-panel.js +299 -77
  279. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  280. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  281. package/neural-interface/public/shared/ui-file-links.js +2 -2
  282. package/neural-interface/public/shared/ui-games.js +2 -2
  283. package/neural-interface/public/shared/ui-judgments.js +1 -1
  284. package/neural-interface/public/shared/ui-keybinds.js +8 -2
  285. package/neural-interface/public/shared/ui-link.js +3 -3
  286. package/neural-interface/public/shared/ui-menubar.js +2 -2
  287. package/neural-interface/public/shared/ui-native-loop-router.js +4 -0
  288. package/neural-interface/public/shared/ui-navbar.js +45 -0
  289. package/neural-interface/public/shared/ui-notifications.js +1 -0
  290. package/neural-interface/public/shared/ui-resume.js +9 -7
  291. package/neural-interface/public/shared/ui-schedules-studio.js +41 -10
  292. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  293. package/neural-interface/public/shared/ui-sessions.js +22 -12
  294. package/neural-interface/public/shared/ui-settings.js +90 -65
  295. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  296. package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -3
  297. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  298. package/neural-interface/public/shared/ui-sidepanel-windows.js +3 -3
  299. package/neural-interface/public/shared/ui-terminal.js +146 -10
  300. package/neural-interface/public/shared/ui-tool-updates.js +3 -3
  301. package/neural-interface/public/shared/ui-tooltip.js +71 -46
  302. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  303. package/neural-interface/public/shared/ui-whiteboard.js +1 -1
  304. package/neural-interface/public/shared/ui-worker-end.js +1 -1
  305. package/neural-interface/public/shared/whatsapp/wa-view.js +2 -2
  306. package/neural-interface/public/shared/worker-questions.js +34 -0
  307. package/neural-interface/public/sidepanel-session.html +1 -1
  308. package/neural-interface/server.js +644 -426
  309. package/neural-interface/templates/rulesets/README.md +1 -1
  310. package/neural-interface/templates/rulesets/legacy-hashes.json +5 -5
  311. package/neural-interface/templates/rulesets/manifest.json +1 -1
  312. package/npm-shrinkwrap.json +18 -2
  313. package/package.json +2 -1
  314. package/skills/skill-forge/SKILL.md +4 -4
  315. package/skills/synabun/SKILL.md +1 -1
  316. package/skills/synabun/modules/schedule.md +3 -3
  317. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -1799,6 +1799,12 @@
1799
1799
  0 8px 20px rgba(0,0,0,0.25),
1800
1800
  0 24px 48px rgba(0,0,0,0.18);
1801
1801
  }
1802
+ html.platform-win32 .menubar-dropdown,
1803
+ html.platform-win32 .menubar-submenu {
1804
+ background: rgba(28, 28, 32, 0.98);
1805
+ backdrop-filter: none;
1806
+ -webkit-backdrop-filter: none;
1807
+ }
1802
1808
 
1803
1809
  /* Arrow caret — seamless extension of the container */
1804
1810
  .menubar-dropdown::before {
@@ -3165,7 +3171,7 @@
3165
3171
  }
3166
3172
  .kb-cli-claude { color: #D4A27F; }
3167
3173
  .kb-cli-codex { color: #74c7a5; }
3168
- .kb-cli-gemini { color: #669DF6; }
3174
+ .kb-cli-antigravity { color: #669DF6; }
3169
3175
 
3170
3176
  /* Keycap-style buttons */
3171
3177
  .kb-key-btn {
@@ -4448,7 +4454,7 @@
4448
4454
 
4449
4455
  /* Setup tab: provider icon accents when section expanded */
4450
4456
  #setup-claude:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #d97757; }
4451
- #setup-gemini:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #4285f4; }
4457
+ #setup-antigravity:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #4285f4; }
4452
4458
  #setup-codex:not(.collapsed) .gfx-group-title .cc-provider-icon { color: #10a37f; }
4453
4459
 
4454
4460
  /* Setup tab: status badge */
@@ -6118,7 +6124,8 @@
6118
6124
  html.sp-resizing .claude-panel,
6119
6125
  html.sp-resizing .codex-panel,
6120
6126
  html.sp-resizing .ocp-panel,
6121
- html.sp-resizing .ocpv2-panel {
6127
+ html.sp-resizing .ocpv2-panel,
6128
+ html.sp-resizing .agy-panel {
6122
6129
  backdrop-filter: none !important;
6123
6130
  -webkit-backdrop-filter: none !important;
6124
6131
  background: rgba(18, 18, 20, 0.985) !important;
@@ -6130,18 +6137,18 @@
6130
6137
  top: calc(var(--navbar-height, 48px) + 20px);
6131
6138
  right: calc(20px + var(--right-panel-width, var(--claude-panel-width, 0px)));
6132
6139
  /* One row in the band between the left panels (Memory Explorer, File Explorer) and the right one, 20px clear of
6133
- each, never over a left panel: where the band is narrower than the row, the dock takes a line of its own under
6134
- the buttons (wrap-reverse: the buttons' line stays on top; see "Fit" below). What still reaches left of the
6140
+ each, never over a left panel: where the band is narrower than the row, the lowest-priority buttons leave it
6141
+ for the ⋯ menu (ui-topright-overflow.js; see "Fit" below), so the row never wraps. What still reaches left of the
6135
6142
  band (no band at all between wide panels, a dropdown that opens leftwards) is cut off at the band's edge:
6136
6143
  nothing of the toolbar is drawn, or takes a click, over a left panel. */
6137
- max-width: var(--topright-band);
6144
+ max-width: calc(var(--topright-band) - var(--topright-tray-inset));
6138
6145
  min-height: 40px; /* the dock's height: the buttons and the pills stay where they are when it hides */
6139
6146
  justify-content: flex-end;
6140
6147
  clip-path: inset(-100vh -100vw -200vh calc(var(--sidebar-total-width, 0px) + var(--right-panel-width, var(--claude-panel-width, 0px)) + 40px + 100% - 100vw));
6141
6148
  transition: right 0.3s cubic-bezier(0.22, 1, 0.36, 1);
6142
6149
  z-index: 400;
6143
6150
  display: flex;
6144
- flex-wrap: wrap-reverse;
6151
+ flex-wrap: nowrap;
6145
6152
  align-items: center;
6146
6153
  gap: 6px;
6147
6154
  font-family: inherit;
@@ -6172,6 +6179,8 @@
6172
6179
  display: flex;
6173
6180
  align-items: center;
6174
6181
  flex-shrink: 0;
6182
+ /* One line, always: what does not fit the band goes into the ⋯ menu (ui-topright-overflow.js). */
6183
+ flex-wrap: nowrap;
6175
6184
  gap: 2px;
6176
6185
  overflow: visible;
6177
6186
  background: rgba(18, 18, 22, 0.65);
@@ -6189,13 +6198,123 @@
6189
6198
  box-shadow: var(--shadow-lg), var(--shadow-highlight);
6190
6199
  }
6191
6200
 
6192
- /* The tools toggle and the agent side panels: one row of their own that never wraps, at the bar's right edge. */
6201
+ /* The ⋯, the tools toggle and the agent side panels: one row at the bar's right edge that never wraps. */
6193
6202
  #topright-buttons {
6203
+ position: relative;
6194
6204
  display: flex;
6195
6205
  align-items: center;
6196
6206
  flex-shrink: 0;
6207
+ flex-wrap: nowrap;
6197
6208
  gap: 6px;
6198
- min-height: 40px; /* the dock's height: a bar that wraps keeps its lines 40px apart, the buttons where they were */
6209
+ min-height: 40px; /* the dock's height: the buttons stay where they are when it hides */
6210
+ }
6211
+
6212
+ /* ── Overflow: a button that does not fit the band leaves the row for the ⋯ menu (ui-topright-overflow.js) ── */
6213
+ #topright-controls .tr-overflowed {
6214
+ display: none !important;
6215
+ }
6216
+ #topright-overflow-btn {
6217
+ display: none;
6218
+ }
6219
+ #topright-controls.has-overflow #topright-overflow-btn {
6220
+ display: flex;
6221
+ }
6222
+ /* The menu hangs from the bar's right edge, over the session pills (z-index inside the row's stacking context),
6223
+ opaque like the dock's other menus since its blur cannot reach the pills. */
6224
+ #topright-overflow-menu {
6225
+ position: absolute;
6226
+ top: calc(100% + 6px);
6227
+ right: 0;
6228
+ z-index: 3;
6229
+ min-width: 200px;
6230
+ max-width: calc(var(--topright-band) - var(--topright-tray-inset));
6231
+ max-height: calc(100vh - var(--navbar-height, 48px) - 90px);
6232
+ overflow-y: auto;
6233
+ display: flex;
6234
+ flex-direction: column;
6235
+ gap: 2px;
6236
+ padding: 4px;
6237
+ box-sizing: border-box;
6238
+ background: rgb(18, 18, 22);
6239
+ border: 1px solid var(--b-subtle, rgba(255, 255, 255, 0.06));
6240
+ border-radius: 10px;
6241
+ box-shadow: var(--shadow-lg), var(--shadow-highlight);
6242
+ }
6243
+ #topright-overflow-menu[hidden] {
6244
+ display: none;
6245
+ }
6246
+ .topright-overflow-item {
6247
+ position: relative;
6248
+ display: flex;
6249
+ align-items: center;
6250
+ gap: 8px;
6251
+ width: 100%;
6252
+ min-height: 30px;
6253
+ padding: 0 10px 0 8px;
6254
+ background: transparent;
6255
+ border: none;
6256
+ border-radius: 5px;
6257
+ color: var(--t-muted);
6258
+ font: 400 13px/1.45 inherit;
6259
+ font-family: inherit;
6260
+ text-align: left;
6261
+ cursor: pointer;
6262
+ white-space: nowrap;
6263
+ }
6264
+ .topright-overflow-item:hover,
6265
+ .topright-overflow-item:focus-visible {
6266
+ background: rgba(255, 255, 255, 0.08);
6267
+ color: var(--t-bright);
6268
+ outline: none;
6269
+ }
6270
+ .topright-overflow-item.active {
6271
+ color: var(--t-bright);
6272
+ }
6273
+ .topright-overflow-item.active::before {
6274
+ content: '';
6275
+ position: absolute;
6276
+ left: 2px;
6277
+ top: 50%;
6278
+ transform: translateY(-50%);
6279
+ width: 2.5px;
6280
+ height: 12px;
6281
+ border-radius: 2px;
6282
+ background: var(--accent-blue);
6283
+ }
6284
+ .topright-overflow-icon {
6285
+ display: flex;
6286
+ align-items: center;
6287
+ justify-content: center;
6288
+ width: 16px;
6289
+ flex-shrink: 0;
6290
+ }
6291
+ .topright-overflow-icon svg {
6292
+ width: 14px;
6293
+ height: 14px;
6294
+ stroke: currentColor;
6295
+ stroke-width: 1.7;
6296
+ fill: none;
6297
+ }
6298
+ .topright-overflow-icon svg[fill="currentColor"] {
6299
+ fill: currentColor;
6300
+ stroke: none;
6301
+ }
6302
+ .topright-overflow-label {
6303
+ flex: 1;
6304
+ min-width: 0;
6305
+ overflow: hidden;
6306
+ text-overflow: ellipsis;
6307
+ }
6308
+ .topright-overflow-item .topright-overflow-badge {
6309
+ position: static;
6310
+ font-size: 10px;
6311
+ min-width: 16px;
6312
+ height: 16px;
6313
+ line-height: 16px;
6314
+ padding: 0 4px;
6315
+ border-radius: 8px;
6316
+ text-align: center;
6317
+ font-weight: 600;
6199
6318
  }
6200
6319
 
6201
6320
  /* Hidden by the tools toggle (#topright-tools-btn, ui-navbar.js): the buttons and the pills stay where they are. */
@@ -6203,14 +6322,82 @@
6203
6322
  display: none;
6204
6323
  }
6205
6324
 
6206
- /* ── Fit: the buttons one row in any band, nothing hidden, nothing over a left panel ──
6325
+ /* ── The whiteboard rail toggle (ui-navbar.js): #wb-hide-btn at the rail's foot hides the rail (#wb-toolbar,
6326
+ pickers included: they are its children); the SynaBun logo button (#toolbar-show-btn) above the console button
6327
+ (#term-peek-dock) brings it back. Shown only while the whiteboard is (#static-bg.visible, Focus Mode). The
6328
+ workspace toolbar and the session pills are never touched. ── */
6329
+ #wb-toolbar {
6330
+ transition: opacity 0.22s ease, translate 0.22s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0s;
6331
+ }
6332
+ #wb-toolbar.wb-rail-hidden {
6333
+ opacity: 0;
6334
+ visibility: hidden;
6335
+ pointer-events: none;
6336
+ translate: -12px 0;
6337
+ transition: opacity 0.22s ease, translate 0.22s cubic-bezier(0.22, 1, 0.36, 1), visibility 0s linear 0.22s;
6338
+ }
6339
+ #toolbar-show-btn {
6340
+ position: fixed;
6341
+ left: calc(var(--sidebar-total-width, 0px) + 16px);
6342
+ bottom: 64px; /* directly above the console button (#term-peek-dock: 40px at bottom 16px), 8px between */
6343
+ z-index: 149;
6344
+ display: flex;
6345
+ align-items: center;
6346
+ justify-content: center;
6347
+ width: 40px;
6348
+ height: 40px;
6349
+ padding: 0;
6350
+ background: rgba(18, 18, 20, 0.85);
6351
+ backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
6352
+ -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.4);
6353
+ border: 1px solid rgba(255, 255, 255, 0.08);
6354
+ border-radius: 10px;
6355
+ box-shadow: var(--shadow-md), var(--shadow-highlight);
6356
+ cursor: pointer;
6357
+ animation: toolbar-show-in 0.22s cubic-bezier(0.22, 1, 0.36, 1);
6358
+ transition: background 0.2s, border-color 0.2s;
6359
+ }
6360
+ #toolbar-show-btn[hidden],
6361
+ body:not(:has(#static-bg.visible)) #toolbar-show-btn,
6362
+ body.fe-editor-open #toolbar-show-btn {
6363
+ display: none;
6364
+ }
6365
+ #toolbar-show-btn img {
6366
+ width: 22px;
6367
+ height: 22px;
6368
+ object-fit: contain;
6369
+ opacity: 0.75;
6370
+ pointer-events: none;
6371
+ transition: opacity 0.2s;
6372
+ }
6373
+ #toolbar-show-btn:hover {
6374
+ background: rgba(24, 24, 28, 0.95);
6375
+ border-color: rgba(255, 255, 255, 0.16);
6376
+ }
6377
+ #toolbar-show-btn:hover img,
6378
+ #toolbar-show-btn:focus-visible img {
6379
+ opacity: 1;
6380
+ }
6381
+ #toolbar-show-btn:focus-visible {
6382
+ outline: 1px solid rgba(255, 255, 255, 0.4);
6383
+ outline-offset: 2px;
6384
+ }
6385
+ @keyframes toolbar-show-in {
6386
+ from { opacity: 0; transform: translateY(6px) scale(0.92); }
6387
+ to { opacity: 1; transform: none; }
6388
+ }
6389
+ #wb-hide-btn svg {
6390
+ stroke-width: 2;
6391
+ }
6392
+
6393
+ /* ── Fit: one row in any band, nothing out of reach, nothing over a left panel ──
6207
6394
  --topright-row is the row at its widest without the workspace name: the dock (the switcher with its save button,
6208
6395
  50px; seven tools of 30px and the update button; two dividers; the dock's gaps and edges: 298px in all, 266px
6209
6396
  while the update button is hidden), then --topright-buttons, the tools toggle and the four agent buttons with
6210
- the gaps before them (190px). Below row + 45px of band the workspace name goes into the switcher's tooltip
6397
+ the gaps before them (222px: six 32px buttons, five 6px gaps). Below row + 45px of band the workspace name goes into the switcher's tooltip
6211
6398
  (--topright-compact; it shows from 40px on, up to 120px, and takes what the band leaves it). Below the row itself
6212
- the bar wraps (#topright-controls: flex-wrap: wrap-reverse): the toggle and the agent buttons stay on top, in one
6213
- row, and the dock takes a line of its own right under them, right-aligned, still one row. --topright-compact is
6399
+ nothing wraps: the buttons that do not fit leave the row for the ⋯ menu, lowest priority first
6400
+ (ui-topright-overflow.js OVERFLOW_ORDER, measured live). --topright-compact is
6214
6401
  1 below its width and 0 from it up (tan(atan2()) divides a length by a length); it lives on :root so that a
6215
6402
  style query reaches the name. Change --topright-row (or --topright-buttons) with the controls of the row. */
6216
6403
  @property --topright-compact {
@@ -6220,7 +6407,7 @@
6220
6407
  }
6221
6408
  :root {
6222
6409
  --topright-band: calc(100vw - var(--sidebar-total-width, 0px) - var(--right-panel-width, var(--claude-panel-width, 0px)) - 40px);
6223
- --topright-buttons: 190px;
6410
+ --topright-buttons: 222px;
6224
6411
  --topright-row: calc(298px + var(--topright-buttons));
6225
6412
  --topright-compact: clamp(0, tan(atan2(calc(var(--topright-row) + 45px - var(--topright-band)), 0.01px)), 1);
6226
6413
  }
@@ -6267,6 +6454,7 @@
6267
6454
  #topright-controls > #term-minimized-tray > .term-minimized-pill .term-minimized-pill-label,
6268
6455
  #topright-controls > #term-minimized-tray > .term-minimized-pill:hover .term-minimized-pill-label {
6269
6456
  max-width: clamp(28px, calc(var(--topright-band) - var(--topright-tray-inset) - 62px), 100px);
6457
+ transition: none;
6270
6458
  }
6271
6459
 
6272
6460
  /* ── Thin divider between groups ── */
@@ -6389,11 +6577,13 @@
6389
6577
  }
6390
6578
 
6391
6579
  /* ── Standalone buttons outside the unified bar (the tools toggle, the side panels) ── */
6580
+ #topright-overflow-btn,
6392
6581
  #topright-tools-btn,
6393
6582
  #topright-assistant-panel-btn,
6394
6583
  #topright-claude-panel-btn,
6395
6584
  #topright-codex-panel-btn,
6396
- #topright-opencode-panel-btn {
6585
+ #topright-opencode-panel-btn,
6586
+ #topright-antigravity-panel-btn {
6397
6587
  background: rgba(18, 18, 22, 0.65);
6398
6588
  backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
6399
6589
  -webkit-backdrop-filter: blur(var(--blur-heavy)) saturate(1.3);
@@ -6403,11 +6593,13 @@
6403
6593
  width: 32px;
6404
6594
  height: 32px;
6405
6595
  }
6596
+ #topright-overflow-btn:hover,
6406
6597
  #topright-tools-btn:hover,
6407
6598
  #topright-assistant-panel-btn:hover,
6408
6599
  #topright-claude-panel-btn:hover,
6409
6600
  #topright-codex-panel-btn:hover,
6410
- #topright-opencode-panel-btn:hover {
6601
+ #topright-opencode-panel-btn:hover,
6602
+ #topright-antigravity-panel-btn:hover {
6411
6603
  background: rgba(24, 24, 30, 0.8);
6412
6604
  border-color: rgba(255, 255, 255, 0.1);
6413
6605
  }
@@ -7666,7 +7858,7 @@
7666
7858
  .ocpv2-session-pill, .ocpv2-part-tool, .ocpv2-input-wrap, .ocpv2-compose-btn,
7667
7859
  .ocp-session-pill, .ocp-tool-card, .ocp-input-shell, .term-minimized-pill-label)::before,
7668
7860
  body.ui-interacting :is(.wb-tool.locked, .cp-session-pill,
7669
- .cxp-session-pill, .ocpv2-session-pill,
7861
+ .cxp-session-pill, .ocpv2-session-pill, .agy-session-pill,
7670
7862
  .ocp-session-pill, .term-minimized-pill-label)::after { animation-play-state: paused !important; }
7671
7863
 
7672
7864
  /* Hidden tab: freeze the 30+ infinite glow/pulse animations so a background
@@ -8520,9 +8712,8 @@
8520
8712
  z-index: 500000;
8521
8713
  padding: 5px 10px;
8522
8714
  border-radius: 6px;
8523
- background: rgba(30, 34, 44, 0.92);
8715
+ background: rgba(26, 30, 40, 0.96);
8524
8716
  border: 1px solid rgba(255,255,255,0.08);
8525
- backdrop-filter: blur(12px);
8526
8717
  color: rgba(255,255,255,0.85);
8527
8718
  font-size: 12.5px;
8528
8719
  font-family: inherit;
@@ -9789,8 +9980,15 @@
9789
9980
  .sm-backdrop.backdrop-hidden,
9790
9981
  .ig-backdrop.backdrop-hidden {
9791
9982
  opacity: 0 !important;
9983
+ backdrop-filter: none !important;
9984
+ -webkit-backdrop-filter: none !important;
9792
9985
  pointer-events: none;
9793
9986
  }
9987
+ html.platform-win32 .studio-backdrop {
9988
+ background: rgba(5, 5, 8, 0.62);
9989
+ backdrop-filter: none;
9990
+ -webkit-backdrop-filter: none;
9991
+ }
9794
9992
 
9795
9993
  /* ── Settings Panel (draggable/pinnable) ── */
9796
9994
  .settings-panel {
@@ -14011,8 +14209,8 @@
14011
14209
  .settings-panel .stg-card .stg-mcp-form-grid .stg-field { margin-bottom: 0; }
14012
14210
  /* a field of the Add-a-server form is half the form wide: a popup or a number stacks under its label like the text
14013
14211
  fields beside it, instead of taking the label's line and squeezing the label and the help into what is left */
14014
- .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, input[type="number"])) { display: block; }
14015
- .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, input[type="number"])) > label { margin: 0 0 6px; }
14212
+ .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, .cc-dropdown, input[type="number"])) { display: block; }
14213
+ .settings-panel .stg-card .stg-mcp-form-grid .stg-field:has(> :is(select, .cc-dropdown, input[type="number"])) > label { margin: 0 0 6px; }
14016
14214
  .settings-panel .stg-card .stg-mcp-form-label { font-size: 12px; color: var(--stg-help); }
14017
14215
  .settings-panel .stg-card .stg-mcp-env-add { font-size: 12px; color: var(--stg-body); }
14018
14216
  .settings-panel .stg-card .stg-mcp-gh-optrun { font-size: 13px; color: var(--stg-text); }
@@ -16514,6 +16712,28 @@
16514
16712
  flex-shrink: 0;
16515
16713
  }
16516
16714
  .fe-branch-btn-badge:empty { display: none; }
16715
+ /* Scan state: a dot in the corner, out of the flow, so no state moves the row (words: tooltip, label, popover). */
16716
+ .fe-branch-btn-state {
16717
+ position: absolute;
16718
+ top: 2px;
16719
+ right: 2px;
16720
+ width: 4px;
16721
+ height: 4px;
16722
+ border-radius: 50%;
16723
+ background: transparent;
16724
+ pointer-events: none;
16725
+ }
16726
+ .fe-branch-btn[data-scan-state="scanning"] .fe-branch-btn-state { background: var(--t-secondary); }
16727
+ .fe-branch-btn[data-scan-state="timed-out"] .fe-branch-btn-state { background: var(--fe-git-modified); }
16728
+ .fe-branch-btn[data-scan-state="failed"] .fe-branch-btn-state { background: var(--fe-git-deleted); }
16729
+ .fe-branch-btn[data-scan-state="scanning"] > svg { opacity: 0.5; }
16730
+ .fe-branch-btn--placeholder .fe-branch-btn-name { color: var(--t-secondary); }
16731
+ @media (prefers-reduced-motion: no-preference) {
16732
+ .fe-branch-btn[data-scan-state="scanning"] .fe-branch-btn-state { animation: fe-git-scan-pulse 1.2s ease-in-out infinite; }
16733
+ }
16734
+ @keyframes fe-git-scan-pulse { 50% { opacity: 0.3; } }
16735
+ /* Read out by screen readers only; takes no room in the row. */
16736
+ .fe-git-scan-live { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
16517
16737
 
16518
16738
  /* ── Git popover ── */
16519
16739
  .fe-git-popover {
@@ -16668,6 +16888,15 @@
16668
16888
  line-height: 1.5;
16669
16889
  }
16670
16890
  .fe-git-summary:empty { display: none; }
16891
+ .fe-git-scan-state {
16892
+ font-size: 10.5px;
16893
+ font-family: var(--ff-mono);
16894
+ color: var(--t-secondary);
16895
+ line-height: 1.5;
16896
+ }
16897
+ .fe-git-scan-state[hidden] { display: none; }
16898
+ .fe-git-scan-state[data-tone="timed-out"] { color: var(--fe-git-modified); }
16899
+ .fe-git-scan-state[data-tone="failed"] { color: var(--fe-git-deleted); }
16671
16900
  .fe-git-summary .gs-m { color: var(--fe-git-modified); }
16672
16901
  .fe-git-summary .gs-a { color: var(--fe-git-new); }
16673
16902
  .fe-git-summary .gs-d { color: var(--fe-git-deleted); }
@@ -19463,7 +19692,7 @@
19463
19692
  .sx .sx-menu-item--danger:hover { color: var(--sx-err); }
19464
19693
 
19465
19694
  /* ── Workspace ── */
19466
- .sx-ws-head { flex: none; padding: 8px 16px 0; display: grid; gap: 8px; position: relative; }
19695
+ .sx-ws-head { flex: none; padding: 12px 16px 0; display: grid; gap: 8px; position: relative; }
19467
19696
  .sx-crumb { display: flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--t-secondary); }
19468
19697
  .sx-ws-title { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
19469
19698
  .sx-ws-name { margin: 0; font: 600 calc(18px * var(--font-scale, 1))/1.3 var(--ff-heading); color: var(--t-bright); overflow-wrap: anywhere; }
@@ -19739,7 +19968,14 @@
19739
19968
  .sx .sx-status--review, .sx .sx-status--changes { color: var(--sx-info); border-color: var(--b-visible); }
19740
19969
  .sx .sx-status--draft { color: var(--sx-gold); border-color: color-mix(in oklab, var(--sx-gold) 40%, transparent); }
19741
19970
  .sx .sx-status--none { color: var(--t-secondary); }
19742
- .sx-health-cell { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; max-width: 100%; }
19971
+ /* One pill box for every pill of the Studio (kind tag, status, health): the same height as a small button, so a
19972
+ row of pills and buttons lines up in the Library cell and in the workspace head. */
19973
+ .sx .sx-tag, .sx .sx-status, .sx .sx-health {
19974
+ display: inline-flex; align-items: center; gap: 6px; box-sizing: border-box;
19975
+ min-height: 24px; padding: 2px 8px; border-radius: 6px; line-height: 1.3;
19976
+ }
19977
+ .sx .sx-tag { display: inline-block; line-height: 18px; }
19978
+ .sx-health-cell { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; max-width: 100%; }
19743
19979
  .sx-health-cell .sx-status { white-space: normal; }
19744
19980
  .sx-health-cell .sx-status > span { white-space: normal; overflow: visible; }
19745
19981
  .sx .sx-banner-lines { display: grid; gap: 2px; margin-top: 4px; color: var(--t-primary); }
@@ -20157,6 +20393,87 @@
20157
20393
  .ss-dlg-error { margin: 4px 0 0; min-height: 1em; color: hsla(0, 70%, 72%, 1); font-size: var(--fs-xs); }
20158
20394
  .ss-dlg-error:empty { display: none; }
20159
20395
 
20396
+ /* ── A delete that is typed to confirm (sx-library-view.js deleteConfirmBox) ──
20397
+ One row per item, the consequence, then the field; Delete stays off until the word matches. */
20398
+ .ss-dlg.ss-dlg--confirm { width: min(480px, calc(100% - 32px)); max-height: calc(100% - 40px); padding: 20px 20px 16px; }
20399
+ .ss-dlg--confirm .ss-dlg-title { font-size: var(--fs-md, 15px); margin-bottom: 12px; }
20400
+ .ss-dlg--confirm .ss-dlg-actions { margin-top: 16px; gap: 8px; align-items: stretch; }
20401
+ .ss-dlg--confirm .ss-dlg-btn { min-width: 88px; height: 30px; padding: 0 14px; display: inline-flex; align-items: center; justify-content: center; }
20402
+ .ss-dlg--confirm .ss-dlg-btn--danger:disabled { opacity: 0.45; }
20403
+ .sx-del { display: flex; flex-direction: column; gap: 12px; }
20404
+ .sx-del-list {
20405
+ list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column;
20406
+ border: 1px solid var(--b-subtle); border-radius: 9px; background: var(--s-light); overflow: hidden;
20407
+ }
20408
+ .sx-del-item {
20409
+ display: grid; grid-template-columns: 18px minmax(0, 1fr) auto auto; align-items: center; gap: 4px 10px;
20410
+ padding: 8px 12px; min-height: 40px; box-sizing: border-box;
20411
+ }
20412
+ .sx-del-item + .sx-del-item, .sx-del-more { border-top: 1px solid var(--b-subtle); }
20413
+ .sx-del-icon { display: inline-grid; place-items: center; color: var(--t-secondary); }
20414
+ .sx-del-icon svg { width: 15px; height: 15px; }
20415
+ .sx-del-main { display: flex; flex-direction: column; min-width: 0; }
20416
+ .sx-del-name { color: var(--t-bright); font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20417
+ .sx-del-path {
20418
+ color: var(--t-secondary); font: 400 var(--sx-meta, 11px)/1.4 var(--ff-mono, 'JetBrains Mono', monospace);
20419
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
20420
+ }
20421
+ .sx-del-kind, .sx-del-effect {
20422
+ font-size: var(--sx-meta, 11px); line-height: 1; padding: 4px 7px; border-radius: 5px; white-space: nowrap;
20423
+ border: 1px solid var(--b-light); color: var(--t-primary);
20424
+ }
20425
+ .sx-del-effect--disk { color: var(--sx-err); border-color: color-mix(in oklab, var(--sx-err) 35%, transparent); background: color-mix(in oklab, var(--sx-err) 8%, transparent); }
20426
+ .sx-del-effect--library { color: var(--t-primary); background: var(--s-medium); }
20427
+ .sx-del-more { padding: 6px 12px 8px 40px; color: var(--t-secondary); font-size: var(--sx-meta, 11px); }
20428
+ .ss-dlg-body p.sx-del-note { display: flex; gap: 8px; align-items: flex-start; margin: 0; color: var(--t-primary); }
20429
+ .sx-del-note svg { flex: none; width: 14px; height: 14px; margin-top: 2px; color: var(--t-secondary); }
20430
+ .sx-del-note--danger svg { color: var(--sx-err); }
20431
+ .sx-del-field { display: flex; flex-direction: column; gap: 6px; padding-top: 4px; }
20432
+ .sx-del-label { color: var(--t-primary); }
20433
+ .sx-del-word {
20434
+ font: 500 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace); color: var(--t-bright);
20435
+ padding: 2px 6px; margin: 0 2px; border-radius: 4px; background: var(--s-medium); border: 1px solid var(--b-light);
20436
+ }
20437
+ .sx-del-input {
20438
+ width: 100%; height: 32px; padding: 0 10px; box-sizing: border-box;
20439
+ background: var(--sx-field, rgba(255,255,255,0.04)); border: 1px solid var(--b-light); border-radius: 5px;
20440
+ color: var(--t-bright); font: 400 var(--fs-xs)/1 var(--ff-mono, 'JetBrains Mono', monospace);
20441
+ transition: border-color 0.12s, box-shadow 0.12s;
20442
+ }
20443
+ .sx-del-input:hover { border-color: var(--b-visible); }
20444
+ .sx-del-input:focus { outline: none; border-color: color-mix(in oklab, var(--sx-err) 55%, transparent); box-shadow: 0 0 0 3px color-mix(in oklab, var(--sx-err) 14%, transparent); }
20445
+ @media (max-width: 520px) {
20446
+ .sx-del-item { grid-template-columns: 18px minmax(0, 1fr) auto; }
20447
+ .sx-del-kind { display: none; }
20448
+ }
20449
+
20450
+ /* ── The fix panel (sx-fixes-view.js): a card per problem, its meaning and its buttons ── */
20451
+ .sx .sx-health--fix { cursor: pointer; font-family: inherit; transition: filter 0.12s, border-color 0.12s; }
20452
+ .sx .sx-health--fix:hover { filter: brightness(1.15); border-color: currentColor; }
20453
+ .sx .sx-health--fix:focus-visible { outline: 2px solid var(--sx-focus); outline-offset: 1px; }
20454
+ .sx-fix-panel { display: flex; flex-direction: column; gap: 8px; margin-top: 4px; }
20455
+ .sx-fix-card { padding: 10px 12px; border: 1px solid var(--b-subtle); border-left-width: 3px; border-radius: 9px; background: var(--s-light); }
20456
+ .sx-fix-card--err { border-left-color: var(--sx-err); }
20457
+ .sx-fix-card--warn { border-left-color: var(--sx-warn); }
20458
+ .sx-fix-card--info { border-left-color: var(--b-visible); }
20459
+ .sx-fix-card-head { display: flex; align-items: center; gap: 8px; color: var(--t-bright); }
20460
+ .sx-fix-card-head svg { width: 14px; height: 14px; flex: none; }
20461
+ .sx-fix-card--err .sx-fix-card-head svg { color: var(--sx-err); }
20462
+ .sx-fix-card--warn .sx-fix-card-head svg { color: var(--sx-warn); }
20463
+ .sx-fix-mode { margin-left: auto; font-size: var(--sx-meta, 11px); line-height: 1; padding: 4px 7px; border-radius: 5px; border: 1px solid var(--b-light); color: var(--t-secondary); white-space: nowrap; }
20464
+ .sx-fix-mode--auto { color: var(--sx-ok); border-color: color-mix(in oklab, var(--sx-ok) 35%, transparent); }
20465
+ .ss-dlg-body p.sx-fix-explain { margin: 6px 0 8px; color: var(--t-primary); }
20466
+ .sx-fix-actions { display: flex; flex-wrap: wrap; gap: 6px; }
20467
+ .sx-fix-actions .sx-dim { margin: 0; }
20468
+ .sx-fix-preview { margin: 4px 0 0; padding: 0; list-style: none; border: 1px solid var(--b-subtle); border-radius: 9px; background: var(--s-light); }
20469
+ .sx-fix-preview-row { padding: 7px 12px; color: var(--t-primary); }
20470
+ .sx-fix-preview-row + .sx-fix-preview-row { border-top: 1px solid var(--b-subtle); }
20471
+ .sx-fix-choose { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
20472
+ .sx-fix-choice { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border: 1px solid var(--b-subtle); border-radius: 9px; cursor: pointer; }
20473
+ .sx-fix-choice:has(input:checked) { border-color: var(--b-visible); background: var(--s-light); }
20474
+ .sx-fix-choice:has(input:disabled) { opacity: 0.5; cursor: default; }
20475
+ .sx .sx-fix-notice .sx-btn { flex: none; }
20476
+
20160
20477
  /* ── An import's review ── */
20161
20478
  .ss-review { display: flex; flex-direction: column; gap: 8px; }
20162
20479
  .ss-review-row { display: flex; gap: 10px; align-items: baseline; }
@@ -22009,7 +22326,7 @@
22009
22326
  .as-launch-profile[data-profile="codex"].active .as-launch-profile-name {
22010
22327
  color: hsla(160, 45%, 72%, 0.95);
22011
22328
  }
22012
- .as-launch-profile[data-profile="gemini"].active .as-launch-profile-name {
22329
+ .as-launch-profile[data-profile="antigravity"].active .as-launch-profile-name {
22013
22330
  color: hsla(210, 55%, 78%, 0.95);
22014
22331
  }
22015
22332
  .as-launch-profile-name {
@@ -24571,6 +24888,16 @@
24571
24888
  transition: none !important;
24572
24889
  }
24573
24890
  }
24891
+ html.platform-win32 .term-minimized-pill,
24892
+ html.desktop-titlebar--win32 .term-minimized-pill {
24893
+ background: rgba(20, 20, 26, 0.94);
24894
+ backdrop-filter: none;
24895
+ -webkit-backdrop-filter: none;
24896
+ }
24897
+ html.platform-win32 .term-minimized-pill:hover,
24898
+ html.desktop-titlebar--win32 .term-minimized-pill:hover {
24899
+ background: rgba(30, 30, 38, 0.96);
24900
+ }
24574
24901
 
24575
24902
  /* Genie minimize/restore animation on floating tabs (class toggled by
24576
24903
  ui-terminal.js minimizeTab/restoreTab only while it runs) */
@@ -28029,16 +28356,8 @@
28029
28356
  color: #000;
28030
28357
  border-color: var(--c-accent, #6aa9ff);
28031
28358
  }
28032
- .sm-pr-select {
28033
- flex: 1;
28034
- background: var(--s-subtle, rgba(255,255,255,0.04));
28035
- color: var(--t-primary, #fff);
28036
- border: 1px solid var(--b-subtle, rgba(255,255,255,0.1));
28037
- border-radius: var(--r-small, 6px);
28038
- padding: 6px 8px;
28039
- font-size: 11px;
28040
- }
28041
- .sm-pr-select:disabled { opacity: 0.5; }
28359
+ /* The model list is the app's styled dropdown (cc-dropdown.js): it takes the row's width. */
28360
+ .sm-pr-row > .cc-dropdown.sm-pr-dropdown { flex: 1; min-width: 0; }
28042
28361
 
28043
28362
  /* ── Section labels ── */
28044
28363
  .sm-section-label {
@@ -29204,3 +29523,4 @@ body .styleguide-panel {
29204
29523
  .ocpv2-tools-picker .cc-dropdown-trigger { min-width: 0; max-width: 160px; border: none; background: transparent; color: var(--t-primary); font-family: inherit; }
29205
29524
 
29206
29525
  .ocpv2-tools-picker .tool-list-picker .cc-dropdown-menu { background: rgba(22,22,26,0.98); }
29526
+
@@ -0,0 +1,29 @@
1
+ // String caches need a size budget as well as an entry count: streaming
2
+ // revisions are different keys and may each hold a nearly complete transcript.
3
+ export function createTextCache({ maxEntries = 512, maxChars = 1_000_000, maxEntryChars = 64_000 } = {}) {
4
+ const entries = new Map();
5
+ let chars = 0;
6
+ const drop = key => {
7
+ const value = entries.get(key);
8
+ if (value === undefined) return;
9
+ chars -= key.length + value.length;
10
+ entries.delete(key);
11
+ };
12
+ return {
13
+ get(key) {
14
+ const value = entries.get(key);
15
+ if (value !== undefined) { entries.delete(key); entries.set(key, value); }
16
+ return value;
17
+ },
18
+ set(key, value) {
19
+ drop(key);
20
+ const size = key.length + value.length;
21
+ if (size > Math.min(maxChars, maxEntryChars) || maxEntries < 1) return;
22
+ while (entries.size && (entries.size >= maxEntries || chars + size > maxChars)) drop(entries.keys().next().value);
23
+ entries.set(key, value);
24
+ chars += size;
25
+ },
26
+ clear() { entries.clear(); chars = 0; },
27
+ stats: () => ({ entries: entries.size, chars }),
28
+ };
29
+ }
@@ -11,7 +11,7 @@ export function toolPickerHTML(id, tools, options = {}) {
11
11
  if (!catalog) return '';
12
12
  const view = toolListView(catalog, tools, { translate, ...options });
13
13
  return dropdownHTML(id, view.entries, { multiple: true, label: toolWord('label'), classes: 'tool-list-picker',
14
- summary: view.summary, ...options, classes: `tool-list-picker ${options.classes || ''}`.trim(), attrs: `data-tool-options="${encodeURIComponent(JSON.stringify({ inheritLabel: options.inheritLabel, usesBrowser: options.usesBrowser, taskClass: options.taskClass, cwd: options.cwd, provider: options.provider, includeServers: options.includeServers, externalSelection: catalog.externalServersVersion >= 2 && options.includeServers !== false && options.provider !== 'gemini', externalRefs: (tools ?? catalog.defaultTools ?? []).filter(id => id.startsWith('mcp:')) }))}"` });
14
+ summary: view.summary, ...options, classes: `tool-list-picker ${options.classes || ''}`.trim(), attrs: `data-tool-options="${encodeURIComponent(JSON.stringify({ inheritLabel: options.inheritLabel, usesBrowser: options.usesBrowser, taskClass: options.taskClass, cwd: options.cwd, provider: options.provider, includeServers: options.includeServers, externalSelection: catalog.externalServersVersion >= 2 && options.includeServers !== false && options.provider !== 'antigravity', externalRefs: (tools ?? catalog.defaultTools ?? []).filter(id => id.startsWith('mcp:')) }))}"` });
15
15
  }
16
16
  export function updateToolPicker(input, tools, options = {}) {
17
17
  options = { ...JSON.parse(decodeURIComponent(dropdownOf(input)?.dataset.toolOptions || '%7B%7D')), ...options };
@@ -20,7 +20,7 @@ export function updateToolPicker(input, tools, options = {}) {
20
20
  const view = toolListView(catalog, tools, { translate, ...options });
21
21
  setDropdownItems(input, view.entries);
22
22
  const dd = dropdownOf(input);
23
- if (dd) dd.dataset.toolOptions = encodeURIComponent(JSON.stringify({ inheritLabel: options.inheritLabel, usesBrowser: options.usesBrowser, taskClass: options.taskClass, cwd: options.cwd, provider: options.provider, includeServers: options.includeServers, externalSelection: catalog.externalServersVersion >= 2 && options.includeServers !== false && options.provider !== 'gemini', externalRefs: (tools ?? catalog.defaultTools ?? []).filter(id => id.startsWith('mcp:')) }));
23
+ if (dd) dd.dataset.toolOptions = encodeURIComponent(JSON.stringify({ inheritLabel: options.inheritLabel, usesBrowser: options.usesBrowser, taskClass: options.taskClass, cwd: options.cwd, provider: options.provider, includeServers: options.includeServers, externalSelection: catalog.externalServersVersion >= 2 && options.includeServers !== false && options.provider !== 'antigravity', externalRefs: (tools ?? catalog.defaultTools ?? []).filter(id => id.startsWith('mcp:')) }));
24
24
  const label = dropdownOf(input)?.querySelector('.cc-dropdown-value');
25
25
  if (label) { label.textContent = view.summary; label.title = view.summary; }
26
26
  }
@@ -45,7 +45,7 @@ function groupWord(group, field, translate) {
45
45
  return group[field];
46
46
  }
47
47
 
48
- export const strictToolHost = provider => provider === 'opencode' || provider === 'gemini';
48
+ export const strictToolHost = provider => provider === 'opencode' || provider === 'antigravity';
49
49
  export const taskToolHost = provider => strictToolHost(provider) || provider === 'claude-code' || provider === 'codex';
50
50
 
51
51
  /** Hidden-input encoding: inheritance differs from an explicit empty group list. */
@@ -87,7 +87,7 @@ export function toolListView(catalog, tools, { inheritLabel = null, usesBrowser,
87
87
  });
88
88
  if (options.length) entries.push({ group: word(section), options });
89
89
  }
90
- if (includeServers && provider !== 'gemini' && catalog?.externalServersVersion >= 2) {
90
+ if (includeServers && provider !== 'antigravity' && catalog?.externalServersVersion >= 2) {
91
91
  const wildcard = refs.includes('mcp:*');
92
92
  const rows = (catalog.servers || []).filter(row => row.selectable !== false);
93
93
  // A saved unavailable ref stays visible and round-trips; loading a catalog never silently clears it.