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,335 @@
1
+ // ═══════════════════════════════════════════
2
+ // SETTINGS — App (the pane)
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // The software's own controls, in four sections: Updates (the version, the last
6
+ // check, Check for updates, Install update, automatic updates), Startup (start at
7
+ // login, start in the background), Window (what the close button does, hardware
8
+ // acceleration) and Maintenance (the data and logs folders, Restart SynaBun).
9
+ //
10
+ // Inside the desktop app the settings are the app's (window.synabunDesktop.app,
11
+ // desktop-bridge.js desktopApp); in an npm or Git install they are the server's
12
+ // (GET /api/system/app). Updates go through ui-update.js, the same check and the
13
+ // same dialog as the update badge. Restart SynaBun is the Apps menu's own item
14
+ // (#menu-restart-server). settings-app.js decides what each row shows; this draws.
15
+
16
+ import * as kit from './settings-kit.js';
17
+ import { desktopApp } from '../desktop-bridge.js';
18
+ import { on } from '../state.js';
19
+ import { forceCheckSynabunUpdate, getSynabunUpdateData, noteSynabunAutoCheck, openSynabunUpdateModal, refreshSynabunUpdateData } from '../ui-update.js';
20
+ import {
21
+ APP_URL, autoUpdateRow, canInstallUpdate, checkedLine, guessPlatform, hiddenRow, loginRow, maintenanceRow, readDesktopAppState,
22
+ readServerAppState, serverRefusal, updateStatus, windowRows,
23
+ } from './settings-app.js';
24
+
25
+ const RESTART_MENU_ITEM = 'menu-restart-server';
26
+ const WRITE = Object.freeze({ 'Content-Type': 'application/json', 'X-SynaBun-UI': '1', Accept: 'application/json' });
27
+
28
+ const row = (id) => `<div class="stg-help stg-app-note" id="${id}" role="status" hidden></div>`;
29
+
30
+ export function buildAppTab() {
31
+ return `
32
+ <div class="stg-pane stg-app" data-stg-pane="app">
33
+ ${kit.card({
34
+ id: 'stg-sec-app-updates', section: 'app.updates',
35
+ status: kit.pill('', { id: 'stg-app-update-pill' }),
36
+ body: `
37
+ ${kit.toggleField('SYS001', `
38
+ <button type="button" class="stg-action-btn" id="stg-app-install" ${kit.inv('SYS003')} title="${kit.H('SYS003')}" hidden>${kit.L('SYS003')}</button>
39
+ <button type="button" class="stg-action-btn" id="stg-app-check" title="${kit.H('SYS001')}">${kit.L('SYS001')}</button>`, {
40
+ label: `<span id="stg-app-version">${kit.te('settings.redesign.about.loading')}</span>`,
41
+ helpHtml: '<span id="stg-app-update-line" aria-live="polite"></span>',
42
+ })}
43
+ ${kit.toggleField('SYS002', kit.switchInput('stg-app-auto-update'), { forId: 'stg-app-auto-update', helpHtml: '<span id="stg-app-auto-help"></span>' })}`,
44
+ })}
45
+ ${kit.card({
46
+ id: 'stg-sec-app-startup', section: 'app.startup',
47
+ body: `
48
+ ${kit.toggleField('SYS004', `
49
+ <button type="button" class="stg-action-btn compact" id="stg-app-login-settings" hidden></button>
50
+ ${kit.switchInput('stg-app-login')}`, { forId: 'stg-app-login', helpHtml: '<span id="stg-app-login-help"></span>' })}
51
+ ${row('stg-app-login-note')}
52
+ ${kit.toggleField('SYS005', kit.switchInput('stg-app-hidden'), { forId: 'stg-app-hidden', attrs: 'id="stg-app-hidden-row" hidden' })}
53
+ ${row('stg-app-hidden-note')}`,
54
+ })}
55
+ ${kit.card({
56
+ id: 'stg-sec-app-window', section: 'app.window',
57
+ body: `
58
+ ${row('stg-app-window-note')}
59
+ ${kit.toggleField('SYS006', kit.switchInput('stg-app-close-tray'), { forId: 'stg-app-close-tray' })}
60
+ ${row('stg-app-close-note')}
61
+ ${kit.toggleField('SYS007', `
62
+ <button type="button" class="stg-action-btn compact" id="stg-app-relaunch" ${kit.inv('SYS008')} title="${kit.H('SYS008')}" hidden>${kit.L('SYS008')}</button>
63
+ ${kit.switchInput('stg-app-gpu')}`, { forId: 'stg-app-gpu' })}
64
+ ${row('stg-app-gpu-note')}`,
65
+ })}
66
+ ${kit.card({
67
+ id: 'stg-sec-app-maintenance', section: 'app.maintenance',
68
+ body: `
69
+ <div class="stg-action-row">
70
+ <button type="button" class="stg-action-btn" id="stg-app-open-data" ${kit.inv('SYS009')} title="${kit.H('SYS009')}">${kit.L('SYS009')}</button>
71
+ <button type="button" class="stg-action-btn" id="stg-app-open-logs" ${kit.inv('SYS010')} title="${kit.H('SYS010')}">${kit.L('SYS010')}</button>
72
+ <button type="button" class="stg-action-btn" id="stg-app-restart" ${kit.inv('SYS011')} title="${kit.H('SYS011')}">${kit.L('SYS011')}</button>
73
+ </div>
74
+ ${row('stg-app-maint-note')}`,
75
+ })}
76
+ </div>`;
77
+ }
78
+
79
+ /**
80
+ * Load and draw the page the first time it is shown (and on every return to it), and wire it.
81
+ * @param {HTMLElement} overlay the Settings panel
82
+ * @param {Object} [o]
83
+ * @param {Function} [o.fetchImpl] fetch (tests)
84
+ * @param {(msg: string) => void} [o.toast]
85
+ * @param {Window} [o.win] where the desktop app's bridge and the user agent are read
86
+ */
87
+ export function wireAppTab(overlay, { fetchImpl = (...args) => fetch(...args), toast = () => {}, win = window } = {}) {
88
+ const pane = kit.paneOf(overlay, 'app');
89
+ if (!pane) return;
90
+ const $ = (id) => pane.querySelector(`#${id}`);
91
+ const bridge = desktopApp(win);
92
+ const platformGuess = guessPlatform(win.navigator?.userAgent);
93
+ let desktop = null; // readDesktopAppState()
94
+ let server = null; // readServerAppState()
95
+ let remote = false; // the server refused: this page is not on the computer that runs SynaBun
96
+ let update = getSynabunUpdateData();
97
+ let busy = false;
98
+ // Nothing is said before the first answer: a row that waits for it is off, without a note.
99
+ let loaded = false;
100
+
101
+ const time = (iso) => {
102
+ try { return new Date(iso).toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' }); } catch { return String(iso).slice(11, 16); }
103
+ };
104
+ const say = (node, key, params) => {
105
+ if (!node) return;
106
+ const textValue = key ? kit.tx(key, params) : '';
107
+ node.textContent = textValue;
108
+ node.hidden = !textValue;
109
+ };
110
+ const setSwitch = (id, { checked, disabled }) => {
111
+ const input = $(id);
112
+ if (!input) return;
113
+ input.checked = !!checked;
114
+ input.disabled = !!disabled || busy;
115
+ };
116
+ const tone = (node, value) => { if (node) node.dataset.state = value || ''; };
117
+
118
+ // ── Drawing ──
119
+
120
+ function drawUpdates() {
121
+ const version = update?.current || desktop?.version || '';
122
+ say($('stg-app-version'), version ? 'settings.redesign.app.version' : 'settings.redesign.about.loading', { version });
123
+ const status = updateStatus(update);
124
+ const line = [kit.tx(status.key, status.params), checkedLine(update, { tx: kit.tx, time })].filter(Boolean).join(' · ');
125
+ const lineNode = $('stg-app-update-line');
126
+ if (lineNode) lineNode.textContent = line;
127
+ const pill = $('stg-app-update-pill');
128
+ if (pill) { pill.textContent = kit.tx(status.key, status.params); pill.dataset.state = status.tone; }
129
+ const install = $('stg-app-install');
130
+ if (install) install.hidden = !canInstallUpdate(update);
131
+ const auto = autoUpdateRow({ desktop, server, update });
132
+ setSwitch('stg-app-auto-update', auto);
133
+ say($('stg-app-auto-help'), auto.helpKey);
134
+ }
135
+
136
+ function drawStartup() {
137
+ const login = loginRow({ desktop, server, remote, platform: desktop?.platform || platformGuess });
138
+ setSwitch('stg-app-login', login);
139
+ say($('stg-app-login-help'), login.helpKey);
140
+ const note = $('stg-app-login-note');
141
+ say(note, login.note?.key, login.note?.params);
142
+ tone(note, login.note?.tone);
143
+ const open = $('stg-app-login-settings');
144
+ if (open) {
145
+ open.hidden = !(bridge && login.settingsButton);
146
+ if (login.settingsButton) open.textContent = kit.tx(`settings.redesign.app.startup.openSettings.${login.settingsButton}`);
147
+ }
148
+ const hidden = hiddenRow({ desktop });
149
+ const hiddenField = $('stg-app-hidden-row');
150
+ if (hiddenField) hiddenField.hidden = !hidden.shown;
151
+ setSwitch('stg-app-hidden', hidden);
152
+ say($('stg-app-hidden-note'), hidden.shown ? hidden.noteKey : '');
153
+ }
154
+
155
+ function drawWindow() {
156
+ const rows = windowRows({ desktop });
157
+ say($('stg-app-window-note'), rows.reasonKey);
158
+ setSwitch('stg-app-close-tray', rows.closeToTray);
159
+ say($('stg-app-close-note'), rows.closeToTray.noteKey);
160
+ setSwitch('stg-app-gpu', rows.gpu);
161
+ const relaunch = $('stg-app-relaunch');
162
+ if (relaunch) relaunch.hidden = !rows.gpu.restartNeeded;
163
+ say($('stg-app-gpu-note'), rows.gpu.restartNeeded ? 'settings.redesign.app.window.restartNeeded' : '');
164
+ }
165
+
166
+ function drawMaintenance() {
167
+ const maint = maintenanceRow({ desktop, server, remote, restartAvailable: !!document.getElementById(RESTART_MENU_ITEM) });
168
+ for (const id of ['stg-app-open-data', 'stg-app-open-logs']) { const btn = $(id); if (btn) btn.disabled = !maint.folders || busy; }
169
+ const restart = $('stg-app-restart');
170
+ if (restart) restart.hidden = !maint.restart;
171
+ const note = $('stg-app-maint-note');
172
+ if (note && !note.dataset.error) say(note, maint.noteKey);
173
+ }
174
+
175
+ function draw() {
176
+ if (!loaded) {
177
+ pane.querySelectorAll('input[type="checkbox"]').forEach((input) => { input.disabled = true; });
178
+ return;
179
+ }
180
+ drawUpdates();
181
+ drawStartup();
182
+ drawWindow();
183
+ drawMaintenance();
184
+ }
185
+
186
+ // ── Loading ──
187
+
188
+ async function readServer() {
189
+ try {
190
+ const res = await fetchImpl(APP_URL, { headers: { Accept: 'application/json' } });
191
+ const body = await res.json().catch(() => null);
192
+ if (res.ok) { server = readServerAppState(body); remote = false; return; }
193
+ remote = serverRefusal(res.status, body) === 'remote';
194
+ server = null;
195
+ } catch {
196
+ server = null;
197
+ }
198
+ }
199
+
200
+ /**
201
+ * The update state as it is, without a check of its own: the desktop app's last report, or the server's last
202
+ * look (GET /api/system/version without ?force: with automatic updates off, opening this page asks nothing).
203
+ * Through ui-update.js, so the badge and Install update see the same offer this page shows.
204
+ */
205
+ async function readUpdate() {
206
+ try { return (await refreshSynabunUpdateData()) || getSynabunUpdateData(); } catch { return getSynabunUpdateData(); }
207
+ }
208
+
209
+ async function load() {
210
+ if (bridge) {
211
+ try { desktop = readDesktopAppState(await bridge.state()); } catch { desktop = null; }
212
+ } else {
213
+ await readServer();
214
+ }
215
+ update = (await readUpdate()) || update;
216
+ loaded = true;
217
+ if (!document.body.contains(overlay)) return;
218
+ draw();
219
+ }
220
+
221
+ let loading = null;
222
+ const ensure = () => { if (!loading) loading = load().finally(() => { loading = null; }); return loading; };
223
+ draw();
224
+ if (kit.paneActive(overlay, 'app')) ensure();
225
+ overlay.addEventListener('stg-page-change', (e) => { if (e.detail?.page === 'app') ensure(); });
226
+
227
+ // The app's updater and its settings speak when they change (a check on its schedule, the login item put back).
228
+ const offUpdate = on('synabun-update:changed', (data) => { update = data || update; if (loaded && document.body.contains(overlay)) drawUpdates(); });
229
+ let offApp = null;
230
+ try {
231
+ offApp = bridge?.onChange?.((state) => {
232
+ const next = readDesktopAppState(state);
233
+ if (next && document.body.contains(overlay)) { desktop = next; draw(); }
234
+ });
235
+ } catch {}
236
+ const observer = new MutationObserver(() => {
237
+ if (document.body.contains(overlay)) return;
238
+ observer.disconnect();
239
+ try { offUpdate?.(); } catch {}
240
+ try { offApp?.(); } catch {}
241
+ });
242
+ observer.observe(document.body, { childList: true });
243
+
244
+ // ── Changes ──
245
+
246
+ /** One switch of the desktop app: the app answers with its whole state (and what the system said). */
247
+ async function setDesktop(key, value) {
248
+ try {
249
+ desktop = readDesktopAppState(await bridge.set(key, value)) || desktop;
250
+ } catch {
251
+ desktop = desktop ? { ...desktop, error: 'save-failed' } : desktop;
252
+ toast(kit.tx('settings.redesign.app.saveFailed'));
253
+ }
254
+ }
255
+
256
+ /** One switch of an npm or Git install. */
257
+ async function setServer(path, payload) {
258
+ try {
259
+ const res = await fetchImpl(`${APP_URL}/${path}`, { method: 'PUT', headers: WRITE, body: JSON.stringify(payload) });
260
+ const body = await res.json().catch(() => null);
261
+ const next = readServerAppState(body);
262
+ if (next) server = next;
263
+ else {
264
+ if (serverRefusal(res.status, body) === 'remote') remote = true;
265
+ toast(kit.tx('settings.redesign.app.saveFailed'));
266
+ }
267
+ return res.ok;
268
+ } catch {
269
+ if (server) server = { ...server, error: 'network' };
270
+ toast(kit.tx('settings.redesign.app.saveFailed'));
271
+ return false;
272
+ }
273
+ }
274
+
275
+ async function change(work) {
276
+ if (busy) return;
277
+ busy = true;
278
+ try { await work(); } finally { busy = false; draw(); }
279
+ }
280
+
281
+ $('stg-app-auto-update')?.addEventListener('change', (e) => change(async () => {
282
+ const on = e.target.checked;
283
+ if (desktop) {
284
+ await setDesktop('autoUpdate', on);
285
+ update = (await readUpdate()) || update;
286
+ } else if (await setServer('updates', { auto: on })) {
287
+ noteSynabunAutoCheck(on);
288
+ // Turned on: look now, as a start of the server would.
289
+ if (on) { try { update = (await forceCheckSynabunUpdate({ alert: false })) || update; } catch {} }
290
+ }
291
+ }));
292
+
293
+ $('stg-app-login')?.addEventListener('change', (e) => change(async () => {
294
+ if (desktop) await setDesktop('openAtLogin', e.target.checked);
295
+ else await setServer('startup', { enabled: e.target.checked });
296
+ }));
297
+ $('stg-app-hidden')?.addEventListener('change', (e) => change(() => setDesktop('startHidden', e.target.checked)));
298
+ $('stg-app-close-tray')?.addEventListener('change', (e) => change(() => setDesktop('closeToTray', e.target.checked)));
299
+ $('stg-app-gpu')?.addEventListener('change', (e) => change(() => setDesktop('hardwareAcceleration', e.target.checked)));
300
+ $('stg-app-relaunch')?.addEventListener('click', () => { try { bridge?.relaunch?.(); } catch {} });
301
+ $('stg-app-login-settings')?.addEventListener('click', () => { try { bridge?.openLoginSettings?.(); } catch {} });
302
+
303
+ $('stg-app-check')?.addEventListener('click', () => change(async () => {
304
+ const btn = $('stg-app-check');
305
+ if (btn) btn.disabled = true;
306
+ say($('stg-app-update-line'), 'settings.redesign.app.update.checking');
307
+ let found = null;
308
+ try { found = await forceCheckSynabunUpdate({ alert: false }); } catch {}
309
+ // A failed check answers null: the desktop app's report says why; for the server, the check failed.
310
+ if (found) update = found;
311
+ else if (bridge) update = (await readUpdate()) || update;
312
+ else update = { ...(update || {}), updateAvailable: false, checkedAt: new Date().toISOString(), npmError: 'failed', gitError: 'failed' };
313
+ if (btn) btn.disabled = false;
314
+ }));
315
+ $('stg-app-install')?.addEventListener('click', () => openSynabunUpdateModal());
316
+
317
+ async function openFolder(which) {
318
+ const note = $('stg-app-maint-note');
319
+ let ok = false;
320
+ if (bridge) {
321
+ try { ok = !!(await bridge.openFolder(which))?.ok; } catch { ok = false; }
322
+ } else {
323
+ try {
324
+ const res = await fetchImpl(`${APP_URL}/open-folder`, { method: 'POST', headers: WRITE, body: JSON.stringify({ which }) });
325
+ ok = res.ok;
326
+ } catch { ok = false; }
327
+ }
328
+ if (note) {
329
+ if (ok) { delete note.dataset.error; drawMaintenance(); } else { note.dataset.error = '1'; say(note, 'settings.redesign.app.maintenance.openFailed'); tone(note, 'err'); }
330
+ }
331
+ }
332
+ $('stg-app-open-data')?.addEventListener('click', () => openFolder('data'));
333
+ $('stg-app-open-logs')?.addEventListener('click', () => openFolder('logs'));
334
+ $('stg-app-restart')?.addEventListener('click', () => document.getElementById(RESTART_MENU_ITEM)?.click());
335
+ }
@@ -0,0 +1,243 @@
1
+ // ═══════════════════════════════════════════
2
+ // SETTINGS — App (what the page says)
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // The software's own controls: updates, start at login, the window, the
6
+ // folders and a restart. Two kinds of install answer them:
7
+ //
8
+ // desktop the SynaBun desktop app: its settings are the window's
9
+ // (window.synabunDesktop.app, packaging/desktop/src/app-prefs.mjs),
10
+ // its updates the app's updater (window.synabunDesktop.updates)
11
+ // server an npm or Git install: GET /api/system/app (lib/app-controls-api.js)
12
+ // and the update check of GET /api/system/version
13
+ //
14
+ // A row that does not apply to this install is not shown, or is shown off
15
+ // with one line that says why. This file decides; settings-app-pane.js draws.
16
+ // No imports and no DOM: `node --test` loads it as it is (tests/settings-app.test.mjs).
17
+
18
+ export const APP_URL = '/api/system/app';
19
+ const K = 'settings.redesign.app';
20
+
21
+ const bool = (value) => value === true;
22
+ const text = (value, max = 400) => (typeof value === 'string' && value ? value.slice(0, max) : null);
23
+ const PLATFORMS = new Set(['darwin', 'win32', 'linux']);
24
+ const LOGIN_STATUSES = new Set(['on', 'off', 'requires-approval', 'disabled', 'not-found']);
25
+ const SERVER_STATES = new Set(['on', 'off', 'stale', 'disabled']);
26
+
27
+ /** The desktop app's report (window.synabunDesktop.app.state()), checked field by field; null when there is none. */
28
+ export function readDesktopAppState(state) {
29
+ if (!state || typeof state !== 'object') return null;
30
+ const prefs = state.prefs && typeof state.prefs === 'object' ? state.prefs : {};
31
+ const login = state.login && typeof state.login === 'object' ? state.login : {};
32
+ const gpu = state.hardwareAcceleration && typeof state.hardwareAcceleration === 'object' ? state.hardwareAcceleration : {};
33
+ return {
34
+ platform: PLATFORMS.has(state.platform) ? state.platform : null,
35
+ packaged: bool(state.packaged),
36
+ prefs: {
37
+ autoUpdate: prefs.autoUpdate !== false,
38
+ openAtLogin: bool(prefs.openAtLogin),
39
+ startHidden: prefs.startHidden !== false,
40
+ hardwareAcceleration: prefs.hardwareAcceleration !== false,
41
+ closeToTray: prefs.closeToTray !== false,
42
+ },
43
+ login: {
44
+ supported: bool(login.supported),
45
+ reason: text(login.reason, 40),
46
+ enabled: bool(login.enabled),
47
+ status: LOGIN_STATUSES.has(login.status) ? login.status : 'off',
48
+ replaced: text(login.replaced, 40),
49
+ },
50
+ gpuRestartNeeded: bool(gpu.restartNeeded),
51
+ tray: bool(state.tray),
52
+ error: text(state.error, 40),
53
+ };
54
+ }
55
+
56
+ /** GET /api/system/app (or a refusal of a write, which carries the same body), checked; null when it is not one. */
57
+ export function readServerAppState(answer) {
58
+ if (!answer || typeof answer !== 'object' || typeof answer.install !== 'string') return null;
59
+ const startup = answer.startup && typeof answer.startup === 'object' ? answer.startup : {};
60
+ return {
61
+ install: text(answer.install, 20),
62
+ desktop: bool(answer.desktop),
63
+ autoUpdate: answer.updates?.auto !== false,
64
+ startup: {
65
+ supported: bool(startup.supported),
66
+ reason: text(startup.reason, 40),
67
+ enabled: bool(startup.enabled),
68
+ state: SERVER_STATES.has(startup.state) ? startup.state : 'off',
69
+ owner: text(startup.owner, 4096),
70
+ },
71
+ error: answer.ok === false ? text(answer.code, 40) || 'refused' : null,
72
+ };
73
+ }
74
+
75
+ /** Why GET /api/system/app gave no state: 'remote' (asked from another computer), 'old' (a server from before it), 'offline'. */
76
+ export function serverRefusal(status, body) {
77
+ const code = body && typeof body === 'object' ? String(body.code || '') : '';
78
+ if (status === 403 && ['LOCAL_ONLY', 'REMOTE_FORBIDDEN', 'BAD_HOST', 'GUEST_FORBIDDEN'].includes(code)) return 'remote';
79
+ if (status === 404 || status === 405) return 'old';
80
+ return 'offline';
81
+ }
82
+
83
+ // ── Updates ──
84
+
85
+ /**
86
+ * The line under the version: what the last check found. `data` is the page's
87
+ * update data (ui-update.js getSynabunUpdateData): the desktop app's report as
88
+ * versionDataFromDesktop() reads it, or GET /api/system/version.
89
+ * Returns { key, params, tone } (tone: ok | warn | err | off | busy).
90
+ */
91
+ export function updateStatus(data) {
92
+ if (!data || typeof data !== 'object') return { key: `${K}.update.notChecked`, params: {}, tone: 'off' };
93
+ const latest = text(data.latest, 64) || '';
94
+ if (data.desktop) {
95
+ if (data.supported === false) return { key: `${K}.update.unsupported`, params: {}, tone: 'off' };
96
+ switch (data.status) {
97
+ case 'checking': return { key: `${K}.update.checking`, params: {}, tone: 'busy' };
98
+ case 'downloading': return { key: `${K}.update.downloading`, params: { version: latest, percent: Math.floor(Number(data.progress?.percent) || 0) }, tone: 'busy' };
99
+ case 'downloaded': return { key: `${K}.update.ready`, params: { version: latest }, tone: 'warn' };
100
+ case 'installing': return { key: `${K}.update.installing`, params: { version: latest }, tone: 'busy' };
101
+ case 'error': return { key: `${K}.update.failed`, params: {}, tone: 'err' };
102
+ case 'not-available': return { key: `${K}.update.upToDate`, params: {}, tone: 'ok' };
103
+ default:
104
+ if (data.updateAvailable && latest) return { key: `${K}.update.available`, params: { version: latest }, tone: 'warn' };
105
+ return { key: `${K}.update.notChecked`, params: {}, tone: 'off' };
106
+ }
107
+ }
108
+ if (data.updateAvailable && latest) return { key: `${K}.update.available`, params: { version: latest }, tone: 'warn' };
109
+ if (!data.checkedAt) return { key: `${K}.update.notChecked`, params: {}, tone: 'off' };
110
+ if (data.npmError && data.gitError) return { key: `${K}.update.failed`, params: {}, tone: 'err' };
111
+ return { key: `${K}.update.upToDate`, params: {}, tone: 'ok' };
112
+ }
113
+
114
+ /** "Checked at 14:05" (`time` writes an ISO time the page's way), or '' before any check. */
115
+ export function checkedLine(data, { tx, time }) {
116
+ const at = text(data?.checkedAt, 64);
117
+ if (!at || !Number.isFinite(Date.parse(at))) return '';
118
+ return tx(`${K}.update.checkedAt`, { time: time(at) });
119
+ }
120
+
121
+ /** Is there an update to install now (the Install update button)? */
122
+ export function canInstallUpdate(data) {
123
+ if (!data?.updateAvailable) return false;
124
+ if (data.desktop) return ['available', 'downloaded', 'error'].includes(data.status) || !data.status;
125
+ return true;
126
+ }
127
+
128
+ /** The automatic updates switch: { checked, disabled, helpKey }. */
129
+ export function autoUpdateRow({ desktop, server, update }) {
130
+ if (desktop) {
131
+ return { checked: desktop.prefs.autoUpdate, disabled: update?.supported === false, helpKey: `${K}.update.autoHelpDesktop` };
132
+ }
133
+ return { checked: server ? server.autoUpdate : update?.autoCheck !== false, disabled: !server || server.desktop, helpKey: `${K}.update.autoHelpServer` };
134
+ }
135
+
136
+ // ── Startup ──
137
+
138
+ /** The sentence for an error code of a change, '' for none. */
139
+ export function startupErrorKey(code) {
140
+ if (!code) return '';
141
+ const known = ['refused', 'write-failed', 'no-wscript', 'bad-path', 'desktop-app', 'npm-entry', 'save-failed', 'network'];
142
+ return `${K}.startup.error.${known.includes(code) ? code : 'refused'}`;
143
+ }
144
+
145
+ /**
146
+ * The start at login switch and the line under it:
147
+ * { shown, checked, disabled, helpKey, note: { key, params, tone } | null, settingsButton: 'darwin' | 'win32' | null }
148
+ * `platform` is the computer's (the desktop app says its own; the browser's guess otherwise).
149
+ */
150
+ export function loginRow({ desktop, server, remote = false, platform = null }) {
151
+ const note = (key, tone = 'off', params = {}) => ({ key, params, tone });
152
+ if (desktop) {
153
+ const { login } = desktop;
154
+ const os = desktop.platform;
155
+ const row = {
156
+ shown: true, checked: login.enabled || login.status === 'requires-approval', disabled: !login.supported,
157
+ helpKey: `${K}.startup.helpDesktop`, note: null, settingsButton: null,
158
+ };
159
+ if (!login.supported) row.note = note(`${K}.startup.reason.${['unpackaged', 'move-to-applications', 'no-appimage'].includes(login.reason) ? login.reason : 'unsupported'}`);
160
+ else if (desktop.error && !['save-failed'].includes(desktop.error)) row.note = note(startupErrorKey(desktop.error), 'err');
161
+ else if (login.status === 'requires-approval') {
162
+ row.note = note(`${K}.startup.requiresApproval`, 'warn');
163
+ row.settingsButton = 'darwin';
164
+ } else if (login.status === 'disabled' || (desktop.prefs.openAtLogin && !login.enabled)) {
165
+ row.note = note(`${K}.startup.disabledInSystem.${os || 'linux'}`, 'warn');
166
+ if (os === 'darwin' || os === 'win32') row.settingsButton = os;
167
+ } else if (login.replaced) row.note = note(`${K}.startup.replaced`, 'ok');
168
+ if (desktop.error === 'save-failed') row.note = note(startupErrorKey('save-failed'), 'err');
169
+ return row;
170
+ }
171
+ const row = { shown: true, checked: !!server?.startup.enabled, disabled: true, helpKey: `${K}.startup.helpServer`, note: null, settingsButton: null };
172
+ if (remote) { row.note = note(`${K}.remote`); return row; }
173
+ if (!server) { row.note = note(`${K}.serverOld`); return row; }
174
+ const { startup } = server;
175
+ if (!startup.supported) {
176
+ // 'desktop': the SynaBun app answers for itself, and this one is from before its own settings.
177
+ row.note = note(`${K}.startup.reason.${['not-here', 'desktop'].includes(startup.reason) ? startup.reason : 'unsupported'}`);
178
+ return row;
179
+ }
180
+ row.disabled = false;
181
+ if (server.error) row.note = note(startupErrorKey(server.error), 'err');
182
+ else if (startup.owner && !startup.enabled) {
183
+ row.note = note(`${K}.startup.owner`, 'off');
184
+ row.disabled = true;
185
+ } else if (startup.state === 'disabled') {
186
+ row.note = note(`${K}.startup.disabledInSystem.${PLATFORMS.has(platform) ? platform : 'linux'}`, 'warn');
187
+ }
188
+ return row;
189
+ }
190
+
191
+ /** Start in the background (desktop only; shown under start at login, live while it is on). */
192
+ export function hiddenRow({ desktop }) {
193
+ if (!desktop) return { shown: false, checked: false, disabled: true };
194
+ const on = desktop.login.enabled || desktop.login.status === 'requires-approval';
195
+ return { shown: true, checked: desktop.prefs.startHidden, disabled: !desktop.login.supported || !on, noteKey: on ? '' : `${K}.startup.hiddenNeedsLogin` };
196
+ }
197
+
198
+ // ── Window ──
199
+
200
+ /**
201
+ * The window section: { reasonKey, closeToTray: { shown, checked, disabled, noteKey }, gpu: { checked, disabled, restartNeeded } }.
202
+ * Outside the desktop app the rows are shown off, with the one line that says they belong to it.
203
+ */
204
+ export function windowRows({ desktop }) {
205
+ if (!desktop) {
206
+ return {
207
+ reasonKey: `${K}.window.desktopOnly`,
208
+ closeToTray: { shown: true, checked: false, disabled: true, noteKey: '' },
209
+ gpu: { checked: false, disabled: true, restartNeeded: false },
210
+ };
211
+ }
212
+ const mac = desktop.platform === 'darwin';
213
+ return {
214
+ reasonKey: '',
215
+ closeToTray: {
216
+ shown: true,
217
+ checked: mac ? true : desktop.prefs.closeToTray,
218
+ disabled: mac,
219
+ // macOS keeps an app in the Dock; elsewhere without a tray icon, opening SynaBun again shows the window.
220
+ noteKey: mac ? `${K}.window.macDock` : (!desktop.tray && desktop.prefs.closeToTray ? `${K}.window.noTray` : ''),
221
+ },
222
+ gpu: { checked: desktop.prefs.hardwareAcceleration, disabled: false, restartNeeded: desktop.gpuRestartNeeded },
223
+ };
224
+ }
225
+
226
+ // ── Maintenance ──
227
+
228
+ /** The folder buttons and the restart: { folders: boolean, restart: boolean, noteKey }. */
229
+ export function maintenanceRow({ desktop, server, remote = false, restartAvailable = true }) {
230
+ if (desktop) return { folders: true, restart: restartAvailable, noteKey: '' };
231
+ if (remote) return { folders: false, restart: restartAvailable, noteKey: `${K}.remote` };
232
+ if (!server) return { folders: false, restart: restartAvailable, noteKey: `${K}.serverOld` };
233
+ return { folders: true, restart: restartAvailable, noteKey: '' };
234
+ }
235
+
236
+ /** The platform of this computer as the browser says it, when nothing better is known. */
237
+ export function guessPlatform(userAgent = '') {
238
+ const ua = String(userAgent);
239
+ if (/Mac OS X|Macintosh/i.test(ua)) return 'darwin';
240
+ if (/Windows/i.test(ua)) return 'win32';
241
+ if (/Linux|X11/i.test(ua)) return 'linux';
242
+ return null;
243
+ }