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
@@ -98,8 +98,12 @@ const CSS = `
98
98
  padding: 5px 10px;
99
99
  border-radius: 8px 0 0 8px;
100
100
  transition: background 0.15s, color 0.15s;
101
- max-width: 100%;
102
- min-width: 0;
101
+ /* The session name gives way first: it starts from nothing and takes only
102
+ the room the pencil and the actions leave, up to its own width, so a long
103
+ name can never push them. 32px keeps the caret in view. */
104
+ flex: 1 1 0;
105
+ min-width: 32px;
106
+ max-width: max-content;
103
107
  overflow: hidden;
104
108
  }
105
109
  .ocpv2-session-btn:hover {
@@ -135,6 +139,7 @@ const CSS = `
135
139
  .ocpv2-rename-input:focus { border-color: rgba(100,160,255,0.5); }
136
140
  .ocpv2-rename-input::placeholder { color: rgba(255,255,255,0.3); }
137
141
  .ocpv2-session-btn .ocpv2-dd-arrow {
142
+ flex-shrink: 0;
138
143
  font-size: 9px;
139
144
  padding: 4px 6px;
140
145
  margin: -4px -6px -4px 0;
@@ -164,6 +169,8 @@ const CSS = `
164
169
  -webkit-tap-highlight-color: transparent;
165
170
  touch-action: manipulation;
166
171
  flex-shrink: 0;
172
+ /* The actions' own gap, kept when the name fills the row. */
173
+ margin-right: 3px;
167
174
  }
168
175
  .ocpv2-header-rename:hover:not(:disabled) {
169
176
  color: rgba(100,160,255,0.95);
@@ -359,6 +366,8 @@ const CSS = `
359
366
  margin-left: auto;
360
367
  flex-shrink: 0;
361
368
  }
369
+ /* The header buttons never shrink, whatever the session name's length. */
370
+ .ocpv2-actions > * { flex-shrink: 0; }
362
371
  .ocpv2-btn {
363
372
  display: flex;
364
373
  align-items: center;
@@ -2718,16 +2727,81 @@ const CHILD_CSS = `
2718
2727
  set inline via --right-panel-offset-{owner}. */
2719
2728
  border: 0.5px dashed rgba(180, 200, 255, 0.18);
2720
2729
  }
2730
+ /* A query container measured in controls: 1em is one header button (24px
2731
+ docked, the window's control size when detached, which follows the font
2732
+ scale), so the thresholds below hold at any scale. Nothing in this row
2733
+ inherits it: the crumbs and the title set their own sizes. */
2734
+ .ocpv2-panel-child > .ocpv2-header {
2735
+ container: ocpv2-child-header / inline-size;
2736
+ font-size: 24px;
2737
+ }
2738
+ .ocpv2-panel-child.sp-floating > .ocpv2-header { font-size: var(--fw-header-control-size); }
2739
+ /* The sub-agent's name keeps a readable 88px (or its own width if shorter):
2740
+ the parents between the way back and the nearest parent give way first. */
2741
+ .ocpv2-panel-child .ocpv2-session-btn { flex: 1 0 88px; }
2742
+ /* The chain of parents: at most 40% of the row. Its first crumb is the way
2743
+ back to the main panel (.ocpv2-child-parent-link) and is on screen at every
2744
+ width; the crumbs after it give way before it does. */
2721
2745
  .ocpv2-panel-child .ocpv2-child-crumbs {
2722
2746
  display: inline-flex;
2723
2747
  align-items: center;
2748
+ justify-content: flex-end;
2724
2749
  gap: 3px;
2725
2750
  min-width: 0;
2751
+ max-width: 40%;
2726
2752
  flex-shrink: 1;
2727
2753
  overflow: hidden;
2728
2754
  margin-right: 6px;
2729
2755
  }
2730
2756
  .ocpv2-panel-child .ocpv2-child-crumbs:empty { display: none; }
2757
+ /* The nearest parent keeps its own width (at most 140px); the ones between
2758
+ it and the way back shrink first. */
2759
+ .ocpv2-panel-child .ocpv2-child-crumbs > .ocpv2-child-crumb:last-child { flex-shrink: 0; }
2760
+ .ocpv2-panel-child .ocpv2-child-crumbs > .ocpv2-child-crumb:not(:first-child):not(:last-child) { flex-shrink: 100; min-width: 0; }
2761
+ .ocpv2-panel-child .ocpv2-child-crumbs > .ocpv2-child-parent-link { flex-shrink: 1; }
2762
+ /* Narrow headers, in order: with less than 140px for the chain, the way back
2763
+ and the nearest parent show, truncated; with less than 64px, the way back is
2764
+ its arrow alone (a header control, named by its tooltip) and the name takes
2765
+ the rest; detached, when the name would get less than its 32px, Slide (which
2766
+ does what Minimize does here) and then "New session in main panel" give way.
2767
+ Room counted in controls (em) plus px: docked, the pencil and six buttons are
2768
+ 7em with 18px of gaps; detached, the move handle makes 8em and the window's
2769
+ 6px gaps 42px. Thresholds: the name's 88px + the chain's 6px margin + 140px
2770
+ or 64px + that row. Detached with the arrow alone, the move handle, the
2771
+ arrow, the pencil and six buttons are 9em with 48px of gaps and margins:
2772
+ + 32px for the name, and one button (1em + 3px) less once Slide is gone. */
2773
+ @container ocpv2-child-header (width < calc(7em + 252px)) {
2774
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-crumbs > :not(:first-child):not(:last-child):not(:nth-last-child(2)) { display: none; }
2775
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-crumbs > .ocpv2-child-crumb:last-child:not(.ocpv2-child-parent-link) { flex-shrink: 1; min-width: 0; }
2776
+ }
2777
+ @container ocpv2-child-header (width < calc(7em + 176px)) {
2778
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-crumbs > :not(:first-child) { display: none; }
2779
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-crumbs { flex-shrink: 0; max-width: none; }
2780
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-session-btn { flex: 1 1 0; }
2781
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-parent-label { display: none; }
2782
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-parent-link { width: 24px; height: 24px; min-width: 0; padding: 0; }
2783
+ .ocpv2-panel-child:not(.sp-floating) .ocpv2-child-parent-arrow { width: auto; height: auto; font-size: 13px; line-height: 1; }
2784
+ }
2785
+ @container ocpv2-child-header (width < calc(8em + 276px)) {
2786
+ .ocpv2-panel-child.sp-floating .ocpv2-child-crumbs > :not(:first-child):not(:last-child):not(:nth-last-child(2)) { display: none; }
2787
+ .ocpv2-panel-child.sp-floating .ocpv2-child-crumbs > .ocpv2-child-crumb:last-child:not(.ocpv2-child-parent-link) { flex-shrink: 1; min-width: 0; }
2788
+ }
2789
+ @container ocpv2-child-header (width < calc(8em + 200px)) {
2790
+ .ocpv2-panel-child.sp-floating .ocpv2-child-crumbs > :not(:first-child) { display: none; }
2791
+ .ocpv2-panel-child.sp-floating .ocpv2-child-crumbs { flex-shrink: 0; max-width: none; }
2792
+ .ocpv2-panel-child.sp-floating .ocpv2-session-btn { flex: 1 1 0; }
2793
+ .ocpv2-panel-child.sp-floating .ocpv2-child-parent-label { display: none; }
2794
+ .ocpv2-panel-child.sp-floating .ocpv2-child-parent-link {
2795
+ width: var(--fw-header-control-size); height: var(--fw-header-control-size); min-width: 0; padding: 0;
2796
+ }
2797
+ .ocpv2-panel-child.sp-floating .ocpv2-child-parent-arrow { width: auto; height: auto; font-size: 13px; line-height: 1; }
2798
+ }
2799
+ @container ocpv2-child-header (width < calc(9em + 80px)) {
2800
+ .ocpv2-panel-child.sp-floating .ocpv2-btn-slide { display: none; }
2801
+ }
2802
+ @container ocpv2-child-header (width < calc(8em + 77px)) {
2803
+ .ocpv2-panel-child.sp-floating .ocpv2-btn-new { display: none; }
2804
+ }
2731
2805
  .ocpv2-panel-child .ocpv2-child-crumb-sep {
2732
2806
  flex-shrink: 0;
2733
2807
  color: rgba(180, 200, 255, 0.4);
@@ -2736,6 +2810,7 @@ const CHILD_CSS = `
2736
2810
  .ocpv2-panel-child .ocpv2-child-crumb {
2737
2811
  display: inline-flex;
2738
2812
  align-items: center;
2813
+ justify-content: center;
2739
2814
  gap: 4px;
2740
2815
  background: transparent;
2741
2816
  border: 1px solid rgba(255,255,255,0.06);
@@ -2841,12 +2916,15 @@ const CHILD_CSS = `
2841
2916
  color: #ffd591;
2842
2917
  border-color: rgba(245, 165, 36, 0.55);
2843
2918
  }
2844
- /* Waiting for an answer: the one state that needs the user. */
2845
- .ocpv2-session-pill-child.ocpv2-pill-waiting {
2919
+ /* Waiting for an answer: the one state that needs the user. A sub-agent's pill, and a session tab's (an
2920
+ automation whose turn waits on a permission or a question). */
2921
+ .ocpv2-session-pill-child.ocpv2-pill-waiting,
2922
+ .ocpv2-session-pill.ocpv2-pill-waiting {
2846
2923
  border-color: rgba(245, 165, 36, 0.85) !important;
2847
2924
  animation: ocpv2-pill-waiting 1.6s ease-in-out infinite;
2848
2925
  }
2849
- .ocpv2-session-pill-child.ocpv2-pill-waiting .term-minimized-pill-icon { color: #f5a524; }
2926
+ .ocpv2-session-pill-child.ocpv2-pill-waiting .term-minimized-pill-icon,
2927
+ .ocpv2-session-pill.ocpv2-pill-waiting .term-minimized-pill-icon { color: #f5a524; }
2850
2928
  @keyframes ocpv2-pill-waiting {
2851
2929
  0%, 100% { box-shadow: 0 0 0 1px rgba(245, 165, 36, 0.25), 0 0 8px rgba(245, 165, 36, 0.2); }
2852
2930
  50% { box-shadow: 0 0 0 1px rgba(245, 165, 36, 0.5), 0 0 16px rgba(245, 165, 36, 0.5); }
@@ -13,7 +13,8 @@ import { registerAutomationSession } from './ocp-v2-automation-ownership.js';
13
13
  import { applyEvent, resolveEventTargets } from './ocp-v2-events.js';
14
14
  import { createCapabilities, gatedRequest } from './ocp-v2-caps.js';
15
15
  import { shouldAutoAccept, autoAcceptRequest, autoAcceptInherited } from './ocp-v2-approvals.js';
16
- import { verifyDescendant, knownDescendant, createReconnectNotifier, requestOwner } from './ocp-v2-rehydrate.js';
16
+ import { verifyDescendant, descendantState, knownDescendant, createReconnectNotifier, requestOwner } from './ocp-v2-rehydrate.js';
17
+ import { createAskTracker, createTurnClock, readOpenAsks, unreadAsksNotice, TURN_LIMIT_MS } from './ocp-v2-send-logic.js';
17
18
 
18
19
  // Request types the connected server answers. Empty against a server that
19
20
  // predates the list; cleared on every disconnect and refilled on reconnect.
@@ -99,6 +100,7 @@ export async function connect() {
99
100
  catch (err) { console.warn('[ocp-v2-ws] identify failed', err); }
100
101
  _connecting = null;
101
102
  _reconnects.opened();
103
+ asksOpened();
102
104
  resolve(ws);
103
105
  });
104
106
 
@@ -114,7 +116,11 @@ export async function connect() {
114
116
  _connecting = null;
115
117
  capabilities.clear();
116
118
  _reconnects.closed();
117
- for (const [, p] of _pending) p.reject(new Error('websocket closed'));
119
+ for (const [, p] of _pending) { p.timeout.cancel(); p.reject(new Error('websocket closed')); }
120
+ // What waits on the user is not known again until the server's lists are read after the reconnect
121
+ // (rebuildAsks): until then no turn's clock counts. A socket that never opened lost nothing.
122
+ if (opened) _asks.hold();
123
+ asksClosed();
118
124
  _pending.clear();
119
125
  broadcastServerStatus({ status: 'reconnecting' });
120
126
  setTimeout(() => { connect().catch(() => {}); }, 1500);
@@ -139,6 +145,21 @@ function broadcastServerStatus(payload) {
139
145
  for (const store of _allStores) store.setServerStatus(payload);
140
146
  }
141
147
 
148
+ // Why OpenCode cannot be used, as the server says it (an OpenCode version
149
+ // SynaBun does not speak, a port held by an OpenCode 2 server it did not start,
150
+ // a web page where the API should be): one line in each panel's error list,
151
+ // never a second copy of the same sentence while the panel keeps retrying.
152
+ function broadcastServerProblem(text) {
153
+ const message = typeof text === 'string' ? text.trim().slice(0, 600) : '';
154
+ if (!message) return;
155
+ const stores = _allStores.size ? [..._allStores] : [getDefaultStore()];
156
+ for (const store of stores) {
157
+ const errors = store.getState?.().errors || [];
158
+ if (errors.some((err) => err?.message === message)) continue;
159
+ store.pushError?.({ message, kind: 'server' });
160
+ }
161
+ }
162
+
142
163
  export function disconnect() {
143
164
  if (_ws) {
144
165
  try { _ws.close(); } catch {}
@@ -160,6 +181,7 @@ export function subscribeSession(sessionId, store) {
160
181
  let set = _storesBySession.get(sessionId);
161
182
  if (!set) { set = new Set(); _storesBySession.set(sessionId, set); }
162
183
  set.add(store);
184
+ readAsksOf(sessionId);
163
185
  return () => {
164
186
  const s = _storesBySession.get(sessionId);
165
187
  if (s) {
@@ -195,6 +217,7 @@ function handleMessage(msg) {
195
217
  // Broadcast to every registered store; also poke the default singleton
196
218
  // so legacy callers (no panel registered yet) still see status.
197
219
  broadcastServerStatus(payload);
220
+ if (msg.status === 'error' && msg.error) broadcastServerProblem(msg.error);
198
221
  return;
199
222
  }
200
223
 
@@ -206,6 +229,7 @@ function handleMessage(msg) {
206
229
  if (msg.type === 'capabilities') {
207
230
  capabilities.set(msg.capabilities);
208
231
  _reconnects.capabilities();
232
+ asksReady();
209
233
  return;
210
234
  }
211
235
 
@@ -216,6 +240,7 @@ function handleMessage(msg) {
216
240
  if (msg.nativeRunId && msg.nativeRootSessionId) {
217
241
  registerAutomationSession(msg.nativeRootSessionId, msg.nativeRunId);
218
242
  }
243
+ _asks.note(msg.eventType, msg.event || {});
219
244
  handleEvent(msg.eventType, msg.event || {});
220
245
  fanout(msg.eventType, msg.event || {});
221
246
  return;
@@ -224,10 +249,12 @@ function handleMessage(msg) {
224
249
  if (msg.id != null && _pending.has(msg.id)) {
225
250
  const p = _pending.get(msg.id);
226
251
  _pending.delete(msg.id);
227
- clearTimeout(p.timeout);
252
+ p.timeout.cancel();
228
253
  if (msg.type === 'init:result') {
229
254
  capabilities.set(msg.capabilities);
230
255
  if (typeof msg.sdkVersion === 'string') _sdkVersion = msg.sdkVersion;
256
+ if (msg.ready === false && msg.problem) broadcastServerProblem(msg.problem);
257
+ asksReady();
231
258
  }
232
259
  p.resolve(msg);
233
260
  return;
@@ -265,6 +292,18 @@ function handleEvent(eventType, ev) {
265
292
  // Lets a sub-agent's permission or question reach the panel of its parent
266
293
  // when no child panel is open for it.
267
294
  const _parentOf = new Map();
295
+
296
+ // Requests that wait on the user, by session (a sub-agent's count for its parent): a turn's send does not
297
+ // count the time they wait (createTurnClock). A permission left open for more than 30 minutes used to end
298
+ // the turn's send with "request timeout: message:send" while the turn went on in OpenCode. Across a lost
299
+ // socket they are held from the close and read again from the server after the reconnect (rebuildAsks); a
300
+ // session a panel is bound to after the page loaded has its own read once (readAsksOf).
301
+ const _asks = createAskTracker({ parentOf: _parentOf });
302
+ /** True while `sessionId`, or a sub-agent below it, waits on a permission or a question. */
303
+ export const sessionWaitsOnUser = (sessionId) => _asks.waits(sessionId);
304
+ /** `listener()` whenever what waits on the user may have changed; returns an unsubscribe. */
305
+ export const onAsksChanged = (listener) => _asks.subscribe(listener);
306
+
268
307
  function rememberParent(ev) {
269
308
  const info = ev?.info || ev?.session || ev || {};
270
309
  const childId = info.id || ev?.sessionID || ev?.sessionId;
@@ -316,15 +355,19 @@ const _rootSessions = new Set();
316
355
  * from the session itself. Anything that cannot be established is false.
317
356
  */
318
357
  export function isDescendantSession(sessionId, ancestorId) {
319
- return verifyDescendant(sessionId, ancestorId, {
320
- parentOf: _parentOf,
321
- roots: _rootSessions,
322
- fetchParent: async (id) => {
323
- const res = await api.sessionGet(id);
324
- if (!res || res.error || (typeof res.status === 'number' && res.status >= 400) || !res.data?.id) return null;
325
- return String(res.data.parentID || res.data.parentId || '');
326
- },
327
- });
358
+ return verifyDescendant(sessionId, ancestorId, { parentOf: _parentOf, roots: _rootSessions, fetchParent: fetchSessionParent });
359
+ }
360
+
361
+ // The same question with "could not be read" kept apart from "no" (true, false or null): what the open
362
+ // requests read from the server need, so that a sub-agent whose place is unknown keeps its parent waiting.
363
+ function sessionAncestry(sessionId, ancestorId) {
364
+ return descendantState(sessionId, ancestorId, { parentOf: _parentOf, roots: _rootSessions, fetchParent: fetchSessionParent });
365
+ }
366
+
367
+ async function fetchSessionParent(id) {
368
+ const res = await api.sessionGet(id);
369
+ if (!res || res.error || (typeof res.status === 'number' && res.status >= 400) || !res.data?.id) return null;
370
+ return String(res.data.parentID || res.data.parentId || '');
328
371
  }
329
372
 
330
373
  /**
@@ -336,11 +379,135 @@ export function isKnownDescendantSession(sessionId, ancestorId) {
336
379
  return knownDescendant(sessionId, ancestorId, _parentOf);
337
380
  }
338
381
 
382
+ // ── What waits on the user, read from the server ───────────────────────────
383
+ // The stream says what is asked and answered while the socket is up. What was asked before (the page loaded,
384
+ // a panel was bound to another session, the socket was down) is read from the server (permission:list and
385
+ // question:list, on OpenCode 1 and 2 alike), one session at a time: its clocks wait until then. After a
386
+ // reconnect every bound session is read again (rebuildAsks). A list that cannot be read is read again a few
387
+ // times; then the session's clocks count again and its panel says so (noteUnreadAsks).
388
+
389
+ // A sub-agent runs on its parent's serve, in its folder: a bound parent's lists hold its requests too.
390
+ function underSession(sessionId, isAncestor) {
391
+ let cursor = parentSessionOf(sessionId);
392
+ for (let depth = 0; cursor && depth < 12; depth++) {
393
+ if (isAncestor(cursor)) return true;
394
+ cursor = parentSessionOf(cursor);
395
+ }
396
+ return false;
397
+ }
398
+
399
+ // The sessions whose lists were read (or are out) since the socket opened.
400
+ const _asksRead = new Set();
401
+ // Bound sessions waiting for the socket to say what it serves before their lists are read.
402
+ const _asksUnread = new Set();
403
+ let _asksReady = false;
404
+ let _asksReadyTimer = null;
405
+ let _asksFlushTimer = null;
406
+ const asksKnown = (sessionId) => _asksRead.has(sessionId) || underSession(sessionId, (id) => _asksRead.has(id));
407
+
408
+ function askSession(sessionId, kinds) {
409
+ const s = [...(_storesBySession.get(sessionId) || [])][0]?.getState?.() || {};
410
+ return { sessionId, cwd: s.cwd || s.sessionInfo?.directory || undefined, ...(kinds ? { kinds } : {}) };
411
+ }
412
+
413
+ // `want`: null for every bound session (not one under another), else the sessions (and lists) to read.
414
+ // The first read of sessions bound at a page load (or later) looks up no sub-agent's place: the panel manager
415
+ // reads the session tree right then, for the pills, and the read again a second later finds the links it
416
+ // learned (a list holding a request whose place is not known yet is unresolved meanwhile: its session waits).
417
+ // After a reconnect the tree is known; only a sub-agent spawned during the outage is looked up.
418
+ function readAsks(want, { attempt = 1, partial = false } = {}) {
419
+ const bound = new Set(_storesBySession.keys());
420
+ const sessions = want
421
+ ? want.filter(({ sessionId }) => bound.has(sessionId)).map(({ sessionId, kinds }) => askSession(sessionId, kinds))
422
+ : [...bound].filter((sessionId) => !underSession(sessionId, (id) => bound.has(id))).map((sessionId) => askSession(sessionId));
423
+ for (const { sessionId } of sessions) _asksRead.add(sessionId);
424
+ return readOpenAsks(api, sessions, {
425
+ ancestry: sessionAncestry,
426
+ known: (owner, root) => knownDescendant(owner, root, _parentOf),
427
+ ...(partial && attempt === 1 ? { maxLookups: 0 } : {}),
428
+ });
429
+ }
430
+
431
+ // The tracker gave up on some lists: the panels of those sessions say that their clock counts again.
432
+ function noteUnreadAsks(result) {
433
+ if (!result) return;
434
+ const lost = result.unread
435
+ ? [..._storesBySession.keys()].map((sessionId) => ({ sessionId, kinds: undefined }))
436
+ : result.gaveUp || [];
437
+ for (const { sessionId, kinds } of lost) {
438
+ const message = unreadAsksNotice(kinds);
439
+ for (const store of _storesBySession.get(sessionId) || []) {
440
+ if ((store.getState?.().errors || []).some((err) => err?.message === message)) continue;
441
+ store.pushError?.({ message, notice: true });
442
+ }
443
+ }
444
+ }
445
+
446
+ function rebuildAsks() {
447
+ return _asks.rebuild(readAsks).then(noteUnreadAsks);
448
+ }
449
+
450
+ // A session a panel was bound to: unless its lists (or a bound parent's) were read since the socket opened,
451
+ // its clocks wait from now and its lists are read once the socket can serve them.
452
+ function readAsksOf(sessionId) {
453
+ if (!sessionId || asksKnown(sessionId) || _asksUnread.has(sessionId)) return;
454
+ _asksUnread.add(sessionId);
455
+ _asks.expect([sessionId]);
456
+ flushAsksSoon();
457
+ }
458
+
459
+ function flushAsksSoon() {
460
+ if (_asksFlushTimer || !_asksReady || !_asksUnread.size) return;
461
+ _asksFlushTimer = setTimeout(() => {
462
+ _asksFlushTimer = null;
463
+ if (!_asksReady) return;
464
+ // Those no panel is bound to any more are let go by the tracker (not in its answer); those whose lists
465
+ // were read meanwhile (their own, or a bound parent's) wait for nothing more.
466
+ // A sub-agent read in the same go as its parent is read with it.
467
+ const batch = [..._asksUnread];
468
+ const known = batch.filter((sessionId) => _storesBySession.has(sessionId)
469
+ && (asksKnown(sessionId) || underSession(sessionId, (id) => id !== sessionId && batch.includes(id) && _storesBySession.has(id))));
470
+ const sessions = batch.filter((sessionId) => !known.includes(sessionId));
471
+ _asksUnread.clear();
472
+ if (known.length) _asks.release(known);
473
+ if (!sessions.length) return;
474
+ _asks.rebuild(readAsks, { sessions }).then(noteUnreadAsks)
475
+ .catch((err) => console.warn('[ocp-v2-ws] reading the open questions failed', err));
476
+ }, 0);
477
+ }
478
+
479
+ // The lists can be asked for once the socket said what it serves (capabilities, init:result), or, from a
480
+ // server that does not say, a moment after it opened.
481
+ function asksOpened() {
482
+ clearTimeout(_asksReadyTimer);
483
+ _asksReadyTimer = setTimeout(asksReady, 1500);
484
+ }
485
+
486
+ function asksReady() {
487
+ clearTimeout(_asksReadyTimer);
488
+ _asksReadyTimer = null;
489
+ if (!isConnected()) return;
490
+ _asksReady = true;
491
+ flushAsksSoon();
492
+ }
493
+
494
+ // (A session still to be read stays so: a socket that never opened read nothing, and after a reconnect
495
+ // rebuildAsks reads every bound session anyway.)
496
+ function asksClosed() {
497
+ clearTimeout(_asksReadyTimer);
498
+ clearTimeout(_asksFlushTimer);
499
+ _asksReadyTimer = null;
500
+ _asksFlushTimer = null;
501
+ _asksReady = false;
502
+ _asksRead.clear();
503
+ }
504
+
339
505
  // The socket came back after an outage: whatever was sent meanwhile reached no
340
506
  // panel. Listeners re-read their session (the primary panel does it through its
341
507
  // auto-heal; the panel manager does it for the sub-agent panel).
342
508
  const _reconnectListeners = new Set();
343
509
  const _reconnects = createReconnectNotifier(() => {
510
+ rebuildAsks().catch((err) => console.warn('[ocp-v2-ws] reading the open questions again failed', err));
344
511
  for (const fn of _reconnectListeners) {
345
512
  try { fn(); } catch (e) { console.warn('[ocp-v2-ws] reconnect listener error', e); }
346
513
  }
@@ -462,14 +629,23 @@ function fanout(eventType, ev) {
462
629
 
463
630
  // ── Request/response (id-correlated, 30s default timeout) ──
464
631
 
465
- function request(payload, timeoutMs = 30000) {
632
+ // `turnOf`: the session whose turn the request waits for (a prompt, a command). Its clock stops while that
633
+ // session waits on the user, so only working time counts toward `timeoutMs` (createTurnClock).
634
+ function request(payload, timeoutMs = 30000, { turnOf = '' } = {}) {
466
635
  return new Promise(async (resolve, reject) => {
467
636
  try { await connect(); } catch (e) { return reject(e); }
468
637
  const id = ++_reqSeq;
469
- const timeout = setTimeout(() => {
638
+ const expire = () => {
470
639
  _pending.delete(id);
471
640
  reject(new Error(`request timeout: ${payload.type}`));
472
- }, timeoutMs);
641
+ };
642
+ let timeout;
643
+ if (turnOf) {
644
+ timeout = createTurnClock({ ms: timeoutMs, paused: () => sessionWaitsOnUser(turnOf), subscribe: onAsksChanged, onExpire: expire });
645
+ } else {
646
+ const timer = setTimeout(expire, timeoutMs);
647
+ timeout = { cancel: () => clearTimeout(timer) };
648
+ }
473
649
  _pending.set(id, { resolve, reject, timeout });
474
650
  _ws.send(JSON.stringify({ ...payload, id }));
475
651
  });
@@ -488,7 +664,7 @@ export const api = {
488
664
  sessionContext: ({ sessionId, cwd } = {}) => request({ type: 'session:context', sessionId, cwd }),
489
665
  // `human` / `greetingId`: lib/greeting/ (a server that does not know them ignores them).
490
666
  send: ({ sessionId, parts, model, agent, mode, variant, cwd, mcpProfile, noAbortPrev, human, greetingId }) =>
491
- request({ type: 'message:send', sessionId, parts, model, agent, mode, variant, cwd, mcpProfile, noAbortPrev: !!noAbortPrev, ...(human ? { human: true } : {}), ...(greetingId ? { greetingId } : {}) }, 30 * 60 * 1000),
667
+ request({ type: 'message:send', sessionId, parts, model, agent, mode, variant, cwd, mcpProfile, noAbortPrev: !!noAbortPrev, ...(human ? { human: true } : {}), ...(greetingId ? { greetingId } : {}) }, TURN_LIMIT_MS, { turnOf: sessionId }),
492
668
  abort: (sessionId) => request({ type: 'message:abort', sessionId }),
493
669
  compact: ({ sessionId, cwd, mcpProfile, model } = {}) => request({ type: 'session:compact', sessionId, cwd, mcpProfile, model }, 5 * 60 * 1000),
494
670
  permissionReply: ({ sessionId, permissionId, response, cwd, message }) =>
@@ -515,7 +691,7 @@ export const api = {
515
691
  commandList: ({ cwd } = {}) => gated({ type: 'command:list', cwd }),
516
692
  // A command is a turn: it can run as long as a prompt does.
517
693
  commandRun: ({ sessionId, command, arguments: args, agent, model, variant, parts, cwd, mcpProfile } = {}) =>
518
- gated({ type: 'command:run', sessionId, command, arguments: args, agent, model, variant, parts, cwd, mcpProfile }, 30 * 60 * 1000),
694
+ gated({ type: 'command:run', sessionId, command, arguments: args, agent, model, variant, parts, cwd, mcpProfile }, TURN_LIMIT_MS, { turnOf: sessionId }),
519
695
  sessionShell: ({ sessionId, command, agent, model, cwd, mcpProfile } = {}) =>
520
696
  gated({ type: 'session:shell', sessionId, command, agent, model, cwd, mcpProfile }, 10 * 60 * 1000),
521
697
  findFiles: ({ query, cwd, dirs } = {}) => gated({ type: 'find:files', query, cwd, dirs }, 10000),
@@ -541,6 +717,6 @@ export const api = {
541
717
  envStatus: ({ sessionId, cwd } = {}) => gated({ type: 'env:status', sessionId, cwd }),
542
718
  };
543
719
 
544
- function gated(payload, timeoutMs) {
545
- return gatedRequest(capabilities, request, payload, timeoutMs);
720
+ function gated(payload, timeoutMs, options) {
721
+ return gatedRequest(capabilities, request, payload, timeoutMs, options);
546
722
  }
@@ -0,0 +1,39 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — OpenCode's providers, as the pickers read them
3
+ // ═══════════════════════════════════════════
4
+ // GET /api/opencode/providers/full?view=compact: the connected providers only,
5
+ // with every field their models carry (the whole models.dev catalog is
6
+ // megabytes, and only Settings → OpenCode lists it). One copy in the data
7
+ // cache (data-cache.js) for every module that reads it: the OpenCode panel's
8
+ // model and variant pickers, its context gauge and composer, the Assistant's
9
+ // and the Studios' model lists. A provider change (`ocp-providers-changed`,
10
+ // which reaches every window: the OpenCode socket where a panel is open, the
11
+ // sync socket everywhere) drops it and asks for it again at once.
12
+
13
+ import { createDataCache } from './data-cache.js';
14
+ import { registerLaunchPrefetch } from './launch-prefetch.js';
15
+
16
+ export const OPENCODE_PROVIDERS_URL = '/api/opencode/providers/full?view=compact';
17
+
18
+ export const opencodeProviders = createDataCache('opencode-providers', {
19
+ ttlMs: 5 * 60_000,
20
+ persist: true,
21
+ load: async (_key, { force }) => {
22
+ const resp = await fetch(force ? `${OPENCODE_PROVIDERS_URL}&refresh=1` : OPENCODE_PROVIDERS_URL);
23
+ // A body that is not JSON (a web page) throws: nothing is kept.
24
+ return resp.json();
25
+ },
26
+ // Only a provider list is kept: `{ ok: false }` (the serve is not running, an error) never is.
27
+ accept: (body) => !!body && body.ok !== false && !!body.data && typeof body.data === 'object' && !Array.isArray(body.data),
28
+ });
29
+
30
+ /** The parsed body `{ ok, data: { all, default, connected } }`, connected providers only. */
31
+ export function fetchOpencodeProviders({ force = false } = {}) {
32
+ return opencodeProviders.get('', { force });
33
+ }
34
+
35
+ if (typeof document !== 'undefined') {
36
+ document.addEventListener('ocp-providers-changed', () => opencodeProviders.invalidate('', { refetch: true }));
37
+ // Launch: read once the page has painted, so the first OpenCode picker opens from it.
38
+ registerLaunchPrefetch('opencode-providers', () => opencodeProviders.prefetch(''), { order: 8, owner: true });
39
+ }