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
@@ -2,24 +2,25 @@
2
2
  // SynaBun Neural Interface — Resume Sessions
3
3
  // Toolbar dropdown for browsing and resuming
4
4
  // past CLI sessions across projects.
5
- // Supports: Claude Code, Codex CLI, Gemini CLI, OpenCode.
5
+ // Supports: Claude Code, Codex CLI, Antigravity CLI, OpenCode.
6
6
  // ═══════════════════════════════════════════
7
7
 
8
8
  import { emit, on } from './state.js';
9
- import { fetchClaudeSessions, fetchCodexSessions, fetchOpencodeSessions, fetchGeminiSessions, searchMemories, searchSessions, startSessionIndexing, cancelSessionIndexing, fetchIndexingStatus } from './api.js';
9
+ import { fetchClaudeSessions, fetchCodexSessions, fetchOpencodeSessions, fetchAntigravitySessions, searchMemories, searchSessions, startSessionIndexing, cancelSessionIndexing, fetchIndexingStatus } from './api.js';
10
10
  import { isGuest, hasPermission } from './ui-sync.js';
11
11
  import { storage } from './storage.js';
12
12
  import { getProviderMeta, PROVIDER_META } from './provider-icons.js';
13
+ import { migrateProviderId } from './agent-runtime-options.js';
13
14
 
14
15
  const $ = (id) => document.getElementById(id);
15
16
 
16
17
  // ── CLI providers for Resume ──
17
- const RESUME_PROVIDERS = ['claude-code', 'codex', 'gemini', 'opencode'];
18
+ const RESUME_PROVIDERS = ['claude-code', 'codex', 'antigravity', 'opencode'];
18
19
  const PROVIDER_FETCH = {
19
20
  'claude-code': fetchClaudeSessions,
20
21
  'codex': fetchCodexSessions,
21
22
  'opencode': fetchOpencodeSessions,
22
- 'gemini': fetchGeminiSessions,
23
+ 'antigravity': fetchAntigravitySessions,
23
24
  };
24
25
 
25
26
  // ── State ──
@@ -28,7 +29,7 @@ let _searchDebounce = null;
28
29
  let _currentSearch = '';
29
30
  let _expandedProject = null; // path of currently expanded project
30
31
  let _loading = false;
31
- let _selectedProvider = storage.getItem('synabun-resume-provider') || 'claude-code';
32
+ let _selectedProvider = migrateProviderId(storage.getItem('synabun-resume-provider') || 'claude-code');
32
33
  const _projectsByProvider = new Map();
33
34
  const _loadPromises = new Map();
34
35
 
@@ -177,9 +178,10 @@ async function loadAllProjects(search = '') {
177
178
  _loading = true;
178
179
  try {
179
180
  // When actively searching, route through the FTS5 + semantic hybrid endpoint
180
- // so we match the full session body, not just the first prompt.
181
+ // so we match the full session body, not just the first prompt (every provider,
182
+ // Antigravity's conversations too: lib/session-cache-builder.js).
181
183
  let projects;
182
- if (search && search.trim().length >= 2 && provider !== 'gemini') {
184
+ if (search && search.trim().length >= 2) {
183
185
  const data = await searchSessions({
184
186
  q: search,
185
187
  provider,
@@ -13,6 +13,7 @@ import { KEYS } from './constants.js';
13
13
  import { isGuest, hasPermission, showGuestToast } from './ui-sync.js';
14
14
  import { registerLaunchPrefetch } from './launch-prefetch.js';
15
15
  import { sendToPanel } from './ui-claude-panel.js';
16
+ import { openAntigravityWithPrompt } from './ui-antigravity-panel.js';
16
17
  import { getProviderMeta } from './provider-icons.js';
17
18
  import {
18
19
  getNativeLoopRouterClaimToken,
@@ -29,6 +30,9 @@ import {
29
30
  getModelsForProfile,
30
31
  formatModelOptionLabel,
31
32
  isDynamicModelProfile,
33
+ migrateLaunchRecords,
34
+ migrateProviderId,
35
+ migrateProviderModel,
32
36
  modelSelectorValue,
33
37
  modelMatchesSelector,
34
38
  normalizeEffortForProfile,
@@ -143,9 +147,9 @@ let _promptBackdrop = null;
143
147
  let _promptKeyHandler = null;
144
148
  const _modelLoadRequests = new Set();
145
149
 
146
- let _launchProfile = storage.getItem('as-launch-profile') || 'claude-code';
150
+ let _launchProfile = migrateProviderId(storage.getItem('as-launch-profile') || 'claude-code');
147
151
  const _storedLaunchSelection = normalizeAutomationSelection(
148
- _launchProfile, storage.getItem('as-launch-model'), storage.getItem('as-launch-context-mode'),
152
+ _launchProfile, migrateProviderModel(_launchProfile, storage.getItem('as-launch-model')), storage.getItem('as-launch-context-mode'),
149
153
  );
150
154
  let _launchModel = _storedLaunchSelection.model;
151
155
  let _launchContextMode = _storedLaunchSelection.contextMode || 'default';
@@ -583,16 +587,17 @@ async function loadData() {
583
587
  ]);
584
588
  if (seq !== _loadSeq) return; // a newer load is under way: it finishes for both
585
589
  const failed = [];
590
+ // A record still saved for the Gemini CLI reads as Antigravity's (migrateLaunchRecords).
586
591
  if (schedules.status === 'fulfilled' && Array.isArray(schedules.value)) {
587
- _schedules = schedules.value;
592
+ _schedules = migrateLaunchRecords(schedules.value);
588
593
  _loaded.schedules = true;
589
594
  } else failed.push(['schedules', failureReason(schedules)]);
590
595
  if (templates.status === 'fulfilled' && Array.isArray(templates.value)) {
591
- _templates = templates.value;
596
+ _templates = migrateLaunchRecords(templates.value);
592
597
  _loaded.templates = true;
593
598
  } else failed.push(['automations', failureReason(templates)]);
594
599
  if (groups.status === 'fulfilled' && Array.isArray(groups.value)) {
595
- _groups = groups.value;
600
+ _groups = migrateLaunchRecords(groups.value);
596
601
  _loaded.groups = true;
597
602
  if (groupIdOf(_scope) && !getGroup(groupIdOf(_scope))) setScope('all', { keepEditors: true });
598
603
  } else failed.push(['groups', failureReason(groups)]);
@@ -633,7 +638,7 @@ async function loadTimers() {
633
638
  const failed = [];
634
639
  if (timers.status === 'fulfilled' && timers.value && typeof timers.value === 'object') _scheduleTimerData = timers.value;
635
640
  else failed.push(failureReason(timers));
636
- if (quick.status === 'fulfilled' && Array.isArray(quick.value)) _quickTimers = quick.value;
641
+ if (quick.status === 'fulfilled' && Array.isArray(quick.value)) _quickTimers = migrateLaunchRecords(quick.value);
637
642
  else failed.push(failureReason(quick));
638
643
  _timersLoaded = true;
639
644
  _timersError = failed.length ? t('schedules.load.timersFailed', { reasons: [...new Set(failed)].join('; ') }) : null;
@@ -2880,6 +2885,7 @@ function openPromptScheduleModal() {
2880
2885
  document.body.appendChild(_promptBackdrop);
2881
2886
 
2882
2887
  const claudeMeta = getProviderMeta('claude-code');
2888
+ const antigravityMeta = getProviderMeta('antigravity');
2883
2889
  const opencodeMeta = getProviderMeta('opencode');
2884
2890
  const codexMeta = getProviderMeta('codex');
2885
2891
  _promptModal = document.createElement('div');
@@ -2907,6 +2913,14 @@ function openPromptScheduleModal() {
2907
2913
  </span>
2908
2914
  <span class="sched-prompt-pill sched-prompt-pill--active">${te('schedules.prompt.ready')}</span>
2909
2915
  </button>
2916
+ <button class="sched-prompt-tile" style="--provider-color:${antigravityMeta.color};" data-action="prompt-modal-pick" data-runtime="antigravity">
2917
+ <span class="sched-prompt-tile-logo" aria-hidden="true">${antigravityMeta.icon}</span>
2918
+ <span class="sched-prompt-tile-body">
2919
+ <span class="sched-prompt-tile-title">${antigravityMeta.label}</span>
2920
+ <span class="sched-prompt-tile-sub">Google</span>
2921
+ </span>
2922
+ <span class="sched-prompt-pill sched-prompt-pill--active">${te('schedules.prompt.ready')}</span>
2923
+ </button>
2910
2924
  <button class="sched-prompt-tile disabled" style="--provider-color:${opencodeMeta.color};" disabled aria-disabled="true">
2911
2925
  <span class="sched-prompt-tile-logo" aria-hidden="true">${opencodeMeta.icon}</span>
2912
2926
  <span class="sched-prompt-tile-body">
@@ -2963,7 +2977,7 @@ function closePromptScheduleModal() {
2963
2977
  }
2964
2978
 
2965
2979
  async function handlePromptPick(runtime, triggerEl = null) {
2966
- if (runtime !== 'claude-code') {
2980
+ if (runtime !== 'claude-code' && runtime !== 'antigravity') {
2967
2981
  showToast(t('schedules.toast.comingSoon'));
2968
2982
  return;
2969
2983
  }
@@ -2972,14 +2986,31 @@ async function handlePromptPick(runtime, triggerEl = null) {
2972
2986
  triggerEl.setAttribute('aria-busy', 'true');
2973
2987
  }
2974
2988
  try {
2975
- await sendToPanel('/synabun schedule', { newTab: true, tabLabel: t('schedules.prompt.tabLabel'), autoSubmit: true });
2989
+ if (runtime === 'antigravity') {
2990
+ // The Antigravity panel reads `/synabun …` as the bundled skill only on a server whose panel bridge says so
2991
+ // (lib/antigravity/panel-bridge.js 'synabun-command'); an older one would send the words as they are.
2992
+ if (!(await antigravityTakesSynabunCommands())) { showToast(t('schedules.toast.restartForAntigravity')); return; }
2993
+ await openAntigravityWithPrompt('/synabun schedule', { newTab: true, send: true });
2994
+ } else {
2995
+ await sendToPanel('/synabun schedule', { newTab: true, tabLabel: t('schedules.prompt.tabLabel'), autoSubmit: true });
2996
+ }
2976
2997
  } catch (err) {
2977
- showToast(t('schedules.toast.panelFailed', { error: err.message }));
2998
+ showToast(t(runtime === 'antigravity' ? 'schedules.toast.antigravityPanelFailed' : 'schedules.toast.panelFailed', { error: err.message }));
2978
2999
  } finally {
2979
3000
  closePromptScheduleModal();
2980
3001
  }
2981
3002
  }
2982
3003
 
3004
+ /** Whether this server's Antigravity panel runs `/synabun …` (GET /api/antigravity/panel lists 'synabun-command'). */
3005
+ async function antigravityTakesSynabunCommands() {
3006
+ try {
3007
+ const res = await fetch('/api/antigravity/panel');
3008
+ if (!res.ok) return false;
3009
+ const body = await res.json();
3010
+ return Array.isArray(body?.capabilities) && body.capabilities.includes('synabun-command');
3011
+ } catch { return false; }
3012
+ }
3013
+
2983
3014
  // ── Timers: writes ──
2984
3015
 
2985
3016
  async function createQuickTimerFromForm(runNow) {
@@ -3166,7 +3197,7 @@ function setupSync() {
3166
3197
  refresh();
3167
3198
  });
3168
3199
  on('sync:schedule-group:reordered', (data) => {
3169
- if (Array.isArray(data?.groups)) _groups = data.groups;
3200
+ if (Array.isArray(data?.groups)) _groups = migrateLaunchRecords(data.groups);
3170
3201
  refresh();
3171
3202
  });
3172
3203
  on('sync:quick-timer:set', (data) => {
@@ -129,24 +129,34 @@ export function createStickyScrollController(container, options = {}) {
129
129
 
130
130
  const ResizeObserverCtor = view.ResizeObserver || globalThis.ResizeObserver;
131
131
  const MutationObserverCtor = view.MutationObserver || globalThis.MutationObserver;
132
- const observedChildren = new WeakSet();
132
+ // ResizeObserver retains its targets, even after they leave the transcript.
133
+ // Keep only current rows: OpenCode replaces a row on every streaming update.
134
+ const observedChildren = new Set();
133
135
  const resizeObserver = ResizeObserverCtor
134
136
  ? new ResizeObserverCtor(() => scrollToBottom())
135
137
  : null;
136
138
  const observeChildren = () => {
137
139
  if (!resizeObserver) return;
138
- resizeObserver.observe(container);
139
- for (const child of container.children) {
140
+ const current = new Set(container.children);
141
+ for (const child of observedChildren) {
142
+ if (current.has(child)) continue;
143
+ resizeObserver.unobserve(child);
144
+ observedChildren.delete(child);
145
+ }
146
+ for (const child of current) {
140
147
  if (observedChildren.has(child)) continue;
141
148
  observedChildren.add(child);
142
149
  resizeObserver.observe(child);
143
150
  }
144
151
  };
152
+ resizeObserver?.observe(container);
145
153
  observeChildren();
146
154
 
147
155
  const mutationObserver = MutationObserverCtor
148
- ? new MutationObserverCtor(() => {
149
- observeChildren();
156
+ ? new MutationObserverCtor((records) => {
157
+ if (disposed) return;
158
+ // Nested text/class changes need scrolling, but cannot change row ownership.
159
+ if (records.some(record => record.type === 'childList' && record.target === container)) observeChildren();
150
160
  scrollToBottom();
151
161
  })
152
162
  : null;
@@ -173,6 +183,7 @@ export function createStickyScrollController(container, options = {}) {
173
183
  disposed = true;
174
184
  cancelScheduled();
175
185
  resizeObserver?.disconnect();
186
+ observedChildren.clear();
176
187
  mutationObserver?.disconnect();
177
188
  container.removeEventListener('scroll', onScroll);
178
189
  container.removeEventListener('wheel', onWheel);
@@ -16,6 +16,8 @@ import { getProviderMeta } from './provider-icons.js';
16
16
  import { sendToPanel as sendToClaudePanel, isClaudePanelOpen } from './ui-claude-panel.js';
17
17
  import { toggleCodexPanel, isCodexPanelOpen } from './cdx/cdx-panel.js';
18
18
  import { openOpencodeWithPrompt } from './ui-opencode-panel-v2.js';
19
+ import { openAntigravityWithPrompt } from './ui-antigravity-panel.js';
20
+ import { dropdownHTML, wireDropdowns } from './cc-dropdown.js';
19
21
  import { fetchRulesStatus, installAllRules, ackRulesNotice } from './api.js';
20
22
  import { centeredInFrame } from './app-frame.js';
21
23
 
@@ -34,7 +36,8 @@ let isVisible = false;
34
36
  let _stalledTickerTimer = null;
35
37
 
36
38
  // ── Pending-Remember picker state ──
37
- const PROVIDER_LABELS = { claude: 'Claude Code', codex: 'Codex', opencode: 'OpenCode' };
39
+ const PROVIDER_LABELS = { claude: 'Claude Code', codex: 'Codex', opencode: 'OpenCode', antigravity: 'Antigravity' };
40
+ const PR_PROVIDERS = Object.keys(PROVIDER_LABELS);
38
41
  let _prPicker = { open: false, provider: 'claude', model: '', modelsByProvider: {}, loading: null };
39
42
 
40
43
  // ── Notifications state ──
@@ -45,7 +48,7 @@ const RULES_HOSTS = {
45
48
  claude: { label: 'Claude Code', provider: 'claude-code', section: 'setup-claude' },
46
49
  codex: { label: 'Codex', provider: 'codex', section: 'setup-codex' },
47
50
  opencode: { label: 'OpenCode', provider: 'opencode', section: 'setup-opencode' },
48
- gemini: { label: 'Gemini', provider: 'gemini', section: 'setup-gemini' },
51
+ antigravity: { label: 'Antigravity', provider: 'antigravity', section: 'setup-antigravity' },
49
52
  };
50
53
  // The host states that need the user: each one opens Settings > Setup.
51
54
  const RULES_ATTENTION = { outdated: 'Update available', modified: 'Edited copy', conflict: 'Needs repair' };
@@ -976,20 +979,18 @@ function renderPendingRememberPicker() {
976
979
  const models = _prPicker.modelsByProvider[provider] || [];
977
980
  const loading = _prPicker.loading === provider;
978
981
 
979
- const providerBtns = ['claude', 'codex', 'opencode'].map(p => `
982
+ const providerBtns = PR_PROVIDERS.map(p => `
980
983
  <button class="sm-btn sm-pr-prov${p === provider ? ' active' : ''}" data-pr-provider="${p}">
981
984
  ${esc(PROVIDER_LABELS[p])}
982
985
  </button>
983
986
  `).join('');
984
987
 
985
- let modelOptions = '<option value="">— select model —</option>';
986
- if (loading) modelOptions = '<option value="">Loading…</option>';
987
- else if (models.length === 0) modelOptions = '<option value="">No models found</option>';
988
- else {
989
- modelOptions += models.map(m =>
990
- `<option value="${esc(m.id)}"${m.id === _prPicker.model ? ' selected' : ''}>${esc(m.label || m.id)}</option>`
991
- ).join('');
992
- }
988
+ // The app's styled dropdown (cc-dropdown.js), wired once on the drawer's body (openPanel).
989
+ let modelEntries = [{ value: '', label: '— select model —', selected: !_prPicker.model }];
990
+ if (loading) modelEntries = [{ value: '', label: 'Loading…', selected: true }];
991
+ else if (models.length === 0) modelEntries = [{ value: '', label: 'No models found', selected: true }];
992
+ else modelEntries = modelEntries.concat(models.map(m => ({ value: m.id, label: m.label || m.id, selected: m.id === _prPicker.model })));
993
+ const modelPicker = dropdownHTML('sm-pr-model', modelEntries, { label: 'Model', classes: 'sm-pr-dropdown', disabled: loading || models.length === 0 });
993
994
 
994
995
  return `<div class="sm-cleanup-bar sm-pr-picker">
995
996
  <div class="sm-pr-row">
@@ -998,7 +999,7 @@ function renderPendingRememberPicker() {
998
999
  </div>
999
1000
  <div class="sm-pr-row">
1000
1001
  <span class="sm-pr-label">Model</span>
1001
- <select id="sm-pr-model" class="sm-pr-select"${loading || models.length === 0 ? ' disabled' : ''}>${modelOptions}</select>
1002
+ ${modelPicker}
1002
1003
  </div>
1003
1004
  <div class="sm-pr-row sm-pr-actions">
1004
1005
  <button class="sm-btn" id="sm-pr-cancel">Cancel</button>
@@ -1033,6 +1034,10 @@ async function loadProviderModels(provider) {
1033
1034
  }
1034
1035
  }
1035
1036
  models = flat;
1037
+ } else if (provider === 'antigravity') {
1038
+ // What an Antigravity session offers (lib/antigravity/catalog.js: one row per model, its thinking levels apart).
1039
+ const r = await fetch('/api/antigravity/models').then(r => r.json()).catch(() => null);
1040
+ models = (Array.isArray(r?.models) ? r.models : []).filter(m => m && m.id).map(m => ({ id: String(m.id), label: String(m.label || m.id) }));
1036
1041
  } else if (provider === 'codex') {
1037
1042
  // Codex models come from the running CLI (WebSocket). Provide a sensible static list.
1038
1043
  models = [
@@ -1101,6 +1106,9 @@ async function runPendingRemembers() {
1101
1106
  } else if (provider === 'opencode') {
1102
1107
  try { localStorage.setItem('ocp:lastModel', model); } catch {}
1103
1108
  await openOpencodeWithPrompt(res.prompt, { autoSend: true });
1109
+ } else if (provider === 'antigravity') {
1110
+ // A tab of its own, on the chosen model when its session offers it, sent at once.
1111
+ await openAntigravityWithPrompt(res.prompt, { newTab: true, send: true, model });
1104
1112
  } else if (provider === 'codex') {
1105
1113
  try { localStorage.setItem('cxp:model', model); } catch {}
1106
1114
  if (!isCodexPanelOpen()) await toggleCodexPanel();
@@ -1187,6 +1195,8 @@ function openPanel() {
1187
1195
  // ESC key to close (removed with the panel, however it closes)
1188
1196
  _panelLife?.abort();
1189
1197
  _panelLife = new AbortController();
1198
+ // The styled dropdowns of whatever the body draws (the Pending-Remember model picker), once for the panel's life.
1199
+ wireDropdowns(_panel.querySelector('#sm-body'), { signal: _panelLife.signal });
1190
1200
  const onEsc = (e) => {
1191
1201
  if (e.key === 'Escape' && _panel) closePanel();
1192
1202
  };