synabun 2.0.9 → 2.1.0

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 (679) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +68 -4
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +2 -2
  6. package/hooks/claude-code/pre-websearch.mjs +12 -1
  7. package/hooks/claude-code/shared.mjs +5 -0
  8. package/hooks/claude-code/stop.mjs +1 -1
  9. package/launcher.mjs +9 -3
  10. package/lib/claude-hooks.js +172 -18
  11. package/lib/client-config-repair.js +17 -8
  12. package/lib/desktop-app.js +7 -1
  13. package/lib/external-tools.js +1 -1
  14. package/lib/first-launch-protection.js +57 -12
  15. package/lib/mcp-dist.js +176 -0
  16. package/lib/release-npm-ci.mjs +138 -0
  17. package/lib/release-publish.mjs +91 -0
  18. package/lib/release-scan.mjs +50 -0
  19. package/lib/server-crash-record.js +123 -0
  20. package/lib/server-exit.js +318 -0
  21. package/lib/server-supervisor.js +508 -0
  22. package/lib/start-launcher.js +43 -5
  23. package/lib/tools-cli.js +45 -0
  24. package/lib/update-snapshot.js +228 -0
  25. package/lib/virustotal.mjs +192 -0
  26. package/lib/windows-crash-event.js +269 -0
  27. package/mcp-server/dist/http.d.ts +20 -1
  28. package/mcp-server/dist/http.d.ts.map +1 -1
  29. package/mcp-server/dist/http.js +59 -12
  30. package/mcp-server/dist/http.js.map +1 -1
  31. package/mcp-server/dist/index.d.ts +33 -27
  32. package/mcp-server/dist/index.d.ts.map +1 -1
  33. package/mcp-server/dist/index.js +128 -143
  34. package/mcp-server/dist/index.js.map +1 -1
  35. package/mcp-server/dist/preload.js +1 -1
  36. package/mcp-server/dist/preload.js.map +1 -1
  37. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  38. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  39. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  40. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  41. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  42. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  43. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  44. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  45. package/mcp-server/dist/services/neural-interface.d.ts +16 -10
  46. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  47. package/mcp-server/dist/services/neural-interface.js +67 -11
  48. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  49. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  50. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  51. package/mcp-server/dist/services/server-instructions.js +20 -62
  52. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  53. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  54. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  55. package/mcp-server/dist/services/tool-catalog.js +339 -0
  56. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  57. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  58. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  59. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  60. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  61. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  62. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  63. package/mcp-server/dist/services/tool-list.js +334 -0
  64. package/mcp-server/dist/services/tool-list.js.map +1 -0
  65. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  66. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  67. package/mcp-server/dist/services/tool-runtime.js +400 -0
  68. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  69. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  70. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  71. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  72. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  73. package/mcp-server/dist/tools/agents.d.ts +10 -10
  74. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  75. package/mcp-server/dist/tools/agents.js +22 -13
  76. package/mcp-server/dist/tools/agents.js.map +1 -1
  77. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  78. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  79. package/mcp-server/dist/tools/image-tools.js +1 -1
  80. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  81. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  82. package/mcp-server/dist/tools/skill-tools.js +639 -0
  83. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  84. package/mcp-server/dist/tools/skill.d.ts +7 -0
  85. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  86. package/mcp-server/dist/tools/skill.js +11 -0
  87. package/mcp-server/dist/tools/skill.js.map +1 -0
  88. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  89. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  90. package/mcp-server/dist/tools/tool-groups.js +147 -0
  91. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  92. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  93. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  94. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  95. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  96. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  97. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  98. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  99. package/mcp-server/package-lock.json +2 -2
  100. package/mcp-server/package.json +1 -1
  101. package/mcp-server/src/http.ts +75 -12
  102. package/mcp-server/src/index.ts +147 -154
  103. package/mcp-server/src/preload.ts +12 -12
  104. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  105. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  106. package/mcp-server/src/services/neural-interface.ts +79 -20
  107. package/mcp-server/src/services/server-instructions.ts +27 -63
  108. package/mcp-server/src/services/tool-catalog.ts +403 -0
  109. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  110. package/mcp-server/src/services/tool-list.ts +410 -0
  111. package/mcp-server/src/services/tool-runtime.ts +457 -0
  112. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  113. package/mcp-server/src/tools/agents.ts +22 -14
  114. package/mcp-server/src/tools/image-tools.ts +1 -1
  115. package/mcp-server/src/tools/skill-tools.ts +589 -0
  116. package/mcp-server/src/tools/skill.ts +13 -0
  117. package/mcp-server/src/tools/tool-groups.ts +164 -0
  118. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  119. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  120. package/neural-interface/i18n/en.json +3680 -206
  121. package/neural-interface/i18n/pt-BR.json +3628 -157
  122. package/neural-interface/lib/account-usage.js +5 -3
  123. package/neural-interface/lib/app-controls-api.js +161 -0
  124. package/neural-interface/lib/assistant-api.js +148 -35
  125. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  126. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  127. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  128. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  129. package/neural-interface/lib/assistant-brains/opencode.js +122 -44
  130. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +59 -0
  131. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +97 -0
  132. package/neural-interface/lib/assistant-catalog.js +23 -9
  133. package/neural-interface/lib/assistant-dispatch.js +874 -156
  134. package/neural-interface/lib/assistant-envelope.js +22 -2
  135. package/neural-interface/lib/assistant-persona.js +80 -11
  136. package/neural-interface/lib/assistant-plan-permissions.js +10 -9
  137. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  138. package/neural-interface/lib/assistant-route-gate.js +6 -4
  139. package/neural-interface/lib/assistant-router.js +13 -8
  140. package/neural-interface/lib/assistant-runtime.js +183 -26
  141. package/neural-interface/lib/assistant-task-prompt.js +78 -14
  142. package/neural-interface/lib/assistant-tools.js +51 -0
  143. package/neural-interface/lib/backup-service.js +620 -3
  144. package/neural-interface/lib/backup-zip-reader.js +10 -5
  145. package/neural-interface/lib/backup-zip-writer.js +257 -0
  146. package/neural-interface/lib/browser-execution.js +10 -2
  147. package/neural-interface/lib/browser-guard-cdp.js +83 -0
  148. package/neural-interface/lib/browser-network-guard.js +284 -0
  149. package/neural-interface/lib/browser-policy-roots.js +64 -0
  150. package/neural-interface/lib/browser-tool-policy.js +186 -31
  151. package/neural-interface/lib/claude-agent-bridge.js +4 -2
  152. package/neural-interface/lib/claude-hooks-status.js +103 -0
  153. package/neural-interface/lib/claude-model-catalog.js +64 -14
  154. package/neural-interface/lib/claude-temporary.js +5 -11
  155. package/neural-interface/lib/cli-install.js +18 -138
  156. package/neural-interface/lib/cli-resolver.js +4 -1
  157. package/neural-interface/lib/cli-update-planner.js +32 -31
  158. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  159. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  160. package/neural-interface/lib/codex-settings-schema.js +109 -47
  161. package/neural-interface/lib/codex-worker-app-server.js +172 -0
  162. package/neural-interface/lib/confined-fs.js +30 -3
  163. package/neural-interface/lib/crash-notice-api.js +98 -0
  164. package/neural-interface/lib/editor-completion-opencode.js +164 -67
  165. package/neural-interface/lib/exec-loop-command.js +4 -1
  166. package/neural-interface/lib/http-guards.js +8 -2
  167. package/neural-interface/lib/install-details.js +4 -1
  168. package/neural-interface/lib/launch-cache.js +293 -0
  169. package/neural-interface/lib/login-start.js +524 -0
  170. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  171. package/neural-interface/lib/mcp-client-config.js +0 -29
  172. package/neural-interface/lib/mcp-external-servers.js +323 -0
  173. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  174. package/neural-interface/lib/morelogin.js +30 -0
  175. package/neural-interface/lib/native-loop-providers.js +565 -50
  176. package/neural-interface/lib/native-loop-runtime.js +287 -41
  177. package/neural-interface/lib/opencode-config.js +557 -0
  178. package/neural-interface/lib/opencode-db-schema.js +58 -0
  179. package/neural-interface/lib/opencode-history.js +49 -204
  180. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  181. package/neural-interface/lib/opencode-native-boundary.js +44 -0
  182. package/neural-interface/lib/opencode-protocol.js +310 -0
  183. package/neural-interface/lib/opencode-provider-view.js +81 -0
  184. package/neural-interface/lib/opencode-runtime-config.js +32 -15
  185. package/neural-interface/lib/opencode-serve-records.js +624 -0
  186. package/neural-interface/lib/opencode-v2-client.js +53 -131
  187. package/neural-interface/lib/opencode-v2-ws-requests.js +35 -195
  188. package/neural-interface/lib/opencode-worker-activity.js +229 -0
  189. package/neural-interface/lib/opencode-worker-data.js +27 -0
  190. package/neural-interface/lib/opencode2-client.js +796 -0
  191. package/neural-interface/lib/opencode2-proxy.js +76 -0
  192. package/neural-interface/lib/opencode2-translate.js +1057 -0
  193. package/neural-interface/lib/owner-authority.js +249 -0
  194. package/neural-interface/lib/page-session.js +275 -0
  195. package/neural-interface/lib/peer-identity.js +763 -0
  196. package/neural-interface/lib/process-identity.js +361 -0
  197. package/neural-interface/lib/request-gate.js +17 -2
  198. package/neural-interface/lib/rulesets/api.js +1 -1
  199. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  200. package/neural-interface/lib/rulesets/installer.js +92 -27
  201. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  202. package/neural-interface/lib/session-cache-builder.js +18 -10
  203. package/neural-interface/lib/session-title-generator.js +58 -18
  204. package/neural-interface/lib/skills/api-v2.js +495 -0
  205. package/neural-interface/lib/skills/bundle.js +418 -0
  206. package/neural-interface/lib/skills/catalog.js +294 -0
  207. package/neural-interface/lib/skills/creation-api.js +191 -0
  208. package/neural-interface/lib/skills/creation-brief.js +247 -0
  209. package/neural-interface/lib/skills/creation-sources.js +267 -0
  210. package/neural-interface/lib/skills/creation.js +843 -0
  211. package/neural-interface/lib/skills/deploy.js +564 -0
  212. package/neural-interface/lib/skills/digest.js +119 -0
  213. package/neural-interface/lib/skills/discover.js +111 -0
  214. package/neural-interface/lib/skills/draft-confinement.js +214 -0
  215. package/neural-interface/lib/skills/eval-confinement.js +397 -0
  216. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  217. package/neural-interface/lib/skills/eval-trace.js +119 -0
  218. package/neural-interface/lib/skills/evals-api.js +212 -0
  219. package/neural-interface/lib/skills/evals.js +1573 -0
  220. package/neural-interface/lib/skills/export.js +200 -0
  221. package/neural-interface/lib/skills/frontmatter.js +64 -0
  222. package/neural-interface/lib/skills/health.js +75 -0
  223. package/neural-interface/lib/skills/json-edit.js +165 -0
  224. package/neural-interface/lib/skills/known-bridge-digests.json +387 -0
  225. package/neural-interface/lib/skills/known-bridges.js +96 -0
  226. package/neural-interface/lib/skills/library.js +823 -0
  227. package/neural-interface/lib/skills/local-store.js +21 -0
  228. package/neural-interface/lib/skills/migration.js +433 -0
  229. package/neural-interface/lib/skills/operations.js +45 -0
  230. package/neural-interface/lib/skills/ownership.js +427 -0
  231. package/neural-interface/lib/skills/packages.js +88 -0
  232. package/neural-interface/lib/skills/reviews.js +212 -0
  233. package/neural-interface/lib/skills/revision.js +80 -0
  234. package/neural-interface/lib/skills/roots.js +262 -0
  235. package/neural-interface/lib/skills/runtime-checks.js +355 -0
  236. package/neural-interface/lib/skills/scan-assets.js +252 -0
  237. package/neural-interface/lib/skills/scan-context.js +26 -0
  238. package/neural-interface/lib/skills/scan-shell.js +324 -0
  239. package/neural-interface/lib/skills/scan.js +364 -0
  240. package/neural-interface/lib/skills/scanners.js +54 -0
  241. package/neural-interface/lib/skills/service.js +522 -0
  242. package/neural-interface/lib/skills/telemetry.js +113 -0
  243. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  244. package/neural-interface/lib/style-guide/api.js +4 -3
  245. package/neural-interface/lib/tool-lists.js +124 -0
  246. package/neural-interface/lib/untrusted-file-headers.js +27 -0
  247. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  248. package/neural-interface/lib/worker-confinement.js +1192 -0
  249. package/neural-interface/lib/worker-guard-setting.js +56 -0
  250. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  251. package/neural-interface/lib/worker-relay-ports.js +227 -0
  252. package/neural-interface/lib/worker-resume.js +229 -0
  253. package/neural-interface/lib/worker-sandbox.js +299 -0
  254. package/neural-interface/package-lock.json +1354 -50
  255. package/neural-interface/package.json +6 -2
  256. package/neural-interface/public/index.html +5 -3
  257. package/neural-interface/public/index2d.html +19 -11
  258. package/neural-interface/public/onboarding.html +2 -2
  259. package/neural-interface/public/shared/account-menu.js +8 -5
  260. package/neural-interface/public/shared/agent-runtime-options.js +76 -16
  261. package/neural-interface/public/shared/api.js +1527 -1336
  262. package/neural-interface/public/shared/app-frame.js +192 -0
  263. package/neural-interface/public/shared/assistant/asst-agents-dock.js +205 -19
  264. package/neural-interface/public/shared/assistant/asst-api.js +11 -3
  265. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  266. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  267. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  268. package/neural-interface/public/shared/assistant/asst-brain-picker.js +241 -112
  269. package/neural-interface/public/shared/assistant/asst-composer.js +1 -1
  270. package/neural-interface/public/shared/assistant/asst-control.js +157 -26
  271. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  272. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  273. package/neural-interface/public/shared/assistant/asst-hosts.js +49 -2
  274. package/neural-interface/public/shared/assistant/asst-limit-dock.js +40 -0
  275. package/neural-interface/public/shared/assistant/asst-limit-wait.js +294 -0
  276. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  277. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  278. package/neural-interface/public/shared/assistant/asst-menu.js +84 -12
  279. package/neural-interface/public/shared/assistant/asst-panel.js +303 -44
  280. package/neural-interface/public/shared/assistant/asst-rack-styles.js +93 -58
  281. package/neural-interface/public/shared/assistant/asst-redact.js +186 -0
  282. package/neural-interface/public/shared/assistant/asst-render.js +770 -100
  283. package/neural-interface/public/shared/assistant/asst-route.js +83 -12
  284. package/neural-interface/public/shared/assistant/asst-run-stage.js +231 -0
  285. package/neural-interface/public/shared/assistant/asst-sanitize.js +193 -3
  286. package/neural-interface/public/shared/assistant/asst-scene-styles.js +273 -0
  287. package/neural-interface/public/shared/assistant/asst-scenes.js +530 -0
  288. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +3 -15
  289. package/neural-interface/public/shared/assistant/asst-sidepanel.js +67 -4
  290. package/neural-interface/public/shared/assistant/asst-slash.js +9 -7
  291. package/neural-interface/public/shared/assistant/asst-state.js +25 -15
  292. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  293. package/neural-interface/public/shared/assistant/asst-styles.js +102 -21
  294. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +165 -13
  295. package/neural-interface/public/shared/automation-context.js +5 -2
  296. package/neural-interface/public/shared/cc-dropdown.js +550 -0
  297. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  298. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  299. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  300. package/neural-interface/public/shared/cdx/cdx-output.js +8 -7
  301. package/neural-interface/public/shared/cdx/cdx-panel.js +58 -150
  302. package/neural-interface/public/shared/cdx/cdx-protocol.js +28 -1
  303. package/neural-interface/public/shared/cdx/cdx-render.js +62 -32
  304. package/neural-interface/public/shared/cdx/cdx-requests.js +3 -3
  305. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  306. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  307. package/neural-interface/public/shared/cdx/cdx-tabs.js +201 -74
  308. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  309. package/neural-interface/public/shared/cli-install-view.js +4 -8
  310. package/neural-interface/public/shared/cli-status.js +2 -2
  311. package/neural-interface/public/shared/constants.js +2 -2
  312. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  313. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  314. package/neural-interface/public/shared/context-menu-model.js +366 -0
  315. package/neural-interface/public/shared/context-menu.js +372 -0
  316. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  317. package/neural-interface/public/shared/cp/cp-markdown.js +4 -57
  318. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  319. package/neural-interface/public/shared/data-cache.js +223 -0
  320. package/neural-interface/public/shared/desktop-bridge.js +11 -0
  321. package/neural-interface/public/shared/desktop-titlebar-view.js +78 -1
  322. package/neural-interface/public/shared/desktop-titlebar.js +214 -28
  323. package/neural-interface/public/shared/desktop-update-view.js +35 -5
  324. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  325. package/neural-interface/public/shared/file-links.js +73 -8
  326. package/neural-interface/public/shared/html-shell.js +78 -86
  327. package/neural-interface/public/shared/i18n.js +2 -0
  328. package/neural-interface/public/shared/launch-prefetch.js +59 -0
  329. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  330. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  331. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +3 -2
  332. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  333. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +9 -2
  334. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  335. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  336. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  337. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  338. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  339. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  340. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +54 -17
  341. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  342. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +140 -254
  343. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  344. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +97 -203
  345. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +11 -9
  346. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +15 -4
  347. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -22
  348. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +401 -0
  349. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +20 -13
  350. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  351. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +53 -82
  352. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  353. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  354. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  355. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  356. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +48 -40
  357. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  358. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +205 -62
  359. package/neural-interface/public/shared/opencode-providers.js +39 -0
  360. package/neural-interface/public/shared/page-session.js +96 -0
  361. package/neural-interface/public/shared/registry.js +5 -3
  362. package/neural-interface/public/shared/retired-2d.js +3 -0
  363. package/neural-interface/public/shared/schedules-view.js +452 -0
  364. package/neural-interface/public/shared/settings/settings-app-pane.js +335 -0
  365. package/neural-interface/public/shared/settings/settings-app.js +243 -0
  366. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  367. package/neural-interface/public/shared/settings/settings-data.js +90 -0
  368. package/neural-interface/public/shared/settings/settings-ia.js +23 -6
  369. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  370. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  371. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  372. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  373. package/neural-interface/public/shared/sidepanel-session-status.js +49 -0
  374. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  375. package/neural-interface/public/shared/skills/ss-creation.js +219 -0
  376. package/neural-interface/public/shared/skills/ss-dialog.js +130 -0
  377. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  378. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  379. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  380. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  381. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  382. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  383. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  384. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  385. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  386. package/neural-interface/public/shared/skills/ss-lint.js +141 -0
  387. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  388. package/neural-interface/public/shared/skills/ss-profiles.js +475 -0
  389. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  390. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  391. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  392. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  393. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  394. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  395. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  396. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +236 -0
  397. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  398. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  399. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  400. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  401. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  402. package/neural-interface/public/shared/skills/studio/sx-dom.js +229 -0
  403. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  404. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  405. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  406. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  407. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  408. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  409. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +279 -0
  410. package/neural-interface/public/shared/skills/studio/sx-install.js +296 -0
  411. package/neural-interface/public/shared/skills/studio/sx-library-view.js +639 -0
  412. package/neural-interface/public/shared/skills/studio/sx-library.js +475 -0
  413. package/neural-interface/public/shared/skills/studio/sx-main.js +681 -0
  414. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  415. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  416. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  417. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  418. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  419. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  420. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  421. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  422. package/neural-interface/public/shared/skills/studio/sx-subject.js +248 -0
  423. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  424. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  425. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  426. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +425 -0
  427. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  428. package/neural-interface/public/shared/styles.css +2065 -2150
  429. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  430. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  431. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  432. package/neural-interface/public/shared/tool-list-view.js +112 -0
  433. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  434. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  435. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  436. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  437. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  438. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  439. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  440. package/neural-interface/public/shared/tour/tour.css +144 -0
  441. package/neural-interface/public/shared/ui-assistant.js +27 -5
  442. package/neural-interface/public/shared/ui-automation-studio.js +155 -152
  443. package/neural-interface/public/shared/ui-bookmarks.js +2 -1
  444. package/neural-interface/public/shared/ui-claude-panel.js +153 -13
  445. package/neural-interface/public/shared/ui-codex-panel.js +1 -0
  446. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  447. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  448. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  449. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  450. package/neural-interface/public/shared/ui-detail.js +21 -9
  451. package/neural-interface/public/shared/ui-file-links.js +1 -0
  452. package/neural-interface/public/shared/ui-image-gallery.js +56 -52
  453. package/neural-interface/public/shared/ui-invite.js +18 -2
  454. package/neural-interface/public/shared/ui-keybinds.js +26 -1
  455. package/neural-interface/public/shared/ui-link.js +9 -9
  456. package/neural-interface/public/shared/ui-menubar.js +229 -40
  457. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  458. package/neural-interface/public/shared/ui-native-loop-router.js +9 -1
  459. package/neural-interface/public/shared/ui-navbar.js +4 -24
  460. package/neural-interface/public/shared/ui-opencode-panel-v2.js +1 -0
  461. package/neural-interface/public/shared/ui-panels.js +96 -65
  462. package/neural-interface/public/shared/ui-schedules-studio.js +2267 -953
  463. package/neural-interface/public/shared/ui-sessions.js +20 -7
  464. package/neural-interface/public/shared/ui-settings.js +679 -496
  465. package/neural-interface/public/shared/ui-sidebar.js +4 -4
  466. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +13 -0
  467. package/neural-interface/public/shared/ui-sidepanel-sessions.js +56 -5
  468. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  469. package/neural-interface/public/shared/ui-sidepanel-tray.js +84 -8
  470. package/neural-interface/public/shared/ui-sidepanel-windows.js +16 -11
  471. package/neural-interface/public/shared/ui-skills.js +42 -2781
  472. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  473. package/neural-interface/public/shared/ui-sync.js +22 -5
  474. package/neural-interface/public/shared/ui-terminal.js +159 -199
  475. package/neural-interface/public/shared/ui-tool-updates.js +3 -1
  476. package/neural-interface/public/shared/ui-tooltip.js +10 -5
  477. package/neural-interface/public/shared/ui-trash.js +14 -5
  478. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  479. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  480. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -61
  481. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  482. package/neural-interface/public/shared/ui-tutorial.js +285 -499
  483. package/neural-interface/public/shared/ui-update.js +121 -16
  484. package/neural-interface/public/shared/ui-whiteboard.js +313 -59
  485. package/neural-interface/public/shared/ui-worker-end.js +4 -0
  486. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  487. package/neural-interface/public/shared/view-variant.js +66 -0
  488. package/neural-interface/public/shared/whatsapp/wa-view.js +1 -1
  489. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  490. package/neural-interface/public/shared/worker-end.js +10 -3
  491. package/neural-interface/public/shared/worker-restart.js +12 -0
  492. package/neural-interface/public/sidepanel-session.html +1 -1
  493. package/neural-interface/public/variant/2d/background.js +2 -1
  494. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  495. package/neural-interface/public/variant/2d/graph.js +42 -20
  496. package/neural-interface/public/variant/2d/hulls.js +14 -9
  497. package/neural-interface/public/variant/2d/lasso.js +11 -7
  498. package/neural-interface/public/variant/2d/main.js +36 -2
  499. package/neural-interface/public/variant/2d/minimap.js +11 -13
  500. package/neural-interface/public/variant/3d/main.js +72 -6
  501. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  502. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  503. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  504. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  505. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  506. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  507. package/neural-interface/public/vendor/highlight/LICENSE +29 -0
  508. package/neural-interface/public/vendor/highlight/github-dark-dimmed-11.12.0.min.css +9 -0
  509. package/neural-interface/public/vendor/highlight/highlight-11.12.0.min.js +1262 -0
  510. package/neural-interface/public/vendor/highlight/manifest.json +5 -0
  511. package/neural-interface/public/vendor/html2canvas/LICENSE +22 -0
  512. package/neural-interface/public/vendor/html2canvas/html2canvas-1.4.1.min.js +20 -0
  513. package/neural-interface/public/vendor/html2canvas/manifest.json +4 -0
  514. package/neural-interface/public/vendor/marked/LICENSE.md +44 -0
  515. package/neural-interface/public/vendor/marked/manifest.json +4 -0
  516. package/neural-interface/public/vendor/marked/marked-14.1.4.esm.js +2502 -0
  517. package/neural-interface/public/vendor/mermaid/LICENSE +21 -0
  518. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/abnfDiagram-PAR5IXJI.mjs +1 -0
  519. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architecture-7GRP2DOG-M7G3SWCO.mjs +1 -0
  520. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/architectureDiagram-2PNWDENW.mjs +36 -0
  521. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/blockDiagram-PUWGUBOA.mjs +129 -0
  522. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/c4Diagram-3NLNHZP5.mjs +38 -0
  523. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-2NMSUPJH.mjs +1 -0
  524. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-32MCUW2P.mjs +206 -0
  525. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3NPNU5GP.mjs +1 -0
  526. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-3SMGFRGC.mjs +1 -0
  527. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4CAJECRU.mjs +14 -0
  528. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-4OADUZ5Q.mjs +10 -0
  529. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IMINLNL.mjs +1 -0
  530. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5IQCK5RY.mjs +3 -0
  531. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-5MVFYWFU.mjs +1 -0
  532. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AQ6EADP3.mjs +1 -0
  533. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-AZZRMDJM.mjs +15 -0
  534. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-CLS4B6BI.mjs +168 -0
  535. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-DZP67EKU.mjs +70 -0
  536. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-EICP7K5X.mjs +1 -0
  537. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-GDY2UAB4.mjs +1 -0
  538. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-H7VHZCWX.mjs +1 -0
  539. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-IJBDOHL6.mjs +1 -0
  540. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JFFVMJIA.mjs +1 -0
  541. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JQRUD6KW.mjs +1 -0
  542. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-JZGDI5JK.mjs +1 -0
  543. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-KD6SPIPN.mjs +2 -0
  544. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NF366YI6.mjs +231 -0
  545. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-NUDPKBEF.mjs +32 -0
  546. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-OJINMHTS.mjs +1 -0
  547. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Q6NGPIAH.mjs +2 -0
  548. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-QJSWEUOL.mjs +132 -0
  549. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-R7JDMUKV.mjs +1 -0
  550. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RCXAM2GK.mjs +1 -0
  551. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-RT4MAWR3.mjs +1 -0
  552. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SFMINX4W.mjs +1 -0
  553. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-SLDQ463B.mjs +88 -0
  554. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-STOV2HOB.mjs +1 -0
  555. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-T5OCTHI4.mjs +1 -0
  556. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-TCEHX7R3.mjs +1 -0
  557. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VQC2EELJ.mjs +1 -0
  558. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VRZKL3EH.mjs +1 -0
  559. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VTHDQ7BV.mjs +1 -0
  560. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-VY2OSTJR.mjs +2 -0
  561. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-WUBWJARI.mjs +1 -0
  562. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YBMQ5JGJ.mjs +2 -0
  563. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-YDMLL4PJ.mjs +1 -0
  564. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-Z6V44ARX.mjs +62 -0
  565. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZJJ7VQJP.mjs +339 -0
  566. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZNLK7HRR.mjs +1 -0
  567. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZQN7UHIL.mjs +1 -0
  568. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZS6VBONO.mjs +174 -0
  569. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/chunk-ZUNWM646.mjs +1 -0
  570. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-FGAMPOII.mjs +1 -0
  571. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/classDiagram-v2-AI5RJEK4.mjs +1 -0
  572. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cose-bilkent-Q72C2OJ3.mjs +1 -0
  573. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefin-OW5HDTMX-6OCTWOGG.mjs +1 -0
  574. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/cynefinDiagram-2OOWUY4M.mjs +62 -0
  575. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/dagre-MPVFI544.mjs +4 -0
  576. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-AE4NWXFW.mjs +24 -0
  577. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-BUJID5UG.mjs +41 -0
  578. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-C44CZ5NI.mjs +24 -0
  579. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-EYOLEXXS.mjs +30 -0
  580. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/diagram-P7B6PWOJ.mjs +3 -0
  581. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ebnfDiagram-FTPZ3PV6.mjs +1 -0
  582. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/erDiagram-H3ERR26V.mjs +99 -0
  583. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/eventmodeling-NTZA5JFV-WKSWQHFS.mjs +1 -0
  584. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/flowDiagram-YHGXBVSY.mjs +1 -0
  585. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ganttDiagram-RWFTB7ED.mjs +292 -0
  586. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraph-4MIJSDKK-JH2HKYUO.mjs +1 -0
  587. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/gitGraphDiagram-MAR6GKOP.mjs +106 -0
  588. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/info-A6RAGUB7-3TX3OFWW.mjs +1 -0
  589. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/infoDiagram-LV547AFH.mjs +2 -0
  590. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/ishikawaDiagram-PUJQGNDS.mjs +70 -0
  591. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/journeyDiagram-EW5QJT4W.mjs +139 -0
  592. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/kanban-definition-JSQERAZB.mjs +89 -0
  593. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/katex-CZ4GXH2S.mjs +257 -0
  594. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/mindmap-definition-VBJCLQLM.mjs +96 -0
  595. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/packet-AYTQ26CC-MKII6P3Y.mjs +1 -0
  596. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pegDiagram-7WILOQTJ.mjs +1 -0
  597. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pie-WAS4IAKB-6B4OPMJ5.mjs +1 -0
  598. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/pieDiagram-EFA7CBSB.mjs +39 -0
  599. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/quadrantDiagram-WARVYA7P.mjs +7 -0
  600. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/radar-RG4KPBEZ-UPTR3XUL.mjs +1 -0
  601. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-74A4TZTK-MEFUPFMS.mjs +1 -0
  602. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-abnf-HS5TGJTU-R5YG2S5D.mjs +1 -0
  603. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-ebnf-LZEXJU2U-G5QEX2L6.mjs +1 -0
  604. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroad-peg-WCYAUIDC-H5I2ZRY2.mjs +1 -0
  605. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/railroadDiagram-5NIQVNLQ.mjs +1 -0
  606. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/requirementDiagram-SXREGOKZ.mjs +84 -0
  607. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sankeyDiagram-VV74M2VP.mjs +40 -0
  608. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sequenceDiagram-52ZFIFDL.mjs +162 -0
  609. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/sizeCapture-FGA5AGYP.mjs +1 -0
  610. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-3QAKPIVI.mjs +1 -0
  611. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/stateDiagram-v2-HN2P4RDZ.mjs +1 -0
  612. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanes-QLVP42QD.mjs +1 -0
  613. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/swimlanesDiagram-JKPDBFCN.mjs +8 -0
  614. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/timeline-definition-GS45XAXW.mjs +120 -0
  615. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treeView-Q6P3EWNA-ZRJGANNQ.mjs +1 -0
  616. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/treemap-WGGIJYW6-K64VN5AS.mjs +1 -0
  617. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/vennDiagram-QIQU2ZRJ.mjs +34 -0
  618. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardley-WFR3VGLG-D67OWCCH.mjs +1 -0
  619. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/wardleyDiagram-U6YNM66N.mjs +78 -0
  620. package/neural-interface/public/vendor/mermaid/chunks/mermaid.esm.min/xychartDiagram-XJAZEDNM.mjs +7 -0
  621. package/neural-interface/public/vendor/mermaid/manifest.json +4 -0
  622. package/neural-interface/public/vendor/mermaid/mermaid-11.17.2.esm.min.mjs +14 -0
  623. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  624. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  625. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  626. package/neural-interface/scripts/build-vendor.mjs +116 -3
  627. package/neural-interface/server.js +4834 -2541
  628. package/neural-interface/templates/rulesets/core.md +1 -1
  629. package/neural-interface/templates/rulesets/legacy-hashes.json +18 -0
  630. package/neural-interface/templates/rulesets/manifest.json +8 -8
  631. package/npm-shrinkwrap.json +18 -12
  632. package/package.json +16 -3
  633. package/postinstall.js +9 -4
  634. package/preuninstall.js +1 -1
  635. package/setup.js +97 -322
  636. package/skills/skill-forge/SKILL.md +177 -0
  637. package/skills/skill-forge/evals/evals.json +54 -0
  638. package/skills/skill-forge/references/package.md +105 -0
  639. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  640. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  641. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  642. package/skills/synabun/SKILL.md +10 -7
  643. package/skills/synabun/modules/audit.md +1 -5
  644. package/skills/synabun/modules/changelog.md +1 -5
  645. package/skills/synabun/modules/idea.md +1 -1
  646. package/skills/synabun/modules/memorize.md +6 -9
  647. package/skills/synabun/modules/schedule.md +5 -5
  648. package/mcp-server/dist/services/profiles.d.ts +0 -120
  649. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  650. package/mcp-server/dist/services/profiles.js +0 -387
  651. package/mcp-server/dist/services/profiles.js.map +0 -1
  652. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  653. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  654. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  655. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  656. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  657. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  658. package/mcp-server/dist/tools/leonardo.js +0 -21
  659. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  660. package/mcp-server/dist/tools/profile.d.ts +0 -17
  661. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  662. package/mcp-server/dist/tools/profile.js +0 -114
  663. package/mcp-server/dist/tools/profile.js.map +0 -1
  664. package/mcp-server/src/services/profiles.ts +0 -428
  665. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  666. package/mcp-server/src/tools/leonardo.ts +0 -30
  667. package/mcp-server/src/tools/profile.ts +0 -122
  668. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  669. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  670. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  671. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  672. package/skills/leonardo/SKILL.md +0 -168
  673. package/skills/leonardo/icon.svg +0 -1
  674. package/skills/leonardo/modules/browser-guide.md +0 -378
  675. package/skills/leonardo/modules/image-prompter.md +0 -283
  676. package/skills/leonardo/modules/model-advisor.md +0 -100
  677. package/skills/leonardo/modules/prompt-library.md +0 -110
  678. package/skills/leonardo/modules/style-guide.md +0 -186
  679. package/skills/leonardo/modules/video-prompter.md +0 -317
@@ -305,8 +305,7 @@ export async function handlePostPlanAction(action, store) {
305
305
  const res = await api.compact({
306
306
  sessionId: at.sessionId,
307
307
  cwd: at.cwd || undefined,
308
- mcpProfile: at.mcpProfile || undefined,
309
- model: at.model || undefined,
308
+ tools: at.tools || undefined,
310
309
  });
311
310
  // The compaction was that session's. On another binding there is no plan
312
311
  // card of it to relabel and nobody to tell about its failure.
@@ -1,3 +1,8 @@
1
+ import { t } from '../i18n.js';
2
+ import { migrateStoredTools } from '../tool-list-storage.js';
3
+ import { wireDropdowns, closeDropdowns, setDropdownDisabled, dropdownOf } from '../cc-dropdown.js';
4
+ import { configureToolPickerTranslation, toolPickerHTML, readToolPicker, updateToolPicker, toolWord } from '../tool-list-picker.js';
5
+ import { fetchToolCatalog } from '../agent-runtime-options.js';
1
6
  // ─────────────────────────────────────────────────────────────────────────────
2
7
  // OpenCode V2 — Project bar (project + branch dropdowns)
3
8
  // Lives at the top of the .ocpv2-compose card, mirroring legacy ocp-projectbar.
@@ -7,11 +12,12 @@
7
12
 
8
13
  import { getDefaultStore } from './ocp-v2-state.js';
9
14
  import { sendTextMessage } from './ocp-v2-send.js';
10
- import { api, onEvent } from './ocp-v2-ws.js';
15
+ import { api, onEvent, capabilities, supports } from './ocp-v2-ws.js';
11
16
  import { captureBinding, latestOnly } from './ocp-v2-binding.js';
12
- import { setSessionMcpProfile } from './ocp-v2-session-actions.js';
17
+ import { setSessionTools } from './ocp-v2-session-actions.js';
13
18
  import { storage } from '../storage.js';
14
19
  import { on } from '../state.js';
20
+ import { escapeHtml } from '../utils.js';
15
21
 
16
22
  let _currentStore = getDefaultStore();
17
23
  const getState = () => _currentStore.getState();
@@ -20,11 +26,11 @@ const subscribe = (l) => _currentStore.subscribe(l);
20
26
  let _root = null;
21
27
  let _projectDd = null;
22
28
  let _branchDd = null;
23
- let _profileDd = null;
29
+ let _toolsDd = null;
24
30
  let _recallDd = null;
25
31
  let _ctx = null;
26
32
  let _unsubscribe = null;
27
- let _profileSyncUnsub = null;
33
+ let _toolsSyncUnsub = null;
28
34
  let _branchCache = new Map(); // path → { branches, current, ts }
29
35
  let _docClickWired = false;
30
36
  let _docClickHandler = null;
@@ -32,58 +38,35 @@ let _docClickHandler = null;
32
38
  let _recallProfile = 'balanced';
33
39
  let _recallLoaded = false;
34
40
 
35
- let _currentProfile = 'full';
36
- let _defaultProfile = 'full';
37
- let _mcpProfiles = []; // [{ id, label, hint }]
38
- let _profileLoaded = false;
39
- let _profileSyncVersion = 0;
40
- const MCP_SESSION_PROFILE_KEY = 'synabun-opencode-session-mcp-profiles';
41
-
42
- function readSessionProfiles() {
43
- try {
44
- const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
45
- return parsed && typeof parsed === 'object' ? parsed : {};
46
- } catch { return {}; }
41
+ let _toolCatalog = null;
42
+ let _toolsSyncVersion = 0;
43
+ let _toolsAbort = null;
44
+ let _capsUnsub = null;
45
+ const MCP_SESSION_TOOLS_KEY = 'synabun-opencode-session-tools';
46
+ function readSessionTools() {
47
+ try { return JSON.parse(storage.getItem(MCP_SESSION_TOOLS_KEY) || '{}') || {}; } catch { return {}; }
47
48
  }
48
-
49
- function savedSessionProfile(sessionId) {
50
- if (!sessionId) return null;
51
- return readSessionProfiles()[sessionId] || null;
49
+ function savedSessionTools(sessionId) { const value = readSessionTools()[sessionId]; return Array.isArray(value) ? value : null; }
50
+ function saveSessionTools(sessionId, tools) {
51
+ if (!sessionId || !Array.isArray(tools)) return;
52
+ storage.setItem(MCP_SESSION_TOOLS_KEY, JSON.stringify({ ...readSessionTools(), [sessionId]: tools }));
52
53
  }
53
-
54
- function saveSessionProfile(sessionId, profile) {
55
- if (!sessionId || !profile) return;
56
- const profiles = readSessionProfiles();
57
- profiles[sessionId] = profile;
58
- storage.setItem(MCP_SESSION_PROFILE_KEY, JSON.stringify(profiles));
59
- }
60
-
61
- async function syncProfileForActiveSession() {
62
- const version = ++_profileSyncVersion;
63
- const state = getState();
64
- // The session this read is for (ocp-v2-binding.js): its answer is that
65
- // session's, and reaches the selector only while the panel is still on it.
54
+ async function syncToolsForActiveSession() {
55
+ const version = ++_toolsSyncVersion;
66
56
  const at = captureBinding(_currentStore);
67
- const sessionId = at.sessionId;
68
- const profile = state.sessionInfo?.mcpProfile
69
- || savedSessionProfile(sessionId)
70
- || _defaultProfile;
71
- _currentProfile = profile;
72
- _currentStore.setMcpProfile(profile);
73
- applyProfileLabel();
74
- if (!sessionId) return;
57
+ const state = getState();
58
+ if (at.sessionId) await migrateStoredTools(storage, MCP_SESSION_TOOLS_KEY, 'synabun-opencode-session-mcp-profiles', { entry: at.sessionId });
59
+ if (!at.isCurrent() || version !== _toolsSyncVersion) return;
60
+ const tools = state.sessionInfo?.tools ?? savedSessionTools(at.sessionId) ?? (at.sessionId ? null : state.tools) ?? _toolCatalog?.defaultTools;
61
+ if (tools) _currentStore.setTools(tools);
62
+ paintTools();
63
+ if (!at.sessionId || !supports('mcp:tools:get')) return;
75
64
  try {
76
- const result = await api.mcpProfileGet(sessionId);
77
- const remote = result?.data;
78
- // A running serve is authoritative across windows. If no serve is pinned
79
- // yet, retain the session's persisted browser-side choice for first launch.
80
- if (!remote?.pinned || !remote.profile) return;
81
- if (version !== _profileSyncVersion || !at.isCurrent()) return;
82
- saveSessionProfile(sessionId, remote.profile);
83
- _currentStore.setMcpProfile(remote.profile);
84
- _currentProfile = remote.profile;
85
- applyMcpProfileState(remote.profile, remote.presets);
86
- } catch { /* socket may still be booting; local session state remains valid */ }
65
+ const result = await api.toolsGet(at.sessionId);
66
+ if (!result?.data?.pinned || !Array.isArray(result.data.tools) || version !== _toolsSyncVersion || !at.isCurrent()) return;
67
+ _currentStore.setTools(result.data.tools);
68
+ saveSessionTools(at.sessionId, result.data.tools);
69
+ } catch { /* reconnect keeps the local selection */ }
87
70
  }
88
71
 
89
72
  const RECALL_PROFILES_META = [
@@ -115,8 +98,10 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
115
98
  _branchDd = makeDropdown('ocpv2-branch-dd', 'branch', 'Branch', 'ocpv2-dropdown-sm');
116
99
  bar.appendChild(_branchDd);
117
100
 
118
- _profileDd = makeDropdown('ocpv2-profile-dd', 'profile', 'Tool profile', 'ocpv2-dropdown-sm');
119
- bar.appendChild(_profileDd);
101
+ _toolsDd = document.createElement('div');
102
+ _toolsDd.className = 'ocpv2-tools-picker';
103
+ _toolsDd.addEventListener('pointerdown', event => { if (event.target.closest('.cc-dropdown-trigger')) closeAllDropdowns(event.target.closest('.cc-dropdown')); });
104
+ bar.appendChild(_toolsDd);
120
105
 
121
106
  _recallDd = makeDropdown('ocpv2-recall-dd', 'recall', 'Recall profile', 'ocpv2-dropdown-sm');
122
107
  bar.appendChild(_recallDd);
@@ -148,35 +133,46 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
148
133
 
149
134
  wireProjectDd();
150
135
  wireBranchDd();
151
- wireProfileDd();
136
+ _toolsAbort = new AbortController();
137
+ wireDropdowns(_toolsDd, { signal: _toolsAbort.signal });
138
+ _capsUnsub = capabilities.subscribe(() => paintTools());
139
+ _toolsDd.addEventListener('change', async (event) => {
140
+ const previous = getState().tools;
141
+ const tools = readToolPicker(event.target, { inherit: false });
142
+ const at = captureBinding(_currentStore);
143
+ try {
144
+ if (at.sessionId) await setSessionTools(_currentStore, api, tools, { save: saveSessionTools });
145
+ else _currentStore.setTools(tools);
146
+ } catch (error) {
147
+ if (at.isCurrent()) { _currentStore.setTools(previous); _currentStore.pushError({ message: error.message || toolWord('saveFailed') }); }
148
+ }
149
+ if (at.isCurrent()) paintTools();
150
+ }, { signal: _toolsAbort.signal });
152
151
  wireRecallDd();
153
152
  wireDocClick();
154
153
 
155
- // Shared broadcasts update only the default for future sessions. A live
156
- // session keeps its own profile until its scoped serve is restarted.
157
- _profileSyncUnsub = on('mcp:profile-changed', (msg = {}) => {
158
- _defaultProfile = msg.defaultProfile || msg.profile || _defaultProfile;
159
- applyMcpProfileState(getState().sessionId ? null : _defaultProfile, msg.presets);
154
+ _toolsSyncUnsub = on('mcp:tools-default-changed', (msg = {}) => {
155
+ if (_toolCatalog && Array.isArray(msg.tools)) _toolCatalog.defaultTools = msg.tools;
160
156
  });
161
157
 
162
158
  _unsubscribe = subscribe((event) => {
163
159
  if (event?.type === 'config:cwd') {
164
160
  syncToCwd(getState().cwd || '');
165
161
  } else if (event?.type === 'session:set') {
162
+ closeDropdowns(_toolsDd, { cancel: true });
166
163
  // Session switch may carry a new directory — sync best-effort.
167
164
  // panel.js owns the canonical setCwd; this is just a defensive refresh.
168
165
  const s = getState();
169
166
  const dir = s.sessionInfo?.directory;
170
167
  if (dir && dir !== getState().cwd) syncToCwd(dir);
171
- syncProfileForActiveSession();
172
- } else if (event?.type === 'config:mcp-profile') {
168
+ syncToolsForActiveSession();
169
+ } else if (event?.type === 'config:tools') {
170
+ closeDropdowns(_toolsDd, { cancel: true });
173
171
  const state = getState();
174
- const profile = state.mcpProfile || _defaultProfile;
175
- if (state.sessionId) saveSessionProfile(state.sessionId, profile);
176
- _currentProfile = profile;
177
- applyProfileLabel();
178
- if (ddIsOpen(_profileDd)) paintProfileMenu();
179
- }
172
+ if (state.sessionId) saveSessionTools(state.sessionId, state.tools);
173
+ paintTools();
174
+ } else { paintTools(); }
175
+
180
176
  });
181
177
 
182
178
  // Initial paint
@@ -185,8 +181,8 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
185
181
  Promise.resolve(_ctx.ensureProjectsLoaded?.()).catch(() => {});
186
182
  // Load saved recall profile so the DD shows the current selection on first open
187
183
  loadRecallProfile().catch(() => {});
188
- // Load active MCP tool profile so its label is correct on first paint
189
- loadCurrentProfile().catch(() => {});
184
+ // Load active SynaBun tool list so its label is correct on first paint
185
+ fetchToolCatalog(false, { cwd: getState().cwd || '' }).then(catalog => { if (!_toolsDd) return; _toolCatalog = catalog; return syncToolsForActiveSession(); }).catch(() => {});
190
186
 
191
187
  return {
192
188
  refresh: () => syncToCwd(getState().cwd || ''),
@@ -195,9 +191,9 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
195
191
  }
196
192
 
197
193
  export function unmountProjectBar() {
198
- _profileSyncVersion += 1;
194
+ _toolsSyncVersion += 1;
199
195
  if (_unsubscribe) { try { _unsubscribe(); } catch {} }
200
- if (_profileSyncUnsub) { try { _profileSyncUnsub(); } catch {} }
196
+ if (_toolsSyncUnsub) { try { _toolsSyncUnsub(); } catch {} }
201
197
  if (_docClickWired && _docClickHandler) {
202
198
  document.removeEventListener('mousedown', _docClickHandler);
203
199
  _docClickWired = false;
@@ -207,16 +203,15 @@ export function unmountProjectBar() {
207
203
  _root = null;
208
204
  _projectDd = null;
209
205
  _branchDd = null;
210
- _profileDd = null;
206
+ _toolsDd = null;
211
207
  _recallDd = null;
212
208
  _ctx = null;
213
209
  _unsubscribe = null;
214
- _profileSyncUnsub = null;
210
+ _toolsSyncUnsub = null;
215
211
  _branchCache = new Map();
216
- _profileLoaded = false;
217
- _currentProfile = 'full';
218
- _defaultProfile = 'full';
219
- _mcpProfiles = [];
212
+ _toolsAbort?.abort();
213
+ _capsUnsub?.();
214
+ _toolCatalog = null;
220
215
  }
221
216
 
222
217
  // ── Dropdown construction ──────────────────────────────────────────────────
@@ -243,7 +238,7 @@ function ddSetLabel(dd, text, hasValue) {
243
238
  }
244
239
 
245
240
  // A menu that has to load something before it opens (the project list, the
246
- // tool profiles, the recall setting) opens only when it is still the one the
241
+ // tool lists, the recall setting) opens only when it is still the one the
247
242
  // user asked for last: not after another menu was opened or everything was
248
243
  // closed while it loaded.
249
244
  const _menuOpenings = latestOnly();
@@ -256,6 +251,7 @@ function ddOpen(dd) {
256
251
  }
257
252
 
258
253
  function ddClose(dd) {
254
+ if (dd?.classList.contains('cc-dropdown')) { closeDropdowns(dd.parentElement); return; }
259
255
  dd?.classList.remove('open');
260
256
  dd?.querySelector('.ocpv2-dd-menu')?.classList.remove('open');
261
257
  }
@@ -434,132 +430,28 @@ function syncToCwd(cwd) {
434
430
  }
435
431
  }
436
432
 
437
- // ── MCP Profile dropdown wiring ────────────────────────────────────────────
438
-
439
- function wireProfileDd() {
440
- _profileDd.addEventListener('click', async (event) => {
441
- if (event.target.closest('.ocpv2-dd-menu')) return;
442
- if (getState().running) return;
443
- if (ddIsOpen(_profileDd)) { ddClose(_profileDd); return; }
444
- const wanted = _menuOpenings.begin();
445
- if (!_profileLoaded) {
446
- try { await loadCurrentProfile(); } catch {}
447
- }
448
- // The menu changes the profile of the session on screen: it does not open
449
- // over a turn that started while the profiles loaded.
450
- if (!wanted() || getState().running) return;
451
- paintProfileMenu();
452
- ddOpen(_profileDd);
453
- });
454
- }
455
-
456
- function mcpProfileItemsFromPresets(presets) {
457
- if (!presets || typeof presets !== 'object') return null;
458
- return Object.entries(presets).map(([id, p]) => ({
459
- id,
460
- label: p?.label || id,
461
- hint: `${p?.tools ?? '?'} tools`,
462
- }));
463
- }
464
-
465
- function applyMcpProfileState(profile, presets) {
466
- if (profile) _currentProfile = profile;
467
- const items = mcpProfileItemsFromPresets(presets);
468
- if (items) _mcpProfiles = items;
469
- applyProfileLabel();
470
- if (ddIsOpen(_profileDd)) paintProfileMenu();
471
- }
472
-
473
- function applyProfileLabel() {
474
- const matched = _mcpProfiles.find((p) => p.id === _currentProfile);
475
- ddSetLabel(_profileDd, matched ? matched.label : _currentProfile, !!_currentProfile);
476
- }
477
-
478
- async function loadCurrentProfile() {
479
- try {
480
- const data = await fetch('/api/mcp/profile').then((r) => r.json());
481
- if (data?.ok) {
482
- _defaultProfile = data.defaultProfile || data.profile || 'full';
483
- applyMcpProfileState(null, data.presets);
484
- await syncProfileForActiveSession();
485
- }
486
- } catch (err) {
487
- console.warn('[ocp-v2-projectbar] loadCurrentProfile failed', err);
488
- } finally {
489
- _profileLoaded = true;
490
- applyProfileLabel();
491
- }
492
- }
493
-
494
- function paintProfileMenu() {
495
- const menu = _profileDd?.querySelector('.ocpv2-dd-menu');
496
- if (!menu) return;
497
- menu.innerHTML = '';
498
- if (!_mcpProfiles.length) {
499
- const empty = document.createElement('div');
500
- empty.className = 'ocpv2-dd-option';
501
- empty.style.cssText = 'opacity:0.4;cursor:default';
502
- empty.textContent = '(empty)';
503
- menu.appendChild(empty);
504
- return;
505
- }
506
- for (const p of _mcpProfiles) {
507
- const opt = document.createElement('div');
508
- opt.className = 'ocpv2-dd-option' + (p.id === _currentProfile ? ' selected' : '');
509
- opt.style.gap = '6px';
510
- opt.innerHTML = `<span>${p.label}</span><span class="ocpv2-dd-hint">${p.hint}</span>`;
511
- opt.addEventListener('click', async (event) => {
512
- event.stopPropagation();
513
- ddClose(_profileDd);
514
- if (p.id === _currentProfile) return;
515
- const previous = _currentProfile;
516
- const at = captureBinding(_currentStore);
517
- _currentProfile = p.id;
518
- applyProfileLabel();
519
- try { await updateMcpProfile(p.id); }
520
- catch (err) {
521
- // The label is rolled back only where it was changed: after a move the
522
- // selector already shows the profile of the session on screen.
523
- if (at.isCurrent()) {
524
- _currentProfile = previous;
525
- applyProfileLabel();
526
- }
527
- console.error('[ocp-v2-projectbar] updateMcpProfile failed', err);
528
- }
529
- });
530
- menu.appendChild(opt);
531
- }
532
- }
533
-
534
- async function updateMcpProfile(profile) {
433
+ // ── Tool lists: cc-dropdown multiple mode inside the OpenCode project bar ──
434
+ function paintTools() {
435
+ if (!_toolsDd) return;
436
+ _toolsDd.hidden = !supports('mcp:tools:set') || !_toolCatalog;
437
+ if (_toolsDd.hidden) return;
535
438
  const state = getState();
536
- if (state.running) throw new Error('Wait for the active turn to finish before changing its MCP profile.');
537
- let effective = profile;
538
- if (state.sessionId) {
539
- // The change is for the session it was asked on (setSessionMcpProfile
540
- // captures it before the request): the answer is saved under that
541
- // session's key, and the store and the selector take it only while the
542
- // panel is still on that binding.
543
- const changed = await setSessionMcpProfile(_currentStore, api, profile, { save: saveSessionProfile });
544
- if (changed?.applied) {
545
- _currentProfile = changed.profile;
546
- applyProfileLabel();
547
- }
548
- return;
439
+ const catalogCwd = state.cwd || '';
440
+ if (_toolCatalog._cwd !== catalogCwd) {
441
+ _toolCatalog._cwd = catalogCwd;
442
+ fetchToolCatalog(false, { cwd: catalogCwd }).then(catalog => { if (catalog && (getState().cwd || '') === catalogCwd) { catalog._cwd = catalogCwd; _toolCatalog = catalog; paintTools(); } }).catch(() => {});
549
443
  }
550
- // With no active session the selector intentionally edits only the default
551
- // used by runtimes created later.
552
- const response = await fetch('/api/mcp/profile', {
553
- method: 'POST',
554
- headers: { 'Content-Type': 'application/json' },
555
- body: JSON.stringify({ profile: effective }),
556
- });
557
- const payload = await response.json().catch(() => null);
558
- if (!response.ok || payload?.ok === false) {
559
- throw new Error(payload?.error || `Could not update the future-runtime MCP default (${response.status})`);
444
+ let input = _toolsDd.querySelector('input');
445
+ if (!input) {
446
+ // One project bar per panel mount; ids need to remain unique across windows.
447
+ const id = `ocpv2-tools-${globalThis.crypto.randomUUID()}`;
448
+ _toolsDd.innerHTML = toolPickerHTML(id, state.tools ?? _toolCatalog.defaultTools, { catalog: _toolCatalog, classes: 'ocpv2-dropdown ocpv2-dropdown-sm' });
449
+ _toolsDd.querySelector('.cc-dropdown-menu')?.classList.add('ocpv2-dd-menu');
450
+ input = _toolsDd.querySelector('input');
451
+ } else if (!dropdownOf(input)?.classList.contains('open')) {
452
+ updateToolPicker(input, state.tools ?? _toolCatalog.defaultTools, { catalog: _toolCatalog });
560
453
  }
561
- _defaultProfile = effective;
562
- applyProfileLabel();
454
+ setDropdownDisabled(input, !!state.running);
563
455
  }
564
456
 
565
457
  // ── Recall dropdown wiring ─────────────────────────────────────────────────
@@ -603,7 +495,7 @@ function paintRecallMenu() {
603
495
  const opt = document.createElement('div');
604
496
  opt.className = 'ocpv2-dd-option' + (p.id === _recallProfile ? ' selected' : '');
605
497
  opt.style.gap = '6px';
606
- opt.innerHTML = `<span>${p.label}</span><span class="ocpv2-dd-hint">${p.hint}</span>`;
498
+ opt.innerHTML = `<span>${escapeHtml(p.label)}</span><span class="ocpv2-dd-hint">${escapeHtml(p.hint)}</span>`;
607
499
  opt.addEventListener('click', async (event) => {
608
500
  event.stopPropagation();
609
501
  ddClose(_recallDd);
@@ -647,3 +539,5 @@ function wireDocClick() {
647
539
  document.addEventListener('mousedown', _docClickHandler);
648
540
  _docClickWired = true;
649
541
  }
542
+
543
+ configureToolPickerTranslation(t);
@@ -1,11 +1,15 @@
1
1
  // ─────────────────────────────────────────────────────────────────────────────
2
2
  // OpenCode V2 — one read of the provider list for every module
3
3
  // The model picker, the variant picker, the context gauge and the composer
4
- // each need `GET /api/opencode/providers/full` (the whole models.dev catalog,
5
- // a few hundred kilobytes). They ask through here, so opening the panel reads
6
- // it once. A change (`ocp-providers-changed`) drops the copy.
4
+ // each need the provider list. They ask through here, so opening the panel
5
+ // reads it once: the compact view of GET /api/opencode/providers/full (the
6
+ // connected providers, opencode-providers.js), kept in the page's data cache
7
+ // and given at once on every later open. A change (`ocp-providers-changed`)
8
+ // drops the copy and reads it again.
7
9
  // ─────────────────────────────────────────────────────────────────────────────
8
10
 
11
+ import { fetchOpencodeProviders, opencodeProviders } from '../opencode-providers.js';
12
+
9
13
  // Long enough to cover the burst of readers at mount and at a refresh, short
10
14
  // enough that a later, deliberate refresh reads the server again.
11
15
  export const PROVIDERS_SHARE_MS = 3000;
@@ -27,9 +31,7 @@ export function createSharedFetch(fetchJson, { shareMs = PROVIDERS_SHARE_MS, now
27
31
  return read;
28
32
  }
29
33
 
30
- /** The parsed body of GET /api/opencode/providers/full: `{ ok, data: { all, default, connected } }`. */
31
- export const fetchProvidersFull = createSharedFetch(() => fetch('/api/opencode/providers/full').then((r) => r.json()));
32
-
33
- if (typeof document !== 'undefined') {
34
- document.addEventListener('ocp-providers-changed', () => fetchProvidersFull.invalidate());
35
- }
34
+ /** The parsed body of the provider list: `{ ok, data: { all, default, connected } }` (connected providers). */
35
+ export const fetchProvidersFull = Object.assign(() => fetchOpencodeProviders(), {
36
+ invalidate: () => opencodeProviders.invalidate(''),
37
+ });
@@ -41,16 +41,27 @@ export const ANCESTRY_MAX_DEPTH = 12;
41
41
  * anything that is not a string means "unknown"
42
42
  * Unknown is false: ancestry that cannot be established is not ancestry.
43
43
  */
44
- export async function verifyDescendant(sessionId, ancestorId, { parentOf, roots, fetchParent } = {}) {
44
+ export async function verifyDescendant(sessionId, ancestorId, options = {}) {
45
+ return (await descendantState(sessionId, ancestorId, options)) === true;
46
+ }
47
+
48
+ /**
49
+ * The same walk, with "could not be read" kept apart from "no": true, false
50
+ * (the chain ends, or loops, without `ancestorId`), or null when a link could
51
+ * not be read (no `fetchParent`, a failed or odd reply). For a caller that
52
+ * must not take an unread link for an answer (readOpenAsks).
53
+ */
54
+ export async function descendantState(sessionId, ancestorId, { parentOf, roots, fetchParent } = {}) {
45
55
  if (!sessionId || !ancestorId || sessionId === ancestorId) return false;
46
56
  const seen = new Set([sessionId]);
47
57
  let cursor = sessionId;
48
58
  for (let depth = 0; depth < ANCESTRY_MAX_DEPTH; depth++) {
49
59
  let parent = parentOf?.get(cursor);
50
60
  if (parent === undefined) {
51
- if (roots?.has(cursor) || typeof fetchParent !== 'function') return false;
52
- try { parent = await fetchParent(cursor); } catch { return false; }
53
- if (typeof parent !== 'string') return false;
61
+ if (roots?.has(cursor)) return false;
62
+ if (typeof fetchParent !== 'function') return null;
63
+ try { parent = await fetchParent(cursor); } catch { return null; }
64
+ if (typeof parent !== 'string') return null;
54
65
  if (parent) parentOf?.set(cursor, parent);
55
66
  else roots?.add(cursor);
56
67
  }
@@ -30,10 +30,10 @@ import {
30
30
  compactionLabel, inlinePartText, reasoningPreview, createCardDrafts,
31
31
  } from './ocp-v2-render-logic.js';
32
32
  import {
33
- visibleMessageOrder, revertBannerView, messageText, messageActionsFor, deleteMessageConfirmText,
33
+ visibleMessageOrder, revertBannerView, messageText, messageActionsFor,
34
34
  } from './ocp-v2-sessions-logic.js';
35
35
  import {
36
- revertToMessage, restoreReverted, retryFromMessage, forkSession, deleteMessage,
36
+ revertToMessage, restoreReverted, retryFromMessage, forkSession,
37
37
  } from './ocp-v2-session-actions.js';
38
38
 
39
39
  const _expandedReasoningIds = new Set();
@@ -49,7 +49,7 @@ let _markedLoading = false;
49
49
  function ensureMarked() {
50
50
  if (_marked || _markedLoading || typeof window === 'undefined') return;
51
51
  _markedLoading = true;
52
- import('https://cdn.jsdelivr.net/npm/marked@14/lib/marked.esm.js')
52
+ import('/vendor/marked/marked-14.1.4.esm.js')
53
53
  .then((mod) => {
54
54
  _marked = mod?.marked || mod?.default || null;
55
55
  if (_marked?.setOptions) _marked.setOptions({ breaks: true, gfm: true });
@@ -486,13 +486,12 @@ function renderMessage(msg, store, actions = [], opts = {}) {
486
486
  return wrap;
487
487
  }
488
488
 
489
- // ── Message actions (copy / undo / fork / delete / retry) ───────────────────
489
+ // ── Message actions (copy / undo / fork / retry) ────────────────────────────
490
490
 
491
491
  const ACTION_LABELS = {
492
492
  copy: 'Copy',
493
493
  undo: 'Undo to here',
494
494
  fork: 'Fork from here',
495
- delete: 'Delete',
496
495
  retry: 'Retry',
497
496
  };
498
497
 
@@ -575,16 +574,6 @@ async function runMessageAction(action, msg, store, opts, btn) {
575
574
  if (result?.ok) await opts.onOpenSession?.(result.session, { activate: !result.moved, nav });
576
575
  return;
577
576
  }
578
- case 'delete': {
579
- // Two steps, both in the panel: this click only asks, naming the
580
- // message. A panel that cannot ask deletes nothing.
581
- const agreed = typeof opts.confirm === 'function' && (await opts.confirm({
582
- key: `message-delete:${msg.id}`, text: deleteMessageConfirmText(msg), confirmLabel: 'Delete message',
583
- })) === true;
584
- if (!agreed) return;
585
- report(await deleteMessage(store, api, msg.id), 'Delete failed');
586
- return;
587
- }
588
577
  default:
589
578
  }
590
579
  }
@@ -802,9 +791,6 @@ const SYNABUN_LABELS = {
802
791
  discord_role: 'Discord · Role', discord_message: 'Discord · Message',
803
792
  discord_member: 'Discord · Member', discord_onboarding: 'Discord · Onboarding',
804
793
  discord_webhook: 'Discord · Webhook', discord_thread: 'Discord · Thread',
805
- leonardo_browser_navigate: 'Leonardo · Navigate', leonardo_browser_generate: 'Leonardo · Generate',
806
- leonardo_browser_library: 'Leonardo · Library', leonardo_browser_download: 'Leonardo · Download',
807
- leonardo_browser_reference: 'Leonardo · Reference',
808
794
  };
809
795
 
810
796
  function isSynaBunTool(name) {
@@ -859,7 +845,6 @@ function synabunSummaryText(name, input) {
859
845
  case 'whiteboard_update': return t(input.content || input.title);
860
846
  case 'card_open':
861
847
  case 'card_update': return t(input.title || input.id);
862
- case 'leonardo_browser_generate': return t(input.prompt);
863
848
  default: return '';
864
849
  }
865
850
  }
@@ -949,7 +934,7 @@ function renderSynaBunToolPart(part, toolName, stateStatus) {
949
934
  }
950
935
 
951
936
  // Render an MCP tool result. Tools like browser_screenshot / card_screenshot /
952
- // whiteboard_screenshot / leonardo_* return `{ content: [text, image] }`,
937
+ // whiteboard_screenshot return `{ content: [text, image] }`,
953
938
  // which arrives here as an array (or a JSON string of one). Render image
954
939
  // blocks as actual <img> elements; render text blocks as their text; fall
955
940
  // back to formatJson for anything else.
@@ -1132,7 +1117,7 @@ function renderMessageError(msg, view, store) {
1132
1117
  const at = captureBinding(store);
1133
1118
  if (!at.sessionId) return;
1134
1119
  const res = await api.compact({
1135
- sessionId: at.sessionId, cwd: at.cwd || undefined, mcpProfile: at.mcpProfile || undefined, model: at.model || undefined,
1120
+ sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
1136
1121
  });
1137
1122
  if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
1138
1123
  }, store));
@@ -1329,7 +1314,7 @@ function renderPermissionCard(perm, store) {
1329
1314
  code.textContent = pattern;
1330
1315
  always.appendChild(code);
1331
1316
  });
1332
- // How long it lasts: OpenCode keeps the answer in the running serve, not in a saved list.
1317
+ // How far it reaches: OpenCode 2 saves the answer for the project (its saved permissions).
1333
1318
  always.appendChild(document.createTextNode(` ${ALWAYS_ALLOW_SCOPE}.`));
1334
1319
  body.appendChild(always);
1335
1320
  }