synabun 2.0.5 → 2.0.9

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 (527) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +2 -1
  3. package/THIRD-PARTY-LICENSES.md +13 -0
  4. package/docs/whatsapp.md +151 -16
  5. package/hooks/claude-code/post-plan.mjs +6 -30
  6. package/hooks/claude-code/session-start.mjs +1 -4
  7. package/hooks/claude-code/shared.mjs +112 -75
  8. package/lib/child-path.js +303 -0
  9. package/lib/claude-hooks.js +2 -1
  10. package/lib/data-home-migration.js +2 -0
  11. package/lib/desktop-app.js +265 -0
  12. package/lib/external-tools.js +7 -3
  13. package/lib/log-redact.js +102 -0
  14. package/lib/package-processes.js +670 -0
  15. package/lib/packaged-runtime.js +138 -11
  16. package/lib/runtime-dependencies.js +225 -0
  17. package/mcp-server/dist/http.d.ts +3 -1
  18. package/mcp-server/dist/http.d.ts.map +1 -1
  19. package/mcp-server/dist/http.js +15 -4
  20. package/mcp-server/dist/http.js.map +1 -1
  21. package/mcp-server/dist/index.d.ts.map +1 -1
  22. package/mcp-server/dist/index.js +9 -6
  23. package/mcp-server/dist/index.js.map +1 -1
  24. package/mcp-server/dist/services/browser-bench.d.ts +1 -1
  25. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -1
  26. package/mcp-server/dist/services/browser-bench.js +1 -1
  27. package/mcp-server/dist/services/browser-bench.js.map +1 -1
  28. package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
  29. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
  30. package/mcp-server/dist/services/budget-judgments.js +153 -0
  31. package/mcp-server/dist/services/budget-judgments.js.map +1 -0
  32. package/mcp-server/dist/services/categories.d.ts +35 -2
  33. package/mcp-server/dist/services/categories.d.ts.map +1 -1
  34. package/mcp-server/dist/services/categories.js +77 -33
  35. package/mcp-server/dist/services/categories.js.map +1 -1
  36. package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
  37. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  38. package/mcp-server/dist/services/codex-config-heal.js +41 -4
  39. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  40. package/mcp-server/dist/services/desktop-bench.d.ts +7 -7
  41. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -1
  42. package/mcp-server/dist/services/desktop-bench.js +1 -1
  43. package/mcp-server/dist/services/desktop-bench.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +11 -0
  45. package/mcp-server/dist/services/identity.d.ts.map +1 -1
  46. package/mcp-server/dist/services/identity.js +24 -0
  47. package/mcp-server/dist/services/identity.js.map +1 -1
  48. package/mcp-server/dist/services/neural-interface.d.ts +13 -0
  49. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  50. package/mcp-server/dist/services/neural-interface.js +34 -2
  51. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  52. package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
  53. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
  54. package/mcp-server/dist/services/typesafe-config.js +4 -1
  55. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  56. package/mcp-server/dist/tools/agents.d.ts +11 -8
  57. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  58. package/mcp-server/dist/tools/agents.js +35 -14
  59. package/mcp-server/dist/tools/agents.js.map +1 -1
  60. package/mcp-server/dist/tools/bluesky.js +1 -1
  61. package/mcp-server/dist/tools/bluesky.js.map +1 -1
  62. package/mcp-server/dist/tools/browser-advanced.d.ts +1 -1
  63. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -1
  64. package/mcp-server/dist/tools/browser-advanced.js +1 -1
  65. package/mcp-server/dist/tools/browser-advanced.js.map +1 -1
  66. package/mcp-server/dist/tools/browser-batch.d.ts +1 -1
  67. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -1
  68. package/mcp-server/dist/tools/browser-batch.js +1 -1
  69. package/mcp-server/dist/tools/browser-batch.js.map +1 -1
  70. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +1 -1
  71. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -1
  72. package/mcp-server/dist/tools/browser-cheatsheet.js +1 -1
  73. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -1
  74. package/mcp-server/dist/tools/browser-interact.d.ts +1 -1
  75. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -1
  76. package/mcp-server/dist/tools/browser-interact.js +1 -1
  77. package/mcp-server/dist/tools/browser-interact.js.map +1 -1
  78. package/mcp-server/dist/tools/browser-navigate.d.ts +1 -1
  79. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -1
  80. package/mcp-server/dist/tools/browser-navigate.js +1 -1
  81. package/mcp-server/dist/tools/browser-navigate.js.map +1 -1
  82. package/mcp-server/dist/tools/browser-observe.d.ts +1 -1
  83. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -1
  84. package/mcp-server/dist/tools/browser-observe.js +1 -1
  85. package/mcp-server/dist/tools/browser-observe.js.map +1 -1
  86. package/mcp-server/dist/tools/card-tools.d.ts +1 -1
  87. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -1
  88. package/mcp-server/dist/tools/card-tools.js +1 -1
  89. package/mcp-server/dist/tools/card-tools.js.map +1 -1
  90. package/mcp-server/dist/tools/category.d.ts +1 -1
  91. package/mcp-server/dist/tools/category.d.ts.map +1 -1
  92. package/mcp-server/dist/tools/category.js +5 -1
  93. package/mcp-server/dist/tools/category.js.map +1 -1
  94. package/mcp-server/dist/tools/choice.d.ts +1 -1
  95. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  96. package/mcp-server/dist/tools/choice.js +1 -1
  97. package/mcp-server/dist/tools/choice.js.map +1 -1
  98. package/mcp-server/dist/tools/computer.d.ts +1 -1
  99. package/mcp-server/dist/tools/computer.d.ts.map +1 -1
  100. package/mcp-server/dist/tools/computer.js +1 -1
  101. package/mcp-server/dist/tools/computer.js.map +1 -1
  102. package/mcp-server/dist/tools/discord-channel.d.ts +1 -1
  103. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -1
  104. package/mcp-server/dist/tools/discord-channel.js +1 -1
  105. package/mcp-server/dist/tools/discord-channel.js.map +1 -1
  106. package/mcp-server/dist/tools/discord-guild.d.ts +1 -1
  107. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -1
  108. package/mcp-server/dist/tools/discord-guild.js +1 -1
  109. package/mcp-server/dist/tools/discord-guild.js.map +1 -1
  110. package/mcp-server/dist/tools/discord-member.d.ts +1 -1
  111. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -1
  112. package/mcp-server/dist/tools/discord-member.js +1 -1
  113. package/mcp-server/dist/tools/discord-member.js.map +1 -1
  114. package/mcp-server/dist/tools/discord-message.d.ts +1 -1
  115. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -1
  116. package/mcp-server/dist/tools/discord-message.js +1 -1
  117. package/mcp-server/dist/tools/discord-message.js.map +1 -1
  118. package/mcp-server/dist/tools/discord-onboarding.d.ts +1 -1
  119. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -1
  120. package/mcp-server/dist/tools/discord-onboarding.js +1 -1
  121. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -1
  122. package/mcp-server/dist/tools/discord-role.d.ts +1 -1
  123. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -1
  124. package/mcp-server/dist/tools/discord-role.js +1 -1
  125. package/mcp-server/dist/tools/discord-role.js.map +1 -1
  126. package/mcp-server/dist/tools/discord-thread.d.ts +1 -1
  127. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -1
  128. package/mcp-server/dist/tools/discord-thread.js +1 -1
  129. package/mcp-server/dist/tools/discord-thread.js.map +1 -1
  130. package/mcp-server/dist/tools/discord-webhook.d.ts +1 -1
  131. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -1
  132. package/mcp-server/dist/tools/discord-webhook.js +1 -1
  133. package/mcp-server/dist/tools/discord-webhook.js.map +1 -1
  134. package/mcp-server/dist/tools/fb-groups.d.ts +1 -1
  135. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -1
  136. package/mcp-server/dist/tools/fb-groups.js +1 -1
  137. package/mcp-server/dist/tools/fb-groups.js.map +1 -1
  138. package/mcp-server/dist/tools/forget.d.ts +1 -1
  139. package/mcp-server/dist/tools/forget.d.ts.map +1 -1
  140. package/mcp-server/dist/tools/forget.js +1 -1
  141. package/mcp-server/dist/tools/forget.js.map +1 -1
  142. package/mcp-server/dist/tools/git-tools.d.ts +1 -1
  143. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -1
  144. package/mcp-server/dist/tools/git-tools.js +1 -1
  145. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  146. package/mcp-server/dist/tools/gsc/experience.d.ts +1 -1
  147. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -1
  148. package/mcp-server/dist/tools/gsc/experience.js +1 -1
  149. package/mcp-server/dist/tools/gsc/experience.js.map +1 -1
  150. package/mcp-server/dist/tools/gsc/indexing.d.ts +1 -1
  151. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -1
  152. package/mcp-server/dist/tools/gsc/indexing.js +1 -1
  153. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -1
  154. package/mcp-server/dist/tools/gsc/inspect.d.ts +1 -1
  155. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -1
  156. package/mcp-server/dist/tools/gsc/inspect.js +1 -1
  157. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -1
  158. package/mcp-server/dist/tools/gsc/navigate.d.ts +1 -1
  159. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -1
  160. package/mcp-server/dist/tools/gsc/navigate.js +1 -1
  161. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -1
  162. package/mcp-server/dist/tools/gsc/performance.d.ts +1 -1
  163. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -1
  164. package/mcp-server/dist/tools/gsc/performance.js +1 -1
  165. package/mcp-server/dist/tools/gsc/performance.js.map +1 -1
  166. package/mcp-server/dist/tools/gsc/settings.d.ts +1 -1
  167. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -1
  168. package/mcp-server/dist/tools/gsc/settings.js +1 -1
  169. package/mcp-server/dist/tools/gsc/settings.js.map +1 -1
  170. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  171. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -1
  172. package/mcp-server/dist/tools/image-tools.js +1 -1
  173. package/mcp-server/dist/tools/image-tools.js.map +1 -1
  174. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +1 -1
  175. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -1
  176. package/mcp-server/dist/tools/leonardo-browser-tools.js +1 -1
  177. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -1
  178. package/mcp-server/dist/tools/loop.d.ts +1 -1
  179. package/mcp-server/dist/tools/loop.d.ts.map +1 -1
  180. package/mcp-server/dist/tools/loop.js +1 -1
  181. package/mcp-server/dist/tools/loop.js.map +1 -1
  182. package/mcp-server/dist/tools/memories.d.ts +1 -1
  183. package/mcp-server/dist/tools/memories.d.ts.map +1 -1
  184. package/mcp-server/dist/tools/memories.js +1 -1
  185. package/mcp-server/dist/tools/memories.js.map +1 -1
  186. package/mcp-server/dist/tools/morelogin.d.ts +1 -1
  187. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  188. package/mcp-server/dist/tools/morelogin.js +1 -1
  189. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  190. package/mcp-server/dist/tools/profile.d.ts +1 -1
  191. package/mcp-server/dist/tools/profile.d.ts.map +1 -1
  192. package/mcp-server/dist/tools/profile.js +1 -1
  193. package/mcp-server/dist/tools/profile.js.map +1 -1
  194. package/mcp-server/dist/tools/recall.d.ts +1 -1
  195. package/mcp-server/dist/tools/recall.d.ts.map +1 -1
  196. package/mcp-server/dist/tools/recall.js +1 -1
  197. package/mcp-server/dist/tools/recall.js.map +1 -1
  198. package/mcp-server/dist/tools/reflect.d.ts +1 -1
  199. package/mcp-server/dist/tools/reflect.d.ts.map +1 -1
  200. package/mcp-server/dist/tools/reflect.js +1 -1
  201. package/mcp-server/dist/tools/reflect.js.map +1 -1
  202. package/mcp-server/dist/tools/remember.d.ts +1 -1
  203. package/mcp-server/dist/tools/remember.d.ts.map +1 -1
  204. package/mcp-server/dist/tools/remember.js +13 -11
  205. package/mcp-server/dist/tools/remember.js.map +1 -1
  206. package/mcp-server/dist/tools/restore.d.ts +1 -1
  207. package/mcp-server/dist/tools/restore.d.ts.map +1 -1
  208. package/mcp-server/dist/tools/restore.js +1 -1
  209. package/mcp-server/dist/tools/restore.js.map +1 -1
  210. package/mcp-server/dist/tools/style-guide-tools.d.ts +1 -1
  211. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -1
  212. package/mcp-server/dist/tools/style-guide-tools.js +1 -1
  213. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -1
  214. package/mcp-server/dist/tools/sync.d.ts +1 -1
  215. package/mcp-server/dist/tools/sync.d.ts.map +1 -1
  216. package/mcp-server/dist/tools/sync.js +1 -1
  217. package/mcp-server/dist/tools/sync.js.map +1 -1
  218. package/mcp-server/dist/tools/tictactoe-tools.d.ts +1 -1
  219. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -1
  220. package/mcp-server/dist/tools/tictactoe-tools.js +1 -1
  221. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -1
  222. package/mcp-server/dist/tools/utils.d.ts +1 -1
  223. package/mcp-server/dist/tools/utils.d.ts.map +1 -1
  224. package/mcp-server/dist/tools/utils.js +1 -1
  225. package/mcp-server/dist/tools/utils.js.map +1 -1
  226. package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
  227. package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
  228. package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
  229. package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
  230. package/mcp-server/dist/tools/whiteboard-tools.d.ts +3 -3
  231. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  232. package/mcp-server/dist/tools/whiteboard-tools.js +1 -1
  233. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  234. package/mcp-server/dist/tools/youtube/analytics.d.ts +1 -1
  235. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -1
  236. package/mcp-server/dist/tools/youtube/analytics.js +1 -1
  237. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -1
  238. package/mcp-server/dist/tools/youtube/download.d.ts +1 -1
  239. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -1
  240. package/mcp-server/dist/tools/youtube/download.js +1 -1
  241. package/mcp-server/dist/tools/youtube/download.js.map +1 -1
  242. package/mcp-server/dist/tools/youtube/media.d.ts +1 -1
  243. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -1
  244. package/mcp-server/dist/tools/youtube/media.js +1 -1
  245. package/mcp-server/dist/tools/youtube/media.js.map +1 -1
  246. package/mcp-server/dist/tools/youtube/metadata.d.ts +1 -1
  247. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -1
  248. package/mcp-server/dist/tools/youtube/metadata.js +1 -1
  249. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -1
  250. package/mcp-server/dist/tools/youtube/navigate.d.ts +1 -1
  251. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -1
  252. package/mcp-server/dist/tools/youtube/navigate.js +1 -1
  253. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -1
  254. package/mcp-server/dist/tools/youtube/playlist.d.ts +1 -1
  255. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -1
  256. package/mcp-server/dist/tools/youtube/playlist.js +1 -1
  257. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -1
  258. package/mcp-server/dist/tools/youtube/schedule.d.ts +1 -1
  259. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -1
  260. package/mcp-server/dist/tools/youtube/schedule.js +1 -1
  261. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -1
  262. package/mcp-server/dist/tools/youtube/source.d.ts +1 -1
  263. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -1
  264. package/mcp-server/dist/tools/youtube/source.js +1 -1
  265. package/mcp-server/dist/tools/youtube/source.js.map +1 -1
  266. package/mcp-server/dist/tools/youtube/upload.d.ts +1 -1
  267. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -1
  268. package/mcp-server/dist/tools/youtube/upload.js +4 -9
  269. package/mcp-server/dist/tools/youtube/upload.js.map +1 -1
  270. package/mcp-server/dist/tui.js +18 -5
  271. package/mcp-server/dist/tui.js.map +1 -1
  272. package/mcp-server/dist/version.d.ts +5 -0
  273. package/mcp-server/dist/version.d.ts.map +1 -0
  274. package/mcp-server/dist/version.js +21 -0
  275. package/mcp-server/dist/version.js.map +1 -0
  276. package/mcp-server/package-lock.json +3 -3
  277. package/mcp-server/package.json +3 -3
  278. package/mcp-server/run.mjs +15 -9
  279. package/mcp-server/src/http.ts +18 -3
  280. package/mcp-server/src/index.ts +9 -6
  281. package/mcp-server/src/services/browser-bench.ts +1 -1
  282. package/mcp-server/src/services/budget-judgments.ts +183 -0
  283. package/mcp-server/src/services/categories.ts +77 -32
  284. package/mcp-server/src/services/codex-config-heal.ts +35 -4
  285. package/mcp-server/src/services/desktop-bench.ts +1 -1
  286. package/mcp-server/src/services/identity.ts +27 -0
  287. package/mcp-server/src/services/neural-interface.ts +34 -2
  288. package/mcp-server/src/services/typesafe-config.ts +4 -1
  289. package/mcp-server/src/tools/agents.ts +34 -15
  290. package/mcp-server/src/tools/bluesky.ts +1 -1
  291. package/mcp-server/src/tools/browser-advanced.ts +1 -1
  292. package/mcp-server/src/tools/browser-batch.ts +1 -1
  293. package/mcp-server/src/tools/browser-cheatsheet.ts +1 -1
  294. package/mcp-server/src/tools/browser-interact.ts +1 -1
  295. package/mcp-server/src/tools/browser-navigate.ts +1 -1
  296. package/mcp-server/src/tools/browser-observe.ts +1 -1
  297. package/mcp-server/src/tools/card-tools.ts +1 -1
  298. package/mcp-server/src/tools/category.ts +6 -1
  299. package/mcp-server/src/tools/choice.ts +1 -1
  300. package/mcp-server/src/tools/computer.ts +1 -1
  301. package/mcp-server/src/tools/discord-channel.ts +1 -1
  302. package/mcp-server/src/tools/discord-guild.ts +1 -1
  303. package/mcp-server/src/tools/discord-member.ts +1 -1
  304. package/mcp-server/src/tools/discord-message.ts +1 -1
  305. package/mcp-server/src/tools/discord-onboarding.ts +1 -1
  306. package/mcp-server/src/tools/discord-role.ts +1 -1
  307. package/mcp-server/src/tools/discord-thread.ts +1 -1
  308. package/mcp-server/src/tools/discord-webhook.ts +1 -1
  309. package/mcp-server/src/tools/fb-groups.ts +1 -1
  310. package/mcp-server/src/tools/forget.ts +1 -1
  311. package/mcp-server/src/tools/git-tools.ts +1 -1
  312. package/mcp-server/src/tools/gsc/experience.ts +1 -1
  313. package/mcp-server/src/tools/gsc/indexing.ts +1 -1
  314. package/mcp-server/src/tools/gsc/inspect.ts +1 -1
  315. package/mcp-server/src/tools/gsc/navigate.ts +1 -1
  316. package/mcp-server/src/tools/gsc/performance.ts +1 -1
  317. package/mcp-server/src/tools/gsc/settings.ts +1 -1
  318. package/mcp-server/src/tools/image-tools.ts +1 -1
  319. package/mcp-server/src/tools/leonardo-browser-tools.ts +1 -1
  320. package/mcp-server/src/tools/loop.ts +1 -1
  321. package/mcp-server/src/tools/memories.ts +1 -1
  322. package/mcp-server/src/tools/morelogin.ts +1 -1
  323. package/mcp-server/src/tools/profile.ts +1 -1
  324. package/mcp-server/src/tools/recall.ts +1 -1
  325. package/mcp-server/src/tools/reflect.ts +1 -1
  326. package/mcp-server/src/tools/remember.ts +13 -12
  327. package/mcp-server/src/tools/restore.ts +1 -1
  328. package/mcp-server/src/tools/style-guide-tools.ts +1 -1
  329. package/mcp-server/src/tools/sync.ts +1 -1
  330. package/mcp-server/src/tools/tictactoe-tools.ts +1 -1
  331. package/mcp-server/src/tools/utils.ts +1 -1
  332. package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
  333. package/mcp-server/src/tools/whiteboard-tools.ts +1 -1
  334. package/mcp-server/src/tools/youtube/analytics.ts +1 -1
  335. package/mcp-server/src/tools/youtube/download.ts +1 -1
  336. package/mcp-server/src/tools/youtube/media.ts +1 -1
  337. package/mcp-server/src/tools/youtube/metadata.ts +1 -1
  338. package/mcp-server/src/tools/youtube/navigate.ts +1 -1
  339. package/mcp-server/src/tools/youtube/playlist.ts +1 -1
  340. package/mcp-server/src/tools/youtube/schedule.ts +1 -1
  341. package/mcp-server/src/tools/youtube/source.ts +1 -1
  342. package/mcp-server/src/tools/youtube/upload.ts +4 -12
  343. package/mcp-server/src/tui.ts +24 -10
  344. package/mcp-server/src/version.ts +22 -0
  345. package/neural-interface/i18n/en.json +645 -57
  346. package/neural-interface/i18n/pt-BR.json +644 -56
  347. package/neural-interface/lib/account-usage.js +163 -0
  348. package/neural-interface/lib/agent-sandbox-elevation.js +102 -0
  349. package/neural-interface/lib/agent-sandbox-setting.js +57 -0
  350. package/neural-interface/lib/assistant-api.js +274 -52
  351. package/neural-interface/lib/assistant-brains/claude.js +15 -2
  352. package/neural-interface/lib/assistant-brains/codex.js +3 -0
  353. package/neural-interface/lib/assistant-brains/opencode.js +17 -4
  354. package/neural-interface/lib/assistant-budget-planner.js +390 -0
  355. package/neural-interface/lib/assistant-budget-split.js +408 -0
  356. package/neural-interface/lib/assistant-budget.js +94 -95
  357. package/neural-interface/lib/assistant-config.js +62 -14
  358. package/neural-interface/lib/assistant-dispatch.js +432 -125
  359. package/neural-interface/lib/assistant-jev.js +26 -3
  360. package/neural-interface/lib/assistant-persona.js +68 -11
  361. package/neural-interface/lib/assistant-plan-permissions.js +8 -1
  362. package/neural-interface/lib/assistant-route-accounts.js +14 -0
  363. package/neural-interface/lib/assistant-route-gate-codex.js +3 -1
  364. package/neural-interface/lib/assistant-route-gate.js +19 -3
  365. package/neural-interface/lib/assistant-router.js +373 -42
  366. package/neural-interface/lib/assistant-runtime.js +312 -48
  367. package/neural-interface/lib/assistant-user-writer.js +4 -2
  368. package/neural-interface/lib/augmented-path.js +317 -53
  369. package/neural-interface/lib/claude-accounts.js +342 -31
  370. package/neural-interface/lib/claude-agent-bridge.js +90 -3
  371. package/neural-interface/lib/claude-executable.js +6 -1
  372. package/neural-interface/lib/claude-model-catalog.js +3 -3
  373. package/neural-interface/lib/claude-panel-auth.js +221 -0
  374. package/neural-interface/lib/claude-profile-api-key.js +62 -0
  375. package/neural-interface/lib/cli-install-api.js +137 -0
  376. package/neural-interface/lib/cli-install.js +797 -0
  377. package/neural-interface/lib/cli-path.js +130 -0
  378. package/neural-interface/lib/cli-resolver.js +744 -0
  379. package/neural-interface/lib/cli-update-planner.js +143 -7
  380. package/neural-interface/lib/codex-account-auth.js +180 -0
  381. package/neural-interface/lib/codex-accounts.js +502 -0
  382. package/neural-interface/lib/codex-capabilities.js +2 -1
  383. package/neural-interface/lib/codex-compat-rpc.js +8 -2
  384. package/neural-interface/lib/codex-mcp-approvals.js +5 -1
  385. package/neural-interface/lib/codex-panel-auth.js +62 -0
  386. package/neural-interface/lib/codex-session-settings.js +1 -1
  387. package/neural-interface/lib/codex-settings-schema.js +122 -0
  388. package/neural-interface/lib/desktop/config.js +3 -0
  389. package/neural-interface/lib/exec-loop-command.js +3 -1
  390. package/neural-interface/lib/git-bash/bzip2.js +339 -0
  391. package/neural-interface/lib/git-bash/claude-settings.js +73 -0
  392. package/neural-interface/lib/git-bash/extract-worker.js +34 -0
  393. package/neural-interface/lib/git-bash/install.js +529 -0
  394. package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
  395. package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
  396. package/neural-interface/lib/git-bash/manager.js +268 -0
  397. package/neural-interface/lib/git-bash/pins.js +206 -0
  398. package/neural-interface/lib/git-bash/pins.json +34 -0
  399. package/neural-interface/lib/git-bash/resolver.js +194 -0
  400. package/neural-interface/lib/git-read.js +34 -2
  401. package/neural-interface/lib/install-details.js +163 -0
  402. package/neural-interface/lib/mcp-installer.js +14 -2
  403. package/neural-interface/lib/native-loop-providers.js +22 -4
  404. package/neural-interface/lib/native-loop-runtime.js +9 -4
  405. package/neural-interface/lib/os-path.js +319 -0
  406. package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
  407. package/neural-interface/lib/provider-panel-terminal-auth.js +96 -0
  408. package/neural-interface/lib/pty-host/core.js +2 -1
  409. package/neural-interface/lib/pty-host/manager.js +27 -2
  410. package/neural-interface/lib/remote-policy.js +20 -11
  411. package/neural-interface/lib/session-indexer.js +3 -1
  412. package/neural-interface/lib/session-title-generator.js +6 -3
  413. package/neural-interface/lib/system-about.js +340 -0
  414. package/neural-interface/lib/system-activity.js +66 -0
  415. package/neural-interface/lib/terminal-env.js +11 -3
  416. package/neural-interface/lib/terminal-path.js +55 -0
  417. package/neural-interface/lib/virtual-socket.js +12 -1
  418. package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
  419. package/neural-interface/lib/whatsapp/bridge.js +78 -34
  420. package/neural-interface/lib/whatsapp/commands.js +13 -14
  421. package/neural-interface/lib/whatsapp/config.js +134 -20
  422. package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
  423. package/neural-interface/lib/whatsapp/host-core.js +168 -35
  424. package/neural-interface/lib/whatsapp/inbound.js +5 -3
  425. package/neural-interface/lib/whatsapp/local-file.js +524 -0
  426. package/neural-interface/lib/whatsapp/manager.js +92 -32
  427. package/neural-interface/lib/whatsapp/paths.js +11 -1
  428. package/neural-interface/lib/whatsapp/protocol.js +65 -5
  429. package/neural-interface/lib/whatsapp/redact.js +63 -0
  430. package/neural-interface/lib/whatsapp/service.js +343 -91
  431. package/neural-interface/lib/whatsapp/transcription.js +463 -0
  432. package/neural-interface/package-lock.json +2 -2
  433. package/neural-interface/package.json +1 -1
  434. package/neural-interface/public/index.html +2 -0
  435. package/neural-interface/public/index2d.html +2 -0
  436. package/neural-interface/public/offline.html +16 -1
  437. package/neural-interface/public/onboarding.html +96 -2
  438. package/neural-interface/public/shared/account-i18n.js +7 -0
  439. package/neural-interface/public/shared/account-menu.js +542 -0
  440. package/neural-interface/public/shared/account-usage.js +79 -0
  441. package/neural-interface/public/shared/account-view.js +336 -0
  442. package/neural-interface/public/shared/agent-runtime-options.js +28 -8
  443. package/neural-interface/public/shared/assistant/asst-account-menu.js +298 -0
  444. package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
  445. package/neural-interface/public/shared/assistant/asst-api.js +39 -2
  446. package/neural-interface/public/shared/assistant/asst-brain-picker.js +288 -32
  447. package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
  448. package/neural-interface/public/shared/assistant/asst-mascot.js +126 -7
  449. package/neural-interface/public/shared/assistant/asst-menu.js +219 -80
  450. package/neural-interface/public/shared/assistant/asst-model-chip.js +135 -0
  451. package/neural-interface/public/shared/assistant/asst-panel.js +87 -16
  452. package/neural-interface/public/shared/assistant/asst-render.js +38 -7
  453. package/neural-interface/public/shared/assistant/asst-route.js +72 -14
  454. package/neural-interface/public/shared/assistant/asst-routes-editor.js +45 -6
  455. package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
  456. package/neural-interface/public/shared/assistant/asst-state.js +1 -1
  457. package/neural-interface/public/shared/assistant/asst-styles.js +160 -29
  458. package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
  459. package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
  460. package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
  461. package/neural-interface/public/shared/cdx/cdx-panel.js +49 -108
  462. package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
  463. package/neural-interface/public/shared/cdx/cdx-styles.js +172 -111
  464. package/neural-interface/public/shared/cdx/cdx-tabs.js +264 -664
  465. package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
  466. package/neural-interface/public/shared/claude-account-view.js +3 -0
  467. package/neural-interface/public/shared/cli-install-view.js +392 -0
  468. package/neural-interface/public/shared/cli-status.js +282 -22
  469. package/neural-interface/public/shared/cp/cp-events.js +2 -1
  470. package/neural-interface/public/shared/cp/cp-styles.js +46 -0
  471. package/neural-interface/public/shared/desktop-bridge.js +39 -0
  472. package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
  473. package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
  474. package/neural-interface/public/shared/desktop-titlebar.js +153 -0
  475. package/neural-interface/public/shared/desktop-update-view.js +462 -0
  476. package/neural-interface/public/shared/editor/editor-panel.js +1 -1
  477. package/neural-interface/public/shared/explorer/fx-main.js +1 -1
  478. package/neural-interface/public/shared/git-bash-view.js +145 -0
  479. package/neural-interface/public/shared/html-shell.js +1 -0
  480. package/neural-interface/public/shared/i18n.js +19 -1
  481. package/neural-interface/public/shared/install-details-view.js +86 -0
  482. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -1
  483. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +36 -1
  484. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +17 -0
  485. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +169 -2
  486. package/neural-interface/public/shared/pwa-install-page.js +3 -1
  487. package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
  488. package/neural-interface/public/shared/settings/settings-about.js +254 -0
  489. package/neural-interface/public/shared/settings/settings-ia.js +15 -0
  490. package/neural-interface/public/shared/showcase-privacy.js +490 -0
  491. package/neural-interface/public/shared/storage.js +30 -3
  492. package/neural-interface/public/shared/styles.css +281 -32
  493. package/neural-interface/public/shared/synabun-mascot.js +48 -2
  494. package/neural-interface/public/shared/ui-claude-panel.js +262 -217
  495. package/neural-interface/public/shared/ui-cli-banner.js +355 -0
  496. package/neural-interface/public/shared/ui-explorer.js +2 -0
  497. package/neural-interface/public/shared/ui-git-bash.js +124 -0
  498. package/neural-interface/public/shared/ui-judgments.js +10 -1
  499. package/neural-interface/public/shared/ui-loading.js +30 -6
  500. package/neural-interface/public/shared/ui-menubar.js +13 -3
  501. package/neural-interface/public/shared/ui-navbar.js +3 -1
  502. package/neural-interface/public/shared/ui-provider-auth.js +104 -0
  503. package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
  504. package/neural-interface/public/shared/ui-sessions.js +9 -3
  505. package/neural-interface/public/shared/ui-settings.js +55 -3
  506. package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
  507. package/neural-interface/public/shared/ui-sync.js +8 -0
  508. package/neural-interface/public/shared/ui-terminal.js +17 -0
  509. package/neural-interface/public/shared/ui-tool-updates.js +5 -0
  510. package/neural-interface/public/shared/ui-update.js +598 -7
  511. package/neural-interface/public/shared/ui-whatsapp.js +21 -6
  512. package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
  513. package/neural-interface/public/shared/worker-end.js +2 -0
  514. package/neural-interface/public/sw.js +1 -1
  515. package/neural-interface/public/variant/2d/main.js +10 -1
  516. package/neural-interface/public/variant/3d/main.js +10 -1
  517. package/neural-interface/scripts/rebuild-pty.js +14 -2
  518. package/neural-interface/server.js +1384 -679
  519. package/npm-shrinkwrap.json +4424 -0
  520. package/package.json +57 -2
  521. package/postinstall.js +61 -47
  522. package/preuninstall.js +8 -35
  523. package/setup.js +80 -47
  524. package/skills/synabun/modules/idea.md +1 -1
  525. package/skills/synabun/modules/schedule.md +1 -1
  526. package/updater.cmd +2 -2
  527. package/updater.mjs +97 -3
@@ -146,17 +146,19 @@
146
146
  height: var(--fs-locked-height);
147
147
  }
148
148
 
149
- /* ── Window Controls Overlay (PWA standalone on macOS / Windows / Linux) ──
149
+ /* ── Window Controls Overlay (PWA standalone on macOS / Windows / Linux, and the SynaBun desktop app) ──
150
150
  Uses body.wco-active (toggled by JS via navigator.windowControlsOverlay)
151
- for higher specificity than base #title-bar rules.
151
+ for higher specificity than base #title-bar rules. The --desktop-titlebar-*
152
+ variables stand in for the env() ones only inside the desktop app when its
153
+ window has no overlay API (desktop-titlebar.js); the PWA never sets them.
152
154
  ── */
153
155
  body.wco-active #title-bar {
154
156
  -webkit-app-region: drag;
155
- padding-left: calc(env(titlebar-area-x, 0px) + 10px);
156
- padding-right: max(18px, calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, 100vw) + 10px));
157
+ padding-left: calc(env(titlebar-area-x, var(--desktop-titlebar-x, 0px)) + 10px);
158
+ padding-right: max(18px, calc(100vw - env(titlebar-area-x, var(--desktop-titlebar-x, 0px)) - env(titlebar-area-width, var(--desktop-titlebar-width, 100vw)) + 10px));
157
159
  padding-top: 0;
158
160
  padding-bottom: 0;
159
- height: env(titlebar-area-height, 48px);
161
+ height: env(titlebar-area-height, var(--desktop-titlebar-height, 48px));
160
162
  transition: padding 0.2s ease;
161
163
  }
162
164
  body.wco-active #title-bar button,
@@ -167,7 +169,9 @@
167
169
  body.wco-active #title-bar .bar-right {
168
170
  -webkit-app-region: no-drag;
169
171
  }
170
- body.wco-active #title-bar .bar-right {
172
+ /* The installed PWA's overlay is thinner than the toolbar's pill: the pill's glass goes. The desktop app's bar is
173
+ the pill's height and keeps it (below). */
174
+ html:not(.desktop-titlebar) body.wco-active #title-bar .bar-right {
171
175
  background: transparent;
172
176
  backdrop-filter: none;
173
177
  -webkit-backdrop-filter: none;
@@ -178,6 +182,19 @@
178
182
  transform: translateY(1px);
179
183
  }
180
184
 
185
+ /* ── The SynaBun desktop app (packaging/desktop): this bar is the window's title bar ──
186
+ html.desktop-titlebar comes from desktop-titlebar.js, only inside the app's main window, which also toggles
187
+ body.wco-active (off in full screen, where the system hides its buttons). Whatever in the bar takes a click
188
+ stays out of the drag region; the empty parts drag the window, and the system maximizes and restores it on
189
+ a double-click. While something is drawn over the bar (a dialog, the tour), the bar drags nothing, so that
190
+ thing gets its clicks. Windows and Linux: the app's menu opens from .desktop-app-menu-btn (a .bar-icon). */
191
+ html.desktop-titlebar body.wco-active #title-bar :is(#titlebar-logo, #search-container, select, label, [role="button"], [tabindex]:not([tabindex="-1"])) {
192
+ -webkit-app-region: no-drag;
193
+ }
194
+ html.desktop-titlebar body.wco-active.desktop-titlebar-covered #title-bar {
195
+ -webkit-app-region: no-drag;
196
+ }
197
+
181
198
  ::-webkit-scrollbar { width: 6px; }
182
199
  ::-webkit-scrollbar-track { background: rgba(255,255,255,0.03); }
183
200
  ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.15); border-radius: 3px; }
@@ -1474,19 +1491,32 @@
1474
1491
  z-index: 1;
1475
1492
  }
1476
1493
 
1494
+ /* The memory search: a slot of its own between the menubar and the pill, centred in what the menu leaves (its auto
1495
+ margins) and up to 340px of it. It never lies under the menu, whatever the labels' language or the window's
1496
+ width: where the space runs short it shrinks, and below 200px the field is a search icon that opens over the
1497
+ menu while it has the focus ("SEARCH BAR"). Its box is the field's width only, so the empty bar beside it still
1498
+ drags the desktop app's window. With the visualization off it takes no room at all. */
1477
1499
  #title-bar .bar-center {
1478
- position: absolute;
1479
- left: 50%;
1480
- transform: translateX(-50%);
1481
- width: max-content;
1482
- max-width: calc(100% - 360px);
1500
+ position: relative;
1501
+ flex: 0 1 340px;
1502
+ min-width: 30px;
1503
+ margin-inline: auto;
1504
+ container-type: inline-size;
1483
1505
  display: flex;
1484
1506
  align-items: center;
1485
1507
  justify-content: center;
1486
- gap: 8px;
1487
- min-width: 0;
1488
1508
  pointer-events: auto;
1489
1509
  }
1510
+ #title-bar .bar-center:has(> #search-wrapper.viz-hidden) {
1511
+ flex-basis: 0;
1512
+ min-width: 0;
1513
+ }
1514
+ #title-bar .bar-center:focus-within {
1515
+ z-index: 2; /* the opened field draws over the menubar (.bar-left, z-index 1) */
1516
+ }
1517
+ #title-bar .bar-center + .bar-right {
1518
+ margin-left: 0; /* the slot's auto margins push the pill to the right edge */
1519
+ }
1490
1520
 
1491
1521
  /* ── Unified frosted glass pill ── */
1492
1522
  #title-bar .bar-right {
@@ -5105,6 +5135,54 @@
5105
5135
  vertical-align: -2px;
5106
5136
  margin-right: 6px;
5107
5137
  }
5138
+ /* Inside the desktop app (ui-update.js openDesktopUpdateModal): the release notes, written as text, and the
5139
+ download's progress. The surfaces and the green of the rest of this dialog. */
5140
+ .update-notes-label {
5141
+ font-size: 11px;
5142
+ color: var(--t-muted);
5143
+ margin: 4px 0 6px;
5144
+ }
5145
+ .update-notes {
5146
+ max-height: 168px;
5147
+ overflow: auto;
5148
+ white-space: pre-wrap;
5149
+ overflow-wrap: anywhere;
5150
+ background: rgba(0,0,0,0.35);
5151
+ border: 1px solid rgba(255,255,255,0.06);
5152
+ border-radius: var(--r-card);
5153
+ padding: 10px 14px;
5154
+ font-size: 12px;
5155
+ line-height: 1.5;
5156
+ color: var(--t-secondary);
5157
+ }
5158
+ .update-notes:focus-visible {
5159
+ outline: 2px solid var(--stg-focus, #93c5fd);
5160
+ outline-offset: 2px;
5161
+ }
5162
+ .update-progress {
5163
+ height: 6px;
5164
+ margin: 16px 0 8px;
5165
+ border-radius: 999px;
5166
+ background: rgba(255,255,255,0.12);
5167
+ overflow: hidden;
5168
+ }
5169
+ .update-progress-bar {
5170
+ height: 100%;
5171
+ border-radius: inherit;
5172
+ background: #34c759;
5173
+ transition: width 0.2s ease;
5174
+ }
5175
+ /* The size is not known: the bar is full and quiet, the words say how much came. */
5176
+ .update-progress-bar--unknown { opacity: 0.45; }
5177
+ .update-progress-text {
5178
+ font-family: var(--ff-mono);
5179
+ font-size: 11px;
5180
+ font-variant-numeric: tabular-nums;
5181
+ color: var(--t-muted);
5182
+ }
5183
+ @media (prefers-reduced-motion: reduce) {
5184
+ .update-progress-bar { transition: none; }
5185
+ }
5108
5186
  .tag-delete-overlay.closing {
5109
5187
  opacity: 0;
5110
5188
  transition: opacity 0.15s ease;
@@ -7112,25 +7190,22 @@
7112
7190
  /* ═══════════════════════════════════════════
7113
7191
  SEARCH BAR (inline in top bar)
7114
7192
  ═══════════════════════════════════════════ */
7115
- #search-container {
7116
- display: contents;
7117
- }
7118
-
7193
+ /* #search-container is the navbar slot (#title-bar .bar-center, "TOP MENU BAR"); the field fills it up to 340px. */
7119
7194
  #search-wrapper {
7120
7195
  position: relative;
7121
7196
  width: 340px;
7122
- max-width: 40vw;
7197
+ max-width: 100%;
7123
7198
  border-radius: 8px;
7124
7199
  padding: 1px;
7125
- background: rgba(255,255,255,0.06);
7200
+ background: var(--s-light); /* the 1px edge around the field */
7126
7201
  overflow: hidden;
7127
7202
  opacity: 1;
7128
7203
  transition: width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
7129
7204
  max-width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
7130
7205
  padding 0.35s cubic-bezier(0.4, 0, 0.2, 1),
7131
7206
  opacity 0.25s ease,
7132
- background 0.3s,
7133
- box-shadow 0.3s;
7207
+ background 0.2s ease,
7208
+ box-shadow 0.2s ease;
7134
7209
  }
7135
7210
 
7136
7211
  #search-wrapper.viz-hidden {
@@ -7141,36 +7216,88 @@
7141
7216
  pointer-events: none;
7142
7217
  }
7143
7218
 
7219
+ #search-wrapper:hover {
7220
+ background: var(--s-medium);
7221
+ }
7222
+
7144
7223
  #search-wrapper.focused {
7145
- background: rgba(255, 255, 255, 0.12);
7146
- box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 0 12px rgba(255, 255, 255, 0.04);
7147
- animation: searchGlow 2.5s ease-in-out infinite;
7224
+ background: var(--b-hover);
7225
+ box-shadow: 0 0 0 3px var(--s-subtle);
7148
7226
  }
7149
7227
 
7150
- @keyframes searchGlow {
7151
- 0%, 100% { box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1), 0 0 12px rgba(255, 255, 255, 0.04); }
7152
- 50% { box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.18), 0 0 16px rgba(255, 255, 255, 0.07); }
7228
+ #search-wrapper .search-icon {
7229
+ position: absolute;
7230
+ left: 9px;
7231
+ top: 50%;
7232
+ width: 13px;
7233
+ height: 13px;
7234
+ transform: translateY(-50%);
7235
+ color: var(--t-secondary);
7236
+ pointer-events: none;
7237
+ transition: color 0.2s ease;
7153
7238
  }
7239
+ #search-wrapper:hover .search-icon { color: var(--t-primary); }
7240
+ #search-wrapper.focused .search-icon { color: var(--t-bright); }
7154
7241
 
7155
7242
  #search-input {
7156
7243
  width: 100%;
7157
- padding: 6px 36px 6px 12px;
7244
+ padding: 6px 36px 6px 30px;
7158
7245
  background: rgba(28, 28, 30, 0.7);
7159
7246
  border: none;
7160
7247
  border-radius: 7px;
7161
- color: rgba(255, 255, 255, 0.9);
7248
+ color: var(--t-bright);
7249
+ font-family: inherit;
7162
7250
  font-size: 12px;
7163
7251
  font-weight: 400;
7164
7252
  outline: none;
7165
7253
  letter-spacing: 0.01em;
7254
+ text-overflow: ellipsis;
7166
7255
  }
7167
7256
 
7168
7257
  #search-input::placeholder {
7169
- color: rgba(255,255,255,0.2);
7170
- letter-spacing: 0.04em;
7258
+ color: var(--t-secondary);
7259
+ letter-spacing: 0.01em;
7171
7260
  font-weight: 400;
7172
7261
  }
7173
7262
 
7263
+ /* ── Not enough room in the bar: a search icon, opened over the menubar while it has the focus ── */
7264
+ @container (max-width: 199px) {
7265
+ #search-wrapper {
7266
+ width: 30px;
7267
+ transition: opacity 0.25s ease, background 0.2s ease, box-shadow 0.2s ease; /* opens and closes at once */
7268
+ }
7269
+ #search-wrapper:not(:focus-within) #search-input {
7270
+ padding-right: 0;
7271
+ color: transparent;
7272
+ cursor: pointer;
7273
+ }
7274
+ #search-wrapper:not(:focus-within) #search-input::placeholder {
7275
+ color: transparent;
7276
+ }
7277
+ #search-wrapper:not(:focus-within) :is(#search-badge, #search-clear) {
7278
+ visibility: hidden; /* ui-search.js shows and hides them with inline display */
7279
+ }
7280
+ /* A search is on: the icon says so. */
7281
+ #search-wrapper:not(:focus-within):has(#search-input:not(:placeholder-shown)) {
7282
+ background: var(--b-visible);
7283
+ }
7284
+ #search-wrapper:not(:focus-within):has(#search-input:not(:placeholder-shown)) .search-icon {
7285
+ color: var(--t-bright);
7286
+ }
7287
+ #search-wrapper:focus-within:not(.viz-hidden) {
7288
+ position: absolute;
7289
+ right: 0;
7290
+ top: 50%;
7291
+ transform: translateY(-50%);
7292
+ width: min(340px, 60vw);
7293
+ max-width: none;
7294
+ box-shadow: 0 0 0 3px var(--s-subtle), var(--shadow-md);
7295
+ }
7296
+ #search-wrapper:focus-within:not(.viz-hidden) #search-input {
7297
+ background: rgb(28, 28, 30); /* opaque: the menu labels under it don't show through */
7298
+ }
7299
+ }
7300
+
7174
7301
  #search-badge {
7175
7302
  position: absolute;
7176
7303
  right: 8px;
@@ -15649,6 +15776,102 @@
15649
15776
  .settings-nav-item[data-tab="notifications"] { --stg-tile: #bd5a52; }
15650
15777
  .settings-nav-item[data-tab="appearance"] { --stg-tile: #6c717a; }
15651
15778
  /* <<< settings-redesign:nav-polish */
15779
+ /* >>> settings-redesign:spacing */
15780
+ /* ═══════════════════════════════════════════
15781
+ SETTINGS — room between the rows of the right column, on every page
15782
+ The elegance pass packed the rows at 8px. This loosens the whole rhythm one step and touches no size, weight or wiring:
15783
+ the row padding is the one lever (--stg-row-y), the gaps around it keep their proportions.
15784
+ Scoped to the settings panel; the command runner and the style guide keep the elegance values.
15785
+ ═══════════════════════════════════════════ */
15786
+ .settings-panel { --stg-row-y: 13px; }
15787
+ /* page head, product headings, sections */
15788
+ .stg-page-head { margin-bottom: 26px; }
15789
+ .settings-panel .stg-pane-title { margin: 32px 0 14px; }
15790
+ .settings-panel .stg-card { margin-bottom: 22px; }
15791
+ .settings-panel .stg-card.stg-acc[data-collapsible] { margin-bottom: 14px; }
15792
+ .settings-panel .stg-card.stg-acc[data-collapsible] > .stg-card-head { min-height: 44px; padding-top: 10px; padding-bottom: 10px; }
15793
+ /* what a group holds that is not a row of its own (a note, a list, a preview) */
15794
+ .settings-panel .stg-card-body > * { margin-top: 14px; margin-bottom: 14px; }
15795
+ /* a row that opens (an assistant, a model) was fixed at 7px */
15796
+ .settings-panel .stg-card-body > .stg-card[data-collapsible] { padding-top: var(--stg-row-y); padding-bottom: var(--stg-row-y); }
15797
+ /* the Browser fields kept a margin of their own under the row, which doubled the gap next to the row padding */
15798
+ .settings-panel .stg-card-body > .stg-field.bc-card-row { margin-bottom: 0; }
15799
+ /* label, control, help */
15800
+ .settings-panel .stg-field > label { margin-bottom: 8px; }
15801
+ .settings-panel .stg-help { margin-top: 5px; }
15802
+ .settings-panel .stg-toggle-text .stg-help { margin-top: 4px; }
15803
+ /* <<< settings-redesign:spacing */
15804
+ /* >>> settings-about */
15805
+ /* Settings → About (shared/settings/settings-about-pane.js): the header (icon, name, version, the two buttons),
15806
+ the links, the facts of System and the dependency lists. Text weight and the panel's --stg-* roles; every row
15807
+ wraps instead of widening the panel, down to the 320px panel. Its tile is the palette's neutral graphite. */
15808
+ .settings-nav-item[data-tab="about"] { --stg-tile: #6b7078; }
15809
+ .settings-panel .stg-about-hero {
15810
+ display: flex; flex-direction: column; align-items: center; text-align: center;
15811
+ margin: 0 0 18px; padding: 20px 16px 16px; border-radius: 9px; background: var(--stg-group);
15812
+ }
15813
+ .settings-panel .stg-about-hero [hidden] { display: none; }
15814
+ .settings-panel .stg-about-logo { display: block; width: 64px; height: 64px; margin: 0 0 10px; border-radius: 14px; box-shadow: 0 1px 3px rgba(0,0,0,0.35); }
15815
+ .settings-panel .stg-about-name { margin: 0; font-size: 20px; font-weight: 600; line-height: 1.25; color: var(--stg-text); }
15816
+ .settings-panel .stg-about-version { margin: 2px 0 0; font-size: 12.5px; color: var(--stg-body); }
15817
+ .settings-panel .stg-about-line { margin: 2px 0 0; max-width: 52ch; font-size: 12px; color: var(--stg-help); overflow-wrap: anywhere; }
15818
+ .settings-panel .stg-about-desc { margin-top: 8px; }
15819
+ .settings-panel .stg-about-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin: 14px 0 0; }
15820
+ .settings-panel .stg-about-note { max-width: 52ch; margin: 10px 0 0; }
15821
+
15822
+ /* Links: the name on the left, the address on the right; the address gives way first */
15823
+ .settings-panel .stg-about-links { margin: 0; padding: 0; list-style: none; }
15824
+ .settings-panel .stg-about-links > li + li { border-top: 1px solid var(--stg-sep); }
15825
+ .settings-panel .stg-about-link { display: flex; align-items: center; gap: 10px; min-height: 32px; padding: 6px 0; box-sizing: border-box; font-size: 13px; color: var(--stg-text); text-decoration: none; }
15826
+ .settings-panel .stg-about-link:hover .stg-about-link-label { color: var(--stg-link); }
15827
+ .settings-panel .stg-about-link:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 4px; }
15828
+ .settings-panel .stg-about-link-label { flex: 0 0 auto; }
15829
+ .settings-panel .stg-about-link-url { flex: 1 1 auto; min-width: 0; overflow: hidden; text-align: right; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--stg-help); }
15830
+ .settings-panel .stg-about-arrow { flex: 0 0 auto; width: 10px; height: 10px; fill: none; stroke: var(--stg-help); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
15831
+
15832
+ /* System: label and value on one row; a long value (the data folder) wraps under its label */
15833
+ .settings-panel .stg-about-facts { margin: 0; }
15834
+ .settings-panel .stg-about-fact { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 2px 16px; min-height: 32px; padding: 7px 0; box-sizing: border-box; }
15835
+ .settings-panel .stg-about-fact + .stg-about-fact { border-top: 1px solid var(--stg-sep); }
15836
+ .settings-panel .stg-about-fact dt { flex: 0 0 auto; font-size: 13px; color: var(--stg-text); }
15837
+ .settings-panel .stg-about-fact dd { flex: 1 1 12em; min-width: 0; margin: 0; text-align: right; font-size: 12.5px; color: var(--stg-body); overflow-wrap: anywhere; user-select: text; }
15838
+ .settings-panel .stg-about-fact dd.stg-about-mono { font-family: var(--stg-mono); font-size: 12px; }
15839
+ .settings-panel .stg-about-empty { margin: 8px 0; list-style: none; }
15840
+
15841
+ /* Dependencies: a heading per package, then one row per dependency: name, version, then range and license,
15842
+ which move under the name when the row is narrow */
15843
+ .settings-panel .stg-about-filter { display: flex; }
15844
+ .settings-panel .stg-about-filter[hidden] { display: none; }
15845
+ .settings-panel .settings-content .stg-about-filter-input { width: 100%; max-width: 240px; }
15846
+ .settings-panel .stg-about-group + .stg-about-group,
15847
+ .settings-panel .stg-about-bundled { margin-top: 12px; }
15848
+ .settings-panel .stg-card-body .stg-about-group-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; min-height: 0; margin: 0; padding: 8px 0 4px; font-size: 13px; color: var(--stg-text); }
15849
+ .settings-panel .stg-about-group-sub { min-width: 0; overflow-wrap: anywhere; font-family: var(--stg-mono); font-size: 11.5px; font-weight: 400; color: var(--stg-help); }
15850
+ .settings-panel .stg-about-count { margin-left: auto; font-size: 12px; font-weight: 400; color: var(--stg-help); font-variant-numeric: tabular-nums; }
15851
+ .settings-panel .stg-about-group-note { margin: 0 0 4px; }
15852
+ .settings-panel .stg-about-dep-list { margin: 0; padding: 0; list-style: none; }
15853
+ .settings-panel .stg-about-dep { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 10px; padding: 5px 0; border-top: 1px solid var(--stg-sep); font-size: 12.5px; }
15854
+ .settings-panel .stg-about-dep-name { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; color: var(--stg-text); text-decoration: none; }
15855
+ .settings-panel a.stg-about-dep-name:hover { color: var(--stg-link); text-decoration: underline; }
15856
+ .settings-panel a.stg-about-dep-name:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 3px; }
15857
+ .settings-panel .stg-about-dep-version { flex: 0 0 auto; font-family: var(--stg-mono); font-size: 12px; color: var(--stg-body); font-variant-numeric: tabular-nums; }
15858
+ .settings-panel .stg-about-dep-version[data-state="missing"] { color: var(--stg-warn); }
15859
+ .settings-panel .stg-about-dep-meta { flex: 1 0 100%; min-width: 0; overflow-wrap: anywhere; font-size: 11.5px; color: var(--stg-help); }
15860
+ .settings-panel .stg-about-dev { margin-top: 12px; }
15861
+
15862
+ /* The foot of the page: the license and the copyright, quiet and centred */
15863
+ .settings-panel .stg-about-footer { margin: 8px 0 4px; text-align: center; font-size: 11.5px; color: var(--stg-help); }
15864
+ .settings-panel .stg-about-footer p { margin: 2px 0; }
15865
+ .settings-panel .stg-about-builtwith { margin: 0; padding: 0; border: 0; background: none; font: inherit; color: var(--stg-link); cursor: pointer; }
15866
+ .settings-panel .stg-about-builtwith:hover { text-decoration: underline; }
15867
+ .settings-panel .stg-about-builtwith:focus-visible { outline: 2px solid var(--stg-focus); outline-offset: 2px; border-radius: 3px; }
15868
+ @container stg (max-width: 480px) {
15869
+ .settings-panel .stg-about-hero { padding: 16px 12px 14px; }
15870
+ .settings-panel .stg-about-link-url { display: none; }
15871
+ .settings-panel .stg-about-arrow { margin-left: auto; }
15872
+ .settings-panel .stg-about-fact dd { text-align: left; flex-basis: 100%; }
15873
+ }
15874
+ /* <<< settings-about */
15652
15875
  .tag-add-input {
15653
15876
  font-size: var(--fs-sm);
15654
15877
  font-weight: 500;
@@ -26504,7 +26727,9 @@
26504
26727
  body .term-float-tab.term-float-tab > .term-float-tab-header .term-float-tab-title { font-size: var(--fs-xs); }
26505
26728
  body :is(.sched-header-icon, .sm-header-icon, .ig-icon),
26506
26729
  body :is(.sched-header-icon, .sm-header-icon, .ig-icon) svg { width: 16px; height: 16px; }
26507
- body .sp-sidepanel.sp-floating > :is(.cp-header, .cxp-header, .ocpv2-header, .asp-header) { flex-wrap: wrap; }
26730
+ /* The Claude Code, Codex and OpenCode headers stay one row: their session name gives way
26731
+ instead (the panels' own header styles). */
26732
+ body .sp-sidepanel.sp-floating > .asp-header { flex-wrap: wrap; }
26508
26733
 
26509
26734
  body .term-float-tab-title { flex: 1 1 100px; }
26510
26735
  body .term-float-tab-actions { flex-wrap: wrap; max-width: 100%; }
@@ -28640,6 +28865,30 @@
28640
28865
  }
28641
28866
  .update-check-toast .utc-sub { color: var(--t-muted); }
28642
28867
  .update-check-toast .utc-hint { color: var(--t-muted); opacity: 0.7; margin-top: 6px; font-size: 11px; }
28868
+ /* The desktop app's update notice (ui-update.js renderDesktopNotice): the same toast, with its own answers. */
28869
+ .update-notice .utc-sub { overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
28870
+ .update-notice-actions {
28871
+ display: flex;
28872
+ flex-wrap: wrap;
28873
+ align-items: center;
28874
+ justify-content: flex-end;
28875
+ gap: 8px;
28876
+ margin-top: 10px;
28877
+ }
28878
+ .update-notice-actions .action-btn { padding: 4px 12px; }
28879
+ .update-notice-link {
28880
+ color: var(--t-primary);
28881
+ font-size: 11px;
28882
+ text-decoration: underline;
28883
+ text-underline-offset: 2px;
28884
+ margin-right: auto;
28885
+ }
28886
+ .update-notice-link:hover { color: var(--t-bright); }
28887
+ .update-notice-link:focus-visible,
28888
+ .update-notice .action-btn:focus-visible {
28889
+ outline: 2px solid var(--stg-focus, #93c5fd);
28890
+ outline-offset: 2px;
28891
+ }
28643
28892
 
28644
28893
  .update-channel-pill {
28645
28894
  display: inline-block;
@@ -37,7 +37,8 @@
37
37
  * `opts.count` 1-3 (subagent minis), `opts.mode` 'recall' | 'remember'
38
38
  * (memory), `opts.ticks` 0-3 (plan), `opts.then` a pose to blend to once a
39
39
  * one-shot (success, error, blocked) has played and held. The same pose with
40
- * a new count or ticks keeps its loop running.
40
+ * a new count or ticks keeps its loop running. `opts.unlimited` selects the
41
+ * budget pose's relaxed infinity variant; project peeks into a folder.
41
42
  * - `react(name)` — `MASCOT_REACTIONS`: hop (spring, at most one per 600 ms),
42
43
  * wince, nod, pop (plan: pops the newest tick; ticks the next box too
43
44
  * unless setPose passed `ticks`), startle, pulse, click
@@ -81,7 +82,7 @@ export const MASCOT_VIEWBOX = '0 0 280 140';
81
82
  /** One pose per tool kind (shared with the activity rack's kind ids). */
82
83
  export const MASCOT_KINDS = Object.freeze(['shell', 'read', 'edit', 'search', 'web', 'subagent', 'plan', 'memory', 'runs', 'computer', 'think', 'mcp']);
83
84
  export const MASCOT_STATES = Object.freeze(['idle', 'sleep', 'watch', 'wait', 'success', 'error', 'blocked', 'offline']);
84
- export const MASCOT_POSES = Object.freeze([...MASCOT_KINDS, ...MASCOT_STATES]);
85
+ export const MASCOT_POSES = Object.freeze([...MASCOT_KINDS, ...MASCOT_STATES, 'project', 'budget']);
85
86
  export const MASCOT_REACTIONS = Object.freeze(['hop', 'wince', 'nod', 'pop', 'startle', 'pulse', 'click']);
86
87
 
87
88
  /** The character's SVG. Colour comes from `currentColor` (the mouth at 25 %). */
@@ -145,6 +146,8 @@ export function mascotCameoSvg({ className = '' } = {}) {
145
146
 
146
147
  /** Each prop's own box in face units, to draw it alone (a ledger row's glyph, a suggestion's). */
147
148
  const PROP_BOX = Object.freeze({
149
+ project: [204, 77, 62, 48],
150
+ budget: [212, 65, 54, 60],
148
151
  shell: [144, 116, 42, 26], // the last keycap and the caret
149
152
  read: [65, 20, 150, 88],
150
153
  edit: [188, 93, 56, 44],
@@ -315,6 +318,31 @@ const MINIS = [
315
318
  * look: follows look(), easing with this time constant (ms).
316
319
  */
317
320
  const POSES = {
321
+ // Empty-state controls: host-directed gaze, the same ticker and prop painter as tool kinds.
322
+ project: {
323
+ motion: 'loop', blinks: true, look: 70,
324
+ frame(t, o) {
325
+ const f = blankFrame();
326
+ const peek = o.still ? 0.5 : (1 + Math.sin(TAU * t / 2400)) / 2;
327
+ f.eyes = [eye(0, 2 + 2 * peek, 1, 0.92, -2), eye(0, 2 + 2 * peek, 1, 0.96, 2)];
328
+ f.mouth = mouth(34, 11);
329
+ gaze(f, o.look, { x: 16, y: 10 });
330
+ f.prop = { name: 'project', peek };
331
+ return f;
332
+ },
333
+ },
334
+ budget: {
335
+ motion: 'loop', blinks: true, look: 70,
336
+ frame(t, o) {
337
+ const f = blankFrame();
338
+ const lift = o.still ? 0 : Math.sin(TAU * t / 2200);
339
+ f.eyes = [eye(0, 0, 1, o.unlimited ? 0.65 : 0.93, -3), eye(0, 0, 1, o.unlimited ? 0.65 : 1, 3)];
340
+ f.mouth = mouth(o.unlimited ? 48 : 34, o.unlimited ? 20 : 11);
341
+ gaze(f, o.look, { x: 16, y: 10 });
342
+ f.prop = { name: 'budget', lift, unlimited: o.unlimited };
343
+ return f;
344
+ },
345
+ },
318
346
  // ── States ──
319
347
  idle: {
320
348
  motion: 'still', blinks: true, tracks: true,
@@ -598,6 +626,7 @@ function poseOptions(opts) {
598
626
  count: intIn(o.count, 1, 3, 1),
599
627
  mode: o.mode === 'remember' ? 'remember' : 'recall',
600
628
  ticks: intIn(o.ticks, 0, 3, 1),
629
+ unlimited: !!o.unlimited,
601
630
  still: !!o.still,
602
631
  };
603
632
  }
@@ -741,6 +770,23 @@ export function reactionFrame(frame, name, p) {
741
770
  // ── Props: small, currentColor, in the face's pill geometry ──
742
771
 
743
772
  const PROPS = {
773
+ project: {
774
+ markup: () => '<g fill="none" stroke="currentColor" stroke-opacity=".7" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><path d="M208 117V84q0-4 4-4h15l7 8h25v29z"/><path class="syna-folder-front" d="M208 117l5-23h49l-5 23z"/><path class="syna-folder-paper" d="M223 93V85h22v8M229 89h10"/></g>',
775
+ refs: g => ({ front: g.querySelector('.syna-folder-front'), paper: g.querySelector('.syna-folder-paper') }),
776
+ update(r, p, put) {
777
+ put(r.front, 'transform', `translate(0,${n(2 * p.peek)})`);
778
+ put(r.paper, 'transform', `translate(0,${n(-4 * p.peek)})`);
779
+ },
780
+ },
781
+ budget: {
782
+ markup: () => '<g fill="none" stroke="currentColor" stroke-opacity=".7" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><rect x="216" y="96" width="46" height="25" rx="4"/><path d="M250 103h12v10h-12z"/><g class="syna-budget-coin"><circle cx="236" cy="80" r="12"/><path d="M236 73v14M232 76h6q4 0 0 4h-4q-4 4 0 4h6"/></g><path class="syna-budget-infinity" d="M235 80c-16-19-25 15-8 7l17-14c17-8 8 26-9 7"/></g>',
783
+ refs: g => ({ coin: g.querySelector('.syna-budget-coin'), infinity: g.querySelector('.syna-budget-infinity') }),
784
+ update(r, p, put) {
785
+ put(r.coin, 'display', p.unlimited ? 'none' : null);
786
+ put(r.infinity, 'display', p.unlimited ? null : 'none');
787
+ put(p.unlimited ? r.infinity : r.coin, 'transform', `translate(0,${n(-3 * p.lift)})`);
788
+ },
789
+ },
744
790
  shell: { // three keycaps and a block caret under the chin
745
791
  markup: () => [0, 1, 2].map(i => `<rect class="syna-key" x="${100 + i * 24}" y="127" width="20" height="9" rx="4.5" fill="currentColor" fill-opacity=".4"/>`).join('')
746
792
  + '<rect class="syna-caret" x="174" y="125" width="7" height="12" rx="2" fill="currentColor" fill-opacity=".75"/>',