synabun 1.3.0 → 2.0.0-beta

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 (1153) hide show
  1. package/CHANGELOG.md +197 -662
  2. package/LICENSE-COMMERCIAL.md +33 -0
  3. package/NOTICE +17 -0
  4. package/README.md +175 -853
  5. package/THIRD-PARTY-LICENSES.md +131 -0
  6. package/benchmarks/browser-live-results.json +79 -0
  7. package/benchmarks/browser-v2-results.json +258 -0
  8. package/benchmarks/fixtures/browser/README.md +57 -0
  9. package/benchmarks/fixtures/browser/page-state.json +132 -0
  10. package/benchmarks/fixtures/browser/social.json +92 -0
  11. package/benchmarks/fixtures/browser/target.json +319 -0
  12. package/benchmarks/fixtures/desktop/README.md +58 -0
  13. package/benchmarks/fixtures/desktop/abstention.json +59 -0
  14. package/benchmarks/fixtures/desktop/adversarial.json +22 -0
  15. package/benchmarks/fixtures/desktop/forbidden.json +93 -0
  16. package/benchmarks/fixtures/desktop/generate.mjs +1023 -0
  17. package/benchmarks/fixtures/desktop/target.json +136 -0
  18. package/bin/synabun.js +30 -0
  19. package/docs/browser-v2.md +109 -0
  20. package/docs/hook-integrity.md +89 -0
  21. package/docs/judgments.md +182 -0
  22. package/docs/style-guide.md +246 -0
  23. package/docs/whatsapp.md +325 -0
  24. package/hooks/claude-code/post-plan.mjs +613 -391
  25. package/hooks/claude-code/post-remember.mjs +246 -122
  26. package/hooks/claude-code/pre-compact.mjs +171 -110
  27. package/hooks/claude-code/pre-task.mjs +133 -0
  28. package/hooks/claude-code/pre-websearch.mjs +15 -4
  29. package/hooks/claude-code/prompt-origin.mjs +94 -0
  30. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  31. package/hooks/claude-code/session-start.mjs +114 -156
  32. package/hooks/claude-code/shared.mjs +1228 -368
  33. package/hooks/claude-code/state.mjs +167 -0
  34. package/hooks/claude-code/stop.mjs +515 -140
  35. package/hooks/claude-code/subagent-start.mjs +154 -0
  36. package/hooks/claude-code/subagent-stop.mjs +102 -0
  37. package/hooks/claude-code/task-gate.mjs +150 -0
  38. package/lib/claude-hooks.js +84 -0
  39. package/lib/claude-usage-audit.js +141 -0
  40. package/lib/client-config-repair.js +144 -0
  41. package/lib/data-home-migration.js +498 -0
  42. package/lib/first-launch-protection.js +240 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/mcp-server/dist/config.d.ts +22 -0
  46. package/mcp-server/dist/config.d.ts.map +1 -0
  47. package/mcp-server/dist/config.js +109 -0
  48. package/mcp-server/dist/config.js.map +1 -0
  49. package/mcp-server/dist/http.d.ts +30 -0
  50. package/mcp-server/dist/http.d.ts.map +1 -0
  51. package/mcp-server/dist/http.js +276 -0
  52. package/mcp-server/dist/http.js.map +1 -0
  53. package/mcp-server/dist/index.d.ts +48 -0
  54. package/mcp-server/dist/index.d.ts.map +1 -0
  55. package/mcp-server/dist/index.js +538 -0
  56. package/mcp-server/dist/index.js.map +1 -0
  57. package/mcp-server/dist/preload-http.d.ts +3 -0
  58. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  59. package/mcp-server/dist/preload-http.js +28 -0
  60. package/mcp-server/dist/preload-http.js.map +1 -0
  61. package/mcp-server/dist/preload.d.ts +3 -0
  62. package/mcp-server/dist/preload.d.ts.map +1 -0
  63. package/mcp-server/dist/preload.js +32 -0
  64. package/mcp-server/dist/preload.js.map +1 -0
  65. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  69. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  73. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  75. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  76. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  77. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  79. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  81. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  83. package/mcp-server/dist/services/browser-assist.js +282 -0
  84. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  85. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  87. package/mcp-server/dist/services/browser-bench.js +424 -0
  88. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  89. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  91. package/mcp-server/dist/services/browser-judgments.js +363 -0
  92. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  93. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  95. package/mcp-server/dist/services/browser-risk.js +458 -0
  96. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  97. package/mcp-server/dist/services/categories.d.ts +61 -0
  98. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  99. package/mcp-server/dist/services/categories.js +377 -0
  100. package/mcp-server/dist/services/categories.js.map +1 -0
  101. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  103. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  104. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  105. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  109. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  111. package/mcp-server/dist/services/desktop-assist.js +266 -0
  112. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  113. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  115. package/mcp-server/dist/services/desktop-bench.js +311 -0
  116. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  117. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  119. package/mcp-server/dist/services/desktop-client.js +79 -0
  120. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  121. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  123. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  124. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  125. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  127. package/mcp-server/dist/services/desktop-risk.js +605 -0
  128. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  129. package/mcp-server/dist/services/discord.d.ts +112 -0
  130. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  131. package/mcp-server/dist/services/discord.js +477 -0
  132. package/mcp-server/dist/services/discord.js.map +1 -0
  133. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  135. package/mcp-server/dist/services/edit-stale.js +358 -0
  136. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  137. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  139. package/mcp-server/dist/services/embedding-service.js +126 -0
  140. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  141. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  143. package/mcp-server/dist/services/embedding-worker.js +52 -0
  144. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  145. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  147. package/mcp-server/dist/services/fb-regions.js +211 -0
  148. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  149. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  151. package/mcp-server/dist/services/file-checksums.js +55 -0
  152. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  153. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  155. package/mcp-server/dist/services/file-excerpt.js +65 -0
  156. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  157. package/mcp-server/dist/services/identity.d.ts +124 -0
  158. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  159. package/mcp-server/dist/services/identity.js +241 -0
  160. package/mcp-server/dist/services/identity.js.map +1 -0
  161. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  163. package/mcp-server/dist/services/local-embeddings.js +3 -0
  164. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  165. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  166. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  167. package/mcp-server/dist/services/memory-client.js +27 -0
  168. package/mcp-server/dist/services/memory-client.js.map +1 -0
  169. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  173. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  175. package/mcp-server/dist/services/memory-judgments.js +674 -0
  176. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  177. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  179. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  180. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  181. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  183. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  184. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  185. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  187. package/mcp-server/dist/services/memory-schema.js +282 -0
  188. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  189. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  191. package/mcp-server/dist/services/memory-sessions.js +110 -0
  192. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  193. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  195. package/mcp-server/dist/services/memory-triage.js +189 -0
  196. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  197. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  199. package/mcp-server/dist/services/memory-verification.js +92 -0
  200. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  201. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  203. package/mcp-server/dist/services/memory-writer.js +126 -0
  204. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  205. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  207. package/mcp-server/dist/services/neural-interface.js +1135 -0
  208. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  209. package/mcp-server/dist/services/profiles.d.ts +120 -0
  210. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  211. package/mcp-server/dist/services/profiles.js +387 -0
  212. package/mcp-server/dist/services/profiles.js.map +1 -0
  213. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  215. package/mcp-server/dist/services/secret-gate.js +43 -0
  216. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  217. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  219. package/mcp-server/dist/services/server-instructions.js +101 -0
  220. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  221. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  222. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  223. package/mcp-server/dist/services/sqlite.js +1185 -0
  224. package/mcp-server/dist/services/sqlite.js.map +1 -0
  225. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  227. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  228. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  229. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  231. package/mcp-server/dist/services/typesafe-config.js +746 -0
  232. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  233. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  234. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  235. package/mcp-server/dist/services/typesafe.js +330 -0
  236. package/mcp-server/dist/services/typesafe.js.map +1 -0
  237. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  239. package/mcp-server/dist/services/vector-cache.js +271 -0
  240. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  241. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  245. package/mcp-server/dist/tools/agents.d.ts +212 -0
  246. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  247. package/mcp-server/dist/tools/agents.js +407 -0
  248. package/mcp-server/dist/tools/agents.js.map +1 -0
  249. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  251. package/mcp-server/dist/tools/bluesky.js +1144 -0
  252. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  253. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  255. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  256. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  257. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  259. package/mcp-server/dist/tools/browser-batch.js +187 -0
  260. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  261. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  265. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  267. package/mcp-server/dist/tools/browser-interact.js +300 -0
  268. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  269. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  271. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  272. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  273. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  275. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  276. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  277. package/mcp-server/dist/tools/browser.d.ts +34 -0
  278. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  279. package/mcp-server/dist/tools/browser.js +112 -0
  280. package/mcp-server/dist/tools/browser.js.map +1 -0
  281. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  283. package/mcp-server/dist/tools/card-tools.js +137 -0
  284. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  285. package/mcp-server/dist/tools/card.d.ts +8 -0
  286. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  287. package/mcp-server/dist/tools/card.js +16 -0
  288. package/mcp-server/dist/tools/card.js.map +1 -0
  289. package/mcp-server/dist/tools/category.d.ts +32 -0
  290. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  291. package/mcp-server/dist/tools/category.js +290 -0
  292. package/mcp-server/dist/tools/category.js.map +1 -0
  293. package/mcp-server/dist/tools/choice.d.ts +160 -0
  294. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  295. package/mcp-server/dist/tools/choice.js +80 -0
  296. package/mcp-server/dist/tools/choice.js.map +1 -0
  297. package/mcp-server/dist/tools/computer.d.ts +71 -0
  298. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  299. package/mcp-server/dist/tools/computer.js +174 -0
  300. package/mcp-server/dist/tools/computer.js.map +1 -0
  301. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  303. package/mcp-server/dist/tools/discord-channel.js +236 -0
  304. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  305. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  307. package/mcp-server/dist/tools/discord-guild.js +138 -0
  308. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  309. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  311. package/mcp-server/dist/tools/discord-member.js +122 -0
  312. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  313. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  315. package/mcp-server/dist/tools/discord-message.js +184 -0
  316. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  317. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  319. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  321. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  323. package/mcp-server/dist/tools/discord-role.js +178 -0
  324. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  325. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  327. package/mcp-server/dist/tools/discord-thread.js +88 -0
  328. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  329. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  331. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  332. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  333. package/mcp-server/dist/tools/discord.d.ts +7 -0
  334. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  335. package/mcp-server/dist/tools/discord.js +25 -0
  336. package/mcp-server/dist/tools/discord.js.map +1 -0
  337. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  339. package/mcp-server/dist/tools/fb-groups.js +369 -0
  340. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  341. package/mcp-server/dist/tools/forget.d.ts +14 -0
  342. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  343. package/mcp-server/dist/tools/forget.js +26 -0
  344. package/mcp-server/dist/tools/forget.js.map +1 -0
  345. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  347. package/mcp-server/dist/tools/git-tools.js +107 -0
  348. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  349. package/mcp-server/dist/tools/git.d.ts +7 -0
  350. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  351. package/mcp-server/dist/tools/git.js +11 -0
  352. package/mcp-server/dist/tools/git.js.map +1 -0
  353. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  355. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  356. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  357. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  359. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  361. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  363. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  365. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  367. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  369. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  371. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  373. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  375. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  376. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  377. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  379. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  380. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  381. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  382. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  383. package/mcp-server/dist/tools/gsc.js +51 -0
  384. package/mcp-server/dist/tools/gsc.js.map +1 -0
  385. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  387. package/mcp-server/dist/tools/image-tools.js +80 -0
  388. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  389. package/mcp-server/dist/tools/image.d.ts +10 -0
  390. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  391. package/mcp-server/dist/tools/image.js +14 -0
  392. package/mcp-server/dist/tools/image.js.map +1 -0
  393. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  397. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  399. package/mcp-server/dist/tools/leonardo.js +21 -0
  400. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  401. package/mcp-server/dist/tools/loop.d.ts +30 -0
  402. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  403. package/mcp-server/dist/tools/loop.js +401 -0
  404. package/mcp-server/dist/tools/loop.js.map +1 -0
  405. package/mcp-server/dist/tools/memories.d.ts +56 -0
  406. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  407. package/mcp-server/dist/tools/memories.js +171 -0
  408. package/mcp-server/dist/tools/memories.js.map +1 -0
  409. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  411. package/mcp-server/dist/tools/morelogin.js +79 -0
  412. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  413. package/mcp-server/dist/tools/profile.d.ts +17 -0
  414. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  415. package/mcp-server/dist/tools/profile.js +114 -0
  416. package/mcp-server/dist/tools/profile.js.map +1 -0
  417. package/mcp-server/dist/tools/recall.d.ts +71 -0
  418. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  419. package/mcp-server/dist/tools/recall.js +147 -0
  420. package/mcp-server/dist/tools/recall.js.map +1 -0
  421. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  422. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  423. package/mcp-server/dist/tools/reflect.js +157 -0
  424. package/mcp-server/dist/tools/reflect.js.map +1 -0
  425. package/mcp-server/dist/tools/remember.d.ts +62 -0
  426. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  427. package/mcp-server/dist/tools/remember.js +201 -0
  428. package/mcp-server/dist/tools/remember.js.map +1 -0
  429. package/mcp-server/dist/tools/response.d.ts +23 -0
  430. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  431. package/mcp-server/dist/tools/response.js +24 -0
  432. package/mcp-server/dist/tools/response.js.map +1 -0
  433. package/mcp-server/dist/tools/restore.d.ts +14 -0
  434. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  435. package/mcp-server/dist/tools/restore.js +23 -0
  436. package/mcp-server/dist/tools/restore.js.map +1 -0
  437. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  439. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  441. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  443. package/mcp-server/dist/tools/style-guide.js +12 -0
  444. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  445. package/mcp-server/dist/tools/sync.d.ts +20 -0
  446. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  447. package/mcp-server/dist/tools/sync.js +156 -0
  448. package/mcp-server/dist/tools/sync.js.map +1 -0
  449. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  453. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  455. package/mcp-server/dist/tools/tictactoe.js +11 -0
  456. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  457. package/mcp-server/dist/tools/utils.d.ts +19 -0
  458. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  459. package/mcp-server/dist/tools/utils.js +54 -0
  460. package/mcp-server/dist/tools/utils.js.map +1 -0
  461. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  463. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  465. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  469. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  471. package/mcp-server/dist/tools/whiteboard.js +16 -0
  472. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  473. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  475. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  477. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  479. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  481. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  483. package/mcp-server/dist/tools/youtube/download.js +30 -0
  484. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  485. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  487. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  489. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  491. package/mcp-server/dist/tools/youtube/media.js +97 -0
  492. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  493. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  495. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  497. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  499. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  501. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  503. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  505. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  507. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  509. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  511. package/mcp-server/dist/tools/youtube/source.js +85 -0
  512. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  513. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  515. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  516. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  517. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  518. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  519. package/mcp-server/dist/tools/youtube.js +38 -0
  520. package/mcp-server/dist/tools/youtube.js.map +1 -0
  521. package/mcp-server/dist/tui.d.ts +3 -0
  522. package/mcp-server/dist/tui.d.ts.map +1 -0
  523. package/mcp-server/dist/tui.js +806 -0
  524. package/mcp-server/dist/tui.js.map +1 -0
  525. package/mcp-server/dist/types.d.ts +77 -0
  526. package/mcp-server/dist/types.d.ts.map +1 -0
  527. package/mcp-server/dist/types.js +2 -0
  528. package/mcp-server/dist/types.js.map +1 -0
  529. package/mcp-server/package-lock.json +4798 -0
  530. package/mcp-server/package.json +55 -38
  531. package/mcp-server/run.mjs +12 -2
  532. package/mcp-server/src/config.ts +48 -3
  533. package/mcp-server/src/http.ts +296 -93
  534. package/mcp-server/src/index.ts +546 -203
  535. package/mcp-server/src/preload-http.ts +19 -18
  536. package/mcp-server/src/preload.ts +19 -18
  537. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  538. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  539. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  540. package/mcp-server/src/services/browser-assist.ts +267 -0
  541. package/mcp-server/src/services/browser-bench.ts +477 -0
  542. package/mcp-server/src/services/browser-judgments.ts +414 -0
  543. package/mcp-server/src/services/browser-risk.ts +484 -0
  544. package/mcp-server/src/services/categories.ts +36 -19
  545. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  546. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  547. package/mcp-server/src/services/desktop-assist.ts +308 -0
  548. package/mcp-server/src/services/desktop-bench.ts +372 -0
  549. package/mcp-server/src/services/desktop-client.ts +76 -0
  550. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  551. package/mcp-server/src/services/desktop-risk.ts +743 -0
  552. package/mcp-server/src/services/edit-stale.ts +299 -0
  553. package/mcp-server/src/services/embedding-service.ts +108 -0
  554. package/mcp-server/src/services/embedding-worker.ts +46 -0
  555. package/mcp-server/src/services/fb-regions.ts +221 -0
  556. package/mcp-server/src/services/file-checksums.ts +26 -9
  557. package/mcp-server/src/services/file-excerpt.ts +59 -0
  558. package/mcp-server/src/services/identity.ts +291 -0
  559. package/mcp-server/src/services/local-embeddings.ts +2 -77
  560. package/mcp-server/src/services/memory-client.ts +23 -0
  561. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  562. package/mcp-server/src/services/memory-judgments.ts +901 -0
  563. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  564. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  565. package/mcp-server/src/services/memory-schema.ts +280 -0
  566. package/mcp-server/src/services/memory-sessions.ts +87 -0
  567. package/mcp-server/src/services/memory-triage.ts +182 -0
  568. package/mcp-server/src/services/memory-verification.ts +68 -0
  569. package/mcp-server/src/services/memory-writer.ts +125 -0
  570. package/mcp-server/src/services/neural-interface.ts +1217 -73
  571. package/mcp-server/src/services/profiles.ts +428 -0
  572. package/mcp-server/src/services/secret-gate.ts +52 -0
  573. package/mcp-server/src/services/server-instructions.ts +122 -0
  574. package/mcp-server/src/services/sqlite.ts +1456 -823
  575. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  576. package/mcp-server/src/services/typesafe-config.ts +790 -0
  577. package/mcp-server/src/services/typesafe.ts +390 -0
  578. package/mcp-server/src/services/vector-cache.ts +255 -0
  579. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  580. package/mcp-server/src/tools/agents.ts +539 -0
  581. package/mcp-server/src/tools/bluesky.ts +1186 -0
  582. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  583. package/mcp-server/src/tools/browser-batch.ts +178 -0
  584. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  585. package/mcp-server/src/tools/browser-interact.ts +362 -255
  586. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  587. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  588. package/mcp-server/src/tools/browser.ts +181 -107
  589. package/mcp-server/src/tools/card.ts +7 -5
  590. package/mcp-server/src/tools/choice.ts +103 -0
  591. package/mcp-server/src/tools/computer.ts +190 -0
  592. package/mcp-server/src/tools/discord.ts +10 -23
  593. package/mcp-server/src/tools/fb-groups.ts +387 -0
  594. package/mcp-server/src/tools/forget.ts +1 -1
  595. package/mcp-server/src/tools/git.ts +3 -1
  596. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  597. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  598. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  599. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  600. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  601. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  602. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  603. package/mcp-server/src/tools/gsc.ts +95 -0
  604. package/mcp-server/src/tools/image.ts +3 -1
  605. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  606. package/mcp-server/src/tools/leonardo.ts +7 -5
  607. package/mcp-server/src/tools/loop.ts +118 -25
  608. package/mcp-server/src/tools/memories.ts +65 -5
  609. package/mcp-server/src/tools/morelogin.ts +81 -0
  610. package/mcp-server/src/tools/profile.ts +122 -0
  611. package/mcp-server/src/tools/recall.ts +105 -261
  612. package/mcp-server/src/tools/reflect.ts +171 -145
  613. package/mcp-server/src/tools/remember.ts +223 -115
  614. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  615. package/mcp-server/src/tools/style-guide.ts +16 -0
  616. package/mcp-server/src/tools/sync.ts +66 -9
  617. package/mcp-server/src/tools/tictactoe.ts +3 -1
  618. package/mcp-server/src/tools/utils.ts +22 -0
  619. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  620. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  621. package/mcp-server/src/tools/whiteboard.ts +7 -5
  622. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  623. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  624. package/mcp-server/src/tools/youtube/download.ts +41 -0
  625. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  626. package/mcp-server/src/tools/youtube/media.ts +109 -0
  627. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  628. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  629. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  630. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  631. package/mcp-server/src/tools/youtube/source.ts +101 -0
  632. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  633. package/mcp-server/src/tools/youtube.ts +47 -0
  634. package/mcp-server/src/tui.ts +8 -9
  635. package/neural-interface/games/TicTacToe/1.svg +1 -0
  636. package/neural-interface/games/TicTacToe/2.svg +1 -0
  637. package/neural-interface/games/TicTacToe/3.svg +1 -0
  638. package/neural-interface/games/TicTacToe/4.svg +1 -0
  639. package/neural-interface/games/TicTacToe/5.svg +1 -0
  640. package/neural-interface/games/TicTacToe/6.svg +1 -0
  641. package/neural-interface/games/TicTacToe/7.svg +1 -0
  642. package/neural-interface/games/TicTacToe/8.svg +1 -0
  643. package/neural-interface/games/TicTacToe/9.svg +1 -0
  644. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  647. package/neural-interface/i18n/en.json +6983 -0
  648. package/neural-interface/i18n/pt-BR.json +6987 -0
  649. package/neural-interface/lib/assistant-api.js +1005 -0
  650. package/neural-interface/lib/assistant-attachments.js +121 -0
  651. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  652. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  653. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  654. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  655. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  656. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  657. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  658. package/neural-interface/lib/assistant-budget.js +318 -0
  659. package/neural-interface/lib/assistant-catalog.js +731 -0
  660. package/neural-interface/lib/assistant-clarify.js +664 -0
  661. package/neural-interface/lib/assistant-config.js +232 -0
  662. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  663. package/neural-interface/lib/assistant-envelope.js +579 -0
  664. package/neural-interface/lib/assistant-evidence.js +236 -0
  665. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  666. package/neural-interface/lib/assistant-jev.js +117 -0
  667. package/neural-interface/lib/assistant-judgments.js +111 -0
  668. package/neural-interface/lib/assistant-media.js +335 -0
  669. package/neural-interface/lib/assistant-memory.js +398 -0
  670. package/neural-interface/lib/assistant-persona.js +444 -0
  671. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  672. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  673. package/neural-interface/lib/assistant-playbooks.js +72 -0
  674. package/neural-interface/lib/assistant-pricing.js +159 -0
  675. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  676. package/neural-interface/lib/assistant-route-gate.js +212 -0
  677. package/neural-interface/lib/assistant-router.js +1324 -0
  678. package/neural-interface/lib/assistant-runtime.js +3337 -0
  679. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  680. package/neural-interface/lib/assistant-usage.js +1688 -0
  681. package/neural-interface/lib/augmented-path.js +50 -0
  682. package/neural-interface/lib/automation-storage-migration.js +54 -0
  683. package/neural-interface/lib/backup-service.js +851 -0
  684. package/neural-interface/lib/backup-zip-reader.js +262 -0
  685. package/neural-interface/lib/browser-assist-api.js +41 -0
  686. package/neural-interface/lib/browser-console.js +176 -0
  687. package/neural-interface/lib/browser-execution.js +241 -0
  688. package/neural-interface/lib/browser-extraction.js +191 -0
  689. package/neural-interface/lib/browser-screenshot.js +399 -0
  690. package/neural-interface/lib/browser-semantic-context.js +639 -0
  691. package/neural-interface/lib/browser-snapshots.js +192 -0
  692. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  693. package/neural-interface/lib/browser-targets.js +70 -0
  694. package/neural-interface/lib/browser-tool-policy.js +926 -0
  695. package/neural-interface/lib/claude-accounts.js +230 -0
  696. package/neural-interface/lib/claude-agent-bridge.js +3296 -0
  697. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  698. package/neural-interface/lib/claude-history.js +429 -0
  699. package/neural-interface/lib/claude-model-catalog.js +483 -0
  700. package/neural-interface/lib/claude-panel-requests.js +165 -0
  701. package/neural-interface/lib/claude-panel-session.js +272 -0
  702. package/neural-interface/lib/claude-permission-rules.js +153 -0
  703. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  704. package/neural-interface/lib/claude-session-list.js +82 -0
  705. package/neural-interface/lib/claude-session-ops.js +140 -0
  706. package/neural-interface/lib/claude-settings-view.js +51 -0
  707. package/neural-interface/lib/claude-skin-connect.js +79 -0
  708. package/neural-interface/lib/claude-stall-policy.js +7 -0
  709. package/neural-interface/lib/claude-temporary.js +435 -0
  710. package/neural-interface/lib/cli-update-planner.js +312 -0
  711. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  712. package/neural-interface/lib/codex-capabilities.js +148 -0
  713. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  714. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  715. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  716. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  717. package/neural-interface/lib/codex-model-context.js +202 -0
  718. package/neural-interface/lib/codex-plan-store.js +71 -0
  719. package/neural-interface/lib/codex-request-journal.js +242 -0
  720. package/neural-interface/lib/codex-runtime-path.js +213 -0
  721. package/neural-interface/lib/codex-session-catalog.js +231 -0
  722. package/neural-interface/lib/codex-session-settings.js +46 -0
  723. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  724. package/neural-interface/lib/codex-thread-history.js +165 -0
  725. package/neural-interface/lib/codex-user-verification.js +34 -0
  726. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  727. package/neural-interface/lib/confined-fs.js +256 -0
  728. package/neural-interface/lib/db.js +922 -0
  729. package/neural-interface/lib/design-md.js +9 -0
  730. package/neural-interface/lib/desktop/api.js +92 -0
  731. package/neural-interface/lib/desktop/audit.js +62 -0
  732. package/neural-interface/lib/desktop/build.js +423 -0
  733. package/neural-interface/lib/desktop/config.js +606 -0
  734. package/neural-interface/lib/desktop/coords.js +76 -0
  735. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  736. package/neural-interface/lib/desktop/frames.js +77 -0
  737. package/neural-interface/lib/desktop/grants.js +84 -0
  738. package/neural-interface/lib/desktop/guards.js +170 -0
  739. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  740. package/neural-interface/lib/desktop/lease.js +51 -0
  741. package/neural-interface/lib/desktop/manager.js +545 -0
  742. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  743. package/neural-interface/lib/desktop/protocol.js +495 -0
  744. package/neural-interface/lib/desktop/service.js +1202 -0
  745. package/neural-interface/lib/effort-levels.js +148 -0
  746. package/neural-interface/lib/event-loop-monitor.js +67 -0
  747. package/neural-interface/lib/exec-loop-command.js +209 -0
  748. package/neural-interface/lib/folder-picker.ps1 +77 -0
  749. package/neural-interface/lib/http-guards.js +287 -0
  750. package/neural-interface/lib/jsonl-lines.js +94 -0
  751. package/neural-interface/lib/loop-logger.js +127 -0
  752. package/neural-interface/lib/mcp-client-config.js +133 -0
  753. package/neural-interface/lib/mcp-installer.js +487 -0
  754. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  755. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  756. package/neural-interface/lib/memo-cache.js +84 -0
  757. package/neural-interface/lib/memory-api.js +758 -0
  758. package/neural-interface/lib/memory-map-api.js +1150 -0
  759. package/neural-interface/lib/memory-map-layout.js +872 -0
  760. package/neural-interface/lib/memory-map-worker.js +165 -0
  761. package/neural-interface/lib/memory-session-capture.js +81 -0
  762. package/neural-interface/lib/memory-timers.js +62 -0
  763. package/neural-interface/lib/morelogin.js +301 -0
  764. package/neural-interface/lib/native-binary-runtime.js +650 -0
  765. package/neural-interface/lib/native-loop-goal.js +33 -0
  766. package/neural-interface/lib/native-loop-providers.js +1016 -0
  767. package/neural-interface/lib/native-loop-runtime.js +747 -0
  768. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  769. package/neural-interface/lib/opencode-history.js +253 -0
  770. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  771. package/neural-interface/lib/opencode-v2-client.js +486 -0
  772. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  773. package/neural-interface/lib/path-confine.js +213 -0
  774. package/neural-interface/lib/plugin-installer.js +264 -0
  775. package/neural-interface/lib/project-storage.js +766 -0
  776. package/neural-interface/lib/pty-host/core.js +603 -0
  777. package/neural-interface/lib/pty-host/flow.js +43 -0
  778. package/neural-interface/lib/pty-host/host.js +47 -0
  779. package/neural-interface/lib/pty-host/manager.js +360 -0
  780. package/neural-interface/lib/pty-host/protocol.js +81 -0
  781. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  782. package/neural-interface/lib/remote-policy.js +582 -0
  783. package/neural-interface/lib/rulesets/api.js +175 -0
  784. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  785. package/neural-interface/lib/rulesets/installer.js +1453 -0
  786. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  787. package/neural-interface/lib/rulesets/lock.js +170 -0
  788. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  789. package/neural-interface/lib/rulesets/normalise.js +24 -0
  790. package/neural-interface/lib/rulesets/render.js +84 -0
  791. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  792. package/neural-interface/lib/session-cache-builder.js +524 -0
  793. package/neural-interface/lib/session-chunker.js +344 -0
  794. package/neural-interface/lib/session-indexer.js +327 -0
  795. package/neural-interface/lib/session-title-generator.js +227 -0
  796. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  797. package/neural-interface/lib/style-guide/api.js +375 -0
  798. package/neural-interface/lib/style-guide/color.js +352 -0
  799. package/neural-interface/lib/style-guide/export-css.js +99 -0
  800. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  801. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  802. package/neural-interface/lib/style-guide/fonts.json +227 -0
  803. package/neural-interface/lib/style-guide/import.js +1268 -0
  804. package/neural-interface/lib/style-guide/pointers.js +103 -0
  805. package/neural-interface/lib/style-guide/presets.js +232 -0
  806. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  807. package/neural-interface/lib/style-guide/schema.js +848 -0
  808. package/neural-interface/lib/style-guide/security.js +43 -0
  809. package/neural-interface/lib/style-guide/store.js +491 -0
  810. package/neural-interface/lib/style-guide/summary.js +106 -0
  811. package/neural-interface/lib/style-guide/tokens.js +170 -0
  812. package/neural-interface/lib/synabun-update-plan.js +305 -0
  813. package/neural-interface/lib/synabun-version.js +179 -0
  814. package/neural-interface/lib/system-restore.js +99 -0
  815. package/neural-interface/lib/terminal-env.js +86 -0
  816. package/neural-interface/lib/ui-blob-store.js +106 -0
  817. package/neural-interface/lib/vector-cache.js +2 -0
  818. package/neural-interface/lib/virtual-socket.js +60 -0
  819. package/neural-interface/lib/whatsapp/api.js +146 -0
  820. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  821. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  822. package/neural-interface/lib/whatsapp/brain.js +128 -0
  823. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  824. package/neural-interface/lib/whatsapp/cards.js +519 -0
  825. package/neural-interface/lib/whatsapp/commands.js +92 -0
  826. package/neural-interface/lib/whatsapp/config.js +291 -0
  827. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  828. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  829. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  830. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  831. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  832. package/neural-interface/lib/whatsapp/format.js +552 -0
  833. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  834. package/neural-interface/lib/whatsapp/host.js +119 -0
  835. package/neural-interface/lib/whatsapp/identity.js +288 -0
  836. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  837. package/neural-interface/lib/whatsapp/installer.js +562 -0
  838. package/neural-interface/lib/whatsapp/manager.js +638 -0
  839. package/neural-interface/lib/whatsapp/paths.js +81 -0
  840. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  841. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  842. package/neural-interface/lib/whatsapp/redact.js +130 -0
  843. package/neural-interface/lib/whatsapp/service.js +1305 -0
  844. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  845. package/neural-interface/package-lock.json +4682 -0
  846. package/neural-interface/package.json +58 -27
  847. package/neural-interface/public/apple-touch-icon.png +0 -0
  848. package/neural-interface/public/category-logos/synabun.png +0 -0
  849. package/neural-interface/public/claude.svg +1 -0
  850. package/neural-interface/public/favicon-16x16.png +0 -0
  851. package/neural-interface/public/favicon-32x32.png +0 -0
  852. package/neural-interface/public/icon-192.png +0 -0
  853. package/neural-interface/public/icon-512.png +0 -0
  854. package/neural-interface/public/index.html +32 -182
  855. package/neural-interface/public/index2d.html +2 -2
  856. package/neural-interface/public/logo-synabun.png +0 -0
  857. package/neural-interface/public/logoHD.png +0 -0
  858. package/neural-interface/public/mcp.svg +4 -0
  859. package/neural-interface/public/offline.html +335 -299
  860. package/neural-interface/public/onboarding.html +692 -155
  861. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  862. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  863. package/neural-interface/public/shared/api.js +339 -28
  864. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  865. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  866. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  867. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  868. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  869. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  870. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  871. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  872. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  873. package/neural-interface/public/shared/assistant/asst-mascot.js +311 -0
  874. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  875. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  876. package/neural-interface/public/shared/assistant/asst-rack-styles.js +589 -0
  877. package/neural-interface/public/shared/assistant/asst-render.js +3296 -0
  878. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  879. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  880. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  881. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  882. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  883. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  884. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  885. package/neural-interface/public/shared/assistant/asst-styles.js +1684 -0
  886. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  887. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  888. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  889. package/neural-interface/public/shared/automation-context.js +75 -0
  890. package/neural-interface/public/shared/blob-store.js +99 -0
  891. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  892. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  893. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  894. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  895. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  896. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  897. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  898. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  899. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  900. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  901. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  902. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  903. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  904. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  905. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  906. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  907. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  908. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  909. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  910. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  911. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  912. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  913. package/neural-interface/public/shared/cli-status.js +169 -0
  914. package/neural-interface/public/shared/constants.js +22 -5
  915. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  916. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  917. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  918. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  919. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  920. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  921. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  922. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  923. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  924. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  925. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  926. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  927. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  928. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  929. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  930. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  931. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  932. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  933. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  934. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  935. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  936. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  937. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  938. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  939. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  940. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  941. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  942. package/neural-interface/public/shared/graph-activity.js +68 -0
  943. package/neural-interface/public/shared/html-shell.js +107 -12
  944. package/neural-interface/public/shared/i18n.js +132 -34
  945. package/neural-interface/public/shared/node-positions-store.js +44 -0
  946. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  947. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  948. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  949. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  950. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  951. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  952. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  953. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  992. package/neural-interface/public/shared/provider-icons.js +30 -0
  993. package/neural-interface/public/shared/session-title.js +100 -0
  994. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  995. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  996. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  997. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  998. package/neural-interface/public/shared/state.js +5 -0
  999. package/neural-interface/public/shared/storage.js +50 -7
  1000. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1001. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1002. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1003. package/neural-interface/public/shared/styleguide/sg-colors.js +148 -0
  1004. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1005. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1006. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1007. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1008. package/neural-interface/public/shared/styleguide/sg-import-export.js +47 -0
  1009. package/neural-interface/public/shared/styleguide/sg-kit.js +281 -0
  1010. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1011. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1012. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1013. package/neural-interface/public/shared/styleguide/sg-panel.js +229 -0
  1014. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1015. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1016. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1017. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1018. package/neural-interface/public/shared/styleguide/sg-typography.js +124 -0
  1019. package/neural-interface/public/shared/styles.css +7883 -1155
  1020. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1021. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1022. package/neural-interface/public/shared/term-renderer.js +343 -0
  1023. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1024. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1025. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1026. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1027. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1028. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1029. package/neural-interface/public/shared/ui-detail.js +77 -14
  1030. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1031. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1032. package/neural-interface/public/shared/ui-help.js +2 -2
  1033. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1034. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1035. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1036. package/neural-interface/public/shared/ui-link.js +105 -51
  1037. package/neural-interface/public/shared/ui-loading.js +4 -4
  1038. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1039. package/neural-interface/public/shared/ui-menubar.js +89 -4
  1040. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1041. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1042. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1043. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1044. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1045. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1046. package/neural-interface/public/shared/ui-panels.js +15 -7
  1047. package/neural-interface/public/shared/ui-resume.js +823 -653
  1048. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1049. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1050. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1051. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1052. package/neural-interface/public/shared/ui-settings.js +5793 -2190
  1053. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1054. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1055. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1056. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1057. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1058. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1059. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1060. package/neural-interface/public/shared/ui-skills.js +18 -32
  1061. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1062. package/neural-interface/public/shared/ui-sync.js +87 -0
  1063. package/neural-interface/public/shared/ui-terminal.js +7877 -6385
  1064. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1065. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1066. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1067. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1068. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1069. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1070. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1071. package/neural-interface/public/shared/ui-update.js +420 -68
  1072. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1073. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1074. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1075. package/neural-interface/public/shared/utils.js +58 -0
  1076. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1077. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1078. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1079. package/neural-interface/public/sidepanel-session.html +18 -0
  1080. package/neural-interface/public/sw.js +8 -2
  1081. package/neural-interface/public/synabun.png +0 -0
  1082. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1083. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1084. package/neural-interface/public/variant/2d/layout.js +595 -594
  1085. package/neural-interface/public/variant/2d/main.js +556 -521
  1086. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1087. package/neural-interface/public/variant/3d/main.js +516 -500
  1088. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1089. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1090. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1091. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1092. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1093. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1094. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1095. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1096. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1097. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1098. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1099. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1100. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1101. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1102. package/neural-interface/scripts/rebuild-pty.js +37 -23
  1103. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1104. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1105. package/neural-interface/server.js +33948 -15000
  1106. package/neural-interface/skins/default/skin.css +90 -0
  1107. package/neural-interface/skins/default/skin.json +8 -0
  1108. package/neural-interface/templates/rulesets/README.md +9 -0
  1109. package/neural-interface/templates/rulesets/claude.md +3 -0
  1110. package/neural-interface/templates/rulesets/codex.md +2 -0
  1111. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1112. package/neural-interface/templates/rulesets/core.md +26 -0
  1113. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1114. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1115. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1116. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1117. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1118. package/package.json +119 -53
  1119. package/postinstall.js +125 -26
  1120. package/preuninstall.js +187 -0
  1121. package/scripts/audit-claude-hook-usage.mjs +12 -0
  1122. package/scripts/audit-memory-duplicates.mjs +44 -0
  1123. package/scripts/measure-claude-hook-overhead.mjs +77 -0
  1124. package/scripts/recover-user-config.mjs +254 -0
  1125. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1126. package/setup.js +804 -260
  1127. package/skills/leonardo/SKILL.md +19 -10
  1128. package/skills/leonardo/modules/image-prompter.md +18 -12
  1129. package/skills/leonardo/modules/video-prompter.md +19 -13
  1130. package/skills/synabun/SKILL.md +209 -185
  1131. package/skills/synabun/icon.png +0 -0
  1132. package/skills/synabun/modules/audit.md +380 -374
  1133. package/skills/synabun/modules/changelog.md +15 -6
  1134. package/skills/synabun/modules/idea.md +148 -144
  1135. package/skills/synabun/modules/memorize.md +13 -4
  1136. package/skills/synabun/modules/schedule.md +198 -0
  1137. package/skills/synabun/synabunicon.png +0 -0
  1138. package/updater.cmd +31 -0
  1139. package/updater.mjs +382 -0
  1140. package/updater.sh +29 -0
  1141. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1142. package/neural-interface/public/claude-chat.css +0 -878
  1143. package/neural-interface/public/claude-chat.html +0 -92
  1144. package/neural-interface/public/claude-chat.js +0 -1168
  1145. package/neural-interface/public/index-legacy.html +0 -14677
  1146. package/neural-interface/public/index2d-legacy.html +0 -8193
  1147. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1148. package/neural-interface/public/variant/3d/background.js +0 -884
  1149. package/neural-interface/public/variant/3d/camera.js +0 -661
  1150. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1151. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1152. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1153. package/neural-interface/templates/CLAUDE-template.md +0 -211
@@ -91,6 +91,10 @@
91
91
  .steps-viewport {
92
92
  position: relative;
93
93
  overflow: hidden;
94
+ /* Progressive fallback: absolute-positioned steps do not size their parent.
95
+ JavaScript replaces this with the active step's measured height, but the
96
+ welcome screen must remain visible while initialization is pending. */
97
+ height: min(533px, calc(90vh - 56px));
94
98
  transition: height 0.45s cubic-bezier(0.4, 0, 0.2, 1);
95
99
  }
96
100
 
@@ -443,6 +447,141 @@
443
447
  white-space: nowrap;
444
448
  }
445
449
 
450
+ /* ── MCP Toggle List (Step 5) — 2×2 grid ── */
451
+ .mcp-toggle-list {
452
+ display: grid;
453
+ grid-template-columns: 1fr 1fr;
454
+ gap: 8px;
455
+ margin-bottom: 14px;
456
+ }
457
+ .mcp-toggle-row {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 12px;
461
+ padding: 10px 14px;
462
+ border: 1px solid var(--b-light);
463
+ border-radius: var(--r-card);
464
+ background: var(--s-subtle);
465
+ transition: border-color 0.25s ease, background 0.25s ease;
466
+ min-width: 0; /* allow grid cell to shrink below intrinsic width */
467
+ }
468
+ .mcp-toggle-row.connected {
469
+ border-color: var(--accent-border);
470
+ background: var(--accent-bg);
471
+ }
472
+ .mcp-toggle-row .mtr-body { flex: 1 1 0; min-width: 0; overflow: hidden; }
473
+ .mcp-toggle-row .mtr-name {
474
+ font-size: 13px;
475
+ font-weight: 600;
476
+ color: var(--t-bright);
477
+ margin-bottom: 2px;
478
+ }
479
+ .mcp-toggle-row .mtr-path {
480
+ font-size: 11px;
481
+ color: var(--t-muted);
482
+ font-family: var(--mono, monospace);
483
+ white-space: nowrap;
484
+ overflow: hidden;
485
+ text-overflow: ellipsis;
486
+ }
487
+ .mcp-toggle-row .mtr-toggle {
488
+ flex-shrink: 0;
489
+ width: 36px; height: 20px;
490
+ border-radius: 10px;
491
+ background: var(--s-hover);
492
+ border: 1px solid var(--b-light);
493
+ position: relative;
494
+ cursor: pointer;
495
+ transition: background 0.2s ease, border-color 0.2s ease;
496
+ padding: 0;
497
+ }
498
+ .mcp-toggle-row .mtr-toggle::after {
499
+ content: '';
500
+ position: absolute;
501
+ top: 2px; left: 2px;
502
+ width: 14px; height: 14px;
503
+ border-radius: 50%;
504
+ background: var(--t-secondary);
505
+ transition: left 0.2s ease, background 0.2s ease;
506
+ }
507
+ .mcp-toggle-row .mtr-toggle.on {
508
+ background: var(--accent-border);
509
+ border-color: var(--accent-border);
510
+ }
511
+ .mcp-toggle-row .mtr-toggle.on::after {
512
+ left: 18px;
513
+ background: var(--t-bright);
514
+ }
515
+ .mcp-toggle-row .mtr-toggle:disabled,
516
+ .mcp-toggle-row .mtr-toggle.busy {
517
+ opacity: 0.4;
518
+ cursor: wait;
519
+ }
520
+ .mcp-other-section {
521
+ border: 1px solid var(--b-light);
522
+ border-radius: var(--r-card);
523
+ background: var(--s-subtle);
524
+ overflow: hidden;
525
+ }
526
+ .mcp-other-header {
527
+ display: flex;
528
+ align-items: center;
529
+ justify-content: space-between;
530
+ padding: 10px 14px;
531
+ cursor: pointer;
532
+ font-size: 12px;
533
+ color: var(--t-secondary);
534
+ user-select: none;
535
+ transition: background 0.2s ease;
536
+ }
537
+ .mcp-other-header:hover { background: var(--s-hover); }
538
+ .mcp-other-chevron { transition: transform 0.2s ease; }
539
+ .mcp-other-section.open .mcp-other-chevron { transform: rotate(180deg); }
540
+ .mcp-other-body { padding: 0 14px 12px; }
541
+
542
+ /* ── Rules (Step 5 option, Step 6 list): one row per connected tool ── */
543
+ .rules-option {
544
+ display: flex;
545
+ align-items: center;
546
+ gap: 10px;
547
+ margin-bottom: 14px;
548
+ font-size: 12px;
549
+ color: var(--t-secondary);
550
+ cursor: pointer;
551
+ user-select: none;
552
+ }
553
+ .rules-list {
554
+ display: flex;
555
+ flex-direction: column;
556
+ gap: 8px;
557
+ margin-bottom: 12px;
558
+ }
559
+ .rules-list .mtr-state {
560
+ margin-left: 6px;
561
+ font-size: 10px;
562
+ font-weight: 500;
563
+ color: var(--t-muted);
564
+ }
565
+ .rules-list .mtr-state.ok { color: var(--green); }
566
+ .rules-actions { display: flex; gap: 6px; flex-shrink: 0; }
567
+ .rules-actions button {
568
+ padding: 5px 10px;
569
+ border-radius: 8px;
570
+ border: 1px solid var(--b-light);
571
+ background: var(--s-light);
572
+ color: var(--t-primary);
573
+ font-size: 11px;
574
+ font-family: inherit;
575
+ cursor: pointer;
576
+ white-space: nowrap;
577
+ transition: all var(--ease);
578
+ }
579
+ .rules-actions button:hover { background: var(--s-medium); color: var(--t-bright); border-color: var(--b-hover); }
580
+ .rules-actions button:disabled { opacity: 0.4; cursor: default; }
581
+ .rules-note { font-size: 11px; color: var(--t-muted); margin-bottom: 12px; line-height: 1.5; }
582
+ .rules-extra { margin-top: 8px; }
583
+ #rulesViewCode, #rulesCursorCode, #rulesCoexistCode { max-height: 160px; }
584
+
446
585
  /* ── Dependency List ── */
447
586
  .dep-list {
448
587
  list-style: none;
@@ -603,10 +742,11 @@
603
742
  color: var(--t-secondary);
604
743
  text-align: center;
605
744
  margin-top: 16px;
606
- opacity: 0;
745
+ opacity: 1;
607
746
  transition: opacity 0.6s ease;
608
747
  line-height: 1.8;
609
748
  }
749
+ .onboarding-animated .welcome-desc:not(.visible) { opacity: 0; }
610
750
  .welcome-desc.visible { opacity: 1; }
611
751
 
612
752
  /* ── Welcome Choice Cards ── */
@@ -614,11 +754,12 @@
614
754
  display: flex;
615
755
  gap: 14px;
616
756
  margin-top: 28px;
617
- opacity: 0;
757
+ opacity: 1;
618
758
  transition: opacity 0.5s ease;
619
759
  width: 100%;
620
760
  max-width: 440px;
621
761
  }
762
+ .onboarding-animated .welcome-choices:not(.visible) { opacity: 0; }
622
763
  .welcome-choices.visible { opacity: 1; }
623
764
  .welcome-choice {
624
765
  flex: 1;
@@ -906,9 +1047,16 @@
906
1047
 
907
1048
  <!-- Step 0: Welcome -->
908
1049
  <div class="step active" data-step="0" style="align-items:center;">
909
- <div id="synabun-bg"></div>
1050
+ <div id="synabun-bg" aria-hidden="true">
1051
+ <!-- Static first-paint fallback. The animation replaces this SVG. -->
1052
+ <svg viewBox="0 0 280 140" width="380" height="190" style="overflow:visible">
1053
+ <g class="syna-eye"><g class="syna-lid"><rect x="80" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
1054
+ <g class="syna-eye"><g class="syna-lid"><rect x="162" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
1055
+ <path class="syna-mouth" d="M118,116 Q140,130 162,116" fill="none" stroke="rgba(255,255,255,0.25)" stroke-width="2.5" stroke-linecap="round"/>
1056
+ </svg>
1057
+ </div>
910
1058
  <div style="display:flex;flex-direction:column;align-items:center;">
911
- <div class="typewriter-line" id="typewriter"></div>
1059
+ <div class="typewriter-line" id="typewriter">Hi! I'm SynaBun!</div>
912
1060
  <div class="welcome-desc" id="welcomeDesc">
913
1061
  Persistent vector memory for your AI coding tools.<br>
914
1062
  How would you like to get started?
@@ -1040,29 +1188,69 @@
1040
1188
  <span class="mascot-toast" id="mascotToast"></span>
1041
1189
  </div>
1042
1190
  <h2>AI Tool Integration</h2>
1043
- <p class="subtitle">Select your AI coding tool to get setup instructions.</p>
1044
- <div class="tool-grid" id="toolGrid"></div>
1045
- <div id="mcpSetupPanel" style="display:none;">
1046
- <div id="mcpSetupLabel" style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;"></div>
1047
- <div class="code-copy-wrap" id="mcpCodeWrap">
1048
- <div class="instructions-preview" id="mcpSetupCode"></div>
1049
- <span class="code-copy-label">copy</span>
1191
+ <p class="subtitle">Toggle on the AI coding tools you use. SynaBun registers itself with each one automatically.</p>
1192
+ <div class="mcp-toggle-list" id="mcpToggleList"></div>
1193
+ <label class="rules-option" for="rulesInstallOpt">
1194
+ <span class="key-backup-checkbox-wrap">
1195
+ <input type="checkbox" id="rulesInstallOpt" checked>
1196
+ <span class="key-backup-checkmark"><svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg></span>
1197
+ </span>
1198
+ <span>Install SynaBun's rules for this tool</span>
1199
+ </label>
1200
+ <div class="mcp-other-section" id="mcpOtherSection">
1201
+ <div class="mcp-other-header" id="mcpOtherHeader">
1202
+ <span>Other providers (Cursor, Windsurf, etc.)</span>
1203
+ <svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
1204
+ </div>
1205
+ <div class="mcp-other-body" id="mcpOtherBody" style="display:none;">
1206
+ <div style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Add this MCP server JSON to your tool's config file:</div>
1207
+ <div class="code-copy-wrap" id="mcpCodeWrap">
1208
+ <div class="instructions-preview" id="mcpSetupCode"></div>
1209
+ <span class="code-copy-label">copy</span>
1210
+ </div>
1211
+ <div style="margin-top:6px;font-size:11px;color:var(--t-muted);">Cursor: Settings &rarr; MCP Servers, or <code>.cursor/mcp.json</code>. Windsurf: <code>~/.codeium/windsurf/mcp_config.json</code>.</div>
1050
1212
  </div>
1051
- <div id="mcpSetupHint" style="margin-top:6px;font-size:11px;color:var(--t-muted);"></div>
1052
1213
  </div>
1053
1214
  </div>
1054
1215
 
1055
- <!-- Step 6: Ruleset -->
1216
+ <!-- Step 6: SynaBun rules -->
1056
1217
  <div class="step right" data-step="6">
1057
1218
  <div style="position:relative;display:flex;justify-content:center;align-items:center;">
1058
1219
  <div class="step-eyes"></div>
1220
+ <span class="mascot-toast" id="rulesToast"></span>
1221
+ </div>
1222
+ <h2>SynaBun Rules</h2>
1223
+ <p class="subtitle">SynaBun puts its rules where each tool loads them for every project, and keeps them up to date. There is nothing to paste.</p>
1224
+ <div class="rules-note" id="rulesNote" style="display:none;"></div>
1225
+ <div class="rules-list" id="rulesList"></div>
1226
+ <div class="code-copy-wrap" id="rulesViewWrap" style="display:none;margin-bottom:12px;">
1227
+ <div class="instructions-preview" id="rulesViewCode"></div>
1228
+ <span class="code-copy-label">copy</span>
1229
+ </div>
1230
+ <div class="mcp-other-section" id="rulesCursorSection">
1231
+ <div class="mcp-other-header" id="rulesCursorHeader">
1232
+ <span>Cursor (copy and paste)</span>
1233
+ <svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
1234
+ </div>
1235
+ <div class="mcp-other-body" id="rulesCursorBody" style="display:none;">
1236
+ <div style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Cursor keeps User Rules inside the app. Paste this into Cursor Settings &rarr; Rules:</div>
1237
+ <div class="code-copy-wrap" id="rulesCursorWrap">
1238
+ <div class="instructions-preview" id="rulesCursorCode"></div>
1239
+ <span class="code-copy-label">copy</span>
1240
+ </div>
1241
+ </div>
1059
1242
  </div>
1060
- <h2>Memory Ruleset</h2>
1061
- <p class="subtitle">Copy this into your project's <code id="rulesetFileName" style="color:var(--t-bright);">CLAUDE.md</code> so your AI tool knows how to use SynaBun.</p>
1062
- <div id="rulesetPanel">
1063
- <div class="code-copy-wrap" id="rulesetCodeWrap">
1064
- <div class="instructions-preview" id="rulesetCode" style="max-height:220px;">Loading...</div>
1065
- <span class="code-copy-label">copy</span>
1243
+ <div class="mcp-other-section rules-extra" id="rulesCoexistSection">
1244
+ <div class="mcp-other-header" id="rulesCoexistHeader">
1245
+ <span>Using another memory tool too? (optional snippet)</span>
1246
+ <svg class="mcp-other-chevron" viewBox="0 0 24 24" width="14" height="14"><polyline points="6 9 12 15 18 9" fill="none" stroke="currentColor" stroke-width="2"/></svg>
1247
+ </div>
1248
+ <div class="mcp-other-body" id="rulesCoexistBody" style="display:none;">
1249
+ <div style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Copy this, name the other tool in it, and paste it into your instructions file. SynaBun never installs it.</div>
1250
+ <div class="code-copy-wrap" id="rulesCoexistWrap">
1251
+ <div class="instructions-preview" id="rulesCoexistCode"></div>
1252
+ <span class="code-copy-label">copy</span>
1253
+ </div>
1066
1254
  </div>
1067
1255
  </div>
1068
1256
  </div>
@@ -1195,18 +1383,22 @@ const wizardState = {
1195
1383
  collectionDisplayName: 'Claude Memory',
1196
1384
  dbLocationPath: null,
1197
1385
  selectedTool: null,
1198
- projectRoot: '',
1386
+ enabledTools: [], // tool ids toggled on via Step 5 install toggles
1387
+ dataHome: '',
1388
+ packageRoot: '',
1199
1389
  buildReady: false,
1200
1390
  mcpWritten: false,
1201
1391
  projects: [],
1202
1392
  };
1203
1393
 
1394
+ // Tools with server-side MCP install/uninstall endpoints. Each row maps a
1395
+ // toggle to the POST/DELETE endpoint that writes the provider's config file.
1396
+ // `id` is also the host name of the rules API (/api/setup/rules/:host).
1204
1397
  const TOOLS = [
1205
- { id: 'claude', name: 'Claude Code', instrFile: 'CLAUDE.md' },
1206
- { id: 'cursor', name: 'Cursor', instrFile: '.cursorrules' },
1207
- { id: 'windsurf', name: 'Windsurf', instrFile: '.windsurfrules' },
1208
- { id: 'codex', name: 'Codex', instrFile: 'AGENTS.md' },
1209
- { id: 'other', name: 'Other', instrFile: 'AGENTS.md' },
1398
+ { id: 'claude', name: 'Claude Code', api: '/api/claude-code/mcp', configPath: '~/.claude.json' },
1399
+ { id: 'gemini', name: 'Gemini CLI', api: '/api/setup/gemini/mcp', configPath: '~/.gemini/settings.json' },
1400
+ { id: 'codex', name: 'Codex CLI', api: '/api/setup/codex/mcp', configPath: '~/.codex/config.toml' },
1401
+ { id: 'opencode', name: 'OpenCode', api: '/api/opencode/mcp', configPath: '~/.config/opencode/config.json' },
1210
1402
  ];
1211
1403
 
1212
1404
  // ═══════════════════════════════════════════
@@ -1286,10 +1478,10 @@ function goToStep(n) {
1286
1478
  function updateNav() {
1287
1479
  $prevBtn.disabled = currentStep === 0;
1288
1480
 
1289
- const labels = ['', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
1481
+ const labels = ['Begin', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
1290
1482
  $nextBtn.textContent = (labels[currentStep] || 'Next') + ' \u2192';
1291
1483
 
1292
- if (currentStep === 0 || currentStep === TOTAL_STEPS - 1) {
1484
+ if (currentStep === TOTAL_STEPS - 1) {
1293
1485
  $nextBtn.style.display = 'none';
1294
1486
  } else {
1295
1487
  $nextBtn.style.display = '';
@@ -1329,7 +1521,13 @@ function validateStep(n) {
1329
1521
  return true;
1330
1522
  }
1331
1523
  case 5: {
1332
- if (!wizardState.selectedTool) return false;
1524
+ // Allow advancing once any tool is toggled on OR the user copied the generic JSON.
1525
+ if (wizardState.enabledTools.length === 0 && !wizardState.mcpWritten) return false;
1526
+ // Default the restart hint (Step 7) to the first toggled-on tool; fall
1527
+ // back to Claude if only the generic JSON was copied.
1528
+ if (!wizardState.selectedTool) {
1529
+ wizardState.selectedTool = wizardState.enabledTools[0] || 'claude';
1530
+ }
1333
1531
  return true;
1334
1532
  }
1335
1533
  default:
@@ -1357,6 +1555,7 @@ async function onStepEnter(n) {
1357
1555
  }
1358
1556
  }
1359
1557
  if (n === 3) await onBuildStep();
1558
+ if (n === 5) await onToolIntegrationStep();
1360
1559
  if (n === 6) await onRulesetStep();
1361
1560
  if (n === 7) await onCompleteStep();
1362
1561
  // Re-measure after async content loads — but only if user is still on this step
@@ -1626,13 +1825,13 @@ function renderHappyBun() {}
1626
1825
  resizeViewport(0);
1627
1826
 
1628
1827
  try {
1629
- const buffer = await file.arrayBuffer();
1630
-
1828
+ // Post the File itself so the browser streams it from disk instead of
1829
+ // holding a multi-GB backup in memory.
1631
1830
  $statusText.textContent = 'Validating backup...';
1632
1831
  const previewRes = await fetch('/api/system/restore/preview', {
1633
1832
  method: 'POST',
1634
1833
  headers: { 'Content-Type': 'application/zip' },
1635
- body: buffer,
1834
+ body: file,
1636
1835
  });
1637
1836
  if (!previewRes.ok) {
1638
1837
  let errMsg = 'Invalid backup file';
@@ -1643,7 +1842,7 @@ function renderHappyBun() {}
1643
1842
 
1644
1843
  // Show confirmation
1645
1844
  $statusEl.style.display = 'none';
1646
- showRestoreConfirm(m, buffer);
1845
+ showRestoreConfirm(m, file);
1647
1846
 
1648
1847
  } catch (err) {
1649
1848
  $statusDot.className = 'wiz-status-dot red';
@@ -1652,7 +1851,7 @@ function renderHappyBun() {}
1652
1851
  }
1653
1852
  }
1654
1853
 
1655
- function showRestoreConfirm(m, buffer) {
1854
+ function showRestoreConfirm(m, file) {
1656
1855
  const fileCount = (m.files || []).length;
1657
1856
  const hasDb = !!(m.database);
1658
1857
 
@@ -1706,7 +1905,7 @@ function renderHappyBun() {}
1706
1905
  const restoreRes = await fetch('/api/system/restore', {
1707
1906
  method: 'POST',
1708
1907
  headers: { 'Content-Type': 'application/zip' },
1709
- body: buffer,
1908
+ body: file,
1710
1909
  });
1711
1910
  if (!restoreRes.ok) {
1712
1911
  let errMsg = 'Restore failed';
@@ -1801,31 +2000,71 @@ function renderHappyBun() {}
1801
2000
 
1802
2001
  async function onDepsStep() {
1803
2002
  const $list = document.getElementById('depList');
1804
- $list.innerHTML = '';
2003
+
2004
+ function createDepItem(name) {
2005
+ const li = document.createElement('li');
2006
+ li.className = 'dep-item checking visible';
2007
+
2008
+ const icon = document.createElement('div');
2009
+ icon.className = 'dep-icon';
2010
+
2011
+ const info = document.createElement('div');
2012
+ info.className = 'dep-info';
2013
+
2014
+ const title = document.createElement('div');
2015
+ title.className = 'dep-name';
2016
+ title.textContent = name;
2017
+
2018
+ const detail = document.createElement('div');
2019
+ detail.className = 'dep-detail';
2020
+ detail.textContent = 'Checking\u2026';
2021
+
2022
+ info.append(title, detail);
2023
+ li.append(icon, info);
2024
+ return li;
2025
+ }
2026
+
2027
+ function showCheckError(message) {
2028
+ const li = createDepItem('Environment check unavailable');
2029
+ li.classList.remove('checking');
2030
+ li.classList.add('fail');
2031
+ li.querySelector('.dep-icon').textContent = '!';
2032
+ li.querySelector('.dep-detail').textContent = message;
2033
+ $list.replaceChildren(li);
2034
+ resizeViewport(1);
2035
+ }
2036
+
2037
+ // Never leave this step blank while the server is still warming up.
2038
+ $list.replaceChildren(createDepItem('Node.js'), createDepItem('npm'));
2039
+ resizeViewport(1);
1805
2040
 
1806
2041
  let deps;
2042
+ const controller = new AbortController();
2043
+ const timeout = setTimeout(() => controller.abort(), 8000);
1807
2044
  try {
1808
- const res = await fetch('/api/setup/check-deps');
2045
+ const res = await fetch('/api/setup/check-deps', { signal: controller.signal });
2046
+ if (!res.ok) throw new Error(`Server returned ${res.status}`);
1809
2047
  const data = await res.json();
2048
+ if (!Array.isArray(data.deps) || data.deps.length === 0) {
2049
+ throw new Error('Server returned no dependency results');
2050
+ }
1810
2051
  deps = data.deps;
1811
- } catch {
1812
- $list.innerHTML = '<li style="color:var(--t-muted);font-size:13px;">Could not reach server.</li>';
2052
+ } catch (err) {
2053
+ showCheckError(err.name === 'AbortError'
2054
+ ? 'The server took too long to respond. Go back and try again.'
2055
+ : 'Could not complete the check. Make sure the SynaBun server is running.');
1813
2056
  return;
2057
+ } finally {
2058
+ clearTimeout(timeout);
1814
2059
  }
1815
2060
 
1816
- // Build all items hidden first
2061
+ // Replace the placeholders with the actual results. Keep them visible so a
2062
+ // slow response can never produce another empty panel.
1817
2063
  const items = deps.map(dep => {
1818
- const li = document.createElement('li');
1819
- li.className = 'dep-item checking';
1820
- li.innerHTML = `
1821
- <div class="dep-icon"></div>
1822
- <div class="dep-info">
1823
- <div class="dep-name">${dep.name}</div>
1824
- <div class="dep-detail">Checking\u2026</div>
1825
- </div>`;
1826
- $list.appendChild(li);
2064
+ const li = createDepItem(dep.name || 'Dependency');
1827
2065
  return { li, dep };
1828
2066
  });
2067
+ $list.replaceChildren(...items.map(({ li }) => li));
1829
2068
 
1830
2069
  // Pre-size viewport to account for all items before animation
1831
2070
  resizeViewport(1);
@@ -1834,12 +2073,8 @@ async function onDepsStep() {
1834
2073
  for (let i = 0; i < items.length; i++) {
1835
2074
  const { li, dep } = items[i];
1836
2075
 
1837
- // Reveal with stagger
1838
- await wait(250);
1839
- li.classList.add('visible');
1840
-
1841
2076
  // Simulate a brief check delay, then resolve
1842
- await wait(400 + Math.random() * 200);
2077
+ await wait(180 + Math.random() * 100);
1843
2078
 
1844
2079
  li.classList.remove('checking');
1845
2080
  const icon = li.querySelector('.dep-icon');
@@ -2046,15 +2281,58 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2046
2281
  wizardState.projects.forEach((p, i) => {
2047
2282
  const card = document.createElement('div');
2048
2283
  card.className = 'onboard-project-card';
2049
- card.style.cssText = 'display:flex;align-items:center;gap:10px;padding:10px 12px;background:rgba(109,213,140,0.06);border:1px solid rgba(109,213,140,0.2);border-radius:8px;font-size:12px';
2284
+ card.style.cssText = 'display:flex;flex-direction:column;gap:8px;padding:10px 12px;background:rgba(109,213,140,0.06);border:1px solid rgba(109,213,140,0.2);border-radius:8px;font-size:12px';
2285
+ const safePath = p.path.replace(/\\/g, '/');
2050
2286
  card.innerHTML = `
2051
- <svg viewBox="0 0 24 24" style="width:18px;height:18px;fill:none;stroke:rgba(109,213,140,0.8);stroke-width:2;flex-shrink:0"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
2052
- <div style="flex:1;min-width:0">
2053
- <div style="color:var(--t-bright);font-weight:500">${p.label}</div>
2054
- <div style="color:var(--t-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${p.path.replace(/\\/g, '/')}">${p.path.replace(/\\/g, '/')}</div>
2287
+ <div style="display:flex;align-items:center;gap:10px">
2288
+ <svg viewBox="0 0 24 24" style="width:18px;height:18px;fill:none;stroke:rgba(109,213,140,0.8);stroke-width:2;flex-shrink:0"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
2289
+ <div style="flex:1;min-width:0">
2290
+ <div style="color:var(--t-bright);font-weight:500">${p.label}</div>
2291
+ <div style="color:var(--t-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${safePath}">${safePath}</div>
2292
+ </div>
2293
+ <button class="onboard-project-remove" style="background:none;border:none;color:var(--t-muted);cursor:pointer;font-size:16px;padding:2px 6px;line-height:1;opacity:0.5" title="Remove">&times;</button>
2055
2294
  </div>
2056
- <button class="onboard-project-remove" style="background:none;border:none;color:var(--t-muted);cursor:pointer;font-size:16px;padding:2px 6px;line-height:1;opacity:0.5" title="Remove">&times;</button>
2057
2295
  `;
2296
+ if (p.dubiousOwnership && !p.trusted) {
2297
+ const trustRow = document.createElement('div');
2298
+ trustRow.className = 'onboard-trust-row';
2299
+ trustRow.style.cssText = 'display:flex;align-items:center;gap:8px;padding:6px 8px;background:rgba(255,183,77,0.08);border:1px solid rgba(255,183,77,0.25);border-radius:6px;font-size:11px;color:rgba(255,204,128,0.9)';
2300
+ trustRow.innerHTML = `
2301
+ <span>&#9888; Git ownership mismatch &mdash; workspace needs to be trusted</span>
2302
+ <button class="onboard-trust-btn" style="margin-left:auto;background:rgba(255,183,77,0.2);border:1px solid rgba(255,183,77,0.35);color:#ffe0b2;padding:4px 10px;border-radius:5px;font-size:11px;cursor:pointer">Trust workspace</button>
2303
+ `;
2304
+ const $btn = trustRow.querySelector('.onboard-trust-btn');
2305
+ $btn.addEventListener('click', async () => {
2306
+ $btn.disabled = true;
2307
+ $btn.textContent = 'Trusting...';
2308
+ try {
2309
+ const r = await fetch('/api/terminal/trust-workspace', {
2310
+ method: 'POST',
2311
+ headers: { 'Content-Type': 'application/json' },
2312
+ body: JSON.stringify({ path: p.trustPath || safePath }),
2313
+ });
2314
+ const d = await r.json();
2315
+ if (d.ok) {
2316
+ p.trusted = true;
2317
+ renderProjectList();
2318
+ } else {
2319
+ $btn.disabled = false;
2320
+ $btn.textContent = 'Trust workspace';
2321
+ $error.textContent = d.error || 'Trust failed';
2322
+ }
2323
+ } catch {
2324
+ $btn.disabled = false;
2325
+ $btn.textContent = 'Trust workspace';
2326
+ $error.textContent = 'Trust failed';
2327
+ }
2328
+ });
2329
+ card.appendChild(trustRow);
2330
+ } else if (p.trusted) {
2331
+ const okRow = document.createElement('div');
2332
+ okRow.style.cssText = 'font-size:11px;color:rgba(109,213,140,0.8)';
2333
+ okRow.textContent = '✓ Workspace trusted';
2334
+ card.appendChild(okRow);
2335
+ }
2058
2336
  card.querySelector('.onboard-project-remove').addEventListener('click', () => {
2059
2337
  wizardState.projects.splice(i, 1);
2060
2338
  renderProjectList();
@@ -2104,15 +2382,16 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2104
2382
 
2105
2383
  // Register via API
2106
2384
  $addBtn.innerHTML = '<div class="spinner" style="width:14px;height:14px"></div> Registering...';
2385
+ let integData = null;
2107
2386
  try {
2108
2387
  const res = await fetch('/api/claude-code/integrations', {
2109
2388
  method: 'POST',
2110
2389
  headers: { 'Content-Type': 'application/json' },
2111
2390
  body: JSON.stringify({ target: 'project', projectPath: folderPath, label }),
2112
2391
  });
2113
- const data = await res.json();
2114
- if (!data.ok) {
2115
- $error.textContent = data.error || 'Failed to register project.';
2392
+ integData = await res.json();
2393
+ if (!integData.ok) {
2394
+ $error.textContent = integData.error || 'Failed to register project.';
2116
2395
  $addBtn.disabled = false;
2117
2396
  $addBtn.innerHTML = origHTML;
2118
2397
  return;
@@ -2124,7 +2403,12 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2124
2403
  return;
2125
2404
  }
2126
2405
 
2127
- wizardState.projects.push({ path: folderPath, label });
2406
+ const projectEntry = { path: folderPath, label };
2407
+ if (integData && integData.dubiousOwnership && integData.trustPath) {
2408
+ projectEntry.dubiousOwnership = true;
2409
+ projectEntry.trustPath = integData.trustPath;
2410
+ }
2411
+ wizardState.projects.push(projectEntry);
2128
2412
  $addBtn.disabled = false;
2129
2413
  $addBtn.innerHTML = origHTML;
2130
2414
  renderProjectList();
@@ -2132,71 +2416,145 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2132
2416
  }
2133
2417
 
2134
2418
  // ═══════════════════════════════════════════
2135
- // STEP 5: Tool Selection
2419
+ // STEP 5: Tool Integration (install toggles + generic JSON fallback)
2136
2420
  // ═══════════════════════════════════════════
2137
2421
 
2138
- const $toolGrid = document.getElementById('toolGrid');
2422
+ const $toggleList = document.getElementById('mcpToggleList');
2423
+
2424
+ // Render one toggle row per installable tool. Statuses populate on enter.
2139
2425
  TOOLS.forEach(t => {
2140
- const card = document.createElement('div');
2141
- card.className = 'tool-card';
2142
- card.dataset.id = t.id;
2143
- card.innerHTML = `<div class="tname">${t.name}</div>`;
2144
- card.addEventListener('click', () => selectTool(t.id));
2145
- $toolGrid.appendChild(card);
2426
+ const row = document.createElement('div');
2427
+ row.className = 'mcp-toggle-row';
2428
+ row.dataset.id = t.id;
2429
+ row.innerHTML = `
2430
+ <div class="mtr-body">
2431
+ <div class="mtr-name">${t.name}</div>
2432
+ <div class="mtr-path" data-role="path">${t.configPath}</div>
2433
+ <div class="mtr-path" data-role="rules" style="display:none"></div>
2434
+ </div>
2435
+ <button class="mtr-toggle" data-role="toggle" aria-label="Toggle ${t.name}"></button>
2436
+ `;
2437
+ row.querySelector('[data-role="toggle"]').addEventListener('click', () => toggleTool(t.id));
2438
+ $toggleList.appendChild(row);
2146
2439
  });
2147
2440
 
2148
- function getMcpSetup(id) {
2149
- const root = (wizardState.projectRoot || '').replace(/\\/g, '/');
2150
- const mcpPath = root + '/mcp-server/run.mjs';
2151
- const envPath = root + '/.env';
2152
-
2153
- if (id === 'claude') {
2154
- return {
2155
- label: 'Run this in your terminal to register SynaBun globally:',
2156
- code: `claude mcp add SynaBun -s user -e DOTENV_PATH="${envPath}" -- node "${mcpPath}"`,
2157
- hint: 'Registers SynaBun globally. Restart Claude Code after running.',
2158
- };
2159
- }
2160
- if (id === 'cursor') {
2161
- const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
2162
- return {
2163
- label: 'Add to Cursor Settings > MCP Servers, or paste into .cursor/mcp.json:',
2164
- code: json,
2165
- hint: 'Settings > MCP > Add Server, or save as .cursor/mcp.json',
2166
- };
2167
- }
2168
- if (id === 'windsurf') {
2169
- const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
2170
- return {
2171
- label: 'Add to ~/.codeium/windsurf/mcp_config.json:',
2172
- code: json,
2173
- hint: 'Cascade sidebar > hammer icon > Configure',
2174
- };
2175
- }
2176
- // codex, other
2177
- const json = JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env: { DOTENV_PATH: envPath } } } }, null, 2);
2178
- return {
2179
- label: 'Add to your project\'s .mcp.json:',
2180
- code: json,
2181
- hint: 'Save as .mcp.json in your project root.',
2182
- };
2441
+ async function onToolIntegrationStep() {
2442
+ // Fetch each provider's install state so toggles reflect reality.
2443
+ await Promise.all(TOOLS.map(async (t) => {
2444
+ try {
2445
+ const res = await fetch(t.api);
2446
+ const data = await res.json();
2447
+ const connected = !!data.connected;
2448
+ updateToggleRow(t.id, { connected });
2449
+ if (connected && !wizardState.enabledTools.includes(t.id)) {
2450
+ wizardState.enabledTools.push(t.id);
2451
+ }
2452
+ } catch { updateToggleRow(t.id, { connected: false }); }
2453
+ }));
2183
2454
  }
2184
2455
 
2185
- function selectTool(id) {
2186
- wizardState.selectedTool = id;
2187
- $toolGrid.querySelectorAll('.tool-card').forEach(c => {
2188
- c.classList.toggle('selected', c.dataset.id === id);
2189
- });
2190
-
2191
- const setup = getMcpSetup(id);
2192
- document.getElementById('mcpSetupLabel').textContent = setup.label;
2193
- document.getElementById('mcpSetupCode').textContent = setup.code;
2194
- document.getElementById('mcpSetupHint').textContent = setup.hint;
2195
- document.getElementById('mcpSetupPanel').style.display = '';
2456
+ function updateToggleRow(id, { connected, busy }) {
2457
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2458
+ if (!row) return;
2459
+ const toggle = row.querySelector('[data-role="toggle"]');
2460
+ const path = row.querySelector('[data-role="path"]');
2461
+ const tool = TOOLS.find(t => t.id === id);
2462
+ if (typeof connected === 'boolean') {
2463
+ row.classList.toggle('connected', connected);
2464
+ toggle.classList.toggle('on', connected);
2465
+ path.textContent = connected ? `Registered in ${tool.configPath}` : tool.configPath;
2466
+ }
2467
+ if (typeof busy === 'boolean') {
2468
+ toggle.classList.toggle('busy', busy);
2469
+ toggle.disabled = busy;
2470
+ }
2471
+ }
2196
2472
 
2473
+ // What the MCP toggle's response says about the tool's rules (its `rules`
2474
+ // object), as one line under the row: where they went, or why they did not.
2475
+ function showToggleRules(id, rules, { connected, wanted }) {
2476
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2477
+ const line = row?.querySelector('[data-role="rules"]');
2478
+ if (!line) return;
2479
+ let text = '';
2480
+ if (connected) {
2481
+ if (!rules) text = wanted ? `Rules not installed yet. ${RESTART_HINT}` : '';
2482
+ else if (rules.skipped) text = 'Rules not installed (you can install them in the next step)';
2483
+ else if (rules.ok === false) text = `Rules not installed: ${rules.error || rules.state || 'refused'}`;
2484
+ else if (rules.path) text = `Rules installed: ${rules.path}`;
2485
+ } else if (rules && rules.ok !== false && rules.kept && rules.kept.length) {
2486
+ // Disconnected. A copy the user edited is theirs: SynaBun left it where it is (and for OpenCode, so is a copy
2487
+ // their own line in config.json points at).
2488
+ text = `Your ${rules.kept[0].reason === 'listed-in-config' ? '' : 'edited '}rules were left in place: ${rules.kept[0].path}`;
2489
+ } else if (rules && rules.ok === false && rules.error) {
2490
+ // Disconnected, but rules could not be taken out (damaged markers, a symlink): say which and why.
2491
+ text = `Rules not removed: ${rules.error}`;
2492
+ }
2493
+ line.textContent = text;
2494
+ line.title = text;
2495
+ line.style.display = text ? '' : 'none';
2197
2496
  requestAnimationFrame(() => resizeViewport(currentStep));
2198
2497
  }
2199
2498
 
2499
+ async function toggleTool(id) {
2500
+ const tool = TOOLS.find(t => t.id === id);
2501
+ if (!tool) return;
2502
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2503
+ const toggle = row.querySelector('[data-role="toggle"]');
2504
+ const wasOn = toggle.classList.contains('on');
2505
+ // Connecting a tool installs its rules too, unless the box is unchecked.
2506
+ const wantRules = document.getElementById('rulesInstallOpt')?.checked !== false;
2507
+ updateToggleRow(id, { busy: true });
2508
+ try {
2509
+ const res = await fetch(tool.api, wasOn ? { method: 'DELETE' } : {
2510
+ method: 'POST',
2511
+ headers: { 'Content-Type': 'application/json' },
2512
+ body: JSON.stringify(wantRules ? {} : { rules: false }),
2513
+ });
2514
+ const data = await res.json().catch(() => ({}));
2515
+ if (!res.ok || data.ok === false) {
2516
+ showMascotToast(data.error || `${tool.name} ${wasOn ? 'uninstall' : 'install'} failed`);
2517
+ updateToggleRow(id, { busy: false });
2518
+ return;
2519
+ }
2520
+ const nowOn = !wasOn;
2521
+ updateToggleRow(id, { connected: nowOn, busy: false });
2522
+ showToggleRules(id, data.rules, { connected: nowOn, wanted: wantRules });
2523
+ if (nowOn) {
2524
+ if (!wizardState.enabledTools.includes(id)) wizardState.enabledTools.push(id);
2525
+ wizardState.mcpWritten = true;
2526
+ showMascotToast(`${tool.name} connected`);
2527
+ } else {
2528
+ wizardState.enabledTools = wizardState.enabledTools.filter(x => x !== id);
2529
+ showMascotToast(`${tool.name} disconnected`);
2530
+ }
2531
+ } catch (err) {
2532
+ showMascotToast(`Failed: ${err.message}`);
2533
+ updateToggleRow(id, { busy: false });
2534
+ }
2535
+ }
2536
+
2537
+ // Generic MCP JSON for tools without a server integration (Cursor, Windsurf, other).
2538
+ function getGenericMcpJson() {
2539
+ const dataHome = (wizardState.dataHome || '').replace(/\\/g, '/');
2540
+ const pkgRoot = (wizardState.packageRoot || dataHome).replace(/\\/g, '/');
2541
+ const mcpPath = pkgRoot + '/mcp-server/run.mjs';
2542
+ const envPath = dataHome + '/.env';
2543
+ const env = { DOTENV_PATH: envPath, SYNABUN_DATA_HOME: dataHome, MEMORY_DATA_DIR: dataHome + '/mcp-data' };
2544
+ return JSON.stringify({ mcpServers: { SynaBun: { command: 'node', args: [mcpPath], env } } }, null, 2);
2545
+ }
2546
+
2547
+ // "Other providers" collapsible — shows the generic MCP JSON for paste-based setups.
2548
+ const $otherHeader = document.getElementById('mcpOtherHeader');
2549
+ const $otherBody = document.getElementById('mcpOtherBody');
2550
+ const $otherSection = document.getElementById('mcpOtherSection');
2551
+ $otherHeader.addEventListener('click', () => {
2552
+ const isOpen = $otherSection.classList.toggle('open');
2553
+ $otherBody.style.display = isOpen ? '' : 'none';
2554
+ if (isOpen) document.getElementById('mcpSetupCode').textContent = getGenericMcpJson();
2555
+ requestAnimationFrame(() => resizeViewport(currentStep));
2556
+ });
2557
+
2200
2558
  function showMascotToast(msg, duration = 2000) {
2201
2559
  const toast = document.getElementById('mascotToast');
2202
2560
  if (!toast) return;
@@ -2207,6 +2565,7 @@ function showMascotToast(msg, duration = 2000) {
2207
2565
 
2208
2566
  document.getElementById('mcpCodeWrap').addEventListener('click', () => {
2209
2567
  const code = document.getElementById('mcpSetupCode').textContent;
2568
+ if (!code) return;
2210
2569
  navigator.clipboard.writeText(code);
2211
2570
  wizardState.mcpWritten = true;
2212
2571
  const label = document.querySelector('#mcpCodeWrap .code-copy-label');
@@ -2217,48 +2576,210 @@ document.getElementById('mcpCodeWrap').addEventListener('click', () => {
2217
2576
  });
2218
2577
 
2219
2578
  // ═══════════════════════════════════════════
2220
- // STEP 6: Ruleset
2579
+ // STEP 6: SynaBun rules
2221
2580
  // ═══════════════════════════════════════════
2581
+ // One row per connected tool with where its rules are and what state they are
2582
+ // in (GET /api/setup/rules), plus copy boxes for Cursor and the coexistence
2583
+ // snippet. Nothing here has to be clicked to continue.
2584
+
2585
+ const RESTART_HINT = 'Restart SynaBun to finish this update.';
2586
+ const RULES_STATE_TEXT = {
2587
+ installed: 'Installed', newer: 'Installed by a newer SynaBun', outdated: 'Update available', modified: 'Edited', conflict: 'Conflict',
2588
+ error: 'Error', shadowed: 'Shadowed', 'not-installed': 'Not installed',
2589
+ };
2590
+ const RULES_PRIMARY = { 'not-installed': 'Install', outdated: 'Update', modified: 'Replace' };
2591
+ let rulesStatus = null; // null: the route is missing or failed
2592
+ const rulesTextCache = {};
2222
2593
 
2223
- async function onRulesetStep() {
2224
- const tool = TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0];
2225
- document.getElementById('rulesetFileName').textContent = tool.instrFile;
2594
+ async function loadRulesStatus() {
2595
+ try {
2596
+ const res = await fetch('/api/setup/rules');
2597
+ if (!res.ok) return null;
2598
+ const data = await res.json();
2599
+ return data && data.ok ? data : null;
2600
+ } catch { return null; }
2601
+ }
2226
2602
 
2227
- // Map tool to API format
2228
- const formatMap = { claude: 'claude', cursor: 'cursor', windsurf: 'generic', codex: 'codex', other: 'generic' };
2229
- const format = formatMap[tool.id] || 'generic';
2603
+ // The rendered text for a host, from the rules route or the older read-only endpoint.
2604
+ async function loadRulesText(host) {
2605
+ if (rulesTextCache[host]) return rulesTextCache[host];
2606
+ let text = '';
2607
+ try {
2608
+ const res = await fetch(`/api/setup/rules/${host}/text`);
2609
+ if (res.ok) text = (await res.json()).text || '';
2610
+ } catch { /* try the older endpoint */ }
2611
+ if (!text) {
2612
+ const format = host === 'opencode' ? 'generic' : host;
2613
+ const res = await fetch(`/api/claude-code/ruleset?format=${format}`);
2614
+ const data = res.ok ? await res.json() : {};
2615
+ text = data.ruleset || '';
2616
+ }
2617
+ if (!text) throw new Error('Rules text not available');
2618
+ rulesTextCache[host] = text;
2619
+ return text;
2620
+ }
2230
2621
 
2231
- const $code = document.getElementById('rulesetCode');
2232
- if ($code.dataset.loadedFormat === format) return; // already loaded
2622
+ function showRulesToast(msg, duration = 2600) {
2623
+ const toast = document.getElementById('rulesToast');
2624
+ if (!toast) return;
2625
+ toast.textContent = msg;
2626
+ toast.classList.add('show');
2627
+ clearTimeout(toast._timer);
2628
+ toast._timer = setTimeout(() => toast.classList.remove('show'), duration);
2629
+ }
2630
+
2631
+ function enabledRuleTools() {
2632
+ return wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean);
2633
+ }
2634
+
2635
+ function renderRulesList() {
2636
+ const $list = document.getElementById('rulesList');
2637
+ const $note = document.getElementById('rulesNote');
2638
+ const tools = enabledRuleTools();
2639
+ $list.innerHTML = '';
2233
2640
 
2234
- $code.textContent = 'Loading...';
2641
+ const notes = [];
2642
+ if (!rulesStatus) notes.push(`${RESTART_HINT} Until then the rules can be viewed and copied here.`);
2643
+ if (!tools.length) notes.push('No tool was connected in the previous step. Connect one there, or copy the rules below.');
2644
+ $note.textContent = notes.join(' ');
2645
+ $note.style.display = notes.length ? '' : 'none';
2646
+
2647
+ for (const tool of tools) {
2648
+ const info = rulesStatus && rulesStatus.hosts ? rulesStatus.hosts[tool.id] : null;
2649
+ const state = info ? info.state : '';
2650
+ const good = state === 'installed' || state === 'newer';
2651
+ // A file without SynaBun's markers is the user's own: the server refuses to replace it, so no button.
2652
+ const primary = info && info.detected !== false && info.replaceable !== false ? (RULES_PRIMARY[state] || '') : '';
2653
+ const detail = !info ? RESTART_HINT
2654
+ : info.detected === false ? `${tool.name} was not found on this machine`
2655
+ : ((['conflict', 'error', 'shadowed'].includes(state) || info.replaceable === false) && (info.error || info.detail)) || info.path || '';
2656
+
2657
+ const row = document.createElement('div');
2658
+ row.className = 'mcp-toggle-row' + (good ? ' connected' : '');
2659
+ row.dataset.host = tool.id;
2660
+ row.innerHTML = `
2661
+ <div class="mtr-body">
2662
+ <div class="mtr-name">${tool.name}<span class="mtr-state${good ? ' ok' : ''}" data-role="state"></span></div>
2663
+ <div class="mtr-path" data-role="path"></div>
2664
+ </div>
2665
+ <div class="rules-actions">
2666
+ ${primary ? `<button type="button" data-role="primary">${primary}</button>` : ''}
2667
+ <button type="button" data-role="view">View</button>
2668
+ <button type="button" data-role="copy">Copy</button>
2669
+ </div>
2670
+ `;
2671
+ row.querySelector('[data-role="state"]').textContent = info ? (RULES_STATE_TEXT[state] || state) : 'Unavailable';
2672
+ const $path = row.querySelector('[data-role="path"]');
2673
+ $path.textContent = detail;
2674
+ $path.title = detail;
2675
+ row.querySelector('[data-role="primary"]')?.addEventListener('click', (e) => installToolRules(tool, state, e.currentTarget));
2676
+ row.querySelector('[data-role="view"]').addEventListener('click', () => viewRules(tool.id, tool.name));
2677
+ row.querySelector('[data-role="copy"]').addEventListener('click', () => copyRules(tool.id, tool.name));
2678
+ $list.appendChild(row);
2679
+ }
2680
+ requestAnimationFrame(() => resizeViewport(currentStep));
2681
+ }
2682
+
2683
+ async function installToolRules(tool, state, btn) {
2684
+ const force = state === 'modified';
2685
+ if (force && !confirm(`Replace your edited ${tool.name} rules with SynaBun's current version?\n\nYour edited copy is backed up first.`)) return;
2686
+ btn.disabled = true;
2235
2687
  try {
2236
- const res = await fetch(`/api/claude-code/ruleset?format=${format}`);
2237
- const data = await res.json();
2238
- if (data.ok && data.ruleset) {
2239
- $code.textContent = data.ruleset;
2240
- $code.dataset.loadedFormat = format;
2241
- wizardState.rulesetCopied = false;
2242
- } else {
2243
- $code.textContent = 'Could not load ruleset.';
2244
- }
2688
+ const res = await fetch(`/api/setup/rules/${tool.id}`, {
2689
+ method: 'POST',
2690
+ headers: { 'Content-Type': 'application/json' },
2691
+ body: JSON.stringify({ force }),
2692
+ });
2693
+ const data = await res.json().catch(() => ({}));
2694
+ if (!res.ok || data.ok === false) showRulesToast(data.error || (res.status === 404 ? RESTART_HINT : `${tool.name} rules were not installed`), 5000);
2695
+ else showRulesToast(`${tool.name} rules installed`);
2696
+ } catch (err) {
2697
+ showRulesToast(`Failed: ${err.message}`, 5000);
2698
+ }
2699
+ rulesStatus = await loadRulesStatus();
2700
+ renderRulesList();
2701
+ }
2702
+
2703
+ async function viewRules(host, name) {
2704
+ const $wrap = document.getElementById('rulesViewWrap');
2705
+ const $code = document.getElementById('rulesViewCode');
2706
+ if ($wrap.style.display !== 'none' && $wrap.dataset.host === host) {
2707
+ $wrap.style.display = 'none';
2708
+ } else {
2709
+ try { $code.textContent = await loadRulesText(host); }
2710
+ catch { $code.textContent = `The ${name} rules could not be loaded. ${RESTART_HINT}`; }
2711
+ $wrap.dataset.host = host;
2712
+ $wrap.style.display = '';
2713
+ }
2714
+ requestAnimationFrame(() => resizeViewport(currentStep));
2715
+ }
2716
+
2717
+ async function copyRules(host, name) {
2718
+ let text;
2719
+ try { text = await loadRulesText(host); }
2720
+ catch { showRulesToast(`Could not load the ${name} rules. ${RESTART_HINT}`, 5000); return; }
2721
+ try {
2722
+ await navigator.clipboard.writeText(text);
2723
+ showRulesToast(`${name} rules copied`);
2245
2724
  } catch {
2246
- $code.textContent = 'Failed to load ruleset.';
2725
+ // A refused clipboard is the browser's doing; restarting SynaBun would not help.
2726
+ showRulesToast('Could not copy: the browser refused access to the clipboard.', 5000);
2247
2727
  }
2248
- if (currentStep === 6) resizeViewport(6);
2249
2728
  }
2250
2729
 
2251
- document.getElementById('rulesetCodeWrap').addEventListener('click', () => {
2252
- const code = document.getElementById('rulesetCode').textContent;
2253
- if (code === 'Loading...' || code.startsWith('Could not') || code.startsWith('Failed')) return;
2254
- navigator.clipboard.writeText(code);
2255
- wizardState.rulesetCopied = true;
2256
- const label = document.querySelector('#rulesetCodeWrap .code-copy-label');
2257
- label.textContent = 'copied!';
2258
- label.style.opacity = '1';
2259
- setTimeout(() => { label.textContent = 'copy'; label.style.opacity = ''; }, 2000);
2730
+ // A click-to-copy code box (the pattern of the MCP JSON box in Step 5). The
2731
+ // label says "copied!" only once the clipboard took the text; a browser that
2732
+ // refuses (no permission, no focus, no secure context) gets "copy failed".
2733
+ function wireRulesCopyBox(wrapId, codeId) {
2734
+ document.getElementById(wrapId).addEventListener('click', async () => {
2735
+ const $code = document.getElementById(codeId);
2736
+ if (!$code.dataset.loaded) return;
2737
+ const label = document.querySelector(`#${wrapId} .code-copy-label`);
2738
+ let copied = false;
2739
+ try {
2740
+ await navigator.clipboard.writeText($code.textContent);
2741
+ copied = true;
2742
+ } catch { /* reported on the label below */ }
2743
+ label.textContent = copied ? 'copied!' : 'copy failed';
2744
+ label.style.opacity = '1';
2745
+ clearTimeout(label._timer);
2746
+ label._timer = setTimeout(() => { label.textContent = 'copy'; label.style.opacity = ''; }, copied ? 2000 : 4000);
2747
+ });
2748
+ }
2749
+
2750
+ // A collapsible copy-only section: loads its text the first time it opens.
2751
+ function wireRulesExtra(sectionId, headerId, bodyId, wrapId, codeId, host, name) {
2752
+ const $section = document.getElementById(sectionId);
2753
+ const $body = document.getElementById(bodyId);
2754
+ const $code = document.getElementById(codeId);
2755
+ document.getElementById(headerId).addEventListener('click', async () => {
2756
+ const isOpen = $section.classList.toggle('open');
2757
+ $body.style.display = isOpen ? '' : 'none';
2758
+ if (isOpen && !$code.dataset.loaded) {
2759
+ $code.textContent = 'Loading...';
2760
+ try { $code.textContent = await loadRulesText(host); $code.dataset.loaded = '1'; }
2761
+ catch { $code.textContent = `The ${name} could not be loaded. ${RESTART_HINT}`; }
2762
+ }
2763
+ requestAnimationFrame(() => resizeViewport(currentStep));
2764
+ });
2765
+ wireRulesCopyBox(wrapId, codeId);
2766
+ }
2767
+
2768
+ wireRulesExtra('rulesCursorSection', 'rulesCursorHeader', 'rulesCursorBody', 'rulesCursorWrap', 'rulesCursorCode', 'cursor', 'Cursor rules');
2769
+ wireRulesExtra('rulesCoexistSection', 'rulesCoexistHeader', 'rulesCoexistBody', 'rulesCoexistWrap', 'rulesCoexistCode', 'coexistence', 'coexistence snippet');
2770
+
2771
+ document.getElementById('rulesViewWrap').addEventListener('click', () => {
2772
+ const $wrap = document.getElementById('rulesViewWrap');
2773
+ const tool = TOOLS.find(t => t.id === $wrap.dataset.host);
2774
+ if (tool) copyRules(tool.id, tool.name);
2260
2775
  });
2261
2776
 
2777
+ async function onRulesetStep() {
2778
+ rulesStatus = await loadRulesStatus();
2779
+ renderRulesList();
2780
+ if (currentStep === 6) resizeViewport(6);
2781
+ }
2782
+
2262
2783
  // ═══════════════════════════════════════════
2263
2784
  // STEP 7: Complete
2264
2785
  // ═══════════════════════════════════════════
@@ -2266,11 +2787,14 @@ document.getElementById('rulesetCodeWrap').addEventListener('click', () => {
2266
2787
  async function onCompleteStep() {
2267
2788
  renderHappyBun();
2268
2789
 
2269
- const tool = TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0];
2270
- document.getElementById('restartToolName').textContent = tool.name;
2790
+ // List every tool the user toggled on; fall back to the selected tool if none.
2791
+ const enabled = wizardState.enabledTools.length
2792
+ ? wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean)
2793
+ : [TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0]];
2794
+ document.getElementById('restartToolName').textContent = enabled.map(t => t.name).join(', ');
2271
2795
 
2272
- // Auto-register hooks globally for Claude Code users
2273
- if (tool.id === 'claude') {
2796
+ // Auto-register hooks globally when Claude Code was toggled on
2797
+ if (enabled.some(t => t.id === 'claude')) {
2274
2798
  try {
2275
2799
  await fetch('/api/claude-code/integrations', {
2276
2800
  method: 'POST',
@@ -2281,12 +2805,18 @@ async function onCompleteStep() {
2281
2805
  } catch { /* non-critical — user can enable via Settings later */ }
2282
2806
  }
2283
2807
 
2808
+ // Rules count as installed when every connected tool has its copy in place.
2809
+ rulesStatus = await loadRulesStatus();
2810
+ const ruleTools = enabledRuleTools();
2811
+ const rulesInstalled = ruleTools.length > 0 && !!rulesStatus
2812
+ && ruleTools.every(t => ['installed', 'newer', 'shadowed'].includes(rulesStatus.hosts?.[t.id]?.state));
2813
+
2284
2814
  const items = [
2285
2815
  { label: 'Memory name set', done: !!wizardState.collectionName },
2286
2816
  { label: 'Dependencies installed & MCP built', done: wizardState.buildReady },
2287
2817
  { label: 'Projects registered', done: (wizardState.projects || []).length > 0 },
2288
- { label: 'MCP config copied', done: wizardState.mcpWritten },
2289
- { label: 'Ruleset copied', done: !!wizardState.rulesetCopied },
2818
+ { label: 'AI tool integration enabled', done: wizardState.enabledTools.length > 0 || wizardState.mcpWritten },
2819
+ { label: 'Rules installed', done: rulesInstalled },
2290
2820
  ];
2291
2821
 
2292
2822
  const $list = document.getElementById('checklist');
@@ -2317,11 +2847,18 @@ async function init() {
2317
2847
  window.location.href = '/';
2318
2848
  return;
2319
2849
  }
2320
- if (data.projectDir) {
2321
- wizardState.projectRoot = data.projectDir;
2850
+ if (data.dataHome) {
2851
+ wizardState.dataHome = data.dataHome;
2852
+ }
2853
+ if (data.packageRoot) {
2854
+ wizardState.packageRoot = data.packageRoot;
2322
2855
  }
2323
2856
  } catch {}
2324
2857
 
2858
+ // Enable the entrance animation only after every top-level initializer has
2859
+ // run successfully. Until this point the static welcome remains usable and
2860
+ // visible instead of collapsing to a navigation-only shell.
2861
+ document.documentElement.classList.add('onboarding-animated');
2325
2862
  updateNav();
2326
2863
  startMascot();
2327
2864
  // Resize after mascot SVG is injected so scrollHeight includes it