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,524 @@
1
+ // ═══════════════════════════════════════════
2
+ // SynaBun — start at login, for an npm or Git install (Settings > App)
3
+ // ═══════════════════════════════════════════
4
+ //
5
+ // The server starts in the background when the user logs in, with no window
6
+ // and no terminal, through the same launcher the Start Server button uses
7
+ // (launcher.mjs → lib/start-launcher.js runLauncher, in its background mode:
8
+ // nothing happens when a server already answers or a start is under way, and
9
+ // the server gets the login shell's environment, so an nvm or Homebrew Node
10
+ // and the user's CLIs are found as in a terminal). Every path in the entry is
11
+ // absolute: the PATH a login starts programs with is not the user's.
12
+ //
13
+ // macOS ~/Library/LaunchAgents/ai.synabun.server.plist (RunAtLoad; the
14
+ // launcher's process group is left alone when it exits)
15
+ // Windows HKCU\...\Run "SynaBun Server": wscript.exe runs a small script of
16
+ // SynaBun's (DATA_HOME/runtime/login/synabun-hidden.vbs) that starts
17
+ // node with no window. A console program started from Run would
18
+ // show a console. A packaged entry (a GUI program) runs directly
19
+ // Linux ~/.config/autostart/synabun-server.desktop (XDG autostart)
20
+ //
21
+ // The entry itself is the setting: on while it is there, off when it is gone.
22
+ // It is read back from the system for every answer (inspect), and put back in
23
+ // place on every start of the server while it is on (heal: another Node, a
24
+ // moved install). One the user turned off in the system (disabled in Startup
25
+ // apps, in Login Items, or in the desktop's autostart settings) stays off and
26
+ // is reported as off.
27
+ //
28
+ // The SynaBun desktop app on the same data folder opens at login on its own
29
+ // (packaging/desktop/src/login-item.mjs, which names both apps' entries the
30
+ // same way: NPM_LOGIN, DESKTOP_LOGIN; a test keeps the two equal). Two starts
31
+ // at login would start two servers on one data folder: while the app's entry is
32
+ // there and on for this data folder (read from the system, desktopLoginOwner),
33
+ // this one is refused ('desktop-app'); turning the app's on removes this one.
34
+ //
35
+ // Pure: the file calls and the programs it runs are handed in (tests/login-start.test.mjs).
36
+
37
+ import { execFileSync } from 'node:child_process';
38
+ import { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
39
+ import { homedir, tmpdir } from 'node:os';
40
+ import { dirname, join as nativeJoin, posix, win32 } from 'node:path';
41
+ import { desktopExecArg, launcherOverrides, winQuote } from '../../lib/start-launcher.js';
42
+
43
+ /** The names of the entries (packaging/desktop/src/login-item.mjs NPM_LOGIN must be equal). */
44
+ export const NPM_LOGIN = Object.freeze({
45
+ macLabel: 'ai.synabun.server',
46
+ winName: 'SynaBun Server',
47
+ linuxFile: 'synabun-server.desktop',
48
+ });
49
+ /** What the launcher is started with at login (lib/start-launcher.js parseLauncherArgs reads them). */
50
+ export const LOGIN_ARGS = Object.freeze(['--via=login', '--background']);
51
+ /**
52
+ * The desktop app's own login entries (packaging/desktop/src/login-item.mjs DESKTOP_LOGIN must be equal): read from
53
+ * the system to know whether the app opens at login on this data folder, never from the app's settings file.
54
+ */
55
+ export const DESKTOP_LOGIN = Object.freeze({
56
+ macLabel: 'ai.synabun.app.login',
57
+ winName: 'ai.synabun.app',
58
+ linuxFile: 'synabun-app.desktop',
59
+ env: 'SYNABUN_DESKTOP_LOGIN',
60
+ flag: '--synabun-login',
61
+ dataFlag: '--synabun-data-home=',
62
+ portFlag: '--synabun-port=',
63
+ });
64
+ export const HIDDEN_SCRIPT = 'synabun-hidden.vbs';
65
+ export const LINUX_MARKER = 'X-SynaBun-Login=server';
66
+
67
+ const RUN_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';
68
+ const APPROVED_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run';
69
+
70
+ /**
71
+ * Runs its arguments as one command line with no window. ASCII only, no path
72
+ * in it: what it starts comes in as its arguments, which the registry holds as
73
+ * Unicode (Windows Script Host reads the file itself in the ANSI code page).
74
+ */
75
+ export const HIDDEN_SCRIPT_SOURCE = [
76
+ "' SynaBun: runs its arguments as one command, with no window (start at login).",
77
+ "' Generated by SynaBun. Do not edit.",
78
+ 'Option Explicit',
79
+ 'Dim shell, command, i, a, n',
80
+ 'command = ""',
81
+ 'For i = 0 To WScript.Arguments.Count - 1',
82
+ ' a = WScript.Arguments(i)',
83
+ " ' Backslashes before the closing quote are doubled, or the last one would escape it.",
84
+ ' n = 0',
85
+ ' Do While n < Len(a)',
86
+ ' If Mid(a, Len(a) - n, 1) <> "\\" Then Exit Do',
87
+ ' n = n + 1',
88
+ ' Loop',
89
+ ' command = command & " """ & a & String(n, "\\") & """"',
90
+ 'Next',
91
+ 'Set shell = CreateObject("WScript.Shell")',
92
+ 'shell.Run Trim(command), 0, False',
93
+ '',
94
+ ].join('\r\n');
95
+
96
+ function defaultRun(file, args, { timeout = 5000 } = {}) {
97
+ return execFileSync(file, args, { encoding: 'utf8', timeout, stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true });
98
+ }
99
+
100
+ const DEFAULT_FS = { existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync };
101
+
102
+ const failure = (code, message) => Object.assign(new Error(message || code), { code });
103
+
104
+ function xmlEscape(value) {
105
+ return String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
106
+ }
107
+
108
+ function systemTool(env, name) {
109
+ const root = env.SystemRoot || env.SYSTEMROOT || env.windir;
110
+ return root ? win32.join(root, 'System32', name) : name;
111
+ }
112
+
113
+ /**
114
+ * One REG_SZ value of a `reg export` file, or null. `reg query` prints in the console's code page, which turns a
115
+ * non-ASCII folder name (C:\Users\João) into other characters; the export (UTF-16) keeps it.
116
+ */
117
+ export function parseRegExport(text, name) {
118
+ const quoted = `"${String(name).replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"=`;
119
+ for (const line of String(text || '').replace(/^\uFEFF/, '').split(/\r?\n/)) {
120
+ if (!line.toLowerCase().startsWith(quoted.toLowerCase())) continue;
121
+ const rest = line.slice(quoted.length);
122
+ if (!rest.startsWith('"') || !rest.endsWith('"')) return null;
123
+ return rest.slice(1, -1).replace(/\\(["\\])/g, '$1');
124
+ }
125
+ return null;
126
+ }
127
+
128
+ function decodeRegFile(buffer) {
129
+ const bytes = Buffer.isBuffer(buffer) ? buffer : Buffer.from(String(buffer ?? ''), 'utf8');
130
+ return bytes[0] === 0xff && bytes[1] === 0xfe ? bytes.subarray(2).toString('utf16le') : bytes.toString('utf8');
131
+ }
132
+
133
+ /** One value of a registry key, read through `reg export` (Unicode-safe), or null. */
134
+ export function readRegValue(key, name, { run = defaultRun, fs = DEFAULT_FS, env = process.env, tmp = tmpdir() } = {}) {
135
+ const file = nativeJoin(tmp, `synabun-login-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.reg`);
136
+ try {
137
+ run(systemTool(env, 'reg.exe'), ['export', key, file, '/y']);
138
+ return parseRegExport(decodeRegFile(fs.readFileSync(file)), name);
139
+ } catch {
140
+ return null;
141
+ } finally {
142
+ try { fs.rmSync(file, { force: true }); } catch {}
143
+ }
144
+ }
145
+
146
+ /** The data of one value in `reg query` output, or null. */
147
+ export function parseRegQuery(output, name) {
148
+ for (const line of String(output || '').split(/\r?\n/)) {
149
+ const match = /^\s{2,}(.+?)\s{2,}(REG_[A-Z_]+)\s{2,}(.*)$/.exec(line) || /^\s{2,}(.+?)\s{2,}(REG_[A-Z_]+)\s*$/.exec(line);
150
+ if (match && match[1].toLowerCase() === String(name).toLowerCase()) return (match[3] ?? '').trim();
151
+ }
152
+ return null;
153
+ }
154
+
155
+ /** Windows' Startup apps switch, from its REG_BINARY: an odd first byte is "disabled". null when unknown. */
156
+ export function startupApproved(hex) {
157
+ const first = /^[0-9a-f]{2}/i.exec(String(hex || '').trim());
158
+ if (!first) return null;
159
+ return (parseInt(first[0], 16) & 1) === 0;
160
+ }
161
+
162
+ /** The [Desktop Entry] keys of a .desktop file (the first value of a key counts). */
163
+ function desktopEntryKeys(text) {
164
+ const out = {};
165
+ let inGroup = false;
166
+ for (const raw of String(text || '').split(/\r?\n/)) {
167
+ const line = raw.trim();
168
+ if (!line || line.startsWith('#')) continue;
169
+ if (line.startsWith('[')) { inGroup = line === '[Desktop Entry]'; continue; }
170
+ const at = line.indexOf('=');
171
+ if (inGroup && at > 0 && !(line.slice(0, at).trim() in out)) out[line.slice(0, at).trim()] = line.slice(at + 1).trim();
172
+ }
173
+ return out;
174
+ }
175
+
176
+ /**
177
+ * The entry this install would write now, as data: no side effects.
178
+ * { kind: 'launch-agent' | 'run-value' | 'autostart', path?, content?, key?, name?, value?, helper? }
179
+ * `entry` is a packaged build's entry executable (it brings its own Node): `<entry> launcher …`.
180
+ */
181
+ export function buildLoginPlan({
182
+ platform = process.platform, nodePath = process.execPath, packageRoot, home = homedir(), env = process.env, dataHome, entry = null,
183
+ } = {}) {
184
+ if (!packageRoot) throw new Error('packageRoot is required');
185
+ const overrides = launcherOverrides({ env, home, platform });
186
+ const args = [...LOGIN_ARGS, ...(overrides.dataHome ? ['--data-home', overrides.dataHome] : []), ...(overrides.port ? ['--port', String(overrides.port)] : [])];
187
+
188
+ if (platform === 'win32') {
189
+ const launcher = entry || win32.join(packageRoot, 'launcher.mjs');
190
+ const program = entry ? [entry, 'launcher', ...args] : [nodePath, launcher, ...args];
191
+ const mark = winQuote(launcher);
192
+ if (entry) return { kind: 'run-value', key: RUN_KEY, name: NPM_LOGIN.winName, value: program.map(winQuote).join(' '), helper: null, mark, refuse: null };
193
+ const helperPath = win32.join(dataHome, 'runtime', 'login', HIDDEN_SCRIPT);
194
+ // wscript's own options stay bare (//B: no message boxes); everything else is one quoted argument each.
195
+ const value = [winQuote(systemTool(env, 'wscript.exe')), '//B', '//NoLogo', ...[helperPath, ...program].map(winQuote)].join(' ');
196
+ // WshShell.Run expands %NAME% in what it runs, and nothing escapes it: such a path cannot be started this way.
197
+ const refuse = [helperPath, ...program].some(word => word.includes('%')) ? 'bad-path' : null;
198
+ return { kind: 'run-value', key: RUN_KEY, name: NPM_LOGIN.winName, value, helper: { path: helperPath, content: HIDDEN_SCRIPT_SOURCE }, mark, refuse };
199
+ }
200
+
201
+ const launcher = entry || posix.join(packageRoot, 'launcher.mjs');
202
+ const program = entry ? [entry, 'launcher', ...args] : [nodePath, launcher, ...args];
203
+ if (platform === 'darwin') {
204
+ const shell = /^\/[\w./-]+$/.test(String(env.SHELL || '')) ? env.SHELL : null;
205
+ const content = [
206
+ '<?xml version="1.0" encoding="UTF-8"?>',
207
+ '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">',
208
+ '<plist version="1.0">',
209
+ '<dict>',
210
+ ` <key>Label</key><string>${NPM_LOGIN.macLabel}</string>`,
211
+ ' <key>ProgramArguments</key>',
212
+ ' <array>',
213
+ ...program.map(word => ` <string>${xmlEscape(word)}</string>`),
214
+ ' </array>',
215
+ ` <key>WorkingDirectory</key><string>${xmlEscape(packageRoot)}</string>`,
216
+ // The launcher reads the login shell's environment (PATH, nvm): it is told which shell that is.
217
+ ...(shell ? [' <key>EnvironmentVariables</key>', ' <dict>', ` <key>SHELL</key><string>${xmlEscape(shell)}</string>`, ' </dict>'] : []),
218
+ ' <key>RunAtLoad</key><true/>',
219
+ // The server outlives the launcher: launchd must not end it with the launcher's process group.
220
+ ' <key>AbandonProcessGroup</key><true/>',
221
+ ' <key>ProcessType</key><string>Interactive</string>',
222
+ ' <key>StandardOutPath</key><string>/dev/null</string>',
223
+ ' <key>StandardErrorPath</key><string>/dev/null</string>',
224
+ '</dict>',
225
+ '</plist>',
226
+ '',
227
+ ].join('\n');
228
+ return { kind: 'launch-agent', path: posix.join(home, 'Library', 'LaunchAgents', `${NPM_LOGIN.macLabel}.plist`), content, mark: `<string>${xmlEscape(launcher)}</string>` };
229
+ }
230
+
231
+ const config = String(env.XDG_CONFIG_HOME || '');
232
+ const dir = posix.join(config.startsWith('/') ? config : posix.join(home, '.config'), 'autostart');
233
+ const content = [
234
+ '[Desktop Entry]',
235
+ 'Type=Application',
236
+ 'Name=SynaBun server',
237
+ 'Comment=Starts the SynaBun server in the background when you log in',
238
+ `Exec=${program.map(desktopExecArg).join(' ')}`,
239
+ 'Terminal=false',
240
+ 'NoDisplay=true',
241
+ 'X-GNOME-Autostart-enabled=true',
242
+ LINUX_MARKER,
243
+ '',
244
+ ].join('\n');
245
+ return { kind: 'autostart', path: posix.join(dir, NPM_LOGIN.linuxFile), content, mark: desktopExecArg(launcher) };
246
+ }
247
+
248
+ /**
249
+ * The entry as the system has it: 'on' (in place), 'stale' (there, but it
250
+ * starts something else: another Node, a moved install), 'disabled' (turned
251
+ * off in the system) or 'off' (not there).
252
+ */
253
+ export function inspectLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null } = {}) {
254
+ if (plan.kind === 'run-value') {
255
+ const reg = systemTool(env, 'reg.exe');
256
+ const value = readRegValue(plan.key, plan.name, { run, fs, env });
257
+ if (value == null) return 'off';
258
+ let approved = null;
259
+ try { approved = startupApproved(parseRegQuery(run(reg, ['query', APPROVED_KEY, '/v', plan.name]), plan.name)); } catch {}
260
+ if (approved === false) return 'disabled';
261
+ const helperOk = !plan.helper || (() => { try { return fs.readFileSync(plan.helper.path, 'utf8') === plan.helper.content; } catch { return false; } })();
262
+ return value === plan.value && helperOk ? 'on' : 'stale';
263
+ }
264
+ let text = null;
265
+ try { text = fs.readFileSync(plan.path, 'utf8'); } catch { return 'off'; }
266
+ if (plan.kind === 'autostart') {
267
+ const keys = desktopEntryKeys(text);
268
+ if (/^true$/i.test(keys.Hidden || '') || /^false$/i.test(keys['X-GNOME-Autostart-enabled'] || 'true')) return 'disabled';
269
+ }
270
+ if (plan.kind === 'launch-agent' && uid != null) {
271
+ // Login Items > Allow in the Background, switched off, disables the job.
272
+ try {
273
+ const out = run('/bin/launchctl', ['print-disabled', `gui/${uid}`]);
274
+ if (new RegExp(`"${NPM_LOGIN.macLabel.replace(/\./g, '\\.')}"\\s*=>\\s*(?:true|disabled)`).test(String(out))) return 'disabled';
275
+ } catch {}
276
+ }
277
+ return text === plan.content ? 'on' : 'stale';
278
+ }
279
+
280
+ function writeAtomic(fs, path, content, mode) {
281
+ fs.mkdirSync(dirname(path), { recursive: true });
282
+ const temp = `${path}.${process.pid}.tmp`;
283
+ fs.writeFileSync(temp, content, mode ? { mode } : undefined);
284
+ fs.renameSync(temp, path);
285
+ }
286
+
287
+ /**
288
+ * Put the entry in place. Throws { code: 'write-failed' | 'no-wscript' }. With `enable` (the user turned it on
289
+ * in Settings) a switch the system holds for it is turned on too: Windows' Startup apps, launchd's disabled list.
290
+ */
291
+ export function applyLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null, enable = false } = {}) {
292
+ if (plan.refuse) throw failure(plan.refuse, 'a path with % in it cannot be started at login on Windows');
293
+ try {
294
+ if (plan.kind === 'run-value') {
295
+ const wscript = systemTool(env, 'wscript.exe');
296
+ if (plan.helper && win32.isAbsolute(wscript) && !fs.existsSync(wscript)) throw failure('no-wscript', `${wscript} is missing`);
297
+ if (plan.helper) writeAtomic(fs, plan.helper.path, plan.helper.content);
298
+ run(systemTool(env, 'reg.exe'), ['add', plan.key, '/v', plan.name, '/t', 'REG_SZ', '/d', plan.value, '/f']);
299
+ // No Startup apps record: enabled.
300
+ if (enable) { try { run(systemTool(env, 'reg.exe'), ['delete', APPROVED_KEY, '/v', plan.name, '/f']); } catch {} }
301
+ return;
302
+ }
303
+ writeAtomic(fs, plan.path, plan.content, 0o644);
304
+ if (enable && plan.kind === 'launch-agent' && uid != null) { try { run('/bin/launchctl', ['enable', `gui/${uid}/${NPM_LOGIN.macLabel}`]); } catch {} }
305
+ } catch (error) {
306
+ if (error.code === 'no-wscript') throw error;
307
+ throw failure('write-failed', error.message);
308
+ }
309
+ }
310
+
311
+ /** The entry as it is written now (the file, or the Run value), or null. */
312
+ export function readLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun } = {}) {
313
+ if (plan.kind === 'run-value') return readRegValue(plan.key, plan.name, { run, fs, env });
314
+ try { return fs.readFileSync(plan.path, 'utf8'); } catch { return null; }
315
+ }
316
+
317
+ /** Take the entry away. Throws { code: 'write-failed' } when it stays. */
318
+ export function removeLoginEntry(plan, { env = process.env, fs = DEFAULT_FS, run = defaultRun, uid = typeof process.getuid === 'function' ? process.getuid() : null } = {}) {
319
+ try {
320
+ if (plan.kind === 'run-value') {
321
+ try { run(systemTool(env, 'reg.exe'), ['delete', plan.key, '/v', plan.name, '/f']); } catch (error) {
322
+ if (inspectLoginEntry(plan, { env, fs, run }) !== 'off') throw error;
323
+ }
324
+ if (plan.helper) fs.rmSync(plan.helper.path, { force: true });
325
+ return;
326
+ }
327
+ if (plan.kind === 'launch-agent' && uid != null) {
328
+ // Loaded since the last login (it ran once then): unload it too.
329
+ try { run('/bin/launchctl', ['bootout', `gui/${uid}/${NPM_LOGIN.macLabel}`]); } catch {}
330
+ }
331
+ fs.rmSync(plan.path, { force: true });
332
+ } catch (error) {
333
+ throw failure('write-failed', error.message);
334
+ }
335
+ }
336
+
337
+ // ── The desktop app's entry, as the system has it ──
338
+
339
+ /** The strings of a plist's ProgramArguments array. */
340
+ function plistArguments(text) {
341
+ const block = /<key>\s*ProgramArguments\s*<\/key>\s*<array>([\s\S]*?)<\/array>/.exec(String(text || ''));
342
+ const unxml = (v) => v.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&amp;/g, '&');
343
+ return block ? [...block[1].matchAll(/<string>([\s\S]*?)<\/string>/g)].map(m => unxml(m[1])) : [];
344
+ }
345
+
346
+ /** The words of a .desktop Exec value (its quoting and escapes undone). */
347
+ function desktopExecWords(value) {
348
+ const text = String(value || '').replace(/\\\\/g, '\\').replace(/%%/g, '%');
349
+ const words = [];
350
+ let word = '';
351
+ let quoted = false;
352
+ let any = false;
353
+ for (let i = 0; i < text.length; i++) {
354
+ const ch = text[i];
355
+ if (quoted) {
356
+ if (ch === '\\' && i + 1 < text.length) { word += text[++i]; continue; }
357
+ if (ch === '"') { quoted = false; continue; }
358
+ word += ch;
359
+ } else if (ch === '"') { quoted = true; any = true; } else if (/\s/.test(ch)) {
360
+ if (word || any) words.push(word);
361
+ word = ''; any = false;
362
+ } else word += ch;
363
+ }
364
+ if (word || any) words.push(word);
365
+ return words;
366
+ }
367
+
368
+ /** The words of a Windows command line (CommandLineToArgvW's quoting). */
369
+ function windowsWords(line) {
370
+ const text = String(line || '');
371
+ const words = [];
372
+ let word = '';
373
+ let quoted = false;
374
+ let any = false;
375
+ let i = 0;
376
+ while (i < text.length) {
377
+ const ch = text[i];
378
+ if (ch === '\\') {
379
+ let slashes = 0;
380
+ while (text[i] === '\\') { slashes++; i++; }
381
+ if (text[i] === '"') {
382
+ word += '\\'.repeat(Math.floor(slashes / 2));
383
+ if (slashes % 2) { word += '"'; any = true; i++; }
384
+ } else word += '\\'.repeat(slashes);
385
+ continue;
386
+ }
387
+ i++;
388
+ if (ch === '"') { quoted = !quoted; any = true; continue; }
389
+ if (!quoted && /\s/.test(ch)) { if (word || any) words.push(word); word = ''; any = false; continue; }
390
+ word += ch;
391
+ }
392
+ if (word || any) words.push(word);
393
+ return words;
394
+ }
395
+
396
+ const samePath = (a, b, platform) => {
397
+ if (!a || !b) return false;
398
+ const norm = (value) => (platform === 'win32' ? win32.resolve(value) : posix.resolve(value)).replace(/[\\/]+$/, '');
399
+ return platform === 'linux' ? norm(a) === norm(b) : norm(a).toLowerCase() === norm(b).toLowerCase();
400
+ };
401
+
402
+ /**
403
+ * The desktop app's program when its login entry, as the system has it now (there, not switched off, its program
404
+ * still there), opens it on `dataHome`; otherwise null. The app's own settings file is not asked: an entry the user
405
+ * removed or switched off while the app was closed never blocks this install.
406
+ */
407
+ export function desktopLoginOwner(dataHome, {
408
+ platform = process.platform, home = homedir(), env = process.env, fs = DEFAULT_FS, run = defaultRun,
409
+ uid = typeof process.getuid === 'function' ? process.getuid() : null,
410
+ } = {}) {
411
+ const usual = platform === 'win32' ? (env.APPDATA ? win32.resolve(env.APPDATA, 'synabun') : null) : posix.join(home, '.synabun');
412
+ const owns = (program, folder) => (program && fs.existsSync(program) && samePath(folder || usual, dataHome, platform) ? program : null);
413
+ try {
414
+ if (platform === 'darwin') {
415
+ const text = fs.readFileSync(posix.join(home, 'Library', 'LaunchAgents', `${DESKTOP_LOGIN.macLabel}.plist`), 'utf8');
416
+ if (uid != null) {
417
+ try {
418
+ const out = run('/bin/launchctl', ['print-disabled', `gui/${uid}`]);
419
+ if (new RegExp(`"${DESKTOP_LOGIN.macLabel.replace(/\./g, '\\.')}"\\s*=>\\s*(?:true|disabled)`).test(String(out))) return null;
420
+ } catch {}
421
+ }
422
+ // `open -a <app> --env …`, or (a Mac whose `open` has no --env) the app's own program with its environment.
423
+ const words = plistArguments(text);
424
+ const unxml = (v) => v.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');
425
+ const direct = /^(.+\.app)\/Contents\/MacOS\/[^/]+$/.exec(words[0] || '');
426
+ const bundle = words.indexOf('-a') >= 0 ? words[words.indexOf('-a') + 1] : direct ? direct[1] : null;
427
+ const folder = words.find(w => w.startsWith('SYNABUN_DATA_HOME='))?.slice('SYNABUN_DATA_HOME='.length)
428
+ ?? (/<key>SYNABUN_DATA_HOME<\/key>\s*<string>([\s\S]*?)<\/string>/.exec(text)?.[1] ? unxml(/<key>SYNABUN_DATA_HOME<\/key>\s*<string>([\s\S]*?)<\/string>/.exec(text)[1]) : undefined);
429
+ return owns(bundle, folder);
430
+ }
431
+ if (platform === 'win32') {
432
+ const value = readRegValue(RUN_KEY, DESKTOP_LOGIN.winName, { run, fs, env });
433
+ if (value == null) return null;
434
+ let approved = null;
435
+ try { approved = startupApproved(parseRegQuery(run(systemTool(env, 'reg.exe'), ['query', APPROVED_KEY, '/v', DESKTOP_LOGIN.winName]), DESKTOP_LOGIN.winName)); } catch {}
436
+ if (approved === false) return null;
437
+ const words = windowsWords(value);
438
+ const data = words.find(w => w.startsWith(DESKTOP_LOGIN.dataFlag));
439
+ let folder = null;
440
+ if (data) { try { folder = Buffer.from(data.slice(DESKTOP_LOGIN.dataFlag.length), 'base64url').toString('utf8') || null; } catch {} }
441
+ return words.includes(DESKTOP_LOGIN.flag) ? owns(words[0], folder) : null;
442
+ }
443
+ const config = String(env.XDG_CONFIG_HOME || '');
444
+ const file = posix.join(config.startsWith('/') ? config : posix.join(home, '.config'), 'autostart', DESKTOP_LOGIN.linuxFile);
445
+ const keys = desktopEntryKeys(fs.readFileSync(file, 'utf8'));
446
+ if (/^true$/i.test(keys.Hidden || '') || /^false$/i.test(keys['X-GNOME-Autostart-enabled'] || 'true')) return null;
447
+ const words = desktopExecWords(keys.Exec);
448
+ const vars = words[0] === 'env' ? words.slice(1).filter(w => /^[A-Za-z_][A-Za-z0-9_]*=/.test(w)) : [];
449
+ const program = words[0] === 'env' ? words.slice(1).find(w => !/^[A-Za-z_][A-Za-z0-9_]*=/.test(w)) : words[0];
450
+ const folder = vars.find(w => w.startsWith('SYNABUN_DATA_HOME='))?.slice('SYNABUN_DATA_HOME='.length);
451
+ return owns(program, folder);
452
+ } catch {
453
+ return null;
454
+ }
455
+ }
456
+
457
+ /**
458
+ * The start at login of this install.
459
+ *
460
+ * status() { supported, reason, enabled, state, owner }: reason 'desktop' (the desktop
461
+ * app has its own: Settings reads it from the app), 'not-here' (a test run or a
462
+ * throwaway data folder) or 'unsupported'; owner is the desktop app's program
463
+ * when it opens at login on this data folder
464
+ * set(enabled) turn it on or off; resolves to status(). Throws { code }: 'desktop-app', 'not-here',
465
+ * 'write-failed', 'no-wscript', 'refused'
466
+ * heal() on a server start: this install's own entry, when stale, is put back in place; an entry that
467
+ * starts another install, or one the user turned off, is left as it is
468
+ */
469
+ export function createLoginStart({
470
+ platform = process.platform, nodePath = process.execPath, packageRoot, home = homedir(), env = process.env, dataHome,
471
+ entry = null, desktopShell = false, allowed = () => true, fs = DEFAULT_FS, run = defaultRun, uid,
472
+ log = () => {},
473
+ } = {}) {
474
+ const ops = { env, fs, run, ...(uid !== undefined ? { uid } : {}) };
475
+ const plan = () => buildLoginPlan({ platform, nodePath, packageRoot, home, env, dataHome, entry });
476
+ const support = () => {
477
+ if (desktopShell) return { supported: false, reason: 'desktop' };
478
+ if (!['darwin', 'win32', 'linux'].includes(platform)) return { supported: false, reason: 'unsupported' };
479
+ if (!allowed()) return { supported: false, reason: 'not-here' };
480
+ return { supported: true, reason: null };
481
+ };
482
+
483
+ function status() {
484
+ const { supported, reason } = support();
485
+ const owner = desktopLoginOwner(dataHome, { platform, home, env, ...ops });
486
+ if (!supported) return { supported, reason, enabled: false, state: 'off', owner };
487
+ let state = 'off';
488
+ try { state = inspectLoginEntry(plan(), ops); } catch {}
489
+ return { supported, reason, enabled: state === 'on' || state === 'stale', state, owner };
490
+ }
491
+
492
+ async function set(enabled) {
493
+ const { supported, reason } = support();
494
+ if (!supported) throw failure(reason, `start at login is not available here (${reason})`);
495
+ const target = plan();
496
+ if (enabled) {
497
+ const owner = desktopLoginOwner(dataHome, { platform, home, env, ...ops });
498
+ if (owner) throw failure('desktop-app', `the SynaBun app opens at login on this data folder (${owner})`);
499
+ applyLoginEntry(target, { ...ops, enable: true });
500
+ } else {
501
+ removeLoginEntry(target, ops);
502
+ }
503
+ const after = status();
504
+ log(`start at login ${enabled ? 'on' : 'off'}: ${after.state}`);
505
+ if (enabled ? after.state !== 'on' : after.enabled) throw failure('refused', after.state);
506
+ return after;
507
+ }
508
+
509
+ function heal() {
510
+ const { supported } = support();
511
+ if (!supported) return { changed: false, state: 'off' };
512
+ const target = plan();
513
+ const state = inspectLoginEntry(target, ops);
514
+ if (state !== 'stale') return { changed: false, state };
515
+ // Only this install's own entry (another Node, other pins): one that starts another install on this data folder
516
+ // (an npm install, a Git checkout run by hand) is that install's, and stays as it is.
517
+ if (!String(readLoginEntry(target, ops) || '').includes(target.mark)) return { changed: false, state };
518
+ applyLoginEntry(target, ops);
519
+ log('start at login: the entry now starts this install');
520
+ return { changed: true, state: inspectLoginEntry(target, ops) };
521
+ }
522
+
523
+ return { status, set, heal, plan };
524
+ }
@@ -0,0 +1,67 @@
1
+ // Registry conversion is read-only. An explicit switch is authoritative; missing switches are on.
2
+ function asObject(value) {
3
+ return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
4
+ }
5
+
6
+ export function agentAccessFrom(registry) {
7
+ const reg = asObject(registry);
8
+ if (reg.agentAccess && typeof reg.agentAccess === 'object' && !Array.isArray(reg.agentAccess)) return { ...reg.agentAccess };
9
+ const profile = asObject(asObject(reg.profiles)[reg.activeProfile]);
10
+ if (!Array.isArray(profile.servers)) return {};
11
+ const granted = new Set(profile.servers);
12
+ // The old reconciliation marker distinguishes a de-selection from a genuinely new server.
13
+ const known = new Set(Array.isArray(reg.profileDefaults?.knownServers)
14
+ ? reg.profileDefaults.knownServers : Object.keys(asObject(reg.servers)));
15
+ return Object.fromEntries(Object.entries(asObject(reg.servers))
16
+ .filter(([name, entry]) => !entry?.builtin && known.has(name) && !granted.has(name))
17
+ .map(([name]) => [name, false]));
18
+ }
19
+
20
+ export function agentServerNames(registry) {
21
+ const reg = asObject(registry);
22
+ const access = agentAccessFrom(reg);
23
+ return Object.entries(asObject(reg.servers))
24
+ .filter(([name, entry]) => !entry?.builtin && access[name] !== false)
25
+ .map(([name]) => name);
26
+ }
27
+
28
+ /**
29
+ * Tools that mutate ad state or spend budget, keyed by MCP server name.
30
+ *
31
+ * FleetView agents run with `--permission-mode bypassPermissions`, so the read-only
32
+ * allowlist in .claude/settings.json does not apply to them. These are pushed as
33
+ * `--disallowedTools` instead: agents keep full read/reporting access, while anything
34
+ * that creates, edits, activates, or deletes stays with a human.
35
+ */
36
+ export const MCP_SERVER_WRITE_TOOLS = {
37
+ 'meta-ads': [
38
+ 'ads_create_campaign', 'ads_create_ad_set', 'ads_create_ad', 'ads_create_creative',
39
+ 'ads_update_entity', 'ads_activate_entity', 'ads_boost_ig_post',
40
+ 'ads_create_custom_audience', 'ads_update_custom_audience',
41
+ 'ads_update_custom_audience_users', 'ads_delete_custom_audience',
42
+ 'ads_catalog_create', 'ads_catalog_update_catalog',
43
+ 'ads_catalog_product_create', 'ads_catalog_update_product', 'ads_catalog_delete_product',
44
+ 'ads_catalog_create_product_set', 'ads_catalog_update_product_set', 'ads_catalog_product_set_delete',
45
+ 'ads_catalog_create_product_feed', 'ads_catalog_update_product_feed',
46
+ 'ads_catalog_create_product_feed_upload_session', 'ads_catalog_product_feed_delete',
47
+ 'ads_catalog_create_feed_rule', 'ads_catalog_product_feed_delete_rule',
48
+ 'ads_catalog_event_source_connect', 'ads_catalog_event_source_disconnect',
49
+ 'ads_pixel_event_create', 'ads_pixel_event_update', 'ads_pixel_event_delete',
50
+ 'ads_pixel_parameter_create', 'ads_pixel_parameter_update', 'ads_pixel_parameter_delete',
51
+ 'ads_experiment_abtest_create_test', 'ads_experiment_abtest_update_test',
52
+ 'ads_experiment_lift_create_test',
53
+ ],
54
+ };
55
+
56
+ /** Fully-qualified deny list for whichever servers an agent's --mcp-config actually grants. */
57
+ export function buildAgentDisallowedTools(mcpConfigJson) {
58
+ let serverNames = [];
59
+ try {
60
+ serverNames = Object.keys(asObject(JSON.parse(mcpConfigJson || '{}')).mcpServers || {});
61
+ } catch { return []; }
62
+ const deny = [];
63
+ for (const server of serverNames) {
64
+ for (const tool of MCP_SERVER_WRITE_TOOLS[server] || []) deny.push(`mcp__${server}__${tool}`);
65
+ }
66
+ return deny;
67
+ }
@@ -102,32 +102,3 @@ export function mergeGeminiMcpConfig(existing, definition) {
102
102
  },
103
103
  };
104
104
  }
105
-
106
- export function toOpenCodeMcpEntry(mcpConfig) {
107
- const source = asObject(mcpConfig);
108
- const { type: _type, command, args, env, environment, headers, oauth: _oauth, url, ...rest } = source;
109
- if (isRemoteMcp(source)) {
110
- // OpenCode names the URL-addressed transport "remote"; there is no http/sse split.
111
- const entry = { type: 'remote', url, ...rest };
112
- const hdrs = hasKeys(headers);
113
- if (hdrs) entry.headers = { ...hdrs };
114
- if (entry.enabled === undefined) entry.enabled = true;
115
- return entry;
116
- }
117
- const entry = { type: 'local', ...rest };
118
- if (command) entry.command = Array.isArray(command) ? [...command] : [command, ...(args || [])];
119
- const envObj = environment || env;
120
- if (envObj && Object.keys(envObj).length > 0) entry.environment = { ...envObj };
121
- return entry;
122
- }
123
-
124
- export function mergeOpenCodeMcpConfig(existing, name, mcpConfig) {
125
- const config = asObject(existing);
126
- return {
127
- ...config,
128
- mcp: {
129
- ...asObject(config.mcp),
130
- [name]: toOpenCodeMcpEntry(mcpConfig),
131
- },
132
- };
133
- }