synabun 2.0.10 → 2.2.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 (656) hide show
  1. package/CHANGELOG.md +207 -0
  2. package/README.md +25 -2
  3. package/THIRD-PARTY-LICENSES.md +22 -0
  4. package/bin/synabun.js +71 -24
  5. package/docs/whatsapp.md +13 -13
  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/lib/claude-hooks.js +172 -18
  10. package/lib/client-config-repair.js +30 -17
  11. package/lib/desktop-app.js +7 -1
  12. package/lib/external-tools.js +7 -6
  13. package/lib/first-launch-protection.js +57 -12
  14. package/lib/mcp-dist.js +176 -0
  15. package/lib/release-npm-ci.mjs +138 -0
  16. package/lib/release-publish.mjs +91 -0
  17. package/lib/release-scan.mjs +50 -0
  18. package/lib/server-crash-record.js +123 -0
  19. package/lib/server-exit.js +318 -0
  20. package/lib/server-supervisor.js +508 -0
  21. package/lib/start-launcher.js +37 -4
  22. package/lib/tools-cli.js +45 -0
  23. package/lib/update-snapshot.js +302 -0
  24. package/lib/virustotal.mjs +203 -0
  25. package/lib/windows-crash-event.js +269 -0
  26. package/mcp-server/dist/http.d.ts +20 -1
  27. package/mcp-server/dist/http.d.ts.map +1 -1
  28. package/mcp-server/dist/http.js +59 -12
  29. package/mcp-server/dist/http.js.map +1 -1
  30. package/mcp-server/dist/index.d.ts +33 -27
  31. package/mcp-server/dist/index.d.ts.map +1 -1
  32. package/mcp-server/dist/index.js +128 -143
  33. package/mcp-server/dist/index.js.map +1 -1
  34. package/mcp-server/dist/preload.js +1 -1
  35. package/mcp-server/dist/preload.js.map +1 -1
  36. package/mcp-server/dist/services/budget-judgments.d.ts +1 -1
  37. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -1
  38. package/mcp-server/dist/services/budget-judgments.js +5 -3
  39. package/mcp-server/dist/services/budget-judgments.js.map +1 -1
  40. package/mcp-server/dist/services/codex-config-heal.d.ts +6 -2
  41. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  42. package/mcp-server/dist/services/codex-config-heal.js +81 -28
  43. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  44. package/mcp-server/dist/services/identity.d.ts +2 -2
  45. package/mcp-server/dist/services/identity.js +2 -2
  46. package/mcp-server/dist/services/memory-judge-backfill.d.ts +6 -0
  47. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -1
  48. package/mcp-server/dist/services/memory-judge-backfill.js +7 -1
  49. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -1
  50. package/mcp-server/dist/services/memory-sessions.d.ts +1 -1
  51. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -1
  52. package/mcp-server/dist/services/memory-sessions.js +28 -2
  53. package/mcp-server/dist/services/memory-sessions.js.map +1 -1
  54. package/mcp-server/dist/services/neural-interface.d.ts +18 -11
  55. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  56. package/mcp-server/dist/services/neural-interface.js +67 -11
  57. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  58. package/mcp-server/dist/services/server-instructions.d.ts +7 -2
  59. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -1
  60. package/mcp-server/dist/services/server-instructions.js +22 -63
  61. package/mcp-server/dist/services/server-instructions.js.map +1 -1
  62. package/mcp-server/dist/services/tool-catalog.d.ts +120 -0
  63. package/mcp-server/dist/services/tool-catalog.d.ts.map +1 -0
  64. package/mcp-server/dist/services/tool-catalog.js +339 -0
  65. package/mcp-server/dist/services/tool-catalog.js.map +1 -0
  66. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts +12 -0
  67. package/mcp-server/dist/services/tool-list-refresh-barrier.d.ts.map +1 -0
  68. package/mcp-server/dist/services/tool-list-refresh-barrier.js +40 -0
  69. package/mcp-server/dist/services/tool-list-refresh-barrier.js.map +1 -0
  70. package/mcp-server/dist/services/tool-list.d.ts +108 -0
  71. package/mcp-server/dist/services/tool-list.d.ts.map +1 -0
  72. package/mcp-server/dist/services/tool-list.js +334 -0
  73. package/mcp-server/dist/services/tool-list.js.map +1 -0
  74. package/mcp-server/dist/services/tool-runtime.d.ts +161 -0
  75. package/mcp-server/dist/services/tool-runtime.d.ts.map +1 -0
  76. package/mcp-server/dist/services/tool-runtime.js +400 -0
  77. package/mcp-server/dist/services/tool-runtime.js.map +1 -0
  78. package/mcp-server/dist/services/typesafe-config.js +1 -1
  79. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  80. package/mcp-server/dist/services/whiteboard-geometry.d.ts +26 -2
  81. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -1
  82. package/mcp-server/dist/services/whiteboard-geometry.js +91 -8
  83. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -1
  84. package/mcp-server/dist/tools/agents.d.ts +14 -14
  85. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  86. package/mcp-server/dist/tools/agents.js +29 -19
  87. package/mcp-server/dist/tools/agents.js.map +1 -1
  88. package/mcp-server/dist/tools/browser-batch.d.ts +3 -3
  89. package/mcp-server/dist/tools/choice.d.ts +6 -0
  90. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  91. package/mcp-server/dist/tools/choice.js +18 -13
  92. package/mcp-server/dist/tools/choice.js.map +1 -1
  93. package/mcp-server/dist/tools/git-tools.js +2 -2
  94. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  95. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  96. package/mcp-server/dist/tools/image-tools.js +1 -1
  97. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  98. package/mcp-server/dist/tools/morelogin.js +9 -6
  99. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  100. package/mcp-server/dist/tools/skill-tools.d.ts +505 -0
  101. package/mcp-server/dist/tools/skill-tools.d.ts.map +1 -0
  102. package/mcp-server/dist/tools/skill-tools.js +642 -0
  103. package/mcp-server/dist/tools/skill-tools.js.map +1 -0
  104. package/mcp-server/dist/tools/skill.d.ts +7 -0
  105. package/mcp-server/dist/tools/skill.d.ts.map +1 -0
  106. package/mcp-server/dist/tools/skill.js +11 -0
  107. package/mcp-server/dist/tools/skill.js.map +1 -0
  108. package/mcp-server/dist/tools/tool-groups.d.ts +68 -0
  109. package/mcp-server/dist/tools/tool-groups.d.ts.map +1 -0
  110. package/mcp-server/dist/tools/tool-groups.js +147 -0
  111. package/mcp-server/dist/tools/tool-groups.js.map +1 -0
  112. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -1
  113. package/mcp-server/dist/tools/whiteboard-format.js +7 -4
  114. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -1
  115. package/mcp-server/dist/tools/whiteboard-tools.d.ts +64 -13
  116. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  117. package/mcp-server/dist/tools/whiteboard-tools.js +30 -5
  118. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  119. package/mcp-server/package-lock.json +2 -2
  120. package/mcp-server/package.json +1 -1
  121. package/mcp-server/src/http.ts +75 -12
  122. package/mcp-server/src/index.ts +147 -154
  123. package/mcp-server/src/preload.ts +12 -12
  124. package/mcp-server/src/services/budget-judgments.ts +5 -3
  125. package/mcp-server/src/services/codex-config-heal.ts +80 -29
  126. package/mcp-server/src/services/identity.ts +2 -2
  127. package/mcp-server/src/services/memory-judge-backfill.ts +7 -1
  128. package/mcp-server/src/services/memory-sessions.ts +24 -3
  129. package/mcp-server/src/services/neural-interface.ts +81 -21
  130. package/mcp-server/src/services/server-instructions.ts +29 -64
  131. package/mcp-server/src/services/tool-catalog.ts +403 -0
  132. package/mcp-server/src/services/tool-list-refresh-barrier.ts +33 -0
  133. package/mcp-server/src/services/tool-list.ts +410 -0
  134. package/mcp-server/src/services/tool-runtime.ts +457 -0
  135. package/mcp-server/src/services/typesafe-config.ts +1 -1
  136. package/mcp-server/src/services/whiteboard-geometry.ts +94 -9
  137. package/mcp-server/src/tools/agents.ts +29 -20
  138. package/mcp-server/src/tools/choice.ts +17 -12
  139. package/mcp-server/src/tools/git-tools.ts +2 -2
  140. package/mcp-server/src/tools/image-tools.ts +1 -1
  141. package/mcp-server/src/tools/morelogin.ts +6 -4
  142. package/mcp-server/src/tools/skill-tools.ts +592 -0
  143. package/mcp-server/src/tools/skill.ts +13 -0
  144. package/mcp-server/src/tools/tool-groups.ts +164 -0
  145. package/mcp-server/src/tools/whiteboard-format.ts +9 -3
  146. package/mcp-server/src/tools/whiteboard-tools.ts +39 -5
  147. package/neural-interface/i18n/en.json +3953 -228
  148. package/neural-interface/i18n/pt-BR.json +3901 -179
  149. package/neural-interface/lib/agent-sandbox-elevation.js +6 -0
  150. package/neural-interface/lib/antigravity/acp-client-host.js +554 -0
  151. package/neural-interface/lib/antigravity/acp-connection.js +299 -0
  152. package/neural-interface/lib/antigravity/bypass.js +100 -0
  153. package/neural-interface/lib/antigravity/catalog.js +273 -0
  154. package/neural-interface/lib/antigravity/home.js +260 -0
  155. package/neural-interface/lib/antigravity/migrate-gemini.js +139 -0
  156. package/neural-interface/lib/antigravity/panel-bridge.js +1058 -0
  157. package/neural-interface/lib/antigravity/policy-hook.mjs +78 -0
  158. package/neural-interface/lib/antigravity/policy.js +74 -0
  159. package/neural-interface/lib/antigravity/tool-call.js +178 -0
  160. package/neural-interface/lib/antigravity/transcripts.js +252 -0
  161. package/neural-interface/lib/antigravity/usage.js +43 -0
  162. package/neural-interface/lib/assistant-api.js +128 -28
  163. package/neural-interface/lib/assistant-brains/antigravity.js +423 -0
  164. package/neural-interface/lib/assistant-brains/claude.js +4 -3
  165. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +12 -2
  166. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +32 -9
  167. package/neural-interface/lib/assistant-brains/codex.js +9 -5
  168. package/neural-interface/lib/assistant-brains/opencode.js +120 -54
  169. package/neural-interface/lib/assistant-brains/opencode2-browser-policy/index.js +28 -13
  170. package/neural-interface/lib/assistant-brains/opencode2-route-gate/index.js +59 -19
  171. package/neural-interface/lib/assistant-budget-planner.js +7 -3
  172. package/neural-interface/lib/assistant-budget-split.js +42 -15
  173. package/neural-interface/lib/assistant-catalog.js +81 -15
  174. package/neural-interface/lib/assistant-config.js +6 -3
  175. package/neural-interface/lib/assistant-dispatch.js +1073 -200
  176. package/neural-interface/lib/assistant-envelope.js +156 -2
  177. package/neural-interface/lib/assistant-evidence.js +80 -0
  178. package/neural-interface/lib/assistant-hidden-models.js +7 -5
  179. package/neural-interface/lib/assistant-persona.js +93 -19
  180. package/neural-interface/lib/assistant-plan-permissions.js +25 -9
  181. package/neural-interface/lib/assistant-route-gate-codex.js +3 -0
  182. package/neural-interface/lib/assistant-route-gate.js +6 -4
  183. package/neural-interface/lib/assistant-router.js +245 -38
  184. package/neural-interface/lib/assistant-runtime.js +214 -30
  185. package/neural-interface/lib/assistant-task-prompt.js +87 -21
  186. package/neural-interface/lib/assistant-tools.js +51 -0
  187. package/neural-interface/lib/assistant-usage.js +29 -0
  188. package/neural-interface/lib/backup-service.js +626 -4
  189. package/neural-interface/lib/backup-zip-reader.js +10 -5
  190. package/neural-interface/lib/backup-zip-writer.js +257 -0
  191. package/neural-interface/lib/browser-execution.js +10 -2
  192. package/neural-interface/lib/browser-guard-cdp.js +84 -0
  193. package/neural-interface/lib/browser-network-guard.js +476 -0
  194. package/neural-interface/lib/browser-policy-roots.js +64 -0
  195. package/neural-interface/lib/browser-tool-policy.js +198 -38
  196. package/neural-interface/lib/claude-agent-bridge.js +11 -2
  197. package/neural-interface/lib/claude-history-cache.js +210 -0
  198. package/neural-interface/lib/claude-hooks-status.js +103 -0
  199. package/neural-interface/lib/claude-model-catalog.js +5 -1
  200. package/neural-interface/lib/claude-temporary.js +5 -11
  201. package/neural-interface/lib/cli-install-api.js +1 -1
  202. package/neural-interface/lib/cli-install.js +163 -154
  203. package/neural-interface/lib/cli-resolver.js +13 -3
  204. package/neural-interface/lib/cli-update-planner.js +52 -41
  205. package/neural-interface/lib/cloudflared/tunnel.js +42 -2
  206. package/neural-interface/lib/codex-mcp-approvals.js +11 -0
  207. package/neural-interface/lib/codex-rollout-reader.js +52 -0
  208. package/neural-interface/lib/codex-worker-app-server.js +191 -0
  209. package/neural-interface/lib/confined-fs.js +30 -3
  210. package/neural-interface/lib/crash-notice-api.js +98 -0
  211. package/neural-interface/lib/editor-completion-opencode.js +68 -68
  212. package/neural-interface/lib/editor-git-api.js +3 -20
  213. package/neural-interface/lib/exec-loop-command.js +13 -10
  214. package/neural-interface/lib/file-explorer-api.js +74 -40
  215. package/neural-interface/lib/file-explorer-watch.js +9 -3
  216. package/neural-interface/lib/git-bash/install.js +52 -6
  217. package/neural-interface/lib/git-bash/manager.js +59 -17
  218. package/neural-interface/lib/git-bash/pins.js +12 -0
  219. package/neural-interface/lib/git-read.js +2 -2
  220. package/neural-interface/lib/git-status-runner.js +390 -0
  221. package/neural-interface/lib/git-status-watchdog.js +40 -0
  222. package/neural-interface/lib/greeting/budgets.js +1 -0
  223. package/neural-interface/lib/greeting/engine.js +2 -2
  224. package/neural-interface/lib/greeting/sources.js +10 -12
  225. package/neural-interface/lib/greeting/writer.js +1 -1
  226. package/neural-interface/lib/http-guards.js +8 -2
  227. package/neural-interface/lib/install-details.js +4 -1
  228. package/neural-interface/lib/mcp-agent-servers.js +67 -0
  229. package/neural-interface/lib/mcp-client-config.js +35 -33
  230. package/neural-interface/lib/mcp-external-servers.js +332 -0
  231. package/neural-interface/lib/mcp-installer.js +2 -1
  232. package/neural-interface/lib/{mcp-profile-refresh-coordinator.js → mcp-tools-refresh-coordinator.js} +4 -4
  233. package/neural-interface/lib/memory-session-capture.js +17 -3
  234. package/neural-interface/lib/morelogin.js +177 -25
  235. package/neural-interface/lib/native-loop-providers.js +965 -66
  236. package/neural-interface/lib/native-loop-runtime.js +290 -42
  237. package/neural-interface/lib/opencode-config.js +557 -0
  238. package/neural-interface/lib/opencode-db-schema.js +17 -34
  239. package/neural-interface/lib/opencode-history.js +48 -218
  240. package/neural-interface/lib/opencode-mcp-ready.js +108 -0
  241. package/neural-interface/lib/opencode-native-boundary.js +53 -0
  242. package/neural-interface/lib/opencode-protocol.js +249 -112
  243. package/neural-interface/lib/opencode-runtime-config.js +32 -22
  244. package/neural-interface/lib/opencode-serve-records.js +39 -21
  245. package/neural-interface/lib/opencode-v2-client.js +48 -153
  246. package/neural-interface/lib/opencode-v2-ws-requests.js +36 -210
  247. package/neural-interface/lib/opencode-worker-data.js +27 -0
  248. package/neural-interface/lib/opencode2-client.js +73 -37
  249. package/neural-interface/lib/opencode2-proxy.js +23 -63
  250. package/neural-interface/lib/opencode2-translate.js +51 -2
  251. package/neural-interface/lib/owner-authority.js +249 -0
  252. package/neural-interface/lib/page-session.js +275 -0
  253. package/neural-interface/lib/path-confine.js +12 -9
  254. package/neural-interface/lib/peer-identity.js +793 -0
  255. package/neural-interface/lib/pty-host/core.js +28 -1
  256. package/neural-interface/lib/pty-host/lifetime.js +12 -0
  257. package/neural-interface/lib/pty-host/manager.js +12 -1
  258. package/neural-interface/lib/remote-policy.js +1 -1
  259. package/neural-interface/lib/request-gate.js +20 -2
  260. package/neural-interface/lib/rulesets/api.js +7 -6
  261. package/neural-interface/lib/rulesets/fs-safe.js +1 -1
  262. package/neural-interface/lib/rulesets/installer.js +180 -36
  263. package/neural-interface/lib/rulesets/json-edit.js +1 -1
  264. package/neural-interface/lib/rulesets/render.js +1 -1
  265. package/neural-interface/lib/session-cache-builder.js +81 -31
  266. package/neural-interface/lib/session-title-generator.js +58 -36
  267. package/neural-interface/lib/skills/api-v2.js +495 -0
  268. package/neural-interface/lib/skills/bundle.js +418 -0
  269. package/neural-interface/lib/skills/catalog.js +298 -0
  270. package/neural-interface/lib/skills/creation-api.js +191 -0
  271. package/neural-interface/lib/skills/creation-brief.js +247 -0
  272. package/neural-interface/lib/skills/creation-sources.js +285 -0
  273. package/neural-interface/lib/skills/creation.js +843 -0
  274. package/neural-interface/lib/skills/deploy.js +569 -0
  275. package/neural-interface/lib/skills/digest.js +119 -0
  276. package/neural-interface/lib/skills/discover.js +111 -0
  277. package/neural-interface/lib/skills/draft-confinement.js +216 -0
  278. package/neural-interface/lib/skills/eval-confinement.js +399 -0
  279. package/neural-interface/lib/skills/eval-sandbox.js +280 -0
  280. package/neural-interface/lib/skills/eval-trace.js +135 -0
  281. package/neural-interface/lib/skills/evals-api.js +212 -0
  282. package/neural-interface/lib/skills/evals.js +1573 -0
  283. package/neural-interface/lib/skills/export.js +203 -0
  284. package/neural-interface/lib/skills/frontmatter.js +64 -0
  285. package/neural-interface/lib/skills/health.js +75 -0
  286. package/neural-interface/lib/skills/json-edit.js +165 -0
  287. package/neural-interface/lib/skills/known-bridge-digests.json +441 -0
  288. package/neural-interface/lib/skills/known-bridges.js +96 -0
  289. package/neural-interface/lib/skills/library.js +823 -0
  290. package/neural-interface/lib/skills/local-store.js +21 -0
  291. package/neural-interface/lib/skills/migration.js +433 -0
  292. package/neural-interface/lib/skills/operations.js +45 -0
  293. package/neural-interface/lib/skills/ownership.js +427 -0
  294. package/neural-interface/lib/skills/packages.js +88 -0
  295. package/neural-interface/lib/skills/reviews.js +212 -0
  296. package/neural-interface/lib/skills/revision.js +80 -0
  297. package/neural-interface/lib/skills/roots.js +269 -0
  298. package/neural-interface/lib/skills/runtime-checks.js +358 -0
  299. package/neural-interface/lib/skills/scan-assets.js +252 -0
  300. package/neural-interface/lib/skills/scan-context.js +26 -0
  301. package/neural-interface/lib/skills/scan-shell.js +324 -0
  302. package/neural-interface/lib/skills/scan.js +364 -0
  303. package/neural-interface/lib/skills/scanners.js +54 -0
  304. package/neural-interface/lib/skills/service.js +530 -0
  305. package/neural-interface/lib/skills/telemetry.js +119 -0
  306. package/neural-interface/lib/sqlite-integrity-worker.js +22 -0
  307. package/neural-interface/lib/synabun-version.js +1 -1
  308. package/neural-interface/lib/system-activity.js +1 -1
  309. package/neural-interface/lib/tool-lists.js +124 -0
  310. package/neural-interface/lib/whatsapp/brain.js +7 -3
  311. package/neural-interface/lib/whatsapp/bridge.js +6 -3
  312. package/neural-interface/lib/whatsapp/cards.js +22 -9
  313. package/neural-interface/lib/whatsapp/config.js +1 -1
  314. package/neural-interface/lib/worker-confinement.js +1268 -0
  315. package/neural-interface/lib/worker-guard-setting.js +56 -0
  316. package/neural-interface/lib/worker-mcp-channel.js +175 -0
  317. package/neural-interface/lib/worker-question.js +74 -0
  318. package/neural-interface/lib/worker-relay-ports.js +227 -0
  319. package/neural-interface/lib/worker-resume.js +238 -0
  320. package/neural-interface/lib/worker-sandbox.js +329 -0
  321. package/neural-interface/package-lock.json +34 -12
  322. package/neural-interface/package.json +3 -2
  323. package/neural-interface/public/index.html +3 -1
  324. package/neural-interface/public/index2d.html +19 -11
  325. package/neural-interface/public/onboarding.html +3 -3
  326. package/neural-interface/public/shared/account-menu.js +8 -5
  327. package/neural-interface/public/shared/agent-runtime-options.js +125 -31
  328. package/neural-interface/public/shared/agy/agy-bypass.js +47 -0
  329. package/neural-interface/public/shared/agy/agy-client.js +266 -0
  330. package/neural-interface/public/shared/agy/agy-commands.js +120 -0
  331. package/neural-interface/public/shared/agy/agy-copy.js +326 -0
  332. package/neural-interface/public/shared/agy/agy-diff.js +161 -0
  333. package/neural-interface/public/shared/agy/agy-events.js +469 -0
  334. package/neural-interface/public/shared/agy/agy-greeting.js +26 -0
  335. package/neural-interface/public/shared/agy/agy-options.js +232 -0
  336. package/neural-interface/public/shared/agy/agy-panel.js +2543 -0
  337. package/neural-interface/public/shared/agy/agy-render.js +392 -0
  338. package/neural-interface/public/shared/agy/agy-setup.js +149 -0
  339. package/neural-interface/public/shared/agy/agy-styles.js +604 -0
  340. package/neural-interface/public/shared/agy/agy-tabs-logic.js +181 -0
  341. package/neural-interface/public/shared/api.js +1527 -1336
  342. package/neural-interface/public/shared/app-frame.js +192 -0
  343. package/neural-interface/public/shared/assistant/asst-agents-dock.js +36 -6
  344. package/neural-interface/public/shared/assistant/asst-api.js +1 -1
  345. package/neural-interface/public/shared/assistant/asst-ask-styles.js +270 -0
  346. package/neural-interface/public/shared/assistant/asst-ask-tail.js +118 -0
  347. package/neural-interface/public/shared/assistant/asst-ask.js +397 -0
  348. package/neural-interface/public/shared/assistant/asst-brain-picker.js +105 -44
  349. package/neural-interface/public/shared/assistant/asst-budget.js +5 -4
  350. package/neural-interface/public/shared/assistant/asst-control.js +205 -26
  351. package/neural-interface/public/shared/assistant/asst-followups-card.js +383 -0
  352. package/neural-interface/public/shared/assistant/asst-followups.js +417 -0
  353. package/neural-interface/public/shared/assistant/asst-hosts.js +16 -7
  354. package/neural-interface/public/shared/assistant/asst-limit-dock.js +45 -0
  355. package/neural-interface/public/shared/assistant/asst-limit-wait.js +327 -0
  356. package/neural-interface/public/shared/assistant/asst-limit.js +168 -0
  357. package/neural-interface/public/shared/assistant/asst-mascot.js +49 -12
  358. package/neural-interface/public/shared/assistant/asst-menu.js +7 -6
  359. package/neural-interface/public/shared/assistant/asst-panel.js +151 -19
  360. package/neural-interface/public/shared/assistant/asst-rack-styles.js +66 -49
  361. package/neural-interface/public/shared/assistant/asst-render.js +445 -82
  362. package/neural-interface/public/shared/assistant/asst-route.js +304 -53
  363. package/neural-interface/public/shared/assistant/asst-routes-editor.js +9 -8
  364. package/neural-interface/public/shared/assistant/asst-scenes.js +56 -1
  365. package/neural-interface/public/shared/assistant/asst-sidepanel.js +117 -10
  366. package/neural-interface/public/shared/assistant/asst-slash.js +17 -9
  367. package/neural-interface/public/shared/assistant/asst-state.js +87 -24
  368. package/neural-interface/public/shared/assistant/asst-stop.js +127 -0
  369. package/neural-interface/public/shared/assistant/asst-styles.js +93 -21
  370. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +190 -23
  371. package/neural-interface/public/shared/assistant/asst-usage.js +2 -1
  372. package/neural-interface/public/shared/automation-context.js +5 -2
  373. package/neural-interface/public/shared/cc-dropdown.js +89 -19
  374. package/neural-interface/public/shared/cdx/cdx-context-menu.js +10 -9
  375. package/neural-interface/public/shared/cdx/cdx-copy.js +16 -0
  376. package/neural-interface/public/shared/cdx/cdx-output-model.js +22 -1
  377. package/neural-interface/public/shared/cdx/cdx-output.js +34 -10
  378. package/neural-interface/public/shared/cdx/cdx-panel.js +59 -151
  379. package/neural-interface/public/shared/cdx/cdx-preview.js +12 -0
  380. package/neural-interface/public/shared/cdx/cdx-protocol.js +39 -11
  381. package/neural-interface/public/shared/cdx/cdx-render.js +57 -38
  382. package/neural-interface/public/shared/cdx/cdx-requests.js +14 -4
  383. package/neural-interface/public/shared/cdx/cdx-skill-hints.js +54 -0
  384. package/neural-interface/public/shared/cdx/cdx-styles.js +15 -3
  385. package/neural-interface/public/shared/cdx/cdx-tabs.js +127 -44
  386. package/neural-interface/public/shared/cdx/cdx-ws.js +0 -1
  387. package/neural-interface/public/shared/cli-install-controller.js +218 -0
  388. package/neural-interface/public/shared/cli-install-view.js +11 -12
  389. package/neural-interface/public/shared/cli-status.js +11 -10
  390. package/neural-interface/public/shared/constants.js +5 -4
  391. package/neural-interface/public/shared/context-menu-areas.js +34 -0
  392. package/neural-interface/public/shared/context-menu-logic.js +243 -0
  393. package/neural-interface/public/shared/context-menu-model.js +367 -0
  394. package/neural-interface/public/shared/context-menu.js +372 -0
  395. package/neural-interface/public/shared/cp/cp-context-menu.js +10 -9
  396. package/neural-interface/public/shared/cp/cp-restore.js +162 -0
  397. package/neural-interface/public/shared/cp/cp-tool-cards.js +10 -3
  398. package/neural-interface/public/shared/crash-notice-view.js +168 -0
  399. package/neural-interface/public/shared/desktop-bridge.js +17 -0
  400. package/neural-interface/public/shared/desktop-titlebar-view.js +12 -0
  401. package/neural-interface/public/shared/desktop-titlebar.js +13 -4
  402. package/neural-interface/public/shared/desktop-update-view.js +21 -0
  403. package/neural-interface/public/shared/editor/editor-panel-logic.js +2 -2
  404. package/neural-interface/public/shared/explorer/fx-api.js +4 -4
  405. package/neural-interface/public/shared/explorer/fx-links.js +3 -3
  406. package/neural-interface/public/shared/explorer/fx-logic.js +1 -1
  407. package/neural-interface/public/shared/explorer/fx-main.js +48 -16
  408. package/neural-interface/public/shared/explorer/fx-tree.js +1 -0
  409. package/neural-interface/public/shared/greeting/greeting-card.js +2 -2
  410. package/neural-interface/public/shared/greeting/greeting-view.js +1 -0
  411. package/neural-interface/public/shared/html-shell.js +30 -15
  412. package/neural-interface/public/shared/i18n.js +2 -0
  413. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +7 -7
  414. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +4 -4
  415. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +3 -101
  416. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +2 -0
  417. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +1 -3
  418. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +2 -6
  419. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +11 -11
  420. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +0 -3
  421. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +8 -4
  422. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +7 -7
  423. package/neural-interface/public/shared/ocp-v2/ocp-v2-outcome-notifications.js +16 -0
  424. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +74 -259
  425. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +1 -2
  426. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +95 -202
  427. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +13 -4
  428. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +13 -22
  429. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +4 -4
  430. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +8 -61
  431. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +2 -91
  432. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +16 -15
  433. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +8 -21
  434. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +1 -99
  435. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +5 -35
  436. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +17 -21
  437. package/neural-interface/public/shared/ocp-v2/{ocp-v2-profile-inheritance.js → ocp-v2-tools-inheritance.js} +16 -16
  438. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +60 -50
  439. package/neural-interface/public/shared/page-session.js +96 -0
  440. package/neural-interface/public/shared/provider-icons.js +4 -2
  441. package/neural-interface/public/shared/registry.js +5 -3
  442. package/neural-interface/public/shared/retired-2d.js +3 -0
  443. package/neural-interface/public/shared/schedules-view.js +195 -61
  444. package/neural-interface/public/shared/settings/settings-claude-hooks.js +135 -0
  445. package/neural-interface/public/shared/settings/settings-data.js +3 -1
  446. package/neural-interface/public/shared/settings/settings-ia.js +6 -6
  447. package/neural-interface/public/shared/settings/settings-opencode.js +89 -0
  448. package/neural-interface/public/shared/settings/settings-rules.js +2 -2
  449. package/neural-interface/public/shared/settings/settings-skill-folders-pane.js +265 -0
  450. package/neural-interface/public/shared/settings/settings-skill-folders.js +130 -0
  451. package/neural-interface/public/shared/settings/settings-worker-guard.js +72 -0
  452. package/neural-interface/public/shared/showcase-privacy.js +6 -1
  453. package/neural-interface/public/shared/sidepanel-session-status.js +3 -3
  454. package/neural-interface/public/shared/skills/ss-args.js +96 -0
  455. package/neural-interface/public/shared/skills/ss-creation.js +222 -0
  456. package/neural-interface/public/shared/skills/ss-dialog.js +133 -0
  457. package/neural-interface/public/shared/skills/ss-doc.js +173 -0
  458. package/neural-interface/public/shared/skills/ss-eval-adapters.js +269 -0
  459. package/neural-interface/public/shared/skills/ss-eval-grade.js +359 -0
  460. package/neural-interface/public/shared/skills/ss-eval-optimise.js +153 -0
  461. package/neural-interface/public/shared/skills/ss-eval-plan.js +315 -0
  462. package/neural-interface/public/shared/skills/ss-evals.js +417 -0
  463. package/neural-interface/public/shared/skills/ss-form.js +159 -0
  464. package/neural-interface/public/shared/skills/ss-frontmatter.js +376 -0
  465. package/neural-interface/public/shared/skills/ss-ids.js +32 -0
  466. package/neural-interface/public/shared/skills/ss-lint.js +149 -0
  467. package/neural-interface/public/shared/skills/ss-presets.js +117 -0
  468. package/neural-interface/public/shared/skills/ss-profiles.js +513 -0
  469. package/neural-interface/public/shared/skills/ss-resources.js +165 -0
  470. package/neural-interface/public/shared/skills/ss-review-view.js +190 -0
  471. package/neural-interface/public/shared/skills/ss-tabs.js +79 -0
  472. package/neural-interface/public/shared/skills/ss-unicode.js +135 -0
  473. package/neural-interface/public/shared/skills/studio/sx-actions.js +222 -0
  474. package/neural-interface/public/shared/skills/studio/sx-cm.js +101 -0
  475. package/neural-interface/public/shared/skills/studio/sx-create-ai-view.js +749 -0
  476. package/neural-interface/public/shared/skills/studio/sx-create-ai.js +237 -0
  477. package/neural-interface/public/shared/skills/studio/sx-create-view.js +254 -0
  478. package/neural-interface/public/shared/skills/studio/sx-create.js +126 -0
  479. package/neural-interface/public/shared/skills/studio/sx-diff-view.js +43 -0
  480. package/neural-interface/public/shared/skills/studio/sx-diff.js +133 -0
  481. package/neural-interface/public/shared/skills/studio/sx-docs.js +480 -0
  482. package/neural-interface/public/shared/skills/studio/sx-dom.js +230 -0
  483. package/neural-interface/public/shared/skills/studio/sx-edit-view.js +848 -0
  484. package/neural-interface/public/shared/skills/studio/sx-editor-model.js +193 -0
  485. package/neural-interface/public/shared/skills/studio/sx-errors.js +22 -0
  486. package/neural-interface/public/shared/skills/studio/sx-fixes-view.js +359 -0
  487. package/neural-interface/public/shared/skills/studio/sx-fixes.js +327 -0
  488. package/neural-interface/public/shared/skills/studio/sx-geometry.js +82 -0
  489. package/neural-interface/public/shared/skills/studio/sx-import.js +262 -0
  490. package/neural-interface/public/shared/skills/studio/sx-inspector.js +308 -0
  491. package/neural-interface/public/shared/skills/studio/sx-install-flow.js +282 -0
  492. package/neural-interface/public/shared/skills/studio/sx-install.js +313 -0
  493. package/neural-interface/public/shared/skills/studio/sx-library-view.js +748 -0
  494. package/neural-interface/public/shared/skills/studio/sx-library.js +479 -0
  495. package/neural-interface/public/shared/skills/studio/sx-main.js +690 -0
  496. package/neural-interface/public/shared/skills/studio/sx-operations-view.js +98 -0
  497. package/neural-interface/public/shared/skills/studio/sx-operations.js +11 -0
  498. package/neural-interface/public/shared/skills/studio/sx-plan.js +158 -0
  499. package/neural-interface/public/shared/skills/studio/sx-publish-view.js +621 -0
  500. package/neural-interface/public/shared/skills/studio/sx-review-view.js +369 -0
  501. package/neural-interface/public/shared/skills/studio/sx-review.js +148 -0
  502. package/neural-interface/public/shared/skills/studio/sx-scan.js +35 -0
  503. package/neural-interface/public/shared/skills/studio/sx-snippets.js +96 -0
  504. package/neural-interface/public/shared/skills/studio/sx-subject.js +249 -0
  505. package/neural-interface/public/shared/skills/studio/sx-test-view.js +994 -0
  506. package/neural-interface/public/shared/skills/studio/sx-test.js +328 -0
  507. package/neural-interface/public/shared/skills/studio/sx-versions-view.js +241 -0
  508. package/neural-interface/public/shared/skills/studio/sx-workspace-view.js +426 -0
  509. package/neural-interface/public/shared/state.js +1 -1
  510. package/neural-interface/public/shared/streaming-markdown.js +58 -0
  511. package/neural-interface/public/shared/styleguide/sg-panel.js +4 -2
  512. package/neural-interface/public/shared/styles.css +1822 -1756
  513. package/neural-interface/public/shared/synabun-mascot.js +1115 -9
  514. package/neural-interface/public/shared/text-cache.js +29 -0
  515. package/neural-interface/public/shared/tool-list-picker.js +55 -0
  516. package/neural-interface/public/shared/tool-list-storage.js +24 -0
  517. package/neural-interface/public/shared/tool-list-view.js +112 -0
  518. package/neural-interface/public/shared/topright-overflow-logic.js +54 -0
  519. package/neural-interface/public/shared/tour/tour-actor.js +268 -0
  520. package/neural-interface/public/shared/tour/tour-beats.js +336 -0
  521. package/neural-interface/public/shared/tour/tour-engine.js +884 -0
  522. package/neural-interface/public/shared/tour/tour-ink.js +390 -0
  523. package/neural-interface/public/shared/tour/tour-stage.js +440 -0
  524. package/neural-interface/public/shared/tour/tour-state.js +40 -0
  525. package/neural-interface/public/shared/tour/tour-tips.js +99 -0
  526. package/neural-interface/public/shared/tour/tour.css +144 -0
  527. package/neural-interface/public/shared/ui-antigravity-panel.js +19 -0
  528. package/neural-interface/public/shared/ui-assistant.js +2 -0
  529. package/neural-interface/public/shared/ui-automation-studio.js +111 -140
  530. package/neural-interface/public/shared/ui-claude-panel.js +376 -82
  531. package/neural-interface/public/shared/ui-cli-banner.js +23 -167
  532. package/neural-interface/public/shared/ui-command-runner.js +6 -3
  533. package/neural-interface/public/shared/ui-context-menu.js +295 -0
  534. package/neural-interface/public/shared/ui-cost-widget.js +57 -59
  535. package/neural-interface/public/shared/ui-crash-notice.js +187 -0
  536. package/neural-interface/public/shared/ui-detail.js +15 -3
  537. package/neural-interface/public/shared/ui-file-explorer.js +48 -6
  538. package/neural-interface/public/shared/ui-file-links.js +2 -2
  539. package/neural-interface/public/shared/ui-games.js +2 -2
  540. package/neural-interface/public/shared/ui-image-gallery.js +50 -47
  541. package/neural-interface/public/shared/ui-judgments.js +1 -1
  542. package/neural-interface/public/shared/ui-keybinds.js +33 -2
  543. package/neural-interface/public/shared/ui-link.js +3 -3
  544. package/neural-interface/public/shared/ui-menubar.js +10 -20
  545. package/neural-interface/public/shared/ui-native-loop-router-state.js +5 -0
  546. package/neural-interface/public/shared/ui-native-loop-router.js +11 -1
  547. package/neural-interface/public/shared/ui-navbar.js +49 -24
  548. package/neural-interface/public/shared/ui-notifications.js +1 -0
  549. package/neural-interface/public/shared/ui-panels.js +96 -65
  550. package/neural-interface/public/shared/ui-resume.js +9 -7
  551. package/neural-interface/public/shared/ui-schedules-studio.js +546 -431
  552. package/neural-interface/public/shared/ui-scroll-follow.js +16 -5
  553. package/neural-interface/public/shared/ui-sessions.js +27 -15
  554. package/neural-interface/public/shared/ui-settings.js +683 -526
  555. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +9 -2
  556. package/neural-interface/public/shared/ui-sidepanel-sessions.js +4 -4
  557. package/neural-interface/public/shared/ui-sidepanel-state.js +23 -12
  558. package/neural-interface/public/shared/ui-sidepanel-tray.js +48 -7
  559. package/neural-interface/public/shared/ui-sidepanel-windows.js +18 -13
  560. package/neural-interface/public/shared/ui-skills.js +33 -2830
  561. package/neural-interface/public/shared/ui-styleguide.js +5 -2
  562. package/neural-interface/public/shared/ui-sync.js +15 -5
  563. package/neural-interface/public/shared/ui-terminal.js +270 -190
  564. package/neural-interface/public/shared/ui-tool-updates.js +6 -4
  565. package/neural-interface/public/shared/ui-tooltip.js +81 -51
  566. package/neural-interface/public/shared/ui-topright-overflow.js +233 -0
  567. package/neural-interface/public/shared/ui-trash.js +6 -4
  568. package/neural-interface/public/shared/ui-tutorial-layout.js +3 -117
  569. package/neural-interface/public/shared/ui-tutorial-preview.js +103 -0
  570. package/neural-interface/public/shared/ui-tutorial-steps.js +3 -65
  571. package/neural-interface/public/shared/ui-tutorial.css +47 -100
  572. package/neural-interface/public/shared/ui-tutorial.js +285 -509
  573. package/neural-interface/public/shared/ui-update.js +38 -2
  574. package/neural-interface/public/shared/ui-whiteboard.js +312 -59
  575. package/neural-interface/public/shared/ui-worker-end.js +5 -1
  576. package/neural-interface/public/shared/ui-workspaces.js +3 -2
  577. package/neural-interface/public/shared/view-variant.js +66 -0
  578. package/neural-interface/public/shared/whatsapp/wa-view.js +3 -3
  579. package/neural-interface/public/shared/whiteboard-list.js +172 -0
  580. package/neural-interface/public/shared/worker-end.js +10 -3
  581. package/neural-interface/public/shared/worker-questions.js +34 -0
  582. package/neural-interface/public/shared/worker-restart.js +12 -0
  583. package/neural-interface/public/sidepanel-session.html +2 -2
  584. package/neural-interface/public/variant/2d/background.js +2 -1
  585. package/neural-interface/public/variant/2d/context-menu.js +8 -2
  586. package/neural-interface/public/variant/2d/graph.js +42 -20
  587. package/neural-interface/public/variant/2d/hulls.js +14 -9
  588. package/neural-interface/public/variant/2d/lasso.js +11 -7
  589. package/neural-interface/public/variant/2d/main.js +32 -1
  590. package/neural-interface/public/variant/2d/minimap.js +11 -13
  591. package/neural-interface/public/variant/3d/main.js +69 -6
  592. package/neural-interface/public/variant/3d/map-controls.js +24 -9
  593. package/neural-interface/public/vendor/caveat/OFL.txt +93 -0
  594. package/neural-interface/public/vendor/caveat/caveat-latin-400-normal.woff2 +0 -0
  595. package/neural-interface/public/vendor/caveat/caveat-latin-700-normal.woff2 +0 -0
  596. package/neural-interface/public/vendor/caveat/caveat.css +17 -0
  597. package/neural-interface/public/vendor/caveat/manifest.json +12 -0
  598. package/neural-interface/public/vendor/yaml/LICENSE +13 -0
  599. package/neural-interface/public/vendor/yaml/manifest.json +4 -0
  600. package/neural-interface/public/vendor/yaml/yaml-2.9.1.min.js +137 -0
  601. package/neural-interface/scripts/build-vendor.mjs +32 -0
  602. package/neural-interface/server.js +4553 -2855
  603. package/neural-interface/templates/rulesets/README.md +1 -1
  604. package/neural-interface/templates/rulesets/core.md +1 -1
  605. package/neural-interface/templates/rulesets/legacy-hashes.json +23 -5
  606. package/neural-interface/templates/rulesets/manifest.json +8 -8
  607. package/npm-shrinkwrap.json +34 -12
  608. package/package.json +17 -3
  609. package/postinstall.js +9 -4
  610. package/preuninstall.js +1 -1
  611. package/setup.js +97 -322
  612. package/skills/skill-forge/SKILL.md +177 -0
  613. package/skills/skill-forge/evals/evals.json +54 -0
  614. package/skills/skill-forge/references/package.md +105 -0
  615. package/skills/skill-forge/references/review-and-recovery.md +63 -0
  616. package/skills/skill-forge/references/runtime-profiles.md +20 -0
  617. package/skills/skill-forge/references/sources-and-capabilities.md +51 -0
  618. package/skills/synabun/SKILL.md +10 -7
  619. package/skills/synabun/modules/audit.md +1 -5
  620. package/skills/synabun/modules/changelog.md +1 -5
  621. package/skills/synabun/modules/idea.md +1 -1
  622. package/skills/synabun/modules/memorize.md +6 -9
  623. package/skills/synabun/modules/schedule.md +6 -6
  624. package/mcp-server/dist/services/profiles.d.ts +0 -120
  625. package/mcp-server/dist/services/profiles.d.ts.map +0 -1
  626. package/mcp-server/dist/services/profiles.js +0 -387
  627. package/mcp-server/dist/services/profiles.js.map +0 -1
  628. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +0 -97
  629. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +0 -1
  630. package/mcp-server/dist/tools/leonardo-browser-tools.js +0 -228
  631. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +0 -1
  632. package/mcp-server/dist/tools/leonardo.d.ts +0 -13
  633. package/mcp-server/dist/tools/leonardo.d.ts.map +0 -1
  634. package/mcp-server/dist/tools/leonardo.js +0 -21
  635. package/mcp-server/dist/tools/leonardo.js.map +0 -1
  636. package/mcp-server/dist/tools/profile.d.ts +0 -17
  637. package/mcp-server/dist/tools/profile.d.ts.map +0 -1
  638. package/mcp-server/dist/tools/profile.js +0 -114
  639. package/mcp-server/dist/tools/profile.js.map +0 -1
  640. package/mcp-server/src/services/profiles.ts +0 -428
  641. package/mcp-server/src/tools/leonardo-browser-tools.ts +0 -291
  642. package/mcp-server/src/tools/leonardo.ts +0 -30
  643. package/mcp-server/src/tools/profile.ts +0 -122
  644. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +0 -47
  645. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +0 -62
  646. package/neural-interface/lib/mcp-profile-servers.js +0 -120
  647. package/neural-interface/public/shared/ui-tutorial-draw.js +0 -311
  648. package/skills/leonardo/SKILL.md +0 -168
  649. package/skills/leonardo/icon.svg +0 -1
  650. package/skills/leonardo/modules/browser-guide.md +0 -378
  651. package/skills/leonardo/modules/image-prompter.md +0 -283
  652. package/skills/leonardo/modules/model-advisor.md +0 -100
  653. package/skills/leonardo/modules/prompt-library.md +0 -110
  654. package/skills/leonardo/modules/style-guide.md +0 -186
  655. package/skills/leonardo/modules/video-prompter.md +0 -317
  656. /package/neural-interface/templates/rulesets/{gemini.md → antigravity.md} +0 -0
@@ -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,9 +12,9 @@
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';
15
20
  import { escapeHtml } from '../utils.js';
@@ -21,11 +26,11 @@ const subscribe = (l) => _currentStore.subscribe(l);
21
26
  let _root = null;
22
27
  let _projectDd = null;
23
28
  let _branchDd = null;
24
- let _profileDd = null;
29
+ let _toolsDd = null;
25
30
  let _recallDd = null;
26
31
  let _ctx = null;
27
32
  let _unsubscribe = null;
28
- let _profileSyncUnsub = null;
33
+ let _toolsSyncUnsub = null;
29
34
  let _branchCache = new Map(); // path → { branches, current, ts }
30
35
  let _docClickWired = false;
31
36
  let _docClickHandler = null;
@@ -33,58 +38,35 @@ let _docClickHandler = null;
33
38
  let _recallProfile = 'balanced';
34
39
  let _recallLoaded = false;
35
40
 
36
- let _currentProfile = 'full';
37
- let _defaultProfile = 'full';
38
- let _mcpProfiles = []; // [{ id, label, hint }]
39
- let _profileLoaded = false;
40
- let _profileSyncVersion = 0;
41
- const MCP_SESSION_PROFILE_KEY = 'synabun-opencode-session-mcp-profiles';
42
-
43
- function readSessionProfiles() {
44
- try {
45
- const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
46
- return parsed && typeof parsed === 'object' ? parsed : {};
47
- } 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 {}; }
48
48
  }
49
-
50
- function savedSessionProfile(sessionId) {
51
- if (!sessionId) return null;
52
- 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 }));
53
53
  }
54
-
55
- function saveSessionProfile(sessionId, profile) {
56
- if (!sessionId || !profile) return;
57
- const profiles = readSessionProfiles();
58
- profiles[sessionId] = profile;
59
- storage.setItem(MCP_SESSION_PROFILE_KEY, JSON.stringify(profiles));
60
- }
61
-
62
- async function syncProfileForActiveSession() {
63
- const version = ++_profileSyncVersion;
64
- const state = getState();
65
- // The session this read is for (ocp-v2-binding.js): its answer is that
66
- // session's, and reaches the selector only while the panel is still on it.
54
+ async function syncToolsForActiveSession() {
55
+ const version = ++_toolsSyncVersion;
67
56
  const at = captureBinding(_currentStore);
68
- const sessionId = at.sessionId;
69
- const profile = state.sessionInfo?.mcpProfile
70
- || savedSessionProfile(sessionId)
71
- || _defaultProfile;
72
- _currentProfile = profile;
73
- _currentStore.setMcpProfile(profile);
74
- applyProfileLabel();
75
- 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;
76
64
  try {
77
- const result = await api.mcpProfileGet(sessionId);
78
- const remote = result?.data;
79
- // A running serve is authoritative across windows. If no serve is pinned
80
- // yet, retain the session's persisted browser-side choice for first launch.
81
- if (!remote?.pinned || !remote.profile) return;
82
- if (version !== _profileSyncVersion || !at.isCurrent()) return;
83
- saveSessionProfile(sessionId, remote.profile);
84
- _currentStore.setMcpProfile(remote.profile);
85
- _currentProfile = remote.profile;
86
- applyMcpProfileState(remote.profile, remote.presets);
87
- } 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 */ }
88
70
  }
89
71
 
90
72
  const RECALL_PROFILES_META = [
@@ -116,8 +98,10 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
116
98
  _branchDd = makeDropdown('ocpv2-branch-dd', 'branch', 'Branch', 'ocpv2-dropdown-sm');
117
99
  bar.appendChild(_branchDd);
118
100
 
119
- _profileDd = makeDropdown('ocpv2-profile-dd', 'profile', 'Tool profile', 'ocpv2-dropdown-sm');
120
- 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);
121
105
 
122
106
  _recallDd = makeDropdown('ocpv2-recall-dd', 'recall', 'Recall profile', 'ocpv2-dropdown-sm');
123
107
  bar.appendChild(_recallDd);
@@ -149,35 +133,46 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
149
133
 
150
134
  wireProjectDd();
151
135
  wireBranchDd();
152
- 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 });
153
151
  wireRecallDd();
154
152
  wireDocClick();
155
153
 
156
- // Shared broadcasts update only the default for future sessions. A live
157
- // session keeps its own profile until its scoped serve is restarted.
158
- _profileSyncUnsub = on('mcp:profile-changed', (msg = {}) => {
159
- _defaultProfile = msg.defaultProfile || msg.profile || _defaultProfile;
160
- 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;
161
156
  });
162
157
 
163
158
  _unsubscribe = subscribe((event) => {
164
159
  if (event?.type === 'config:cwd') {
165
160
  syncToCwd(getState().cwd || '');
166
161
  } else if (event?.type === 'session:set') {
162
+ closeDropdowns(_toolsDd, { cancel: true });
167
163
  // Session switch may carry a new directory — sync best-effort.
168
164
  // panel.js owns the canonical setCwd; this is just a defensive refresh.
169
165
  const s = getState();
170
166
  const dir = s.sessionInfo?.directory;
171
167
  if (dir && dir !== getState().cwd) syncToCwd(dir);
172
- syncProfileForActiveSession();
173
- } else if (event?.type === 'config:mcp-profile') {
168
+ syncToolsForActiveSession();
169
+ } else if (event?.type === 'config:tools') {
170
+ closeDropdowns(_toolsDd, { cancel: true });
174
171
  const state = getState();
175
- const profile = state.mcpProfile || _defaultProfile;
176
- if (state.sessionId) saveSessionProfile(state.sessionId, profile);
177
- _currentProfile = profile;
178
- applyProfileLabel();
179
- if (ddIsOpen(_profileDd)) paintProfileMenu();
180
- }
172
+ if (state.sessionId) saveSessionTools(state.sessionId, state.tools);
173
+ paintTools();
174
+ } else { paintTools(); }
175
+
181
176
  });
182
177
 
183
178
  // Initial paint
@@ -186,8 +181,8 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
186
181
  Promise.resolve(_ctx.ensureProjectsLoaded?.()).catch(() => {});
187
182
  // Load saved recall profile so the DD shows the current selection on first open
188
183
  loadRecallProfile().catch(() => {});
189
- // Load active MCP tool profile so its label is correct on first paint
190
- 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(() => {});
191
186
 
192
187
  return {
193
188
  refresh: () => syncToCwd(getState().cwd || ''),
@@ -196,9 +191,9 @@ export function mountProjectBar(rootEl, ctx, store = getDefaultStore()) {
196
191
  }
197
192
 
198
193
  export function unmountProjectBar() {
199
- _profileSyncVersion += 1;
194
+ _toolsSyncVersion += 1;
200
195
  if (_unsubscribe) { try { _unsubscribe(); } catch {} }
201
- if (_profileSyncUnsub) { try { _profileSyncUnsub(); } catch {} }
196
+ if (_toolsSyncUnsub) { try { _toolsSyncUnsub(); } catch {} }
202
197
  if (_docClickWired && _docClickHandler) {
203
198
  document.removeEventListener('mousedown', _docClickHandler);
204
199
  _docClickWired = false;
@@ -208,16 +203,15 @@ export function unmountProjectBar() {
208
203
  _root = null;
209
204
  _projectDd = null;
210
205
  _branchDd = null;
211
- _profileDd = null;
206
+ _toolsDd = null;
212
207
  _recallDd = null;
213
208
  _ctx = null;
214
209
  _unsubscribe = null;
215
- _profileSyncUnsub = null;
210
+ _toolsSyncUnsub = null;
216
211
  _branchCache = new Map();
217
- _profileLoaded = false;
218
- _currentProfile = 'full';
219
- _defaultProfile = 'full';
220
- _mcpProfiles = [];
212
+ _toolsAbort?.abort();
213
+ _capsUnsub?.();
214
+ _toolCatalog = null;
221
215
  }
222
216
 
223
217
  // ── Dropdown construction ──────────────────────────────────────────────────
@@ -244,7 +238,7 @@ function ddSetLabel(dd, text, hasValue) {
244
238
  }
245
239
 
246
240
  // A menu that has to load something before it opens (the project list, the
247
- // 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
248
242
  // user asked for last: not after another menu was opened or everything was
249
243
  // closed while it loaded.
250
244
  const _menuOpenings = latestOnly();
@@ -257,6 +251,7 @@ function ddOpen(dd) {
257
251
  }
258
252
 
259
253
  function ddClose(dd) {
254
+ if (dd?.classList.contains('cc-dropdown')) { closeDropdowns(dd.parentElement); return; }
260
255
  dd?.classList.remove('open');
261
256
  dd?.querySelector('.ocpv2-dd-menu')?.classList.remove('open');
262
257
  }
@@ -435,132 +430,28 @@ function syncToCwd(cwd) {
435
430
  }
436
431
  }
437
432
 
438
- // ── MCP Profile dropdown wiring ────────────────────────────────────────────
439
-
440
- function wireProfileDd() {
441
- _profileDd.addEventListener('click', async (event) => {
442
- if (event.target.closest('.ocpv2-dd-menu')) return;
443
- if (getState().running) return;
444
- if (ddIsOpen(_profileDd)) { ddClose(_profileDd); return; }
445
- const wanted = _menuOpenings.begin();
446
- if (!_profileLoaded) {
447
- try { await loadCurrentProfile(); } catch {}
448
- }
449
- // The menu changes the profile of the session on screen: it does not open
450
- // over a turn that started while the profiles loaded.
451
- if (!wanted() || getState().running) return;
452
- paintProfileMenu();
453
- ddOpen(_profileDd);
454
- });
455
- }
456
-
457
- function mcpProfileItemsFromPresets(presets) {
458
- if (!presets || typeof presets !== 'object') return null;
459
- return Object.entries(presets).map(([id, p]) => ({
460
- id,
461
- label: p?.label || id,
462
- hint: `${p?.tools ?? '?'} tools`,
463
- }));
464
- }
465
-
466
- function applyMcpProfileState(profile, presets) {
467
- if (profile) _currentProfile = profile;
468
- const items = mcpProfileItemsFromPresets(presets);
469
- if (items) _mcpProfiles = items;
470
- applyProfileLabel();
471
- if (ddIsOpen(_profileDd)) paintProfileMenu();
472
- }
473
-
474
- function applyProfileLabel() {
475
- const matched = _mcpProfiles.find((p) => p.id === _currentProfile);
476
- ddSetLabel(_profileDd, matched ? matched.label : _currentProfile, !!_currentProfile);
477
- }
478
-
479
- async function loadCurrentProfile() {
480
- try {
481
- const data = await fetch('/api/mcp/profile').then((r) => r.json());
482
- if (data?.ok) {
483
- _defaultProfile = data.defaultProfile || data.profile || 'full';
484
- applyMcpProfileState(null, data.presets);
485
- await syncProfileForActiveSession();
486
- }
487
- } catch (err) {
488
- console.warn('[ocp-v2-projectbar] loadCurrentProfile failed', err);
489
- } finally {
490
- _profileLoaded = true;
491
- applyProfileLabel();
492
- }
493
- }
494
-
495
- function paintProfileMenu() {
496
- const menu = _profileDd?.querySelector('.ocpv2-dd-menu');
497
- if (!menu) return;
498
- menu.innerHTML = '';
499
- if (!_mcpProfiles.length) {
500
- const empty = document.createElement('div');
501
- empty.className = 'ocpv2-dd-option';
502
- empty.style.cssText = 'opacity:0.4;cursor:default';
503
- empty.textContent = '(empty)';
504
- menu.appendChild(empty);
505
- return;
506
- }
507
- for (const p of _mcpProfiles) {
508
- const opt = document.createElement('div');
509
- opt.className = 'ocpv2-dd-option' + (p.id === _currentProfile ? ' selected' : '');
510
- opt.style.gap = '6px';
511
- opt.innerHTML = `<span>${escapeHtml(p.label)}</span><span class="ocpv2-dd-hint">${escapeHtml(p.hint)}</span>`;
512
- opt.addEventListener('click', async (event) => {
513
- event.stopPropagation();
514
- ddClose(_profileDd);
515
- if (p.id === _currentProfile) return;
516
- const previous = _currentProfile;
517
- const at = captureBinding(_currentStore);
518
- _currentProfile = p.id;
519
- applyProfileLabel();
520
- try { await updateMcpProfile(p.id); }
521
- catch (err) {
522
- // The label is rolled back only where it was changed: after a move the
523
- // selector already shows the profile of the session on screen.
524
- if (at.isCurrent()) {
525
- _currentProfile = previous;
526
- applyProfileLabel();
527
- }
528
- console.error('[ocp-v2-projectbar] updateMcpProfile failed', err);
529
- }
530
- });
531
- menu.appendChild(opt);
532
- }
533
- }
534
-
535
- 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;
536
438
  const state = getState();
537
- if (state.running) throw new Error('Wait for the active turn to finish before changing its MCP profile.');
538
- let effective = profile;
539
- if (state.sessionId) {
540
- // The change is for the session it was asked on (setSessionMcpProfile
541
- // captures it before the request): the answer is saved under that
542
- // session's key, and the store and the selector take it only while the
543
- // panel is still on that binding.
544
- const changed = await setSessionMcpProfile(_currentStore, api, profile, { save: saveSessionProfile });
545
- if (changed?.applied) {
546
- _currentProfile = changed.profile;
547
- applyProfileLabel();
548
- }
549
- 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(() => {});
550
443
  }
551
- // With no active session the selector intentionally edits only the default
552
- // used by runtimes created later.
553
- const response = await fetch('/api/mcp/profile', {
554
- method: 'POST',
555
- headers: { 'Content-Type': 'application/json' },
556
- body: JSON.stringify({ profile: effective }),
557
- });
558
- const payload = await response.json().catch(() => null);
559
- if (!response.ok || payload?.ok === false) {
560
- 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 });
561
453
  }
562
- _defaultProfile = effective;
563
- applyProfileLabel();
454
+ setDropdownDisabled(input, !!state.running);
564
455
  }
565
456
 
566
457
  // ── Recall dropdown wiring ─────────────────────────────────────────────────
@@ -648,3 +539,5 @@ function wireDocClick() {
648
539
  document.addEventListener('mousedown', _docClickHandler);
649
540
  _docClickWired = true;
650
541
  }
542
+
543
+ configureToolPickerTranslation(t);
@@ -284,20 +284,29 @@ export async function rehydratePanelSession(store, api, {
284
284
  const left = () => { out.moved = true; return out; };
285
285
  if (!current()) return left();
286
286
 
287
- if (refreshInfo) {
287
+ if (refreshInfo && requireInfo) {
288
288
  let res;
289
289
  try { res = await api.sessionGet(sessionId); } catch (err) { res = { ok: false, error: err?.message || String(err) }; }
290
290
  if (!current()) return left();
291
291
  if (!replyFailed(res) && res.data) { store.setSession(sessionId, res.data); out.info = true; }
292
- else if (requireInfo) {
292
+ else {
293
293
  out.unavailable = true;
294
294
  out.error = (typeof res?.error === 'string' && res.error) || `Session ${String(sessionId).slice(0, 8)} is unavailable`;
295
295
  return out;
296
296
  }
297
- // Otherwise the transcript may still answer.
298
297
  }
298
+ const infoTask = (refreshInfo && !requireInfo)
299
+ ? (async () => {
300
+ let res;
301
+ try { res = await api.sessionGet(sessionId); } catch (err) { res = { ok: false, error: err?.message || String(err) }; }
302
+ if (!current()) return false;
303
+ if (!replyFailed(res) && res.data) { store.setSession(sessionId, res.data); out.info = true; }
304
+ return true;
305
+ })()
306
+ : null;
299
307
  const transcript = await hydrateTranscript(store, api, { sessionId, isCurrent: current });
300
- if (transcript.superseded) return left();
308
+ if (infoTask) await infoTask;
309
+ if (!current() || transcript.superseded) return left();
301
310
  out.transcript = transcript.applied;
302
311
  if (!transcript.applied) out.error = transcript.error;
303
312
  const s = store.getState();
@@ -10,7 +10,7 @@
10
10
  // ─────────────────────────────────────────────────────────────────────────────
11
11
 
12
12
  import { getDefaultStore } from './ocp-v2-state.js';
13
- import { api, supports, isDescendantSession, isKnownDescendantSession, onEvent } from './ocp-v2-ws.js';
13
+ import { hasWorkerQuestions, api, supports, isDescendantSession, isKnownDescendantSession, onEvent } from './ocp-v2-ws.js';
14
14
  import {
15
15
  permissionCardView, ALWAYS_ALLOW_SCOPE, replyToPermission, FOREIGN_REQUEST_MESSAGE,
16
16
  transcriptQuestionCard, answerQuestion, skipQuestion,
@@ -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();
@@ -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.
@@ -1016,6 +1001,12 @@ function renderToolPart(part, store) {
1016
1001
  done.textContent = 'Question answered.';
1017
1002
  return done;
1018
1003
  }
1004
+ if (hasWorkerQuestions(store.getState().sessionId)) {
1005
+ const stub = document.createElement('div');
1006
+ stub.className = 'ocpv2-part ocpv2-part-question-stub';
1007
+ stub.textContent = store.getState().pendingQuestions?.length ? 'Awaiting your answer…' : 'Question answered.';
1008
+ return stub;
1009
+ }
1019
1010
  // Dedup: if an SSE-driven QuestionRequest exists whose tool.callID matches
1020
1011
  // this tool part, let the pendingQuestions render handle it instead.
1021
1012
  const partCallId = part.callID || part.id;
@@ -1132,7 +1123,7 @@ function renderMessageError(msg, view, store) {
1132
1123
  const at = captureBinding(store);
1133
1124
  if (!at.sessionId) return;
1134
1125
  const res = await api.compact({
1135
- sessionId: at.sessionId, cwd: at.cwd || undefined, mcpProfile: at.mcpProfile || undefined, model: at.model || undefined,
1126
+ sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
1136
1127
  });
1137
1128
  if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
1138
1129
  }, store));
@@ -1329,7 +1320,7 @@ function renderPermissionCard(perm, store) {
1329
1320
  code.textContent = pattern;
1330
1321
  always.appendChild(code);
1331
1322
  });
1332
- // How long it lasts: OpenCode keeps the answer in the running serve, not in a saved list.
1323
+ // How far it reaches: OpenCode 2 saves the answer for the project (its saved permissions).
1333
1324
  always.appendChild(document.createTextNode(` ${ALWAYS_ALLOW_SCOPE}.`));
1334
1325
  body.appendChild(always);
1335
1326
  }
@@ -1006,7 +1006,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
1006
1006
  if (s.running) { store.pushError({ message: 'Wait for the current turn to finish before compacting.' }); return; }
1007
1007
  const at = captureBinding(store);
1008
1008
  const res = await api.compact({
1009
- sessionId: at.sessionId, cwd: at.cwd || undefined, mcpProfile: at.mcpProfile || undefined, model: at.model || undefined,
1009
+ sessionId: at.sessionId, cwd: at.cwd || undefined, tools: at.tools || undefined,
1010
1010
  });
1011
1011
  // A failure of the session the panel has left is not this one's banner.
1012
1012
  if (at.isCurrent() && (res?.error || res?.ok === false)) store.pushError({ message: res?.error || 'Compact failed' });
@@ -1092,7 +1092,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
1092
1092
  variant: turn.variant || undefined,
1093
1093
  parts: parts.length ? parts : undefined,
1094
1094
  cwd: turn.cwd || undefined,
1095
- mcpProfile: turn.mcpProfile || undefined,
1095
+ tools: turn.tools || undefined,
1096
1096
  }), outcome);
1097
1097
  }
1098
1098
 
@@ -1130,7 +1130,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
1130
1130
  agent: turn.agent || undefined,
1131
1131
  model: turn.model || undefined,
1132
1132
  cwd: turn.cwd || undefined,
1133
- mcpProfile: turn.mcpProfile || undefined,
1133
+ tools: turn.tools || undefined,
1134
1134
  }));
1135
1135
  }
1136
1136
 
@@ -1467,7 +1467,7 @@ export function mountCompose(rootEl, store = getDefaultStore(), opts = {}) {
1467
1467
  mode,
1468
1468
  variant: turn.variant || undefined,
1469
1469
  cwd: options.cwd || turn.cwd || undefined,
1470
- mcpProfile: turn.mcpProfile || undefined,
1470
+ tools: turn.tools || undefined,
1471
1471
  // A person's own message (the greeting engine keeps when they were last here), and the
1472
1472
  // greeting this session opened with, told to the model once.
1473
1473
  human: true,