synabun 2.0.10 → 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 (656) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +22 -0
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +13 -13
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/lib/claude-hooks.js +172 -18
  10. package/lib/client-config-repair.js +30 -17
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +7 -6
  13. package/lib/first-launch-protection.js +57 -12
  14. package/lib/mcp-dist.js +176 -0
  15. package/lib/release-npm-ci.mjs +138 -0
  16. package/lib/release-publish.mjs +91 -0
  17. package/lib/release-scan.mjs +50 -0
  18. package/lib/server-crash-record.js +123 -0
  19. package/lib/server-exit.js +318 -0
  20. package/lib/server-supervisor.js +508 -0
  21. package/lib/start-launcher.js +37 -4
  22. package/lib/tools-cli.js +45 -0
  23. package/lib/update-snapshot.js +302 -0
  24. package/lib/virustotal.mjs +203 -0
  25. package/lib/windows-crash-event.js +269 -0
  26. package/mcp-server/dist/http.d.ts +20 -1
  27. package/mcp-server/dist/http.d.ts.map +1 -1
  28. package/mcp-server/dist/http.js +59 -12
  29. package/mcp-server/dist/http.js.map +1 -1
  30. package/mcp-server/dist/index.d.ts +33 -27
  31. package/mcp-server/dist/index.d.ts.map +1 -1
  32. package/mcp-server/dist/index.js +128 -143
  33. package/mcp-server/dist/index.js.map +1 -1
  34. package/mcp-server/dist/preload.js +1 -1
  35. package/mcp-server/dist/preload.js.map +1 -1
  36. package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
  37. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  38. package/mcp-server/dist/services/budget-judgments.js +5 -3
  39. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  40. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  41. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  42. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  43. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +2 -2
  45. package/mcp-server/dist/services/identity.js +2 -2
  46. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  47. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  48. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  49. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  50. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  51. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  52. package/mcp-server/dist/services/memory-sessions.js +28 -2
  53. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  54. package/mcp-server/dist/services/neural-interface.d.ts +18 -11
  55. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  56. package/mcp-server/dist/services/neural-interface.js +67 -11
  57. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  58. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  59. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  60. package/mcp-server/dist/services/server-instructions.js +22 -63
  61. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  62. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  63. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  64. package/mcp-server/dist/services/tool-catalog.js +339 -0
  65. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  66. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  67. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  68. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  69. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  70. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  71. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  72. package/mcp-server/dist/services/tool-list.js +334 -0
  73. package/mcp-server/dist/services/tool-list.js.map +1 -0
  74. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  75. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  76. package/mcp-server/dist/services/tool-runtime.js +400 -0
  77. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  78. package/mcp-server/dist/services/typesafe-config.js +1 -1
  79. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  80. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  81. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  82. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  83. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  84. package/mcp-server/dist/tools/agents.d.ts +14 -14
  85. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  86. package/mcp-server/dist/tools/agents.js +29 -19
  87. package/mcp-server/dist/tools/agents.js.map +1 -1
  88. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  89. package/mcp-server/dist/tools/choice.d.ts +6 -0
  90. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/choice.js +18 -13
  92. package/mcp-server/dist/tools/choice.js.map +1 -1
  93. package/mcp-server/dist/tools/git-tools.js +2 -2
  94. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  95. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  96. package/mcp-server/dist/tools/image-tools.js +1 -1
  97. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  98. package/mcp-server/dist/tools/morelogin.js +9 -6
  99. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  100. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  101. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/skill-tools.js +642 -0
  103. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  104. package/mcp-server/dist/tools/skill.d.ts +7 -0
  105. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/skill.js +11 -0
  107. package/mcp-server/dist/tools/skill.js.map +1 -0
  108. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  109. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/tool-groups.js +147 -0
  111. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  112. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  113. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  114. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  115. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  116. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  117. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  118. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  119. package/mcp-server/package-lock.json +2 -2
  120. package/mcp-server/package.json +1 -1
  121. package/mcp-server/src/http.ts +75 -12
  122. package/mcp-server/src/index.ts +147 -154
  123. package/mcp-server/src/preload.ts +12 -12
  124. package/mcp-server/src/services/budget-judgments.ts +5 -3
  125. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  126. package/mcp-server/src/services/identity.ts +2 -2
  127. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  128. package/mcp-server/src/services/memory-sessions.ts +24 -3
  129. package/mcp-server/src/services/neural-interface.ts +81 -21
  130. package/mcp-server/src/services/server-instructions.ts +29 -64
  131. package/mcp-server/src/services/tool-catalog.ts +403 -0
  132. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  133. package/mcp-server/src/services/tool-list.ts +410 -0
  134. package/mcp-server/src/services/tool-runtime.ts +457 -0
  135. package/mcp-server/src/services/typesafe-config.ts +1 -1
  136. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  137. package/mcp-server/src/tools/agents.ts +29 -20
  138. package/mcp-server/src/tools/choice.ts +17 -12
  139. package/mcp-server/src/tools/git-tools.ts +2 -2
  140. package/mcp-server/src/tools/image-tools.ts +1 -1
  141. package/mcp-server/src/tools/morelogin.ts +6 -4
  142. package/mcp-server/src/tools/skill-tools.ts +592 -0
  143. package/mcp-server/src/tools/skill.ts +13 -0
  144. package/mcp-server/src/tools/tool-groups.ts +164 -0
  145. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  146. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  147. package/neural-interface/i18n/en.json +3953 -228
  148. package/neural-interface/i18n/pt-BR.json +3901 -179
  149. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  150. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  151. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  152. package/neural-interface/lib/antigravity/bypass.js +100 -0
  153. package/neural-interface/lib/antigravity/catalog.js +273 -0
  154. package/neural-interface/lib/antigravity/home.js +260 -0
  155. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  156. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  157. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  158. package/neural-interface/lib/antigravity/policy.js +74 -0
  159. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  160. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  161. package/neural-interface/lib/antigravity/usage.js +43 -0
  162. package/neural-interface/lib/assistant-api.js +128 -28
  163. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  164. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  165. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  166. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  167. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  168. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  169. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  170. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  171. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  172. package/neural-interface/lib/assistant-budget-split.js +42 -15
  173. package/neural-interface/lib/assistant-catalog.js +81 -15
  174. package/neural-interface/lib/assistant-config.js +6 -3
  175. package/neural-interface/lib/assistant-dispatch.js +1073 -200
  176. package/neural-interface/lib/assistant-envelope.js +156 -2
  177. package/neural-interface/lib/assistant-evidence.js +80 -0
  178. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  179. package/neural-interface/lib/assistant-persona.js +93 -19
  180. package/neural-interface/lib/assistant-plan-permissions.js +25 -9
  181. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  182. package/neural-interface/lib/assistant-route-gate.js +6 -4
  183. package/neural-interface/lib/assistant-router.js +245 -38
  184. package/neural-interface/lib/assistant-runtime.js +214 -30
  185. package/neural-interface/lib/assistant-task-prompt.js +87 -21
  186. package/neural-interface/lib/assistant-tools.js +51 -0
  187. package/neural-interface/lib/assistant-usage.js +29 -0
  188. package/neural-interface/lib/backup-service.js +626 -4
  189. package/neural-interface/lib/backup-zip-reader.js +10 -5
  190. package/neural-interface/lib/backup-zip-writer.js +257 -0
  191. package/neural-interface/lib/browser-execution.js +10 -2
  192. package/neural-interface/lib/browser-guard-cdp.js +84 -0
  193. package/neural-interface/lib/browser-network-guard.js +476 -0
  194. package/neural-interface/lib/browser-policy-roots.js +64 -0
  195. package/neural-interface/lib/browser-tool-policy.js +198 -38
  196. package/neural-interface/lib/claude-agent-bridge.js +11 -2
  197. package/neural-interface/lib/claude-history-cache.js +210 -0
  198. package/neural-interface/lib/claude-hooks-status.js +103 -0
  199. package/neural-interface/lib/claude-model-catalog.js +5 -1
  200. package/neural-interface/lib/claude-temporary.js +5 -11
  201. package/neural-interface/lib/cli-install-api.js +1 -1
  202. package/neural-interface/lib/cli-install.js +163 -154
  203. package/neural-interface/lib/cli-resolver.js +13 -3
  204. package/neural-interface/lib/cli-update-planner.js +52 -41
  205. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  206. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  207. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  208. package/neural-interface/lib/codex-worker-app-server.js +191 -0
  209. package/neural-interface/lib/confined-fs.js +30 -3
  210. package/neural-interface/lib/crash-notice-api.js +98 -0
  211. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  212. package/neural-interface/lib/editor-git-api.js +3 -20
  213. package/neural-interface/lib/exec-loop-command.js +13 -10
  214. package/neural-interface/lib/file-explorer-api.js +74 -40
  215. package/neural-interface/lib/file-explorer-watch.js +9 -3
  216. package/neural-interface/lib/git-bash/install.js +52 -6
  217. package/neural-interface/lib/git-bash/manager.js +59 -17
  218. package/neural-interface/lib/git-bash/pins.js +12 -0
  219. package/neural-interface/lib/git-read.js +2 -2
  220. package/neural-interface/lib/git-status-runner.js +390 -0
  221. package/neural-interface/lib/git-status-watchdog.js +40 -0
  222. package/neural-interface/lib/greeting/budgets.js +1 -0
  223. package/neural-interface/lib/greeting/engine.js +2 -2
  224. package/neural-interface/lib/greeting/sources.js +10 -12
  225. package/neural-interface/lib/greeting/writer.js +1 -1
  226. package/neural-interface/lib/http-guards.js +8 -2
  227. package/neural-interface/lib/install-details.js +4 -1
  228. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  229. package/neural-interface/lib/mcp-client-config.js +35 -33
  230. package/neural-interface/lib/mcp-external-servers.js +332 -0
  231. package/neural-interface/lib/mcp-installer.js +2 -1
  232. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  233. package/neural-interface/lib/memory-session-capture.js +17 -3
  234. package/neural-interface/lib/morelogin.js +177 -25
  235. package/neural-interface/lib/native-loop-providers.js +965 -66
  236. package/neural-interface/lib/native-loop-runtime.js +290 -42
  237. package/neural-interface/lib/opencode-config.js +557 -0
  238. package/neural-interface/lib/opencode-db-schema.js +17 -34
  239. package/neural-interface/lib/opencode-history.js +48 -218
  240. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  241. package/neural-interface/lib/opencode-native-boundary.js +53 -0
  242. package/neural-interface/lib/opencode-protocol.js +249 -112
  243. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  244. package/neural-interface/lib/opencode-serve-records.js +39 -21
  245. package/neural-interface/lib/opencode-v2-client.js +48 -153
  246. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  247. package/neural-interface/lib/opencode-worker-data.js +27 -0
  248. package/neural-interface/lib/opencode2-client.js +73 -37
  249. package/neural-interface/lib/opencode2-proxy.js +23 -63
  250. package/neural-interface/lib/opencode2-translate.js +51 -2
  251. package/neural-interface/lib/owner-authority.js +249 -0
  252. package/neural-interface/lib/page-session.js +275 -0
  253. package/neural-interface/lib/path-confine.js +12 -9
  254. package/neural-interface/lib/peer-identity.js +793 -0
  255. package/neural-interface/lib/pty-host/core.js +28 -1
  256. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  257. package/neural-interface/lib/pty-host/manager.js +12 -1
  258. package/neural-interface/lib/remote-policy.js +1 -1
  259. package/neural-interface/lib/request-gate.js +20 -2
  260. package/neural-interface/lib/rulesets/api.js +7 -6
  261. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  262. package/neural-interface/lib/rulesets/installer.js +180 -36
  263. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  264. package/neural-interface/lib/rulesets/render.js +1 -1
  265. package/neural-interface/lib/session-cache-builder.js +81 -31
  266. package/neural-interface/lib/session-title-generator.js +58 -36
  267. package/neural-interface/lib/skills/api-v2.js +495 -0
  268. package/neural-interface/lib/skills/bundle.js +418 -0
  269. package/neural-interface/lib/skills/catalog.js +298 -0
  270. package/neural-interface/lib/skills/creation-api.js +191 -0
  271. package/neural-interface/lib/skills/creation-brief.js +247 -0
  272. package/neural-interface/lib/skills/creation-sources.js +285 -0
  273. package/neural-interface/lib/skills/creation.js +843 -0
  274. package/neural-interface/lib/skills/deploy.js +569 -0
  275. package/neural-interface/lib/skills/digest.js +119 -0
  276. package/neural-interface/lib/skills/discover.js +111 -0
  277. package/neural-interface/lib/skills/draft-confinement.js +216 -0
  278. package/neural-interface/lib/skills/eval-confinement.js +399 -0
  279. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  280. package/neural-interface/lib/skills/eval-trace.js +135 -0
  281. package/neural-interface/lib/skills/evals-api.js +212 -0
  282. package/neural-interface/lib/skills/evals.js +1573 -0
  283. package/neural-interface/lib/skills/export.js +203 -0
  284. package/neural-interface/lib/skills/frontmatter.js +64 -0
  285. package/neural-interface/lib/skills/health.js +75 -0
  286. package/neural-interface/lib/skills/json-edit.js +165 -0
  287. package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
  288. package/neural-interface/lib/skills/known-bridges.js +96 -0
  289. package/neural-interface/lib/skills/library.js +823 -0
  290. package/neural-interface/lib/skills/local-store.js +21 -0
  291. package/neural-interface/lib/skills/migration.js +433 -0
  292. package/neural-interface/lib/skills/operations.js +45 -0
  293. package/neural-interface/lib/skills/ownership.js +427 -0
  294. package/neural-interface/lib/skills/packages.js +88 -0
  295. package/neural-interface/lib/skills/reviews.js +212 -0
  296. package/neural-interface/lib/skills/revision.js +80 -0
  297. package/neural-interface/lib/skills/roots.js +269 -0
  298. package/neural-interface/lib/skills/runtime-checks.js +358 -0
  299. package/neural-interface/lib/skills/scan-assets.js +252 -0
  300. package/neural-interface/lib/skills/scan-context.js +26 -0
  301. package/neural-interface/lib/skills/scan-shell.js +324 -0
  302. package/neural-interface/lib/skills/scan.js +364 -0
  303. package/neural-interface/lib/skills/scanners.js +54 -0
  304. package/neural-interface/lib/skills/service.js +530 -0
  305. package/neural-interface/lib/skills/telemetry.js +119 -0
  306. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  307. package/neural-interface/lib/synabun-version.js +1 -1
  308. package/neural-interface/lib/system-activity.js +1 -1
  309. package/neural-interface/lib/tool-lists.js +124 -0
  310. package/neural-interface/lib/whatsapp/brain.js +7 -3
  311. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  312. package/neural-interface/lib/whatsapp/cards.js +22 -9
  313. package/neural-interface/lib/whatsapp/config.js +1 -1
  314. package/neural-interface/lib/worker-confinement.js +1268 -0
  315. package/neural-interface/lib/worker-guard-setting.js +56 -0
  316. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  317. package/neural-interface/lib/worker-question.js +74 -0
  318. package/neural-interface/lib/worker-relay-ports.js +227 -0
  319. package/neural-interface/lib/worker-resume.js +238 -0
  320. package/neural-interface/lib/worker-sandbox.js +329 -0
  321. package/neural-interface/package-lock.json +34 -12
  322. package/neural-interface/package.json +3 -2
  323. package/neural-interface/public/index.html +3 -1
  324. package/neural-interface/public/index2d.html +19 -11
  325. package/neural-interface/public/onboarding.html +3 -3
  326. package/neural-interface/public/shared/account-menu.js +8 -5
  327. package/neural-interface/public/shared/agent-runtime-options.js +125 -31
  328. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  329. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  330. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  331. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  332. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  333. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  334. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  335. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  336. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  337. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  338. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  339. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  340. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  341. package/neural-interface/public/shared/api.js +1527 -1336
  342. package/neural-interface/public/shared/app-frame.js +192 -0
  343. package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
  344. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  345. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  346. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  347. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  348. package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
  349. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  350. package/neural-interface/public/shared/assistant/asst-control.js +205 -26
  351. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  352. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  353. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  354. package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
  355. package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
  356. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  357. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  358. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  359. package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  361. package/neural-interface/public/shared/assistant/asst-render.js +445 -82
  362. package/neural-interface/public/shared/assistant/asst-route.js +304 -53
  363. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  364. package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
  365. package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
  366. package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
  367. package/neural-interface/public/shared/assistant/asst-state.js +87 -24
  368. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
  371. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  372. package/neural-interface/public/shared/automation-context.js +5 -2
  373. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  374. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  375. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  376. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  377. package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
  378. package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
  379. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  380. package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
  381. package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
  382. package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
  383. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  384. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  385. package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
  386. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  387. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  388. package/neural-interface/public/shared/cli-install-view.js +11 -12
  389. package/neural-interface/public/shared/cli-status.js +11 -10
  390. package/neural-interface/public/shared/constants.js +5 -4
  391. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  392. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  393. package/neural-interface/public/shared/context-menu-model.js +367 -0
  394. package/neural-interface/public/shared/context-menu.js +372 -0
  395. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  396. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  397. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  398. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  399. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  400. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  401. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  402. package/neural-interface/public/shared/desktop-update-view.js +21 -0
  403. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  404. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  405. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  406. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  407. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  408. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  409. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  410. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  411. package/neural-interface/public/shared/html-shell.js +30 -15
  412. package/neural-interface/public/shared/i18n.js +2 -0
  413. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  414. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  415. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  416. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  417. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  418. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  419. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  420. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  421. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  422. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  423. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  424. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
  425. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  426. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  427. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  428. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
  429. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  430. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  431. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  432. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  433. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  434. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  435. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  436. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
  437. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  438. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
  439. package/neural-interface/public/shared/page-session.js +96 -0
  440. package/neural-interface/public/shared/provider-icons.js +4 -2
  441. package/neural-interface/public/shared/registry.js +5 -3
  442. package/neural-interface/public/shared/retired-2d.js +3 -0
  443. package/neural-interface/public/shared/schedules-view.js +195 -61
  444. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  445. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  446. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  447. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  448. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  449. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  450. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  451. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  452. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  453. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  454. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  455. package/neural-interface/public/shared/skills/ss-creation.js +222 -0
  456. package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
  457. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  458. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  459. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  460. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  461. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  462. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  463. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  464. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  465. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  466. package/neural-interface/public/shared/skills/ss-lint.js +149 -0
  467. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  468. package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
  469. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  470. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  471. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  472. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  473. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  474. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  475. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  476. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
  477. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  478. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  479. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  480. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  481. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  482. package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
  483. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  484. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  485. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  486. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  487. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  488. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  489. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  490. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  491. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
  492. package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
  493. package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
  494. package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
  495. package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
  496. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  497. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  498. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  499. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  500. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  501. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  502. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  503. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  504. package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
  505. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  506. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  507. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  508. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
  509. package/neural-interface/public/shared/state.js +1 -1
  510. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  511. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  512. package/neural-interface/public/shared/styles.css +1822 -1756
  513. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  514. package/neural-interface/public/shared/text-cache.js +29 -0
  515. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  516. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  517. package/neural-interface/public/shared/tool-list-view.js +112 -0
  518. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  519. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  520. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  521. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  522. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  523. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  524. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  525. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  526. package/neural-interface/public/shared/tour/tour.css +144 -0
  527. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  528. package/neural-interface/public/shared/ui-assistant.js +2 -0
  529. package/neural-interface/public/shared/ui-automation-studio.js +111 -140
  530. package/neural-interface/public/shared/ui-claude-panel.js +376 -82
  531. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  532. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  533. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  534. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  535. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  536. package/neural-interface/public/shared/ui-detail.js +15 -3
  537. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  538. package/neural-interface/public/shared/ui-file-links.js +2 -2
  539. package/neural-interface/public/shared/ui-games.js +2 -2
  540. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  541. package/neural-interface/public/shared/ui-judgments.js +1 -1
  542. package/neural-interface/public/shared/ui-keybinds.js +33 -2
  543. package/neural-interface/public/shared/ui-link.js +3 -3
  544. package/neural-interface/public/shared/ui-menubar.js +10 -20
  545. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  546. package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
  547. package/neural-interface/public/shared/ui-navbar.js +49 -24
  548. package/neural-interface/public/shared/ui-notifications.js +1 -0
  549. package/neural-interface/public/shared/ui-panels.js +96 -65
  550. package/neural-interface/public/shared/ui-resume.js +9 -7
  551. package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
  552. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  553. package/neural-interface/public/shared/ui-sessions.js +27 -15
  554. package/neural-interface/public/shared/ui-settings.js +683 -526
  555. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  556. package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
  557. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  558. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  559. package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
  560. package/neural-interface/public/shared/ui-skills.js +33 -2830
  561. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  562. package/neural-interface/public/shared/ui-sync.js +15 -5
  563. package/neural-interface/public/shared/ui-terminal.js +270 -190
  564. package/neural-interface/public/shared/ui-tool-updates.js +6 -4
  565. package/neural-interface/public/shared/ui-tooltip.js +81 -51
  566. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  567. package/neural-interface/public/shared/ui-trash.js +6 -4
  568. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  569. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  570. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  571. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  572. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  573. package/neural-interface/public/shared/ui-update.js +38 -2
  574. package/neural-interface/public/shared/ui-whiteboard.js +312 -59
  575. package/neural-interface/public/shared/ui-worker-end.js +5 -1
  576. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  577. package/neural-interface/public/shared/view-variant.js +66 -0
  578. package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
  579. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  580. package/neural-interface/public/shared/worker-end.js +10 -3
  581. package/neural-interface/public/shared/worker-questions.js +34 -0
  582. package/neural-interface/public/shared/worker-restart.js +12 -0
  583. package/neural-interface/public/sidepanel-session.html +2 -2
  584. package/neural-interface/public/variant/2d/background.js +2 -1
  585. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  586. package/neural-interface/public/variant/2d/graph.js +42 -20
  587. package/neural-interface/public/variant/2d/hulls.js +14 -9
  588. package/neural-interface/public/variant/2d/lasso.js +11 -7
  589. package/neural-interface/public/variant/2d/main.js +32 -1
  590. package/neural-interface/public/variant/2d/minimap.js +11 -13
  591. package/neural-interface/public/variant/3d/main.js +69 -6
  592. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  593. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  594. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  595. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  596. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  597. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  598. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  599. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  600. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  601. package/neural-interface/scripts/build-vendor.mjs +32 -0
  602. package/neural-interface/server.js +4553 -2855
  603. package/neural-interface/templates/rulesets/README.md +1 -1
  604. package/neural-interface/templates/rulesets/core.md +1 -1
  605. package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
  606. package/neural-interface/templates/rulesets/manifest.json +8 -8
  607. package/npm-shrinkwrap.json +34 -12
  608. package/package.json +17 -3
  609. package/postinstall.js +9 -4
  610. package/preuninstall.js +1 -1
  611. package/setup.js +97 -322
  612. package/skills/skill-forge/SKILL.md +177 -0
  613. package/skills/skill-forge/evals/evals.json +54 -0
  614. package/skills/skill-forge/references/package.md +105 -0
  615. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  616. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  617. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  618. package/skills/synabun/SKILL.md +10 -7
  619. package/skills/synabun/modules/audit.md +1 -5
  620. package/skills/synabun/modules/changelog.md +1 -5
  621. package/skills/synabun/modules/idea.md +1 -1
  622. package/skills/synabun/modules/memorize.md +6 -9
  623. package/skills/synabun/modules/schedule.md +6 -6
  624. package/mcp-server/dist/services/profiles.d.ts +0 -120
  625. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  626. package/mcp-server/dist/services/profiles.js +0 -387
  627. package/mcp-server/dist/services/profiles.js.map +0 -1
  628. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  629. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  630. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  631. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  632. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  633. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  634. package/mcp-server/dist/tools/leonardo.js +0 -21
  635. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  636. package/mcp-server/dist/tools/profile.d.ts +0 -17
  637. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  638. package/mcp-server/dist/tools/profile.js +0 -114
  639. package/mcp-server/dist/tools/profile.js.map +0 -1
  640. package/mcp-server/src/services/profiles.ts +0 -428
  641. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  642. package/mcp-server/src/tools/leonardo.ts +0 -30
  643. package/mcp-server/src/tools/profile.ts +0 -122
  644. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  645. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  646. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  647. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  648. package/skills/leonardo/SKILL.md +0 -168
  649. package/skills/leonardo/icon.svg +0 -1
  650. package/skills/leonardo/modules/browser-guide.md +0 -378
  651. package/skills/leonardo/modules/image-prompter.md +0 -283
  652. package/skills/leonardo/modules/model-advisor.md +0 -100
  653. package/skills/leonardo/modules/prompt-library.md +0 -110
  654. package/skills/leonardo/modules/style-guide.md +0 -186
  655. package/skills/leonardo/modules/video-prompter.md +0 -317
  656. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -8,9 +8,23 @@
8
8
  import { KEYS } from '../constants.js';
9
9
  import { isNewerRunDescriptor } from '../ui-native-loop-router-state.js';
10
10
  import { modelEffortIds } from '../agent-runtime-options.js';
11
+ import { getProviderMeta } from '../provider-icons.js';
11
12
  import { usagePacketIsStale } from './asst-usage.js';
12
13
 
13
- export const PROVIDERS = ['claude-code', 'codex', 'opencode'];
14
+ // The providers the Assistant itself can run on (its brain): the brain picker, /model and /new.
15
+ // Antigravity runs over ACP (lib/assistant-brains/antigravity.js), like a worker.
16
+ export const BRAIN_PROVIDERS = ['claude-code', 'codex', 'opencode', 'antigravity'];
17
+ // Providers that only ever run dispatched work. None any more (Antigravity became a brain too); kept so a module
18
+ // or a test that still imports the list reads it as empty.
19
+ export const WORKER_ONLY_PROVIDERS = [];
20
+ // Every provider the Assistant lists models for and can route a task to.
21
+ export const PROVIDERS = [...BRAIN_PROVIDERS, ...WORKER_ONLY_PROVIDERS];
22
+ // Providers that report tokens and no prices (Antigravity bills through its Google sign-in): a budget gives them no
23
+ // share, so a dry share never names them (asst-route.js), and their rows read "unpriced".
24
+ export const UNPRICED_PROVIDERS = ['antigravity'];
25
+ // Providers an older server may not list in its catalog yet: a model section without rows and without an archive
26
+ // for them stays hidden rather than showing an empty provider.
27
+ export const OPTIONAL_PROVIDERS = ['antigravity'];
14
28
 
15
29
  export const PROVIDER_ALIASES = {
16
30
  'claude-code': 'claude-code',
@@ -22,24 +36,38 @@ export const PROVIDER_ALIASES = {
22
36
  openai: 'codex',
23
37
  opencode: 'opencode',
24
38
  oc: 'opencode',
39
+ antigravity: 'antigravity',
40
+ agy: 'antigravity',
41
+ 'google antigravity': 'antigravity',
42
+ // Antigravity's CLI took the place of Gemini CLI: an old name or saved route means it.
43
+ gemini: 'antigravity',
25
44
  };
26
45
 
27
46
  export const PROVIDER_SHORT_LABELS = {
28
47
  'claude-code': 'Claude',
29
48
  codex: 'Codex',
30
49
  opencode: 'OpenCode',
50
+ antigravity: 'Antigravity',
51
+ };
52
+
53
+ export const PROVIDER_LABELS = {
54
+ 'claude-code': 'Claude Code',
55
+ codex: 'Codex',
56
+ opencode: 'OpenCode',
57
+ antigravity: 'Antigravity',
31
58
  };
32
59
 
33
60
  // Providers whose brain carries an account profile picker.
34
61
  export const ACCOUNT_PROVIDERS = new Set(['claude-code', 'codex']);
35
62
 
36
63
  // Approval modes are sent as `permissionMode` (`set_permission_mode {mode}` /
37
- // `query.permissionMode`). Claude uses the SDK enum; Codex/OpenCode brains only
38
- // distinguish "ask me" from "auto-approve". Plan mode is a separate flag
39
- // (`planMode`) that combines with any approval mode, each provider in its own
40
- // way: Claude runs the SDK 'plan' mode and returns to the approval mode once
64
+ // `query.permissionMode`). Claude uses the SDK enum; Codex/OpenCode/Antigravity
65
+ // brains only distinguish "ask me" from "auto-approve". Plan mode is a separate
66
+ // flag (`planMode`) that combines with any approval mode, each provider in its
67
+ // own way: Claude runs the SDK 'plan' mode and returns to the approval mode once
41
68
  // the plan is approved; Codex runs its native plan collaboration mode (read-only
42
- // sandbox); OpenCode runs its own `plan` agent.
69
+ // sandbox); OpenCode runs its own `plan` agent; Antigravity refuses code changes
70
+ // through SynaBun's hook and proposes the plan in a <proposed_plan> block.
43
71
  export const PERMISSION_MODES = {
44
72
  'claude-code': [
45
73
  { id: 'default', label: 'Default' },
@@ -54,9 +82,13 @@ export const PERMISSION_MODES = {
54
82
  { id: 'default', label: 'Default' },
55
83
  { id: 'auto', label: 'Auto-accept' },
56
84
  ],
85
+ antigravity: [
86
+ { id: 'default', label: 'Default' },
87
+ { id: 'auto', label: 'Auto-accept' },
88
+ ],
57
89
  };
58
90
 
59
- export const PLAN_MODE_PROVIDERS = new Set(['claude-code', 'codex', 'opencode']);
91
+ export const PLAN_MODE_PROVIDERS = new Set(['claude-code', 'codex', 'opencode', 'antigravity']);
60
92
 
61
93
  export const DEFAULT_BRAIN = Object.freeze({
62
94
  provider: 'claude-code',
@@ -64,7 +96,7 @@ export const DEFAULT_BRAIN = Object.freeze({
64
96
  effort: null,
65
97
  agent: null,
66
98
  project: null,
67
- mcpProfile: '',
99
+ tools: Object.freeze(['all']),
68
100
  accountId: null,
69
101
  permissionMode: 'default',
70
102
  planMode: false,
@@ -80,10 +112,42 @@ export function normalizeProvider(value, fallback = null) {
80
112
  return PROVIDER_ALIASES[key] || fallback;
81
113
  }
82
114
 
115
+ /** Can the Assistant itself run on `provider` (a canonical id)? */
116
+ export function isBrainProvider(provider) {
117
+ return BRAIN_PROVIDERS.includes(provider);
118
+ }
119
+
120
+ /** Does `provider` report tokens and no prices (Antigravity)? */
121
+ export function isUnpricedProvider(provider) {
122
+ return UNPRICED_PROVIDERS.includes(provider);
123
+ }
124
+
125
+ /** `value` as a brain provider, else `fallback`: an unknown name (or a worker-only provider) is never a brain. */
126
+ export function normalizeBrainProvider(value, fallback = null) {
127
+ const provider = normalizeProvider(value);
128
+ return provider && isBrainProvider(provider) ? provider : fallback;
129
+ }
130
+
83
131
  export function providerShortLabel(provider) {
84
132
  return PROVIDER_SHORT_LABELS[provider] || String(provider || '');
85
133
  }
86
134
 
135
+ /** "Claude Code", "Antigravity": a provider's full name ('' for none). */
136
+ export function providerLabel(provider) {
137
+ return PROVIDER_LABELS[provider] || String(provider || '');
138
+ }
139
+
140
+ /**
141
+ * The icon, colour and name of a provider (provider-icons.js). A provider that file does not know
142
+ * yet keeps its own name and shows no icon, never another provider's (getProviderMeta falls back to
143
+ * Claude Code's for an unknown id).
144
+ */
145
+ export function providerMeta(provider) {
146
+ const meta = getProviderMeta(provider || undefined);
147
+ if (!provider || meta?.id === provider) return meta;
148
+ return { id: provider, label: providerLabel(provider), shortLabel: providerShortLabel(provider), icon: '', color: '' };
149
+ }
150
+
87
151
  function str(value) {
88
152
  if (value == null) return '';
89
153
  return String(value).trim();
@@ -93,19 +157,22 @@ function str(value) {
93
157
  export function normalizeBrain(raw, fallback = DEFAULT_BRAIN) {
94
158
  const base = { ...DEFAULT_BRAIN, ...(fallback || {}) };
95
159
  const src = raw && typeof raw === 'object' ? raw : {};
96
- const provider = normalizeProvider(src.provider ?? src.brain, base.provider) || 'claude-code';
160
+ // A provider that cannot be the brain (an unknown name) falls back like any unknown one.
161
+ const provider = normalizeBrainProvider(src.provider ?? src.brain, normalizeBrainProvider(base.provider)) || 'claude-code';
97
162
  const modes = PERMISSION_MODES[provider] || PERMISSION_MODES['claude-code'];
98
163
  const rawMode = str(src.permissionMode);
99
164
  // 'plan' used to be one of Claude's permission modes: it is the plan flag now.
100
165
  const legacyPlan = rawMode === 'plan';
101
166
  const mode = legacyPlan ? 'default' : rawMode;
167
+ const effort = str(src.effort) || null;
102
168
  return {
103
169
  provider,
104
170
  model: str(src.model),
105
- effort: str(src.effort) || null,
171
+ // Antigravity's thinking levels have no "off": no level is the model's own default (null).
172
+ effort: provider === 'antigravity' && effort === 'off' ? null : effort,
106
173
  agent: provider === 'opencode' ? (str(src.agent) || null) : null,
107
174
  project: str(src.project ?? src.cwd) || null,
108
- mcpProfile: str(src.mcpProfile),
175
+ tools: provider === 'opencode' ? (Array.isArray(src.tools) ? [...src.tools] : null) : ['all'],
109
176
  accountId: ACCOUNT_PROVIDERS.has(provider) ? (str(src.accountId) || null) : null,
110
177
  permissionMode: modes.some(m => m.id === mode) ? mode : 'default',
111
178
  planMode: PLAN_MODE_PROVIDERS.has(provider) && (src.planMode === true || legacyPlan),
@@ -145,7 +212,7 @@ function pickDefault(list) {
145
212
  * efforts: { [provider]: [{ id, tier? }] },
146
213
  * accounts: { [provider]: [{ id, label }] },
147
214
  * agents: [{ name, mode? }], // OpenCode
148
- * mcpProfiles: { [id]: { label } }, defaultMcpProfile,
215
+ * toolCatalog: { default, groups },
149
216
  * projects: [{ path, label }],
150
217
  * }
151
218
  */
@@ -188,14 +255,8 @@ export function resolveBrainDefaults(brain, catalog = {}) {
188
255
  b.accountId = null;
189
256
  }
190
257
 
191
- const profiles = catalog.mcpProfiles && typeof catalog.mcpProfiles === 'object' ? catalog.mcpProfiles : null;
192
- if (profiles) {
193
- const ids = Object.keys(profiles);
194
- if (ids.length && !ids.includes(b.mcpProfile)) {
195
- b.mcpProfile = ids.includes(catalog.defaultMcpProfile) ? catalog.defaultMcpProfile : (ids.includes('full') ? 'full' : ids[0]);
196
- }
197
- } else if (!b.mcpProfile && catalog.defaultMcpProfile) {
198
- b.mcpProfile = catalog.defaultMcpProfile;
258
+ if (b.provider === 'opencode' && b.tools == null && catalog.toolCatalog) {
259
+ b.tools = [...new Set([...(catalog.toolCatalog.default || []).filter(id => id !== 'git'), 'browser'])];
199
260
  }
200
261
 
201
262
  if (!b.project && Array.isArray(catalog.projects) && catalog.projects.length === 1) {
@@ -285,7 +346,7 @@ export function emptyProjectView(project, projects = [], tr = (_key, fallback, p
285
346
  export function brainRequiresSwitch(a, b) {
286
347
  const x = normalizeBrain(a);
287
348
  const y = normalizeBrain(b);
288
- return x.provider !== y.provider || x.accountId !== y.accountId || x.mcpProfile !== y.mcpProfile;
349
+ return x.provider !== y.provider || x.accountId !== y.accountId || JSON.stringify(x.tools) !== JSON.stringify(y.tools);
289
350
  }
290
351
 
291
352
  // ── Runs ────────────────────────────────────────────────────────────────────
@@ -295,9 +356,11 @@ export function isTerminalRunStatus(status) {
295
356
  }
296
357
 
297
358
  // Dispatcher views carry `state` (queued, awaiting_route, starting, running,
298
- // idle, awaiting_permission, completed, failed, stopped, interrupted); runtime
299
- // descriptors (sidepanel:run-*) carry `status`. The tray reads `status`.
300
- const STATE_STATUS = { queued: 'queued', awaiting_route: 'queued', starting: 'starting', running: 'running', idle: 'running', awaiting_permission: 'running' };
359
+ // idle, awaiting_permission, suspended, resuming, completed, failed, stopped,
360
+ // interrupted); runtime descriptors (sidepanel:run-*) carry `status`. The tray
361
+ // reads `status`. A run a server restart suspended is still running; one being
362
+ // resumed is starting.
363
+ const STATE_STATUS = { queued: 'queued', awaiting_route: 'queued', starting: 'starting', running: 'running', idle: 'running', awaiting_permission: 'running', suspended: 'running', resuming: 'starting' };
301
364
 
302
365
  export function runStatusFromState(state) {
303
366
  const value = str(state);
@@ -0,0 +1,127 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Assistant — what a stop names
3
+ // ═══════════════════════════════════════════
4
+ // Pure module (no DOM, no i18n import) so node:test can exercise it.
5
+ //
6
+ // A stop ends the work the user named and nothing else:
7
+ // resolveStopTarget `/stop <target>`: the one run of this session the target names (its id, the
8
+ // start of its id, its title or the words of its title), or why it names none.
9
+ // Two candidates stop nothing: the user picks one.
10
+ // createConfirmGate the agents tray's "Stop all": the first press arms it, a second press inside
11
+ // the window stops every run of the session at once. A single stray click, a
12
+ // double click or a held key never does (2026-10-24: one "Stop all" press
13
+ // ended both runs of a session while the user meant one of them).
14
+ // Words the user types to stop everything ("stop", "cancel") go to the brain, which stops runs
15
+ // with agent_stop (assistant-persona.js): nothing here reads a message.
16
+
17
+ import { isTerminalRunStatus } from './asst-state.js';
18
+
19
+ /** How long an armed "Stop all" waits for its second press, and the least time between the two. */
20
+ export const STOP_ALL_CONFIRM_MS = 4000;
21
+ export const STOP_ALL_MIN_GAP_MS = 300;
22
+
23
+ // Words that say "a run" without saying which one: "/stop the OpenCode settings run" names it by the rest.
24
+ const FILLER = new Set(['the', 'a', 'an', 'that', 'this', 'my', 'our', 'one', 'run', 'runs', 'agent', 'agents', 'worker', 'workers', 'task', 'job', 'please', 'o', 'os', 'as', 'do', 'da', 'de']);
25
+ const FULL_RUN_ID = /^[0-9a-f]{32}$/i;
26
+ const ID_PREFIX = /^[0-9a-f][0-9a-f-]{3,}$/i;
27
+
28
+ function words(text) {
29
+ return String(text ?? '').toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
30
+ }
31
+
32
+ function unquote(text) {
33
+ const s = String(text ?? '').trim();
34
+ const m = s.match(/^(["'“‘])([\s\S]*)(["'”’])$/);
35
+ return m ? m[2].trim() : s;
36
+ }
37
+
38
+ /**
39
+ * The run `/stop <target>` names among `runs` (the tray's runs of this session).
40
+ * → { run, by: 'id' | 'prefix' | 'title' | 'words' }
41
+ * | { error: 'empty' | 'none' | 'finished' | 'ambiguous', matches?: run[], run? }
42
+ * An exact id names that run whatever its state (the server says when it already ended). Every
43
+ * other way names a run that still works; one that ended is `finished`. A full id the tray does not
44
+ * know is handed on as `{ error: 'none', passthrough: id }`: the server knows more runs than a tray.
45
+ */
46
+ export function resolveStopTarget(target, runs = []) {
47
+ const raw = unquote(target);
48
+ if (!raw) return { error: 'empty' };
49
+ const list = (Array.isArray(runs) ? runs : []).filter((run) => run && run.runId && run.removed !== true);
50
+ const live = list.filter((run) => !isTerminalRunStatus(run.status));
51
+ const one = (matches, by) => {
52
+ if (matches.length === 1) return isTerminalRunStatus(matches[0].status) ? { error: 'finished', run: matches[0] } : { run: matches[0], by };
53
+ if (matches.length > 1) return { error: 'ambiguous', matches };
54
+ return null;
55
+ };
56
+ const lower = raw.toLowerCase();
57
+
58
+ const exact = list.find((run) => String(run.runId).toLowerCase() === lower);
59
+ if (exact) return { run: exact, by: 'id' };
60
+ if (ID_PREFIX.test(raw)) {
61
+ const byPrefix = one(list.filter((run) => String(run.runId).toLowerCase().startsWith(lower)), 'prefix');
62
+ if (byPrefix) return byPrefix;
63
+ }
64
+
65
+ const title = (run) => words(run.title || run.task || '').join(' ');
66
+ const wanted = words(raw).join(' ');
67
+ if (wanted) {
68
+ const byTitle = one(live.filter((run) => title(run) === wanted), 'title');
69
+ if (byTitle) return byTitle;
70
+ }
71
+ // The words that say which run: each one is a word of its title, or the start of one.
72
+ const keys = words(raw).filter((word) => !FILLER.has(word));
73
+ if (keys.length) {
74
+ const fits = (run) => { const have = words(run.title || run.task || ''); return keys.every((key) => have.some((word) => word === key || (key.length >= 3 && word.startsWith(key)))); };
75
+ const byWords = one(live.filter(fits), 'words');
76
+ if (byWords) return byWords;
77
+ const ended = list.filter((run) => isTerminalRunStatus(run.status) && (title(run) === wanted || fits(run)));
78
+ if (ended.length === 1) return { error: 'finished', run: ended[0] };
79
+ }
80
+ return FULL_RUN_ID.test(raw) ? { error: 'none', passthrough: raw } : { error: 'none' };
81
+ }
82
+
83
+ /**
84
+ * A press that only counts as the second of two. `press()` → 'armed' (the first: `onChange(true)`),
85
+ * 'confirmed' (the second, inside `windowMs` and at least `minGapMs` after the first:
86
+ * `onChange(false)`, the caller stops everything) or 'ignored' (too soon after the first: a double
87
+ * click, a held key). The arm lapses after `windowMs` by itself (`onChange(false)`).
88
+ */
89
+ export function createConfirmGate({
90
+ windowMs = STOP_ALL_CONFIRM_MS,
91
+ minGapMs = STOP_ALL_MIN_GAP_MS,
92
+ now = Date.now,
93
+ setTimer = (fn, ms) => setTimeout(fn, ms),
94
+ clearTimer = (id) => clearTimeout(id),
95
+ onChange = () => {},
96
+ } = {}) {
97
+ let armedAt = null;
98
+ let timer = null;
99
+ const notify = (armed) => { try { onChange(armed); } catch { /* the button is gone */ } };
100
+ function reset() {
101
+ if (timer !== null) { clearTimer(timer); timer = null; }
102
+ if (armedAt === null) return false;
103
+ armedAt = null;
104
+ notify(false);
105
+ return true;
106
+ }
107
+ function press() {
108
+ const at = now();
109
+ // An arm whose timer never ran (a throttled background tab) has lapsed all the same.
110
+ if (armedAt !== null && at - armedAt > windowMs) reset();
111
+ if (armedAt === null) {
112
+ armedAt = at;
113
+ timer = setTimer(() => { timer = null; reset(); }, windowMs);
114
+ notify(true);
115
+ return 'armed';
116
+ }
117
+ if (at - armedAt < minGapMs) return 'ignored';
118
+ reset();
119
+ return 'confirmed';
120
+ }
121
+ return {
122
+ press,
123
+ reset,
124
+ isArmed: () => armedAt !== null,
125
+ destroy() { if (timer !== null) { clearTimer(timer); timer = null; } armedAt = null; },
126
+ };
127
+ }
@@ -345,32 +345,62 @@ export function injectAssistantStyles() {
345
345
  .asst-transcript > .asst-status + .asst-status,
346
346
  .asst-transcript > .asst-route-line + .asst-route-line { margin-top: 4px; }
347
347
  .asst-transcript > .asst-working { margin-top: 8px; }
348
+ /* The open card waits at the bottom (asst-ask-tail.js): under every row that arrives after it,
349
+ above the "Working…" row, until it is answered and goes back under its message. */
350
+ .asst-ask-tail { display: flex; flex-direction: column; gap: 10px; min-width: 0; }
351
+ .asst-ask-tail > * { margin-top: 0; }
352
+ /* The card sheet is injected after this one: restate its own gap margin at its specificity. */
353
+ .asst-ask-tail > .asst-followups.asst-ask,
354
+ .asst-ask-tail > .asst-control.asst-ask { margin-top: 0; }
348
355
 
349
- /* ── Empty state ────────────────────────────────────────────────── */
356
+ /* ── Empty state ────────────────────────────────────────────────────
357
+ One column, one hierarchy: the character and the heading, then the
358
+ starters as ghost rows (a prop glyph and a label, no capsule and no
359
+ seam: a faint fill with the md corners only while hovered or
360
+ focused), then the context line (Project · Budget) as quiet sm text
361
+ controls that open the toolbar's own menus (an open menu alone
362
+ wears the gold on-state). The rows and the line come in staggered
363
+ (--i, 40 ms apart), recede while the composer holds a draft, and
364
+ the picked starter keeps the gold on-state until the draft is
365
+ cleared. All of it static under reduced motion (the blanket at the
366
+ end). */
350
367
  .asst-empty {
351
368
  display: flex;
352
369
  flex-direction: column;
353
370
  align-items: center;
354
371
  justify-content: center;
355
- gap: 10px;
372
+ gap: 6px;
356
373
  min-height: 100%;
357
374
  padding: 16px 4px;
358
375
  text-align: center;
359
376
  }
360
- .asst-empty-title { color: var(--asst-text); font-family: var(--ff-heading, inherit); font-size: 20px; font-weight: 600; letter-spacing: -.01em; }
361
- .asst-empty-body { max-width: 440px; color: var(--asst-text-3); font-size: 13px; line-height: 1.55; }
362
- /* The greeting (public/shared/greeting/) takes the lead's place when there is one. */
377
+ @keyframes asst-empty-in { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
378
+ .asst-empty-title { margin-bottom: 8px; color: var(--asst-text); font-family: var(--ff-heading, inherit); font-size: 20px; font-weight: 600; letter-spacing: -.01em; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; }
379
+ /* The greeting (public/shared/greeting/) sits between the heading and the starters. */
363
380
  .asst-empty-greet { display: contents; }
364
- .asst-empty.has-greeting .asst-empty-body { display: none; }
365
- .asst-suggestions { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; max-width: 560px; margin-top: 6px; }
366
- .asst-chip.asst-suggestion { --cap-h: var(--asst-pill-h-md); --cap-r: var(--asst-pill-r-md); --cap-px: var(--asst-pill-px-md); --cap-fs: 12px; justify-content: flex-start; text-align: left; }
381
+ .asst-suggestions { display: flex; flex-direction: column; align-items: stretch; gap: 2px; width: min(100%, 380px); margin-top: 2px; }
382
+ .asst-chip.asst-suggestion { --cap-h: var(--asst-pill-h-md); --cap-r: var(--asst-pill-r-md); --cap-px: var(--asst-pill-px-md); --cap-fs: 12.5px; --cap-gap: 10px; justify-content: flex-start; max-width: none; height: auto; min-height: var(--cap-h); padding: 5px var(--cap-px); background: transparent; box-shadow: none; color: var(--asst-text-2); text-align: left; white-space: normal; line-height: 1.3; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; animation-delay: calc(var(--i, 0) * 40ms); }
383
+ .asst-chip.asst-suggestion .asst-chip-text { white-space: normal; overflow: visible; text-overflow: clip; }
367
384
  .asst-chip.asst-suggestion > .asst-icon svg { width: 20px; height: 14px; }
368
- .asst-chip.asst-suggestion > .asst-icon { color: var(--asst-text-3); }
369
- .asst-chip.asst-suggestion:is(:hover, :focus-visible) > .asst-icon { color: var(--asst-text); }
370
- /* Project and Budget: shared md capsules under the lead, like the suggestions. */
371
- .asst-empty-project { display: flex; flex-wrap: wrap; gap: 6px; justify-content: center; max-width: 100%; }
372
- .asst-dd.asst-empty-control-btn { max-width: min(100%, 360px); }
373
- .asst-empty-control-btn .asst-dd-label { max-width: 30ch; }
385
+ .asst-suggestions .asst-chip.asst-suggestion > .asst-icon:not([hidden]) { margin: 0; padding: 0; box-shadow: none; color: var(--asst-text-3); }
386
+ .asst-suggestions .asst-chip.asst-suggestion:is(:hover, :focus-visible) { background: var(--asst-fill-1); box-shadow: none; color: var(--asst-text); }
387
+ .asst-suggestions .asst-chip.asst-suggestion:is(:hover, :focus-visible) > .asst-icon { box-shadow: none; color: var(--asst-text); }
388
+ .asst-suggestions .asst-chip.asst-suggestion.is-picked { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); color: var(--asst-text); }
389
+ .asst-suggestions .asst-chip.asst-suggestion.is-picked > .asst-icon { color: var(--asst-brand); }
390
+ .asst-empty.is-drafting .asst-chip.asst-suggestion:not(.is-picked):not(:hover):not(:focus-visible) { opacity: .55; }
391
+ /* A starter's quiet aside (the Workspace tour's "· 2 min"): the row's own font, the faint tone. */
392
+ .asst-suggestions .asst-chip.asst-suggestion .asst-chip-meta { flex-shrink: 0; margin-left: 2px; color: var(--asst-text-4); font: inherit; font-size: 11.5px; white-space: nowrap; }
393
+ .asst-suggestions .asst-chip.asst-suggestion .asst-chip-meta::before { content: '· '; }
394
+ /* The context line: the toolbar's Project field drawn once more, and Budget, as quiet sm text controls. */
395
+ .asst-empty-project { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 2px 8px; max-width: 100%; margin-top: 10px; animation: asst-empty-in var(--asst-dur-moderate) var(--asst-ease-enter) backwards; animation-delay: calc(var(--i, 0) * 40ms); }
396
+ .asst-empty-project .asst-dd.asst-empty-control-btn { --cap-h: var(--asst-pill-h-sm); --cap-r: var(--asst-pill-r-sm); --cap-px: var(--asst-pill-px-xs); --cap-gap: 4px; --cap-icon: 12px; --cap-fs: 11.5px; isolation: isolate; max-width: min(100%, 320px); color: var(--asst-text-2); }
397
+ .asst-empty-project .asst-dd.asst-empty-control-btn::after { content: ''; position: absolute; inset: -2px; z-index: -1; border-radius: inherit; }
398
+ .asst-empty-project .asst-dd.asst-empty-control-btn:not([aria-expanded="true"]) { background: transparent; box-shadow: none; }
399
+ .asst-empty-project .asst-dd.asst-empty-control-btn:hover:not([aria-expanded="true"]) { background: var(--asst-fill-1); color: var(--asst-text); }
400
+ .asst-empty-project .asst-dd.asst-empty-control-btn[aria-expanded="true"] { color: var(--asst-text); }
401
+ .asst-empty-project .asst-dd.asst-empty-control-btn > .asst-icon:not([hidden]) { margin: 0; padding: 0; box-shadow: none; color: var(--asst-text-3); }
402
+ .asst-empty-project .asst-dd.asst-empty-control-btn:is(:hover, [aria-expanded="true"]) > .asst-icon:not([hidden]) { box-shadow: none; }
403
+ .asst-empty-project .asst-dd.asst-empty-control-btn .asst-dd-label { max-width: 24ch; }
374
404
  .asst-empty-project-key { flex-shrink: 0; color: var(--asst-text-3); font-weight: 400; }
375
405
 
376
406
  /* ── Messages ───────────────────────────────────────────────────── */
@@ -998,6 +1028,12 @@ export function injectAssistantStyles() {
998
1028
  .asst-usage-run-tokens { color: var(--asst-text-3); font-family: var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
999
1029
 
1000
1030
  /* The provider's usage limit: one line under the gauge, replaced in place (never a transcript row). */
1031
+ .asst-route-fields { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
1032
+ .asst-route-fields .asst-dd { min-width: 0; max-width: 100%; }
1033
+ .asst-route-fields .asst-dd-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1034
+ .asst-limit-dock { position: sticky; bottom: 0; flex: none; z-index: 2; background: var(--asst-bg); }
1035
+ .asst-limit-dock[hidden] { display: none; }
1036
+ .asst-limit-dock .asst-limit-wait { margin: 8px 12px; }
1001
1037
  .asst-limit {
1002
1038
  flex: 0 0 auto;
1003
1039
  display: flex;
@@ -1327,9 +1363,45 @@ export function injectAssistantStyles() {
1327
1363
  .asst-control-plan-body { min-width: 0; }
1328
1364
  .asst-control-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
1329
1365
 
1366
+ /* Follow-ups and the question cards are drawn by the mascot: their sheet is asst-ask-styles.js. */
1367
+
1330
1368
  /* Route card */
1331
1369
  .asst-route-summary { color: var(--asst-text); }
1332
1370
  .asst-route-reasons { margin-top: -4px; color: var(--asst-text-3); font-size: 11.5px; }
1371
+ /* Here / Dispatch: a segmented choice of where the task runs; the list, the model menu and Run follow it.
1372
+ sm capsules in one xs-padded track; the pick takes the gold "on" pair, like the option's key. */
1373
+ .asst-route-sides {
1374
+ display: inline-flex;
1375
+ align-self: flex-start;
1376
+ gap: 2px;
1377
+ padding: 2px;
1378
+ border-radius: var(--asst-pill-r-md);
1379
+ background: var(--asst-fill-1);
1380
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1381
+ }
1382
+ .asst-route-side {
1383
+ display: inline-flex;
1384
+ align-items: center;
1385
+ justify-content: center;
1386
+ min-width: 76px;
1387
+ height: var(--asst-pill-h-sm);
1388
+ padding: 0 var(--asst-pill-px-sm);
1389
+ border: 0;
1390
+ border-radius: var(--asst-pill-r-sm);
1391
+ background: transparent;
1392
+ color: var(--asst-text-2);
1393
+ font: inherit;
1394
+ font-size: 12px;
1395
+ font-weight: 500;
1396
+ white-space: nowrap;
1397
+ cursor: pointer;
1398
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard), box-shadow var(--asst-dur-fast) var(--asst-ease-standard), color var(--asst-dur-fast) var(--asst-ease-standard);
1399
+ }
1400
+ .asst-route-side:hover { background: var(--asst-fill-2); color: var(--asst-text); }
1401
+ .asst-route-side.selected { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); color: var(--asst-text); }
1402
+ .asst-route-side[aria-disabled="true"] { opacity: .45; cursor: not-allowed; }
1403
+ .asst-route-side[aria-disabled="true"]:not(.selected):hover { background: transparent; color: var(--asst-text-2); }
1404
+ .asst-route-side-note { margin-top: -6px; color: var(--asst-text-3); font-size: 11.5px; }
1333
1405
  .asst-route-options { display: flex; flex-direction: column; gap: 4px; }
1334
1406
  .asst-route-option {
1335
1407
  display: flex;
@@ -1399,6 +1471,8 @@ export function injectAssistantStyles() {
1399
1471
  /* Deny / Decline: a neutral ghost with ✕ (red only ever means failed). */
1400
1472
  .asst-btn-danger { background: transparent; box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text-2); }
1401
1473
  .asst-btn-danger:hover:not(:disabled) { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-text-3); color: var(--asst-text); }
1474
+ /* "Stop all" armed: it waits for a second press (asst-agents-dock.js), in the attention tone. */
1475
+ .asst-dock-stopall[data-armed="true"], .asst-dock-stopall[data-armed="true"]:hover:not(:disabled) { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); color: var(--asst-warn); }
1402
1476
  .asst-btn-icon { display: inline-flex; margin-left: -2px; }
1403
1477
  .asst-btn-icon svg { width: 12px; height: 12px; }
1404
1478
 
@@ -1412,7 +1486,7 @@ export function injectAssistantStyles() {
1412
1486
  .assistant-panel :is(.asp-header, .asp-body) :is(button, [role="button"], [tabindex]):focus-visible,
1413
1487
  .asp-session-pill:focus-visible,
1414
1488
  .asp-session-pill .term-minimized-pill-close:focus-visible,
1415
- :is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom):focus-visible {
1489
+ :is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom, .asst-ask-input):focus-visible {
1416
1490
  outline: 2px solid var(--asst-focus);
1417
1491
  outline-offset: 1px;
1418
1492
  }
@@ -1959,11 +2033,9 @@ export function injectAssistantStyles() {
1959
2033
  @container asst (max-width: 400px) {
1960
2034
  .asst-root > * { --asst-inline: 6px; }
1961
2035
  :is(.asst-cost, .asst-bar-group[data-group="context"]) { display: none !important; }
1962
- .asst-suggestions { flex-direction: column; align-items: stretch; width: 100%; }
1963
- .asst-chip.asst-suggestion { justify-content: flex-start; max-width: none; }
1964
- .asst-empty-project { width: 100%; }
1965
- .asst-dd.asst-empty-control-btn { flex: 1 1 auto; justify-content: flex-start; max-width: none; }
1966
- .asst-empty-control-btn .asst-dd-label { flex: 1 1 auto; max-width: none; text-align: start; }
2036
+ .asst-empty { padding-inline: 0; }
2037
+ .asst-suggestions { width: 100%; }
2038
+ .asst-empty-project .asst-dd.asst-empty-control-btn { max-width: 100%; }
1967
2039
  .asst-msg.msg-user .asst-msg-content { max-width: 92%; }
1968
2040
  .asst-route-opt-sub { display: none; }
1969
2041
  .asst-run-main { flex-wrap: wrap; row-gap: 2px; }
@@ -1978,7 +2050,7 @@ export function injectAssistantStyles() {
1978
2050
  }
1979
2051
  @container asst (max-height: 260px) {
1980
2052
  /* the toolbar stays: it carries the controls */
1981
- :is(.asst-empty-body, .asst-empty-mascot, .asst-empty-project, .asst-suggestions, .asst-empty-greet) { display: none !important; }
2053
+ :is(.asst-empty-mascot, .asst-empty-project, .asst-suggestions, .asst-empty-greet) { display: none !important; }
1982
2054
  .asst-empty { gap: 4px; padding: 4px; }
1983
2055
  .asst-empty-title { font-size: 14px; }
1984
2056
  .asst-bottom { margin-top: 6px; }