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,440 @@
1
+ // The Workspace tour's board: hand-drawn ink on an SVG layer. One layer sits
2
+ // over the Assistant panel's root (the transcript is the whiteboard), a second,
3
+ // fixed one covers the page for the highlight ring, which rings controls in the
4
+ // panel, its header and the title bar alike. Shapes come from tour-ink.js
5
+ // (smooth closed and open curves, a slow seeded wander, no hard corner) and are
6
+ // revealed pen-first with stroke-dashoffset through WAAPI on the Assistant's
7
+ // eased curves; handwriting (Caveat) is wiped in with a clip-path, or rises in
8
+ // where the engine cannot animate a clip-path on SVG text (checked once).
9
+ // Erasing un-draws the newest stroke first. The highlight is ONE ring that
10
+ // springs from control to control: its shape (centre, size, pads, corners) is
11
+ // sprung on the shared ticker (the mascot's loop) and the ring (softRingPath:
12
+ // a few anchors, exact sides and corners) is made from it each frame, so it
13
+ // morphs without a jitter; it is drawn on with a
14
+ // WAAPI stroke reveal and fades in place when no control is meant. Both layers
15
+ // keep a hole where the mascot is (setKeepOut): ink never paints over it. Under
16
+ // reduced motion everything is placed finished. Only SVG path data, transform,
17
+ // opacity and the keep-out's rect ever change.
18
+ import { subscribe } from '../synabun-ticker.js';
19
+ import { arrowGeometry, closedSmoothPath, ellipsePoints, pointsToSmoothPath, softBoxPath, softRingPath, springStep, underlinePoints } from './tour-ink.js';
20
+
21
+ const NS = 'http://www.w3.org/2000/svg';
22
+ export const EASE = {
23
+ draw: 'cubic-bezier(.2,0,.38,.9)', // --asst-ease-standard: a pen that starts and settles
24
+ enter: 'cubic-bezier(0,0,.38,.9)', // --asst-ease-enter
25
+ exit: 'cubic-bezier(.2,0,1,.9)', // --asst-ease-exit
26
+ emphasized: 'cubic-bezier(.4,.14,.3,1)', // --asst-ease-emphasized
27
+ spring: 'linear(0, 0.35 9%, 0.78 21%, 1.03 40%, 0.99 60%, 1)', // --asst-ease-spring
28
+ };
29
+ export const INK = { stroke: 380, label: 340, ring: 460, arrow: 360, erase: 220, stagger: 30 };
30
+
31
+ let clipSupport = null;
32
+ /** Can this engine animate a clip-path on SVG text? (Chromium yes; WebKit has not.) Checked once. */
33
+ function clipAnimates(svg) {
34
+ if (clipSupport != null) return clipSupport;
35
+ clipSupport = false;
36
+ try {
37
+ const probe = document.createElementNS(NS, 'text');
38
+ probe.textContent = 'x';
39
+ svg.appendChild(probe);
40
+ const anim = probe.animate([{ clipPath: 'inset(0px 100% 0px 0px)' }, { clipPath: 'inset(0px 0% 0px 0px)' }], { duration: 1000, fill: 'both' });
41
+ anim.pause();
42
+ anim.currentTime = 500;
43
+ const value = getComputedStyle(probe).clipPath || '';
44
+ clipSupport = /inset\(/.test(value) && /50%/.test(value);
45
+ anim.cancel();
46
+ probe.remove();
47
+ } catch { clipSupport = false; }
48
+ return clipSupport;
49
+ }
50
+
51
+ let maskSeq = 0;
52
+ const FAR = 100000; // the mask's extent: the whole layer, whatever it holds
53
+
54
+ export function createStage(host, { fixed = false, reduced = () => false, className = '' } = {}) {
55
+ const svg = document.createElementNS(NS, 'svg');
56
+ svg.setAttribute('class', `${fixed ? 'tour-page' : 'tour-board'}${className ? ` ${className}` : ''}`);
57
+ svg.setAttribute('aria-hidden', 'true');
58
+ svg.setAttribute('focusable', 'false');
59
+ // Every stroke goes in one group; while the mascot is on the board the group is masked with a hole
60
+ // where the mascot is (setKeepOut), so nothing on this layer ever paints over it.
61
+ const maskId = `tour-keepout-${(maskSeq += 1)}`;
62
+ svg.innerHTML = `<defs><mask id="${maskId}" maskUnits="userSpaceOnUse" x="${-FAR}" y="${-FAR}" width="${2 * FAR}" height="${2 * FAR}">`
63
+ + `<rect x="${-FAR}" y="${-FAR}" width="${2 * FAR}" height="${2 * FAR}" fill="#fff"/><rect class="tour-keepout" fill="#000" x="0" y="0" width="0" height="0"/></mask></defs>`
64
+ + '<g class="tour-inkset"></g>';
65
+ const ink = svg.lastChild;
66
+ const hole = svg.querySelector('.tour-keepout');
67
+ host.appendChild(svg);
68
+ const live = new Set(); // { el, kind, anim }
69
+ let seq = 0;
70
+ // Client → layer coordinates: the board's origin is read once per shape (the panel may still be sliding in
71
+ // when the tour opens), never per frame; the keep-out, which moves every frame of a flight, uses the last read.
72
+ let at = null;
73
+ const measure = () => { at = fixed ? { left: 0, top: 0 } : host.getBoundingClientRect(); return at; };
74
+ const origin = () => measure();
75
+ const local = (p, o = origin()) => ({ x: p.x - o.left, y: p.y - o.top });
76
+ const localPts = (pts, o = origin()) => pts.map(([x, y]) => [x - o.left, y - o.top]);
77
+ let keepOut = null;
78
+
79
+ /**
80
+ * The mascot's box (a client rect, or null when it is not on the board): a
81
+ * hole in this layer, so no ink paints over it. Cheap enough for every frame
82
+ * of a flight: four attributes, no layout read.
83
+ */
84
+ function setKeepOut(rect) {
85
+ const o = at || measure();
86
+ if (!rect || !(rect.width > 0) || !(rect.height > 0)) {
87
+ if (keepOut) { ink.removeAttribute('mask'); keepOut = null; }
88
+ return;
89
+ }
90
+ const x = rect.left - o.left;
91
+ const y = rect.top - o.top;
92
+ const r = Math.min(16, rect.width / 2, rect.height / 2);
93
+ const next = `${x.toFixed(1)} ${y.toFixed(1)} ${rect.width.toFixed(1)} ${rect.height.toFixed(1)}`;
94
+ if (keepOut === next) return;
95
+ hole.setAttribute('x', x.toFixed(1));
96
+ hole.setAttribute('y', y.toFixed(1));
97
+ hole.setAttribute('width', rect.width.toFixed(1));
98
+ hole.setAttribute('height', rect.height.toFixed(1));
99
+ hole.setAttribute('rx', r.toFixed(1));
100
+ if (!keepOut) ink.setAttribute('mask', `url(#${maskId})`);
101
+ keepOut = next;
102
+ }
103
+
104
+ function pathEl(d, cls) {
105
+ const el = document.createElementNS(NS, 'path');
106
+ el.setAttribute('class', `tour-ink ${cls}`);
107
+ el.setAttribute('d', d);
108
+ el.setAttribute('pathLength', '1');
109
+ ink.appendChild(el);
110
+ return el;
111
+ }
112
+
113
+ /** Reveal a path pen-first (pathLength 1: the dash is the whole stroke). Resolves when drawn. */
114
+ function reveal(el, duration = INK.stroke, delay = 0) {
115
+ const handle = { el, kind: 'path', anim: null };
116
+ live.add(handle);
117
+ el.style.strokeDasharray = '1 1';
118
+ if (reduced() || duration <= 0) { el.style.strokeDashoffset = '0'; return Promise.resolve(handle); }
119
+ el.style.strokeDashoffset = '1';
120
+ const anim = el.animate([{ strokeDashoffset: 1 }, { strokeDashoffset: 0 }], { duration, delay, easing: EASE.draw, fill: 'forwards' });
121
+ handle.anim = anim;
122
+ return anim.finished.then(() => { el.style.strokeDashoffset = '0'; anim.cancel(); handle.anim = null; return handle; }).catch(() => handle);
123
+ }
124
+
125
+ /** A smooth stroke through client points. */
126
+ function stroke(points, { cls = 'ink', duration = INK.stroke, delay = 0, closed = false } = {}) {
127
+ const pts = localPts(points.map(p => (Array.isArray(p) ? p : [p.x, p.y])));
128
+ return reveal(pathEl(closed ? closedSmoothPath(pts) : pointsToSmoothPath(pts), cls), duration, delay);
129
+ }
130
+
131
+ /** A client rect in this layer's coordinates. */
132
+ const localRect = (r, o = origin()) => ({ left: r.left - o.left, top: r.top - o.top, width: r.width, height: r.height });
133
+
134
+ /** Path data already in this layer's coordinates, revealed pen-first. */
135
+ function path(d, { cls = 'ink', duration = INK.stroke, delay = 0 } = {}) {
136
+ return reveal(pathEl(d, cls), duration, delay);
137
+ }
138
+
139
+ /** A rounded hand-drawn box around a client rect (tour-ink.js softBoxPath: exact sides and corners). */
140
+ function box(rect, { pad = 0, radius = 10, seed = `b${seq++}`, cls = 'ink', duration = INK.stroke, delay = 0 } = {}) {
141
+ return path(softBoxPath(localRect(rect), { pad, radius, seed }).d, { cls, duration, delay });
142
+ }
143
+
144
+ /** A soft ring around a client rect (one-off ink; the travelling highlight is createHighlight). */
145
+ function ring(rect, { pad = 6, seed = `r${seq++}`, cls = 'gold', duration = INK.ring, delay = 0 } = {}) {
146
+ return path(softRingPath(localRect(rect), { pad, seed }).d, { cls, duration, delay });
147
+ }
148
+
149
+ /** A bowed arrow between client points; the head (one stroke: wing, tip, wing) is drawn after the shaft. */
150
+ async function arrow(from, to, { curve = 0.16, seed = `a${seq++}`, cls = 'gold', duration = INK.arrow, delay = 0, head = 7 } = {}) {
151
+ const g = arrowGeometry(from, to, { curve, seed, head });
152
+ await stroke(g.shaft, { cls, duration, delay });
153
+ const [a, tip, b] = localPts(g.head);
154
+ const r2 = v => Math.round(v * 100) / 100;
155
+ return reveal(pathEl(`M ${r2(a[0])} ${r2(a[1])} L ${r2(tip[0])} ${r2(tip[1])} L ${r2(b[0])} ${r2(b[1])}`, `${cls} tour-head`), 150);
156
+ }
157
+
158
+ /**
159
+ * Handwriting (Caveat) at a client point, written left to right. With
160
+ * `place(size)` the writing is measured first (size: { w, top, bottom }, px
161
+ * from its baseline) and goes where place() says ({ x, y, anchor }, client
162
+ * px), before a stroke of it is shown.
163
+ */
164
+ function label(text, at, { cls = '', anchor = 'start', duration = INK.label, delay = 0, place = null } = {}) {
165
+ const el = document.createElementNS(NS, 'text');
166
+ el.setAttribute('class', `tour-hand ${cls}`.trim());
167
+ const put = (p, a) => {
168
+ const q = local(p);
169
+ el.setAttribute('x', String(Math.round(q.x * 10) / 10));
170
+ el.setAttribute('y', String(Math.round(q.y * 10) / 10));
171
+ el.setAttribute('text-anchor', a);
172
+ };
173
+ put(at, anchor);
174
+ el.textContent = text;
175
+ ink.appendChild(el);
176
+ if (typeof place === 'function') {
177
+ try {
178
+ el.setAttribute('text-anchor', 'start');
179
+ const bb = el.getBBox();
180
+ const y0 = Number(el.getAttribute('y')) || 0;
181
+ const spot = place({ w: bb.width, top: bb.y - y0, bottom: bb.y + bb.height - y0 });
182
+ if (spot) put(spot, spot.anchor || anchor);
183
+ else el.setAttribute('text-anchor', anchor);
184
+ } catch { el.setAttribute('text-anchor', anchor); }
185
+ }
186
+ const handle = { el, kind: 'text', anim: null };
187
+ live.add(handle);
188
+ if (reduced() || duration <= 0) return Promise.resolve(handle);
189
+ let width = 60;
190
+ try { width = Math.max(1, el.getBBox().width); } catch { /* not laid out */ }
191
+ const ms = Math.max(duration, Math.min(900, width * 4)); // about 4 ms a px: a pen, not a wipe
192
+ const anim = clipAnimates(svg)
193
+ ? el.animate([{ clipPath: 'inset(-30% 100% -30% -6%)' }, { clipPath: 'inset(-30% -6% -30% -6%)' }], { duration: ms, delay, easing: EASE.draw, fill: 'both' })
194
+ : el.animate([{ opacity: 0, transform: 'translateY(3px)' }, { opacity: 1, transform: 'none' }], { duration: Math.min(ms, 420), delay, easing: EASE.enter, fill: 'both' });
195
+ handle.anim = anim;
196
+ return anim.finished.then(() => { anim.cancel(); handle.anim = null; return handle; }).catch(() => handle);
197
+ }
198
+
199
+ /** A short wavy underline under a client rect. */
200
+ function underline(rect, { seed = `u${seq++}`, cls = 'gold', duration = 280, delay = 0, offset = 4 } = {}) {
201
+ return stroke(underlinePoints(rect, { seed, offset }), { cls, duration, delay });
202
+ }
203
+
204
+ /** An open ellipse (a drum's top, a clock face, a globe). */
205
+ function ellipse(cx, cy, rx, ry, { seed = `e${seq++}`, cls = 'ink', duration = 340, delay = 0, turns = 1.04, start } = {}) {
206
+ return stroke(ellipsePoints(cx, cy, rx, ry, { seed, turns, start }), { cls, duration, delay });
207
+ }
208
+
209
+ /**
210
+ * Everything on the layer leaves, newest first: strokes un-draw toward their
211
+ * start, writing fades and sinks. A wipe, never a cut.
212
+ */
213
+ async function erase({ duration = INK.erase, stagger = INK.stagger } = {}) {
214
+ const items = [...live].reverse();
215
+ live.clear();
216
+ if (!items.length) return;
217
+ if (reduced()) { for (const h of items) { h.anim?.cancel(); h.el.remove(); } return; }
218
+ await Promise.all(items.map((h, i) => {
219
+ // Continue from where a reveal in flight has got to (its current dash), never from finished.
220
+ let from = 0;
221
+ if (h.kind === 'path' && h.anim) {
222
+ try { from = Number(getComputedStyle(h.el).strokeDashoffset.replace('px', '')) || 0; } catch { from = 0; }
223
+ }
224
+ h.anim?.cancel();
225
+ const delay = Math.min(i, 8) * stagger;
226
+ let anim;
227
+ if (h.kind === 'path') {
228
+ h.el.style.strokeDashoffset = String(from);
229
+ anim = h.el.animate([{ strokeDashoffset: from }, { strokeDashoffset: -1 }], { duration, delay, easing: EASE.exit, fill: 'forwards' });
230
+ } else {
231
+ anim = h.el.animate([{ opacity: 1, transform: 'none' }, { opacity: 0, transform: 'translateY(2px)' }], { duration: duration * 0.9, delay, easing: EASE.exit, fill: 'forwards' });
232
+ }
233
+ return anim.finished.catch(() => {}).then(() => h.el.remove());
234
+ }));
235
+ }
236
+
237
+ function clear() { for (const h of live) { h.anim?.cancel(); h.el.remove(); } live.clear(); }
238
+ function destroy() { clear(); svg.remove(); }
239
+
240
+ /** The client boxes of what is on the layer now (strokes and writing), for layout: [{ left, top, right, bottom, kind }]. */
241
+ function boxes() {
242
+ const out = [];
243
+ for (const h of live) {
244
+ try {
245
+ const r = h.el.getBoundingClientRect();
246
+ if (r.width || r.height) out.push({ left: r.left, top: r.top, right: r.right, bottom: r.bottom, kind: h.kind });
247
+ } catch { /* not laid out */ }
248
+ }
249
+ return out;
250
+ }
251
+
252
+ return {
253
+ el: svg, ink, stroke, path, box, ring, arrow, label, underline, ellipse, erase, clear, destroy, local, localRect, measure, setKeepOut, boxes,
254
+ get count() { return live.size; },
255
+ get keepOut() { return keepOut; },
256
+ };
257
+ }
258
+
259
+ /** Two short dashes and a dot to the side of a point: a tiny sparkle (celebration). */
260
+ export function sparkle(stage, at, { cls = 'gold' } = {}) {
261
+ const arms = [[-1, -1], [1, -1], [0.1, 1.25]];
262
+ return Promise.all(arms.map(([ax, ay], i) => stage.stroke(
263
+ [{ x: at.x + ax * 5, y: at.y + ay * 5 }, { x: at.x + ax * 11, y: at.y + ay * 11 }],
264
+ { cls, duration: 160, delay: i * 50 },
265
+ )));
266
+ }
267
+
268
+ /**
269
+ * The one highlight ring. to(rect, shape) rings a control: the first time it
270
+ * is drawn on there (a WAAPI stroke reveal, pen-first), after that it springs
271
+ * from the control it rings now: centre, size, pads and corner radius all
272
+ * glide on one spring, and the ring (softRingPath) is made from that shape
273
+ * every frame, so it morphs without a jump, a jitter or a shimmer; to(null) lets it
274
+ * fade where it is. A resize or scroll is the host's to call: refresh(rect)
275
+ * moves it there. Frames come from the shared ticker, only while it moves.
276
+ * shape: { pad, padY, corner, radius } (px: the gap round the control, the gap
277
+ * above and below it, the control's own corner radius, the ring's largest).
278
+ */
279
+ export function createHighlight(stage, { reduced = () => false, seed = 'tour-highlight' } = {}) {
280
+ const el = document.createElementNS(NS, 'path');
281
+ el.setAttribute('class', 'tour-ink gold tour-highlight');
282
+ el.setAttribute('pathLength', '1');
283
+ el.style.strokeDasharray = '1 1';
284
+ el.style.strokeDashoffset = '1';
285
+ el.style.opacity = '0';
286
+ (stage.ink || stage.el).appendChild(el);
287
+ const MORPH = [15, 0.8]; // ω, ζ: a glide that lands with a hint of give
288
+ const FADE = [16, 1];
289
+ const KEYS = ['cx', 'cy', 'w', 'h', 'pad', 'padY', 'corner', 'radius', 'tail'];
290
+ const s = { op: 0, vop: 0 };
291
+ for (const k of KEYS) { s[k] = 0; s[`v${k}`] = 0; }
292
+ let goal = null; // the shape it springs to
293
+ let shown = false; // a target is ringed (op → 1)
294
+ let reveal = null; // the draw-on in flight
295
+ let stop = null;
296
+ let resolveSettled = null;
297
+ let settledPromise = Promise.resolve();
298
+ let lastD = '';
299
+
300
+ // `tail`: how far the pen's close bows out past the start (softRingPath's, 3.2 px): a control that sits at the panel's
301
+ // edge (the hand-off's composer) asks for less, so the ring stays inside the panel.
302
+ const shapeOf = (rect, { pad = 7, padY = 5, corner = 6, radius = 999, tail = 3.2 } = {}) => ({
303
+ cx: rect.left + rect.width / 2,
304
+ cy: rect.top + rect.height / 2,
305
+ w: rect.width,
306
+ h: rect.height,
307
+ pad: Number(pad) || 0,
308
+ padY: Number(padY) || 0,
309
+ corner: Math.max(0, Number(corner) || 0),
310
+ radius: Number.isFinite(Number(radius)) ? Number(radius) : 999,
311
+ tail: Number.isFinite(Number(tail)) ? Math.max(0, Number(tail)) : 3.2,
312
+ });
313
+
314
+ const ringOf = (g, local = true) => {
315
+ const rect = { left: g.cx - g.w / 2, top: g.cy - g.h / 2, width: Math.max(0, g.w), height: Math.max(0, g.h) };
316
+ return softRingPath(local && stage.localRect ? stage.localRect(rect) : rect, { pad: g.pad, padY: g.padY, corner: g.corner, maxRadius: g.radius, tail: g.tail, seed });
317
+ };
318
+
319
+ function paint() {
320
+ const d = ringOf(s).d;
321
+ if (d !== lastD) { el.setAttribute('d', d); lastD = d; }
322
+ el.style.opacity = String(Math.max(0, Math.min(1, s.op)).toFixed(3));
323
+ }
324
+
325
+ const shapeSettled = () => !goal || KEYS.every(k => Math.abs(s[k] - goal[k]) < 0.3 && Math.abs(s[`v${k}`]) < 2);
326
+ const fadeSettled = () => Math.abs(s.op - (shown ? 1 : 0)) < 0.01 && Math.abs(s.vop) < 0.05;
327
+
328
+ function onFrame(_now, dtMs) {
329
+ const dt = dtMs / 1000;
330
+ if (goal) {
331
+ for (const k of KEYS) {
332
+ const r = springStep(s[k], s[`v${k}`], goal[k], MORPH[0], MORPH[1], dt);
333
+ s[k] = r.x;
334
+ s[`v${k}`] = r.v;
335
+ }
336
+ }
337
+ const o = springStep(s.op, s.vop, shown ? 1 : 0, FADE[0], FADE[1], dt);
338
+ s.op = o.x;
339
+ s.vop = o.v;
340
+ if (shapeSettled() && fadeSettled()) {
341
+ if (goal) for (const k of KEYS) { s[k] = goal[k]; s[`v${k}`] = 0; }
342
+ s.op = shown ? 1 : 0;
343
+ s.vop = 0;
344
+ paint();
345
+ if (!shown) goal = null;
346
+ halt();
347
+ return;
348
+ }
349
+ paint();
350
+ }
351
+
352
+ function run() {
353
+ if (stop) return;
354
+ stop = subscribe(onFrame, { fps: 60 });
355
+ }
356
+
357
+ function halt() {
358
+ stop?.();
359
+ stop = null;
360
+ if (!reveal) { resolveSettled?.(); resolveSettled = null; }
361
+ }
362
+
363
+ /** Draw the ring on, pen-first: a WAAPI stroke reveal (the hurry speeds it up with the board's). */
364
+ function drawOn() {
365
+ reveal?.cancel();
366
+ el.style.strokeDashoffset = '1';
367
+ const anim = el.animate([{ strokeDashoffset: 1 }, { strokeDashoffset: 0 }], { duration: INK.ring, easing: EASE.draw, fill: 'forwards' });
368
+ reveal = anim;
369
+ const done = () => {
370
+ if (reveal !== anim) return;
371
+ el.style.strokeDashoffset = '0';
372
+ anim.cancel();
373
+ reveal = null;
374
+ if (!stop) { resolveSettled?.(); resolveSettled = null; }
375
+ };
376
+ anim.finished.then(done, done);
377
+ }
378
+
379
+ /** Ring `rect` (a client rect), or fade (null). Resolves when the ring has arrived and is drawn (or at once when calm). */
380
+ function to(rect, shape = {}) {
381
+ if (!rect) {
382
+ shown = false;
383
+ if (reduced()) { reveal?.cancel(); reveal = null; s.op = 0; s.vop = 0; paint(); halt(); return Promise.resolve(); }
384
+ return start();
385
+ }
386
+ const next = shapeOf(rect, shape);
387
+ const fresh = s.op < 0.05 && !shown;
388
+ goal = next;
389
+ shown = true;
390
+ if (reduced()) {
391
+ reveal?.cancel();
392
+ reveal = null;
393
+ Object.assign(s, next, { op: 1, vop: 0 });
394
+ for (const k of KEYS) s[`v${k}`] = 0;
395
+ el.style.strokeDashoffset = '0';
396
+ paint();
397
+ halt();
398
+ return Promise.resolve();
399
+ }
400
+ if (fresh) {
401
+ // Nothing on screen: it is drawn on where it rings, pen-first, rather than flying in from nowhere.
402
+ Object.assign(s, next);
403
+ for (const k of KEYS) s[`v${k}`] = 0;
404
+ s.op = 1;
405
+ s.vop = 0;
406
+ paint(); // the path exists before the reveal starts
407
+ drawOn();
408
+ } else paint();
409
+ return start();
410
+ }
411
+
412
+ function start() {
413
+ settledPromise = new Promise((resolve) => { resolveSettled?.(); resolveSettled = resolve; });
414
+ run();
415
+ return settledPromise;
416
+ }
417
+
418
+ /** The control moved (a resize, a scroll): glide there without a new draw. */
419
+ function refresh(rect, shape) {
420
+ if (!rect || !shown || !goal) return;
421
+ goal = shapeOf(rect, shape || { pad: goal.pad, padY: goal.padY, corner: goal.corner, radius: goal.radius, tail: goal.tail });
422
+ if (reduced()) { Object.assign(s, goal); paint(); return; }
423
+ run();
424
+ }
425
+
426
+ return {
427
+ el,
428
+ to,
429
+ refresh,
430
+ /** Where it rings now, or null. */
431
+ get target() { return shown && goal ? { ...goal } : null; },
432
+ /** The client box the ring's stroke covers when it has arrived (its shape at the goal), or null. */
433
+ get box() {
434
+ if (!shown || !goal) return null;
435
+ const h = ringOf(goal, false).hull;
436
+ return { left: h.left - 1, top: h.top - 1, right: h.right + 1, bottom: h.bottom + 1 };
437
+ },
438
+ destroy() { reveal?.cancel(); reveal = null; halt(); el.remove(); },
439
+ };
440
+ }
@@ -0,0 +1,40 @@
1
+ // What the Workspace tour remembers, in the UI state (storage.js): whether it was
2
+ // completed or skipped, whether it was ever started, and its cursor (a beat id;
3
+ // tour-beats.js resumeBeat reads the older tours' cursors too). No DOM, no
4
+ // engine: the empty state's starter row asks tourOffered() without loading the
5
+ // tour. The just-in-time tips (tour-tips.js) keep the ones already shown here.
6
+ import { KEYS } from '../constants.js';
7
+
8
+ /** The first-visit starter row shows until the tour is completed or skipped. */
9
+ export function tourOffered(storage) {
10
+ try { return !storage.getItem(KEYS.TUTORIAL_COMPLETED) && !storage.getItem(KEYS.TUTORIAL_SKIPPED); } catch { return false; }
11
+ }
12
+
13
+ /** A returning user (the tour was started, completed or skipped before): ? opens on the chapter list. */
14
+ export function tourReturning(storage) {
15
+ try { return [KEYS.TUTORIAL_COMPLETED, KEYS.TUTORIAL_SKIPPED, KEYS.TUTORIAL_STARTED].some(k => !!storage.getItem(k)); } catch { return false; }
16
+ }
17
+
18
+ /** The tour was completed ('completed') or skipped ('skipped'). */
19
+ export function markTourSeen(storage, how) {
20
+ try {
21
+ if (how === 'completed') storage.setItem(KEYS.TUTORIAL_COMPLETED, 'true');
22
+ else if (how === 'skipped') storage.setItem(KEYS.TUTORIAL_SKIPPED, 'true');
23
+ } catch { /* storage unavailable: the row shows again next time */ }
24
+ }
25
+
26
+ /** The tips already shown (a set of ids). */
27
+ export function tipsSeen(storage) {
28
+ try {
29
+ const list = JSON.parse(storage.getItem(KEYS.TOUR_TIPS) || '[]');
30
+ return new Set(Array.isArray(list) ? list.filter(x => typeof x === 'string') : []);
31
+ } catch { return new Set(); }
32
+ }
33
+
34
+ /** Remember that tip `id` was shown: never twice. */
35
+ export function markTipSeen(storage, id) {
36
+ const seen = tipsSeen(storage);
37
+ if (seen.has(id)) return;
38
+ seen.add(id);
39
+ try { storage.setItem(KEYS.TOUR_TIPS, JSON.stringify([...seen])); } catch { /* shown again next time */ }
40
+ }
@@ -0,0 +1,99 @@
1
+ // Just-in-time tips: the Workspace tour's long tail. One beat each, at the moment a
2
+ // control first matters (the first worker card, the first usage strip, the first
3
+ // route card, the first time ⋯ opens, the first time computer use is switched on):
4
+ // one line in the tour's caption, the one highlight ring on the control, and, when
5
+ // the empty state's character is on screen, its arm pointing there. Shown once,
6
+ // ever (tour-state.js keeps the ids); gone at the next input of any kind, which
7
+ // still does what it does; never while the tour itself runs. Nothing here changes
8
+ // anything: it only says what a control is.
9
+ import { createHighlight, createStage, EASE } from './tour-stage.js';
10
+ import { markTipSeen, tipsSeen } from './tour-state.js';
11
+
12
+ export const TIP_IDS = Object.freeze(['run', 'usage', 'route', 'more', 'computer']);
13
+ const LIFE_MS = 14000; // a tip nobody answers leaves on its own
14
+
15
+ let current = null;
16
+
17
+ /** The tip on screen (for tests): { id, dismiss() } or null. */
18
+ export function currentTip() {
19
+ return current;
20
+ }
21
+
22
+ /**
23
+ * Show tip `id` once: `target` is the control it is about, `root` the panel root it
24
+ * sits in (its caption goes at the foot of the transcript). Returns the tip, or null
25
+ * when it was shown before, the tour runs, or there is nothing to point at.
26
+ */
27
+ /** The tour's stylesheet, loaded once (a tip can come before the tour ever ran). */
28
+ let styles = null;
29
+ export function ensureTourStyles(href = '/shared/tour/tour.css') {
30
+ if (styles) return styles;
31
+ if (document.querySelector(`link[href="${href}"]`)) { styles = Promise.resolve(); return styles; }
32
+ const link = document.createElement('link');
33
+ link.rel = 'stylesheet';
34
+ link.href = href;
35
+ styles = Promise.race([new Promise((done) => { link.onload = link.onerror = done; }), new Promise(done => setTimeout(done, 1500))]);
36
+ document.head.append(link);
37
+ return styles;
38
+ }
39
+
40
+ export function showTip(id, { storage, tr, root, target, renderer = null, reduced = () => false, pageHost = document.body } = {}) {
41
+ if (!TIP_IDS.includes(id) || !storage || !target?.isConnected || !root?.isConnected) return null;
42
+ if (root.classList.contains('tour-on') || document.querySelector('.asst-root.tour-on')) return null; // the tour speaks for itself
43
+ if (tipsSeen(storage).has(id)) return null;
44
+ const line = tr(`tour.tips.${id}`);
45
+ if (!line || line === `tour.tips.${id}`) return null;
46
+ markTipSeen(storage, id);
47
+ current?.dismiss({ calm: true });
48
+
49
+ const transcript = root.querySelector('.asst-transcript');
50
+ const tip = document.createElement('div');
51
+ tip.className = 'tour-caption tour-tip';
52
+ tip.setAttribute('aria-hidden', 'true');
53
+ tip.innerHTML = '<div class="tour-caption-bg"></div><div class="tour-caption-body"><div class="tour-line"></div></div>';
54
+ tip.querySelector('.tour-line').textContent = line;
55
+ // At the foot of the transcript, over the conversation's last lines, never over the composer.
56
+ const rb = root.getBoundingClientRect();
57
+ const tb = (transcript || root).getBoundingClientRect();
58
+ tip.style.bottom = `${Math.max(8, Math.round(rb.bottom - tb.bottom + 8))}px`;
59
+ root.appendChild(tip);
60
+ const announcer = root.querySelector('.asst-announce');
61
+ if (announcer) announcer.textContent = line;
62
+
63
+ const page = createStage(pageHost, { fixed: true, reduced, className: 'tour-tip-layer' });
64
+ try { page.el.style.zIndex = String(Math.max(11001, (parseInt(getComputedStyle(root.closest('.assistant-panel') || root).zIndex, 10) || 0) + 1)); } catch { /* the stylesheet's */ }
65
+ const ring = createHighlight(page, { reduced, seed: `tip-${id}` });
66
+ ring.to(target.getBoundingClientRect(), { pad: 5 });
67
+ // The character points when it is the empty state's, on screen and free.
68
+ const hero = renderer?.mascot?.();
69
+ const pointing = hero?.kind === 'hero' && !hero.parked?.() ? hero : null;
70
+ try { pointing?.rig?.point?.(target, { poke: true }); } catch { /* an older rig */ }
71
+
72
+ let gone = false;
73
+ const onInput = () => dismiss();
74
+ const timer = setTimeout(() => dismiss(), LIFE_MS);
75
+ // Any input dismisses: the event goes on to do what it does (capture, passive, never stopped).
76
+ window.addEventListener('pointerdown', onInput, { capture: true, passive: true });
77
+ window.addEventListener('keydown', onInput, { capture: true, passive: true });
78
+ window.addEventListener('wheel', onInput, { capture: true, passive: true });
79
+
80
+ function dismiss({ calm = false } = {}) {
81
+ if (gone) return;
82
+ gone = true;
83
+ clearTimeout(timer);
84
+ window.removeEventListener('pointerdown', onInput, true);
85
+ window.removeEventListener('keydown', onInput, true);
86
+ window.removeEventListener('wheel', onInput, true);
87
+ try { pointing?.rig?.point?.(null); } catch { /* gone */ }
88
+ if (current === handle) current = null;
89
+ const leave = () => { ring.destroy(); page.destroy(); tip.remove(); };
90
+ if (calm || reduced() || typeof tip.animate !== 'function') { leave(); return; }
91
+ ring.to(null);
92
+ tip.animate([{ opacity: 1, transform: 'none' }, { opacity: 0, transform: 'translateY(6px)' }], { duration: 200, easing: EASE.exit, fill: 'forwards' })
93
+ .finished.then(leave, leave);
94
+ }
95
+
96
+ const handle = { id, el: tip, dismiss };
97
+ current = handle;
98
+ return handle;
99
+ }