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
@@ -15,6 +15,7 @@ import '../account-i18n.js';
15
15
  import { restoreMcpAppCards, teardownMcpApps, retireMcpAppNode, stripMcpAppRuntime } from './cdx-mcp-app-host.js';
16
16
  import { renderTurnDiff, completeTurnOutputs } from './cdx-render.js';
17
17
  import { hydrateOutputControls } from './cdx-output.js';
18
+ import { sanitizeStoredHtml } from '../assistant/asst-sanitize.js';
18
19
  import {
19
20
  beginPlanTurn, capturePlanItem, finishPlanTurn, getPlanMarkdown, syncPlanMirrors, recordPlanTurn,
20
21
  migrateLegacyPlan, recoverPlanFromHistory, planBelongsToTab, useMessageAsPlan,
@@ -378,6 +379,9 @@ function buildWsCallbacks(tab, options = {}) {
378
379
  if (_boundTab) _boundTab.running = true;
379
380
  setStatus('Resuming…', 'working');
380
381
  resetStallTimer();
382
+ // The turn it found is still at work: so is the tab's pill (the panel may be hidden, the tab in the background).
383
+ updateTrayPillRunning();
384
+ renderPills();
381
385
  } else if (msg.running === false && (!msg.threadId || String(msg.threadId) === String(_threadId || ''))) {
382
386
  // A plan can finish while disconnected. The server's idle reply
383
387
  // releases the stale running/query state before history recovery.
@@ -589,20 +593,17 @@ function buildWsCallbacks(tab, options = {}) {
589
593
  },
590
594
 
591
595
  onInterruptAck(msg) {
592
- _running = false;
593
- _activeTurnId = null;
594
- if (_boundTab) {
595
- _boundTab.running = false;
596
- _boundTab.activeTurnId = null;
597
- if (_boundTab._abortRetry) {
598
- clearTimeout(_boundTab._abortRetry);
599
- _boundTab._abortRetry = null;
600
- }
596
+ if (_boundTab?._abortRetry) {
597
+ clearTimeout(_boundTab._abortRetry);
598
+ _boundTab._abortRetry = null;
601
599
  }
602
600
  clearInterruptTimer();
603
- stopStallTimer();
601
+ // A prompt sent after the Stop has a turn of its own: the ack is not about it.
602
+ if (!interruptAckEndsTurn(_boundTab)) return;
603
+ // The stopped turn is over: the tab, its pill and the saved tabs say so (setRunning), even
604
+ // when something marked it working again before the ack came back.
605
+ setRunning(false);
604
606
  setStatus('Interrupted', 'muted');
605
- syncInputEnabled();
606
607
  syncSessionControls();
607
608
  releaseInactiveIdleTab(_boundTab);
608
609
  },
@@ -959,6 +960,7 @@ function rememberBlockingServerRequest(requestId, method, params = {}) {
959
960
  if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
960
961
  syncWorkStatus();
961
962
  syncInputEnabled();
963
+ updateTrayPillRunning(); // the pill needs you
962
964
  saveTabs();
963
965
  }
964
966
 
@@ -968,6 +970,7 @@ function clearBlockingServerRequest(requestId, { flushBuffered = true } = {}) {
968
970
  if (_boundTab) _boundTab.blockingServerRequests = _blockingServerRequests;
969
971
  syncWorkStatus();
970
972
  syncInputEnabled();
973
+ updateTrayPillRunning();
971
974
  saveTabs();
972
975
  if (flushBuffered && !hasBlockingServerRequests()) flushBufferedSocketMessages();
973
976
  releaseInactiveIdleTab(_boundTab);
@@ -985,6 +988,7 @@ function clearAllBlockingServerRequests() {
985
988
  }
986
989
  syncWorkStatus();
987
990
  syncInputEnabled();
991
+ updateTrayPillRunning();
988
992
  }
989
993
 
990
994
  function shouldBufferSocketMessage(kind, payload) {
@@ -1064,6 +1068,11 @@ function applySocketError(msg) {
1064
1068
 
1065
1069
  function applySocketClosed() {
1066
1070
  appendSystem('Codex session closed', 'muted');
1071
+ // The app-server ran the turn: it exited, the turn went with it (the server forgot it too).
1072
+ if (_running) {
1073
+ setRunning(false);
1074
+ setStatus('Codex session closed', 'muted');
1075
+ }
1067
1076
  }
1068
1077
 
1069
1078
  function applyBufferedSocketMessage(entry) {
@@ -1459,7 +1468,7 @@ let _hljs = null;
1459
1468
 
1460
1469
  (async () => {
1461
1470
  try {
1462
- const mod = await import('https://cdn.jsdelivr.net/npm/marked@14/lib/marked.esm.js').catch(() => null);
1471
+ const mod = await import('/vendor/marked/marked-14.1.4.esm.js').catch(() => null);
1463
1472
  if (mod) {
1464
1473
  _marked = mod.marked || mod.default;
1465
1474
  if (_marked?.setOptions) _marked.setOptions({ breaks: true, gfm: true });
@@ -1471,10 +1480,10 @@ let _hljs = null;
1471
1480
  try {
1472
1481
  const link = document.createElement('link');
1473
1482
  link.rel = 'stylesheet';
1474
- link.href = 'https://cdn.jsdelivr.net/npm/highlight.js@11/styles/github-dark-dimmed.min.css';
1483
+ link.href = '/vendor/highlight/github-dark-dimmed-11.12.0.min.css';
1475
1484
  document.head.appendChild(link);
1476
1485
  const script = document.createElement('script');
1477
- script.src = 'https://cdn.jsdelivr.net/npm/highlight.js@11/lib/highlight.min.js';
1486
+ script.src = '/vendor/highlight/highlight-11.12.0.min.js';
1478
1487
  script.onload = () => { _hljs = window.hljs || null; };
1479
1488
  document.head.appendChild(script);
1480
1489
  } catch {}
@@ -2417,14 +2426,26 @@ export function restoreActiveBinding(fallbackState) {
2417
2426
  else restoreBoundState(fallbackState);
2418
2427
  }
2419
2428
 
2429
+ // How many withTab calls are under way. The outermost one hands the binding back to the active tab; a
2430
+ // nested one hands it back to the tab the call around it bound, with what that call had done so far
2431
+ // written to it first. (The history of a tab in the background renders while another tab is shown, and
2432
+ // a nested withTab in it used to leave the rest of that history to the shown tab: its held approvals
2433
+ // were looked up there and never came back.)
2434
+ let _withTabDepth = 0;
2435
+
2420
2436
  export function withTab(tab, fn) {
2421
2437
  const prev = snapshotBoundState();
2438
+ const outer = _withTabDepth > 0 ? _boundTab : null;
2439
+ if (outer) commitBoundState();
2440
+ _withTabDepth += 1;
2422
2441
  bindTabState(tab);
2423
2442
  try {
2424
2443
  return fn();
2425
2444
  } finally {
2426
2445
  commitBoundState();
2427
- restoreActiveBinding(prev);
2446
+ _withTabDepth -= 1;
2447
+ if (outer) bindTabState(outer);
2448
+ else restoreActiveBinding(prev);
2428
2449
  }
2429
2450
  }
2430
2451
 
@@ -2437,6 +2458,9 @@ export function setSessionLabel(label, { persist = true } = {}) {
2437
2458
  if (isActiveTab(_boundTab)) {
2438
2459
  const labelEl = panelEl('#cxp-session-label');
2439
2460
  if (labelEl) labelEl.replaceChildren(document.createTextNode(_sessionLabel));
2461
+ // The whole name, for when the header shows only part of it.
2462
+ const sessionBtn = panelEl('#cxp-session-btn');
2463
+ if (sessionBtn) sessionBtn.title = _sessionLabel;
2440
2464
  syncLegacyState();
2441
2465
  }
2442
2466
  updateTrayPillLabel();
@@ -2673,12 +2697,16 @@ function createTrayPill(tab) {
2673
2697
  export function renderPills() {
2674
2698
  const active = activeTab();
2675
2699
  for (const tab of _tabs) {
2676
- if (!tab.pillEl?.isConnected) tab.pillEl = createTrayPill(tab);
2700
+ if (!tab.pillEl?.isConnected) {
2701
+ tab.pillEl = createTrayPill(tab);
2702
+ // The bound tab's own reference too, or its running state would go on reaching the old node.
2703
+ if (tab === _boundTab) _trayPill = tab.pillEl;
2704
+ }
2677
2705
  if (!tab.pillEl) continue;
2678
2706
  // Read directly from tab to avoid nested withTab clobbering uncommitted state
2679
2707
  const label = tab.pillEl.querySelector('.term-minimized-pill-label');
2680
2708
  if (label) label.textContent = tab.sessionLabel || 'New session';
2681
- tab.pillEl.classList.toggle('cxp-pill-running', !!(tab.running || tab.startingThread));
2709
+ paintTrayPill(tab.pillEl, tab);
2682
2710
  const shouldShow = hasMeaningfulTrayState(tab) && (!_getVisible() || tab !== active);
2683
2711
  tab.pillEl.style.display = shouldShow ? '' : 'none';
2684
2712
  }
@@ -2871,6 +2899,7 @@ export function createTab(saved = {}, { autoSwitch = true } = {}) {
2871
2899
  ownedThreadIds: new Set(),
2872
2900
  automationRunId,
2873
2901
  automationActive: !!saved.automationActive,
2902
+ automationAwaits: false, // the run's turn ended asking the user (runAwaitsAnswer, set by its attach): the pill needs you
2874
2903
  automationOwnerId: saved.automationOwnerId || null,
2875
2904
  releasedRunId: automationRunId ? null : (saved.releasedRunId || null),
2876
2905
  };
@@ -3036,6 +3065,13 @@ export function saveTabs() {
3036
3065
  automationActive: !!tab.automationActive,
3037
3066
  automationOwnerId: tab.automationOwnerId || null,
3038
3067
  releasedRunId: tab.releasedRunId || null,
3068
+ // Whether it was working when this was written: after a reload its placeholder pill says so and
3069
+ // the panel boots to ask (ui-sidepanel-tray.js), and the tab reattaches at once (restoreTabs).
3070
+ // Never restored as running: only the reattach's answer says that. `needsYou`: an approval or a
3071
+ // question card waited on the user; the reattach replays the request the bridge still holds.
3072
+ running: !!tab.running,
3073
+ startingThread: !!tab.startingThread,
3074
+ needsYou: tab.blockingServerRequests?.size > 0 || !!tab.automationAwaits,
3039
3075
  };
3040
3076
  });
3041
3077
  const localRunIds = new Set(localTabs.map((tab) => tab.automationRunId).filter(Boolean));
@@ -3122,9 +3158,11 @@ export function restoreTabs() {
3122
3158
  if (raw) {
3123
3159
  const data = JSON.parse(raw);
3124
3160
  if (Array.isArray(data?.tabs) && data.tabs.length) {
3161
+ const wereWorking = [];
3125
3162
  for (const saved of data.tabs) {
3126
3163
  if (saved.automationActive && saved.automationOwnerId !== nativeLoopWindowId) continue;
3127
- createTab(saved, { autoSwitch: false });
3164
+ const tab = createTab(saved, { autoSwitch: false });
3165
+ if (tab && !tab.automationRunId && (saved.running || saved.startingThread || saved.needsYou)) wereWorking.push(tab);
3128
3166
  }
3129
3167
  if (!_tabs.length) throw new Error('No restorable Codex tabs');
3130
3168
  _activeTabIdx = Math.min(Math.max(Number(data.activeIdx) || 0, 0), _tabs.length - 1);
@@ -3132,6 +3170,11 @@ export function restoreTabs() {
3132
3170
  if (!_tabs.length) throw new Error('No restorable Codex tabs');
3133
3171
  updateActiveTabView();
3134
3172
  saveTabs();
3173
+ // A tab that was working when the page went away asks after its turn now, hidden or in the
3174
+ // background (a restored tab reattaches first: its turn outlives the page on the server), so
3175
+ // its pill says what the thread does. An idle one is let go again once it is ready
3176
+ // (releaseInactiveIdleTab); idle tabs stay unconnected until they are shown.
3177
+ for (const tab of wereWorking) if (_tabs.includes(tab) && !tab.ws) connectTab(tab);
3135
3178
  return;
3136
3179
  }
3137
3180
  }
@@ -3155,8 +3198,47 @@ export function updateTrayPillLabel() {
3155
3198
  if (label) label.textContent = _sessionLabel;
3156
3199
  }
3157
3200
 
3201
+ /**
3202
+ * What a tab's tray pill says: it needs you while an approval or a question card waits on your answer
3203
+ * (its blocking server requests), or, for a dispatched worker, while its turn ended asking you something
3204
+ * (the run's outcome: automationAwaits), else it works while a turn runs or a thread is being made.
3205
+ * sidepanel-session-status.js reads the same classes for a detached window's pill.
3206
+ */
3207
+ function paintTrayPill(pill, { running, startingThread, blockingServerRequests, automationAwaits }) {
3208
+ if (!pill) return;
3209
+ const needsYou = blockingServerRequests?.size > 0 || !!automationAwaits;
3210
+ pill.classList.toggle('cxp-pill-attention', needsYou);
3211
+ pill.classList.toggle('cxp-pill-running', !needsYou && !!(running || startingThread));
3212
+ }
3213
+
3158
3214
  export function updateTrayPillRunning() {
3159
- _trayPill?.classList.toggle('cxp-pill-running', !!(_running || _startingThread));
3215
+ paintTrayPill(_trayPill, {
3216
+ running: _running, startingThread: _startingThread, blockingServerRequests: _blockingServerRequests, automationAwaits: _boundTab?.automationAwaits,
3217
+ });
3218
+ }
3219
+
3220
+ /**
3221
+ * The bound tab's work ended (or began) outside setRunning: the tab, its pill and the saved tabs say
3222
+ * so now. The tab is written first: renderPills and saveTabs read it, never the bound copy, and a
3223
+ * nested withTab binds the tab again from it (withTab itself writes it back only when it returns).
3224
+ */
3225
+ function publishWorkState() {
3226
+ if (_boundTab) {
3227
+ _boundTab.running = _running;
3228
+ _boundTab.startingThread = _startingThread;
3229
+ }
3230
+ updateTrayPillRunning();
3231
+ renderPills();
3232
+ saveTabs();
3233
+ }
3234
+
3235
+ /**
3236
+ * Whether a Stop's ack ends the tab's running state: not once a prompt was sent after that Stop
3237
+ * (dispatchPrompt counts them, interruptTab notes the count it stopped at), whose turn is its own.
3238
+ */
3239
+ function interruptAckEndsTurn(tab) {
3240
+ if (!tab || tab.interruptedAtPrompt == null) return true;
3241
+ return (tab.promptCount || 0) === tab.interruptedAtPrompt;
3160
3242
  }
3161
3243
 
3162
3244
 
@@ -3255,6 +3337,7 @@ export function clearTranscript(emptyText = freshThreadText()) {
3255
3337
  showEmpty(emptyText);
3256
3338
  setCompactingUI(false);
3257
3339
  renderStatusChrome();
3340
+ updateTrayPillRunning(); // (its request cards went with the transcript)
3258
3341
  }
3259
3342
 
3260
3343
  export function renderStoredTranscript(snapshot, emptyText = freshThreadText()) {
@@ -3264,7 +3347,10 @@ export function renderStoredTranscript(snapshot, emptyText = freshThreadText())
3264
3347
 
3265
3348
  clearTranscript(emptyText);
3266
3349
  _messagesEl.querySelectorAll(':scope > .cxp-empty').forEach(node => node.remove());
3267
- _messagesEl.insertAdjacentHTML('beforeend', normalized.html);
3350
+ // A snapshot is the transcript's own markup, saved and read back from storage, and a build before the panel
3351
+ // sanitised its Markdown saved model HTML in it as it was: it is rebuilt from the stored-transcript allowlist
3352
+ // (asst-sanitize.js, the sanitiser live output goes through) before it reaches the page.
3353
+ _messagesEl.append(sanitizeStoredHtml(normalized.html));
3268
3354
  const acceptedItemIds = new Set(normalized.acceptedItemIds);
3269
3355
  const acceptedTurnIds = new Set(normalized.acceptedTurnIds);
3270
3356
  const restoredNodes = [..._messagesEl.children].filter((node) => (
@@ -3362,6 +3448,11 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
3362
3448
  _running = false;
3363
3449
  _startingThread = false;
3364
3450
  if (_boundTab) {
3451
+ // On the tab at once: clearPlanHandoffState below binds the tab again (updatePostPlanTranscriptMeta's
3452
+ // withTab), which read its old running state back over these and saved the reset tab as working.
3453
+ _boundTab.running = false;
3454
+ _boundTab.startingThread = false;
3455
+ _boundTab.activeTurnId = null;
3365
3456
  _boundTab.ownedThreadIds = new Set();
3366
3457
  _boundTab.expectedThreadId = null;
3367
3458
  _boundTab.expectedThreadRequestId = null;
@@ -3382,8 +3473,7 @@ export function resetThreadState({ tone = 'ready', preserveStatus = false } = {}
3382
3473
  clearTranscript();
3383
3474
  syncInputEnabled();
3384
3475
  syncSessionControls();
3385
- renderPills();
3386
- saveTabs();
3476
+ publishWorkState();
3387
3477
  }
3388
3478
 
3389
3479
  export function setActiveProject(projectPath, { reset = true, preserveStatus = false, tone = 'ready' } = {}) {
@@ -3574,12 +3664,12 @@ async function startNewThread(tab = activeTab()) {
3574
3664
  } finally {
3575
3665
  if (!tab.closed) withTab(tab, () => {
3576
3666
  _startingThread = false;
3667
+ // The tab first, then what reads it (the pill, the saved tabs, the toolbar): renderPills
3668
+ // used to find it still starting and put the running class back on the pill.
3669
+ publishWorkState();
3577
3670
  syncInputEnabled();
3578
3671
  syncToolbarState();
3579
3672
  syncSessionControls();
3580
- updateTrayPillRunning();
3581
- renderPills();
3582
- saveTabs();
3583
3673
  releaseInactiveIdleTab(tab);
3584
3674
  });
3585
3675
  }
@@ -4435,7 +4525,7 @@ export function promptNameNewSession() {
4435
4525
  <div class="cxp-name-modal-row">
4436
4526
  <label class="cxp-name-modal-label">Project</label>
4437
4527
  <select class="cxp-name-modal-select" data-role="project">
4438
- ${projectOptions.map(p => `<option value="${String(p.value).replace(/"/g, '&quot;')}">${p.label}</option>`).join('')}
4528
+ ${projectOptions.map(p => `<option value="${esc(p.value)}">${esc(p.label)}</option>`).join('')}
4439
4529
  </select>
4440
4530
  </div>
4441
4531
  <div class="cxp-name-modal-row">
@@ -4473,7 +4563,8 @@ export function promptNameNewSession() {
4473
4563
  branchSel.innerHTML = '<option value="">(none)</option>';
4474
4564
  branchSel.disabled = true;
4475
4565
  } else {
4476
- branchSel.innerHTML = branches.map(b => `<option value="${b.replace(/"/g, '&quot;')}">${b}</option>`).join('');
4566
+ // A branch name is the repository's (an agent can make one): text, never markup.
4567
+ branchSel.innerHTML = branches.map(b => `<option value="${esc(b)}">${esc(b)}</option>`).join('');
4477
4568
  if (branchOriginal) branchSel.value = branchOriginal;
4478
4569
  branchSel.disabled = false;
4479
4570
  }
@@ -5075,6 +5166,8 @@ export function dispatchPrompt(prompt, { tab = activeTab(), images = null, paths
5075
5166
  }
5076
5167
  if (tab) {
5077
5168
  tab.extendedContextVerificationArmed = normalizeCodexContextMode(tab.contextMode) === 'extended';
5169
+ // A Stop's late ack must not end this prompt's turn (interruptAckEndsTurn).
5170
+ tab.promptCount = (tab.promptCount || 0) + 1;
5078
5171
  }
5079
5172
  requestCodexSessionTitle(tab, inputText, {
5080
5173
  paths: [...pathList, ...mentionList.map((mention) => mention.path).filter(Boolean)],
@@ -5414,7 +5507,8 @@ export function handleNotify(method, params) {
5414
5507
  flushPostCompactionPrompt(_boundTab);
5415
5508
  }
5416
5509
  if (_boundTab?.providerTitleDirty) scheduleCodexTitleReassert(_boundTab);
5417
- if (!shouldHoldForPlanApproval(_boundTab)) advanceQueue();
5510
+ // The queue of the tab whose turn this was, never the one on screen.
5511
+ if (!shouldHoldForPlanApproval(tab)) advanceQueue(tab);
5418
5512
  releaseInactiveIdleTab(tab);
5419
5513
  }
5420
5514
  break;
@@ -6127,6 +6221,7 @@ export function interruptTab(tab = activeTab()) {
6127
6221
  clearTimeout(tab._abortRetry);
6128
6222
  tab._abortRetry = null;
6129
6223
  }
6224
+ tab.interruptedAtPrompt = tab.promptCount || 0;
6130
6225
  sendSocket({ type: 'interrupt', sessionId: tab.id, threadId });
6131
6226
  tab._abortRetry = setTimeout(() => {
6132
6227
  tab._abortRetry = null;
@@ -6157,6 +6252,7 @@ export function interruptAllTabs() {
6157
6252
  const ws = tab.ws;
6158
6253
  const threadId = tab.threadId || null;
6159
6254
  if (ws && ws.readyState === 1) {
6255
+ tab.interruptedAtPrompt = tab.promptCount || 0;
6160
6256
  try {
6161
6257
  ws.send(JSON.stringify({
6162
6258
  type: 'interrupt',
@@ -6932,6 +7028,14 @@ export function steerActiveTurn() {
6932
7028
  return true;
6933
7029
  }
6934
7030
 
7031
+ /**
7032
+ * Whether `tab` has a turn running. The bound tab's is the module's own state (the freshest: withTab
7033
+ * writes it back to the tab only when it returns); any other tab's is its own.
7034
+ */
7035
+ function tabTurnRunning(tab) {
7036
+ return tab === _boundTab ? _running : !!tab?.running;
7037
+ }
7038
+
6935
7039
  export function syncQueueTray() {
6936
7040
  const tab = activeTab();
6937
7041
  if (!tab) return;
@@ -6949,7 +7053,8 @@ export function syncQueueTray() {
6949
7053
  if (hint) {
6950
7054
  hint.textContent = count > 0
6951
7055
  ? `${count} message${count > 1 ? 's' : ''} queued${tab.queuePaused ? ' (paused)' : ''}. Enter steers. Tab queues the next turn.`
6952
- : _running
7056
+ // The tab on screen's turn, not the bound tab's (a tab working in the background is bound while its events run).
7057
+ : tabTurnRunning(tab)
6953
7058
  ? 'Enter steers the active turn. Tab queues the next turn. Shift+Enter inserts a newline.'
6954
7059
  : 'Enter sends. Shift+Enter inserts a newline.';
6955
7060
  }
@@ -7009,7 +7114,7 @@ export function toggleQueuePause() {
7009
7114
  if (!tab) return;
7010
7115
  tab.queuePaused = !tab.queuePaused;
7011
7116
  syncQueueTray();
7012
- if (!tab.queuePaused) advanceQueue();
7117
+ if (!tab.queuePaused) advanceQueue(tab);
7013
7118
  saveTabs();
7014
7119
  }
7015
7120
 
@@ -7021,11 +7126,17 @@ export function clearQueue() {
7021
7126
  saveTabs();
7022
7127
  }
7023
7128
 
7024
- export function advanceQueue() {
7025
- const tab = activeTab();
7026
- if (!tab || _running || tab.queuePaused || !tab.queue.length || hasBlockingServerRequests() || shouldHoldForPlanApproval(tab)) return;
7129
+ /**
7130
+ * Send the next prompt queued in `tab`, the tab it was typed in, on that tab's own connection and
7131
+ * thread: a background tab whose turn ends advances its own queue, never the one on screen (the
7132
+ * module state is the bound tab's, so the tab is bound first).
7133
+ */
7134
+ export function advanceQueue(tab = activeTab()) {
7135
+ if (!tab || tab.closed) return false;
7136
+ if (_boundTab !== tab) return withTab(tab, () => advanceQueue(tab));
7137
+ if (_running || tab.queuePaused || !tab.queue?.length || hasBlockingServerRequests() || shouldHoldForPlanApproval(tab)) return false;
7027
7138
  const next = tab.queue.shift();
7028
- if (!next) return;
7139
+ if (!next) return false;
7029
7140
  if (tab.planMode) {
7030
7141
  preparePlanModeTurn(tab);
7031
7142
  }
@@ -7037,13 +7148,19 @@ export function advanceQueue() {
7037
7148
  mentions: next.mentions || [],
7038
7149
  forcePlanModePrefix: tab.planMode,
7039
7150
  });
7040
- if (!sent) return;
7151
+ if (!sent) {
7152
+ // Not sent: it stays first in its tab's queue.
7153
+ tab.queue.unshift(next);
7154
+ syncQueueTray();
7155
+ return false;
7156
+ }
7041
7157
  // Render queued user message immediately with images
7042
7158
  if (queueImages?.length) {
7043
7159
  appendLocalUserMessage(next.text || '', queueImages);
7044
7160
  tab._pendingSendImages = queueImages;
7045
7161
  }
7046
7162
  syncQueueTray();
7163
+ return true;
7047
7164
  }
7048
7165
 
7049
7166
  // ── Phase 2: Image attachments ──
@@ -1,5 +1,4 @@
1
- // Markdown → HTML for every Markdown sink of the Claude panel, and the scrub a
2
- // stored transcript snapshot goes through before it is put back on the page.
1
+ // Markdown → HTML for every Markdown sink of the Claude panel, and the panel's one escaper.
3
2
  //
4
3
  // What a model writes, what a command prints and what a transcript replays is
5
4
  // not ours: marked passes raw HTML through, so `<img onerror>` or a
@@ -47,58 +46,6 @@ export function renderMarkdown(text, { parse = null, sanitize = sanitizeHtmlStri
47
46
  }
48
47
  }
49
48
 
50
- // ── Stored snapshots ──
51
- // A snapshot is the transcript's own innerHTML, saved to be shown again on a
52
- // reopen. It is the panel's markup (cards, icons, buttons, data attributes),
53
- // so the Markdown allowlist would destroy it; but it may have been written by
54
- // a build that did not sanitise, and it comes back from storage. It is parsed
55
- // into an inert <template> and stripped of everything that can run or load
56
- // code before it reaches the page.
57
-
58
- const STORED_DROPPED = new Set(['script', 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'base', 'meta', 'link', 'style', 'template', 'noscript', 'foreignobject', 'animate', 'set', 'animatetransform', 'animatemotion']);
59
- const URL_ATTRS = new Set(['href', 'src', 'xlink:href', 'action', 'formaction', 'poster', 'data', 'background', 'ping']);
60
- const REMOVED_ATTRS = new Set(['srcdoc', 'srcset']);
61
- const SAFE_URL_SCHEMES = new Set(['http', 'https', 'mailto']);
62
-
63
- /** The scheme of a URL attribute as a browser reads it (whitespace and control characters ignored), or ''. */
64
- function schemeOf(value) {
65
- const m = /^([a-z][a-z0-9+.-]*):/i.exec(String(value ?? '').replace(/[\u0000- ]/g, ''));
66
- return m ? m[1].toLowerCase() : '';
67
- }
68
-
69
- function storedImageAllowed(src) {
70
- const compact = String(src ?? '').replace(/[\u0000- ]/g, '');
71
- if (!compact) return false;
72
- if (/^data:image\//i.test(compact) || /^blob:/i.test(compact)) return true;
73
- // A path on this server; a remote image is not loaded again from storage.
74
- return !schemeOf(compact) && !compact.startsWith('//');
75
- }
76
-
77
- function scrubNode(parent) {
78
- for (const node of [...parent.childNodes]) {
79
- if (node.nodeType === 3) continue;
80
- if (node.nodeType !== 1) { parent.removeChild(node); continue; }
81
- const tag = String(node.localName || '').toLowerCase();
82
- if (STORED_DROPPED.has(tag) || (tag === 'img' && !storedImageAllowed(node.getAttribute('src')))) { parent.removeChild(node); continue; }
83
- for (const name of node.getAttributeNames()) {
84
- const lower = name.toLowerCase();
85
- if (lower.startsWith('on') || REMOVED_ATTRS.has(lower)) { node.removeAttribute(name); continue; }
86
- if (!URL_ATTRS.has(lower)) continue;
87
- const scheme = schemeOf(node.getAttribute(name));
88
- if (!scheme || SAFE_URL_SCHEMES.has(scheme)) continue;
89
- if (tag === 'img' && lower === 'src') continue; // data:image / blob, checked above
90
- node.removeAttribute(name);
91
- }
92
- scrubNode(node);
93
- }
94
- }
95
-
96
- /** A stored snapshot's markup → a DocumentFragment with nothing executable left in it. */
97
- export function scrubStoredHtml(html, doc = globalThis.document) {
98
- const tpl = doc.createElement('template');
99
- tpl.innerHTML = String(html ?? '');
100
- scrubNode(tpl.content);
101
- const out = doc.createDocumentFragment();
102
- for (const node of [...tpl.content.childNodes]) out.appendChild(node);
103
- return out;
104
- }
49
+ // A stored transcript snapshot is not scrubbed here: the panel puts it back through
50
+ // sanitizeStoredHtml() of assistant/asst-sanitize.js, the stored-transcript allowlist
51
+ // every panel uses.