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
@@ -897,6 +897,7 @@ async function refreshSessions() {
897
897
  const fetchedAt = Date.now();
898
898
  loops = (loopRes.loops || []).map(l => ({ ...l, _fetchedAt: fetchedAt }));
899
899
  staleLoopCount = loopRes.staleCount || 0;
900
+ _sessionsLoaded = true;
900
901
  emitLoopsUpdate();
901
902
  // Refresh notification feed alongside session/loop data
902
903
  refreshRulesStatus().then(() => render()).catch(() => {});
@@ -1015,7 +1016,8 @@ async function loadProviderModels(provider) {
1015
1016
  const r = await fetch('/api/claude/config').then(r => r.json());
1016
1017
  models = (r?.models || []).map(m => ({ id: m.id, label: m.label || m.id }));
1017
1018
  } else if (provider === 'opencode') {
1018
- const r = await fetch('/api/opencode/providers/full').then(r => r.json()).catch(() => null);
1019
+ // The connected providers (the compact view), not the whole models.dev catalog.
1020
+ const r = await fetch('/api/opencode/providers/full?view=compact').then(r => r.json()).catch(() => null);
1019
1021
  const provs = r?.providers || r?.data || r || [];
1020
1022
  const flat = [];
1021
1023
  for (const p of (Array.isArray(provs) ? provs : Object.values(provs || {}))) {
@@ -1148,6 +1150,9 @@ function formatDuration(ms) {
1148
1150
 
1149
1151
  // ── Panel open/close ──
1150
1152
 
1153
+ let _sessionsLoaded = false; // a read of the lists succeeded once: later opens paint from it first
1154
+ let _panelLife = null; // the open panel's document listeners end with it
1155
+
1151
1156
  function openPanel() {
1152
1157
  if (_panel) { _panel.focus(); return; }
1153
1158
 
@@ -1173,13 +1178,17 @@ function openPanel() {
1173
1178
  wirePanel();
1174
1179
  isVisible = true;
1175
1180
  connectWs();
1181
+ // What the last read found paints at once; the read below brings it up to date.
1182
+ if (_sessionsLoaded) render();
1176
1183
  refreshSessions();
1177
1184
 
1178
- // ESC key to close
1185
+ // ESC key to close (removed with the panel, however it closes)
1186
+ _panelLife?.abort();
1187
+ _panelLife = new AbortController();
1179
1188
  const onEsc = (e) => {
1180
- if (e.key === 'Escape' && _panel) { closePanel(); document.removeEventListener('keydown', onEsc); }
1189
+ if (e.key === 'Escape' && _panel) closePanel();
1181
1190
  };
1182
- document.addEventListener('keydown', onEsc);
1191
+ document.addEventListener('keydown', onEsc, { signal: _panelLife.signal });
1183
1192
 
1184
1193
  requestAnimationFrame(() => {
1185
1194
  _backdrop.classList.add('open');
@@ -1189,6 +1198,8 @@ function openPanel() {
1189
1198
 
1190
1199
  function closePanel() {
1191
1200
  if (!_panel) return;
1201
+ _panelLife?.abort();
1202
+ _panelLife = null;
1192
1203
  stopStalledTicker();
1193
1204
  if (_backdrop) { _backdrop.remove(); _backdrop = null; }
1194
1205
  _panel.remove();
@@ -3,6 +3,7 @@ import { buildJudgmentsTab, wireJudgmentsTab } from './ui-judgments.js';
3
3
  import { buildWhatsAppTab, wireWhatsAppTab } from './ui-whatsapp.js';
4
4
  import { buildCodeEditorTab, wireCodeEditorTab } from './settings/settings-code-editor-pane.js';
5
5
  import { buildAboutTab, wireAboutTab } from './settings/settings-about-pane.js';
6
+ import { buildAppTab, wireAppTab } from './settings/settings-app-pane.js';
6
7
  import { SETTINGS_GROUPS, SETTINGS_PAGES, DEFAULT_SETTINGS_PAGE, pageKeys, getSettingsPage, resolveSettingsTarget, homeOfControl } from './settings/settings-ia.js';
7
8
  import * as kit from './settings/settings-kit.js';
8
9
  import { RULES_HOST_LABELS, describeRulesHost, describeRulesInstall, describeRulesInstallAll } from './settings/settings-rules.js';
@@ -20,12 +21,14 @@ setGitBashTranslator((key, params) => kit.tx(`gitBash.${key}`, params));
20
21
  import { initI18n, isReady as i18nReady, SUPPORTED_LOCALES, LOCALE_NAMES, SYSTEM_LOCALE, getLocale, getLocaleChoice, setLocaleChoice, getSystemLocale, englishTranslator, loadEnglishTranslator } from './i18n.js';
21
22
  import { wireSettingsShell, wireSettingsSearch, collectSearchRows, revealSettingsTarget, followSettingsTarget, onSettingsTakeover, applyStoredSections, storeSectionState } from './settings/settings-shell.js';
22
23
  import { buildSettingsSearchIndex } from './settings/settings-search.js';
24
+ import { prefetchSettingsData, readSettingsData, refreshSettingsData } from './settings/settings-data.js';
25
+ import { registerLaunchPrefetch } from './launch-prefetch.js';
23
26
  // ═══════════════════════════════════════════
24
27
  // UI-SETTINGS — Settings modal with shared tabs + variant tab injection
25
28
  // ═══════════════════════════════════════════
26
29
  //
27
30
  // The most complex shared UI module. Builds a floating settings panel with
28
- // thirteen task pages in six groups (./settings/settings-ia.js). A page is a
31
+ // fourteen task pages in six groups (./settings/settings-ia.js). A page is a
29
32
  // title, a one-line purpose and section cards (./settings/settings-kit.js);
30
33
  // each builder below owns one pane of a page. Variant-registered tabs (the 2D
31
34
  // Graphics tab) join the Appearance page. Old tab ids still open the right page.
@@ -76,6 +79,8 @@ const TAB_ICONS = {
76
79
  whatsapp: '<svg viewBox="0 0 24 24"><path d="M3.5 20.5l1.3-3.9A8.5 8.5 0 1 1 8 19.6z"/><path d="M9.5 8.5c.4 2.6 2.9 5.2 5.5 5.6l1-1.2 1.6.8c-.3 1-1.1 1.6-2.1 1.5-2.9-.3-5.8-3.2-6.1-6.1-.1-1 .5-1.8 1.5-2.1l.8 1.6z"/></svg>',
77
80
  morelogin: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"><path d="M12 11.5a1 1 0 0 0-1 1c0 1.8-.3 3.6-1.2 5.2"/><path d="M7.8 14.5a8 8 0 0 0-.6 4.3"/><path d="M12 7.5a4.5 4.5 0 0 1 4.5 4.5c0 .6 0 1.2-.1 1.8"/><path d="M5 9.2a7 7 0 0 1 11-1.9"/><path d="M15 13a3 3 0 0 1-3 3"/></svg>',
78
81
  editor: '<svg viewBox="0 0 24 24"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/><line x1="13.5" y1="5" x2="10.5" y2="19"/></svg>',
82
+ // Settings > App: the software's own controls (a window with its title bar)
83
+ app: '<svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="16" rx="2"/><line x1="3" y1="9" x2="21" y2="9"/><line x1="6.5" y1="6.5" x2="6.51" y2="6.5"/><line x1="9.5" y1="6.5" x2="9.51" y2="6.5"/></svg>',
79
84
  about: '<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><line x1="12" y1="16" x2="12" y2="11"/><line x1="12" y1="7.5" x2="12.01" y2="7.5"/></svg>',
80
85
  };
81
86
 
@@ -1665,17 +1670,17 @@ function buildSkillsTab(ccSkills) {
1665
1670
  const anyOn = targets.some(t => installed[t.id]);
1666
1671
  const chips = targets.map(t => `
1667
1672
  <button type="button" class="cc-skill-target${installed[t.id] ? ' on' : ''}"
1668
- data-cc-skill="${skill.dirName}"
1673
+ data-cc-skill="${kit.esc(skill.dirName)}"
1669
1674
  data-cc-target="${t.id}"
1670
1675
  data-state="${installed[t.id] ? 'on' : 'off'}"
1671
1676
  ${kit.inv('SKL001')} data-stg-pressed="on" aria-pressed="${installed[t.id] ? 'true' : 'false'}"
1672
1677
  title="${kit.te('settings.redesign.skills.installFor', { skill: skill.name, assistant: t.label })}">${t.label}</button>
1673
1678
  `).join('');
1674
1679
  return `
1675
- <div class="cc-skill-row${anyOn ? ' installed' : ''}" data-skill-name="${skill.dirName}">
1680
+ <div class="cc-skill-row${anyOn ? ' installed' : ''}" data-skill-name="${kit.esc(skill.dirName)}">
1676
1681
  <div class="cc-skill-info">
1677
- <span class="cc-skill-name">/${skill.name}</span>
1678
- <span class="cc-skill-desc">${skill.description || ''}</span>
1682
+ <span class="cc-skill-name">/${kit.esc(skill.name)}</span>
1683
+ <span class="cc-skill-desc">${kit.esc(skill.description || '')}</span>
1679
1684
  </div>
1680
1685
  <div class="cc-skill-targets" role="group" aria-label="${kit.te('settings.redesign.skills.targets', { skill: skill.name })}">${chips}</div>
1681
1686
  </div>`;
@@ -3168,10 +3173,45 @@ function landOnSearchEntry(overlay, entry, { focus = false, watch = true } = {})
3168
3173
  }
3169
3174
 
3170
3175
  // ═══════════════════════════════════════════
3176
+ // The search index of a locale (and of the variant tabs the page registered): what the strings are, not what
3177
+ // the panes hold, so it is made once (at launch idle, or by the first open) and every open reuses it.
3178
+ let _searchIndexMemo = null;
3179
+ function memoSearchIndex(en, variantTabs, build) {
3180
+ const key = JSON.stringify([getLocale(), typeof en === 'function', (variantTabs || []).map(tab => [tab.id, tab.label || ''])]);
3181
+ if (_searchIndexMemo?.key !== key) _searchIndexMemo = { key, index: build() };
3182
+ return _searchIndexMemo.index;
3183
+ }
3184
+
3185
+ /** Make the index now (launch idle), with the English names when the locale is another (loaded once, here). */
3186
+ function prebuildSettingsSearchIndex() {
3187
+ const variantTabs = getSettingsTabs();
3188
+ const make = (en) => memoSearchIndex(en, variantTabs, () => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) }));
3189
+ if (getLocale() === 'en') { make(null); return undefined; }
3190
+ const english = englishTranslator();
3191
+ if (english) { make(english); return undefined; }
3192
+ make(null);
3193
+ return loadEnglishTranslator().then((en) => { if (en) make(en); }).catch(() => {});
3194
+ }
3195
+
3171
3196
  // MAIN ENTRY — openSettingsModal
3172
3197
  // ═══════════════════════════════════════════
3173
3198
 
3174
- export async function openSettingsModal(options = {}) {
3199
+ // An open that comes while another is still reading its data joins it: one panel, the later options applied.
3200
+ let _settingsOpening = null;
3201
+ export function openSettingsModal(options = {}) {
3202
+ if (_settingsOpening) {
3203
+ return _settingsOpening.then(() => {
3204
+ const panel = document.getElementById('settings-panel');
3205
+ if (panel) { panel.style.zIndex = '300001'; applySettingsOpenOptions(panel, options); }
3206
+ });
3207
+ }
3208
+ const opening = openSettingsModalNow(options);
3209
+ const guarded = opening.catch(() => {}).finally(() => { if (_settingsOpening === guarded) _settingsOpening = null; });
3210
+ _settingsOpening = guarded;
3211
+ return opening;
3212
+ }
3213
+
3214
+ async function openSettingsModalNow(options = {}) {
3175
3215
  // If already open, just bring it to front
3176
3216
  const existing = document.getElementById('settings-panel');
3177
3217
  if (existing) {
@@ -3207,26 +3247,17 @@ export async function openSettingsModal(options = {}) {
3207
3247
  let userContextReading = readUserContextResponse({ status: 0 });
3208
3248
 
3209
3249
  try {
3210
- const [settingsRes, connRes, ccRes, skillsRes, tunnelRes, keyRes, bridgeRes, greetRes, setupRes, cliRes, toolPermsRes, toolCatsRes, discordRes, skinsRes, iconsRes, youtubeRes, typesafeRes, userContextRes] = await Promise.allSettled([
3211
- fetch('/api/settings').then(r => r.json()),
3212
- fetch('/api/connections').then(r => r.json()),
3213
- fetch('/api/claude-code/integrations').then(r => r.json()),
3214
- fetch('/api/claude-code/skills').then(r => r.json()),
3215
- fetch('/api/tunnel/status').then(r => r.json()),
3216
- fetch('/api/mcp-key').then(r => r.json()),
3217
- fetch('/api/bridges/openclaw').then(r => r.json()),
3218
- loadGreetingReading(),
3219
- fetch('/api/setup/status').then(r => r.json()),
3220
- fetch('/api/cli/config').then(r => r.json()),
3221
- fetch('/api/claude-code/tool-permissions').then(r => r.json()),
3222
- fetch('/api/claude-code/tool-categories').then(r => r.json()),
3223
- fetch('/api/discord/config').then(r => r.json()),
3224
- fetch('/api/skins').then(r => r.json()),
3225
- fetch('/api/file-icons').then(r => r.json()),
3226
- fetch('/api/youtube/config').then(r => r.json()),
3227
- fetch('/api/typesafe/config').then(r => r.json()),
3228
- loadUserContextReading(),
3229
- ]);
3250
+ // Read through the page's data cache (settings/settings-data.js): kept answers at once (each open its own
3251
+ // copy; read again in the background when old), so Settings waits only the first time.
3252
+ const reads = await readSettingsData();
3253
+ // The greeting and the user context are readings of what their endpoints answered (no answer is a reading too).
3254
+ const readingOf = (entry, make) => ({ status: 'fulfilled', value: entry?.status === 'fulfilled' ? make(entry.value) : make({ status: 0, error: entry?.reason?.message }) });
3255
+ const greetRes = readingOf(reads.greeting, readGreetingStatus);
3256
+ const userContextRes = readingOf(reads.userContext, readUserContextResponse);
3257
+ const settingsRes = reads.settings, connRes = reads.connections, ccRes = reads.integrations, skillsRes = reads.skills;
3258
+ const tunnelRes = reads.tunnel, keyRes = reads.mcpKey, bridgeRes = reads.openclaw, setupRes = reads.setup, cliRes = reads.cli;
3259
+ const toolPermsRes = reads.toolPermissions, toolCatsRes = reads.toolCategories, discordRes = reads.discord, skinsRes = reads.skins;
3260
+ const iconsRes = reads.icons, youtubeRes = reads.youtube, typesafeRes = reads.typesafe;
3230
3261
  if (typesafeRes.status === 'fulfilled' && typesafeRes.value.ok) typesafeConfig = typesafeRes.value;
3231
3262
  if (userContextRes.status === 'fulfilled') userContextReading = userContextRes.value;
3232
3263
  if (settingsRes.status === 'fulfilled') settings = settingsRes.value;
@@ -3256,6 +3287,8 @@ export async function openSettingsModal(options = {}) {
3256
3287
  || getSettingsPage(storage.getItem(KEYS.SETTINGS_LAST_PAGE))?.id
3257
3288
  || DEFAULT_SETTINGS_PAGE;
3258
3289
  const openerEl = document.activeElement;
3290
+ // Listeners on document and window that belong to this panel end with it (close aborts it).
3291
+ const panelLife = new AbortController();
3259
3292
 
3260
3293
  // ── Panel ──
3261
3294
  const overlay = document.createElement('div');
@@ -3320,6 +3353,7 @@ export async function openSettingsModal(options = {}) {
3320
3353
  skins: buildSkinsTab(skinsData.skins, skinsData.active),
3321
3354
  interface: buildInterfaceTab(),
3322
3355
  icons: buildIconsTab(customIconsData),
3356
+ app: buildAppTab(),
3323
3357
  about: buildAboutTab(),
3324
3358
  }, variantTabs, initialPage)}
3325
3359
  </div>
@@ -3361,10 +3395,14 @@ export async function openSettingsModal(options = {}) {
3361
3395
  // ── Close helper ──
3362
3396
  const close = () => {
3363
3397
  document.removeEventListener('keydown', onSettingsEsc);
3398
+ const first = !panelLife.signal.aborted;
3399
+ panelLife.abort();
3364
3400
  // Tabs that poll (Judgments) clear their timers on this event.
3365
3401
  overlay.dispatchEvent(new CustomEvent('settings-close'));
3366
3402
  backdrop.remove();
3367
3403
  overlay.remove();
3404
+ // What was changed here is what the next open shows: its reads are asked for again now, in the background.
3405
+ if (first) refreshSettingsData();
3368
3406
  // Give the keyboard back to whatever opened Settings.
3369
3407
  if (openerEl && openerEl !== document.body && document.body.contains(openerEl)) { try { openerEl.focus({ preventScroll: true }); } catch {} }
3370
3408
  };
@@ -3525,12 +3563,12 @@ export async function openSettingsModal(options = {}) {
3525
3563
  + '</div>';
3526
3564
  html += '<div style="padding:4px 0">';
3527
3565
  if (data.parent) {
3528
- html += `<div class="cc-browse-item" data-path="${escapeHtml(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
3566
+ html += `<div class="cc-browse-item" data-path="${kit.esc(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
3529
3567
  + '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><polyline points="15 18 9 12 15 6"/></svg>'
3530
3568
  + '' + kit.te('settings.redesign.server.parent') + '</div>';
3531
3569
  }
3532
3570
  for (const d of data.directories) {
3533
- html += `<div class="cc-browse-item" data-path="${escapeHtml(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
3571
+ html += `<div class="cc-browse-item" data-path="${kit.esc(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
3534
3572
  + '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><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>'
3535
3573
  + escapeHtml(d) + '</div>';
3536
3574
  }
@@ -3914,7 +3952,7 @@ export async function openSettingsModal(options = {}) {
3914
3952
  container.querySelectorAll('.stg-dropdown.open').forEach(dd => {
3915
3953
  if (!dd.contains(e.target)) dd.classList.remove('open');
3916
3954
  });
3917
- });
3955
+ }, { signal: panelLife.signal });
3918
3956
  }
3919
3957
 
3920
3958
  function syncStgDropdown(container, hiddenId) {
@@ -4410,6 +4448,9 @@ export async function openSettingsModal(options = {}) {
4410
4448
  // ── Code editor: AI autocomplete (loads and saves itself) ──
4411
4449
  wireCodeEditorTab(overlay);
4412
4450
 
4451
+ // ── App: updates, start at login, the window, maintenance (loads itself when its page is shown) ──
4452
+ wireAppTab(overlay, { toast: showCCToast });
4453
+
4413
4454
  // ── About: version, links, system and dependencies (loads itself the first time its page is shown) ──
4414
4455
  wireAboutTab(overlay, { toast: showCCToast });
4415
4456
 
@@ -4788,7 +4829,7 @@ export async function openSettingsModal(options = {}) {
4788
4829
 
4789
4830
  // Re-poll when tab regains visibility (covers Permissions API gaps on Safari).
4790
4831
  const visHandler = () => { if (!document.hidden) refreshNotifPermRow(); };
4791
- document.addEventListener('visibilitychange', visHandler);
4832
+ document.addEventListener('visibilitychange', visHandler, { signal: panelLife.signal });
4792
4833
 
4793
4834
  // Request permission
4794
4835
  if (requestPermBtn) {
@@ -5591,7 +5632,7 @@ export async function openSettingsModal(options = {}) {
5591
5632
  overlay.querySelectorAll('.bc-dropdown.open').forEach(dd => {
5592
5633
  if (!dd.contains(e.target)) dd.classList.remove('open');
5593
5634
  });
5594
- });
5635
+ }, { signal: panelLife.signal });
5595
5636
 
5596
5637
  // Sync dropdown display from hidden input value (for applyBrowserConfig)
5597
5638
  function syncBcDropdowns() {
@@ -6091,12 +6132,12 @@ export async function openSettingsModal(options = {}) {
6091
6132
  + '</div>';
6092
6133
  html += '<div style="padding:4px 0">';
6093
6134
  if (data.parent) {
6094
- html += `<div class="cc-browse-item" data-path="${escapeHtml(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
6135
+ html += `<div class="cc-browse-item" data-path="${kit.esc(data.parent)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px;color:var(--t-muted)">`
6095
6136
  + '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><polyline points="15 18 9 12 15 6"/></svg>'
6096
6137
  + '' + kit.te('settings.redesign.browser.parent') + '</div>';
6097
6138
  }
6098
6139
  for (const d of data.directories) {
6099
- html += `<div class="cc-browse-item" data-path="${escapeHtml(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
6140
+ html += `<div class="cc-browse-item" data-path="${kit.esc(data.current + '/' + d)}" style="padding:4px 10px;cursor:pointer;font-size:12px;display:flex;align-items:center;gap:6px">`
6100
6141
  + '<svg viewBox="0 0 24 24" style="width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:2"><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>'
6101
6142
  + escapeHtml(d) + '</div>';
6102
6143
  }
@@ -7274,7 +7315,7 @@ export async function openSettingsModal(options = {}) {
7274
7315
  const ocpToolsEl = overlay.querySelector('#stg-ocp-tools');
7275
7316
  const ocpHistoryMetaEl = overlay.querySelector('#stg-ocp-history-meta');
7276
7317
  const ocpHistoryClearBtn = overlay.querySelector('#stg-ocp-clear-history');
7277
- const esc = s => String(s || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
7318
+ const esc = s => String(s || '').replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
7278
7319
 
7279
7320
  // ── Helpers ──
7280
7321
  let _ocpConnected = new Set();
@@ -8181,7 +8222,8 @@ export async function openSettingsModal(options = {}) {
8181
8222
  attempts++;
8182
8223
  if (attempts > 60) { clearInterval(poll); if (waitEl) waitEl.style.display = 'none'; return; }
8183
8224
  try {
8184
- const pr = await fetch('/api/opencode/providers/full');
8225
+ // Only `connected` is read: the compact view (connected providers), not the whole catalog every 2 s.
8226
+ const pr = await fetch('/api/opencode/providers/full?view=compact');
8185
8227
  const pd = await pr.json();
8186
8228
  const connected = pd.data?.connected || [];
8187
8229
  if (connected.includes(provId)) {
@@ -9382,7 +9424,7 @@ export async function openSettingsModal(options = {}) {
9382
9424
  // ── Search: the index is built from the strings of the active locale; what the panes load is read at query time ──
9383
9425
  // In another locale the English names are searched too (someone who learned the settings in English still finds
9384
9426
  // them): from the bundle i18n already holds as its fallback, or, when it has none, loaded once as the field is first used.
9385
- const searchIndex = (en) => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) });
9427
+ const searchIndex = (en) => memoSearchIndex(en, variantTabs, () => buildSettingsSearchIndex({ t: kit.tx, en, variants: variantTabs.map(tab => ({ id: tab.id, label: tab.label })) }));
9386
9428
  const english = getLocale() === 'en' ? null : englishTranslator();
9387
9429
  wireSettingsSearch(overlay, {
9388
9430
  index: searchIndex(english),
@@ -9580,6 +9622,15 @@ export function initSettings() {
9580
9622
  const reopenPage = takeSettingsReopen();
9581
9623
  if (reopenPage) setTimeout(() => openSettingsModal({ tab: reopenPage, expand: ['stg-sec-language'] }), 0);
9582
9624
 
9625
+ // Launch: what Settings is built from, and its search index (the English names too), read and made once the
9626
+ // page has painted, so the first open and the first search wait for nothing.
9627
+ registerLaunchPrefetch('settings-data', () => prefetchSettingsData(), { order: 60, owner: true });
9628
+ registerLaunchPrefetch('settings-search-index', () => prebuildSettingsSearchIndex(), { order: 62 });
9629
+ // Changes other windows announce: the next open shows them.
9630
+ on('sync:skin:changed', () => refreshSettingsData(['skins']));
9631
+ on('sync:greeting:changed', () => refreshSettingsData(['greeting']));
9632
+ on('sync:assistant:user-context-changed', () => refreshSettingsData(['userContext']));
9633
+
9583
9634
  // Expose sync functions for inline onclick attributes (if any remain)
9584
9635
  window.checkSyncStatus = checkSyncStatus;
9585
9636
  window.copySyncPrompt = copySyncPrompt;
@@ -18,7 +18,7 @@
18
18
  import { state, emit, on } from './state.js';
19
19
  import { KEYS, COLOR_PALETTE } from './constants.js';
20
20
  import { storage } from './storage.js';
21
- import { normalizeNodes } from './utils.js';
21
+ import { normalizeNodes, escapeHtml } from './utils.js';
22
22
  import { catColor, upgradeSelect } from './colors.js';
23
23
  import { isGuest, hasPermission, showGuestToast } from './ui-sync.js';
24
24
  import {
@@ -212,7 +212,7 @@ function openDescEditor(cat, chipEl) {
212
212
  const currentDesc = state.categoryDescriptions[cat] || '';
213
213
  editor.innerHTML = `
214
214
  <label>Description for "${cat}"</label>
215
- <textarea class="desc-textarea">${currentDesc}</textarea>
215
+ <textarea class="desc-textarea">${escapeHtml(currentDesc)}</textarea>
216
216
  <div class="category-desc-actions">
217
217
  <button class="action-btn action-btn--ghost desc-cancel-btn">Cancel</button>
218
218
  <button class="action-btn action-btn--primary desc-save-btn">Save</button>
@@ -277,7 +277,7 @@ export function openCategoryChangeModal(node) {
277
277
  <div class="cat-modal-option${isActive ? ' active' : ''}" data-cat="${cat}">
278
278
  <div class="cat-opt-dot" style="color:${catColor(cat)}; background:${catColor(cat)}"></div>
279
279
  <span class="cat-opt-name">${cat}</span>
280
- ${desc ? `<span class="cat-opt-desc">${desc}</span>` : ''}
280
+ ${desc ? `<span class="cat-opt-desc">${escapeHtml(desc)}</span>` : ''}
281
281
  </div>`;
282
282
  });
283
283
 
@@ -476,7 +476,7 @@ async function editCategoryUI(name) {
476
476
 
477
477
  <div class="ecm-field">
478
478
  <label>Description</label>
479
- <textarea class="edit-cat-desc ecm-input ecm-textarea" rows="4" placeholder="What this category is for...">${currentDesc}</textarea>
479
+ <textarea class="edit-cat-desc ecm-input ecm-textarea" rows="4" placeholder="What this category is for...">${escapeHtml(currentDesc)}</textarea>
480
480
  </div>
481
481
 
482
482
  <div class="ecm-divider"></div>
@@ -1,5 +1,6 @@
1
1
  import { hostedSidepanelId, sidepanelHost } from './ui-sidepanel-runtime.js';
2
2
  import { emit } from './state.js';
3
+ import { sessionWindowStatus } from './sidepanel-session-status.js';
3
4
 
4
5
  const host = sidepanelHost();
5
6
  const provider = new URLSearchParams(location.search).get('provider');
@@ -32,6 +33,18 @@ if (hostedSidepanelId && host) {
32
33
  const syncTitle = () => host.title(hostedSidepanelId, title?.textContent?.trim());
33
34
  if (title) new MutationObserver(syncTitle).observe(title, { childList: true, subtree: true, characterData: true });
34
35
  syncTitle();
36
+ // What its sessions do, for this window's pill in the main window: read from this document's own tray
37
+ // pills, which the panel paints from its sessions' state, and sent when it changes.
38
+ const tray = document.getElementById('term-minimized-tray');
39
+ let sentStatus = '';
40
+ const syncStatus = () => {
41
+ const status = sessionWindowStatus([...(tray?.querySelectorAll('.term-minimized-pill') || [])].map((pill) => [...pill.classList]));
42
+ if (status === sentStatus) return;
43
+ sentStatus = status;
44
+ host.status?.(hostedSidepanelId, status);
45
+ };
46
+ if (tray) new MutationObserver(syncStatus).observe(tray, { childList: true, subtree: true, attributes: true, attributeFilter: ['class'] });
47
+ syncStatus();
35
48
  host.ready(hostedSidepanelId, { focus, defaults, end, receive(kind, data) {
36
49
  if (kind === 'path') return receivePath(data);
37
50
  emit(kind === 'image' ? 'wb:send-to-panel' : kind, data);
@@ -2,9 +2,15 @@ import { storage } from './storage.js';
2
2
  import { state, emit } from './state.js';
3
3
  import { hostedSidepanelId } from './ui-sidepanel-runtime.js';
4
4
  import { registerSidepanel, setSidepanelVisible, focusSidepanel, detachSidepanel, getSidepanelPresentation, sendToFocusedSession } from './ui-sidepanel-windows.js';
5
+ import { getProviderMeta } from './provider-icons.js';
6
+ import { normalizeSessionWindowStatus } from './sidepanel-session-status.js';
7
+ import { savedTabsStatus } from './ui-sidepanel-tray.js';
5
8
 
6
9
  let manifestKey;
7
10
  const PROVIDERS = { claude: 'Claude', codex: 'Codex', opencode: 'OpenCode' };
11
+ // provider-icons.js ids: the window's pill wears its provider's icon and colour.
12
+ const PROVIDER_IDS = { claude: 'claude-code', codex: 'codex', opencode: 'opencode' };
13
+ const STATUS_WORDS = { working: 'working', action: 'needs you' };
8
14
  const entries = new Map();
9
15
  const editorOwners = new Map();
10
16
  let initialized = false;
@@ -38,6 +44,11 @@ function pillFor(entry) {
38
44
  const pill = document.createElement('div');
39
45
  pill.className = 'term-minimized-pill sp-session-pill';
40
46
  pill.dataset.sessionWindow = entry.id;
47
+ const meta = getProviderMeta(PROVIDER_IDS[entry.provider]);
48
+ pill.style.setProperty('--sp-pill-color', meta.color);
49
+ const icon = document.createElement('span');
50
+ icon.className = 'term-minimized-pill-icon';
51
+ icon.innerHTML = meta.icon; // provider-icons.js's own SVG
41
52
  const label = document.createElement('span');
42
53
  label.className = 'term-minimized-pill-label';
43
54
  const close = document.createElement('button');
@@ -45,7 +56,7 @@ function pillFor(entry) {
45
56
  close.textContent = '×';
46
57
  close.title = 'End detached session';
47
58
  close.addEventListener('click', event => { event.stopPropagation(); end(entry).catch(showError.bind(null, entry)); });
48
- pill.append(label, close);
59
+ pill.append(icon, label, close);
49
60
  pill.addEventListener('click', () => show(entry));
50
61
  tray.append(pill);
51
62
  entry.pill = pill;
@@ -55,16 +66,25 @@ function pillFor(entry) {
55
66
  function renderPill(entry) {
56
67
  const pill = pillFor(entry);
57
68
  if (!pill) return;
58
- pill.querySelector('.term-minimized-pill-label').textContent = entry.title || `${PROVIDERS[entry.provider]} session`;
69
+ const name = entry.title || `${PROVIDERS[entry.provider]} session`;
70
+ pill.querySelector('.term-minimized-pill-label').textContent = name;
59
71
  // Visible session pills also act as a window switcher when windows overlap.
60
72
  pill.classList.toggle('active', !!getSidepanelPresentation(entry.id)?.visible);
73
+ // What its sessions do, as the window's own tray pills say it (ui-sidepanel-session-entry.js): working
74
+ // like a tray pill, or needing you (a session in it waits on an answer).
75
+ const status = normalizeSessionWindowStatus(entry.status);
76
+ pill.classList.toggle('sp-pill-running', status === 'working');
77
+ pill.classList.toggle('sp-pill-attention', status === 'action');
78
+ pill.dataset.status = status;
79
+ pill.title = STATUS_WORDS[status] ? `${name} · ${STATUS_WORDS[status]}` : name;
61
80
  }
62
81
 
63
82
  function showError(entry, error) {
64
83
  if (entry.loading) entry.loading.textContent = `Could not open session: ${error?.message || error}`;
65
84
  }
66
85
 
67
- function show(entry) {
86
+ /** The window and its session's frame, made once. Whether it shows is setSidepanelVisible's: show(). */
87
+ function mount(entry) {
68
88
  if (!entry.element) {
69
89
  const element = document.createElement('section');
70
90
  element.className = 'sp-session-window';
@@ -103,6 +123,10 @@ function show(entry) {
103
123
  const lang = new URLSearchParams(window.location.search).get('lang');
104
124
  frame.src = `/sidepanel-session.html?provider=${entry.provider}${lang ? `&lang=${encodeURIComponent(lang)}` : ''}`;
105
125
  }
126
+ }
127
+
128
+ function show(entry) {
129
+ mount(entry);
106
130
  setSidepanelVisible(entry.id, true);
107
131
  }
108
132
 
@@ -167,6 +191,15 @@ export function initDetachedAgentSessions() {
167
191
  .sp-session-button:hover { color:white; background:#ffffff18; }
168
192
  .sp-session-window iframe { border:0; width:100%; flex:1; min-height:0; border-radius:0 0 15px 15px; }
169
193
  .sp-session-loading { padding:12px; font:12px sans-serif; color:#cbd5e1; }
194
+ .sp-session-pill .term-minimized-pill-icon { color: color-mix(in srgb, var(--sp-pill-color, #fff) 45%, transparent); transition: color .2s; }
195
+ .sp-session-pill.sp-pill-running { border-color: color-mix(in srgb, var(--sp-pill-color, #fff) 42%, transparent); }
196
+ .sp-session-pill.sp-pill-running .term-minimized-pill-icon { color: var(--sp-pill-color, #fff); }
197
+ .sp-session-pill.sp-pill-running .term-minimized-pill-label::before { content: ''; display: inline-block; width: 6px;
198
+ height: 6px; margin-right: 6px; border-radius: 50%; background: var(--sp-pill-color, #fff); vertical-align: middle;
199
+ animation: sp-pill-pulse 1.2s ease-in-out infinite; }
200
+ .sp-session-pill.sp-pill-attention { border-color: color-mix(in srgb, var(--accent-orange, #FFB74D) 42%, transparent); }
201
+ .sp-session-pill.sp-pill-attention .term-minimized-pill-icon { color: var(--accent-orange, #FFB74D); }
202
+ @keyframes sp-pill-pulse { 0%, 100% { opacity: .4; } 50% { opacity: 1; } }
170
203
  .sp-session-pill.active { border-color:#3b82f680; }
171
204
  `;
172
205
  document.head.append(style);
@@ -189,6 +222,15 @@ export function initDetachedAgentSessions() {
189
222
  entry.title = next; if (entry.label) entry.label.textContent = next; renderPill(entry); save();
190
223
  },
191
224
  fail: (id, error) => { const entry = entries.get(id); if (entry) showError(entry, error); },
225
+ // What the window's sessions do, sent by the window when it changes (sidepanel-session-status.js).
226
+ status(id, status) {
227
+ const entry = entries.get(id);
228
+ if (!entry) return;
229
+ const next = normalizeSessionWindowStatus(status);
230
+ if (entry.status === next) return;
231
+ entry.status = next;
232
+ renderPill(entry);
233
+ },
192
234
  send(id, kind, data) {
193
235
  const entry = entries.get(id);
194
236
  if (!entry) return;
@@ -217,7 +259,16 @@ export function initDetachedAgentSessions() {
217
259
  try {
218
260
  for (const record of JSON.parse(storage.getItem(manifestKey) || '[]')) {
219
261
  if (!/^session-[a-f0-9-]+$/.test(record.id) || !PROVIDERS[record.provider]) continue;
220
- entries.set(record.id, record); renderPill(record);
262
+ entries.set(record.id, record);
263
+ // A window whose session was working, or waiting on the user, when the page went away (its saved tabs say
264
+ // so, read as the tray's placeholders read them) says it at once, and its panel loads, hidden, to say what
265
+ // the session does now.
266
+ const saved = savedTabsStatus(record.provider, record.id);
267
+ if (saved !== 'idle') {
268
+ record.status = saved;
269
+ try { mount(record); } catch (error) { console.warn('[sidepanel-sessions] could not load a working window', error); }
270
+ }
271
+ renderPill(record);
221
272
  }
222
273
  } catch { /* Missing or invalid saved manifest starts with no extra windows. */ }
223
274
  }