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
@@ -0,0 +1,192 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun Neural Interface — App frame
3
+ // The inset rounded card the workspace sits in (styles.css "APP FRAME"). Outside it is the chrome: the title bar,
4
+ // the two explorers and a gutter of their tone. Inside it is everything else: the 3D and 2D graphs, every floating
5
+ // window and panel, the terminal, menus, tooltips and popovers. Modals and full-window backdrops still cover the
6
+ // whole window.
7
+ //
8
+ // One source of geometry: the CSS variables of :root (--navbar-height, --explorer-width, --file-explorer-width and
9
+ // --frame-gap, which is 0 on a page without the frame). frameRect() is the rect every clamp uses instead of 0,
10
+ // innerWidth, innerHeight or --navbar-height. The top half of this file is DOM-free (unit-tested).
11
+ // ═══════════════════════════════════════════
12
+
13
+ /** The class on <html> of a page that draws the frame (html-shell.js). */
14
+ export const FRAMED_CLASS = 'app-framed';
15
+
16
+ const num = (value) => {
17
+ const n = Number.parseFloat(value);
18
+ return Number.isFinite(n) ? n : 0;
19
+ };
20
+
21
+ /**
22
+ * The frame's rect in viewport pixels from the window's size and the chrome around it: the navbar's height, the
23
+ * open explorers' width and the gutter. A frame the window is too small for collapses to a zero-size rect at its
24
+ * top-left corner instead of turning inside out.
25
+ */
26
+ export function computeFrameRect({ viewportWidth = 0, viewportHeight = 0, navbarHeight = 0, sidebarWidth = 0, gap = 0 } = {}) {
27
+ const g = Math.max(0, num(gap));
28
+ const left = Math.max(0, num(sidebarWidth)) + g;
29
+ const top = Math.max(0, num(navbarHeight)) + g;
30
+ const right = Math.max(left, num(viewportWidth) - g);
31
+ const bottom = Math.max(top, num(viewportHeight) - g);
32
+ return { left, top, right, bottom, width: right - left, height: bottom - top, gap: g };
33
+ }
34
+
35
+ /** The area a menu, tooltip or popover for a point is kept in: `frame` when the point is inside it, else null (the
36
+ * window: the bar and the explorers are outside the frame, and what opens from them stays by them). */
37
+ export function boundsForPoint(frame, x, y) {
38
+ if (!frame || !Number.isFinite(x) || !Number.isFinite(y)) return null;
39
+ return x >= frame.left && x <= frame.right && y >= frame.top && y <= frame.bottom ? frame : null;
40
+ }
41
+
42
+ /** A rect `margin` pixels inside another (never inverted). */
43
+ export function insetRect(rect, margin = 0) {
44
+ const m = Math.max(0, num(margin));
45
+ const left = rect.left + m, top = rect.top + m;
46
+ const right = Math.max(left, rect.right - m), bottom = Math.max(top, rect.bottom - m);
47
+ return { ...rect, left, top, right, bottom, width: right - left, height: bottom - top };
48
+ }
49
+
50
+ /**
51
+ * Where a box of `width` × `height` at (x, y) goes to stay inside `bounds`. A box larger than the bounds keeps its
52
+ * top-left corner inside them (its header stays reachable), the same rule the old window clamps followed.
53
+ */
54
+ export function clampBox(x, y, width, height, bounds) {
55
+ return {
56
+ x: Math.max(bounds.left, Math.min(num(x), bounds.right - Math.max(0, num(width)))),
57
+ y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - Math.max(0, num(height)))),
58
+ };
59
+ }
60
+
61
+ /**
62
+ * Where a box goes that must keep only `keep` pixels on screen (the floating terminals): its left edge may run
63
+ * past the frame's left side and its right side past the frame's right, but its top never above the frame's top
64
+ * (the header stays reachable).
65
+ */
66
+ export function clampBoxLoose(x, y, width, height, bounds, keep = 80) {
67
+ const k = Math.max(0, num(keep));
68
+ return {
69
+ x: Math.max(bounds.left + k - Math.max(0, num(width)), Math.min(num(x), bounds.right - k)),
70
+ y: Math.max(bounds.top, Math.min(num(y), bounds.bottom - k)),
71
+ };
72
+ }
73
+
74
+ // ── Page side ──
75
+
76
+ let _cacheKey = '';
77
+ let _cacheRect = null;
78
+
79
+ const isFramed = (el) => !!el?.classList?.contains?.(FRAMED_CLASS);
80
+
81
+ function inlineKey(el, win) {
82
+ const s = el.style;
83
+ return [
84
+ isFramed(el) ? 1 : 0,
85
+ s.getPropertyValue('--navbar-height'),
86
+ s.getPropertyValue('--explorer-width'),
87
+ s.getPropertyValue('--file-explorer-width'),
88
+ s.getPropertyValue('--frame-gap'),
89
+ win.innerWidth,
90
+ win.innerHeight,
91
+ ].join('|');
92
+ }
93
+
94
+ /**
95
+ * The frame's rect now, in viewport pixels. Cheap to call per pointer event: the computed style is read only when
96
+ * the window's size or one of the inline variables it depends on changed since the last call. A page without the
97
+ * frame (a detached session window, onboarding) has no bar or explorers around its content: the whole window.
98
+ */
99
+ export function frameRect(win = typeof window !== 'undefined' ? window : null) {
100
+ const whole = () => computeFrameRect({ viewportWidth: win?.innerWidth || 0, viewportHeight: win?.innerHeight || 0 });
101
+ const el = win?.document?.documentElement;
102
+ if (!el || !isFramed(el) || typeof win.getComputedStyle !== 'function') return whole();
103
+ try {
104
+ const key = inlineKey(el, win);
105
+ if (key === _cacheKey && _cacheRect) return _cacheRect;
106
+ const cs = win.getComputedStyle(el);
107
+ const navbar = cs.getPropertyValue('--navbar-height');
108
+ _cacheRect = computeFrameRect({
109
+ viewportWidth: win.innerWidth,
110
+ viewportHeight: win.innerHeight,
111
+ navbarHeight: navbar.trim() ? num(navbar) : 48,
112
+ sidebarWidth: num(cs.getPropertyValue('--explorer-width')) + num(cs.getPropertyValue('--file-explorer-width')),
113
+ gap: num(cs.getPropertyValue('--frame-gap')),
114
+ });
115
+ _cacheKey = key;
116
+ return _cacheRect;
117
+ } catch {
118
+ return whole();
119
+ }
120
+ }
121
+
122
+ /** Keep a box inside the frame (inset by `margin`): `{ x, y }` for its top-left corner. */
123
+ export function clampToFrame(x, y, width, height, margin = 0) {
124
+ return clampBox(x, y, width, height, insetRect(frameRect(), margin));
125
+ }
126
+
127
+ /** The area a window of `width` × `height` is kept in: the frame when it fits there, else the whole window less
128
+ * 8px (a modal taller than the frame still shows whole, as it did before the frame). */
129
+ export function windowArea(width, height, rect = frameRect()) {
130
+ if (width <= rect.width && height <= rect.height) return rect;
131
+ const vw = typeof window !== 'undefined' ? window.innerWidth : rect.right;
132
+ const vh = typeof window !== 'undefined' ? window.innerHeight : rect.bottom;
133
+ return insetRect(computeFrameRect({ viewportWidth: vw, viewportHeight: vh }), 8);
134
+ }
135
+
136
+ /** Where a window of `width` × `height` opens by default: centred in the frame, inside it (windowArea). */
137
+ export function centeredInFrame(width, height, rect = frameRect()) {
138
+ const area = windowArea(width, height, rect);
139
+ const at = clampBox(area.left + (area.width - width) / 2, area.top + (area.height - height) / 2, width, height, area);
140
+ return { left: Math.round(at.x), top: Math.round(at.y) };
141
+ }
142
+
143
+ /** The area kept for something opened at a point: the frame when the point is in it, else the whole window. */
144
+ export function placementArea(x, y) {
145
+ const f = frameRect();
146
+ return boundsForPoint(f, x, y) || computeFrameRect({ viewportWidth: window.innerWidth, viewportHeight: window.innerHeight });
147
+ }
148
+
149
+ const _listeners = new Set();
150
+ let _watching = false;
151
+ let _lastNotified = '';
152
+ let _notifyRaf = 0;
153
+
154
+ function notify() {
155
+ _notifyRaf = 0;
156
+ const rect = frameRect();
157
+ const key = `${rect.left}|${rect.top}|${rect.right}|${rect.bottom}`;
158
+ if (key === _lastNotified) return;
159
+ _lastNotified = key;
160
+ for (const fn of [..._listeners]) {
161
+ try { fn(rect); } catch (err) { console.error('[app-frame] listener failed', err); }
162
+ }
163
+ }
164
+
165
+ function schedule() {
166
+ if (_notifyRaf) return;
167
+ _notifyRaf = typeof requestAnimationFrame === 'function' ? requestAnimationFrame(notify) : setTimeout(notify, 16);
168
+ }
169
+
170
+ function watch() {
171
+ if (_watching || typeof window === 'undefined' || !window.document?.documentElement) return;
172
+ _watching = true;
173
+ const r = frameRect();
174
+ _lastNotified = `${r.left}|${r.top}|${r.right}|${r.bottom}`;
175
+ window.addEventListener?.('resize', schedule);
176
+ // An explorer opening or closing, the navbar's measured height and the frame's own class all land on <html>'s
177
+ // inline style or class list. Writes the frame does not depend on (--terminal-height, --right-panel-width…) are
178
+ // filtered out by the rect comparison in notify().
179
+ if (typeof MutationObserver === 'function') {
180
+ new MutationObserver(schedule).observe(window.document.documentElement, { attributes: true, attributeFilter: ['style', 'class'] });
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Call `fn(rect)` once per frame in which the frame's rect changed (window resize, an explorer opening or closing,
186
+ * the navbar's height). Returns the unsubscribe function.
187
+ */
188
+ export function onFrameChange(fn) {
189
+ _listeners.add(fn);
190
+ watch();
191
+ return () => _listeners.delete(fn);
192
+ }
@@ -11,16 +11,33 @@
11
11
  // mount, then sync:sidepanel:run-* and sync:assistant:* bus events. A run
12
12
  // removed here (or in another window: sync:assistant:run-removed) never comes
13
13
  // back from a late event.
14
+ // The head is always on screen while there are runs: beside the summary, one
15
+ // mini scene per working agent (asst-scenes.js; up to three, then "+N"), all
16
+ // moving at once. Open, each working agent's row has a lane: its mini scene
17
+ // and current step. A mini scene or a lane brings that run's card into view
18
+ // in the transcript (hooks.onReveal). hooks.onRunChange hears every change
19
+ // to a run, whatever its source, so the transcript's card follows the tray.
20
+ // "Stop all" asks twice (asst-stop.js createConfirmGate): the first press
21
+ // turns it into "Stop N agents?", a second press within a few seconds stops
22
+ // every run of the session at once. It sits right under the transcript's
23
+ // last card, so one stray click or key there must not end the session's work.
14
24
 
15
25
  import { on } from '../state.js';
16
26
  import { getProviderMeta } from '../provider-icons.js';
17
27
  import { listAssistantRuns } from './asst-api.js';
18
28
  import { buildRunCard, tickRunCard, updateRunCard } from './asst-render.js';
29
+ import { awaitsAnswer, compactActivity, isLivePhase, phaseLine, sceneFor, sceneSvg, stageLabel, stagePhase, stepLine } from './asst-scenes.js';
30
+ import { injectSceneStyles } from './asst-scene-styles.js';
31
+ import { plural } from './asst-tool-kinds.js';
19
32
  import { isRemovableRun, isRunIdle, isTerminalRunStatus, mergeRunDescriptor, runFromPayload, runNeedsAttention, sortRuns } from './asst-state.js';
33
+ import { createConfirmGate } from './asst-stop.js';
20
34
 
21
35
  const TICK_MS = 5000;
22
36
  const SHOW_ALL_LIMIT = 40;
23
37
  const RECENT_WINDOW_MS = 6 * 60 * 60 * 1000;
38
+ const MINI_LIMIT = 3; // mini scenes in the head, then "+N"
39
+ const SCENE_DWELL_MS = 2500; // a scene the activity picked stays at least this long
40
+ const WORKING_PHASES = new Set(['queued', 'starting', 'working']); // live and not waiting on you (asst-scenes.js stagePhase)
24
41
 
25
42
  function el(tag, className, text) {
26
43
  const node = document.createElement(tag);
@@ -35,12 +52,14 @@ function esc(value) {
35
52
 
36
53
  /**
37
54
  * createAgentsDock(hostEl, hooks)
38
- * hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target), onStopAll(),
39
- * onRemove(runId), onClearFinished(runIds),
55
+ * hooks: { t, sessionId, onFocus(runId), onStop(runId), onRead(runId), onEscalate(runId, target),
56
+ * onStopAll() (the second press of "Stop all"; stopAllConfirmMs / stopAllMinGapMs time it),
57
+ * onRemove(runId), onClearFinished(runIds), onReveal(runId), onRunChange(run),
40
58
  * open, showAll, onToggle(open), onShowAllChange(showAll),
41
- * onCountChange({ total, active, attention, visible }) }
59
+ * onCountChange({ total, active, attention, answer, idle, working, waiting, visible }) }
42
60
  */
43
61
  export function createAgentsDock(hostEl, hooks = {}) {
62
+ injectSceneStyles();
44
63
  const t = (key, fallback, params) => {
45
64
  const v = typeof hooks.t === 'function' ? hooks.t(key, params) : undefined;
46
65
  if (v && v !== key && typeof v === 'string') return v;
@@ -53,6 +72,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
53
72
  root.innerHTML = `
54
73
  <div class="asst-dock-head">
55
74
  <button type="button" class="asst-dock-toggle" aria-expanded="false" aria-controls="${bodyId}"><span class="asst-dock-chev" aria-hidden="true">&#x203A;</span><span class="asst-dock-title">${esc(t('assistant.dock.title', 'Agents'))}</span><span class="asst-dock-summary"></span></button>
75
+ <div class="asst-dock-minis" role="group" aria-label="${esc(t('assistant.dock.working', 'Agents at work'))}"></div>
56
76
  <span class="asst-dock-spacer"></span>
57
77
  <button type="button" class="asst-tb-btn asst-dock-showall" aria-pressed="false" hidden>${esc(t('assistant.dock.showAll', 'Show all'))}</button>
58
78
  <button type="button" class="asst-tb-btn asst-dock-clear" hidden>${esc(t('assistant.dock.clearFinished', 'Clear finished'))}</button>
@@ -64,14 +84,32 @@ export function createAgentsDock(hostEl, hooks = {}) {
64
84
 
65
85
  const toggle = root.querySelector('.asst-dock-toggle');
66
86
  const summaryEl = root.querySelector('.asst-dock-summary');
87
+ const minisEl = root.querySelector('.asst-dock-minis');
67
88
  const showAllBtn = root.querySelector('.asst-dock-showall');
68
89
  const stopAllBtn = root.querySelector('.asst-dock-stopall');
69
90
  const clearBtn = root.querySelector('.asst-dock-clear');
70
91
  const body = root.querySelector('.asst-dock-body');
92
+ // Armed, "Stop all" says what it would stop and waits for the second press (then lapses by itself).
93
+ const stopAllGate = createConfirmGate({ windowMs: hooks.stopAllConfirmMs, minGapMs: hooks.stopAllMinGapMs, onChange: () => paintStopAll() });
94
+ function paintStopAll(active = counts().active) {
95
+ const armed = stopAllGate.isArmed();
96
+ const label = armed
97
+ ? plural(t, 'assistant.dock.stopAllConfirm', active, 'Stop {count} agent?', 'Stop {count} agents?')
98
+ : t('assistant.dock.stopAll', 'Stop all');
99
+ const tip = armed
100
+ ? t('assistant.dock.stopAllConfirmTip', 'Press again to stop every agent of this session')
101
+ : t('assistant.dock.stopAllTip', 'Stop every agent of this session (asks once more)');
102
+ if (stopAllBtn.textContent !== label) stopAllBtn.textContent = label;
103
+ stopAllBtn.dataset.armed = armed ? 'true' : 'false';
104
+ stopAllBtn.setAttribute('data-tooltip', tip);
105
+ }
71
106
 
72
107
  const runs = new Map(); // runId → descriptor
73
108
  const cards = new Map(); // runId → element
74
109
  const removed = new Set(); // runIds the user removed: late events never revive them
110
+ const activities = new Map(); // runId → what its worker does now, compact ({ kind, name, step, at }), while the run lasts
111
+ const minis = new Map(); // runId → its mini scene in the head
112
+ let moreBtn = null;
75
113
  let open = hooks.open === true;
76
114
  let showAll = hooks.showAll === true;
77
115
  let ticker = null;
@@ -96,20 +134,31 @@ export function createAgentsDock(hostEl, hooks = {}) {
96
134
  return {
97
135
  total: list.length,
98
136
  active: list.filter(r => !isTerminalRunStatus(r.status)).length,
99
- attention: list.filter(runNeedsAttention).length,
100
- idle: list.filter(isRunIdle).length,
137
+ // Waiting on you, whatever for (a permission, a route card, your answer); `answer` is the part that
138
+ // needs your answer, as its lane says (asst-scenes.js awaitsAnswer: a turn that ended asking, a question
139
+ // mid-turn), and a warm worker that asked is never counted idle.
140
+ attention: list.filter(r => runNeedsAttention(r) || awaitsAnswer(r)).length,
141
+ answer: list.filter(awaitsAnswer).length,
142
+ idle: list.filter(r => isRunIdle(r) && !awaitsAnswer(r)).length,
101
143
  finished: list.length - list.filter(r => !isTerminalRunStatus(r.status)).length,
144
+ // The session's status reads these (asst-state.js sessionStatus): agents at work (queued for a free slot,
145
+ // starting, in a turn) keep it working after its own turn ended; agents waiting on you make it need you.
146
+ working: list.filter(r => WORKING_PHASES.has(stagePhase(r))).length,
147
+ waiting: list.filter(r => stagePhase(r) === 'waiting').length,
102
148
  visible: list.length > 0,
103
149
  };
104
150
  }
105
151
 
152
+ /** "2 running · 1 idle · 1 needs approval": each count in its own plural form (`key.one` / `key.other`, asst-tool-kinds.js plural). */
106
153
  function summaryText(c) {
107
154
  const bits = [];
108
155
  const running = c.active - c.attention - c.idle;
109
- if (running > 0) bits.push(t('assistant.dock.running', '{n} running', { n: running }));
110
- if (c.idle > 0) bits.push(t('assistant.dock.idle', '{n} idle', { n: c.idle }));
111
- if (c.attention > 0) bits.push(t('assistant.dock.needsApproval', '{n} needs approval', { n: c.attention }));
112
- if (!bits.length && c.total) bits.push(t('assistant.dock.done', '{n} finished', { n: c.total }));
156
+ if (running > 0) bits.push(plural(t, 'assistant.dock.running', running, '{count} running', '{count} running'));
157
+ if (c.idle > 0) bits.push(plural(t, 'assistant.dock.idle', c.idle, '{count} idle', '{count} idle'));
158
+ const approval = c.attention - (c.answer || 0);
159
+ if (approval > 0) bits.push(plural(t, 'assistant.dock.needsApproval', approval, '{count} needs approval', '{count} need approval'));
160
+ if (c.answer > 0) bits.push(plural(t, 'assistant.dock.needsAnswer', c.answer, '{count} waiting for your answer', '{count} waiting for your answer'));
161
+ if (!bits.length && c.total) bits.push(plural(t, 'assistant.dock.done', c.total, '{count} finished', '{count} finished'));
113
162
  return bits.join(' · ');
114
163
  }
115
164
 
@@ -131,24 +180,29 @@ export function createAgentsDock(hostEl, hooks = {}) {
131
180
  if (destroyed) return;
132
181
  const list = visibleRuns();
133
182
  const seen = new Set();
134
- const frag = document.createDocumentFragment();
183
+ // Reconciled in place: a row that keeps its place keeps its node (and its mini scene keeps moving).
184
+ let at = 0;
135
185
  for (const run of list) {
136
186
  seen.add(run.runId);
137
187
  let card = cards.get(run.runId);
138
188
  if (!card) { card = buildRunCard(run, cardOpts()); cards.set(run.runId, card); }
139
189
  else updateRunCard(card, run, cardOpts());
140
190
  card.setAttribute('role', 'listitem');
141
- frag.appendChild(card);
191
+ syncLane(card, run);
192
+ if (body.children[at] !== card) body.insertBefore(card, body.children[at] || null);
193
+ at += 1;
142
194
  }
143
195
  for (const [runId, card] of cards) { if (!seen.has(runId)) { card.remove(); cards.delete(runId); } }
144
- body.innerHTML = '';
145
- body.appendChild(frag);
196
+ while (body.children.length > at) body.lastElementChild.remove();
197
+ renderMinis();
146
198
 
147
199
  const c = counts();
148
200
  root.hidden = c.total === 0;
149
201
  summaryEl.textContent = summaryText(c);
150
202
  root.classList.toggle('attention', c.attention > 0);
151
203
  stopAllBtn.hidden = c.active === 0;
204
+ if (stopAllBtn.hidden) stopAllGate.reset();
205
+ paintStopAll(c.active);
152
206
  clearBtn.hidden = !open || typeof hooks.onClearFinished !== 'function' || ![...runs.values()].some(isRemovableRun);
153
207
  showAllBtn.hidden = !open;
154
208
  showAllBtn.setAttribute('aria-pressed', showAll ? 'true' : 'false');
@@ -159,18 +213,126 @@ export function createAgentsDock(hostEl, hooks = {}) {
159
213
  syncTicker();
160
214
  }
161
215
 
216
+ // ── Working agents at a glance: mini scenes in the head, a lane per open row ──
217
+ const workingRuns = () => sortRuns([...runs.values()]).filter(r => isLivePhase(stagePhase(r)));
218
+
219
+ /** "Coding · Settings: App controls section · 3 min" (the stage's own name). */
220
+ function labelOf(run, scene, phase) {
221
+ const from = new Date(run.startedAt || run.createdAt || 0).getTime();
222
+ return stageLabel({ scene, phase, title: run.title || run.task || run.runId, ms: from ? Date.now() - from : 0, run }, t);
223
+ }
224
+
225
+ /** Draw `scene` into `host` (an SVG of its own), unless the one there was picked under the dwell. */
226
+ function paintScene(node, host, run, phase) {
227
+ const now = Date.now();
228
+ const scene = sceneFor(run, activities.get(run.runId), now);
229
+ if (node.dataset.scene !== scene && (!node.dataset.scene || node.dataset.scene === 'generic' || now - (node._sceneAt || 0) >= SCENE_DWELL_MS)) {
230
+ host.innerHTML = sceneSvg(scene, { mini: true });
231
+ node.dataset.scene = scene;
232
+ node._sceneAt = now;
233
+ }
234
+ node.dataset.phase = phase;
235
+ host.firstElementChild?.toggleAttribute('data-live', phase !== 'waiting');
236
+ return node.dataset.scene;
237
+ }
238
+
239
+ function reveal(runId) {
240
+ if (runId) hooks.onReveal?.(runId);
241
+ }
242
+
243
+ function renderMinis() {
244
+ const live = workingRuns();
245
+ const shown = live.slice(0, MINI_LIMIT);
246
+ const keep = new Set(shown.map(r => r.runId));
247
+ for (const [runId, node] of minis) if (!keep.has(runId)) { node.remove(); minis.delete(runId); }
248
+ shown.forEach((run, i) => {
249
+ let node = minis.get(run.runId);
250
+ if (!node) {
251
+ node = el('button', 'asst-dock-mini');
252
+ node.type = 'button';
253
+ node.dataset.runId = run.runId;
254
+ node.addEventListener('click', (e) => { e.stopPropagation(); reveal(node.dataset.runId); });
255
+ minis.set(run.runId, node);
256
+ }
257
+ const phase = stagePhase(run);
258
+ const scene = paintScene(node, node, run, phase);
259
+ const label = labelOf(run, scene, phase);
260
+ node.setAttribute('aria-label', t('assistant.dock.reveal', '{label}. Show it in the conversation', { label }));
261
+ node.setAttribute('data-tooltip', label);
262
+ if (minisEl.children[i] !== node) minisEl.insertBefore(node, minisEl.children[i] || null);
263
+ });
264
+ const extra = live.length - shown.length;
265
+ if (extra > 0) {
266
+ if (!moreBtn) {
267
+ moreBtn = el('button', 'asst-dock-more');
268
+ moreBtn.type = 'button';
269
+ moreBtn.addEventListener('click', (e) => { e.stopPropagation(); setOpen(true); });
270
+ }
271
+ moreBtn.textContent = `+${extra}`;
272
+ const more = extra === 1 ? t('assistant.dock.more.one', '{count} more agent at work: show the list', { count: extra }) : t('assistant.dock.more.other', '{count} more agents at work: show the list', { count: extra });
273
+ moreBtn.setAttribute('aria-label', more);
274
+ moreBtn.setAttribute('data-tooltip', more);
275
+ if (minisEl.lastElementChild !== moreBtn) minisEl.appendChild(moreBtn);
276
+ } else moreBtn?.remove();
277
+ }
278
+
279
+ /** An open row's lane while its agent works: its mini scene and current step; a click shows its card. */
280
+ function syncLane(card, run) {
281
+ let lane = card.querySelector(':scope > .asst-run-lane');
282
+ const phase = stagePhase(run);
283
+ if (!isLivePhase(phase)) { lane?.remove(); return; }
284
+ if (!lane) {
285
+ lane = el('button', 'asst-run-lane');
286
+ lane.type = 'button';
287
+ lane.innerHTML = '<span class="asst-run-lane-scene" aria-hidden="true"></span><span class="asst-run-lane-step"></span>';
288
+ lane.addEventListener('click', (e) => { e.stopPropagation(); reveal(card.dataset.runId); });
289
+ const meta = card.querySelector(':scope > .asst-run-meta');
290
+ if (meta) meta.after(lane); else card.appendChild(lane);
291
+ }
292
+ const scene = paintScene(lane, lane.querySelector('.asst-run-lane-scene'), run, phase);
293
+ const step = phase === 'working' ? (stepLine(activities.get(run.runId), t) || phaseLine(phase, run, scene, t)) : phaseLine(phase, run, scene, t);
294
+ const stepEl = lane.querySelector('.asst-run-lane-step');
295
+ if (stepEl.textContent !== step) stepEl.textContent = step;
296
+ lane.setAttribute('aria-label', t('assistant.dock.reveal', '{label}. Show it in the conversation', { label: labelOf(run, scene, phase) }));
297
+ }
298
+
299
+ /** The worker's provider events say what it does now: its mini scene and lane follow. Kept compact, and only while the run lasts. */
300
+ function setRunActivity(runId, activity) {
301
+ if (!runId || !runs.has(runId)) return;
302
+ const run = runs.get(runId);
303
+ const next = isTerminalRunStatus(run.status) ? null : compactActivity(activity, t);
304
+ if (next) activities.set(runId, next); else activities.delete(runId);
305
+ const card = cards.get(runId);
306
+ if (card) syncLane(card, run);
307
+ if (minis.has(runId)) renderMinis();
308
+ }
309
+
162
310
  function syncTicker() {
163
- const needs = open && !root.hidden && [...runs.values()].some(r => !isTerminalRunStatus(r.status));
164
- if (needs && !ticker) ticker = setInterval(() => { for (const [runId, card] of cards) tickRunCard(card, runs.get(runId)); }, TICK_MS);
311
+ // Open: the rows' clocks; collapsed with agents at work: their mini scenes' names (whole minutes) and steps.
312
+ const needs = !root.hidden && (open || minis.size > 0) && [...runs.values()].some(r => !isTerminalRunStatus(r.status));
313
+ if (needs && !ticker) {
314
+ ticker = setInterval(() => {
315
+ if (open) for (const [runId, card] of cards) { const run = runs.get(runId); tickRunCard(card, run); if (run) syncLane(card, run); }
316
+ renderMinis();
317
+ }, TICK_MS);
318
+ }
165
319
  if (!needs && ticker) { clearInterval(ticker); ticker = null; }
166
320
  }
167
321
 
322
+ /** Every change to a run, whatever its source, reaches the panel (its transcript card follows). */
323
+ function changed(run) {
324
+ if (!run) return;
325
+ try { hooks.onRunChange?.(run); } catch { /* the panel is gone */ }
326
+ }
327
+
168
328
  function upsertRun(run) {
169
329
  const descriptor = runFromPayload(run) || run;
170
330
  if (!belongs(descriptor)) return null;
171
331
  const merged = mergeRunDescriptor(runs.get(descriptor.runId), descriptor);
172
332
  runs.set(descriptor.runId, merged);
333
+ if (isTerminalRunStatus(merged.status)) activities.delete(merged.runId); // the run is over: so is what it was doing
173
334
  render();
335
+ changed(merged);
174
336
  return merged;
175
337
  }
176
338
 
@@ -180,6 +342,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
180
342
  for (const runId of Array.isArray(runIds) ? runIds : [runIds]) {
181
343
  if (!runId) continue;
182
344
  removed.add(runId);
345
+ activities.delete(runId);
183
346
  if (runs.delete(runId)) changed = true;
184
347
  }
185
348
  if (changed) render();
@@ -192,6 +355,7 @@ export function createAgentsDock(hostEl, hooks = {}) {
192
355
  const next = { ...current, ...patch, updatedAt: new Date().toISOString() };
193
356
  runs.set(runId, next);
194
357
  render();
358
+ changed(next);
195
359
  return next;
196
360
  }
197
361
 
@@ -220,14 +384,23 @@ export function createAgentsDock(hostEl, hooks = {}) {
220
384
  listed.add(id);
221
385
  return true;
222
386
  });
223
- for (const run of list) { const d = runFromPayload(run) || run; if (belongs(d)) runs.set(d.runId, mergeRunDescriptor(runs.get(d.runId), d)); }
387
+ const merged = [];
388
+ for (const run of list) {
389
+ const d = runFromPayload(run) || run;
390
+ if (!belongs(d)) continue;
391
+ const next = mergeRunDescriptor(runs.get(d.runId), d);
392
+ runs.set(d.runId, next);
393
+ if (isTerminalRunStatus(next.status)) activities.delete(d.runId);
394
+ merged.push(next);
395
+ }
224
396
  // When the terminal page was complete, previously known terminal runs
225
397
  // absent from it were removed elsewhere. A run arriving during refresh
226
398
  // must never be pruned by this older snapshot.
227
399
  if (terminal.length < 100) {
228
- for (const runId of knownTerminal) if (!listed.has(runId)) { runs.delete(runId); removed.add(runId); }
400
+ for (const runId of knownTerminal) if (!listed.has(runId)) { runs.delete(runId); removed.add(runId); activities.delete(runId); }
229
401
  }
230
402
  render();
403
+ for (const run of merged) changed(run);
231
404
  } catch { /* offline or not built yet */ }
232
405
  }
233
406
 
@@ -239,7 +412,15 @@ export function createAgentsDock(hostEl, hooks = {}) {
239
412
 
240
413
  toggle.addEventListener('click', () => setOpen(!open));
241
414
  showAllBtn.addEventListener('click', () => { showAll = !showAll; hooks.onShowAllChange?.(showAll); refresh().finally(render); });
242
- stopAllBtn.addEventListener('click', () => hooks.onStopAll?.());
415
+ stopAllBtn.addEventListener('click', () => {
416
+ if (stopAllBtn.hidden || destroyed) return;
417
+ if (stopAllGate.press() === 'confirmed') hooks.onStopAll?.();
418
+ });
419
+ stopAllBtn.addEventListener('keydown', (e) => {
420
+ // A held Enter repeats its click: only the first press of a key counts.
421
+ if (e.repeat && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); return; }
422
+ if (e.key === 'Escape' && stopAllGate.reset()) { e.preventDefault(); e.stopPropagation(); }
423
+ });
243
424
  clearBtn.addEventListener('click', () => {
244
425
  const ids = [...runs.values()].filter(isRemovableRun).map(r => r.runId);
245
426
  if (ids.length) hooks.onClearFinished?.(ids);
@@ -269,13 +450,16 @@ export function createAgentsDock(hostEl, hooks = {}) {
269
450
  }));
270
451
 
271
452
  render();
272
- refresh();
453
+ // The first fetch: what a reload knows about this session's runs (the panel restores their cards from it).
454
+ const ready = Promise.resolve(refresh());
273
455
 
274
456
  return {
275
457
  el: root,
458
+ ready,
276
459
  upsertRun,
277
460
  patchRun,
278
461
  patchUsageRun,
462
+ setRunActivity,
279
463
  dropRuns,
280
464
  getRun: (runId) => runs.get(runId) || null,
281
465
  getRuns: () => sortRuns([...runs.values()]),
@@ -289,6 +473,8 @@ export function createAgentsDock(hostEl, hooks = {}) {
289
473
  destroy() {
290
474
  destroyed = true;
291
475
  if (ticker) clearInterval(ticker);
476
+ stopAllGate.destroy();
477
+ activities.clear();
292
478
  unsubs.forEach(off => { try { off(); } catch { /* ignore */ } });
293
479
  root.remove();
294
480
  },
@@ -123,9 +123,12 @@ export async function fetchProjects() {
123
123
 
124
124
  // ── Sessions ─────────────────────────────────
125
125
 
126
- /** `fallback`: a model disabled in Assistant → Models starts on its enabled stand-in (session.fallback says which) instead of a 400. */
127
- export function createAssistantSession({ brain, label, fallback = false } = {}) {
128
- return jsonFetch('/api/assistant/sessions', jsonBody({ brain, label, fallback: fallback === true || undefined }));
126
+ /**
127
+ * `fallback`: a model disabled in Assistant → Models starts on its enabled stand-in (session.fallback says which) instead of a 400.
128
+ * `draft`: the server keeps it in memory, out of every list, until its first prompt stores it; closed or left unused, it is gone.
129
+ */
130
+ export function createAssistantSession({ brain, label, fallback = false, draft = false } = {}) {
131
+ return jsonFetch('/api/assistant/sessions', jsonBody({ brain, label, fallback: fallback === true || undefined, draft: draft === true || undefined }));
129
132
  }
130
133
 
131
134
  export async function listAssistantSessions() {
@@ -149,6 +152,11 @@ export function closeAssistantSession(id) {
149
152
  return jsonFetch(`/api/assistant/sessions/${enc(id)}/close`, jsonBody({}));
150
153
  }
151
154
 
155
+ /** Remove for good (Sessions menu): its running turn and workers stop, then the record and transcript go → { removed, stoppedRuns }. */
156
+ export function removeAssistantSession(id) {
157
+ return jsonFetch(`/api/assistant/sessions/${enc(id)}`, { method: 'DELETE' });
158
+ }
159
+
152
160
  // ── Attachments ──────────────────────────────
153
161
 
154
162
  /**