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
@@ -39,14 +39,15 @@ export function createCapabilities() {
39
39
  /**
40
40
  * Send `payload` only when the server lists its type; otherwise resolve the
41
41
  * reply a failed request would have produced, without touching the socket.
42
+ * `options` go to `send` as they are (ocp-v2-ws.js: `turnOf`).
42
43
  */
43
- export function gatedRequest(caps, send, payload, timeoutMs) {
44
+ export function gatedRequest(caps, send, payload, timeoutMs, options) {
44
45
  if (!caps.has(payload?.type)) {
45
46
  return Promise.resolve({
46
47
  type: `${payload?.type}:result`, ok: false, unsupported: true, status: 501, error: UNSUPPORTED_MESSAGE,
47
48
  });
48
49
  }
49
- return send(payload, timeoutMs);
50
+ return options === undefined ? send(payload, timeoutMs) : send(payload, timeoutMs, options);
50
51
  }
51
52
 
52
53
  /** True when a reply is a failure: transport error, ok:false, or HTTP >= 400. */
@@ -59,113 +59,15 @@ export function changesTabs(supports = () => false) {
59
59
  return tabs;
60
60
  }
61
61
 
62
- // ── Worktrees ───────────────────────────────────────────────────────────────
63
-
64
- /**
65
- * Watch one worktree creation from request to ready.
66
- *
67
- * Subscribe before asking OpenCode to create the worktree (worktree.ready can
68
- * beat the reply), then call `identify(name)` with the name the reply carries.
69
- * Until then events are kept, not acted on: `worktree.ready` names its
70
- * worktree, so only the one for `name` counts, and another window's or
71
- * project's creation finishing first changes nothing.
72
- *
73
- * The outcome is decided by that ready event and nothing else. `worktree.failed`
74
- * carries a message and no name (1.18.34: `{ message }`), so a failure cannot
75
- * be told apart from the failure of another creation on the same serve
76
- * (another window, another project). It therefore never ends this creation:
77
- * the message is kept, the wait goes on, and a ready for `name` still wins. If
78
- * no ready arrives before `timeoutMs`, the last resort, the result says so and
79
- * quotes the failure that was seen, as what it is: possibly this creation's,
80
- * possibly not. What this costs: a creation that really failed is reported
81
- * after the timeout instead of at once.
82
- *
83
- * subscribe(listener) raw event subscription, returns unsubscribe
84
- * returns { result, identify(name), cancel(error?) }
85
- * result resolves { ok: true } or { ok: false, error, failureSeen? }
86
- */
87
- export function watchWorktree(subscribe, {
88
- timeoutMs = 60_000, setTimer = setTimeout, clearTimer = clearTimeout,
89
- } = {}) {
90
- let name = '';
91
- let done = false;
92
- let unsubscribe = () => {};
93
- let timer = null;
94
- let failure = ''; // the last unattributable worktree.failed message
95
- const readyNames = new Set(); // worktree.ready seen before identify()
96
- let resolveResult;
97
- const result = new Promise((resolve) => { resolveResult = resolve; });
98
-
99
- const finish = (outcome) => {
100
- if (done) return;
101
- done = true;
102
- if (timer) clearTimer(timer);
103
- try { unsubscribe(); } catch { /* already gone */ }
104
- resolveResult(outcome);
105
- };
106
-
107
- unsubscribe = subscribe((eventType, ev) => {
108
- if (done) return;
109
- if (eventType === 'worktree.ready') {
110
- const readyName = typeof ev?.name === 'string' ? ev.name : '';
111
- if (!readyName) return;
112
- if (!name) readyNames.add(readyName);
113
- else if (readyName === name) finish({ ok: true });
114
- } else if (eventType === 'worktree.failed') {
115
- failure = ev?.message || 'OpenCode could not prepare a worktree.';
116
- }
117
- });
118
- timer = setTimer(() => finish(worktreeTimeoutOutcome(failure)), timeoutMs);
119
-
120
- return {
121
- result,
122
- /** The create reply named the worktree: act on what was seen so far. */
123
- identify(worktreeName) {
124
- if (done || name) return;
125
- name = String(worktreeName || '');
126
- if (!name) { finish({ ok: false, error: 'OpenCode did not name the new worktree.' }); return; }
127
- if (readyNames.has(name)) finish({ ok: true });
128
- },
129
- cancel(error = 'Worktree creation was cancelled.') { finish({ ok: false, error }); },
130
- };
131
- }
132
-
133
- /** What the wait reports when no ready event for the worktree came in time. */
134
- export function worktreeTimeoutOutcome(failure) {
135
- if (!failure) return { ok: false, error: 'The worktree was not ready in time.' };
136
- return {
137
- ok: false,
138
- failureSeen: failure,
139
- error: `The worktree was not ready in time. OpenCode reported a worktree failure meanwhile, which may or may not be this one (the report names no worktree): ${failure}`,
140
- };
141
- }
142
-
143
- /**
144
- * Wait for the worktree called `name` (already known) to be ready.
145
- * Resolves { ok: true } on its worktree.ready, { ok: false, error } on a
146
- * failure or after `timeoutMs`.
147
- */
148
- export function waitForWorktree(subscribe, name, options = {}) {
149
- const watch = watchWorktree(subscribe, options);
150
- watch.identify(name);
151
- return watch.result;
152
- }
153
-
154
62
  // ── New-session dialog ──────────────────────────────────────────────────────
155
63
 
156
64
  /**
157
65
  * What "Save" in the new-session dialog does.
158
- * { project, branch, currentBranch, wantsWorktree, cwd }
159
- * → { worktree, checkout, projectChanged }
160
- * A session in a new worktree never touches the project's own checkout: the
161
- * worktree is created from what the project has checked out now (OpenCode's
162
- * worktree.create takes no base), so no branch is switched for it.
66
+ * { project, branch, currentBranch, cwd } → { checkout, projectChanged }
163
67
  */
164
- export function newSessionPlan({ project = '', branch = '', currentBranch = '', wantsWorktree = false, cwd = '' } = {}) {
165
- const worktree = !!wantsWorktree && !!project;
166
- const switchBranch = !worktree && !!project && !!branch && !!currentBranch && branch !== currentBranch;
68
+ export function newSessionPlan({ project = '', branch = '', currentBranch = '', cwd = '' } = {}) {
69
+ const switchBranch = !!project && !!branch && !!currentBranch && branch !== currentBranch;
167
70
  return {
168
- worktree,
169
71
  checkout: switchBranch ? { path: project, branch } : null,
170
72
  projectChanged: !!project && project !== (cwd || ''),
171
73
  };
@@ -20,6 +20,7 @@ import { state, emit } from '../state.js';
20
20
  import { injectStyles } from './ocp-v2-styles.js';
21
21
  import { getDefaultStore } from './ocp-v2-state.js';
22
22
  import { wireFileLinks } from '../ui-file-links.js';
23
+ import { frameRect } from '../app-frame.js';
23
24
  import { mountRenderer } from './ocp-v2-render.js';
24
25
  import { mountCompose } from './ocp-v2-send.js';
25
26
  import { trackContextGauge } from './ocp-v2-context-gauge.js';
@@ -117,7 +118,8 @@ export function createChildPanel({
117
118
 
118
119
  // The chain of parents (replaces the session-menu dropdown — a sub-agent
119
120
  // panel has only one session). The first crumb is the session in the main
120
- // panel; one after it is a sub-agent that has this one as its sub-agent.
121
+ // panel (the way back, on screen at every width); one after it is a
122
+ // sub-agent that has this one as its sub-agent.
121
123
  _crumbsEl = document.createElement('div');
122
124
  _crumbsEl.className = 'ocpv2-child-crumbs';
123
125
  header.appendChild(_crumbsEl);
@@ -204,6 +206,7 @@ export function createChildPanel({
204
206
  _contextGauge = trackContextGauge(store);
205
207
  _compactControl = createCompactControl(store);
206
208
  _contextMenu = mountContextMenu(actions, panel, store, {
209
+ bounds: frameRect, // the popover stays in the app frame
207
210
  compact: _compactControl,
208
211
  agent: () => _taskInfo?.subagentType || '',
209
212
  });
@@ -361,10 +364,14 @@ export function createChildPanel({
361
364
  // (The first crumb keeps the class the single parent link had.)
362
365
  crumb.className = index ? 'ocpv2-child-crumb' : 'ocpv2-child-crumb ocpv2-child-parent-link';
363
366
  crumb.dataset.sessionId = String(parent.sessionId || '');
364
- crumb.setAttribute('data-tooltip', index ? `Open sub-agent ${title}` : `Back to ${title}`);
367
+ // Named by what it does: in a narrow header the way back is its arrow alone.
368
+ const name = index ? `Open sub-agent ${title}` : `Back to ${title}`;
369
+ crumb.setAttribute('data-tooltip', name);
370
+ crumb.setAttribute('aria-label', name);
365
371
  if (!index) {
366
372
  const arrow = document.createElement('span');
367
373
  arrow.className = 'ocpv2-child-parent-arrow';
374
+ arrow.setAttribute('aria-hidden', 'true');
368
375
  arrow.textContent = '↳';
369
376
  crumb.appendChild(arrow);
370
377
  }
@@ -40,9 +40,7 @@ export function createCompactControl(store = getDefaultStore()) {
40
40
  const res = await api.compact({
41
41
  sessionId: at.sessionId,
42
42
  cwd: s.cwd || undefined,
43
- mcpProfile: s.mcpProfile || undefined,
44
- // OpenCode 1.18 compacts through session.summarize, which needs a model.
45
- model: s.model || undefined,
43
+ tools: s.tools || undefined,
46
44
  });
47
45
  if (at.isCurrent() && (res?.error || res?.ok === false)) {
48
46
  const msg = res?.error || res?.data?.error || 'Compact failed';
@@ -20,8 +20,6 @@ export const LOCAL_SLASH_COMMANDS = Object.freeze([
20
20
  { name: 'compact', description: 'Compact context', action: 'compact', aliases: ['summarize'] },
21
21
  { name: 'undo', description: 'Undo the last prompt', action: 'undo', needs: ['session:revert'] },
22
22
  { name: 'redo', description: 'Restore what was undone', action: 'redo', needs: ['session:unrevert'] },
23
- { name: 'share', description: 'Share this session (public link)', action: 'share', needs: ['session:share', 'session:unshare'] },
24
- { name: 'unshare', description: 'Stop sharing this session', action: 'unshare', needs: ['session:share', 'session:unshare'] },
25
23
  { name: 'export', description: 'Export the transcript as JSON', action: 'export' },
26
24
  { name: 'fork', description: 'Fork this session', action: 'fork', needs: ['session:fork'] },
27
25
  { name: 'models', description: 'Pick a model', action: 'models' },
@@ -49,9 +47,8 @@ const SERVER_SOURCES = new Set(['command', 'skill', 'mcp']);
49
47
  * legacy { skills, userCommands } from the pre-SDK REST lists, used
50
48
  * only when serverCommands is null
51
49
  * supports(type) capability check
52
- * sharePolicy OpenCode's `share` setting; 'disabled' removes /share and /unshare
53
50
  */
54
- export function buildSlashCatalog({ serverCommands = null, legacy = null, supports = () => false, sharePolicy = null } = {}) {
51
+ export function buildSlashCatalog({ serverCommands = null, legacy = null, supports = () => false } = {}) {
55
52
  const out = [];
56
53
  const seen = new Set();
57
54
  const add = (entry) => {
@@ -62,7 +59,6 @@ export function buildSlashCatalog({ serverCommands = null, legacy = null, suppor
62
59
  };
63
60
  for (const cmd of LOCAL_SLASH_COMMANDS) {
64
61
  if ((cmd.needs || []).some((type) => !supports(type))) continue;
65
- if (sharePolicy === 'disabled' && (cmd.action === 'share' || cmd.action === 'unshare')) continue;
66
62
  add({ name: cmd.name, description: cmd.description, aliases: cmd.aliases || [], source: 'builtin', kind: 'local', action: cmd.action });
67
63
  }
68
64
  const canRun = supports('command:run');
@@ -153,7 +149,7 @@ export function helpCardView({ catalog = [], supports = () => false, canAct = tr
153
149
  name: 'Enter',
154
150
  text: 'While a turn runs, Enter queues the prompt. The queue is listed above the box and sent in order when the turn ends; after a failed turn it waits for Resume.',
155
151
  }] });
156
- const mine = ['Copy', canAct && supports('session:revert') && 'Undo to here', canAct && supports('session:fork') && 'Fork from here', canAct && supports('message:delete') && 'Delete'].filter(Boolean);
152
+ const mine = ['Copy', canAct && supports('session:revert') && 'Undo to here', canAct && supports('session:fork') && 'Fork from here'].filter(Boolean);
157
153
  const replies = ['Copy', canAct && supports('session:revert') && 'Retry'].filter(Boolean);
158
154
  sections.push({ title: 'Message actions', rows: [
159
155
  { name: 'Your prompts', text: `Hover one: ${mine.join(', ')}.` },
@@ -12,7 +12,7 @@
12
12
  // every render reads the store again.
13
13
  // ─────────────────────────────────────────────────────────────────────────────
14
14
 
15
- import { api, supports, onEvent, sdkVersion } from './ocp-v2-ws.js';
15
+ import { api, supports, onEvent } from './ocp-v2-ws.js';
16
16
  import { getDefaultStore } from './ocp-v2-state.js';
17
17
  import { replyFailed, replyError } from './ocp-v2-caps.js';
18
18
  import { boundReader, onRebind } from './ocp-v2-binding.js';
@@ -199,6 +199,7 @@ function turnsOf(s) {
199
199
  * opts.onManage() opens the MCP manager; without it there is no "Manage"
200
200
  * opts.onOpen() the popover is about to open (the panel closes its other menus)
201
201
  * opts.agent() the agent this panel's session runs as, when the panel knows better than the store
202
+ * opts.bounds() the area the popover stays in ({ left, top, right, bottom }: the app frame); the window without it
202
203
  * Returns { element, open(), close({ focus }), isOpen(), sync(), destroy() }.
203
204
  */
204
205
  export function mountContextMenu(actionsEl, panelEl, store = getDefaultStore(), opts = {}) {
@@ -244,7 +245,6 @@ export function mountContextMenu(actionsEl, panelEl, store = getDefaultStore(),
244
245
  // A sub-agent's store hears the version only on a status change; the
245
246
  // main one has it from init, and there is one OpenCode behind both.
246
247
  serverVersion: s.serverVersion || getDefaultStore().getState().serverVersion || '',
247
- sdkVersion: sdkVersion(),
248
248
  updateAvailable: updateAvailableVersion(),
249
249
  sessionId: s.sessionId || '',
250
250
  folder: s.cwd || s.sessionInfo?.directory || '',
@@ -278,23 +278,23 @@ export function mountContextMenu(actionsEl, panelEl, store = getDefaultStore(),
278
278
  }
279
279
 
280
280
  // Below the cog, its right edge on the cog's; above it when there is more room
281
- // there; always inside the viewport, scrolling inside when it is taller.
281
+ // there; always inside the app frame, scrolling inside when it is taller.
282
282
  function place() {
283
283
  if (!open || !pop) return;
284
284
  const r = cog.getBoundingClientRect();
285
- const vw = window.innerWidth;
286
- const vh = window.innerHeight;
287
- const width = Math.max(0, Math.min(WIDTH, vw - MARGIN * 2));
285
+ // Inside the area the panel names (the app frame), else the window
286
+ const f = opts.bounds?.() || { left: 0, top: 0, right: window.innerWidth, bottom: window.innerHeight, width: window.innerWidth };
287
+ const width = Math.max(0, Math.min(WIDTH, f.width - MARGIN * 2));
288
288
  pop.style.width = `${width}px`;
289
- const below = vh - r.bottom - GAP - MARGIN;
290
- const above = r.top - GAP - MARGIN;
289
+ const below = f.bottom - r.bottom - GAP - MARGIN;
290
+ const above = r.top - f.top - GAP - MARGIN;
291
291
  const up = below < 220 && above > below;
292
292
  pop.style.maxHeight = `${Math.max(120, up ? above : below)}px`;
293
293
  const height = pop.offsetHeight;
294
- const left = Math.max(MARGIN, Math.min(r.right - width, vw - width - MARGIN));
294
+ const left = Math.max(f.left + MARGIN, Math.min(r.right - width, f.right - width - MARGIN));
295
295
  const top = up
296
- ? Math.max(MARGIN, r.top - GAP - height)
297
- : Math.max(MARGIN, Math.min(r.bottom + GAP, vh - MARGIN - height));
296
+ ? Math.max(f.top + MARGIN, r.top - GAP - height)
297
+ : Math.max(f.top + MARGIN, Math.min(r.bottom + GAP, f.bottom - MARGIN - height));
298
298
  pop.style.left = `${Math.round(left)}px`;
299
299
  pop.style.top = `${Math.round(top)}px`;
300
300
  // Once it has its width: only now is a cut value known.
@@ -143,9 +143,6 @@ export function contextMenuModel(d = {}) {
143
143
  const notice = updateNoticeText(d.updateAvailable, d.serverVersion);
144
144
  const versions = [['OpenCode', d.serverVersion ? String(d.serverVersion) : NOT_REPORTED]];
145
145
  if (notice) versions.push(['Update', `${String(d.updateAvailable).replace(/^v/i, '')} available`, notice]);
146
- versions.push(d.sdkVersion
147
- ? ['OpenCode SDK', String(d.sdkVersion), '@opencode-ai/sdk, the client SynaBun talks to OpenCode through']
148
- : ['OpenCode SDK', NOT_REPORTED, d.serverVersion ? 'Restart SynaBun to see the SDK version here.' : '']);
149
146
 
150
147
  const sessionId = d.sessionId ? String(d.sessionId) : '';
151
148
  const sessionRows = [
@@ -1,3 +1,4 @@
1
+ import { toolWord } from '../tool-list-picker.js';
1
2
  // ─────────────────────────────────────────────────────────────────────────────
2
3
  // OpenCode V2 — events → store (no DOM, no socket)
3
4
  // One function per concern so node:test can drive them with a real store:
@@ -188,12 +189,15 @@ export function applyEvent(store, eventType, ev = {}, hooks = {}) {
188
189
  case 'session.diff':
189
190
  store.setSessionDiff(ev.diff);
190
191
  break;
191
- case 'mcp.profile.changed':
192
- store.setMcpProfile(ev.profile || null);
192
+ case 'synabun.mcp.status':
193
+ if (ev.text) store.pushError({ message: ev.text, notice: true });
193
194
  break;
194
- case 'mcp.profile.refresh.failed':
195
+ case 'mcp.tools.changed':
196
+ store.setTools(ev.tools ?? null);
197
+ break;
198
+ case 'mcp.tools.refresh.failed':
195
199
  store.pushError({
196
- message: ev.error || `MCP profile changed to ${ev.profile || 'the requested profile'}, but OpenCode could not reload its tools.`,
200
+ message: ev.error || toolWord('reloadFailed'),
197
201
  raw: ev,
198
202
  });
199
203
  break;
@@ -28,7 +28,7 @@ import { on } from '../state.js';
28
28
  import { setSidepanelVisible } from '../ui-sidepanel-windows.js';
29
29
  import { createPanelStore } from './ocp-v2-state.js';
30
30
  import { createChildPanel } from './ocp-v2-childpanel.js';
31
- import { inheritChildPanelMcpProfile } from './ocp-v2-profile-inheritance.js';
31
+ import { inheritChildPanelTools } from './ocp-v2-tools-inheritance.js';
32
32
  import { notify as uiNotify, NOTIF_TYPE } from '../ui-notifications.js';
33
33
  import {
34
34
  isAutomationSession, onAutomationSessionRegistered, shouldMaterializeChildPanel,
@@ -513,12 +513,12 @@ function parentTitleFor(reg, parentSid) {
513
513
  } catch { return 'parent'; }
514
514
  }
515
515
 
516
- // The tool profile the user chose for a session (the project bar saves it
516
+ // The tool list the user chose for a session (the project bar saves it
517
517
  // under this key): what a sub-agent of a session that is not on screen inherits.
518
- const MCP_SESSION_PROFILE_KEY = 'synabun-opencode-session-mcp-profiles';
519
- function savedSessionProfile(sessionId) {
518
+ const MCP_SESSION_TOOLS_KEY = 'synabun-opencode-session-tools';
519
+ function savedSessionTools(sessionId) {
520
520
  try {
521
- const parsed = JSON.parse(storage.getItem(MCP_SESSION_PROFILE_KEY) || '{}');
521
+ const parsed = JSON.parse(storage.getItem(MCP_SESSION_TOOLS_KEY) || '{}');
522
522
  return (parsed && typeof parsed === 'object' && parsed[sessionId]) || null;
523
523
  } catch { return null; }
524
524
  }
@@ -529,8 +529,8 @@ function spawnChildPanel({ childSessionId, childInfo, parentPanelId, parentSessi
529
529
  store.setSession(childSessionId, childInfo || null);
530
530
  store.setParentSession(parentSessionId, parentPanelId);
531
531
  // The parent's profile: the primary store's only while it is bound to that
532
- // parent (see inheritChildPanelMcpProfile).
533
- inheritChildPanelMcpProfile(store, _primary?.store, childInfo, { parentSessionId, savedProfile: savedSessionProfile });
532
+ // parent (see inheritChildPanelTools).
533
+ inheritChildPanelTools(store, _primary?.store, childInfo, { parentSessionId, savedTools: savedSessionTools });
534
534
 
535
535
  const wsUnsub = subscribeSession(childSessionId, store);
536
536
 
@@ -6,6 +6,7 @@
6
6
  // ─────────────────────────────────────────────────────────────────────────────
7
7
 
8
8
  import { fetchProvidersFull } from './ocp-v2-providers.js';
9
+ import { opencodeProviders } from '../opencode-providers.js';
9
10
  import { modelRowMeta } from './ocp-v2-status-logic.js';
10
11
  import { openProviderSettings } from './ocp-v2-settings-link.js';
11
12
  import { getDefaultStore } from './ocp-v2-state.js';
@@ -49,6 +50,7 @@ let _unsubscribe = null;
49
50
  let _outsideHandler = null;
50
51
  let _providersChangedHandler = null;
51
52
  let _hiddenModelsChangedHandler = null;
53
+ let _providersCacheStop = null;
52
54
 
53
55
  let _providers = []; // [{ id, name, models: [...] }]
54
56
  let _connected = new Set();
@@ -88,7 +90,15 @@ export function mountModelPicker(rootEl, store = getDefaultStore()) {
88
90
  _dd.addEventListener('click', async (event) => {
89
91
  if (event.target.closest('.ocpv2-dd-menu')) return;
90
92
  if (_dd.classList.contains('open')) { closeMenu(); return; }
91
- if (!_loaded) { try { await ensureLoaded(); } catch {} }
93
+ // The kept list opens the menu at once; only a list never read shows "Loading…" until it arrives.
94
+ if (!_loaded) adoptKeptProviders();
95
+ if (!_loaded) {
96
+ paintMenu('');
97
+ openMenu();
98
+ try { await ensureLoaded(); } catch {}
99
+ repaintOpenMenu();
100
+ return;
101
+ }
92
102
  paintMenu('');
93
103
  openMenu();
94
104
  });
@@ -101,11 +111,11 @@ export function mountModelPicker(rootEl, store = getDefaultStore()) {
101
111
  document.addEventListener('mousedown', _outsideHandler);
102
112
 
103
113
  _providersChangedHandler = () => { refreshProviders(); };
104
- _hiddenModelsChangedHandler = () => {
105
- if (_dd?.classList.contains('open')) paintMenu(_searchInput?.value || '');
106
- };
114
+ _hiddenModelsChangedHandler = () => { repaintOpenMenu(); };
107
115
  document.addEventListener('ocp-providers-changed', _providersChangedHandler);
108
116
  document.addEventListener('ocp-hidden-models-changed', _hiddenModelsChangedHandler);
117
+ // A background read of the kept list brought another one: the open menu follows in place.
118
+ _providersCacheStop = opencodeProviders.subscribe(() => { refreshProviders(); });
109
119
 
110
120
  _unsubscribe = subscribe((event) => {
111
121
  if (event?.type === 'config:model') applyLabelFromState();
@@ -120,6 +130,8 @@ export function unmountModelPicker() {
120
130
  if (_outsideHandler) document.removeEventListener('mousedown', _outsideHandler);
121
131
  if (_providersChangedHandler) document.removeEventListener('ocp-providers-changed', _providersChangedHandler);
122
132
  if (_hiddenModelsChangedHandler) document.removeEventListener('ocp-hidden-models-changed', _hiddenModelsChangedHandler);
133
+ try { _providersCacheStop?.(); } catch {}
134
+ _providersCacheStop = null;
123
135
  _outsideHandler = null;
124
136
  _providersChangedHandler = null;
125
137
  _hiddenModelsChangedHandler = null;
@@ -134,6 +146,26 @@ export function unmountModelPicker() {
134
146
 
135
147
  // ── Loading providers ──────────────────────────────────────────────────────
136
148
 
149
+ function applyProviders(res) {
150
+ if (res?.ok === false) throw new Error(res.error || 'provider metadata unavailable');
151
+ const data = res?.data || {};
152
+ _providers = data.all || data.providers || (Array.isArray(data) ? data : []);
153
+ _connected = new Set(data.connected || []);
154
+ // If the server didn't tell us which providers are "connected", assume all
155
+ // returned providers are connected so the menu isn't empty.
156
+ if (!_connected.size && _providers.length) {
157
+ _connected = new Set(_providers.map((p) => p.id).filter(Boolean));
158
+ }
159
+ _loaded = true;
160
+ }
161
+
162
+ // The list the page already holds (data cache, read at launch or by another module): no request.
163
+ function adoptKeptProviders() {
164
+ const kept = opencodeProviders.peek('');
165
+ if (!kept || kept.ok === false) return;
166
+ try { applyProviders(kept); } catch { /* not a list: read it */ }
167
+ }
168
+
137
169
  async function ensureLoaded() {
138
170
  if (_loaded) return;
139
171
  if (_loadInflight) return _loadInflight;
@@ -142,16 +174,7 @@ async function ensureLoaded() {
142
174
  try {
143
175
  const res = await fetchProvidersFull();
144
176
  if (generation !== _loadGeneration) return;
145
- if (res?.ok === false) throw new Error(res.error || 'provider metadata unavailable');
146
- const data = res?.data || {};
147
- _providers = data.all || data.providers || (Array.isArray(data) ? data : []);
148
- _connected = new Set(data.connected || []);
149
- // If the server didn't tell us which providers are "connected", assume all
150
- // returned providers are connected so the menu isn't empty.
151
- if (!_connected.size && _providers.length) {
152
- _connected = new Set(_providers.map((p) => p.id).filter(Boolean));
153
- }
154
- _loaded = true;
177
+ applyProviders(res);
155
178
  } catch (err) {
156
179
  console.warn('[ocp-v2-modelpicker] providers fetch failed', err);
157
180
  } finally {
@@ -165,9 +188,23 @@ function refreshProviders() {
165
188
  _loaded = false;
166
189
  _loadInflight = null;
167
190
  _loadGeneration += 1;
168
- return ensureLoaded().finally(() => {
169
- if (_dd?.classList.contains('open')) paintMenu(_searchInput?.value || '');
170
- });
191
+ return ensureLoaded().finally(() => { repaintOpenMenu(); });
192
+ }
193
+
194
+ // The open menu drawn again from the current list: the search text, its caret and the scroll position stay,
195
+ // and focus is put back only where it was.
196
+ function repaintOpenMenu() {
197
+ if (!_dd?.classList.contains('open') || !_menu) return;
198
+ const input = _searchInput;
199
+ const typing = !!input && document.activeElement === input;
200
+ const caret = typing ? [input.selectionStart, input.selectionEnd] : null;
201
+ const scrollTop = _menu.scrollTop;
202
+ paintMenu(input?.value || '');
203
+ _menu.scrollTop = scrollTop;
204
+ if (typing && _searchInput) {
205
+ try { _searchInput.focus({ preventScroll: true }); } catch { _searchInput.focus(); }
206
+ try { if (caret) _searchInput.setSelectionRange(caret[0], caret[1]); } catch { /* not a text field */ }
207
+ }
171
208
  }
172
209
 
173
210
  // ── Label sync ─────────────────────────────────────────────────────────────
@@ -0,0 +1,16 @@
1
+ // Running is a display hint: tool activity, replay and automation reattachment
2
+ // can all set it. Only a new prompt gives completion notifications a new owner.
3
+ export function createOutcomeNotifications() {
4
+ const outcomes = new Map();
5
+ return {
6
+ take(state, type) {
7
+ const prompt = [...(state.messageOrder || [])].reverse().find(id => state.messages?.get(id)?.role === 'user');
8
+ const key = `${state.sessionId || ''}:${prompt || ''}`;
9
+ const last = outcomes.get(key);
10
+ if (last === type || (last === 'error' && type === 'done')) return false;
11
+ outcomes.set(key, type);
12
+ if (outcomes.size > 200) outcomes.delete(outcomes.keys().next().value);
13
+ return true;
14
+ },
15
+ };
16
+ }