synabun 2.0.7 → 2.0.10

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 (565) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +1 -1
  3. package/THIRD-PARTY-LICENSES.md +46 -4
  4. package/hooks/claude-code/post-plan.mjs +6 -30
  5. package/hooks/claude-code/session-start.mjs +1 -4
  6. package/hooks/claude-code/shared.mjs +106 -72
  7. package/launcher.mjs +9 -3
  8. package/lib/package-processes.js +670 -0
  9. package/lib/runtime-dependencies.js +225 -0
  10. package/lib/start-launcher.js +6 -1
  11. package/mcp-server/dist/services/browser-bench.d.ts +1 -1
  12. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -1
  13. package/mcp-server/dist/services/browser-bench.js +1 -1
  14. package/mcp-server/dist/services/browser-bench.js.map +1 -1
  15. package/mcp-server/dist/services/categories.d.ts +35 -2
  16. package/mcp-server/dist/services/categories.d.ts.map +1 -1
  17. package/mcp-server/dist/services/categories.js +77 -33
  18. package/mcp-server/dist/services/categories.js.map +1 -1
  19. package/mcp-server/dist/services/desktop-bench.d.ts +7 -7
  20. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -1
  21. package/mcp-server/dist/services/desktop-bench.js +1 -1
  22. package/mcp-server/dist/services/desktop-bench.js.map +1 -1
  23. package/mcp-server/dist/tools/agents.d.ts +1 -1
  24. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  25. package/mcp-server/dist/tools/agents.js +1 -1
  26. package/mcp-server/dist/tools/agents.js.map +1 -1
  27. package/mcp-server/dist/tools/bluesky.js +1 -1
  28. package/mcp-server/dist/tools/bluesky.js.map +1 -1
  29. package/mcp-server/dist/tools/browser-advanced.d.ts +1 -1
  30. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -1
  31. package/mcp-server/dist/tools/browser-advanced.js +1 -1
  32. package/mcp-server/dist/tools/browser-advanced.js.map +1 -1
  33. package/mcp-server/dist/tools/browser-batch.d.ts +1 -1
  34. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -1
  35. package/mcp-server/dist/tools/browser-batch.js +1 -1
  36. package/mcp-server/dist/tools/browser-batch.js.map +1 -1
  37. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +1 -1
  38. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -1
  39. package/mcp-server/dist/tools/browser-cheatsheet.js +1 -1
  40. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -1
  41. package/mcp-server/dist/tools/browser-interact.d.ts +1 -1
  42. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -1
  43. package/mcp-server/dist/tools/browser-interact.js +1 -1
  44. package/mcp-server/dist/tools/browser-interact.js.map +1 -1
  45. package/mcp-server/dist/tools/browser-navigate.d.ts +1 -1
  46. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -1
  47. package/mcp-server/dist/tools/browser-navigate.js +1 -1
  48. package/mcp-server/dist/tools/browser-navigate.js.map +1 -1
  49. package/mcp-server/dist/tools/browser-observe.d.ts +1 -1
  50. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -1
  51. package/mcp-server/dist/tools/browser-observe.js +1 -1
  52. package/mcp-server/dist/tools/browser-observe.js.map +1 -1
  53. package/mcp-server/dist/tools/card-tools.d.ts +1 -1
  54. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -1
  55. package/mcp-server/dist/tools/card-tools.js +1 -1
  56. package/mcp-server/dist/tools/card-tools.js.map +1 -1
  57. package/mcp-server/dist/tools/category.d.ts +1 -1
  58. package/mcp-server/dist/tools/category.d.ts.map +1 -1
  59. package/mcp-server/dist/tools/category.js +5 -1
  60. package/mcp-server/dist/tools/category.js.map +1 -1
  61. package/mcp-server/dist/tools/choice.d.ts +1 -1
  62. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  63. package/mcp-server/dist/tools/choice.js +1 -1
  64. package/mcp-server/dist/tools/choice.js.map +1 -1
  65. package/mcp-server/dist/tools/computer.d.ts +1 -1
  66. package/mcp-server/dist/tools/computer.d.ts.map +1 -1
  67. package/mcp-server/dist/tools/computer.js +1 -1
  68. package/mcp-server/dist/tools/computer.js.map +1 -1
  69. package/mcp-server/dist/tools/discord-channel.d.ts +1 -1
  70. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -1
  71. package/mcp-server/dist/tools/discord-channel.js +1 -1
  72. package/mcp-server/dist/tools/discord-channel.js.map +1 -1
  73. package/mcp-server/dist/tools/discord-guild.d.ts +1 -1
  74. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -1
  75. package/mcp-server/dist/tools/discord-guild.js +1 -1
  76. package/mcp-server/dist/tools/discord-guild.js.map +1 -1
  77. package/mcp-server/dist/tools/discord-member.d.ts +1 -1
  78. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -1
  79. package/mcp-server/dist/tools/discord-member.js +1 -1
  80. package/mcp-server/dist/tools/discord-member.js.map +1 -1
  81. package/mcp-server/dist/tools/discord-message.d.ts +1 -1
  82. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -1
  83. package/mcp-server/dist/tools/discord-message.js +1 -1
  84. package/mcp-server/dist/tools/discord-message.js.map +1 -1
  85. package/mcp-server/dist/tools/discord-onboarding.d.ts +1 -1
  86. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -1
  87. package/mcp-server/dist/tools/discord-onboarding.js +1 -1
  88. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -1
  89. package/mcp-server/dist/tools/discord-role.d.ts +1 -1
  90. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/discord-role.js +1 -1
  92. package/mcp-server/dist/tools/discord-role.js.map +1 -1
  93. package/mcp-server/dist/tools/discord-thread.d.ts +1 -1
  94. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -1
  95. package/mcp-server/dist/tools/discord-thread.js +1 -1
  96. package/mcp-server/dist/tools/discord-thread.js.map +1 -1
  97. package/mcp-server/dist/tools/discord-webhook.d.ts +1 -1
  98. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -1
  99. package/mcp-server/dist/tools/discord-webhook.js +1 -1
  100. package/mcp-server/dist/tools/discord-webhook.js.map +1 -1
  101. package/mcp-server/dist/tools/fb-groups.d.ts +1 -1
  102. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -1
  103. package/mcp-server/dist/tools/fb-groups.js +1 -1
  104. package/mcp-server/dist/tools/fb-groups.js.map +1 -1
  105. package/mcp-server/dist/tools/forget.d.ts +1 -1
  106. package/mcp-server/dist/tools/forget.d.ts.map +1 -1
  107. package/mcp-server/dist/tools/forget.js +1 -1
  108. package/mcp-server/dist/tools/forget.js.map +1 -1
  109. package/mcp-server/dist/tools/git-tools.d.ts +1 -1
  110. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -1
  111. package/mcp-server/dist/tools/git-tools.js +1 -1
  112. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  113. package/mcp-server/dist/tools/gsc/experience.d.ts +1 -1
  114. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -1
  115. package/mcp-server/dist/tools/gsc/experience.js +1 -1
  116. package/mcp-server/dist/tools/gsc/experience.js.map +1 -1
  117. package/mcp-server/dist/tools/gsc/indexing.d.ts +1 -1
  118. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -1
  119. package/mcp-server/dist/tools/gsc/indexing.js +1 -1
  120. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -1
  121. package/mcp-server/dist/tools/gsc/inspect.d.ts +1 -1
  122. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -1
  123. package/mcp-server/dist/tools/gsc/inspect.js +1 -1
  124. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -1
  125. package/mcp-server/dist/tools/gsc/navigate.d.ts +1 -1
  126. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -1
  127. package/mcp-server/dist/tools/gsc/navigate.js +1 -1
  128. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -1
  129. package/mcp-server/dist/tools/gsc/performance.d.ts +1 -1
  130. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -1
  131. package/mcp-server/dist/tools/gsc/performance.js +1 -1
  132. package/mcp-server/dist/tools/gsc/performance.js.map +1 -1
  133. package/mcp-server/dist/tools/gsc/settings.d.ts +1 -1
  134. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -1
  135. package/mcp-server/dist/tools/gsc/settings.js +1 -1
  136. package/mcp-server/dist/tools/gsc/settings.js.map +1 -1
  137. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  138. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -1
  139. package/mcp-server/dist/tools/image-tools.js +1 -1
  140. package/mcp-server/dist/tools/image-tools.js.map +1 -1
  141. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +1 -1
  142. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -1
  143. package/mcp-server/dist/tools/leonardo-browser-tools.js +1 -1
  144. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -1
  145. package/mcp-server/dist/tools/loop.d.ts +1 -1
  146. package/mcp-server/dist/tools/loop.d.ts.map +1 -1
  147. package/mcp-server/dist/tools/loop.js +1 -1
  148. package/mcp-server/dist/tools/loop.js.map +1 -1
  149. package/mcp-server/dist/tools/memories.d.ts +1 -1
  150. package/mcp-server/dist/tools/memories.d.ts.map +1 -1
  151. package/mcp-server/dist/tools/memories.js +1 -1
  152. package/mcp-server/dist/tools/memories.js.map +1 -1
  153. package/mcp-server/dist/tools/morelogin.d.ts +1 -1
  154. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  155. package/mcp-server/dist/tools/morelogin.js +1 -1
  156. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  157. package/mcp-server/dist/tools/profile.d.ts +1 -1
  158. package/mcp-server/dist/tools/profile.d.ts.map +1 -1
  159. package/mcp-server/dist/tools/profile.js +1 -1
  160. package/mcp-server/dist/tools/profile.js.map +1 -1
  161. package/mcp-server/dist/tools/recall.d.ts +1 -1
  162. package/mcp-server/dist/tools/recall.d.ts.map +1 -1
  163. package/mcp-server/dist/tools/recall.js +1 -1
  164. package/mcp-server/dist/tools/recall.js.map +1 -1
  165. package/mcp-server/dist/tools/reflect.d.ts +1 -1
  166. package/mcp-server/dist/tools/reflect.d.ts.map +1 -1
  167. package/mcp-server/dist/tools/reflect.js +1 -1
  168. package/mcp-server/dist/tools/reflect.js.map +1 -1
  169. package/mcp-server/dist/tools/remember.d.ts +1 -1
  170. package/mcp-server/dist/tools/remember.d.ts.map +1 -1
  171. package/mcp-server/dist/tools/remember.js +13 -11
  172. package/mcp-server/dist/tools/remember.js.map +1 -1
  173. package/mcp-server/dist/tools/restore.d.ts +1 -1
  174. package/mcp-server/dist/tools/restore.d.ts.map +1 -1
  175. package/mcp-server/dist/tools/restore.js +1 -1
  176. package/mcp-server/dist/tools/restore.js.map +1 -1
  177. package/mcp-server/dist/tools/style-guide-tools.d.ts +1 -1
  178. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -1
  179. package/mcp-server/dist/tools/style-guide-tools.js +1 -1
  180. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -1
  181. package/mcp-server/dist/tools/sync.d.ts +1 -1
  182. package/mcp-server/dist/tools/sync.d.ts.map +1 -1
  183. package/mcp-server/dist/tools/sync.js +1 -1
  184. package/mcp-server/dist/tools/sync.js.map +1 -1
  185. package/mcp-server/dist/tools/tictactoe-tools.d.ts +1 -1
  186. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -1
  187. package/mcp-server/dist/tools/tictactoe-tools.js +1 -1
  188. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -1
  189. package/mcp-server/dist/tools/utils.d.ts +1 -1
  190. package/mcp-server/dist/tools/utils.d.ts.map +1 -1
  191. package/mcp-server/dist/tools/utils.js +1 -1
  192. package/mcp-server/dist/tools/utils.js.map +1 -1
  193. package/mcp-server/dist/tools/whatsapp-send-file.d.ts +1 -1
  194. package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -1
  195. package/mcp-server/dist/tools/whatsapp-send-file.js +1 -1
  196. package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -1
  197. package/mcp-server/dist/tools/whiteboard-tools.d.ts +3 -3
  198. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  199. package/mcp-server/dist/tools/whiteboard-tools.js +1 -1
  200. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  201. package/mcp-server/dist/tools/youtube/analytics.d.ts +1 -1
  202. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -1
  203. package/mcp-server/dist/tools/youtube/analytics.js +1 -1
  204. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -1
  205. package/mcp-server/dist/tools/youtube/download.d.ts +1 -1
  206. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -1
  207. package/mcp-server/dist/tools/youtube/download.js +1 -1
  208. package/mcp-server/dist/tools/youtube/download.js.map +1 -1
  209. package/mcp-server/dist/tools/youtube/media.d.ts +1 -1
  210. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -1
  211. package/mcp-server/dist/tools/youtube/media.js +1 -1
  212. package/mcp-server/dist/tools/youtube/media.js.map +1 -1
  213. package/mcp-server/dist/tools/youtube/metadata.d.ts +1 -1
  214. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -1
  215. package/mcp-server/dist/tools/youtube/metadata.js +1 -1
  216. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -1
  217. package/mcp-server/dist/tools/youtube/navigate.d.ts +1 -1
  218. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -1
  219. package/mcp-server/dist/tools/youtube/navigate.js +1 -1
  220. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -1
  221. package/mcp-server/dist/tools/youtube/playlist.d.ts +1 -1
  222. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -1
  223. package/mcp-server/dist/tools/youtube/playlist.js +1 -1
  224. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -1
  225. package/mcp-server/dist/tools/youtube/schedule.d.ts +1 -1
  226. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -1
  227. package/mcp-server/dist/tools/youtube/schedule.js +1 -1
  228. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -1
  229. package/mcp-server/dist/tools/youtube/source.d.ts +1 -1
  230. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -1
  231. package/mcp-server/dist/tools/youtube/source.js +1 -1
  232. package/mcp-server/dist/tools/youtube/source.js.map +1 -1
  233. package/mcp-server/dist/tools/youtube/upload.d.ts +1 -1
  234. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -1
  235. package/mcp-server/dist/tools/youtube/upload.js +4 -9
  236. package/mcp-server/dist/tools/youtube/upload.js.map +1 -1
  237. package/mcp-server/dist/tui.js +16 -4
  238. package/mcp-server/dist/tui.js.map +1 -1
  239. package/mcp-server/package-lock.json +3 -3
  240. package/mcp-server/package.json +3 -3
  241. package/mcp-server/src/services/browser-bench.ts +1 -1
  242. package/mcp-server/src/services/categories.ts +77 -32
  243. package/mcp-server/src/services/desktop-bench.ts +1 -1
  244. package/mcp-server/src/tools/agents.ts +1 -1
  245. package/mcp-server/src/tools/bluesky.ts +1 -1
  246. package/mcp-server/src/tools/browser-advanced.ts +1 -1
  247. package/mcp-server/src/tools/browser-batch.ts +1 -1
  248. package/mcp-server/src/tools/browser-cheatsheet.ts +1 -1
  249. package/mcp-server/src/tools/browser-interact.ts +1 -1
  250. package/mcp-server/src/tools/browser-navigate.ts +1 -1
  251. package/mcp-server/src/tools/browser-observe.ts +1 -1
  252. package/mcp-server/src/tools/card-tools.ts +1 -1
  253. package/mcp-server/src/tools/category.ts +6 -1
  254. package/mcp-server/src/tools/choice.ts +1 -1
  255. package/mcp-server/src/tools/computer.ts +1 -1
  256. package/mcp-server/src/tools/discord-channel.ts +1 -1
  257. package/mcp-server/src/tools/discord-guild.ts +1 -1
  258. package/mcp-server/src/tools/discord-member.ts +1 -1
  259. package/mcp-server/src/tools/discord-message.ts +1 -1
  260. package/mcp-server/src/tools/discord-onboarding.ts +1 -1
  261. package/mcp-server/src/tools/discord-role.ts +1 -1
  262. package/mcp-server/src/tools/discord-thread.ts +1 -1
  263. package/mcp-server/src/tools/discord-webhook.ts +1 -1
  264. package/mcp-server/src/tools/fb-groups.ts +1 -1
  265. package/mcp-server/src/tools/forget.ts +1 -1
  266. package/mcp-server/src/tools/git-tools.ts +1 -1
  267. package/mcp-server/src/tools/gsc/experience.ts +1 -1
  268. package/mcp-server/src/tools/gsc/indexing.ts +1 -1
  269. package/mcp-server/src/tools/gsc/inspect.ts +1 -1
  270. package/mcp-server/src/tools/gsc/navigate.ts +1 -1
  271. package/mcp-server/src/tools/gsc/performance.ts +1 -1
  272. package/mcp-server/src/tools/gsc/settings.ts +1 -1
  273. package/mcp-server/src/tools/image-tools.ts +1 -1
  274. package/mcp-server/src/tools/leonardo-browser-tools.ts +1 -1
  275. package/mcp-server/src/tools/loop.ts +1 -1
  276. package/mcp-server/src/tools/memories.ts +1 -1
  277. package/mcp-server/src/tools/morelogin.ts +1 -1
  278. package/mcp-server/src/tools/profile.ts +1 -1
  279. package/mcp-server/src/tools/recall.ts +1 -1
  280. package/mcp-server/src/tools/reflect.ts +1 -1
  281. package/mcp-server/src/tools/remember.ts +13 -12
  282. package/mcp-server/src/tools/restore.ts +1 -1
  283. package/mcp-server/src/tools/style-guide-tools.ts +1 -1
  284. package/mcp-server/src/tools/sync.ts +1 -1
  285. package/mcp-server/src/tools/tictactoe-tools.ts +1 -1
  286. package/mcp-server/src/tools/utils.ts +1 -1
  287. package/mcp-server/src/tools/whatsapp-send-file.ts +1 -1
  288. package/mcp-server/src/tools/whiteboard-tools.ts +1 -1
  289. package/mcp-server/src/tools/youtube/analytics.ts +1 -1
  290. package/mcp-server/src/tools/youtube/download.ts +1 -1
  291. package/mcp-server/src/tools/youtube/media.ts +1 -1
  292. package/mcp-server/src/tools/youtube/metadata.ts +1 -1
  293. package/mcp-server/src/tools/youtube/navigate.ts +1 -1
  294. package/mcp-server/src/tools/youtube/playlist.ts +1 -1
  295. package/mcp-server/src/tools/youtube/schedule.ts +1 -1
  296. package/mcp-server/src/tools/youtube/source.ts +1 -1
  297. package/mcp-server/src/tools/youtube/upload.ts +4 -12
  298. package/mcp-server/src/tui.ts +22 -9
  299. package/neural-interface/i18n/en.json +236 -7
  300. package/neural-interface/i18n/pt-BR.json +238 -9
  301. package/neural-interface/lib/account-usage.js +5 -3
  302. package/neural-interface/lib/agent-sandbox-elevation.js +102 -0
  303. package/neural-interface/lib/agent-sandbox-setting.js +57 -0
  304. package/neural-interface/lib/app-controls-api.js +161 -0
  305. package/neural-interface/lib/assistant-api.js +40 -7
  306. package/neural-interface/lib/assistant-brains/opencode.js +13 -1
  307. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +44 -0
  308. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +57 -0
  309. package/neural-interface/lib/assistant-catalog.js +17 -2
  310. package/neural-interface/lib/assistant-dispatch.js +3 -0
  311. package/neural-interface/lib/assistant-envelope.js +19 -1
  312. package/neural-interface/lib/assistant-route-gate-codex.js +3 -1
  313. package/neural-interface/lib/assistant-runtime.js +131 -8
  314. package/neural-interface/lib/claude-model-catalog.js +64 -14
  315. package/neural-interface/lib/codex-account-auth.js +4 -2
  316. package/neural-interface/lib/codex-accounts.js +14 -1
  317. package/neural-interface/lib/codex-settings-schema.js +111 -47
  318. package/neural-interface/lib/editor-completion-opencode.js +132 -35
  319. package/neural-interface/lib/exec-loop-command.js +11 -2
  320. package/neural-interface/lib/install-details.js +23 -5
  321. package/neural-interface/lib/launch-cache.js +293 -0
  322. package/neural-interface/lib/login-start.js +524 -0
  323. package/neural-interface/lib/native-loop-providers.js +24 -4
  324. package/neural-interface/lib/native-loop-runtime.js +19 -0
  325. package/neural-interface/lib/opencode-db-schema.js +75 -0
  326. package/neural-interface/lib/opencode-history.js +16 -1
  327. package/neural-interface/lib/opencode-protocol.js +173 -0
  328. package/neural-interface/lib/opencode-provider-view.js +81 -0
  329. package/neural-interface/lib/opencode-runtime-config.js +10 -3
  330. package/neural-interface/lib/opencode-serve-records.js +606 -0
  331. package/neural-interface/lib/opencode-v2-client.js +33 -6
  332. package/neural-interface/lib/opencode-v2-ws-requests.js +19 -5
  333. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  334. package/neural-interface/lib/opencode2-client.js +760 -0
  335. package/neural-interface/lib/opencode2-proxy.js +116 -0
  336. package/neural-interface/lib/opencode2-translate.js +1008 -0
  337. package/neural-interface/lib/process-identity.js +361 -0
  338. package/neural-interface/lib/provider-panel-terminal-auth.js +3 -2
  339. package/neural-interface/lib/session-cache-builder.js +26 -5
  340. package/neural-interface/lib/session-indexer.js +3 -1
  341. package/neural-interface/lib/session-title-generator.js +20 -0
  342. package/neural-interface/lib/style-guide/api.js +4 -3
  343. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  344. package/neural-interface/package-lock.json +1342 -44
  345. package/neural-interface/package.json +5 -1
  346. package/neural-interface/public/index.html +2 -2
  347. package/neural-interface/public/shared/account-menu.js +4 -1
  348. package/neural-interface/public/shared/account-usage.js +62 -2
  349. package/neural-interface/public/shared/account-view.js +2 -1
  350. package/neural-interface/public/shared/agent-runtime-options.js +55 -11
  351. package/neural-interface/public/shared/assistant/asst-account-menu.js +298 -0
  352. package/neural-interface/public/shared/assistant/asst-agents-dock.js +172 -17
  353. package/neural-interface/public/shared/assistant/asst-api.js +18 -3
  354. package/neural-interface/public/shared/assistant/asst-brain-picker.js +424 -152
  355. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  356. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  357. package/neural-interface/public/shared/assistant/asst-menu.js +275 -77
  358. package/neural-interface/public/shared/assistant/asst-model-chip.js +135 -0
  359. package/neural-interface/public/shared/assistant/asst-panel.js +236 -35
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +28 -10
  361. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  362. package/neural-interface/public/shared/assistant/asst-render.js +382 -36
  363. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  364. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  365. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  366. package/neural-interface/public/shared/assistant/asst-scenes.js +528 -0
  367. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  368. package/neural-interface/public/shared/assistant/asst-state.js +14 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +109 -17
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +13 -1
  371. package/neural-interface/public/shared/cc-dropdown.js +480 -0
  372. package/neural-interface/public/shared/cdx/cdx-panel.js +14 -2
  373. package/neural-interface/public/shared/cdx/cdx-render.js +15 -3
  374. package/neural-interface/public/shared/cdx/cdx-styles.js +49 -5
  375. package/neural-interface/public/shared/cdx/cdx-tabs.js +152 -35
  376. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  377. package/neural-interface/public/shared/data-cache.js +223 -0
  378. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  379. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  380. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  381. package/neural-interface/public/shared/desktop-update-view.js +15 -5
  382. package/neural-interface/public/shared/file-links.js +73 -8
  383. package/neural-interface/public/shared/html-shell.js +74 -80
  384. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  385. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  386. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +11 -3
  387. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  388. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +97 -3
  389. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +3 -2
  390. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  391. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  392. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1 -1
  393. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  394. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +16 -9
  395. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +60 -0
  396. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +83 -5
  397. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +195 -19
  398. package/neural-interface/public/shared/opencode-providers.js +39 -0
  399. package/neural-interface/public/shared/schedules-view.js +318 -0
  400. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  401. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  402. package/neural-interface/public/shared/settings/settings-data.js +88 -0
  403. package/neural-interface/public/shared/settings/settings-ia.js +17 -0
  404. package/neural-interface/public/shared/showcase-privacy.js +2 -1
  405. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  406. package/neural-interface/public/shared/styles.css +543 -372
  407. package/neural-interface/public/shared/ui-assistant.js +27 -5
  408. package/neural-interface/public/shared/ui-automation-studio.js +67 -27
  409. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  410. package/neural-interface/public/shared/ui-claude-panel.js +126 -12
  411. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  412. package/neural-interface/public/shared/ui-detail.js +6 -6
  413. package/neural-interface/public/shared/ui-explorer.js +2 -0
  414. package/neural-interface/public/shared/ui-file-links.js +1 -0
  415. package/neural-interface/public/shared/ui-image-gallery.js +6 -5
  416. package/neural-interface/public/shared/ui-invite.js +18 -2
  417. package/neural-interface/public/shared/ui-link.js +9 -9
  418. package/neural-interface/public/shared/ui-menubar.js +232 -33
  419. package/neural-interface/public/shared/ui-native-loop-router.js +2 -0
  420. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  421. package/neural-interface/public/shared/ui-schedules-studio.js +2099 -869
  422. package/neural-interface/public/shared/ui-sessions.js +15 -4
  423. package/neural-interface/public/shared/ui-settings.js +87 -36
  424. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  425. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  426. package/neural-interface/public/shared/ui-sidepanel-sessions.js +55 -4
  427. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  428. package/neural-interface/public/shared/ui-skills.js +70 -12
  429. package/neural-interface/public/shared/ui-sync.js +9 -0
  430. package/neural-interface/public/shared/ui-terminal.js +36 -20
  431. package/neural-interface/public/shared/ui-trash.js +8 -1
  432. package/neural-interface/public/shared/ui-tutorial-steps.js +7 -3
  433. package/neural-interface/public/shared/ui-tutorial.js +15 -5
  434. package/neural-interface/public/shared/ui-update.js +87 -16
  435. package/neural-interface/public/shared/ui-whiteboard.js +2 -1
  436. package/neural-interface/public/variant/2d/main.js +4 -1
  437. package/neural-interface/public/variant/3d/main.js +3 -0
  438. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  439. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  440. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  441. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  442. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  443. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  444. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  445. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  446. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  447. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  448. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  449. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  450. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  451. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  452. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  453. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  454. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  455. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  456. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  457. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  458. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  459. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  460. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  461. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  462. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  463. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  464. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  465. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  466. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  467. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  468. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  469. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  470. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  471. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  472. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  473. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  474. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  475. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  476. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  477. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  478. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  479. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  480. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  481. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  482. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  483. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  484. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  485. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  486. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  487. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  488. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  489. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  490. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  491. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  492. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  493. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  494. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  495. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  496. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  497. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  498. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  499. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  500. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  501. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  502. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  503. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  504. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  505. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  506. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  507. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  508. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  509. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  510. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  511. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  512. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  513. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  514. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  515. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  516. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  517. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  518. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  519. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  520. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  521. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  522. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  523. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  524. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  525. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  526. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  527. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  528. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  529. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  530. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  531. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  532. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  533. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  534. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  535. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  536. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  537. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  538. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  539. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  540. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  541. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  542. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  543. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  544. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  545. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  546. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  547. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  548. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  549. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  550. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  551. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  552. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  553. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  554. package/neural-interface/scripts/build-vendor.mjs +84 -3
  555. package/neural-interface/scripts/rebuild-pty.js +14 -2
  556. package/neural-interface/server.js +1279 -372
  557. package/npm-shrinkwrap.json +4424 -0
  558. package/package.json +54 -2
  559. package/postinstall.js +61 -47
  560. package/preuninstall.js +8 -35
  561. package/setup.js +76 -44
  562. package/skills/synabun/modules/idea.md +1 -1
  563. package/skills/synabun/modules/schedule.md +2 -2
  564. package/updater.cmd +2 -2
  565. package/updater.mjs +97 -3
@@ -1,12 +1,16 @@
1
1
  // SynaBun sidepanel tray placeholders.
2
2
  // Renders minimized pills for persisted sidepanel tabs before a panel is booted.
3
+ // A tab saved while it was working may still be working (its turn outlives the
4
+ // page on the server): its provider's panel boots then, hidden, and asks, and
5
+ // its own pills (its styles, the sessions' real state) take the placeholders'
6
+ // places. Panels whose saved tabs were all idle stay lazy.
3
7
 
4
8
  import { storage } from './storage.js';
5
9
  import { emit } from './state.js';
6
10
  import { getProviderMeta } from './provider-icons.js';
7
- import { toggleClaudePanel, isClaudePanelOpen } from './ui-claude-panel.js';
8
- import { toggleCodexPanel, isCodexPanelOpen } from './ui-codex-panel.js';
9
- import { toggleOpencodePanel, isOpencodePanelOpen } from './ui-opencode-panel-v2.js';
11
+ import { toggleClaudePanel, isClaudePanelOpen, bootClaudePanel } from './ui-claude-panel.js';
12
+ import { toggleCodexPanel, isCodexPanelOpen, bootCodexPanel } from './ui-codex-panel.js';
13
+ import { toggleOpencodePanel, isOpencodePanelOpen, bootOpencodePanel } from './ui-opencode-panel-v2.js';
10
14
  import { nativeLoopWindowId } from './ui-native-window-id.js';
11
15
 
12
16
  const PLACEHOLDER_CLASS = 'sidepanel-tray-placeholder';
@@ -17,6 +21,8 @@ const PROVIDERS = {
17
21
  windowKey: 'cp-window-id',
18
22
  tabsKeyPrefix: 'synabun-claude-panel-tabs',
19
23
  pillClass: 'cp-session-pill',
24
+ // A tab saved while a permission or a question waited on the user (tabNeedsYou in ui-claude-panel.js).
25
+ attentionClass: 'cp-pill-attention',
20
26
  eventName: 'claude-panel:show',
21
27
  },
22
28
  codex: {
@@ -24,6 +30,8 @@ const PROVIDERS = {
24
30
  windowKey: 'cxp-window-id',
25
31
  tabsKeyPrefix: 'synabun-codex-panel-tabs',
26
32
  pillClass: 'cxp-session-pill',
33
+ // A tab saved while an approval or a question card waited on the user (paintTrayPill in cdx-tabs.js).
34
+ attentionClass: 'cxp-pill-attention',
27
35
  eventName: 'codex-panel:show',
28
36
  },
29
37
  opencode: {
@@ -35,13 +43,30 @@ const PROVIDERS = {
35
43
  automationKeyPrefix: 'opencode-v2-automations',
36
44
  v2Plain: true,
37
45
  windowScopedPlain: true,
46
+ // The sessions that were working when the panel last saw them (ocp-v2-panel.js STOR_BUSY).
47
+ busyKeyPrefix: 'opencode-v2-busy',
38
48
  legacyV1Prefix: 'synabun-ocp-tabs',
39
49
  legacyV1CleanupFlag: 'opencode-v1-cleanup-done',
40
- pillClass: 'ocp-session-pill',
50
+ // The v2 panel's own pill (the v1 panel and its ocp-session-pill styles are gone), so a
51
+ // working placeholder wears ocpv2-pill-running like the real one.
52
+ pillClass: 'ocpv2-session-pill',
41
53
  eventName: 'opencode-panel:show',
42
54
  },
43
55
  };
44
56
 
57
+ // How each panel boots without showing itself, and whether it should: OpenCode only
58
+ // while its server runs (a SynaBun restart stopped every turn, and booting would
59
+ // start the server again just to hear that).
60
+ const BOOT_HIDDEN = {
61
+ claude: { boot: () => bootClaudePanel() },
62
+ codex: { boot: () => bootCodexPanel() },
63
+ opencode: {
64
+ boot: () => bootOpencodePanel(),
65
+ ready: async () => (await (await fetch('/api/opencode-v2/status')).json())?.running === true,
66
+ },
67
+ };
68
+ const _bootedHidden = new Set();
69
+
45
70
  const _loadedProviders = new Set();
46
71
  let _initialized = false;
47
72
 
@@ -147,8 +172,16 @@ function tabId(provider, tab, index) {
147
172
  return `${provider}-${index}`;
148
173
  }
149
174
 
175
+ // Working when it was saved: a turn (or, in Codex, a thread being made), or, in Claude, background agents
176
+ // and shells its turn left running (`backgroundWork`, their count: the real pill's tabWorking).
150
177
  function isRunning(tab) {
151
- return !!(tab.running || tab.startingThread);
178
+ return !!(tab.running || tab.startingThread || Number(tab.backgroundWork) > 0);
179
+ }
180
+
181
+ // Waiting on the user when it was saved (Claude, Codex: `needsYou`): its placeholder says so before it says
182
+ // working, and the panel boots to ask, as for a working tab (the reattach brings the card back).
183
+ function needsYou(tab) {
184
+ return tab.needsYou === true;
152
185
  }
153
186
 
154
187
  function isForeignActiveAutomation(tab) {
@@ -168,6 +201,10 @@ function readPayload(key, meta = null) {
168
201
  const automationBySession = new Map((Array.isArray(automationRows) ? automationRows : [])
169
202
  .filter((row) => row?.sessionId && row?.runId)
170
203
  .map((row) => [row.sessionId, row]));
204
+ const busyRows = windowId && meta.busyKeyPrefix
205
+ ? parseJson(storage.getItem(`${meta.busyKeyPrefix}-${windowId}`), [])
206
+ : [];
207
+ const busy = new Set(Array.isArray(busyRows) ? busyRows : []);
171
208
  const tabs = arr
172
209
  .filter((s) => typeof s === 'string' && s)
173
210
  .map((sid) => {
@@ -177,7 +214,8 @@ function readPayload(key, meta = null) {
177
214
  automationRunId: automation?.runId || null,
178
215
  automationActive: !!automation?.running,
179
216
  automationOwnerId: automation?.ownerId || null,
180
- running: !!automation?.running,
217
+ // An automation's pill follows its turn: a warm worker saved between turns ('idle') rests.
218
+ running: (!!automation?.running && automation.turn !== 'idle') || busy.has(sid),
181
219
  };
182
220
  });
183
221
  if (!tabs.length) return null;
@@ -492,7 +530,9 @@ function createPlaceholder(provider, payload, tab, index) {
492
530
  <span class="term-minimized-pill-label">${esc(tabLabel(provider, tab))}</span>
493
531
  <button class="term-minimized-pill-close" data-tooltip="Close" data-tooltip-pos="top">&times;</button>
494
532
  `;
495
- pill.classList.toggle(`${meta.pillClass.replace('-session-pill', '')}-pill-running`, isRunning(tab));
533
+ const waiting = !!meta.attentionClass && needsYou(tab);
534
+ if (meta.attentionClass) pill.classList.toggle(meta.attentionClass, waiting);
535
+ pill.classList.toggle(`${meta.pillClass.replace('-session-pill', '')}-pill-running`, !waiting && isRunning(tab));
496
536
  pill.dataset.sourceKey = payload.key || '';
497
537
  pill.addEventListener('click', () => openProvider(provider, id, payload.key));
498
538
  pill.querySelector('.term-minimized-pill-close')?.addEventListener('click', (event) => {
@@ -517,6 +557,40 @@ function createPlaceholder(provider, payload, tab, index) {
517
557
  return pill;
518
558
  }
519
559
 
560
+ /**
561
+ * Whether a provider's panel should boot, hidden, to ask after its tabs: one of this window's own
562
+ * saved tabs (the ones its restore brings back; never another window's, which a click migrates)
563
+ * was working when it was saved. Pure: `pills` is meaningfulPills(), `currentKey` this window's key.
564
+ */
565
+ export function placeholdersNeedBoot(pills, currentKey) {
566
+ return (Array.isArray(pills) ? pills : [])
567
+ .some(({ payload, tab }) => payload?.key === currentKey && (isRunning(tab) || needsYou(tab)));
568
+ }
569
+
570
+ /**
571
+ * What the tabs a window of `provider` saved were doing then, read as the placeholders read them:
572
+ * 'action' when one waited on the user (needsYou), 'working' when one worked, else 'idle'. A detached
573
+ * session window's pill says it before the window loads (ui-sidepanel-sessions.js).
574
+ */
575
+ export function savedTabsStatus(provider, windowId) {
576
+ const meta = PROVIDERS[provider];
577
+ if (!meta || !windowId) return 'idle';
578
+ const tabs = readPayload(`${meta.tabsKeyPrefix}-${windowId}`, meta)?.tabs || [];
579
+ if (tabs.some((tab) => needsYou(tab))) return 'action';
580
+ return tabs.some((tab) => isRunning(tab)) ? 'working' : 'idle';
581
+ }
582
+
583
+ function bootHiddenIfWorking(provider, pills) {
584
+ const meta = PROVIDERS[provider];
585
+ const entry = BOOT_HIDDEN[provider];
586
+ if (!meta || !entry || _bootedHidden.has(provider) || _loadedProviders.has(provider)) return;
587
+ if (!placeholdersNeedBoot(pills, scopedTabsKey(meta))) return;
588
+ _bootedHidden.add(provider);
589
+ Promise.resolve(entry.ready ? entry.ready() : true)
590
+ .then((ok) => (ok ? entry.boot() : null))
591
+ .catch((err) => console.warn(`[sidepanel-tray] ${provider}: could not boot to ask after its working tabs`, err));
592
+ }
593
+
520
594
  export function renderSidepanelTrayPlaceholders() {
521
595
  for (const provider of Object.keys(PROVIDERS)) {
522
596
  if (_loadedProviders.has(provider)) {
@@ -524,9 +598,11 @@ export function renderSidepanelTrayPlaceholders() {
524
598
  continue;
525
599
  }
526
600
  removePlaceholders(provider);
527
- for (const { payload, tab, index } of meaningfulPills(provider)) {
601
+ const pills = meaningfulPills(provider);
602
+ for (const { payload, tab, index } of pills) {
528
603
  createPlaceholder(provider, payload, tab, index);
529
604
  }
605
+ bootHiddenIfWorking(provider, pills);
530
606
  }
531
607
  }
532
608
 
@@ -6,7 +6,9 @@
6
6
 
7
7
  import { emit, on } from './state.js';
8
8
  import { storage } from './storage.js';
9
+ import { safeHref } from './assistant/asst-sanitize.js';
9
10
  import { isGuest, hasPermission, showGuestToast } from './ui-sync.js';
11
+ import { registerLaunchPrefetch } from './launch-prefetch.js';
10
12
  import {
11
13
  fetchSkillsLibrary, fetchSkillsArtifact, saveSkillsArtifact,
12
14
  fetchSkillsSubFile, saveSkillsSubFile, createSkillsSubFile, deleteSkillsSubFile,
@@ -22,6 +24,9 @@ const $ = (id) => document.getElementById(id);
22
24
  let _panel = null;
23
25
  let _backdrop = null;
24
26
  let _library = [];
27
+ let _libraryLoaded = false; // the library was read once: later opens paint from it and read it again behind
28
+ let _panelLife = null; // document listeners of the open panel end with it
29
+ let _toolsMenuLife = null; // the tools dropdown's outside-click listener (one at a time)
25
30
  let _projects = [];
26
31
  let _selected = null; // currently selected artifact
27
32
  let _selectedContent = null; // loaded content of selected artifact
@@ -242,6 +247,8 @@ function toast(msg, type = 'info') {
242
247
  // ═══════════════════════════════════════════
243
248
 
244
249
  export function initSkillsStudio() {
250
+ // Launch: the library is read once the page has painted (launch-prefetch.js), so the first open paints at once.
251
+ registerLaunchPrefetch('skills-library', prefetchSkillsLibrary, { order: 70 });
245
252
  on('skills:open', () => openPanel());
246
253
  on('skills:open-wizard', () => { openPanel(); switchToWizard(); });
247
254
  on('skills:import', () => { openPanel(); triggerImport(); });
@@ -276,6 +283,16 @@ async function openPanel() {
276
283
  _panel.style.top = Math.max(48, (window.innerHeight - 520) / 2) + 'px';
277
284
 
278
285
  wirePanel();
286
+ if (_libraryLoaded) {
287
+ // The library as last read paints at once; it is read again behind it and the list follows in place.
288
+ const countEl = $('ss-total-count');
289
+ if (countEl) countEl.textContent = _library.length;
290
+ renderLibrary();
291
+ renderView();
292
+ requestAnimationFrame(() => { _backdrop?.classList.add('open'); _panel?.classList.add('open'); });
293
+ refreshLibraryInPlace();
294
+ return;
295
+ }
279
296
  await loadLibrary();
280
297
  renderView();
281
298
 
@@ -284,6 +301,10 @@ async function openPanel() {
284
301
 
285
302
  function closePanel() {
286
303
  if (!_panel) return;
304
+ _panelLife?.abort();
305
+ _panelLife = null;
306
+ _toolsMenuLife?.abort();
307
+ _toolsMenuLife = null;
287
308
  if (_backdrop) { _backdrop.remove(); _backdrop = null; }
288
309
  _panel.remove();
289
310
  _panel = null;
@@ -340,6 +361,8 @@ function buildPanelHTML() {
340
361
  }
341
362
 
342
363
  function wirePanel() {
364
+ _panelLife?.abort();
365
+ _panelLife = new AbortController();
343
366
  // Close button
344
367
  $('ss-close')?.addEventListener('click', closePanel);
345
368
 
@@ -376,10 +399,10 @@ function wirePanel() {
376
399
  if (_view === 'editor' && _tabs.length > 0) { closeTab(_activeTabIdx); return; }
377
400
  if (_view === 'wizard') { switchToLibrary(); return; }
378
401
  closePanel();
379
- document.removeEventListener('keydown', onEsc);
380
402
  }
381
403
  };
382
- document.addEventListener('keydown', onEsc);
404
+ // Removed with the panel, however it closes (the close button too).
405
+ document.addEventListener('keydown', onEsc, { signal: _panelLife.signal });
383
406
 
384
407
  // Drag/resize are handled by the shared panel system via drag-handle/resize-handle.
385
408
  }
@@ -393,6 +416,7 @@ async function loadLibrary() {
393
416
  const data = await fetchSkillsLibrary();
394
417
  _library = data.artifacts || [];
395
418
  _projects = data.projects || [];
419
+ _libraryLoaded = true;
396
420
  const countEl = $('ss-total-count');
397
421
  if (countEl) countEl.textContent = _library.length;
398
422
  renderLibrary();
@@ -402,6 +426,35 @@ async function loadLibrary() {
402
426
  }
403
427
  }
404
428
 
429
+ // The library read again behind a panel painted from the kept one: the list is redrawn only when it changed,
430
+ // at the scroll position it had (a failed read leaves the kept library as it is).
431
+ async function refreshLibraryInPlace() {
432
+ const before = JSON.stringify([_library, _projects]);
433
+ try {
434
+ const data = await fetchSkillsLibrary();
435
+ const next = [data.artifacts || [], data.projects || []];
436
+ if (!_panel || JSON.stringify(next) === before) return;
437
+ [_library, _projects] = next;
438
+ const list = $('ss-library');
439
+ const scroll = list ? list.scrollTop : 0;
440
+ const countEl = $('ss-total-count');
441
+ if (countEl) countEl.textContent = _library.length;
442
+ renderLibrary();
443
+ if (list) list.scrollTop = scroll;
444
+ } catch { /* the kept library stays */ }
445
+ }
446
+
447
+ /** Launch prefetch: the library read once, so the first open paints at once (nothing is drawn here). */
448
+ export function prefetchSkillsLibrary() {
449
+ if (_libraryLoaded || (isGuest() && !hasPermission('skills'))) return Promise.resolve();
450
+ return fetchSkillsLibrary().then((data) => {
451
+ if (_libraryLoaded) return;
452
+ _library = data.artifacts || [];
453
+ _projects = data.projects || [];
454
+ _libraryLoaded = true;
455
+ }).catch(() => { /* the first open reads it */ });
456
+ }
457
+
405
458
  // ═══════════════════════════════════════════
406
459
  // VIEW SWITCHING
407
460
  // ═══════════════════════════════════════════
@@ -795,7 +848,7 @@ function buildMetadataForm(artifact, fm) {
795
848
 
796
849
  html += `<div class="ss-field">
797
850
  <label>Max Turns</label>
798
- <input type="number" class="ss-input" id="ss-f-max-turns" value="${fm.maxTurns || ''}" min="0" data-fm="maxTurns" placeholder="0 = unlimited">
851
+ <input type="number" class="ss-input" id="ss-f-max-turns" value="${esc(String(fm.maxTurns || ''))}" min="0" data-fm="maxTurns" placeholder="0 = unlimited">
799
852
  </div>`;
800
853
 
801
854
  html += `<div class="ss-field">
@@ -1291,15 +1344,17 @@ function wireToolsDropdown() {
1291
1344
  updateDirtyState();
1292
1345
  });
1293
1346
 
1294
- // Close on outside click
1347
+ // Close on outside click. Every editor render wires a new dropdown: the previous one's listener ends here,
1348
+ // and the last one with the panel.
1295
1349
  const closeMenu = (e) => {
1296
1350
  if (!trigger.contains(e.target) && !menu.contains(e.target)) {
1297
1351
  menu.classList.remove('open');
1298
1352
  trigger.classList.remove('open');
1299
1353
  }
1300
1354
  };
1301
- document.addEventListener('click', closeMenu);
1302
- // Clean up when panel is destroyed (captured via MutationObserver is overkill — just leave it)
1355
+ _toolsMenuLife?.abort();
1356
+ _toolsMenuLife = new AbortController();
1357
+ document.addEventListener('click', closeMenu, { signal: _toolsMenuLife.signal });
1303
1358
  }
1304
1359
 
1305
1360
  // ── Metadata ↔ Frontmatter helpers ──
@@ -1598,8 +1653,8 @@ function renderMarkdown(md) {
1598
1653
  // Strip YAML frontmatter
1599
1654
  let text = md.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/, '');
1600
1655
 
1601
- // Escape HTML first
1602
- text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
1656
+ // Escape HTML first (quotes too: a link's target lands in an attribute)
1657
+ text = text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
1603
1658
 
1604
1659
  // Code blocks (``` ... ```)
1605
1660
  text = text.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
@@ -1626,8 +1681,11 @@ function renderMarkdown(md) {
1626
1681
  // Inline code
1627
1682
  text = text.replace(/`([^`]+)`/g, '<code>$1</code>');
1628
1683
 
1629
- // Links
1630
- text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
1684
+ // Links: http(s) and mailto only, checked as the Markdown sanitiser checks them; any other target stays text
1685
+ text = text.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (whole, label, target) => {
1686
+ const href = safeHref(target.replace(/&quot;/g, '"').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&'));
1687
+ return href ? `<a href="${esc(href)}" target="_blank" rel="noopener noreferrer">${label}</a>` : label;
1688
+ });
1631
1689
 
1632
1690
  // Blockquotes
1633
1691
  text = text.replace(/^&gt;\s?(.*)$/gm, '<blockquote>$1</blockquote>');
@@ -1663,7 +1721,7 @@ function renderMarkdown(md) {
1663
1721
  return text;
1664
1722
  }
1665
1723
 
1666
- // ── Mermaid support (lazy-loaded from CDN) ──
1724
+ // ── Mermaid support (lazy-loaded, vendored in public/vendor/mermaid/) ──
1667
1725
  let _mermaidLoaded = false;
1668
1726
  let _mermaidLoading = false;
1669
1727
  let _mermaidId = 0;
@@ -1679,7 +1737,7 @@ async function loadMermaid() {
1679
1737
  }
1680
1738
  _mermaidLoading = true;
1681
1739
  try {
1682
- const mod = await import('https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs');
1740
+ const mod = await import('/vendor/mermaid/mermaid-11.17.2.esm.min.mjs');
1683
1741
  mod.default.initialize({ startOnLoad: false, theme: 'dark', themeVariables: {
1684
1742
  darkMode: true, background: 'transparent', primaryColor: '#1e3a5f',
1685
1743
  primaryTextColor: '#e0e0e0', lineColor: '#94a3b8', secondaryColor: '#2a2a4a',
@@ -66,6 +66,13 @@ const SYNC_HANDLERS = {
66
66
 
67
67
  // Settings → OpenCode model checkboxes changed in another window: refresh
68
68
  // the localStorage mirror (fires ocp-hidden-models-changed when it differs).
69
+ // OpenCode's provider list changed (a provider connected or removed, a catalog refresh): every window's
70
+ // pickers read it again, also where no OpenCode panel (and so no OpenCode socket) is open.
71
+ 'opencode:providers-changed': (msg) => {
72
+ emit('sync:opencode:providers-changed', msg);
73
+ if (typeof document !== 'undefined') document.dispatchEvent(new CustomEvent('ocp-providers-changed'));
74
+ },
75
+
69
76
  'opencode:hidden-models-changed': (msg) => {
70
77
  applyHiddenModels(msg.models);
71
78
  emit('sync:opencode:hidden-models-changed', msg);
@@ -129,6 +136,8 @@ const SYNC_HANDLERS = {
129
136
  'assistant:desktop': (msg) => emit('sync:assistant:desktop', msg),
130
137
  'assistant:desktop-setup': (msg) => emit('sync:assistant:desktop-setup', msg),
131
138
  'assistant:routing-changed': (msg) => emit('sync:assistant:routing-changed', msg),
139
+ // Admin sandbox (lib/agent-sandbox-setting.js): the one global value changed in some window
140
+ 'agents:admin-sandbox-changed': (msg) => emit('sync:agents:admin-sandbox-changed', msg),
132
141
 
133
142
  // WhatsApp Link — states and counters only (never a QR, code, number or text); Settings → WhatsApp re-reads /api/whatsapp/status
134
143
  'whatsapp:status': (msg) => emit('sync:whatsapp:status', msg),
@@ -20,6 +20,7 @@ import { readinessKind, typeWhenReady } from './term-ready.js';
20
20
  import { initRendererManager, acquireRenderer, disposeRenderer, hasWebgl, noteFocus, adoptRenderer, rendererState, rendererStats } from './term-renderer.js';
21
21
  import { mountAssistant } from './assistant/asst-panel.js';
22
22
  import { getAssistantSession } from './assistant/asst-api.js';
23
+ import { mascotCameoSvg } from './synabun-mascot.js';
23
24
  import { brainLabel, normalizeBrain, readStoredBrain, restoredSessionName, sessionNameGivenUp } from './assistant/asst-state.js';
24
25
  import { initAssistant, registerAssistantHost, openAssistant, assistantOwnerOf, fetchLiveAssistantSessions, isAssistantSessionLive } from './ui-assistant.js';
25
26
 
@@ -447,13 +448,25 @@ function _setBadgeStatus(container, status) {
447
448
  if (lbl) lbl.textContent = _CLI_LABELS[status] || '';
448
449
  }
449
450
 
451
+ /**
452
+ * An Assistant tab minimises to the Assistant's own tray pill (assistant/asst-styles.js "Tray pill"), the one
453
+ * its sidepanel shows: the mark, the gold cameo and hairline while the session works (its turn or a worker it
454
+ * dispatched), the warn tint while it needs you. No CLI dot and no check: its status is the panel's.
455
+ */
456
+ function _paintAssistantPill(pill, status) {
457
+ pill.classList.toggle('asp-pill-running', status === CLI_STATUS.WORKING);
458
+ pill.classList.toggle('asp-pill-attention', status === CLI_STATUS.ACTION);
459
+ pill.classList.toggle('asp-pill-done', status === CLI_STATUS.DONE);
460
+ }
461
+
450
462
  function _updateSessionBadges(sessionId, status) {
451
463
  _notifyStatusChange(sessionId, status);
452
464
  const refs = _getBadgeContainers(sessionId);
453
465
  _setBadgeStatus(refs.tab, status);
454
466
  _setBadgeStatus(refs.float, status);
467
+ if (refs.pill?.classList.contains('asp-session-pill')) _paintAssistantPill(refs.pill, status);
455
468
  // Minimized pill badge + icon swap on done
456
- if (refs.pill) {
469
+ else if (refs.pill) {
457
470
  _setBadgeStatus(refs.pill, status);
458
471
  const ico = refs.pill.querySelector('.term-minimized-pill-icon');
459
472
  if (ico) {
@@ -646,7 +659,7 @@ function _initFloatProfileDropdown(dd) {
646
659
  for (const [id, preset] of Object.entries(data.presets)) {
647
660
  const opt = document.createElement('div');
648
661
  opt.className = 'term-float-profile-option' + (id === data.current ? ' selected' : '');
649
- opt.innerHTML = `<span class="tfp-name">${preset.label || id}</span><span class="tfp-hint">${preset.tools} tools</span>`;
662
+ opt.innerHTML = `<span class="tfp-name">${_escHtml(String(preset.label || id))}</span><span class="tfp-hint">${_escHtml(String(preset.tools))} tools</span>`;
650
663
  opt.addEventListener('click', async (ev) => {
651
664
  ev.stopPropagation();
652
665
  menu.classList.remove('open');
@@ -726,7 +739,7 @@ function _initFloatRecallDropdown(dd) {
726
739
  for (const p of FLOAT_RECALL_META) {
727
740
  const opt = document.createElement('div');
728
741
  opt.className = 'term-float-recall-option' + (p.value === data.profile ? ' selected' : '');
729
- opt.innerHTML = `<span class="tfr-name">${p.label}</span><span class="tfr-hint">${p.hint}</span>`;
742
+ opt.innerHTML = `<span class="tfr-name">${_escHtml(p.label)}</span><span class="tfr-hint">${_escHtml(p.hint)}</span>`;
730
743
  opt.addEventListener('click', async (ev) => {
731
744
  ev.stopPropagation();
732
745
  menu.classList.remove('open');
@@ -1740,7 +1753,7 @@ function pickProject(profile) {
1740
1753
 
1741
1754
  const title = document.createElement('div');
1742
1755
  title.className = 'term-picker-title';
1743
- title.innerHTML = `<span class="term-picker-icon">${profileDef?.svg || SVG_SHELL}</span>Open ${label} in...`;
1756
+ title.innerHTML = `<span class="term-picker-icon">${profileDef?.svg || SVG_SHELL}</span>Open ${_escHtml(String(label))} in...`;
1744
1757
 
1745
1758
  const list = document.createElement('div');
1746
1759
  list.className = 'term-picker-list';
@@ -1757,7 +1770,7 @@ function pickProject(profile) {
1757
1770
  const item = document.createElement('button');
1758
1771
  item.className = 'term-picker-item';
1759
1772
  const folder = p.path.split(/[\\/]/).pop();
1760
- item.innerHTML = `<span class="term-picker-item-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></span><span class="term-picker-item-label">${p.label || folder}</span><span class="term-picker-item-path">${p.path}</span>`;
1773
+ item.innerHTML = `<span class="term-picker-item-icon"><svg viewBox="0 0 24 24"><path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/></svg></span><span class="term-picker-item-label">${_escHtml(String(p.label || folder))}</span><span class="term-picker-item-path">${_escHtml(String(p.path))}</span>`;
1761
1774
  item.addEventListener('click', () => { overlay.remove(); resolve(p.path); });
1762
1775
  list.appendChild(item);
1763
1776
  });
@@ -3288,7 +3301,7 @@ async function reconnectBrowserSession(sessionId, liveData, saved) {
3288
3301
  <div class="browser-url-bar">
3289
3302
  <input type="text" class="browser-url-input" value="${currentUrl.replace(/"/g, '&quot;')}" spellcheck="false" autocomplete="off">
3290
3303
  </div>
3291
- <span class="browser-title-label">${liveData?.title || ''}</span>
3304
+ <span class="browser-title-label">${_escHtml(String(liveData?.title || ''))}</span>
3292
3305
  `;
3293
3306
  viewport.appendChild(navbar);
3294
3307
 
@@ -5133,10 +5146,11 @@ function minimizeTab(sessionId) {
5133
5146
  if (!tray) { tabState.el.style.display = 'none'; _syncRenderers(); return; }
5134
5147
  const prof = PROFILES.find(p => p.id === session.profile);
5135
5148
  const pill = document.createElement('div');
5136
- pill.className = 'term-minimized-pill' + (session._bell ? ' has-bell' : '');
5149
+ pill.className = 'term-minimized-pill' + (session._isAssistant ? ' asp-session-pill' : '') + (session._bell ? ' has-bell' : '');
5137
5150
  pill.setAttribute('data-session-id', sessionId);
5151
+ // (An Assistant's carries the running cameo beside its mark: _paintAssistantPill shows one or the other.)
5138
5152
  pill.innerHTML = `
5139
- <span class="term-minimized-pill-icon">${prof?.svg || SVG_SHELL}</span>
5153
+ <span class="term-minimized-pill-icon"${session._isAssistant ? ' aria-hidden="true"' : ''}>${prof?.svg || SVG_SHELL}${session._isAssistant ? mascotCameoSvg() : ''}</span>
5140
5154
  <span class="term-minimized-pill-label">${_escHtml(_displayLabel(session))}</span>
5141
5155
  <button class="term-minimized-pill-close" data-tooltip="Close">&times;</button>
5142
5156
  `;
@@ -5150,9 +5164,11 @@ function minimizeTab(sessionId) {
5150
5164
  tray.appendChild(pill);
5151
5165
  tabState.pill = pill;
5152
5166
 
5153
- // Set initial CLI status badge on pill
5167
+ // Set initial CLI status badge on pill (an Assistant's: the state the panel last pushed)
5154
5168
  const tracked = _cliSessionStatus.get(sessionId);
5155
- if (tracked) {
5169
+ if (tracked && session._isAssistant) {
5170
+ _paintAssistantPill(pill, tracked.status);
5171
+ } else if (tracked) {
5156
5172
  const badge = _ensureBadge(pill);
5157
5173
  badge.dataset.status = tracked.status;
5158
5174
  const lbl = badge.querySelector('.cli-status-label');
@@ -6905,9 +6921,9 @@ async function toggleFileTree(sidebar, session) {
6905
6921
 
6906
6922
  // Branch (clickable if git)
6907
6923
  const branchHtml = data.branch
6908
- ? `<button class="ft-branch" data-tooltip="Switch branch"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg><span class="ft-branch-name">${data.branch}</span></button>`
6924
+ ? `<button class="ft-branch" data-tooltip="Switch branch"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg><span class="ft-branch-name">${_escHtml(String(data.branch))}</span></button>`
6909
6925
  : '';
6910
- header.innerHTML = `<span class="ft-header-label" data-tooltip="Click to change path" title="${session.cwd}">${dirName}</span>${branchHtml}`;
6926
+ header.innerHTML = `<span class="ft-header-label" data-tooltip="Click to change path" title="${_escHtml(session.cwd).replace(/"/g, '&quot;')}">${_escHtml(dirName)}</span>${branchHtml}`;
6911
6927
 
6912
6928
  // Wire header label click → inline path editor
6913
6929
  header.querySelector('.ft-header-label').addEventListener('click', (e) => {
@@ -6980,7 +6996,7 @@ async function toggleFileTree(sidebar, session) {
6980
6996
 
6981
6997
  renderFileItems(tree, originalItems, session.cwd, 0, session);
6982
6998
  } catch (err) {
6983
- sidebar.innerHTML = `<div class="ft-empty">Error: ${err.message}</div>`;
6999
+ sidebar.innerHTML = `<div class="ft-empty">Error: ${_escHtml(String(err?.message || err))}</div>`;
6984
7000
  }
6985
7001
  }
6986
7002
 
@@ -7001,7 +7017,7 @@ function renderFileItems(container, items, parentPath, depth, session) {
7001
7017
  const gitBadge = item.git ? `<span class="ft-git-badge" data-tooltip="${item.git}">${GIT_STATUS_LABEL[item.git] || '?'}</span>` : '';
7002
7018
 
7003
7019
  if (item.type === 'dir') {
7004
- row.innerHTML = `<span class="ft-chevron">${SVG_CHEVRON}</span><span class="ft-icon">${SVG_DIR}</span><span class="ft-name">${item.name}</span>${gitBadge}`;
7020
+ row.innerHTML = `<span class="ft-chevron">${SVG_CHEVRON}</span><span class="ft-icon">${SVG_DIR}</span><span class="ft-name">${_escHtml(item.name)}</span>${gitBadge}`;
7005
7021
  row.dataset.path = fullPath;
7006
7022
  row.dataset.expanded = 'false';
7007
7023
 
@@ -7045,7 +7061,7 @@ function renderFileItems(container, items, parentPath, depth, session) {
7045
7061
  }
7046
7062
  });
7047
7063
  } else {
7048
- row.innerHTML = `<span class="ft-chevron-spacer"></span><span class="ft-icon">${SVG_FILE}</span><span class="ft-name">${item.name}</span>${gitBadge}`;
7064
+ row.innerHTML = `<span class="ft-chevron-spacer"></span><span class="ft-icon">${SVG_FILE}</span><span class="ft-name">${_escHtml(item.name)}</span>${gitBadge}`;
7049
7065
  row.dataset.path = fullPath;
7050
7066
 
7051
7067
  // Click file → type path into terminal
@@ -7076,9 +7092,9 @@ function renderSearchResults(container, items, session) {
7076
7092
  // Show relative path — highlight the filename part
7077
7093
  const parts = item.name.split('/');
7078
7094
  const fileName = parts.pop();
7079
- const dirPath = parts.length ? `<span class="ft-search-path">${parts.join('/')}/</span>` : '';
7095
+ const dirPath = parts.length ? `<span class="ft-search-path">${_escHtml(parts.join('/'))}/</span>` : '';
7080
7096
 
7081
- row.innerHTML = `<span class="ft-icon">${icon}</span>${dirPath}<span class="ft-name">${fileName}</span>`;
7097
+ row.innerHTML = `<span class="ft-icon">${icon}</span>${dirPath}<span class="ft-name">${_escHtml(fileName)}</span>`;
7082
7098
 
7083
7099
  const fullPath = session.cwd.replace(/[\\/]$/, '') + '/' + item.name;
7084
7100
  row.dataset.path = fullPath;
@@ -7235,7 +7251,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
7235
7251
  for (const branch of data.branches) {
7236
7252
  const item = document.createElement('button');
7237
7253
  item.className = `ft-branch-item${branch === data.current ? ' current' : ''}`;
7238
- item.innerHTML = `<span class="ft-branch-item-name">${branch}</span>${branch === data.current ? '<span class="ft-branch-item-check">&#10003;</span>' : ''}`;
7254
+ item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span>${branch === data.current ? '<span class="ft-branch-item-check">&#10003;</span>' : ''}`;
7239
7255
 
7240
7256
  item.addEventListener('click', async (e) => {
7241
7257
  e.stopPropagation();
@@ -7246,7 +7262,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
7246
7262
 
7247
7263
  // Show loading state
7248
7264
  item.classList.add('switching');
7249
- item.innerHTML = `<span class="ft-branch-item-name">${branch}</span><span class="ft-branch-item-check">...</span>`;
7265
+ item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span><span class="ft-branch-item-check">...</span>`;
7250
7266
 
7251
7267
  try {
7252
7268
  const result = await checkoutTerminalBranch(session.cwd, branch);
@@ -7270,7 +7286,7 @@ async function openBranchPicker(sidebar, session, anchorEl) {
7270
7286
  }
7271
7287
  } catch (err) {
7272
7288
  item.classList.remove('switching');
7273
- item.innerHTML = `<span class="ft-branch-item-name">${branch}</span><span class="ft-branch-item-check" style="color:#ff5252">!</span>`;
7289
+ item.innerHTML = `<span class="ft-branch-item-name">${_escHtml(branch)}</span><span class="ft-branch-item-check" style="color:#ff5252">!</span>`;
7274
7290
  writeGitOutput('error', err.message || 'Checkout failed');
7275
7291
  }
7276
7292
  });
@@ -200,10 +200,17 @@ function openTrashPanel() {
200
200
  renderTrashList();
201
201
  });
202
202
 
203
- // Fetch and render
203
+ // The trash as last read (at start-up, after every change) paints at once; the read below brings it up to
204
+ // date in place, at the list's scroll position, and only when it changed.
205
+ const kept = trashItems.length ? JSON.stringify(trashItems) : null;
206
+ if (kept) { renderTrashFilters(); renderTrashList(); }
204
207
  fetchTrashItems().then(() => {
208
+ if (kept && JSON.stringify(trashItems) === kept) return;
209
+ const list = $('tw-list');
210
+ const scroll = list ? list.scrollTop : 0;
205
211
  renderTrashFilters();
206
212
  renderTrashList();
213
+ if (kept && list && list.isConnected) list.scrollTop = scroll;
207
214
  });
208
215
  }
209
216
 
@@ -74,7 +74,9 @@ export const ONBOARDING_STEPS = [
74
74
  // targets ordered alternatives, [selector, copyKey = 'body', lastSelector?]. The first one on
75
75
  // screen is annotated and its copy shown; `lastSelector` widens the outline to a run
76
76
  // of controls. None on screen: the note stays, with the navigation.
77
- // menu a menubar dropdown opened while the step shows (closed again after).
77
+ // menu a menubar dropdown opened while the step shows (closed again after); an object
78
+ // names it per variant ({ '3d': 'apps' }: none in the other).
79
+ // submenu a submenu of that dropdown opened too, by its data-submenu name, same forms as `menu`.
78
80
  // panel 'assistant' shows the Assistant panel for the step when that starts nothing
79
81
  // (see assistantPanelPeekable); otherwise the last target, its button, is used.
80
82
  // copy per-variant copy key for the first target ({ '2d': 'body2d' }).
@@ -88,14 +90,16 @@ const TOOLS_TOGGLE = ['#topright-tools-btn'];
88
90
 
89
91
  export const FEATURE_STEPS = [
90
92
  { id: 'explain-memory-explorer', chapter: 'memory', targets: [['#topright-memory-explorer-btn'], TOOLS_TOGGLE] },
91
- { id: 'explain-graph', chapter: 'memory', copy: { '2d': 'body2d' }, targets: [['[data-menu="graph"] > .menubar-label']] },
93
+ // 3D: the Map submenu of Apps. 2D: the Graph menu.
94
+ { id: 'explain-graph', chapter: 'memory', menu: { '3d': 'apps' }, submenu: { '3d': 'map' }, copy: { '2d': 'body2d' },
95
+ targets: [['#menu-map-label', 'body', '#menu-map-rebuild'], ['[data-menu="graph"] > .menubar-label', 'body2d']] },
92
96
  { id: 'explain-focus', chapter: 'workspace', targets: [['#wb-toolbar'], ['#titlebar-viz-toggle', 'graph']] },
93
97
  { id: 'explain-workspaces', chapter: 'workspace', targets: [['#ws-indicator'], TOOLS_TOGGLE] },
94
98
  { id: 'explain-terminals', chapter: 'tools', menu: 'apps', targets: [['#menu-terminal-claude', 'body', '#menu-terminal-opencode']] },
95
99
  { id: 'explain-browser', chapter: 'tools', menu: 'apps', targets: [['#menu-terminal-browser']] },
96
100
  { id: 'explain-side-panel', chapter: 'tools', targets: [['#topright-claude-panel-btn', 'body', '#topright-opencode-panel-btn']] },
97
101
  { id: 'explain-automations', chapter: 'automation', menu: 'automations', targets: [['#menu-open-automation-studio']] },
98
- { id: 'explain-schedules', chapter: 'automation', menu: 'automations', targets: [['#menu-automations-schedules']] },
102
+ { id: 'explain-schedules', chapter: 'automation', targets: [['#menubar-schedules-btn']] },
99
103
  { id: 'assistant-start', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_TAB} .asst-input`], ASSISTANT_BUTTON] },
100
104
  { id: 'assistant-tools', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_BAR} .asst-computer-toggle`], ASSISTANT_BUTTON] },
101
105
  { id: 'assistant-route', chapter: 'assistant', panel: 'assistant', targets: [[`${ACTIVE_BAR} .asst-route-chip`], ASSISTANT_BUTTON] },