synabun 1.3.0 → 2.0.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 (1163) hide show
  1. package/CHANGELOG.md +205 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +136 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -0,0 +1,1686 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Assistant — styles ("black with faint panels")
3
+ // ═══════════════════════════════════════════
4
+ // Injected once like cdx/cdx-styles.js. The palette is a small token set under
5
+ // `:where(:root)` — zero specificity, so body-level menus, modals, the
6
+ // lightbox and the float chip see it and skins can still override any token.
7
+ // A flush toolbar sits under the terminal tabs (the tab already names the
8
+ // session, so there is no header); the black transcript runs below it, and one
9
+ // faint card at the bottom holds the trays and the composer.
10
+ // No backdrop blur and no standing compositor-layer hints anywhere: blur over
11
+ // a repainting body forces a compositor re-blur, and a permanent layer per tab
12
+ // costs GPU memory.
13
+ // Every pill, chip, badge and button is one capsule (see Capsules), a rounded
14
+ // rectangle on the --asst-pill-* and --asst-dur-* / --asst-ease-* scales.
15
+ // Infinite animations pause during drags (body.ui-interacting) and stop under
16
+ // prefers-reduced-motion.
17
+
18
+ export function injectAssistantStyles() {
19
+ if (document.getElementById('assistant-panel-styles')) return;
20
+ const style = document.createElement('style');
21
+ style.id = 'assistant-panel-styles';
22
+ style.textContent = `
23
+ /* ── Tokens ─────────────────────────────────────────────────────── */
24
+ :where(:root) {
25
+ --asst-bg: #0a0a0c;
26
+ --asst-card: #0f0f11;
27
+ --asst-bar: var(--asst-card);
28
+ --asst-card-ring: rgba(255,255,255,.06);
29
+ --asst-card-ring-focus: rgba(255,255,255,.13);
30
+ --asst-card-shadow: 0 1px 2px rgba(0,0,0,.45);
31
+ --asst-card-hi: inset 0 1px 0 rgba(255,255,255,.025);
32
+ --asst-popover: #131316;
33
+ --asst-popover-ring: rgba(255,255,255,.09);
34
+ --asst-popover-shadow: 0 18px 44px rgba(0,0,0,.62), 0 3px 10px rgba(0,0,0,.5);
35
+ --asst-scrim: rgba(0,0,0,.6);
36
+ --asst-scrim-strong: rgba(0,0,0,.84);
37
+ --asst-fill-1: rgba(255,255,255,.04);
38
+ --asst-fill-2: rgba(255,255,255,.065);
39
+ --asst-fill-3: rgba(255,255,255,.10);
40
+ --asst-field: rgba(255,255,255,.025);
41
+ --asst-line: rgba(255,255,255,.07);
42
+ --asst-line-2: rgba(255,255,255,.12);
43
+ --asst-text: var(--t-bright, rgba(255,255,255,.9));
44
+ --asst-text-2: rgba(255,255,255,.64);
45
+ --asst-text-3: rgba(255,255,255,.52); /* text: ≈5.7:1 on the card */
46
+ --asst-text-4: rgba(255,255,255,.28);
47
+ --asst-brand: var(--accent-gold, rgba(255,215,0,.85));
48
+ --asst-brand-line: color-mix(in srgb, var(--asst-brand) 36%, transparent);
49
+ --asst-focus: var(--accent-blue, hsl(199, 92%, 64%));
50
+ --asst-info: color-mix(in srgb, var(--asst-focus) 62%, rgba(255,255,255,.7));
51
+ --asst-live: var(--accent-red, #FF5252);
52
+ --asst-warn: var(--accent-orange, #FFB74D);
53
+ --asst-r-card: 10px;
54
+ --asst-r-field: 8px;
55
+ --asst-r-bubble: 14px;
56
+ --asst-r-ctl: 7px;
57
+ --asst-col: 860px;
58
+ --asst-mono: 'JetBrains Mono', 'Fira Code', 'SF Mono', monospace;
59
+ --asst-ink: #0a0a0c; /* text on a light fill (primary button, send) */
60
+ /* Pills: xs counts and meta · sm status and the toolbar · md the composer, cards, buttons. */
61
+ --asst-pill-h-xs: 18px;
62
+ --asst-pill-h-sm: 22px;
63
+ --asst-pill-h-md: 28px;
64
+ /* Corners at about a quarter of the height, like the tray pills (8px on 32): rounded rectangles, never full capsules. */
65
+ --asst-pill-r-xs: 5px;
66
+ --asst-pill-r-sm: 6px;
67
+ --asst-pill-r-md: 8px;
68
+ --asst-pill-px-xs: 6px;
69
+ --asst-pill-px-sm: 8px;
70
+ --asst-pill-px-md: 11px;
71
+ /* The only tinted fills: gold for selected or working, red for failed. */
72
+ --asst-pill-on-fill: color-mix(in srgb, var(--asst-brand) 16%, transparent);
73
+ --asst-pill-on-ring: color-mix(in srgb, var(--asst-brand) 42%, transparent);
74
+ --asst-pill-err-fill: color-mix(in srgb, var(--asst-live) 12%, transparent);
75
+ --asst-pill-err-ring: color-mix(in srgb, var(--asst-live) 42%, transparent);
76
+ --asst-pill-warn-ring: color-mix(in srgb, var(--asst-warn) 42%, transparent);
77
+ /* Motion (Carbon productive curves). Transitions name their properties. */
78
+ --asst-dur-instant: 80ms;
79
+ --asst-dur-fast: 140ms;
80
+ --asst-dur-base: 200ms;
81
+ --asst-dur-moderate: 240ms;
82
+ --asst-dur-slow: 320ms;
83
+ --asst-ease-standard: cubic-bezier(.2,0,.38,.9);
84
+ --asst-ease-enter: cubic-bezier(0,0,.38,.9);
85
+ --asst-ease-exit: cubic-bezier(.2,0,1,.9);
86
+ --asst-ease-emphasized: cubic-bezier(.4,.14,.3,1);
87
+ --asst-ease-spring: linear(0, 0.35 9%, 0.78 21%, 1.03 40%, 0.99 60%, 1);
88
+ }
89
+
90
+ /* ── Viewport shell ─────────────────────────────────────────────────
91
+ styles.css gives non-terminal tabs an inset card (inset 6px 8px 8px,
92
+ radius 12px, float padding) and the open file tree a 16px radius.
93
+ The assistant is edge to edge; its own cards carry the inset. */
94
+ .term-viewport.assistant-viewport {
95
+ inset: 0 !important;
96
+ padding: 0 !important;
97
+ border-radius: 0 !important;
98
+ display: flex;
99
+ flex-direction: column;
100
+ background: var(--asst-bg);
101
+ color: var(--asst-text);
102
+ contain: layout paint;
103
+ }
104
+ .term-float-tab-body:has(> .term-float-viewport-wrap > .assistant-viewport) { padding: 0 !important; }
105
+
106
+ /* The UA [hidden] rule loses to any display declaration below. */
107
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay, .asst-lightbox) [hidden],
108
+ .asst-root[hidden],
109
+ .term-float-brain-chip[hidden] { display: none !important; }
110
+
111
+ .asst-root {
112
+ container: asst / size;
113
+ --asst-inline: max(8px, calc((100% - var(--asst-col)) / 2));
114
+ position: relative;
115
+ display: flex;
116
+ flex-direction: column;
117
+ flex: 1 1 auto;
118
+ min-width: 0;
119
+ min-height: 0;
120
+ height: 100%;
121
+ background: var(--asst-bg);
122
+ color: var(--asst-text);
123
+ font-size: 13px;
124
+ line-height: 1.45;
125
+ }
126
+ .asst-icon { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
127
+ .asst-icon svg { width: 14px; height: 14px; }
128
+ /* Thin dark scrollbars on every inner scroller (code blocks, tool output,
129
+ trays). Standard properties for Chromium/Firefox; ::-webkit-scrollbar for
130
+ WebKit (the Safari web app), which ignores the standard ones. */
131
+ :is(.asst-root, .asst-dd-menu, .asst-modal) * { scrollbar-width: thin; scrollbar-color: var(--asst-fill-3) transparent; }
132
+ :is(.asst-root, .asst-dd-menu, .asst-modal) *::-webkit-scrollbar { width: 8px; height: 8px; }
133
+ :is(.asst-root, .asst-dd-menu, .asst-modal) *::-webkit-scrollbar-track { background: transparent; }
134
+ :is(.asst-root, .asst-dd-menu, .asst-modal) *::-webkit-scrollbar-corner { background: transparent; }
135
+ :is(.asst-root, .asst-dd-menu, .asst-modal) *::-webkit-scrollbar-thumb { background: var(--asst-fill-3); border: 2px solid transparent; border-radius: 8px; background-clip: padding-box; }
136
+
137
+ /* ── Capsules ───────────────────────────────────────────────────────
138
+ Every pill, chip, badge and button is one capsule: an optional glyph
139
+ half, a 1px seam (the two-pill mark), a label half. Its corners are a
140
+ quarter of its height (--asst-pill-r-*: 5/6/8px), a rounded rectangle
141
+ like the tray pills, never a full capsule.
142
+ md (28) is the default here: the composer row, cards and buttons; the
143
+ toolbar and chips are sm (22); counts and meta are xs (18). A value
144
+ (a field, a count, a status) wears a fill and a ring; an icon-only
145
+ action is a bare square of its row's height until hovered. Labels are
146
+ sans 500, values (model ids, paths, counts, durations) mono. Gold only
147
+ for selected or working, red only for failed.
148
+ Glyphs sit dead centre, by one rule: a glyph is inset by --cap-glyph-pad
149
+ on both sides, (--cap-h − --cap-icon) / 2, so a glyph half is a --cap-h
150
+ square (then the seam), and a capsule down to its glyph (the container
151
+ queries at the end) is that square alone: grid-centred, padding 0, no
152
+ seam, no label half. Icon-only actions are --cap-h squares, grid-centred.
153
+ SVGs are display:block, so no baseline gap moves them. */
154
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-btn, .asst-chip, .asst-cost, .asst-send) {
155
+ --cap-h: var(--asst-pill-h-md);
156
+ --cap-r: var(--asst-pill-r-md);
157
+ --cap-px: var(--asst-pill-px-md);
158
+ --cap-gap: 7px;
159
+ --cap-icon: 14px;
160
+ --cap-fs: 12px;
161
+ --cap-glyph-pad: calc((var(--cap-h) - var(--cap-icon)) / 2);
162
+ position: relative;
163
+ display: inline-flex;
164
+ flex: 0 0 auto;
165
+ align-items: center;
166
+ justify-content: center;
167
+ gap: var(--cap-gap);
168
+ height: var(--cap-h);
169
+ min-width: var(--cap-h);
170
+ padding: 0 var(--cap-px);
171
+ border: 0;
172
+ border-radius: var(--cap-r);
173
+ background: var(--asst-fill-1);
174
+ box-shadow: inset 0 0 0 1px var(--asst-line);
175
+ color: var(--asst-text-2);
176
+ font: inherit;
177
+ font-size: var(--cap-fs);
178
+ font-weight: 500;
179
+ line-height: 1;
180
+ white-space: nowrap;
181
+ text-decoration: none;
182
+ cursor: pointer;
183
+ transition:
184
+ background-color var(--asst-dur-fast) var(--asst-ease-standard),
185
+ box-shadow var(--asst-dur-fast) var(--asst-ease-standard),
186
+ color var(--asst-dur-fast) var(--asst-ease-standard),
187
+ opacity var(--asst-dur-fast) var(--asst-ease-standard),
188
+ transform var(--asst-dur-instant) var(--asst-ease-standard);
189
+ }
190
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-btn, .asst-cost, .asst-send) > svg,
191
+ :is(.asst-dd, .asst-tb-btn, .asst-chip, .asst-btn) > .asst-icon svg { display: block; width: var(--cap-icon); height: var(--cap-icon); }
192
+ :is(.asst-tb-btn, .asst-iconbtn, .asst-send) > svg { fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
193
+ /* sm: the toolbar (terminal tab or sidepanel header) and chips; xs: counts and meta. */
194
+ .asst-bar :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-cost), .asst-chip {
195
+ --cap-h: var(--asst-pill-h-sm);
196
+ --cap-r: var(--asst-pill-r-sm);
197
+ --cap-px: var(--asst-pill-px-sm);
198
+ --cap-gap: 6px;
199
+ --cap-icon: 12px;
200
+ --cap-fs: 11px;
201
+ }
202
+ /* The glyph half runs from the pill's leading edge to the seam: the glyph centred, --cap-glyph-pad each side. */
203
+ :is(.asst-dd, .asst-tb-btn, .asst-chip) > .asst-icon:not([hidden]):not(:last-child) {
204
+ align-self: stretch;
205
+ margin-left: calc(-1 * var(--cap-px));
206
+ padding: 0 calc(var(--cap-glyph-pad) + 1px) 0 var(--cap-glyph-pad);
207
+ box-shadow: inset -1px 0 0 var(--asst-line);
208
+ color: var(--asst-text-3);
209
+ transition: box-shadow var(--asst-dur-fast) var(--asst-ease-standard), color var(--asst-dur-fast) var(--asst-ease-standard);
210
+ }
211
+ :is(.asst-dd, .asst-tb-btn, .asst-chip):hover > .asst-icon { box-shadow: inset -1px 0 0 var(--asst-line-2); color: var(--asst-text-2); }
212
+ :is(.asst-dd, .asst-tb-btn):is([aria-expanded="true"], [role="switch"][aria-checked="true"]) > .asst-icon { box-shadow: inset -1px 0 0 var(--asst-pill-on-ring); color: var(--asst-brand); }
213
+ /* Icon-only actions: bare squares with their row's corners until hovered, the glyph grid-centred. */
214
+ :is(.asst-iconbtn, .asst-tb-btn.asst-attach) { display: grid; place-items: center; width: var(--cap-h); padding: 0; background: transparent; box-shadow: none; color: var(--asst-text-3); }
215
+ .asst-iconbtn:has(> .asst-count:not([hidden])) { display: inline-flex; width: auto; gap: 4px; padding: 0 2px 0 calc(var(--cap-px) - 2px); }
216
+ /* States */
217
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-btn, .asst-cost):hover:not(:disabled) {
218
+ background: var(--asst-fill-2);
219
+ box-shadow: inset 0 0 0 1px var(--asst-line-2);
220
+ color: var(--asst-text);
221
+ }
222
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-btn, .asst-cost, .asst-send, .asst-chip-x, .asst-chip.asst-suggestion):active:not(:disabled) { transform: scale(.97); transition-duration: 90ms; }
223
+ /* Selected: the control whose menu is open, a switch that is on, a pressed toggle. */
224
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-cost):is([aria-expanded="true"], [aria-pressed="true"], [role="switch"][aria-checked="true"]),
225
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-cost):is([aria-expanded="true"], [aria-pressed="true"], [role="switch"][aria-checked="true"]):hover:not(:disabled) {
226
+ background: var(--asst-pill-on-fill);
227
+ box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring);
228
+ color: var(--asst-text);
229
+ }
230
+ :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-btn, .asst-cost):is(:disabled, [aria-disabled="true"]) { opacity: .4; cursor: default; }
231
+ :is(.asst-dd, .asst-tb-btn)[aria-busy="true"] { cursor: progress; opacity: .7; }
232
+ /* Interactive xs/sm pills reach 24px+ with an invisible margin (under their content). */
233
+ :is(.asst-bar :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-cost), .asst-chip-x) { isolation: isolate; }
234
+ :is(.asst-bar :is(.asst-dd, .asst-tb-btn, .asst-iconbtn, .asst-cost), .asst-chip-x)::after { content: ''; position: absolute; inset: -3px; z-index: -1; border-radius: inherit; }
235
+ /* A count: xs, mono, tabular. */
236
+ .asst-count {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ justify-content: center;
240
+ min-width: var(--asst-pill-h-xs);
241
+ height: var(--asst-pill-h-xs);
242
+ padding: 0 var(--asst-pill-px-xs);
243
+ border-radius: var(--asst-pill-r-xs);
244
+ background: var(--asst-fill-2);
245
+ color: var(--asst-text);
246
+ font-family: var(--asst-mono);
247
+ font-size: 10.5px;
248
+ font-weight: 500;
249
+ line-height: 1;
250
+ font-variant-numeric: tabular-nums;
251
+ }
252
+ .asst-count.attention { color: var(--asst-warn); box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); }
253
+ /* The running cameo: the mascot's two pill eyes, glancing ±1.2px every 1.4s.
254
+ One form everywhere (the header status, the tray pill, run pills):
255
+ mascotCameoSvg() from synabun-mascot.js, a 10×7 SVG. */
256
+ .syna-cameo { display: inline-block; flex-shrink: 0; overflow: visible; color: var(--asst-brand); }
257
+ .syna-cameo-eye { transform-box: fill-box; animation: asst-cameo 2.8s var(--asst-ease-emphasized) infinite; }
258
+
259
+ /* ── Toolbar: flush under the terminal tabs ─────────────────────────
260
+ Edge to edge like the tab bar above it (same hairline), no card and no
261
+ title: the tab names the session. Left: brain · route · context ·
262
+ computer groups (thin separators; a group with nothing shown disappears
263
+ with its separator). Right: agents · cost · history · new · "⋯", never
264
+ squeezed out — container queries hide left controls first. */
265
+ .asst-bar {
266
+ flex-shrink: 0;
267
+ display: flex;
268
+ align-items: center;
269
+ gap: 6px;
270
+ min-width: 0;
271
+ height: 36px;
272
+ padding: 0 6px 0 8px;
273
+ background: var(--asst-bar);
274
+ border-bottom: 1px solid var(--asst-card-ring);
275
+ }
276
+ .asst-bar-left {
277
+ display: flex;
278
+ flex: 1 1 auto;
279
+ align-items: center;
280
+ min-width: 0;
281
+ overflow: hidden;
282
+ /* room for the focus ring inside the clipped group */
283
+ margin: -4px 0 -4px -4px;
284
+ padding: 4px;
285
+ }
286
+ .asst-bar-group { display: flex; flex: 0 1 auto; align-items: center; gap: 4px; min-width: 0; }
287
+ .asst-bar-group:not(:has(> :not([hidden]))) { display: none; }
288
+ .asst-bar-group + .asst-bar-group::before {
289
+ content: '';
290
+ flex-shrink: 0;
291
+ width: 1px;
292
+ height: 16px;
293
+ margin: 0 6px;
294
+ background: var(--asst-line);
295
+ }
296
+ .asst-bar-right { display: flex; flex: 0 0 auto; align-items: center; gap: 4px; }
297
+ /* Cost: a value (mono); over the cap is a failure and says so with a bang. */
298
+ .asst-cost { font-family: var(--asst-mono); font-variant-numeric: tabular-nums; }
299
+ .asst-cost[data-tone="warn"] { color: var(--asst-warn); box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); }
300
+ .asst-cost[data-tone="over"] { background: var(--asst-pill-err-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-err-ring); color: var(--asst-text); }
301
+ .asst-cost[data-tone="over"]::before { content: '!'; margin-right: -2px; color: var(--asst-live); font-weight: 700; }
302
+ /* The float header's brain chip would repeat the model field right below it. */
303
+ .term-float-tab:has(.assistant-viewport) .term-float-brain-chip { display: none !important; }
304
+
305
+ /* ── Banners ────────────────────────────────────────────────────── */
306
+ .asst-banners { flex-shrink: 0; display: flex; flex-direction: column; gap: 4px; margin: 6px var(--asst-inline) 0; }
307
+ .asst-banners:empty { display: none; }
308
+ .asst-banner {
309
+ --tone: var(--asst-warn);
310
+ display: flex;
311
+ align-items: center;
312
+ gap: 8px;
313
+ min-height: 30px;
314
+ padding: 3px 4px 3px 10px;
315
+ border-radius: var(--asst-r-field);
316
+ background: transparent;
317
+ box-shadow: inset 0 0 0 1px var(--asst-line);
318
+ color: var(--asst-text-2);
319
+ font-size: 12px;
320
+ }
321
+ .asst-banner::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--tone); flex-shrink: 0; }
322
+ .asst-banner.info { --tone: var(--asst-text-3); }
323
+ .asst-banner.error { --tone: var(--asst-live); }
324
+ .asst-banner-text { flex: 1; min-width: 0; }
325
+
326
+ /* ── Transcript ─────────────────────────────────────────────────── */
327
+ .asst-transcript {
328
+ flex: 1 1 auto;
329
+ min-height: 0;
330
+ overflow-x: hidden;
331
+ overflow-y: auto;
332
+ padding: 14px calc(var(--asst-inline) + 12px) 16px;
333
+ background: var(--asst-bg);
334
+ overscroll-behavior: contain;
335
+ scroll-behavior: smooth;
336
+ scrollbar-width: thin;
337
+ scrollbar-color: var(--asst-fill-3) transparent;
338
+ }
339
+ .asst-transcript::-webkit-scrollbar { width: 10px; }
340
+ .asst-transcript::-webkit-scrollbar-track { background: transparent; }
341
+ .asst-transcript::-webkit-scrollbar-thumb { background: var(--asst-fill-3); border: 3px solid transparent; border-radius: 10px; background-clip: padding-box; }
342
+ .asst-transcript::-webkit-scrollbar-thumb:hover { background-color: rgba(255,255,255,.18); }
343
+ .asst-transcript > * + * { margin-top: 12px; }
344
+ .asst-transcript > .asst-msg.msg-assistant + .asst-msg.msg-assistant,
345
+ .asst-transcript > .asst-status + .asst-status,
346
+ .asst-transcript > .asst-route-line + .asst-route-line { margin-top: 4px; }
347
+ .asst-transcript > .asst-working { margin-top: 8px; }
348
+
349
+ /* ── Empty state ────────────────────────────────────────────────── */
350
+ .asst-empty {
351
+ display: flex;
352
+ flex-direction: column;
353
+ align-items: center;
354
+ justify-content: center;
355
+ gap: 10px;
356
+ min-height: 100%;
357
+ padding: 16px 4px;
358
+ text-align: center;
359
+ }
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
+ .asst-suggestions { display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; max-width: 560px; margin-top: 6px; }
363
+ .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; }
364
+ .asst-chip.asst-suggestion > .asst-icon svg { width: 20px; height: 14px; }
365
+ .asst-chip.asst-suggestion > .asst-icon { color: var(--asst-text-3); }
366
+ .asst-chip.asst-suggestion:is(:hover, :focus-visible) > .asst-icon { color: var(--asst-text); }
367
+
368
+ /* ── Messages ───────────────────────────────────────────────────── */
369
+ .asst-msg { display: flex; flex-direction: column; min-width: 0; }
370
+ .asst-msg-content { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
371
+ .asst-msg.msg-user { align-items: flex-end; }
372
+ .asst-msg.msg-user .asst-msg-content {
373
+ max-width: min(80%, 620px);
374
+ gap: 6px;
375
+ padding: 8px 12px;
376
+ border-radius: var(--asst-r-bubble);
377
+ background: var(--asst-fill-2);
378
+ color: var(--asst-text);
379
+ font-size: 14px;
380
+ line-height: 1.5;
381
+ }
382
+ .asst-msg-text { white-space: pre-wrap; overflow-wrap: anywhere; }
383
+ .asst-msg-attachments { display: flex; flex-wrap: wrap; gap: 4px; }
384
+ /* A prompt written outside the panel (WhatsApp Link). */
385
+ .asst-msg-origin { margin-top: 3px; padding: 0 4px; color: var(--asst-text-3, var(--asst-text-2)); font-size: 11px; line-height: 1.3; }
386
+
387
+ .asst-md { color: var(--asst-text); font-size: 14px; line-height: 1.6; overflow-wrap: anywhere; }
388
+ .asst-md > :first-child { margin-top: 0; }
389
+ .asst-md > :last-child { margin-bottom: 0; }
390
+ .asst-md p { margin: 0 0 10px; }
391
+ .asst-md :is(h1, h2, h3, h4) { margin: 16px 0 8px; color: var(--asst-text); font-weight: 600; line-height: 1.3; }
392
+ .asst-md h1 { font-size: 18px; }
393
+ .asst-md h2 { font-size: 16px; }
394
+ .asst-md :is(h3, h4) { font-size: 14px; }
395
+ .asst-md :is(ul, ol) { margin: 0 0 10px; padding-left: 22px; }
396
+ .asst-md li { margin: 3px 0; }
397
+ .asst-md li::marker { color: var(--asst-text-3); }
398
+ .asst-md code { padding: 1px 5px; border-radius: 5px; background: var(--asst-fill-2); font-family: var(--asst-mono); font-size: .86em; }
399
+ .asst-md pre { margin: 8px 0 12px; padding: 10px 12px; overflow-x: auto; border: 1px solid var(--asst-line); border-radius: 8px; background: var(--asst-field); }
400
+ .asst-md pre code { padding: 0; background: transparent; font-size: 12.5px; line-height: 1.55; }
401
+ .asst-md blockquote { margin: 8px 0; padding: 2px 12px; border-left: 2px solid var(--asst-line-2); color: var(--asst-text-2); }
402
+ .asst-md :is(a, .file-link) { color: var(--asst-focus); text-decoration: none; cursor: pointer; }
403
+ .asst-md a:hover { text-decoration: underline; }
404
+ .asst-md table { display: block; max-width: 100%; overflow-x: auto; margin: 8px 0 12px; border-collapse: collapse; font-size: 12.5px; }
405
+ .asst-md :is(th, td) { padding: 5px 10px; border: 1px solid var(--asst-line); text-align: left; }
406
+ .asst-md th { color: var(--asst-text-2); font-weight: 600; background: var(--asst-field); }
407
+ .asst-md hr { margin: 12px 0; border: 0; border-top: 1px solid var(--asst-line); }
408
+
409
+ .asst-thinking { color: var(--asst-text-3); font-size: 12.5px; }
410
+ .asst-thinking summary {
411
+ display: inline-flex;
412
+ align-items: center;
413
+ gap: 6px;
414
+ margin-left: -6px;
415
+ padding: 2px 8px 2px 6px;
416
+ border-radius: 6px;
417
+ color: var(--asst-text-3);
418
+ list-style: none;
419
+ cursor: pointer;
420
+ user-select: none;
421
+ }
422
+ .asst-thinking summary::-webkit-details-marker { display: none; }
423
+ .asst-thinking summary:hover { background: var(--asst-fill-1); color: var(--asst-text-2); }
424
+ .asst-thinking-chev { display: inline-block; transition: transform var(--asst-dur-base) var(--asst-ease-standard); }
425
+ .asst-thinking[open] .asst-thinking-chev { transform: rotate(90deg); }
426
+ .asst-thinking-content {
427
+ max-height: 240px;
428
+ overflow-y: auto;
429
+ margin: 4px 0 2px 5px;
430
+ padding: 2px 0 2px 12px;
431
+ border-left: 1px solid var(--asst-line);
432
+ white-space: pre-wrap;
433
+ overflow-wrap: anywhere;
434
+ line-height: 1.55;
435
+ }
436
+
437
+ .asst-status { color: var(--asst-text-3); font-size: 12px; }
438
+ .asst-status.info { color: var(--asst-text-2); }
439
+ .asst-status.error { color: var(--asst-live); }
440
+ .asst-divider { display: flex; align-items: center; gap: 10px; color: var(--asst-text-3); font-size: 11px; }
441
+ .asst-divider::before, .asst-divider::after { content: ''; flex: 1; height: 1px; background: var(--asst-line); }
442
+
443
+ /* "Thinking" is always the last transcript row: the mascot thinking (56×28) and the verb,
444
+ when no other character is on screen (asst-render.js syncWorkingFace), else the verb alone. */
445
+ .asst-working { display: flex; align-items: center; gap: 10px; min-height: 28px; color: var(--asst-text-2); font-size: 12.5px; }
446
+ .asst-working-face { display: inline-flex; flex-shrink: 0; color: var(--asst-text); line-height: 0; }
447
+ .asst-working-face:empty { display: none; }
448
+ .asst-working-face svg { display: block; width: 56px; height: 28px; }
449
+ /* The hero's hand-off (asst-render.js settleHero): the face flies in from the empty state, over the prompt. */
450
+ .asst-working.is-flip .asst-working-face { position: relative; z-index: 3; }
451
+
452
+ /* ── Tool rows ──────────────────────────────────────────────────── */
453
+ .asst-tool { min-width: 0; font-size: 12.5px; }
454
+ .asst-tool-hdr {
455
+ display: flex;
456
+ align-items: center;
457
+ gap: 8px;
458
+ min-height: 28px;
459
+ margin: 0 -8px;
460
+ padding: 4px 8px;
461
+ border-radius: var(--asst-r-ctl);
462
+ color: var(--asst-text-2);
463
+ cursor: pointer;
464
+ user-select: none;
465
+ }
466
+ .asst-tool-hdr:hover { background: var(--asst-fill-1); }
467
+ .asst-tool-name { flex-shrink: 0; color: var(--asst-text); font-weight: 500; }
468
+ .asst-tool-detail { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--asst-text-3); font-family: var(--asst-mono); font-size: 11.5px; }
469
+ .asst-tool-state { flex-shrink: 0; color: var(--asst-text-3); font-size: 11px; }
470
+ .asst-tool-body { display: none; margin: 2px 0 6px 7px; padding: 2px 0 2px 14px; border-left: 1px solid var(--asst-line); }
471
+ .asst-tool-label { margin: 6px 0 4px; color: var(--asst-text-3); font-size: 11px; }
472
+ .asst-tool-section {
473
+ max-height: 260px;
474
+ overflow: auto;
475
+ margin: 0;
476
+ padding: 8px 10px;
477
+ border: 1px solid var(--asst-line);
478
+ border-radius: var(--asst-r-field);
479
+ background: var(--asst-field);
480
+ color: var(--asst-text-2);
481
+ font-family: var(--asst-mono);
482
+ font-size: 11.5px;
483
+ line-height: 1.5;
484
+ white-space: pre-wrap;
485
+ overflow-wrap: anywhere;
486
+ }
487
+ .asst-agent-feed { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
488
+
489
+ /* Computer-use frames: outside the collapsible body, visible while collapsed. */
490
+ .asst-computer-frame {
491
+ position: relative;
492
+ display: block;
493
+ width: min(100% - 24px, 260px);
494
+ aspect-ratio: 16 / 10;
495
+ margin: 2px 0 4px 24px;
496
+ padding: 0;
497
+ border: 0;
498
+ border-radius: var(--asst-r-field);
499
+ overflow: hidden;
500
+ background: var(--asst-field);
501
+ box-shadow: 0 0 0 1px var(--asst-line);
502
+ cursor: zoom-in;
503
+ }
504
+ .asst-computer-frame:hover { box-shadow: 0 0 0 1px var(--asst-line-2); }
505
+ .asst-computer-frame img { display: block; width: 100%; height: 100%; object-fit: cover; }
506
+ .asst-computer-frame.failed { display: none; }
507
+ .asst-computer-frame.compact {
508
+ display: inline-flex;
509
+ align-items: center;
510
+ width: auto;
511
+ height: 24px;
512
+ aspect-ratio: auto;
513
+ padding: 0 10px;
514
+ border-radius: var(--asst-pill-r-sm);
515
+ background: transparent;
516
+ box-shadow: inset 0 0 0 1px var(--asst-line);
517
+ color: var(--asst-text-3);
518
+ font: inherit;
519
+ font-size: 11.5px;
520
+ cursor: pointer;
521
+ }
522
+ .asst-computer-frame.compact .asst-frame-marker { display: none; }
523
+ .asst-frame-marker {
524
+ position: absolute;
525
+ width: 14px;
526
+ height: 14px;
527
+ margin: -7px 0 0 -7px;
528
+ border: 2px solid var(--asst-live);
529
+ border-radius: 50%;
530
+ box-shadow: 0 0 0 2px rgba(0,0,0,.5);
531
+ pointer-events: none;
532
+ }
533
+
534
+ /* ── Chips ──────────────────────────────────────────────────────── */
535
+ .asst-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
536
+ .asst-chips-label { margin-right: 2px; color: var(--asst-text-3); font-size: 11px; }
537
+ /* Chips (sm): attachments, the queue, memories, suggestions (md). The label truncates, the chip never clips its ✕. */
538
+ .asst-chip { justify-content: flex-start; max-width: 280px; }
539
+ .asst-chip:hover:not(.static) { background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text); }
540
+ .asst-chip.static { cursor: default; }
541
+ .asst-chip-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
542
+ .asst-chip:is([data-kind="file"], [data-kind="upload"], [data-kind="image"]) .asst-chip-text { font-family: var(--asst-mono); font-weight: 400; }
543
+ .asst-chip-meta { flex-shrink: 0; color: var(--asst-text-3); font-family: var(--asst-mono); font-size: 10.5px; font-weight: 400; font-variant-numeric: tabular-nums; }
544
+ .asst-chip.mailbox.attention { color: var(--asst-warn); box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); }
545
+ .asst-composer-queue .asst-chip-meta { font-family: inherit; font-size: 11px; }
546
+ .asst-chip img { width: 14px; height: 14px; flex-shrink: 0; margin-left: -2px; object-fit: cover; border-radius: 4px; }
547
+ .asst-chip-x {
548
+ position: relative;
549
+ display: inline-flex;
550
+ flex-shrink: 0;
551
+ align-items: center;
552
+ justify-content: center;
553
+ width: var(--asst-pill-h-xs);
554
+ height: var(--asst-pill-h-xs);
555
+ margin-right: calc(4px - var(--cap-px));
556
+ padding: 0;
557
+ border: 0;
558
+ border-radius: var(--asst-pill-r-xs);
559
+ background: transparent;
560
+ color: var(--asst-text-3);
561
+ font: inherit;
562
+ cursor: pointer;
563
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard), color var(--asst-dur-fast) var(--asst-ease-standard), transform var(--asst-dur-instant) var(--asst-ease-standard);
564
+ }
565
+ .asst-chip-x svg { width: 10px; height: 10px; fill: none; stroke: currentColor; stroke-width: 2.4; stroke-linecap: round; }
566
+ .asst-chip-x:hover { background: var(--asst-fill-3); color: var(--asst-text); }
567
+ /* An upload in flight fills the chip left to right (--asst-upload, set by the composer). */
568
+ .asst-chip.static[data-state="uploading"] {
569
+ background: linear-gradient(90deg, var(--asst-fill-3) var(--asst-upload, 0%), var(--asst-fill-1) var(--asst-upload, 0%));
570
+ color: var(--asst-text-2);
571
+ }
572
+
573
+ /* ── Route lines ────────────────────────────────────────────────── */
574
+ .asst-route-line { font-size: 12.5px; }
575
+ .asst-route-line-head {
576
+ display: inline-flex;
577
+ align-items: center;
578
+ gap: 6px;
579
+ max-width: calc(100% + 8px);
580
+ min-height: 26px;
581
+ margin-left: -8px;
582
+ padding: 3px 8px;
583
+ border: 0;
584
+ border-radius: var(--asst-r-ctl);
585
+ background: transparent;
586
+ color: var(--asst-text-2);
587
+ font: inherit;
588
+ text-align: left;
589
+ cursor: pointer;
590
+ }
591
+ .asst-route-line-head:hover { background: var(--asst-fill-1); }
592
+ .asst-route-glyph { color: var(--asst-brand); }
593
+ .asst-route-arrow, .asst-route-chev { color: var(--asst-text-4); }
594
+ .asst-route-kind { color: var(--asst-text-3); font-size: 11.5px; }
595
+ .asst-route-icon svg { width: 12px; height: 12px; }
596
+ .asst-route-target { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--asst-text); font-weight: 500; }
597
+ .asst-route-meta, .asst-route-state { flex-shrink: 0; color: var(--asst-text-3); white-space: nowrap; }
598
+ .asst-route-line.pending .asst-route-state { color: var(--asst-warn); }
599
+ .asst-route-line.muted .asst-route-glyph { color: var(--asst-text-4); }
600
+ .asst-route-line.muted .asst-route-class { color: var(--asst-text-3); }
601
+ .asst-route-chev { transition: transform var(--asst-dur-base) var(--asst-ease-standard); }
602
+ .asst-route-line.open .asst-route-chev { transform: rotate(90deg); }
603
+ .asst-route-detail {
604
+ display: flex;
605
+ flex-direction: column;
606
+ gap: 3px;
607
+ margin: 2px 0 4px 5px;
608
+ padding: 4px 0 4px 14px;
609
+ border-left: 1px solid var(--asst-line);
610
+ color: var(--asst-text-3);
611
+ font-size: 12px;
612
+ }
613
+ .asst-link { padding: 0; border: 0; background: transparent; color: var(--asst-focus); font: inherit; text-align: left; cursor: pointer; }
614
+ .asst-link:hover { text-decoration: underline; }
615
+ .asst-link:disabled { color: var(--asst-text-4); cursor: default; text-decoration: none; }
616
+
617
+ /* ── Run cards (transcript + agents tray) ───────────────────────── */
618
+ .asst-run {
619
+ display: grid;
620
+ grid-template-columns: auto minmax(0, 1fr) auto;
621
+ column-gap: 10px;
622
+ row-gap: 2px;
623
+ align-items: center;
624
+ padding: 8px 10px;
625
+ border: 1px solid var(--asst-line);
626
+ border-radius: var(--asst-r-card);
627
+ background: transparent;
628
+ font-size: 12.5px;
629
+ }
630
+ .asst-run.compact { padding: 5px 8px; border-color: transparent; border-radius: var(--asst-r-ctl); }
631
+ .asst-run.compact:hover { background: var(--asst-fill-1); }
632
+ .asst-run-icon {
633
+ grid-row: 1 / span 2;
634
+ display: inline-flex;
635
+ align-items: center;
636
+ justify-content: center;
637
+ width: 22px;
638
+ height: 22px;
639
+ border-radius: var(--asst-pill-r-sm);
640
+ background: var(--asst-fill-1);
641
+ color: var(--asst-text-2);
642
+ transition: color var(--asst-dur-fast) var(--asst-ease-standard);
643
+ }
644
+ .asst-run:hover .asst-run-icon { color: var(--asst-provider-color, var(--asst-text-2)); }
645
+ .asst-run-icon svg { width: 12px; height: 12px; }
646
+ .asst-run-main { display: flex; align-items: center; gap: 8px; min-width: 0; }
647
+ .asst-run-title { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--asst-text); }
648
+ .asst-run-meta { grid-column: 2; min-width: 0; color: var(--asst-text-3); font-size: 11px; line-height: 1.5; }
649
+ .asst-run-meta > span:not(.asst-run-sep) { white-space: nowrap; }
650
+ .asst-run-route { color: var(--asst-text-2); }
651
+ .asst-run-actions { grid-row: 1 / span 2; grid-column: 3; display: flex; align-items: center; gap: 2px; }
652
+ .asst-run-summary { grid-column: 2 / span 2; max-height: 160px; overflow: auto; margin-top: 4px; color: var(--asst-text-2); white-space: pre-wrap; overflow-wrap: anywhere; }
653
+ /* Image / video creation: what the run generated (a click opens the lightbox; videos play inline). */
654
+ .asst-run-media { grid-column: 2 / span 2; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
655
+ .asst-run-media-thumb { display: block; width: 88px; height: 88px; padding: 0; border: 0; border-radius: var(--asst-r-field); overflow: hidden; background: var(--asst-field); box-shadow: 0 0 0 1px var(--asst-line); cursor: zoom-in; }
656
+ .asst-run-media-thumb:hover { box-shadow: 0 0 0 1px var(--asst-line-2); }
657
+ .asst-run-media-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
658
+ .asst-run-media-thumb.failed { display: none; }
659
+ .asst-run-media-video { display: block; width: min(100%, 320px); max-height: 220px; border-radius: var(--asst-r-field); background: #000; box-shadow: 0 0 0 1px var(--asst-line); }
660
+ .asst-run-escalate { grid-column: 2 / span 2; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 6px; }
661
+ .asst-run-escalate-reason { color: var(--asst-warn); font-size: 11.5px; }
662
+ /* A run's status pill (sm): the shape says the state, the fill only for working (gold) or failed (red). */
663
+ .asst-pill {
664
+ display: inline-flex;
665
+ flex-shrink: 0;
666
+ align-items: center;
667
+ gap: 6px;
668
+ height: var(--asst-pill-h-sm);
669
+ padding: 0 var(--asst-pill-px-sm) 0 7px;
670
+ border-radius: var(--asst-pill-r-sm);
671
+ background: var(--asst-fill-1);
672
+ box-shadow: inset 0 0 0 1px var(--asst-line);
673
+ color: var(--asst-text-2);
674
+ font-size: 11px;
675
+ font-weight: 500;
676
+ line-height: 1;
677
+ white-space: nowrap;
678
+ }
679
+ .asst-pill::before { content: ''; flex-shrink: 0; width: 6px; height: 6px; border-radius: 50%; background: var(--asst-text-3); }
680
+ .asst-pill > .syna-cameo { display: none; }
681
+ .asst-pill[data-tone="running"] { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); color: var(--asst-text); }
682
+ .asst-pill[data-tone="running"]::before { display: none; }
683
+ .asst-pill[data-tone="running"] > .syna-cameo { display: inline-block; margin-left: 1px; }
684
+ .asst-pill[data-tone="action"] { box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring); color: var(--asst-text); }
685
+ .asst-pill[data-tone="action"]::before { width: 5px; height: 5px; border-radius: 1px; background: var(--asst-warn); transform: rotate(45deg); }
686
+ .asst-pill[data-tone="done"] { background: transparent; color: var(--asst-text-3); }
687
+ .asst-pill[data-tone="done"]::before { width: 7px; height: 3.5px; margin: -2px 0 0 1px; border: solid currentColor; border-width: 0 0 1.5px 1.5px; border-radius: 0; background: none; transform: rotate(-45deg); }
688
+ .asst-pill[data-tone="error"] { background: var(--asst-pill-err-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-err-ring); color: var(--asst-text); }
689
+ .asst-pill[data-tone="error"]::before { content: '!'; width: auto; height: auto; margin: 0 -1px 0 1px; border-radius: 0; background: none; color: var(--asst-live); font-weight: 700; }
690
+ .asst-pill[data-tone="queued"] { background: transparent; color: var(--asst-text-3); }
691
+ .asst-pill[data-tone="queued"]::before { background: transparent; box-shadow: inset 0 0 0 1.5px var(--asst-text-3); }
692
+ .asst-pill[data-tone="idle"] { color: var(--asst-text-3); }
693
+
694
+ /* ── Bottom card: computer tray · agents tray · composer ────────── */
695
+ .asst-bottom {
696
+ position: relative;
697
+ flex-shrink: 0;
698
+ display: flex;
699
+ flex-direction: column;
700
+ max-height: 62%;
701
+ margin: 0 var(--asst-inline) 8px;
702
+ background: var(--asst-card);
703
+ border-radius: var(--asst-r-card);
704
+ box-shadow: var(--asst-card-shadow), 0 0 0 1px var(--asst-card-ring), var(--asst-card-hi);
705
+ transition: box-shadow var(--asst-dur-base) var(--asst-ease-standard);
706
+ }
707
+ .asst-bottom:has(.asst-input:focus) { box-shadow: var(--asst-card-shadow), 0 0 0 1px var(--asst-card-ring-focus), var(--asst-card-hi); }
708
+ .asst-computer-host, .asst-dock-host { flex: 0 1 auto; min-height: 0; overflow-y: auto; }
709
+ .asst-composer-host { flex: 0 0 auto; min-width: 0; }
710
+
711
+ .asst-dock { display: flex; flex-direction: column; min-height: 0; border-bottom: 1px solid var(--asst-line); }
712
+ .asst-dock-head { display: flex; align-items: center; gap: 6px; min-height: 34px; padding: 4px 6px; }
713
+ .asst-dock-toggle {
714
+ display: inline-flex;
715
+ align-items: center;
716
+ gap: 8px;
717
+ min-width: 0;
718
+ height: var(--asst-pill-h-md);
719
+ padding: 0 10px 0 8px;
720
+ border: 0;
721
+ border-radius: var(--asst-pill-r-md);
722
+ background: transparent;
723
+ color: var(--asst-text-2);
724
+ font: inherit;
725
+ font-size: 12px;
726
+ cursor: pointer;
727
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard);
728
+ }
729
+ .asst-dock-toggle:hover { background: var(--asst-fill-1); }
730
+ .asst-dock-chev { color: var(--asst-text-3); transition: transform var(--asst-dur-base) var(--asst-ease-standard); }
731
+ .asst-dock.open .asst-dock-chev { transform: rotate(90deg); }
732
+ .asst-dock-title { color: var(--asst-text); font-weight: 500; }
733
+ .asst-dock-summary { min-width: 0; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--asst-text-3); }
734
+ .asst-dock.attention .asst-dock-summary { color: var(--asst-warn); }
735
+ .asst-dock-spacer { flex: 1; }
736
+ .asst-dock-body { display: flex; flex-direction: column; gap: 2px; max-height: min(40cqh, 260px); overflow-y: auto; padding: 0 6px 6px; }
737
+
738
+
739
+ .asst-usage-host {
740
+ --asst-usage-neutral-0: color-mix(in srgb, var(--asst-text) 82%, var(--asst-popover));
741
+ --asst-usage-neutral-1: color-mix(in srgb, var(--asst-text) 74%, var(--asst-popover));
742
+ --asst-usage-neutral-2: color-mix(in srgb, var(--asst-text) 66%, var(--asst-popover));
743
+ --asst-usage-neutral-3: color-mix(in srgb, var(--asst-text) 58%, var(--asst-popover));
744
+ --asst-usage-neutral-4: color-mix(in srgb, var(--asst-text) 78%, var(--asst-popover));
745
+ --asst-usage-neutral-5: color-mix(in srgb, var(--asst-text) 70%, var(--asst-popover));
746
+ --asst-usage-neutral-6: color-mix(in srgb, var(--asst-text) 62%, var(--asst-popover));
747
+ --asst-usage-neutral-7: color-mix(in srgb, var(--asst-text) 54%, var(--asst-popover));
748
+ position: relative;
749
+ flex: 0 0 auto;
750
+ min-width: 0;
751
+ padding: 8px 6px;
752
+ border-bottom: 1px solid var(--asst-line);
753
+ container: asst-usage / inline-size;
754
+ }
755
+ .asst-usage-host[hidden] { display: none !important; }
756
+ .asst-usage-strip {
757
+ position: relative;
758
+ display: flex;
759
+ align-items: center;
760
+ gap: 8px;
761
+ width: 100%;
762
+ height: 28px;
763
+ min-width: 0;
764
+ padding: 0 8px;
765
+ border: 0;
766
+ border-radius: var(--asst-pill-r-md);
767
+ background: transparent;
768
+ color: var(--asst-text-2);
769
+ text-align: start;
770
+ cursor: pointer;
771
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard);
772
+ }
773
+ .asst-usage-strip::before { content: ''; position: absolute; inset: -8px 0; }
774
+ .asst-usage-strip:hover { background: var(--asst-fill-2); }
775
+ .asst-usage-strip[aria-expanded="true"] { background: var(--asst-fill-1); }
776
+ .asst-usage-strip:focus-visible, .asst-usage-copy:focus-visible {
777
+ outline: 2px solid var(--asst-focus);
778
+ outline-offset: 2px;
779
+ }
780
+ .asst-usage-dot { position: relative; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--asst-text-3); }
781
+ .asst-usage-host[data-status="live"] .asst-usage-dot { background: var(--asst-brand); animation: asst-usage-pulse 1.8s ease-in-out infinite; }
782
+ .asst-usage-host[data-status="partial"] .asst-usage-dot { background: var(--asst-warn); }
783
+ .asst-usage-host[data-connection="offline"] .asst-usage-dot { background: var(--asst-warn); animation: none; }
784
+ .asst-usage-host[data-connection="paused"] .asst-usage-dot { background: var(--asst-warn); animation: none; }
785
+ .asst-usage-label { flex: none; color: var(--asst-text-2); font-size: 11px; font-weight: 500; }
786
+ .asst-usage-segments {
787
+ display: flex;
788
+ flex: 1 1 auto;
789
+ align-items: stretch;
790
+ gap: 2px;
791
+ min-width: 18px;
792
+ height: 7px;
793
+ overflow: hidden;
794
+ border-radius: 2px;
795
+ background: var(--asst-fill-3);
796
+ }
797
+ .asst-usage-segment { flex: 0 1 0; min-width: 0; height: 100%; background: var(--usage-fill, var(--asst-usage-neutral-0)); transition: flex-grow 280ms var(--asst-ease-standard); }
798
+ .asst-usage-segment[data-positive="true"] { min-width: 1px; }
799
+ .asst-usage-segment[data-working="true"] { background: var(--asst-brand); }
800
+ .asst-usage-mark { flex: none; width: 12px; color: var(--asst-brand); font: 700 13px/1 var(--asst-mono); text-align: center; }
801
+ .asst-usage-host[data-status="partial"] .asst-usage-mark { color: var(--asst-warn); }
802
+ .asst-usage-host[data-status="exact"] .asst-usage-mark { visibility: hidden; }
803
+ .asst-usage-compact {
804
+ flex: none;
805
+ min-width: 10.5ch;
806
+ color: var(--asst-text);
807
+ font: 500 11px/1 var(--asst-mono);
808
+ font-variant-numeric: tabular-nums;
809
+ text-align: end;
810
+ white-space: nowrap;
811
+ }
812
+ /* The two sides and the dollars: inside the strip when it is wide enough, on a line under it otherwise. */
813
+ .asst-usage-io { display: none; flex: none; gap: 8px; color: var(--asst-text-2); font: 500 11px/1 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
814
+ .asst-usage-strip-cost { display: none; flex: none; color: var(--asst-text-2); font: 500 11px/1 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
815
+ .asst-usage-subline { padding: 2px 8px 0 23px; color: var(--asst-text-3); font: 500 10px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
816
+ .asst-usage-io[hidden], .asst-usage-strip-cost[hidden], .asst-usage-subline[hidden] { display: none !important; }
817
+ @container asst-usage (min-width: 460px) {
818
+ .asst-usage-io { display: inline-flex; }
819
+ .asst-usage-strip-cost { display: inline; }
820
+ .asst-usage-subline { display: none; }
821
+ }
822
+ .asst-usage-chevron { flex: none; color: var(--asst-text-3); font-size: 13px; line-height: 1; transition: transform var(--asst-dur-base) var(--asst-ease-standard); }
823
+ .asst-usage-strip[aria-expanded="true"] .asst-usage-chevron { transform: rotate(180deg); }
824
+ .asst-usage-popover {
825
+ position: absolute;
826
+ inset-inline: 4px;
827
+ bottom: calc(100% + 8px);
828
+ z-index: 20;
829
+ max-height: min(72dvh, 780px);
830
+ min-width: 0;
831
+ overflow: auto;
832
+ overscroll-behavior: contain;
833
+ padding: 12px;
834
+ border: 1px solid var(--asst-popover-ring);
835
+ border-radius: var(--asst-r-card);
836
+ background: var(--asst-popover);
837
+ box-shadow: var(--asst-popover-shadow);
838
+ scrollbar-width: thin;
839
+ scrollbar-color: var(--asst-fill-3) transparent;
840
+ }
841
+ .asst-usage-popover[hidden] { display: none !important; }
842
+ .asst-usage-head { display: flex; align-items: flex-start; gap: 8px; }
843
+ .asst-usage-head-main { flex: 1 1 auto; min-width: 0; }
844
+ .asst-usage-eyebrow, .asst-usage-section-title {
845
+ color: var(--asst-text-3); font-size: 10px; font-weight: 600; letter-spacing: .10em; text-transform: uppercase;
846
+ }
847
+ .asst-usage-task-title { margin: 3px 0 0; color: var(--asst-text-2); font-size: 11px; font-weight: 400; line-height: 1.45; overflow-wrap: anywhere; }
848
+ .asst-usage-copy { flex: none; min-width: 58px; min-height: 44px; margin-block-start: -7px; margin-inline-end: -6px; padding: 0 8px; border: 0; border-radius: var(--asst-pill-r-sm); background: transparent; color: var(--asst-text-2); font-size: 11px; cursor: pointer; }
849
+ .asst-usage-copy:hover { background: var(--asst-fill-2); color: var(--asst-text); }
850
+ .asst-usage-total-line { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 6px; margin-top: 12px; }
851
+ .asst-usage-total { color: var(--asst-text); font: 500 25px/1.1 var(--asst-mono); font-variant-numeric: tabular-nums; letter-spacing: -.06em; white-space: nowrap; }
852
+ .asst-usage-total-unit { color: var(--asst-text-3); font-size: 11px; }
853
+ .asst-usage-sides { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px 12px; margin: 10px 0 0; }
854
+ .asst-usage-side { min-width: 0; }
855
+ .asst-usage-side dt { color: var(--asst-text-3); font-size: 10px; }
856
+ .asst-usage-side dd { margin: 3px 0 0; color: var(--asst-text); font: 500 13px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
857
+ .asst-usage-note { margin: 9px 0 0; color: var(--asst-text-3); font-size: 10px; line-height: 1.45; }
858
+ .asst-usage-model-list { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
859
+ .asst-usage-model { min-width: 0; padding: 7px 0; border-top: 1px solid var(--asst-line); }
860
+ .asst-usage-model:first-child { padding-top: 0; border-top: 0; }
861
+ .asst-usage-model-top { display: flex; align-items: baseline; gap: 7px; min-width: 0; }
862
+ .asst-usage-model-name { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; color: var(--asst-text); font-size: 11px; font-weight: 500; line-height: 1.35; }
863
+ .asst-usage-model-cost { flex: none; color: var(--asst-text); font: 500 11px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
864
+ .asst-usage-model-io { display: flex; flex-wrap: wrap; gap: 2px 10px; margin-top: 3px; color: var(--asst-text-2); font: 500 10px/1.4 var(--asst-mono); font-variant-numeric: tabular-nums; }
865
+ .asst-usage-model-meta { margin-top: 2px; color: var(--asst-text-3); font-size: 10px; line-height: 1.4; }
866
+ .asst-usage-model[data-cost-basis="unpriced"] .asst-usage-model-meta { color: var(--asst-warn); }
867
+ .asst-usage-task-name { color: var(--asst-text); font-size: 11px; font-weight: 500; line-height: 1.4; overflow-wrap: anywhere; }
868
+ .asst-usage-task-line { margin-top: 3px; color: var(--asst-text-2); font: 500 10px/1.5 var(--asst-mono); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
869
+ .asst-usage-task-line[data-fidelity="partial"] { color: var(--asst-warn); }
870
+ .asst-usage-agents-title { margin: 10px 0 8px; color: var(--asst-text-3); font-size: 10px; font-weight: 500; }
871
+ .asst-usage-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; margin-top: 9px; color: var(--asst-text-2); font-size: 11px; }
872
+ .asst-usage-cost { color: var(--asst-text-2); font-family: var(--asst-mono); font-variant-numeric: tabular-nums; }
873
+ .asst-usage-status { display: inline-flex; align-items: center; gap: 5px; color: var(--asst-text-2); }
874
+ .asst-usage-status::before { content: ''; width: 5px; height: 5px; border-radius: 50%; background: var(--asst-text-3); }
875
+ .asst-usage-host[data-status="live"] .asst-usage-status::before { background: var(--asst-brand); }
876
+ .asst-usage-host[data-status="partial"] .asst-usage-status { color: var(--asst-warn); }
877
+ .asst-usage-host[data-status="partial"] .asst-usage-status::before { background: var(--asst-warn); }
878
+ .asst-usage-reason { width: 100%; color: var(--asst-warn); line-height: 1.45; }
879
+ .asst-usage-connection { width: 100%; color: var(--asst-warn); font-size: 11px; line-height: 1.45; }
880
+ .asst-usage-section { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--asst-line); }
881
+ .asst-usage-section-title { margin: 0 0 9px; }
882
+ .asst-usage-classes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 9px 12px; margin: 0; }
883
+ .asst-usage-class { min-width: 0; }
884
+ .asst-usage-class dt { color: var(--asst-text-3); font-size: 10px; }
885
+ .asst-usage-class dd { margin: 3px 0 0; color: var(--asst-text); font: 500 11px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
886
+ .asst-usage-agent-list, .asst-usage-recent-list { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
887
+ .asst-usage-agent-empty { color: var(--asst-text-3); font-size: 11px; }
888
+ .asst-usage-agent { min-width: 0; padding: 9px 0; border-top: 1px solid var(--asst-line); }
889
+ .asst-usage-agent:first-child { padding-top: 0; border-top: 0; }
890
+ .asst-usage-agent:last-child { padding-bottom: 0; }
891
+ .asst-usage-agent-top { display: flex; align-items: baseline; gap: 7px; min-width: 0; }
892
+ .asst-usage-agent-title { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; color: var(--asst-text); font-size: 11px; font-weight: 500; line-height: 1.35; }
893
+ .asst-usage-agent-total { flex: none; color: var(--asst-text); font: 500 11px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
894
+ .asst-usage-agent-meta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 5px; margin-top: 3px; color: var(--asst-text-3); font-size: 10px; line-height: 1.45; }
895
+ .asst-usage-agent-model { min-width: 0; overflow-wrap: anywhere; }
896
+ .asst-usage-agent-state[data-state="running"] { color: var(--asst-brand); }
897
+ .asst-usage-agent-state[data-state="failed"] { color: var(--asst-live); }
898
+ .asst-usage-agent-state[data-fidelity="partial"] { color: var(--asst-warn); }
899
+ .asst-usage-agent-reason { margin-top: 3px; color: var(--asst-warn); font-size: 10px; line-height: 1.4; }
900
+ .asst-usage-agent-share { height: 4px; margin-top: 6px; overflow: hidden; border-radius: 2px; background: var(--asst-fill-3); }
901
+ .asst-usage-agent-share > span { display: block; height: 100%; width: 0; background: var(--usage-fill, var(--asst-usage-neutral-0)); transition: width 280ms var(--asst-ease-standard); }
902
+ .asst-usage-agent[data-state="running"] .asst-usage-agent-share > span { background: var(--asst-brand); }
903
+ .asst-usage-subagents { margin-top: 4px; color: var(--asst-text-3); font-size: 10px; }
904
+ .asst-usage-judgments { padding: 9px 0 0; margin: 9px 0 0; border-top: 1px solid var(--asst-line); list-style: none; }
905
+ .asst-usage-session { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
906
+ .asst-usage-session strong { color: var(--asst-text); font: 500 12px/1.3 var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
907
+ .asst-usage-session-meta { margin-top: 3px; color: var(--asst-text-3); font-size: 10px; }
908
+ .asst-usage-recent-item { display: flex; gap: 6px; min-width: 0; padding: 6px 0; border-top: 1px solid var(--asst-line); color: var(--asst-text-2); font-size: 10px; line-height: 1.4; }
909
+ .asst-usage-recent-item:first-child { border-top: 0; padding-top: 0; }
910
+ .asst-usage-recent-title { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
911
+ .asst-usage-recent-meta { display: block; margin-top: 2px; color: var(--asst-text-3); }
912
+ .asst-usage-recent-total { flex: none; color: var(--asst-text); font-family: var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
913
+ .asst-usage-recent-status[data-fidelity="partial"] { color: var(--asst-warn); }
914
+ .asst-usage-recent-empty { color: var(--asst-text-3); font-size: 10px; }
915
+ .asst-usage-announcer { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
916
+ @container asst-usage (min-width: 380px) { .asst-usage-classes { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
917
+ @container asst-usage (min-width: 520px) { .asst-usage-classes { grid-template-columns: repeat(5, minmax(0, 1fr)); } }
918
+ @container asst-usage (max-width: 340px) {
919
+ .asst-usage-strip { gap: 6px; padding: 0 6px; }
920
+ .asst-usage-popover { padding: 11px; }
921
+ .asst-usage-total { font-size: 23px; }
922
+ }
923
+ @keyframes asst-usage-pulse { 50% { opacity: .45; } }
924
+ @media (prefers-reduced-motion: reduce) {
925
+ .asst-usage-host *, .asst-usage-host *::before, .asst-usage-host *::after { animation: none !important; transition: none !important; }
926
+ }
927
+
928
+ .asst-usage-run-tokens { color: var(--asst-text-3); font-family: var(--asst-mono); font-variant-numeric: tabular-nums; white-space: nowrap; }
929
+
930
+ /* The provider's usage limit: one line under the gauge, replaced in place (never a transcript row). */
931
+ .asst-limit {
932
+ flex: 0 0 auto;
933
+ display: flex;
934
+ align-items: center;
935
+ gap: 8px;
936
+ min-width: 0;
937
+ padding: 6px 14px;
938
+ border-bottom: 1px solid var(--asst-line);
939
+ color: var(--asst-warn);
940
+ font-size: 12px;
941
+ line-height: 1.4;
942
+ overflow-wrap: anywhere;
943
+ }
944
+ .asst-limit[hidden] { display: none !important; }
945
+ .asst-limit::before { content: ''; flex: none; width: 7px; height: 7px; border-radius: 50%; background: currentColor; opacity: .8; }
946
+ .asst-limit[data-status="rejected"] { color: var(--asst-live); font-weight: 500; }
947
+ .asst-limit[data-status="rejected"]::before { opacity: 1; box-shadow: 0 0 0 3px color-mix(in srgb, var(--asst-live) 24%, transparent); }
948
+
949
+ .asst-computer { display: block; }
950
+ .asst-computer-tray { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--asst-line); }
951
+ .asst-computer-tray-head { display: flex; align-items: center; gap: 8px; color: var(--asst-text); font-size: 12.5px; font-weight: 500; }
952
+ .asst-computer-tray-head .asst-icon { color: var(--asst-text-2); }
953
+ .asst-computer-tray-body { display: flex; flex-direction: column; gap: 6px; }
954
+ .asst-computer-tray-note { color: var(--asst-text-3); font-size: 12px; line-height: 1.5; }
955
+ .asst-computer-tray-error { color: var(--asst-live); font-size: 12px; }
956
+ .asst-computer-tray-actions { display: flex; flex-wrap: wrap; gap: 6px; }
957
+ .asst-computer-log {
958
+ max-height: 120px;
959
+ overflow: auto;
960
+ margin: 0;
961
+ padding: 8px 10px;
962
+ border-radius: var(--asst-r-field);
963
+ background: var(--asst-field);
964
+ box-shadow: inset 0 0 0 1px var(--asst-line);
965
+ color: var(--asst-text-3);
966
+ font-family: var(--asst-mono);
967
+ font-size: 11px;
968
+ white-space: pre-wrap;
969
+ }
970
+ .asst-computer-perms { display: flex; flex-direction: column; gap: 2px; }
971
+ .asst-computer-perm { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 30px; }
972
+ .asst-computer-perm-state { width: 6px; height: 6px; flex-shrink: 0; margin: 0 1px; border-radius: 1px; background: var(--asst-warn); transform: rotate(45deg); }
973
+ .asst-computer-perm[data-granted="1"] .asst-computer-perm-state { border-radius: 50%; background: var(--asst-text-3); transform: none; }
974
+ .asst-computer-perm-label { color: var(--asst-text); font-size: 12.5px; }
975
+ .asst-computer-perm-status { margin-right: auto; color: var(--asst-text-3); font-size: 11.5px; }
976
+ .asst-spinner {
977
+ width: 12px;
978
+ height: 12px;
979
+ flex-shrink: 0;
980
+ border: 1.5px solid var(--asst-line-2);
981
+ border-top-color: var(--asst-text-2);
982
+ border-radius: 50%;
983
+ animation: asst-spin .8s linear infinite;
984
+ }
985
+ .asst-computer-activity { display: flex; align-items: center; gap: 10px; min-height: 44px; padding: 7px 8px 7px 12px; border-bottom: 1px solid var(--asst-line); }
986
+ .asst-live-dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: 50%; background: var(--asst-live); animation: asst-live 1.4s var(--asst-ease-standard) infinite; }
987
+ .asst-computer-activity[data-state="paused_user"] .asst-live-dot { background: var(--asst-warn); animation: none; }
988
+ .asst-computer-stopped-dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: 1px; background: var(--asst-text-3); }
989
+ .asst-computer-thumb {
990
+ position: relative;
991
+ flex-shrink: 0;
992
+ width: 72px;
993
+ height: 45px;
994
+ padding: 0;
995
+ border: 0;
996
+ border-radius: 6px;
997
+ overflow: hidden;
998
+ background: var(--asst-field);
999
+ box-shadow: 0 0 0 1px var(--asst-line);
1000
+ cursor: zoom-in;
1001
+ }
1002
+ .asst-computer-thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
1003
+ .asst-computer-activity-text { display: flex; flex-direction: column; gap: 1px; flex: 1; min-width: 0; }
1004
+ .asst-computer-activity-title, .asst-computer-activity-sub { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
1005
+ .asst-computer-activity-title { color: var(--asst-text); font-size: 12.5px; font-weight: 500; }
1006
+ .asst-computer-activity-sub { color: var(--asst-text-3); font-size: 11.5px; }
1007
+
1008
+ /* ── Composer ───────────────────────────────────────────────────── */
1009
+ .asst-composer { position: relative; display: flex; flex-direction: column; min-width: 0; }
1010
+ .asst-composer.drag-over { outline: 1.5px dashed var(--asst-line-2); outline-offset: -4px; border-radius: var(--asst-r-card); }
1011
+ .asst-composer-queue, .asst-composer-attachments { display: flex; flex-wrap: wrap; gap: 6px; max-height: 96px; overflow-y: auto; padding: 10px 12px 0; }
1012
+ .asst-input {
1013
+ display: block;
1014
+ width: 100%;
1015
+ min-height: 40px;
1016
+ max-height: min(220px, 32cqh);
1017
+ padding: 10px 12px 4px;
1018
+ border: 0;
1019
+ outline: none;
1020
+ background: transparent;
1021
+ color: var(--asst-text);
1022
+ font: inherit;
1023
+ font-size: 14px;
1024
+ line-height: 1.5;
1025
+ resize: none;
1026
+ overflow-y: auto;
1027
+ }
1028
+ .asst-input::placeholder { color: var(--asst-text-3); }
1029
+ .asst-composer.disabled .asst-input { opacity: .55; cursor: not-allowed; }
1030
+
1031
+ /* Footer row: attach · the brain's fields · send. The fields clip what does
1032
+ not fit but keep 4px for the focus ring. */
1033
+ .asst-composer-actions { display: flex; align-items: center; justify-content: flex-start; gap: 6px; min-width: 0; padding: 2px 8px 8px; }
1034
+ .asst-brain { display: contents; }
1035
+ .asst-composer-actions .asst-send { margin-left: auto; }
1036
+ .asst-composer-brain { display: flex; flex: 0 1 auto; align-items: center; gap: 6px; min-width: 0; margin: -4px; padding: 4px; overflow: hidden; }
1037
+
1038
+ /* Fields (toolbar and composer): glyph · seam · value ▾ */
1039
+ .asst-dd { flex: 0 1 auto; justify-content: flex-start; max-width: calc(18ch + 60px); }
1040
+ .asst-dd .asst-dd-label { min-width: 0; max-width: 18ch; overflow: hidden; text-overflow: ellipsis; }
1041
+ /* A display name ("Sonnet 5", a project) is sans; a raw model id (opus[1m]) is mono. */
1042
+ .asst-dd.asst-dd-model[data-raw] .asst-dd-label { font-family: var(--asst-mono); font-weight: 400; }
1043
+ .asst-dd-caret {
1044
+ display: inline-flex;
1045
+ flex-shrink: 0;
1046
+ margin: 0 -2px 0 -2px;
1047
+ color: var(--asst-text-3);
1048
+ transition: transform var(--asst-dur-base) var(--asst-ease-standard), color var(--asst-dur-fast) var(--asst-ease-standard);
1049
+ }
1050
+ .asst-dd-caret svg { width: 8px; height: 8px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
1051
+ .asst-dd:is(:hover, [aria-expanded="true"]) .asst-dd-caret { color: var(--asst-text-2); }
1052
+ .asst-dd[aria-expanded="true"] .asst-dd-caret { transform: rotate(180deg); }
1053
+ .asst-dd.asst-dd-model:is(:hover, [aria-expanded="true"]) > .asst-icon:not([hidden]):not(:last-child) { color: var(--asst-provider-color, var(--asst-text-2)); }
1054
+ /* A pending route card the panel is not showing: the chip says so (its menu replays it). */
1055
+ .asst-route-chip .asst-route-waiting {
1056
+ display: inline-flex;
1057
+ flex-shrink: 0;
1058
+ align-items: center;
1059
+ height: var(--asst-pill-h-xs);
1060
+ margin-right: -2px;
1061
+ padding: 0 var(--asst-pill-px-xs);
1062
+ border-radius: var(--asst-pill-r-xs);
1063
+ box-shadow: inset 0 0 0 1px var(--asst-pill-warn-ring);
1064
+ color: var(--asst-warn);
1065
+ font-size: 10.5px;
1066
+ font-variant-numeric: tabular-nums;
1067
+ white-space: nowrap;
1068
+ }
1069
+ .asst-route-chip .asst-route-waiting[hidden] { display: none; }
1070
+ .asst-route-chip[data-waiting] { max-width: calc(18ch + 110px); }
1071
+ .asst-tb-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
1072
+ /* Computer: the state dot and the screen share the glyph half (one centred pair). Off is a ring,
1073
+ ready a dot, setup a diamond, controlling the red live dot. */
1074
+ .asst-computer-toggle > .asst-icon { gap: 4px; }
1075
+ .asst-computer-dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: 50%; box-shadow: inset 0 0 0 1.5px var(--asst-text-3); }
1076
+ .asst-computer-toggle[data-state="ready"] .asst-computer-dot { background: var(--asst-focus); box-shadow: none; }
1077
+ .asst-computer-toggle[data-state="setup"] .asst-computer-dot { border-radius: 1px; background: var(--asst-warn); box-shadow: none; transform: rotate(45deg) scale(.9); }
1078
+ .asst-computer-toggle[data-state="active"] .asst-computer-dot { background: var(--asst-live); box-shadow: none; animation: asst-live 1.4s var(--asst-ease-standard) infinite; }
1079
+
1080
+ /* Attach and send are md squares. Send: white when there is something to send, quiet when empty. */
1081
+ .asst-send { display: grid; place-items: center; width: var(--cap-h); padding: 0; background: var(--asst-text); box-shadow: none; color: var(--asst-ink); }
1082
+ .asst-send > svg { width: 15px; height: 15px; stroke-width: 2.4; }
1083
+ .asst-send:hover:not(:disabled) { background: #fff; }
1084
+ .asst-send[data-state="empty"] { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line); color: var(--asst-text-3); cursor: default; }
1085
+ /* Stop: one neutral white square with the ■ glyph in every host (red only ever means failed). */
1086
+ .asst-root .asst-send[data-state="stop"],
1087
+ .asst-root .asst-send[data-state="stop"]:hover:not(:disabled) { background: var(--asst-text); box-shadow: none; color: var(--asst-ink); }
1088
+ .asst-root .asst-send[data-state="stop"]:hover:not(:disabled) { background: #fff; }
1089
+
1090
+ .asst-slash-menu {
1091
+ position: absolute;
1092
+ left: 0;
1093
+ right: 0;
1094
+ bottom: calc(100% + 6px);
1095
+ z-index: 20;
1096
+ max-height: min(260px, 50cqh);
1097
+ overflow-y: auto;
1098
+ padding: 4px;
1099
+ border-radius: 10px;
1100
+ background: var(--asst-popover);
1101
+ box-shadow: var(--asst-popover-shadow), 0 0 0 1px var(--asst-popover-ring);
1102
+ }
1103
+ /* Rows sit concentric in the 10px popover (4px padding). */
1104
+ .asst-slash-item {
1105
+ display: flex;
1106
+ flex-direction: column;
1107
+ justify-content: center;
1108
+ gap: 2px;
1109
+ min-height: var(--asst-pill-h-md);
1110
+ padding: 5px 10px;
1111
+ border-radius: calc(var(--asst-r-card) - 4px);
1112
+ cursor: pointer;
1113
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard);
1114
+ }
1115
+ .asst-slash-item:is(.focused, :hover) { background: var(--asst-fill-2); }
1116
+ .asst-slash-name { color: var(--asst-text); font-family: var(--asst-mono); font-size: 12px; }
1117
+ .asst-slash-desc { color: var(--asst-text-3); font-size: 11.5px; }
1118
+ .asst-slash-item:is(.focused, :hover) .asst-slash-desc { color: var(--asst-text-2); }
1119
+
1120
+ /* ── Control cards: [data-kind] picks the tone pair ─────────────── */
1121
+ /* A card that waits on you: a 1px hairline in its tone (no accent bar), a still blocked
1122
+ cameo and the kind as a capsule with the ◆ glyph half. Gold never: it means live. */
1123
+ .asst-control {
1124
+ --tone: var(--asst-warn);
1125
+ --tone-line: color-mix(in srgb, var(--tone) 30%, transparent);
1126
+ display: flex;
1127
+ flex-direction: column;
1128
+ gap: 10px;
1129
+ min-width: 0;
1130
+ padding: 12px 14px;
1131
+ border: 1px solid var(--tone-line);
1132
+ border-radius: var(--asst-r-card);
1133
+ background: transparent;
1134
+ font-size: 13px;
1135
+ }
1136
+ .asst-control[data-kind="permission"] { --tone: var(--asst-warn); }
1137
+ .asst-control[data-kind="computer"] { --tone: var(--asst-warn); }
1138
+ .asst-control:is([data-kind="question"], [data-kind="elicitation"]) { --tone: var(--asst-info); }
1139
+ .asst-control:is([data-kind="plan"], [data-kind="route"], [data-kind="clarify"]) { --tone: var(--asst-text-2); --tone-line: var(--asst-line-2); }
1140
+ .asst-control.resolved { --tone: var(--asst-text-3); --tone-line: var(--asst-line); opacity: .8; }
1141
+ .asst-control-head { display: flex; align-items: center; gap: 8px; min-width: 0; }
1142
+ .asst-control-face { display: inline-flex; flex-shrink: 0; color: var(--asst-text-2); line-height: 0; }
1143
+ .asst-control-face svg { display: block; width: 28px; height: 14px; }
1144
+ .asst-control-kind {
1145
+ display: inline-flex;
1146
+ align-items: center;
1147
+ gap: 6px;
1148
+ min-width: 0;
1149
+ height: var(--asst-pill-h-sm);
1150
+ padding: 0 var(--asst-pill-px-sm) 0 0;
1151
+ border-radius: var(--asst-pill-r-sm);
1152
+ background: var(--asst-fill-1);
1153
+ box-shadow: inset 0 0 0 1px var(--tone-line);
1154
+ color: var(--asst-text);
1155
+ font-size: 12px;
1156
+ font-weight: 600;
1157
+ white-space: nowrap;
1158
+ }
1159
+ .asst-control-kind::before {
1160
+ content: '◆' / '';
1161
+ align-self: stretch;
1162
+ display: inline-flex;
1163
+ align-items: center;
1164
+ padding: 0 6px 0 8px;
1165
+ box-shadow: inset -1px 0 0 var(--tone-line);
1166
+ color: var(--tone);
1167
+ font-size: 9px;
1168
+ }
1169
+ .asst-control.resolved .asst-control-kind::before { content: '✓' / ''; font-size: 10px; }
1170
+ /* Where a relayed card came from: an xs capsule, the provider glyph · seam · run id. */
1171
+ .asst-control-origin { display: inline-flex; align-items: center; gap: 4px; height: var(--asst-pill-h-xs); padding: 0 var(--asst-pill-px-xs) 0 0; border-radius: var(--asst-pill-r-xs); background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line); color: var(--asst-text-2); font-size: 10.5px; font-weight: 500; }
1172
+ .asst-control-origin > .asst-icon { align-self: stretch; padding: 0 3px 0 5px; box-shadow: inset -1px 0 0 var(--asst-line); }
1173
+ .asst-control-origin svg { width: 10px; height: 10px; }
1174
+ .asst-control-status { margin-left: auto; color: var(--asst-text-2); font-size: 11.5px; font-weight: 500; }
1175
+ .asst-control-body { display: flex; flex-direction: column; gap: 8px; min-width: 0; }
1176
+ .asst-control-tool { display: flex; flex-wrap: wrap; align-items: baseline; gap: 8px; }
1177
+ .asst-control-tool-name { color: var(--asst-text); font-family: var(--asst-mono); font-size: 12px; }
1178
+ .asst-control-tool-note { color: var(--asst-text-2); }
1179
+ .asst-control-preview-label, .asst-control-desc { margin-bottom: 4px; color: var(--asst-text-3); font-size: 11.5px; }
1180
+ :is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom) {
1181
+ width: 100%;
1182
+ padding: 7px 10px;
1183
+ border: 0;
1184
+ border-radius: var(--asst-r-field);
1185
+ outline: none;
1186
+ background: var(--asst-field);
1187
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1188
+ color: var(--asst-text);
1189
+ font: inherit;
1190
+ font-size: 12.5px;
1191
+ resize: vertical;
1192
+ }
1193
+ :is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom):focus { box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1194
+ .asst-control-cmd { font-family: var(--asst-mono); }
1195
+ .asst-control-detail {
1196
+ max-height: 200px;
1197
+ overflow: auto;
1198
+ margin: 0;
1199
+ padding: 8px 10px;
1200
+ border-radius: var(--asst-r-field);
1201
+ background: var(--asst-field);
1202
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1203
+ color: var(--asst-text-2);
1204
+ font-family: var(--asst-mono);
1205
+ font-size: 11.5px;
1206
+ white-space: pre-wrap;
1207
+ overflow-wrap: anywhere;
1208
+ }
1209
+ .asst-control-kv { display: flex; flex-direction: column; gap: 2px; font-size: 12px; }
1210
+ .asst-control-kv-row { display: flex; gap: 8px; min-width: 0; }
1211
+ .asst-control-kv-key { min-width: 80px; color: var(--asst-text-3); }
1212
+ .asst-control-kv-val { min-width: 0; color: var(--asst-text-2); overflow-wrap: anywhere; }
1213
+ .asst-control-patterns { color: var(--asst-text-2); font-family: var(--asst-mono); font-size: 11.5px; }
1214
+ .asst-control-suggestions { display: flex; flex-direction: column; gap: 4px; }
1215
+ .asst-control-suggestion { display: flex; align-items: center; gap: 8px; color: var(--asst-text-2); font-size: 12.5px; cursor: pointer; }
1216
+ .asst-control-suggestion input { margin: 0; accent-color: var(--asst-text); }
1217
+ .asst-control-message { color: var(--asst-text); }
1218
+ .asst-control-q { display: flex; flex-direction: column; gap: 6px; }
1219
+ .asst-control-q + .asst-control-q { padding-top: 10px; border-top: 1px solid var(--asst-line); }
1220
+ .asst-control-q-header { color: var(--asst-text-3); font-size: 11.5px; font-weight: 500; }
1221
+ .asst-control-q-text { color: var(--asst-text); }
1222
+ .asst-control-q-hint { color: var(--asst-text-3); font-size: 11.5px; }
1223
+ .asst-control-assume { color: var(--asst-text-3); font-size: 11.5px; padding-top: 8px; border-top: 1px solid var(--asst-line); overflow-wrap: anywhere; }
1224
+ .asst-control-options { display: flex; flex-direction: column; gap: 4px; }
1225
+ .asst-control-option {
1226
+ display: flex;
1227
+ flex-direction: column;
1228
+ align-items: flex-start;
1229
+ gap: 2px;
1230
+ padding: 7px 10px;
1231
+ border: 0;
1232
+ border-radius: var(--asst-r-field);
1233
+ background: transparent;
1234
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1235
+ color: var(--asst-text);
1236
+ font: inherit;
1237
+ font-size: 13px;
1238
+ text-align: left;
1239
+ cursor: pointer;
1240
+ }
1241
+ .asst-control-option:hover { background: var(--asst-fill-1); }
1242
+ .asst-control-option.selected { background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2), inset 2px 0 0 var(--tone); }
1243
+ .asst-control-option-desc { color: var(--asst-text-3); font-size: 11.5px; }
1244
+ .asst-control-plan-body { min-width: 0; }
1245
+ .asst-control-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
1246
+
1247
+ /* Route card */
1248
+ .asst-route-summary { color: var(--asst-text); }
1249
+ .asst-route-reasons { margin-top: -4px; color: var(--asst-text-3); font-size: 11.5px; }
1250
+ .asst-route-options { display: flex; flex-direction: column; gap: 4px; }
1251
+ .asst-route-option {
1252
+ display: flex;
1253
+ align-items: center;
1254
+ gap: 10px;
1255
+ min-width: 0;
1256
+ padding: 7px 10px;
1257
+ border-radius: var(--asst-r-field);
1258
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1259
+ cursor: pointer;
1260
+ }
1261
+ .asst-route-option:hover { background: var(--asst-fill-1); }
1262
+ .asst-route-option.selected { background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1263
+ .asst-route-option[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }
1264
+ /* The option's key: an xs square; gold once it is the pick. */
1265
+ .asst-route-num {
1266
+ display: inline-flex;
1267
+ align-items: center;
1268
+ justify-content: center;
1269
+ flex-shrink: 0;
1270
+ width: var(--asst-pill-h-xs);
1271
+ height: var(--asst-pill-h-xs);
1272
+ border-radius: var(--asst-pill-r-xs);
1273
+ background: var(--asst-fill-1);
1274
+ box-shadow: inset 0 0 0 1px var(--asst-line-2);
1275
+ color: var(--asst-text-2);
1276
+ font-family: var(--asst-mono);
1277
+ font-size: 10.5px;
1278
+ font-variant-numeric: tabular-nums;
1279
+ 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);
1280
+ }
1281
+ .asst-route-option.selected .asst-route-num { background: var(--asst-pill-on-fill); box-shadow: inset 0 0 0 1px var(--asst-pill-on-ring); color: var(--asst-text); }
1282
+ .asst-route-opt-icon svg { width: 14px; height: 14px; }
1283
+ .asst-route-opt-main { display: flex; flex: 1; flex-direction: column; gap: 1px; min-width: 0; }
1284
+ .asst-route-opt-title, .asst-route-opt-sub { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
1285
+ .asst-route-opt-title { color: var(--asst-text); }
1286
+ .asst-route-opt-sub { color: var(--asst-text-3); font-size: 11.5px; }
1287
+ .asst-route-opt-warn { color: var(--asst-warn); font-size: 11.5px; }
1288
+ .asst-route-badge {
1289
+ display: inline-flex;
1290
+ align-items: center;
1291
+ flex-shrink: 0;
1292
+ height: var(--asst-pill-h-xs);
1293
+ padding: 0 var(--asst-pill-px-xs);
1294
+ border-radius: var(--asst-pill-r-xs);
1295
+ background: var(--asst-fill-1);
1296
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1297
+ color: var(--asst-text-2);
1298
+ font-size: 10.5px;
1299
+ font-weight: 500;
1300
+ white-space: nowrap;
1301
+ }
1302
+ .asst-route-badge[data-badge="suggested"] { box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text); }
1303
+ .asst-route-remember { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--asst-text-2); font-size: 12.5px; cursor: pointer; }
1304
+ .asst-route-remember input { margin: 0; accent-color: var(--asst-text); }
1305
+ .asst-route-remember-current { color: var(--asst-text-3); font-size: 11.5px; }
1306
+ .asst-route-error { color: var(--asst-live); font-size: 12px; }
1307
+ .asst-route-countdown { margin-left: auto; color: var(--asst-text-2); font-family: var(--asst-mono); font-size: 11px; font-variant-numeric: tabular-nums; }
1308
+ .asst-route-keys { margin-right: auto; color: var(--asst-text-3); font-size: 11px; }
1309
+ .asst-route-card.pending .asst-route-options { opacity: .7; }
1310
+
1311
+ /* ── Buttons: md capsules (blue only for :focus-visible and links) ── */
1312
+ .asst-btn { color: var(--asst-text); }
1313
+ .asst-btn-secondary { background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text); }
1314
+ .asst-btn-primary { background: var(--asst-text); box-shadow: none; color: var(--asst-ink); }
1315
+ .asst-btn-primary:hover:not(:disabled) { background: #fff; box-shadow: none; color: var(--asst-ink); }
1316
+ /* Deny / Decline: a neutral ghost with ✕ (red only ever means failed). */
1317
+ .asst-btn-danger { background: transparent; box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text-2); }
1318
+ .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); }
1319
+ .asst-btn-icon { display: inline-flex; margin-left: -2px; }
1320
+ .asst-btn-icon svg { width: 12px; height: 12px; }
1321
+
1322
+ /* ── Focus: one ring for everything the Assistant draws ──────────────
1323
+ 2px of --asst-focus, 1px out: the component, its menus and modals, the
1324
+ sidepanel chrome (.asp-*, the window buttons) and the tray pill with its
1325
+ close button. Scrollers and menu rows draw the same ring 2px inside
1326
+ (outside it would be clipped). */
1327
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay, .asst-lightbox) :is(button, a, summary, [role="radio"], [role="button"], [role="tab"], [tabindex]):focus-visible,
1328
+ .assistant-panel.sp-sidepanel :is(button, [role="button"], [tabindex]):focus-visible,
1329
+ .assistant-panel :is(.asp-header, .asp-body) :is(button, [role="button"], [tabindex]):focus-visible,
1330
+ .asp-session-pill:focus-visible,
1331
+ .asp-session-pill .term-minimized-pill-close:focus-visible,
1332
+ :is(.asst-control-cmd, .asst-control-deny-msg, .asst-control-custom):focus-visible {
1333
+ outline: 2px solid var(--asst-focus);
1334
+ outline-offset: 1px;
1335
+ }
1336
+ .asst-root .asst-transcript:focus-visible,
1337
+ .assistant-panel .asp-body .asst-transcript:focus-visible,
1338
+ .asst-root .asst-rack-receipt:focus-visible,
1339
+ .asst-dd-menu .asst-dd-item:focus-visible { outline-offset: -2px; }
1340
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay) :is(button, [tabindex]):focus:not(:focus-visible) { outline: none; }
1341
+
1342
+ /* ── Menus (asst-menu.js) ───────────────────────────────────────── */
1343
+ .asst-dd-menu {
1344
+ position: fixed;
1345
+ z-index: 100030; /* above modals (100020): the routes editor opens model menus */
1346
+ display: flex;
1347
+ flex-direction: column;
1348
+ min-width: 200px;
1349
+ max-width: min(380px, calc(100vw - 16px));
1350
+ max-height: 380px;
1351
+ overflow: hidden;
1352
+ padding: 4px;
1353
+ border-radius: 10px;
1354
+ outline: none;
1355
+ background: var(--asst-popover);
1356
+ box-shadow: var(--asst-popover-shadow), 0 0 0 1px var(--asst-popover-ring);
1357
+ color: var(--asst-text);
1358
+ font-size: 12.5px;
1359
+ line-height: 1.4;
1360
+ }
1361
+ .asst-dd-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; scrollbar-width: thin; scrollbar-color: var(--asst-fill-3) transparent; }
1362
+ .asst-dd-list::-webkit-scrollbar { width: 8px; }
1363
+ .asst-dd-list::-webkit-scrollbar-thumb { background: var(--asst-fill-3); border: 2px solid transparent; border-radius: 8px; background-clip: padding-box; }
1364
+ .asst-dd-menu-title { flex-shrink: 0; padding: 6px 10px 4px; color: var(--asst-text-3); font-size: 11.5px; font-weight: 500; }
1365
+ .asst-dd-group { display: flex; align-items: center; gap: 6px; padding: 8px 10px 3px; color: var(--asst-text-3); font-size: 11.5px; font-weight: 500; }
1366
+ .asst-dd-group .asst-icon svg { width: 11px; height: 11px; }
1367
+ .asst-dd-group-note { margin-left: auto; color: var(--asst-text-3); font-size: 11px; font-weight: 400; }
1368
+ .asst-dd-item {
1369
+ display: flex;
1370
+ align-items: center;
1371
+ gap: 8px;
1372
+ width: 100%;
1373
+ min-height: 30px;
1374
+ padding: 5px 10px;
1375
+ border: 0;
1376
+ border-radius: calc(var(--asst-r-card) - 4px);
1377
+ background: transparent;
1378
+ color: var(--asst-text);
1379
+ font: inherit;
1380
+ text-align: left;
1381
+ cursor: pointer;
1382
+ transition: background-color var(--asst-dur-fast) var(--asst-ease-standard);
1383
+ }
1384
+ .asst-dd-item:is(:hover, .focused) { background: var(--asst-fill-2); }
1385
+ .asst-dd-item:is(:hover, .focused) .asst-dd-item-desc { color: var(--asst-text-2); }
1386
+ .asst-dd-item:disabled { opacity: .45; cursor: default; }
1387
+ .asst-dd-item.danger { color: var(--asst-live); }
1388
+ .asst-dd-check { display: inline-flex; flex-shrink: 0; width: 14px; color: var(--asst-text); }
1389
+ .asst-dd-check svg { width: 13px; height: 13px; }
1390
+ .asst-dd-item .asst-icon { width: 16px; color: var(--asst-text-2); }
1391
+ .asst-dd-item-main { display: flex; flex: 1; flex-direction: column; gap: 1px; min-width: 0; }
1392
+ .asst-dd-item-label, .asst-dd-item-desc { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
1393
+ .asst-dd-item-desc { color: var(--asst-text-3); font-size: 11px; }
1394
+ .asst-dd-item-tag { flex-shrink: 0; margin-left: auto; color: var(--asst-text-3); font-size: 11px; }
1395
+ .asst-dd-kbd { flex-shrink: 0; margin-left: auto; color: var(--asst-text-3); font-family: var(--asst-mono); font-size: 10.5px; }
1396
+ .asst-dd-sep { flex-shrink: 0; height: 1px; margin: 4px 6px; background: var(--asst-line); }
1397
+ .asst-dd-info { display: flex; align-items: center; gap: 8px; padding: 5px 10px; color: var(--asst-text-3); font-size: 11.5px; }
1398
+ .asst-dd-info-value { margin-left: auto; color: var(--asst-text-2); font-variant-numeric: tabular-nums; }
1399
+ .asst-dd-tagrow { padding: 4px 10px; }
1400
+ .asst-dd-tag { display: inline-flex; align-items: center; height: var(--asst-pill-h-xs); padding: 0 var(--asst-pill-px-xs); border-radius: var(--asst-pill-r-xs); background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line); color: var(--asst-text-2); font-size: 10.5px; font-weight: 500; }
1401
+ .asst-dd-input {
1402
+ display: block;
1403
+ flex-shrink: 0;
1404
+ width: 100%;
1405
+ height: 30px;
1406
+ margin: 4px 0;
1407
+ padding: 0 10px;
1408
+ border: 0;
1409
+ border-radius: calc(var(--asst-r-card) - 4px);
1410
+ outline: none;
1411
+ background: var(--asst-field);
1412
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1413
+ color: var(--asst-text);
1414
+ font: inherit;
1415
+ font-size: 12.5px;
1416
+ -webkit-appearance: none;
1417
+ appearance: none;
1418
+ }
1419
+ .asst-dd-input:focus { box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1420
+ .asst-dd-input::placeholder { color: var(--asst-text-3); }
1421
+ .asst-dd-filter { margin: 2px 0 4px; }
1422
+ .asst-dd-empty { padding: 8px 10px; color: var(--asst-text-3); }
1423
+
1424
+ /* ── Modals (help, accounts, model routes) ──────────────────────── */
1425
+ .asst-modal-overlay {
1426
+ position: fixed;
1427
+ inset: 0;
1428
+ z-index: 100020;
1429
+ display: flex;
1430
+ align-items: center;
1431
+ justify-content: center;
1432
+ padding: 16px;
1433
+ background: var(--asst-scrim);
1434
+ }
1435
+ .asst-modal {
1436
+ display: flex;
1437
+ flex-direction: column;
1438
+ width: min(560px, 100%);
1439
+ max-height: min(84vh, 760px);
1440
+ overflow: hidden;
1441
+ border-radius: 12px;
1442
+ background: var(--asst-popover);
1443
+ box-shadow: var(--asst-popover-shadow), 0 0 0 1px var(--asst-popover-ring);
1444
+ color: var(--asst-text);
1445
+ font-size: 13px;
1446
+ }
1447
+ .asst-modal-head { display: flex; flex-shrink: 0; align-items: center; gap: 8px; padding: 12px 12px 12px 16px; border-bottom: 1px solid var(--asst-line); font-size: 13.5px; font-weight: 600; }
1448
+ .asst-modal-head .asst-icon { color: var(--asst-brand); }
1449
+ .asst-modal-head .asst-icon svg { width: 15px; height: 15px; }
1450
+ .asst-modal-head .asst-iconbtn { margin-left: auto; }
1451
+ .asst-modal-body { display: flex; flex-direction: column; gap: 10px; min-height: 0; overflow-y: auto; padding: 14px 16px; }
1452
+ .asst-modal-foot { display: flex; flex-shrink: 0; align-items: center; gap: 8px; padding: 12px 16px; border-top: 1px solid var(--asst-line); }
1453
+ .asst-modal-spacer { flex: 1; }
1454
+ .asst-modal-note { color: var(--asst-text-3); font-size: 12px; line-height: 1.5; }
1455
+ .asst-account-list { display: flex; flex-direction: column; gap: 2px; }
1456
+ .asst-account-row { display: flex; align-items: center; gap: 6px; padding: 6px 8px; border-radius: var(--asst-r-field); }
1457
+ .asst-account-row:hover { background: var(--asst-fill-1); }
1458
+ .asst-account-main { display: flex; flex: 1; flex-direction: column; min-width: 0; }
1459
+ .asst-account-label, .asst-account-sub { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
1460
+ .asst-account-label { color: var(--asst-text); }
1461
+ .asst-account-sub { color: var(--asst-text-3); font-size: 11px; }
1462
+ .asst-account-row input.asst-dd-input { margin: 0; }
1463
+ .asst-login-box { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; border-radius: var(--asst-r-field); box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1464
+ .asst-login-code { color: var(--asst-text); font-family: var(--asst-mono); font-size: 15px; letter-spacing: .1em; }
1465
+
1466
+ .asst-routes-modal { width: min(660px, 100%); }
1467
+ .asst-budget-row { align-items: flex-start; }
1468
+ .asst-budget-desc, .asst-budget-meta { color: var(--asst-text-3); font-size: 11.5px; line-height: 1.4; }
1469
+ .asst-budget-meta { font-variant-numeric: tabular-nums; }
1470
+ .asst-budget-field-error { color: var(--asst-live); font-size: 11.5px; line-height: 1.4; }
1471
+ .asst-budget-amount { display: flex; flex-shrink: 0; align-items: center; gap: 6px; }
1472
+ .asst-budget-unit { color: var(--asst-text-3); font-size: 11px; white-space: nowrap; }
1473
+ .asst-budget-input { width: 96px; margin: 0; font-variant-numeric: tabular-nums; }
1474
+ .asst-budget-input[aria-invalid="true"] { box-shadow: inset 0 0 0 1px var(--asst-live); }
1475
+ .asst-budget-meter { position: relative; height: 6px; overflow: hidden; border-radius: 3px; background: var(--asst-line); }
1476
+ .asst-budget-meter-fill { position: absolute; inset: 0 auto 0 0; background: var(--asst-text-3); }
1477
+ .asst-budget-meter[data-tone="warn"] .asst-budget-meter-fill { background: var(--asst-warn); }
1478
+ .asst-budget-meter[data-tone="over"] .asst-budget-meter-fill { background: var(--asst-live); }
1479
+ .asst-budget-meter-warn { position: absolute; top: 0; bottom: 0; width: 2px; margin-left: -1px; background: var(--asst-warn); }
1480
+ .asst-budget-unpriced { color: var(--asst-warn); }
1481
+ .asst-budget-enforcement { margin: 0; padding-left: 18px; color: var(--asst-text-2, var(--asst-text-3)); font-size: 11.5px; line-height: 1.5; }
1482
+ .asst-budget-enforcement li + li { margin-top: 4px; }
1483
+ .asst-routes-section { display: flex; flex-direction: column; gap: 8px; }
1484
+ .asst-routes-section + .asst-routes-section { margin-top: 6px; }
1485
+ .asst-routes-section-title { color: var(--asst-text-3); font-size: 11.5px; font-weight: 500; }
1486
+ .asst-routes-modes { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; }
1487
+ .asst-routes-mode {
1488
+ display: flex;
1489
+ flex-direction: column;
1490
+ align-items: flex-start;
1491
+ gap: 3px;
1492
+ padding: 9px 11px;
1493
+ border: 0;
1494
+ border-radius: var(--asst-r-field);
1495
+ background: transparent;
1496
+ box-shadow: inset 0 0 0 1px var(--asst-line);
1497
+ color: var(--asst-text);
1498
+ font: inherit;
1499
+ text-align: left;
1500
+ cursor: pointer;
1501
+ }
1502
+ .asst-routes-mode:hover { background: var(--asst-fill-1); }
1503
+ .asst-routes-mode[aria-checked="true"] { background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2), inset 2px 0 0 var(--asst-brand); }
1504
+ .asst-routes-mode-label { font-size: 12.5px; font-weight: 500; }
1505
+ .asst-routes-mode-desc { color: var(--asst-text-3); font-size: 11.5px; line-height: 1.4; }
1506
+ .asst-routes-list { display: flex; flex-direction: column; }
1507
+ .asst-routes-row { display: flex; align-items: center; gap: 8px; min-width: 0; padding: 8px 2px; border-top: 1px solid var(--asst-line); }
1508
+ .asst-routes-row:first-child { border-top: 0; }
1509
+ .asst-routes-row-main { flex: 1; min-width: 0; }
1510
+ .asst-routes-row-label { color: var(--asst-text); font-size: 12.5px; }
1511
+ .asst-routes-row-desc { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--asst-text-3); font-size: 11.5px; }
1512
+ .asst-routes-row-note { color: var(--asst-warn); font-size: 11.5px; }
1513
+ .asst-routes-model { max-width: 200px; box-shadow: inset 0 0 0 1px var(--asst-line); }
1514
+ .asst-routes-source { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; min-width: 72px; height: var(--asst-pill-h-xs); padding: 0 var(--asst-pill-px-xs); border-radius: var(--asst-pill-r-xs); background: var(--asst-fill-1); box-shadow: inset 0 0 0 1px var(--asst-line); color: var(--asst-text-2); font-size: 10.5px; font-weight: 500; }
1515
+ .asst-routes-source[data-source="yours"] { color: var(--asst-text); box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1516
+ .asst-routes-source[data-source="remembered"] { color: var(--asst-text); box-shadow: inset 0 0 0 1px var(--asst-line-2); }
1517
+ .asst-routes-error { display: flex; align-items: center; gap: 8px; padding: 8px 10px; border-radius: var(--asst-r-field); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--asst-live) 45%, transparent); color: var(--asst-text); font-size: 12.5px; }
1518
+ .asst-routes-error span { flex: 1; }
1519
+ .asst-routes-source[data-source="disabled"] { color: var(--asst-text-3); text-decoration: line-through; }
1520
+ .asst-routes-source[data-source="incapable"] { color: var(--asst-warn); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--asst-warn) 45%, transparent); }
1521
+ .asst-models-filter { width: 100%; margin: 0 0 4px; }
1522
+ .asst-models-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
1523
+ .asst-models-count { font-weight: 500; letter-spacing: normal; text-transform: none; }
1524
+ .asst-models-inuse { min-width: 0; height: 18px; margin-left: 4px; vertical-align: middle; font-size: 10.5px; }
1525
+ .asst-models-switch { position: relative; flex-shrink: 0; width: 30px; height: 18px; padding: 0; border: 0; border-radius: var(--asst-pill-r-xs); background: var(--asst-fill-2); box-shadow: inset 0 0 0 1px var(--asst-line-2); cursor: pointer; }
1526
+ .asst-models-switch[aria-checked="true"] { background: var(--asst-brand); box-shadow: none; }
1527
+ .asst-models-switch:disabled { opacity: .6; cursor: progress; }
1528
+ .asst-models-knob { position: absolute; top: 3px; left: 3px; width: 12px; height: 12px; border-radius: 3px; background: var(--asst-text-3); transition: transform var(--asst-dur-fast) var(--asst-ease-standard); }
1529
+ .asst-models-switch[aria-checked="true"] .asst-models-knob { transform: translateX(12px); background: #fff; }
1530
+ .asst-models-tabs { display: flex; gap: 4px; padding: 0 16px; box-shadow: inset 0 -1px 0 var(--asst-line); }
1531
+ .asst-models-tab { display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 10px; border: 0; background: transparent; color: var(--asst-text-2); font: inherit; font-size: 12.5px; cursor: pointer; box-shadow: inset 0 -2px 0 transparent; }
1532
+ .asst-models-tab:hover { color: var(--asst-text); }
1533
+ .asst-models-tab.is-active { color: var(--asst-text); box-shadow: inset 0 -2px 0 var(--asst-brand); }
1534
+ .asst-models-badge { min-width: var(--asst-pill-h-xs); height: var(--asst-pill-h-xs); padding: 0 var(--asst-pill-px-xs); border-radius: var(--asst-pill-r-xs); background: var(--asst-fill-2); color: var(--asst-text); font-family: var(--asst-mono); font-size: 10.5px; line-height: var(--asst-pill-h-xs); font-variant-numeric: tabular-nums; text-align: center; }
1535
+ .asst-models-ctx { margin-left: 6px; padding: 0 5px; border-radius: var(--asst-pill-r-xs); box-shadow: inset 0 0 0 1px var(--asst-line-2); color: var(--asst-text-2); font-size: 10.5px; vertical-align: middle; }
1536
+ .asst-routes-source[data-source="unlisted"] { color: var(--asst-text-3); }
1537
+ .asst-models-restore, .asst-models-restore-all { flex-shrink: 0; }
1538
+ .asst-models-head .asst-models-restore-all { margin-left: auto; }
1539
+ .asst-models-group { border-radius: var(--asst-r-field); box-shadow: inset 0 0 0 1px var(--asst-line); }
1540
+ .asst-models-group + .asst-models-group { margin-top: 4px; }
1541
+ .asst-models-group-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 6px 10px; color: var(--asst-text); font-size: 12.5px; cursor: pointer; }
1542
+ .asst-models-group-body { display: flex; flex-direction: column; gap: 2px; padding: 0 6px 6px; }
1543
+ .asst-models-group-body > .asst-models-restore-all { align-self: flex-start; margin: 2px 4px 4px; }
1544
+ @media (max-width: 600px) {
1545
+ .asst-routes-modes { grid-template-columns: 1fr; }
1546
+ .asst-routes-row { flex-wrap: wrap; }
1547
+ }
1548
+
1549
+ /* ── Frame lightbox ─────────────────────────────────────────────── */
1550
+ .asst-lightbox { position: fixed; inset: 0; z-index: 100040; display: flex; align-items: center; justify-content: center; background: var(--asst-scrim-strong); }
1551
+ .asst-lightbox-figure { display: flex; flex-direction: column; align-items: center; gap: 10px; margin: 0; }
1552
+ .asst-lightbox-frame { position: relative; display: inline-block; overflow: hidden; line-height: 0; border-radius: 8px; box-shadow: var(--asst-popover-shadow), 0 0 0 1px var(--asst-popover-ring); }
1553
+ .asst-lightbox-img { display: block; width: auto; height: auto; max-width: 92vw; max-height: 86vh; }
1554
+ .asst-lightbox-caption { max-width: 92vw; color: var(--asst-text-2); font-size: 12.5px; text-align: center; }
1555
+ .asst-lightbox-close { position: absolute; top: 14px; right: 14px; background: var(--asst-popover); box-shadow: 0 0 0 1px var(--asst-popover-ring); color: var(--asst-text); }
1556
+
1557
+ /* ── Float header brain chip (lives in ui-terminal's float window) ─ */
1558
+ .term-float-brain-chip {
1559
+ display: inline-flex;
1560
+ align-items: center;
1561
+ flex-shrink: 1;
1562
+ min-width: 0;
1563
+ max-width: 200px;
1564
+ height: 18px;
1565
+ margin-left: 4px;
1566
+ padding: 0 8px;
1567
+ border: 0;
1568
+ border-radius: var(--asst-pill-r-xs);
1569
+ background: transparent;
1570
+ box-shadow: inset 0 0 0 1px var(--asst-line-2);
1571
+ color: var(--asst-text-2);
1572
+ font-size: 10.5px;
1573
+ white-space: nowrap;
1574
+ overflow: hidden;
1575
+ text-overflow: ellipsis;
1576
+ }
1577
+
1578
+ /* ── Empty state character (shared/synabun-mascot.js, the onboarding eyes) ──
1579
+ The rig moves by itself (idle, blinks, the cursor); nothing floats it.
1580
+ A send hands it over to the "Thinking" row at once; with no such row it
1581
+ fades out where it stood (.asst-hero-dock, positioned by asst-render.js). */
1582
+ .asst-empty-mascot { display: flex; justify-content: center; margin-bottom: 2px; color: var(--asst-text); pointer-events: none; user-select: none; }
1583
+ :is(.asst-empty-mascot, .asst-hero-dock) svg { display: block; }
1584
+ .asst-hero-dock { position: absolute; z-index: 4; display: flex; align-items: center; justify-content: center; color: var(--asst-text); pointer-events: none; user-select: none; }
1585
+
1586
+ /* ── System notices ─────────────────────────────────────────────── */
1587
+ .asst-status { white-space: pre-wrap; overflow-wrap: anywhere; }
1588
+ .asst-status.warn { color: var(--asst-warn); }
1589
+ .asst-msg.asst-msg-error .asst-msg-content { padding: 6px 10px; border-radius: var(--asst-r-field); box-shadow: inset 2px 0 0 var(--asst-live), inset 0 0 0 1px color-mix(in srgb, var(--asst-live) 28%, transparent); }
1590
+ .asst-local-output { padding-left: 12px; border-left: 2px solid var(--asst-line-2); }
1591
+ .asst-local-output .asst-md { color: var(--asst-text-2); font-size: 13px; }
1592
+
1593
+ /* The panel's one status line for screen readers (the transcript is not a live region). */
1594
+ .asst-announce { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0; }
1595
+
1596
+ /* ── Keybind icon in the keybinds modal ─────────────────────────── */
1597
+ .kb-cli-assistant { color: var(--accent-gold); }
1598
+
1599
+ /* ── Narrow / short containers (the tab or float window) ──────────
1600
+ Toolbar priority, highest first: route mode · Computer · project ·
1601
+ MCP. The composer row (attach · model · effort · permission mode ·
1602
+ account) keeps model; account hides ≤720px. A capsule that runs out of
1603
+ room drops its label half first and stays a glyph (its words remain in
1604
+ aria-label and the tooltip): route mode and Computer ≤960px, the mode
1605
+ ≤540px, every composer field but the model ≤440px. Model, history, new
1606
+ and "⋯" never hide; whatever hides stays in "⋯". A toolbar placed
1607
+ outside the root (the sidepanel header) is out of reach of these rules:
1608
+ its host sizes it (asst-sidepanel-styles.js).
1609
+ Glyph only is the same three rules everywhere (see Capsules): the
1610
+ capsule grid-centres its glyph with padding 0, the label half and the
1611
+ caret go (display: none), and the glyph half keeps --cap-glyph-pad on
1612
+ both sides without its seam, so one glyph makes a --cap-h square (the
1613
+ Computer pair a centred capsule). Route mode with route cards waiting
1614
+ keeps its glyph half and the count; only its label goes. */
1615
+ @container asst (max-width: 960px) {
1616
+ .asst-bar :is(.asst-route-chip:not([data-waiting]), .asst-computer-toggle) { display: grid; place-content: center; place-items: center; padding: 0; }
1617
+ .asst-bar :is(.asst-route-chip:not([data-waiting]), .asst-computer-toggle) > :is(.asst-dd-label, .asst-tb-label, .asst-dd-caret) { display: none; }
1618
+ .asst-bar :is(.asst-route-chip:not([data-waiting]), .asst-computer-toggle) > .asst-icon:not([hidden]) { margin: 0; padding: 0 var(--cap-glyph-pad); box-shadow: none; }
1619
+ .asst-bar .asst-route-chip[data-waiting] > .asst-dd-label { display: none; }
1620
+ }
1621
+ @container asst (max-width: 720px) {
1622
+ :is(.asst-dd-mcp, .asst-dd-account, .asst-dd-project, .asst-bar-group[data-group="context"]) { display: none !important; }
1623
+ .asst-route-keys { display: none; }
1624
+ }
1625
+ @container asst (max-width: 540px) {
1626
+ .asst-composer-brain .asst-dd.asst-dd-mode { display: grid; place-content: center; place-items: center; padding: 0; }
1627
+ .asst-composer-brain .asst-dd.asst-dd-mode > :is(.asst-dd-label, .asst-dd-caret) { display: none; }
1628
+ .asst-composer-brain .asst-dd.asst-dd-mode > .asst-icon:not([hidden]) { margin: 0; padding: 0 var(--cap-glyph-pad); box-shadow: none; }
1629
+ .asst-dd-model .asst-dd-label { max-width: 14ch; }
1630
+ .asst-route-badge { display: none; }
1631
+ }
1632
+ @container asst (max-width: 440px) {
1633
+ .asst-composer-brain .asst-dd:is(.asst-dd-effort, .asst-dd-variant, .asst-dd-mode, .asst-dd-account) { display: grid; place-content: center; place-items: center; padding: 0; }
1634
+ .asst-composer-brain .asst-dd:is(.asst-dd-effort, .asst-dd-variant, .asst-dd-mode, .asst-dd-account) > :is(.asst-dd-label, .asst-dd-caret) { display: none; }
1635
+ .asst-composer-brain .asst-dd:is(.asst-dd-effort, .asst-dd-variant, .asst-dd-mode, .asst-dd-account) > .asst-icon:not([hidden]) { margin: 0; padding: 0 var(--cap-glyph-pad); box-shadow: none; }
1636
+ }
1637
+ @container asst (max-width: 400px) {
1638
+ .asst-root > * { --asst-inline: 6px; }
1639
+ :is(.asst-cost, .asst-bar-group[data-group="context"]) { display: none !important; }
1640
+ .asst-suggestions { flex-direction: column; align-items: stretch; width: 100%; }
1641
+ .asst-chip.asst-suggestion { justify-content: flex-start; max-width: none; }
1642
+ .asst-msg.msg-user .asst-msg-content { max-width: 92%; }
1643
+ .asst-dd-model .asst-dd-label { max-width: 9ch; }
1644
+ .asst-route-opt-sub { display: none; }
1645
+ .asst-run-main { flex-wrap: wrap; row-gap: 2px; }
1646
+ .asst-run-title { flex-basis: 100%; }
1647
+ }
1648
+ @container asst (max-width: 320px) {
1649
+ .asst-bar-group[data-group="computer"] { display: none !important; }
1650
+ /* The model keeps a readable name (at least 5ch): the composer row wraps instead of truncating it. */
1651
+ .asst-dd-model .asst-dd-label { min-width: 5ch; max-width: 14ch; }
1652
+ .asst-composer-actions { flex-wrap: wrap; row-gap: 6px; }
1653
+ .asst-composer-brain { flex-wrap: wrap; row-gap: 6px; }
1654
+ }
1655
+ @container asst (max-height: 260px) {
1656
+ /* the toolbar stays: it carries the controls */
1657
+ :is(.asst-empty-body, .asst-empty-mascot, .asst-suggestions) { display: none !important; }
1658
+ .asst-empty { gap: 4px; padding: 4px; }
1659
+ .asst-empty-title { font-size: 14px; }
1660
+ .asst-bottom { margin-top: 6px; }
1661
+ }
1662
+
1663
+ /* ── Motion ─────────────────────────────────────────────────────────
1664
+ One pulse (asst-live) for everything live, the cameo's glance for
1665
+ everything running, the spinner for loading. Transforms and opacity
1666
+ only. They pause while the UI is dragged; under reduced motion the
1667
+ whole Assistant holds still: the component, its menus and modals, the
1668
+ sidepanel frame and its header (.asp-*), and the tray pills. */
1669
+ @keyframes asst-live { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: .35; transform: scale(.8); } }
1670
+ @keyframes asst-cameo { 0%, 42% { transform: translateX(-1.2px); } 50%, 92% { transform: translateX(1.2px); } 100% { transform: translateX(-1.2px); } }
1671
+ @keyframes asst-spin { to { transform: rotate(360deg); } }
1672
+
1673
+ body.ui-interacting :is(.asst-live-dot, .asst-spinner, .asst-computer-dot, .syna-cameo-eye) { animation-play-state: paused !important; }
1674
+
1675
+ @media (prefers-reduced-motion: reduce) {
1676
+ .asst-transcript { scroll-behavior: auto; }
1677
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay, .asst-lightbox, .assistant-panel, .term-minimized-pill) *,
1678
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay, .asst-lightbox, .assistant-panel, .term-minimized-pill) *::before,
1679
+ :is(.asst-root, .asst-bar, .asst-dd-menu, .asst-modal-overlay, .asst-lightbox, .assistant-panel, .term-minimized-pill) *::after,
1680
+ .term-minimized-pill,
1681
+ .term-minimized-pill::before,
1682
+ .term-minimized-pill::after { animation: none !important; transition: none !important; }
1683
+ }
1684
+ `;
1685
+ document.head.appendChild(style);
1686
+ }