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
@@ -0,0 +1,192 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — App frame
3
+ // The inset rounded card the workspace sits in (styles.css "APP FRAME"). Outside it is the chrome: the title bar,
4
+ // the two explorers and a gutter of their tone. Inside it is everything else: the 3D and 2D graphs, every floating
5
+ // window and panel, the terminal, menus, tooltips and popovers. Modals and full-window backdrops still cover the
6
+ // whole window.
7
+ //
8
+ // One source of geometry: the CSS variables of :root (--navbar-height, --explorer-width, --file-explorer-width and
9
+ // --frame-gap, which is 0 on a page without the frame). frameRect() is the rect every clamp uses instead of 0,
10
+ // innerWidth, innerHeight or --navbar-height. The top half of this file is DOM-free (unit-tested).
11
+ // ═══════════════════════════════════════════
12
+
13
+ /** The class on <html> of a page that draws the frame (html-shell.js). */
14
+ export const FRAMED_CLASS = 'app-framed';
15
+
16
+ const num = (value) => {
17
+ const n = Number.parseFloat(value);
18
+ return Number.isFinite(n) ? n : 0;
19
+ };
20
+
21
+ /**
22
+ * The frame's rect in viewport pixels from the window's size and the chrome around it: the navbar's height, the
23
+ * open explorers' width and the gutter. A frame the window is too small for collapses to a zero-size rect at its
24
+ * top-left corner instead of turning inside out.
25
+ */
26
+ export function computeFrameRect({ viewportWidth = 0, viewportHeight = 0, navbarHeight = 0, sidebarWidth = 0, gap = 0 } = {}) {
27
+ const g = Math.max(0, num(gap));
28
+ const left = Math.max(0, num(sidebarWidth)) + g;
29
+ const top = Math.max(0, num(navbarHeight)) + g;
30
+ const right = Math.max(left, num(viewportWidth) - g);
31
+ const bottom = Math.max(top, num(viewportHeight) - g);
32
+ return { left, top, right, bottom, width: right - left, height: bottom - top, gap: g };
33
+ }
34
+
35
+ /** The area a menu, tooltip or popover for a point is kept in: `frame` when the point is inside it, else null (the
36
+ * window: the bar and the explorers are outside the frame, and what opens from them stays by them). */
37
+ export function boundsForPoint(frame, x, y) {
38
+ if (!frame || !Number.isFinite(x) || !Number.isFinite(y)) return null;
39
+ return x >= frame.left && x <= frame.right && y >= frame.top && y <= frame.bottom ? frame : null;
40
+ }
41
+
42
+ /** A rect `margin` pixels inside another (never inverted). */
43
+ export function insetRect(rect, margin = 0) {
44
+ const m = Math.max(0, num(margin));
45
+ const left = rect.left + m, top = rect.top + m;
46
+ const right = Math.max(left, rect.right - m), bottom = Math.max(top, rect.bottom - m);
47
+ return { ...rect, left, top, right, bottom, width: right - left, height: bottom - top };
48
+ }
49
+
50
+ /**
51
+ * Where a box of `width` × `height` at (x, y) goes to stay inside `bounds`. A box larger than the bounds keeps its
52
+ * top-left corner inside them (its header stays reachable), the same rule the old window clamps followed.
53
+ */
54
+ export function clampBox(x, y, width, height, bounds) {
55
+ return {
56
+ x: Math.max(bounds.left, Math.min(num(x), bounds.right - Math.max(0, num(width)))),
57
+ y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - Math.max(0, num(height)))),
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Where a box goes that must keep only `keep` pixels on screen (the floating terminals): its left edge may run
63
+ * past the frame's left side and its right side past the frame's right, but its top never above the frame's top
64
+ * (the header stays reachable).
65
+ */
66
+ export function clampBoxLoose(x, y, width, height, bounds, keep = 80) {
67
+ const k = Math.max(0, num(keep));
68
+ return {
69
+ x: Math.max(bounds.left + k - Math.max(0, num(width)), Math.min(num(x), bounds.right - k)),
70
+ y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - k)),
71
+ };
72
+ }
73
+
74
+ // ── Page side ──
75
+
76
+ let _cacheKey = '';
77
+ let _cacheRect = null;
78
+
79
+ const isFramed = (el) => !!el?.classList?.contains?.(FRAMED_CLASS);
80
+
81
+ function inlineKey(el, win) {
82
+ const s = el.style;
83
+ return [
84
+ isFramed(el) ? 1 : 0,
85
+ s.getPropertyValue('--navbar-height'),
86
+ s.getPropertyValue('--explorer-width'),
87
+ s.getPropertyValue('--file-explorer-width'),
88
+ s.getPropertyValue('--frame-gap'),
89
+ win.innerWidth,
90
+ win.innerHeight,
91
+ ].join('|');
92
+ }
93
+
94
+ /**
95
+ * The frame's rect now, in viewport pixels. Cheap to call per pointer event: the computed style is read only when
96
+ * the window's size or one of the inline variables it depends on changed since the last call. A page without the
97
+ * frame (a detached session window, onboarding) has no bar or explorers around its content: the whole window.
98
+ */
99
+ export function frameRect(win = typeof window !== 'undefined' ? window : null) {
100
+ const whole = () => computeFrameRect({ viewportWidth: win?.innerWidth || 0, viewportHeight: win?.innerHeight || 0 });
101
+ const el = win?.document?.documentElement;
102
+ if (!el || !isFramed(el) || typeof win.getComputedStyle !== 'function') return whole();
103
+ try {
104
+ const key = inlineKey(el, win);
105
+ if (key === _cacheKey && _cacheRect) return _cacheRect;
106
+ const cs = win.getComputedStyle(el);
107
+ const navbar = cs.getPropertyValue('--navbar-height');
108
+ _cacheRect = computeFrameRect({
109
+ viewportWidth: win.innerWidth,
110
+ viewportHeight: win.innerHeight,
111
+ navbarHeight: navbar.trim() ? num(navbar) : 48,
112
+ sidebarWidth: num(cs.getPropertyValue('--explorer-width')) + num(cs.getPropertyValue('--file-explorer-width')),
113
+ gap: num(cs.getPropertyValue('--frame-gap')),
114
+ });
115
+ _cacheKey = key;
116
+ return _cacheRect;
117
+ } catch {
118
+ return whole();
119
+ }
120
+ }
121
+
122
+ /** Keep a box inside the frame (inset by `margin`): `{ x, y }` for its top-left corner. */
123
+ export function clampToFrame(x, y, width, height, margin = 0) {
124
+ return clampBox(x, y, width, height, insetRect(frameRect(), margin));
125
+ }
126
+
127
+ /** The area a window of `width` × `height` is kept in: the frame when it fits there, else the whole window less
128
+ * 8px (a modal taller than the frame still shows whole, as it did before the frame). */
129
+ export function windowArea(width, height, rect = frameRect()) {
130
+ if (width <= rect.width && height <= rect.height) return rect;
131
+ const vw = typeof window !== 'undefined' ? window.innerWidth : rect.right;
132
+ const vh = typeof window !== 'undefined' ? window.innerHeight : rect.bottom;
133
+ return insetRect(computeFrameRect({ viewportWidth: vw, viewportHeight: vh }), 8);
134
+ }
135
+
136
+ /** Where a window of `width` × `height` opens by default: centred in the frame, inside it (windowArea). */
137
+ export function centeredInFrame(width, height, rect = frameRect()) {
138
+ const area = windowArea(width, height, rect);
139
+ const at = clampBox(area.left + (area.width - width) / 2, area.top + (area.height - height) / 2, width, height, area);
140
+ return { left: Math.round(at.x), top: Math.round(at.y) };
141
+ }
142
+
143
+ /** The area kept for something opened at a point: the frame when the point is in it, else the whole window. */
144
+ export function placementArea(x, y) {
145
+ const f = frameRect();
146
+ return boundsForPoint(f, x, y) || computeFrameRect({ viewportWidth: window.innerWidth, viewportHeight: window.innerHeight });
147
+ }
148
+
149
+ const _listeners = new Set();
150
+ let _watching = false;
151
+ let _lastNotified = '';
152
+ let _notifyRaf = 0;
153
+
154
+ function notify() {
155
+ _notifyRaf = 0;
156
+ const rect = frameRect();
157
+ const key = `${rect.left}|${rect.top}|${rect.right}|${rect.bottom}`;
158
+ if (key === _lastNotified) return;
159
+ _lastNotified = key;
160
+ for (const fn of [..._listeners]) {
161
+ try { fn(rect); } catch (err) { console.error('[app-frame] listener failed', err); }
162
+ }
163
+ }
164
+
165
+ function schedule() {
166
+ if (_notifyRaf) return;
167
+ _notifyRaf = typeof requestAnimationFrame === 'function' ? requestAnimationFrame(notify) : setTimeout(notify, 16);
168
+ }
169
+
170
+ function watch() {
171
+ if (_watching || typeof window === 'undefined' || !window.document?.documentElement) return;
172
+ _watching = true;
173
+ const r = frameRect();
174
+ _lastNotified = `${r.left}|${r.top}|${r.right}|${r.bottom}`;
175
+ window.addEventListener?.('resize', schedule);
176
+ // An explorer opening or closing, the navbar's measured height and the frame's own class all land on <html>'s
177
+ // inline style or class list. Writes the frame does not depend on (--terminal-height, --right-panel-width…) are
178
+ // filtered out by the rect comparison in notify().
179
+ if (typeof MutationObserver === 'function') {
180
+ new MutationObserver(schedule).observe(window.document.documentElement, { attributes: true, attributeFilter: ['style', 'class'] });
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Call `fn(rect)` once per frame in which the frame's rect changed (window resize, an explorer opening or closing,
186
+ * the navbar's height). Returns the unsubscribe function.
187
+ */
188
+ export function onFrameChange(fn) {
189
+ _listeners.add(fn);
190
+ watch();
191
+ return () => _listeners.delete(fn);
192
+ }
@@ -17,15 +17,19 @@
17
17
  // and current step. A mini scene or a lane brings that run's card into view
18
18
  // in the transcript (hooks.onReveal). hooks.onRunChange hears every change
19
19
  // to a run, whatever its source, so the transcript's card follows the tray.
20
+ // "Stop all" asks twice (asst-stop.js createConfirmGate): the first press
21
+ // turns it into "Stop N agents?", a second press within a few seconds stops
22
+ // every run of the session at once. It sits right under the transcript's
23
+ // last card, so one stray click or key there must not end the session's work.
20
24
 
21
25
  import { on } from '../state.js';
22
- import { getProviderMeta } from '../provider-icons.js';
23
26
  import { listAssistantRuns } from './asst-api.js';
24
27
  import { buildRunCard, tickRunCard, updateRunCard } from './asst-render.js';
25
28
  import { awaitsAnswer, compactActivity, isLivePhase, phaseLine, sceneFor, sceneSvg, stageLabel, stagePhase, stepLine } from './asst-scenes.js';
26
29
  import { injectSceneStyles } from './asst-scene-styles.js';
27
30
  import { plural } from './asst-tool-kinds.js';
28
- import { isRemovableRun, isRunIdle, isTerminalRunStatus, mergeRunDescriptor, runFromPayload, runNeedsAttention, sortRuns } from './asst-state.js';
31
+ import { isRemovableRun, isRunIdle, isTerminalRunStatus, mergeRunDescriptor, providerMeta, runFromPayload, runNeedsAttention, sortRuns } from './asst-state.js';
32
+ import { createConfirmGate } from './asst-stop.js';
29
33
 
30
34
  const TICK_MS = 5000;
31
35
  const SHOW_ALL_LIMIT = 40;
@@ -47,7 +51,8 @@ function esc(value) {
47
51
 
48
52
  /**
49
53
  * createAgentsDock(hostEl, hooks)
50
- * hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target), onStopAll(),
54
+ * hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target),
55
+ * onStopAll() (the second press of "Stop all"; stopAllConfirmMs / stopAllMinGapMs time it),
51
56
  * onRemove(runId), onClearFinished(runIds), onReveal(runId), onRunChange(run),
52
57
  * open, showAll, onToggle(open), onShowAllChange(showAll),
53
58
  * onCountChange({ total, active, attention, answer, idle, working, waiting, visible }) }
@@ -83,6 +88,20 @@ export function createAgentsDock(hostEl, hooks = {}) {
83
88
  const stopAllBtn = root.querySelector('.asst-dock-stopall');
84
89
  const clearBtn = root.querySelector('.asst-dock-clear');
85
90
  const body = root.querySelector('.asst-dock-body');
91
+ // Armed, "Stop all" says what it would stop and waits for the second press (then lapses by itself).
92
+ const stopAllGate = createConfirmGate({ windowMs: hooks.stopAllConfirmMs, minGapMs: hooks.stopAllMinGapMs, onChange: () => paintStopAll() });
93
+ function paintStopAll(active = counts().active) {
94
+ const armed = stopAllGate.isArmed();
95
+ const label = armed
96
+ ? plural(t, 'assistant.dock.stopAllConfirm', active, 'Stop {count} agent?', 'Stop {count} agents?')
97
+ : t('assistant.dock.stopAll', 'Stop all');
98
+ const tip = armed
99
+ ? t('assistant.dock.stopAllConfirmTip', 'Press again to stop every agent of this session')
100
+ : t('assistant.dock.stopAllTip', 'Stop every agent of this session (asks once more)');
101
+ if (stopAllBtn.textContent !== label) stopAllBtn.textContent = label;
102
+ stopAllBtn.dataset.armed = armed ? 'true' : 'false';
103
+ stopAllBtn.setAttribute('data-tooltip', tip);
104
+ }
86
105
 
87
106
  const runs = new Map(); // runId → descriptor
88
107
  const cards = new Map(); // runId → element
@@ -146,8 +165,8 @@ export function createAgentsDock(hostEl, hooks = {}) {
146
165
  return {
147
166
  t: hooks.t,
148
167
  compact: true,
149
- providerIcon: (p) => getProviderMeta(p).icon,
150
- providerColor: (p) => getProviderMeta(p).color,
168
+ providerIcon: (p) => providerMeta(p).icon,
169
+ providerColor: (p) => providerMeta(p).color,
151
170
  onFocus: hooks.onFocus,
152
171
  onStop: hooks.onStop,
153
172
  onRead: hooks.onRead,
@@ -181,6 +200,8 @@ export function createAgentsDock(hostEl, hooks = {}) {
181
200
  summaryEl.textContent = summaryText(c);
182
201
  root.classList.toggle('attention', c.attention > 0);
183
202
  stopAllBtn.hidden = c.active === 0;
203
+ if (stopAllBtn.hidden) stopAllGate.reset();
204
+ paintStopAll(c.active);
184
205
  clearBtn.hidden = !open || typeof hooks.onClearFinished !== 'function' || ![...runs.values()].some(isRemovableRun);
185
206
  showAllBtn.hidden = !open;
186
207
  showAllBtn.setAttribute('aria-pressed', showAll ? 'true' : 'false');
@@ -390,7 +411,15 @@ export function createAgentsDock(hostEl, hooks = {}) {
390
411
 
391
412
  toggle.addEventListener('click', () => setOpen(!open));
392
413
  showAllBtn.addEventListener('click', () => { showAll = !showAll; hooks.onShowAllChange?.(showAll); refresh().finally(render); });
393
- stopAllBtn.addEventListener('click', () => hooks.onStopAll?.());
414
+ stopAllBtn.addEventListener('click', () => {
415
+ if (stopAllBtn.hidden || destroyed) return;
416
+ if (stopAllGate.press() === 'confirmed') hooks.onStopAll?.();
417
+ });
418
+ stopAllBtn.addEventListener('keydown', (e) => {
419
+ // A held Enter repeats its click: only the first press of a key counts.
420
+ if (e.repeat && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); return; }
421
+ if (e.key === 'Escape' && stopAllGate.reset()) { e.preventDefault(); e.stopPropagation(); }
422
+ });
394
423
  clearBtn.addEventListener('click', () => {
395
424
  const ids = [...runs.values()].filter(isRemovableRun).map(r => r.runId);
396
425
  if (ids.length) hooks.onClearFinished?.(ids);
@@ -443,6 +472,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
443
472
  destroy() {
444
473
  destroyed = true;
445
474
  if (ticker) clearInterval(ticker);
475
+ stopAllGate.destroy();
446
476
  activities.clear();
447
477
  unsubs.forEach(off => { try { off(); } catch { /* ignore */ } });
448
478
  root.remove();
@@ -48,7 +48,7 @@ export function fetchAssistantCatalog({ force = false } = {}) {
48
48
 
49
49
  // ── Hidden models (Assistant → Models) ───────
50
50
 
51
- /** → { ok, providers: { 'claude-code': [], codex: [], opencode: [] } } */
51
+ /** → { ok, providers: { 'claude-code': [], codex: [], opencode: [], antigravity: [] } } */
52
52
  export function getHiddenModelLists() {
53
53
  return jsonFetch('/api/assistant/hidden-models');
54
54
  }
@@ -0,0 +1,270 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Assistant — the cards the mascot presents: styles
3
+ // ═══════════════════════════════════════════
4
+ // Injected once as <style id="asst-ask-styles">, right after the main
5
+ // assistant styles (asst-styles.js), like the rack's sheet. Two kinds of card
6
+ // share it (asst-ask.js): the follow-ups card under a finished message and the
7
+ // question cards a brain asks with (.asst-control.asst-ask). Both open on a
8
+ // stage, the rack's: the mascot (64×32; 48×24 at 400px, 40×20 at 320px) beside
9
+ // what it says, in a bubble whose notch points at it; the answers run full
10
+ // width under it: option rows with a number key, gold once picked. Gold means
11
+ // picked (or live) only; red never appears here. No keyframes and no infinite
12
+ // motion: the rig moves on the shared ticker, the rows move by transitions,
13
+ // and prefers-reduced-motion drops those too. Focus rings are the panel's one
14
+ // recipe (asst-styles.js). Tokens come from asst-styles.js.
15
+
16
+ export const ASK_STYLE_ID = 'asst-ask-styles';
17
+
18
+ export const ASK_CSS = `
19
+ .asst-ask {
20
+ --ask-face-col: 68px;
21
+ --ask-face-w: 64px;
22
+ --ask-face-h: 32px;
23
+ --ask-ring: var(--asst-line);
24
+ }
25
+ .asst-ask-face { display: flex; flex: 0 0 var(--ask-face-col); justify-content: center; align-self: flex-start; min-width: 0; padding-top: 2px; color: var(--asst-text); line-height: 0; }
26
+ .asst-ask-face svg { display: block; width: var(--ask-face-w); height: var(--ask-face-h); overflow: visible; }
27
+ /* The stage: the face and its first bubble, side by side. */
28
+ .asst-ask-stage { display: flex; align-items: flex-start; gap: 2px; min-width: 0; }
29
+
30
+ /* What the mascot says: a bubble whose notch points at it (the rack's bubble). */
31
+ .asst-ask-bubble {
32
+ position: relative;
33
+ flex: 0 1 auto;
34
+ align-self: flex-start;
35
+ max-width: calc(100% - 6px);
36
+ min-width: 0;
37
+ margin-left: 6px;
38
+ padding: 7px 11px 8px;
39
+ border-radius: 3px 12px 12px 12px;
40
+ background: var(--asst-fill-1);
41
+ box-shadow: inset 0 0 0 1px var(--asst-line);
42
+ color: var(--asst-text);
43
+ overflow-wrap: anywhere;
44
+ }
45
+ .asst-ask-bubble.is-lead::before {
46
+ content: '';
47
+ position: absolute;
48
+ left: -5.5px;
49
+ top: 9px;
50
+ width: 11px;
51
+ height: 11px;
52
+ background: var(--asst-fill-1);
53
+ box-shadow: inset 1px -1px 0 var(--asst-line);
54
+ clip-path: polygon(0 0, 0 100%, 100% 100%);
55
+ transform: rotate(45deg);
56
+ pointer-events: none;
57
+ }
58
+ .asst-ask-title { font-size: 13px; font-weight: 500; line-height: 1.45; }
59
+ .asst-ask-hint { margin-top: 2px; color: var(--asst-text-3); font-size: 11.5px; line-height: 1.4; }
60
+
61
+ /* Answers: one row each, its number key first; picked rows are gold. */
62
+ .asst-ask-options { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
63
+ .asst-ask .asst-ask-option {
64
+ position: relative;
65
+ display: flex;
66
+ flex-direction: row;
67
+ align-items: center;
68
+ gap: 10px;
69
+ width: 100%;
70
+ min-width: 0;
71
+ min-height: 36px;
72
+ padding: 6px 10px;
73
+ border: 0;
74
+ border-radius: var(--asst-r-field);
75
+ background: var(--asst-fill-1);
76
+ box-shadow: inset 0 0 0 1px var(--asst-line);
77
+ color: var(--asst-text);
78
+ font: inherit;
79
+ font-size: 13px;
80
+ line-height: 1.4;
81
+ text-align: left;
82
+ cursor: pointer;
83
+ transition:
84
+ background-color var(--asst-dur-fast) var(--asst-ease-standard),
85
+ box-shadow var(--asst-dur-fast) var(--asst-ease-standard),
86
+ opacity var(--asst-dur-fast) var(--asst-ease-standard),
87
+ transform var(--asst-dur-instant) var(--asst-ease-standard);
88
+ }
89
+ .asst-ask .asst-ask-option:hover:not(:disabled) { background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2); }
90
+ .asst-ask .asst-ask-option:active:not(:disabled) { transform: translateY(1px); }
91
+ .asst-ask .asst-ask-option:disabled { cursor: default; }
92
+ .asst-ask .asst-ask-option:is(.selected, .chosen) { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); }
93
+ .asst-ask-key {
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ flex-shrink: 0;
98
+ width: var(--asst-pill-h-xs);
99
+ height: var(--asst-pill-h-xs);
100
+ border-radius: var(--asst-pill-r-xs);
101
+ background: var(--asst-fill-1);
102
+ box-shadow: inset 0 0 0 1px var(--asst-line-2);
103
+ color: var(--asst-text-2);
104
+ font-family: var(--asst-mono);
105
+ font-size: 10.5px;
106
+ font-variant-numeric: tabular-nums;
107
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard), color var(--asst-dur-fast) var(--asst-ease-standard);
108
+ }
109
+ .asst-ask .asst-ask-option:is(.selected, .chosen) .asst-ask-key { background: var(--asst-brand); box-shadow: none; color: var(--asst-ink); }
110
+ .asst-ask-main { display: flex; flex: 1 1 auto; flex-direction: column; gap: 2px; min-width: 0; }
111
+ .asst-ask-label { font-weight: 500; overflow-wrap: anywhere; }
112
+ .asst-ask-desc { color: var(--asst-text-3); font-size: 11.5px; overflow-wrap: anywhere; }
113
+ .asst-ask-badge {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ flex-shrink: 0;
117
+ height: var(--asst-pill-h-xs);
118
+ padding: 0 var(--asst-pill-px-xs);
119
+ border-radius: var(--asst-pill-r-xs);
120
+ background: var(--asst-fill-1);
121
+ box-shadow: inset 0 0 0 1px var(--asst-line-2);
122
+ color: var(--asst-text-2);
123
+ font-size: 10.5px;
124
+ font-weight: 500;
125
+ white-space: nowrap;
126
+ }
127
+ .asst-ask-go { flex-shrink: 0; color: var(--asst-text-4); font-size: 12px; transition: color var(--asst-dur-fast) var(--asst-ease-standard); }
128
+ .asst-ask .asst-ask-option:is(:hover, :focus-visible):not(:disabled) .asst-ask-go { color: var(--asst-text); }
129
+ .asst-ask[data-state="answered"] .asst-ask-option:not(.chosen) { opacity: .45; }
130
+
131
+ /* A typed answer: the field the composer's own look, Enter sends it. */
132
+ .asst-ask-answer { display: flex; gap: 6px; min-width: 0; }
133
+ .asst-ask .asst-ask-input {
134
+ flex: 1 1 auto;
135
+ width: 100%;
136
+ min-width: 0;
137
+ height: 32px;
138
+ padding: 0 10px;
139
+ border: 0;
140
+ border-radius: var(--asst-r-field);
141
+ outline: none;
142
+ background: var(--asst-field);
143
+ box-shadow: inset 0 0 0 1px var(--asst-line);
144
+ color: var(--asst-text);
145
+ font: inherit;
146
+ font-size: 12.5px;
147
+ resize: none;
148
+ }
149
+ .asst-ask .asst-ask-input:focus { box-shadow: inset 0 0 0 1px var(--asst-line-2); }
150
+ .asst-ask .asst-ask-input::placeholder { color: var(--asst-text-3); opacity: 1; }
151
+
152
+ .asst-ask-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
153
+ .asst-ask-actions .asst-btn { max-width: 100%; }
154
+ /* A confirm's choice stays clear while the mascot hops; the other one dims like any spent button. */
155
+ .asst-ask .asst-ask-actions .asst-btn.chosen:disabled { opacity: 1; }
156
+ .asst-ask-actions .asst-btn-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
157
+ .asst-ask .asst-ask-other { background: transparent; box-shadow: none; color: var(--asst-text-3); }
158
+ .asst-ask .asst-ask-other:hover:not(:disabled) { background: var(--asst-fill-1); box-shadow: none; color: var(--asst-text); }
159
+ /* The keys, said once focus is in the card. */
160
+ .asst-ask-keys { display: none; margin-left: auto; color: var(--asst-text-3); font-size: 11px; line-height: 1.4; }
161
+ .asst-ask:focus-within .asst-ask-keys { display: inline; }
162
+
163
+ /* ── The follow-ups card: open, the mascot presents; answered or left behind, one line ── */
164
+ .asst-followups.asst-ask {
165
+ display: flex;
166
+ flex-direction: column;
167
+ gap: 8px;
168
+ max-width: 560px;
169
+ min-width: 0;
170
+ margin-top: 10px;
171
+ padding: 12px 14px;
172
+ border-radius: var(--asst-r-card);
173
+ background: var(--asst-card);
174
+ box-shadow: inset 0 0 0 1px var(--ask-ring), var(--asst-card-hi);
175
+ color: var(--asst-text);
176
+ font-size: 13px;
177
+ }
178
+ .asst-followups.asst-ask[data-style="question"] { --ask-ring: color-mix(in srgb, var(--asst-info) 30%, transparent); }
179
+ .asst-ask-receipt { display: none; }
180
+ .asst-followups.asst-ask:not([data-state="open"]):not([data-phase="sending"]) {
181
+ --ask-face-col: 28px;
182
+ --ask-face-w: 28px;
183
+ --ask-face-h: 14px;
184
+ flex-direction: row;
185
+ align-items: center;
186
+ gap: 8px;
187
+ width: fit-content;
188
+ max-width: min(100%, 560px);
189
+ min-height: var(--asst-pill-h-md);
190
+ padding: 4px 10px 4px 8px;
191
+ border-radius: var(--asst-pill-r-md);
192
+ background: var(--asst-fill-1);
193
+ box-shadow: inset 0 0 0 1px var(--asst-line);
194
+ }
195
+ .asst-followups.asst-ask:not([data-state="open"]):not([data-phase="sending"]) > .asst-ask-stage { display: contents; }
196
+ .asst-followups.asst-ask:not([data-state="open"]):not([data-phase="sending"]) .asst-ask-face { padding: 0; align-self: center; }
197
+ .asst-followups.asst-ask:not([data-state="open"]):not([data-phase="sending"]) :is(.asst-ask-bubble, .asst-ask-options, .asst-ask-answer, .asst-ask-actions) { display: none; }
198
+ .asst-followups.asst-ask:not([data-state="open"]):not([data-phase="sending"]) .asst-ask-receipt {
199
+ display: flex;
200
+ flex-wrap: wrap;
201
+ align-items: center;
202
+ gap: 4px 8px;
203
+ min-width: 0;
204
+ color: var(--asst-text-3);
205
+ font-size: 12px;
206
+ line-height: 1.4;
207
+ }
208
+ .asst-followups.asst-ask[data-state="stale"] .asst-ask-face { opacity: .55; }
209
+ .asst-ask-receipt-title { min-width: 0; max-width: 100%; overflow: hidden; color: var(--asst-text-2); text-overflow: ellipsis; white-space: nowrap; }
210
+ .asst-ask-receipt-arrow { color: var(--asst-text-4); }
211
+ .asst-ask-chip {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ max-width: 100%;
215
+ min-height: 20px;
216
+ padding: 1px 7px;
217
+ border-radius: var(--asst-pill-r-xs);
218
+ background: var(--asst-pill-on-fill);
219
+ box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring);
220
+ color: var(--asst-text);
221
+ font-size: 11.5px;
222
+ font-weight: 500;
223
+ overflow-wrap: anywhere;
224
+ }
225
+ .asst-ask-receipt-list { min-width: 0; color: var(--asst-text-3); overflow-wrap: anywhere; }
226
+ .asst-ask-receipt-status { color: var(--asst-text-3); font-size: 11px; }
227
+
228
+ /* ── The question cards (asst-control.js): the same mascot, the card's own head and actions ── */
229
+ .asst-control.asst-ask { background: var(--asst-card); }
230
+ /* The presenter is its face: no second cameo in the head. */
231
+ .asst-control.asst-ask .asst-control-head > .asst-control-face { display: none; }
232
+ .asst-control.asst-ask .asst-control-q { gap: 8px; }
233
+ .asst-control.asst-ask .asst-control-q-header { color: var(--asst-text-3); font-size: 11.5px; font-weight: 500; }
234
+ .asst-control.asst-ask .asst-control-options { gap: 4px; }
235
+ .asst-control.asst-ask .asst-control-option.selected { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); }
236
+ /* Answered: the picks stay (gold), the rest goes; nothing to press any more. The record stays readable
237
+ (no dimming of the whole card: the ✓ capsule, the status word and the still face say it is settled). */
238
+ .asst-control.asst-ask.resolved { opacity: 1; }
239
+ .asst-control.asst-ask.resolved .asst-control-option:not(.selected) { display: none; }
240
+ .asst-control.asst-ask.resolved .asst-ask-input:placeholder-shown { display: none; }
241
+ .asst-control.asst-ask.resolved :is(.asst-control-actions, .asst-control-deny-msg, .asst-control-q-hint, .asst-ask-keys) { display: none; }
242
+ .asst-control.asst-ask.resolved .asst-ask-face:not(.is-answered) { opacity: .55; }
243
+
244
+ /* Narrow panels: a smaller mascot in a narrower column; at 320px the keys line goes. */
245
+ @container asst (max-width: 400px) {
246
+ .asst-ask { --ask-face-col: 52px; --ask-face-w: 48px; --ask-face-h: 24px; }
247
+ .asst-followups.asst-ask, .asst-control.asst-ask { padding: 10px; }
248
+ .asst-ask .asst-ask-option { min-height: 40px; }
249
+ }
250
+ @container asst (max-width: 320px) {
251
+ .asst-ask { --ask-face-col: 44px; --ask-face-w: 40px; --ask-face-h: 20px; }
252
+ .asst-ask .asst-ask-option { gap: 8px; padding: 6px 8px; }
253
+ .asst-ask:focus-within .asst-ask-keys { display: none; }
254
+ }
255
+ @media (prefers-reduced-motion: reduce) {
256
+ .asst-ask, .asst-ask * { transition: none !important; }
257
+ }
258
+ `;
259
+
260
+ /** Add the sheet once, right after the main assistant styles when they are in the page. */
261
+ export function injectAskStyles(doc = globalThis.document) {
262
+ if (!doc || typeof doc.getElementById !== 'function' || typeof doc.createElement !== 'function') return;
263
+ if (doc.getElementById(ASK_STYLE_ID)) return;
264
+ const style = doc.createElement('style');
265
+ style.id = ASK_STYLE_ID;
266
+ style.textContent = ASK_CSS;
267
+ const main = doc.getElementById('assistant-panel-styles');
268
+ if (main?.parentNode) main.after(style);
269
+ else doc.head?.appendChild(style);
270
+ }