synabun 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/CHANGELOG.md +205 -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 +136 -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/whatsapp.md +325 -0
  20. package/hooks/claude-code/post-plan.mjs +613 -391
  21. package/hooks/claude-code/post-remember.mjs +246 -122
  22. package/hooks/claude-code/pre-compact.mjs +171 -110
  23. package/hooks/claude-code/pre-task.mjs +133 -0
  24. package/hooks/claude-code/pre-websearch.mjs +15 -4
  25. package/hooks/claude-code/prompt-origin.mjs +94 -0
  26. package/hooks/claude-code/prompt-submit.mjs +1244 -861
  27. package/hooks/claude-code/session-start.mjs +114 -156
  28. package/hooks/claude-code/shared.mjs +1228 -368
  29. package/hooks/claude-code/state.mjs +167 -0
  30. package/hooks/claude-code/stop.mjs +515 -140
  31. package/hooks/claude-code/subagent-start.mjs +154 -0
  32. package/hooks/claude-code/subagent-stop.mjs +102 -0
  33. package/hooks/claude-code/task-gate.mjs +150 -0
  34. package/launcher.mjs +40 -0
  35. package/lib/claude-hooks.js +137 -0
  36. package/lib/claude-usage-audit.js +141 -0
  37. package/lib/client-config-repair.js +145 -0
  38. package/lib/data-home-migration.js +502 -0
  39. package/lib/desktop-pwa.js +206 -0
  40. package/lib/external-tools.js +221 -0
  41. package/lib/first-launch-protection.js +245 -0
  42. package/lib/packaged-runtime.js +110 -0
  43. package/lib/paths.d.ts +21 -0
  44. package/lib/paths.js +103 -0
  45. package/lib/start-launcher.js +1309 -0
  46. package/mcp-server/dist/config.d.ts +22 -0
  47. package/mcp-server/dist/config.d.ts.map +1 -0
  48. package/mcp-server/dist/config.js +109 -0
  49. package/mcp-server/dist/config.js.map +1 -0
  50. package/mcp-server/dist/http.d.ts +30 -0
  51. package/mcp-server/dist/http.d.ts.map +1 -0
  52. package/mcp-server/dist/http.js +276 -0
  53. package/mcp-server/dist/http.js.map +1 -0
  54. package/mcp-server/dist/index.d.ts +48 -0
  55. package/mcp-server/dist/index.d.ts.map +1 -0
  56. package/mcp-server/dist/index.js +538 -0
  57. package/mcp-server/dist/index.js.map +1 -0
  58. package/mcp-server/dist/preload-http.d.ts +3 -0
  59. package/mcp-server/dist/preload-http.d.ts.map +1 -0
  60. package/mcp-server/dist/preload-http.js +28 -0
  61. package/mcp-server/dist/preload-http.js.map +1 -0
  62. package/mcp-server/dist/preload.d.ts +3 -0
  63. package/mcp-server/dist/preload.d.ts.map +1 -0
  64. package/mcp-server/dist/preload.js +32 -0
  65. package/mcp-server/dist/preload.js.map +1 -0
  66. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts +19 -0
  67. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.d.ts.map +1 -0
  68. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js +403 -0
  69. package/mcp-server/dist/scripts/migrate-qdrant-to-sqlite.js.map +1 -0
  70. package/mcp-server/dist/scripts/setup-embeddings.d.ts +3 -0
  71. package/mcp-server/dist/scripts/setup-embeddings.d.ts.map +1 -0
  72. package/mcp-server/dist/scripts/setup-embeddings.js +15 -0
  73. package/mcp-server/dist/scripts/setup-embeddings.js.map +1 -0
  74. package/mcp-server/dist/services/assistant-judgments.d.ts +79 -0
  75. package/mcp-server/dist/services/assistant-judgments.d.ts.map +1 -0
  76. package/mcp-server/dist/services/assistant-judgments.js +128 -0
  77. package/mcp-server/dist/services/assistant-judgments.js.map +1 -0
  78. package/mcp-server/dist/services/browser-assist-gate.d.ts +314 -0
  79. package/mcp-server/dist/services/browser-assist-gate.d.ts.map +1 -0
  80. package/mcp-server/dist/services/browser-assist-gate.js +344 -0
  81. package/mcp-server/dist/services/browser-assist-gate.js.map +1 -0
  82. package/mcp-server/dist/services/browser-assist.d.ts +104 -0
  83. package/mcp-server/dist/services/browser-assist.d.ts.map +1 -0
  84. package/mcp-server/dist/services/browser-assist.js +282 -0
  85. package/mcp-server/dist/services/browser-assist.js.map +1 -0
  86. package/mcp-server/dist/services/browser-bench.d.ts +772 -0
  87. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -0
  88. package/mcp-server/dist/services/browser-bench.js +424 -0
  89. package/mcp-server/dist/services/browser-bench.js.map +1 -0
  90. package/mcp-server/dist/services/browser-judgments.d.ts +196 -0
  91. package/mcp-server/dist/services/browser-judgments.d.ts.map +1 -0
  92. package/mcp-server/dist/services/browser-judgments.js +363 -0
  93. package/mcp-server/dist/services/browser-judgments.js.map +1 -0
  94. package/mcp-server/dist/services/browser-risk.d.ts +166 -0
  95. package/mcp-server/dist/services/browser-risk.d.ts.map +1 -0
  96. package/mcp-server/dist/services/browser-risk.js +458 -0
  97. package/mcp-server/dist/services/browser-risk.js.map +1 -0
  98. package/mcp-server/dist/services/categories.d.ts +61 -0
  99. package/mcp-server/dist/services/categories.d.ts.map +1 -0
  100. package/mcp-server/dist/services/categories.js +377 -0
  101. package/mcp-server/dist/services/categories.js.map +1 -0
  102. package/mcp-server/dist/services/codex-config-heal.d.ts +49 -0
  103. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -0
  104. package/mcp-server/dist/services/codex-config-heal.js +346 -0
  105. package/mcp-server/dist/services/codex-config-heal.js.map +1 -0
  106. package/mcp-server/dist/services/desktop-assist-gate.d.ts +198 -0
  107. package/mcp-server/dist/services/desktop-assist-gate.d.ts.map +1 -0
  108. package/mcp-server/dist/services/desktop-assist-gate.js +202 -0
  109. package/mcp-server/dist/services/desktop-assist-gate.js.map +1 -0
  110. package/mcp-server/dist/services/desktop-assist.d.ts +104 -0
  111. package/mcp-server/dist/services/desktop-assist.d.ts.map +1 -0
  112. package/mcp-server/dist/services/desktop-assist.js +266 -0
  113. package/mcp-server/dist/services/desktop-assist.js.map +1 -0
  114. package/mcp-server/dist/services/desktop-bench.d.ts +553 -0
  115. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -0
  116. package/mcp-server/dist/services/desktop-bench.js +311 -0
  117. package/mcp-server/dist/services/desktop-bench.js.map +1 -0
  118. package/mcp-server/dist/services/desktop-client.d.ts +23 -0
  119. package/mcp-server/dist/services/desktop-client.d.ts.map +1 -0
  120. package/mcp-server/dist/services/desktop-client.js +79 -0
  121. package/mcp-server/dist/services/desktop-client.js.map +1 -0
  122. package/mcp-server/dist/services/desktop-judgments.d.ts +125 -0
  123. package/mcp-server/dist/services/desktop-judgments.d.ts.map +1 -0
  124. package/mcp-server/dist/services/desktop-judgments.js +177 -0
  125. package/mcp-server/dist/services/desktop-judgments.js.map +1 -0
  126. package/mcp-server/dist/services/desktop-risk.d.ts +283 -0
  127. package/mcp-server/dist/services/desktop-risk.d.ts.map +1 -0
  128. package/mcp-server/dist/services/desktop-risk.js +605 -0
  129. package/mcp-server/dist/services/desktop-risk.js.map +1 -0
  130. package/mcp-server/dist/services/discord.d.ts +112 -0
  131. package/mcp-server/dist/services/discord.d.ts.map +1 -0
  132. package/mcp-server/dist/services/discord.js +477 -0
  133. package/mcp-server/dist/services/discord.js.map +1 -0
  134. package/mcp-server/dist/services/edit-stale.d.ts +81 -0
  135. package/mcp-server/dist/services/edit-stale.d.ts.map +1 -0
  136. package/mcp-server/dist/services/edit-stale.js +358 -0
  137. package/mcp-server/dist/services/edit-stale.js.map +1 -0
  138. package/mcp-server/dist/services/embedding-service.d.ts +16 -0
  139. package/mcp-server/dist/services/embedding-service.d.ts.map +1 -0
  140. package/mcp-server/dist/services/embedding-service.js +126 -0
  141. package/mcp-server/dist/services/embedding-service.js.map +1 -0
  142. package/mcp-server/dist/services/embedding-worker.d.ts +2 -0
  143. package/mcp-server/dist/services/embedding-worker.d.ts.map +1 -0
  144. package/mcp-server/dist/services/embedding-worker.js +52 -0
  145. package/mcp-server/dist/services/embedding-worker.js.map +1 -0
  146. package/mcp-server/dist/services/fb-regions.d.ts +71 -0
  147. package/mcp-server/dist/services/fb-regions.d.ts.map +1 -0
  148. package/mcp-server/dist/services/fb-regions.js +211 -0
  149. package/mcp-server/dist/services/fb-regions.js.map +1 -0
  150. package/mcp-server/dist/services/file-checksums.d.ts +22 -0
  151. package/mcp-server/dist/services/file-checksums.d.ts.map +1 -0
  152. package/mcp-server/dist/services/file-checksums.js +55 -0
  153. package/mcp-server/dist/services/file-checksums.js.map +1 -0
  154. package/mcp-server/dist/services/file-excerpt.d.ts +24 -0
  155. package/mcp-server/dist/services/file-excerpt.d.ts.map +1 -0
  156. package/mcp-server/dist/services/file-excerpt.js +65 -0
  157. package/mcp-server/dist/services/file-excerpt.js.map +1 -0
  158. package/mcp-server/dist/services/identity.d.ts +124 -0
  159. package/mcp-server/dist/services/identity.d.ts.map +1 -0
  160. package/mcp-server/dist/services/identity.js +241 -0
  161. package/mcp-server/dist/services/identity.js.map +1 -0
  162. package/mcp-server/dist/services/local-embeddings.d.ts +2 -0
  163. package/mcp-server/dist/services/local-embeddings.d.ts.map +1 -0
  164. package/mcp-server/dist/services/local-embeddings.js +3 -0
  165. package/mcp-server/dist/services/local-embeddings.js.map +1 -0
  166. package/mcp-server/dist/services/memory-client.d.ts +4 -0
  167. package/mcp-server/dist/services/memory-client.d.ts.map +1 -0
  168. package/mcp-server/dist/services/memory-client.js +27 -0
  169. package/mcp-server/dist/services/memory-client.js.map +1 -0
  170. package/mcp-server/dist/services/memory-judge-backfill.d.ts +135 -0
  171. package/mcp-server/dist/services/memory-judge-backfill.d.ts.map +1 -0
  172. package/mcp-server/dist/services/memory-judge-backfill.js +510 -0
  173. package/mcp-server/dist/services/memory-judge-backfill.js.map +1 -0
  174. package/mcp-server/dist/services/memory-judgments.d.ts +362 -0
  175. package/mcp-server/dist/services/memory-judgments.d.ts.map +1 -0
  176. package/mcp-server/dist/services/memory-judgments.js +674 -0
  177. package/mcp-server/dist/services/memory-judgments.js.map +1 -0
  178. package/mcp-server/dist/services/memory-maintenance.d.ts +108 -0
  179. package/mcp-server/dist/services/memory-maintenance.d.ts.map +1 -0
  180. package/mcp-server/dist/services/memory-maintenance.js +403 -0
  181. package/mcp-server/dist/services/memory-maintenance.js.map +1 -0
  182. package/mcp-server/dist/services/memory-retrieval.d.ts +66 -0
  183. package/mcp-server/dist/services/memory-retrieval.d.ts.map +1 -0
  184. package/mcp-server/dist/services/memory-retrieval.js +412 -0
  185. package/mcp-server/dist/services/memory-retrieval.js.map +1 -0
  186. package/mcp-server/dist/services/memory-schema.d.ts +16 -0
  187. package/mcp-server/dist/services/memory-schema.d.ts.map +1 -0
  188. package/mcp-server/dist/services/memory-schema.js +282 -0
  189. package/mcp-server/dist/services/memory-schema.js.map +1 -0
  190. package/mcp-server/dist/services/memory-sessions.d.ts +24 -0
  191. package/mcp-server/dist/services/memory-sessions.d.ts.map +1 -0
  192. package/mcp-server/dist/services/memory-sessions.js +110 -0
  193. package/mcp-server/dist/services/memory-sessions.js.map +1 -0
  194. package/mcp-server/dist/services/memory-triage.d.ts +60 -0
  195. package/mcp-server/dist/services/memory-triage.d.ts.map +1 -0
  196. package/mcp-server/dist/services/memory-triage.js +189 -0
  197. package/mcp-server/dist/services/memory-triage.js.map +1 -0
  198. package/mcp-server/dist/services/memory-verification.d.ts +24 -0
  199. package/mcp-server/dist/services/memory-verification.d.ts.map +1 -0
  200. package/mcp-server/dist/services/memory-verification.js +92 -0
  201. package/mcp-server/dist/services/memory-verification.js.map +1 -0
  202. package/mcp-server/dist/services/memory-writer.d.ts +26 -0
  203. package/mcp-server/dist/services/memory-writer.d.ts.map +1 -0
  204. package/mcp-server/dist/services/memory-writer.js +126 -0
  205. package/mcp-server/dist/services/memory-writer.js.map +1 -0
  206. package/mcp-server/dist/services/neural-interface.d.ts +439 -0
  207. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -0
  208. package/mcp-server/dist/services/neural-interface.js +1135 -0
  209. package/mcp-server/dist/services/neural-interface.js.map +1 -0
  210. package/mcp-server/dist/services/profiles.d.ts +120 -0
  211. package/mcp-server/dist/services/profiles.d.ts.map +1 -0
  212. package/mcp-server/dist/services/profiles.js +387 -0
  213. package/mcp-server/dist/services/profiles.js.map +1 -0
  214. package/mcp-server/dist/services/secret-gate.d.ts +29 -0
  215. package/mcp-server/dist/services/secret-gate.d.ts.map +1 -0
  216. package/mcp-server/dist/services/secret-gate.js +43 -0
  217. package/mcp-server/dist/services/secret-gate.js.map +1 -0
  218. package/mcp-server/dist/services/server-instructions.d.ts +10 -0
  219. package/mcp-server/dist/services/server-instructions.d.ts.map +1 -0
  220. package/mcp-server/dist/services/server-instructions.js +101 -0
  221. package/mcp-server/dist/services/server-instructions.js.map +1 -0
  222. package/mcp-server/dist/services/sqlite.d.ts +235 -0
  223. package/mcp-server/dist/services/sqlite.d.ts.map +1 -0
  224. package/mcp-server/dist/services/sqlite.js +1185 -0
  225. package/mcp-server/dist/services/sqlite.js.map +1 -0
  226. package/mcp-server/dist/services/typesafe-bench.d.ts +99 -0
  227. package/mcp-server/dist/services/typesafe-bench.d.ts.map +1 -0
  228. package/mcp-server/dist/services/typesafe-bench.js +218 -0
  229. package/mcp-server/dist/services/typesafe-bench.js.map +1 -0
  230. package/mcp-server/dist/services/typesafe-config.d.ts +342 -0
  231. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -0
  232. package/mcp-server/dist/services/typesafe-config.js +746 -0
  233. package/mcp-server/dist/services/typesafe-config.js.map +1 -0
  234. package/mcp-server/dist/services/typesafe.d.ts +213 -0
  235. package/mcp-server/dist/services/typesafe.d.ts.map +1 -0
  236. package/mcp-server/dist/services/typesafe.js +330 -0
  237. package/mcp-server/dist/services/typesafe.js.map +1 -0
  238. package/mcp-server/dist/services/vector-cache.d.ts +68 -0
  239. package/mcp-server/dist/services/vector-cache.d.ts.map +1 -0
  240. package/mcp-server/dist/services/vector-cache.js +271 -0
  241. package/mcp-server/dist/services/vector-cache.js.map +1 -0
  242. package/mcp-server/dist/services/whiteboard-geometry.d.ts +305 -0
  243. package/mcp-server/dist/services/whiteboard-geometry.d.ts.map +1 -0
  244. package/mcp-server/dist/services/whiteboard-geometry.js +666 -0
  245. package/mcp-server/dist/services/whiteboard-geometry.js.map +1 -0
  246. package/mcp-server/dist/tools/agents.d.ts +212 -0
  247. package/mcp-server/dist/tools/agents.d.ts.map +1 -0
  248. package/mcp-server/dist/tools/agents.js +407 -0
  249. package/mcp-server/dist/tools/agents.js.map +1 -0
  250. package/mcp-server/dist/tools/bluesky.d.ts +39 -0
  251. package/mcp-server/dist/tools/bluesky.d.ts.map +1 -0
  252. package/mcp-server/dist/tools/bluesky.js +1144 -0
  253. package/mcp-server/dist/tools/bluesky.js.map +1 -0
  254. package/mcp-server/dist/tools/browser-advanced.d.ts +58 -0
  255. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -0
  256. package/mcp-server/dist/tools/browser-advanced.js +106 -0
  257. package/mcp-server/dist/tools/browser-advanced.js.map +1 -0
  258. package/mcp-server/dist/tools/browser-batch.d.ts +99 -0
  259. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -0
  260. package/mcp-server/dist/tools/browser-batch.js +187 -0
  261. package/mcp-server/dist/tools/browser-batch.js.map +1 -0
  262. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +21 -0
  263. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -0
  264. package/mcp-server/dist/tools/browser-cheatsheet.js +144 -0
  265. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -0
  266. package/mcp-server/dist/tools/browser-interact.d.ts +239 -0
  267. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -0
  268. package/mcp-server/dist/tools/browser-interact.js +300 -0
  269. package/mcp-server/dist/tools/browser-interact.js.map +1 -0
  270. package/mcp-server/dist/tools/browser-navigate.d.ts +90 -0
  271. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -0
  272. package/mcp-server/dist/tools/browser-navigate.js +142 -0
  273. package/mcp-server/dist/tools/browser-navigate.js.map +1 -0
  274. package/mcp-server/dist/tools/browser-observe.d.ts +561 -0
  275. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -0
  276. package/mcp-server/dist/tools/browser-observe.js +2009 -0
  277. package/mcp-server/dist/tools/browser-observe.js.map +1 -0
  278. package/mcp-server/dist/tools/browser.d.ts +34 -0
  279. package/mcp-server/dist/tools/browser.d.ts.map +1 -0
  280. package/mcp-server/dist/tools/browser.js +112 -0
  281. package/mcp-server/dist/tools/browser.js.map +1 -0
  282. package/mcp-server/dist/tools/card-tools.d.ts +82 -0
  283. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -0
  284. package/mcp-server/dist/tools/card-tools.js +137 -0
  285. package/mcp-server/dist/tools/card-tools.js.map +1 -0
  286. package/mcp-server/dist/tools/card.d.ts +8 -0
  287. package/mcp-server/dist/tools/card.d.ts.map +1 -0
  288. package/mcp-server/dist/tools/card.js +16 -0
  289. package/mcp-server/dist/tools/card.js.map +1 -0
  290. package/mcp-server/dist/tools/category.d.ts +32 -0
  291. package/mcp-server/dist/tools/category.d.ts.map +1 -0
  292. package/mcp-server/dist/tools/category.js +290 -0
  293. package/mcp-server/dist/tools/category.js.map +1 -0
  294. package/mcp-server/dist/tools/choice.d.ts +160 -0
  295. package/mcp-server/dist/tools/choice.d.ts.map +1 -0
  296. package/mcp-server/dist/tools/choice.js +80 -0
  297. package/mcp-server/dist/tools/choice.js.map +1 -0
  298. package/mcp-server/dist/tools/computer.d.ts +71 -0
  299. package/mcp-server/dist/tools/computer.d.ts.map +1 -0
  300. package/mcp-server/dist/tools/computer.js +174 -0
  301. package/mcp-server/dist/tools/computer.js.map +1 -0
  302. package/mcp-server/dist/tools/discord-channel.d.ts +44 -0
  303. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -0
  304. package/mcp-server/dist/tools/discord-channel.js +236 -0
  305. package/mcp-server/dist/tools/discord-channel.js.map +1 -0
  306. package/mcp-server/dist/tools/discord-guild.d.ts +20 -0
  307. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -0
  308. package/mcp-server/dist/tools/discord-guild.js +138 -0
  309. package/mcp-server/dist/tools/discord-guild.js.map +1 -0
  310. package/mcp-server/dist/tools/discord-member.d.ts +26 -0
  311. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -0
  312. package/mcp-server/dist/tools/discord-member.js +122 -0
  313. package/mcp-server/dist/tools/discord-member.js.map +1 -0
  314. package/mcp-server/dist/tools/discord-message.d.ts +36 -0
  315. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -0
  316. package/mcp-server/dist/tools/discord-message.js +184 -0
  317. package/mcp-server/dist/tools/discord-message.js.map +1 -0
  318. package/mcp-server/dist/tools/discord-onboarding.d.ts +32 -0
  319. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -0
  320. package/mcp-server/dist/tools/discord-onboarding.js +179 -0
  321. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -0
  322. package/mcp-server/dist/tools/discord-role.d.ts +34 -0
  323. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -0
  324. package/mcp-server/dist/tools/discord-role.js +178 -0
  325. package/mcp-server/dist/tools/discord-role.js.map +1 -0
  326. package/mcp-server/dist/tools/discord-thread.d.ts +28 -0
  327. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -0
  328. package/mcp-server/dist/tools/discord-thread.js +88 -0
  329. package/mcp-server/dist/tools/discord-thread.js.map +1 -0
  330. package/mcp-server/dist/tools/discord-webhook.d.ts +32 -0
  331. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -0
  332. package/mcp-server/dist/tools/discord-webhook.js +154 -0
  333. package/mcp-server/dist/tools/discord-webhook.js.map +1 -0
  334. package/mcp-server/dist/tools/discord.d.ts +7 -0
  335. package/mcp-server/dist/tools/discord.d.ts.map +1 -0
  336. package/mcp-server/dist/tools/discord.js +25 -0
  337. package/mcp-server/dist/tools/discord.js.map +1 -0
  338. package/mcp-server/dist/tools/fb-groups.d.ts +98 -0
  339. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -0
  340. package/mcp-server/dist/tools/fb-groups.js +369 -0
  341. package/mcp-server/dist/tools/fb-groups.js.map +1 -0
  342. package/mcp-server/dist/tools/forget.d.ts +14 -0
  343. package/mcp-server/dist/tools/forget.d.ts.map +1 -0
  344. package/mcp-server/dist/tools/forget.js +26 -0
  345. package/mcp-server/dist/tools/forget.js.map +1 -0
  346. package/mcp-server/dist/tools/git-tools.d.ts +24 -0
  347. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -0
  348. package/mcp-server/dist/tools/git-tools.js +107 -0
  349. package/mcp-server/dist/tools/git-tools.js.map +1 -0
  350. package/mcp-server/dist/tools/git.d.ts +7 -0
  351. package/mcp-server/dist/tools/git.d.ts.map +1 -0
  352. package/mcp-server/dist/tools/git.js +11 -0
  353. package/mcp-server/dist/tools/git.js.map +1 -0
  354. package/mcp-server/dist/tools/gsc/experience.d.ts +135 -0
  355. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -0
  356. package/mcp-server/dist/tools/gsc/experience.js +351 -0
  357. package/mcp-server/dist/tools/gsc/experience.js.map +1 -0
  358. package/mcp-server/dist/tools/gsc/helpers.d.ts +78 -0
  359. package/mcp-server/dist/tools/gsc/helpers.d.ts.map +1 -0
  360. package/mcp-server/dist/tools/gsc/helpers.js +258 -0
  361. package/mcp-server/dist/tools/gsc/helpers.js.map +1 -0
  362. package/mcp-server/dist/tools/gsc/indexing.d.ts +121 -0
  363. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -0
  364. package/mcp-server/dist/tools/gsc/indexing.js +357 -0
  365. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -0
  366. package/mcp-server/dist/tools/gsc/inspect.d.ts +78 -0
  367. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -0
  368. package/mcp-server/dist/tools/gsc/inspect.js +321 -0
  369. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -0
  370. package/mcp-server/dist/tools/gsc/navigate.d.ts +44 -0
  371. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -0
  372. package/mcp-server/dist/tools/gsc/navigate.js +197 -0
  373. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -0
  374. package/mcp-server/dist/tools/gsc/performance.d.ts +84 -0
  375. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -0
  376. package/mcp-server/dist/tools/gsc/performance.js +274 -0
  377. package/mcp-server/dist/tools/gsc/performance.js.map +1 -0
  378. package/mcp-server/dist/tools/gsc/settings.d.ts +153 -0
  379. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -0
  380. package/mcp-server/dist/tools/gsc/settings.js +425 -0
  381. package/mcp-server/dist/tools/gsc/settings.js.map +1 -0
  382. package/mcp-server/dist/tools/gsc.d.ts +7 -0
  383. package/mcp-server/dist/tools/gsc.d.ts.map +1 -0
  384. package/mcp-server/dist/tools/gsc.js +51 -0
  385. package/mcp-server/dist/tools/gsc.js.map +1 -0
  386. package/mcp-server/dist/tools/image-tools.d.ts +24 -0
  387. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -0
  388. package/mcp-server/dist/tools/image-tools.js +80 -0
  389. package/mcp-server/dist/tools/image-tools.js.map +1 -0
  390. package/mcp-server/dist/tools/image.d.ts +10 -0
  391. package/mcp-server/dist/tools/image.d.ts.map +1 -0
  392. package/mcp-server/dist/tools/image.js +14 -0
  393. package/mcp-server/dist/tools/image.js.map +1 -0
  394. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +97 -0
  395. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -0
  396. package/mcp-server/dist/tools/leonardo-browser-tools.js +228 -0
  397. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -0
  398. package/mcp-server/dist/tools/leonardo.d.ts +13 -0
  399. package/mcp-server/dist/tools/leonardo.d.ts.map +1 -0
  400. package/mcp-server/dist/tools/leonardo.js +21 -0
  401. package/mcp-server/dist/tools/leonardo.js.map +1 -0
  402. package/mcp-server/dist/tools/loop.d.ts +30 -0
  403. package/mcp-server/dist/tools/loop.d.ts.map +1 -0
  404. package/mcp-server/dist/tools/loop.js +401 -0
  405. package/mcp-server/dist/tools/loop.js.map +1 -0
  406. package/mcp-server/dist/tools/memories.d.ts +56 -0
  407. package/mcp-server/dist/tools/memories.d.ts.map +1 -0
  408. package/mcp-server/dist/tools/memories.js +171 -0
  409. package/mcp-server/dist/tools/memories.js.map +1 -0
  410. package/mcp-server/dist/tools/morelogin.d.ts +24 -0
  411. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -0
  412. package/mcp-server/dist/tools/morelogin.js +79 -0
  413. package/mcp-server/dist/tools/morelogin.js.map +1 -0
  414. package/mcp-server/dist/tools/profile.d.ts +17 -0
  415. package/mcp-server/dist/tools/profile.d.ts.map +1 -0
  416. package/mcp-server/dist/tools/profile.js +114 -0
  417. package/mcp-server/dist/tools/profile.js.map +1 -0
  418. package/mcp-server/dist/tools/recall.d.ts +71 -0
  419. package/mcp-server/dist/tools/recall.d.ts.map +1 -0
  420. package/mcp-server/dist/tools/recall.js +147 -0
  421. package/mcp-server/dist/tools/recall.js.map +1 -0
  422. package/mcp-server/dist/tools/reflect.d.ts +56 -0
  423. package/mcp-server/dist/tools/reflect.d.ts.map +1 -0
  424. package/mcp-server/dist/tools/reflect.js +157 -0
  425. package/mcp-server/dist/tools/reflect.js.map +1 -0
  426. package/mcp-server/dist/tools/remember.d.ts +62 -0
  427. package/mcp-server/dist/tools/remember.d.ts.map +1 -0
  428. package/mcp-server/dist/tools/remember.js +201 -0
  429. package/mcp-server/dist/tools/remember.js.map +1 -0
  430. package/mcp-server/dist/tools/response.d.ts +23 -0
  431. package/mcp-server/dist/tools/response.d.ts.map +1 -0
  432. package/mcp-server/dist/tools/response.js +24 -0
  433. package/mcp-server/dist/tools/response.js.map +1 -0
  434. package/mcp-server/dist/tools/restore.d.ts +14 -0
  435. package/mcp-server/dist/tools/restore.d.ts.map +1 -0
  436. package/mcp-server/dist/tools/restore.js +23 -0
  437. package/mcp-server/dist/tools/restore.js.map +1 -0
  438. package/mcp-server/dist/tools/style-guide-tools.d.ts +51 -0
  439. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -0
  440. package/mcp-server/dist/tools/style-guide-tools.js +231 -0
  441. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -0
  442. package/mcp-server/dist/tools/style-guide.d.ts +8 -0
  443. package/mcp-server/dist/tools/style-guide.d.ts.map +1 -0
  444. package/mcp-server/dist/tools/style-guide.js +12 -0
  445. package/mcp-server/dist/tools/style-guide.js.map +1 -0
  446. package/mcp-server/dist/tools/sync.d.ts +20 -0
  447. package/mcp-server/dist/tools/sync.d.ts.map +1 -0
  448. package/mcp-server/dist/tools/sync.js +156 -0
  449. package/mcp-server/dist/tools/sync.js.map +1 -0
  450. package/mcp-server/dist/tools/tictactoe-tools.d.ts +18 -0
  451. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -0
  452. package/mcp-server/dist/tools/tictactoe-tools.js +78 -0
  453. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -0
  454. package/mcp-server/dist/tools/tictactoe.d.ts +7 -0
  455. package/mcp-server/dist/tools/tictactoe.d.ts.map +1 -0
  456. package/mcp-server/dist/tools/tictactoe.js +11 -0
  457. package/mcp-server/dist/tools/tictactoe.js.map +1 -0
  458. package/mcp-server/dist/tools/utils.d.ts +19 -0
  459. package/mcp-server/dist/tools/utils.d.ts.map +1 -0
  460. package/mcp-server/dist/tools/utils.js +54 -0
  461. package/mcp-server/dist/tools/utils.js.map +1 -0
  462. package/mcp-server/dist/tools/whiteboard-format.d.ts +88 -0
  463. package/mcp-server/dist/tools/whiteboard-format.d.ts.map +1 -0
  464. package/mcp-server/dist/tools/whiteboard-format.js +337 -0
  465. package/mcp-server/dist/tools/whiteboard-format.js.map +1 -0
  466. package/mcp-server/dist/tools/whiteboard-tools.d.ts +326 -0
  467. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -0
  468. package/mcp-server/dist/tools/whiteboard-tools.js +222 -0
  469. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -0
  470. package/mcp-server/dist/tools/whiteboard.d.ts +8 -0
  471. package/mcp-server/dist/tools/whiteboard.d.ts.map +1 -0
  472. package/mcp-server/dist/tools/whiteboard.js +16 -0
  473. package/mcp-server/dist/tools/whiteboard.js.map +1 -0
  474. package/mcp-server/dist/tools/youtube/analytics.d.ts +46 -0
  475. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -0
  476. package/mcp-server/dist/tools/youtube/analytics.js +83 -0
  477. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -0
  478. package/mcp-server/dist/tools/youtube/dedup.d.ts +35 -0
  479. package/mcp-server/dist/tools/youtube/dedup.d.ts.map +1 -0
  480. package/mcp-server/dist/tools/youtube/dedup.js +56 -0
  481. package/mcp-server/dist/tools/youtube/dedup.js.map +1 -0
  482. package/mcp-server/dist/tools/youtube/download.d.ts +31 -0
  483. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -0
  484. package/mcp-server/dist/tools/youtube/download.js +30 -0
  485. package/mcp-server/dist/tools/youtube/download.js.map +1 -0
  486. package/mcp-server/dist/tools/youtube/helpers.d.ts +66 -0
  487. package/mcp-server/dist/tools/youtube/helpers.d.ts.map +1 -0
  488. package/mcp-server/dist/tools/youtube/helpers.js +143 -0
  489. package/mcp-server/dist/tools/youtube/helpers.js.map +1 -0
  490. package/mcp-server/dist/tools/youtube/media.d.ts +43 -0
  491. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -0
  492. package/mcp-server/dist/tools/youtube/media.js +97 -0
  493. package/mcp-server/dist/tools/youtube/media.js.map +1 -0
  494. package/mcp-server/dist/tools/youtube/metadata.d.ts +33 -0
  495. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -0
  496. package/mcp-server/dist/tools/youtube/metadata.js +106 -0
  497. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -0
  498. package/mcp-server/dist/tools/youtube/navigate.d.ts +30 -0
  499. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -0
  500. package/mcp-server/dist/tools/youtube/navigate.js +71 -0
  501. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -0
  502. package/mcp-server/dist/tools/youtube/playlist.d.ts +29 -0
  503. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -0
  504. package/mcp-server/dist/tools/youtube/playlist.js +128 -0
  505. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -0
  506. package/mcp-server/dist/tools/youtube/schedule.d.ts +31 -0
  507. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -0
  508. package/mcp-server/dist/tools/youtube/schedule.js +147 -0
  509. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -0
  510. package/mcp-server/dist/tools/youtube/source.d.ts +36 -0
  511. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -0
  512. package/mcp-server/dist/tools/youtube/source.js +85 -0
  513. package/mcp-server/dist/tools/youtube/source.js.map +1 -0
  514. package/mcp-server/dist/tools/youtube/upload.d.ts +53 -0
  515. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -0
  516. package/mcp-server/dist/tools/youtube/upload.js +255 -0
  517. package/mcp-server/dist/tools/youtube/upload.js.map +1 -0
  518. package/mcp-server/dist/tools/youtube.d.ts +12 -0
  519. package/mcp-server/dist/tools/youtube.d.ts.map +1 -0
  520. package/mcp-server/dist/tools/youtube.js +38 -0
  521. package/mcp-server/dist/tools/youtube.js.map +1 -0
  522. package/mcp-server/dist/tui.d.ts +3 -0
  523. package/mcp-server/dist/tui.d.ts.map +1 -0
  524. package/mcp-server/dist/tui.js +806 -0
  525. package/mcp-server/dist/tui.js.map +1 -0
  526. package/mcp-server/dist/types.d.ts +77 -0
  527. package/mcp-server/dist/types.d.ts.map +1 -0
  528. package/mcp-server/dist/types.js +2 -0
  529. package/mcp-server/dist/types.js.map +1 -0
  530. package/mcp-server/package-lock.json +4798 -0
  531. package/mcp-server/package.json +55 -38
  532. package/mcp-server/run.mjs +12 -2
  533. package/mcp-server/src/config.ts +48 -3
  534. package/mcp-server/src/http.ts +296 -93
  535. package/mcp-server/src/index.ts +546 -203
  536. package/mcp-server/src/preload-http.ts +19 -18
  537. package/mcp-server/src/preload.ts +19 -18
  538. package/mcp-server/src/scripts/setup-embeddings.ts +9 -0
  539. package/mcp-server/src/services/assistant-judgments.ts +157 -0
  540. package/mcp-server/src/services/browser-assist-gate.ts +383 -0
  541. package/mcp-server/src/services/browser-assist.ts +267 -0
  542. package/mcp-server/src/services/browser-bench.ts +477 -0
  543. package/mcp-server/src/services/browser-judgments.ts +414 -0
  544. package/mcp-server/src/services/browser-risk.ts +484 -0
  545. package/mcp-server/src/services/categories.ts +36 -19
  546. package/mcp-server/src/services/codex-config-heal.ts +403 -0
  547. package/mcp-server/src/services/desktop-assist-gate.ts +251 -0
  548. package/mcp-server/src/services/desktop-assist.ts +308 -0
  549. package/mcp-server/src/services/desktop-bench.ts +372 -0
  550. package/mcp-server/src/services/desktop-client.ts +76 -0
  551. package/mcp-server/src/services/desktop-judgments.ts +218 -0
  552. package/mcp-server/src/services/desktop-risk.ts +743 -0
  553. package/mcp-server/src/services/edit-stale.ts +299 -0
  554. package/mcp-server/src/services/embedding-service.ts +108 -0
  555. package/mcp-server/src/services/embedding-worker.ts +46 -0
  556. package/mcp-server/src/services/fb-regions.ts +221 -0
  557. package/mcp-server/src/services/file-checksums.ts +26 -9
  558. package/mcp-server/src/services/file-excerpt.ts +59 -0
  559. package/mcp-server/src/services/identity.ts +291 -0
  560. package/mcp-server/src/services/local-embeddings.ts +2 -77
  561. package/mcp-server/src/services/memory-client.ts +23 -0
  562. package/mcp-server/src/services/memory-judge-backfill.ts +462 -0
  563. package/mcp-server/src/services/memory-judgments.ts +901 -0
  564. package/mcp-server/src/services/memory-maintenance.ts +360 -0
  565. package/mcp-server/src/services/memory-retrieval.ts +349 -0
  566. package/mcp-server/src/services/memory-schema.ts +280 -0
  567. package/mcp-server/src/services/memory-sessions.ts +87 -0
  568. package/mcp-server/src/services/memory-triage.ts +182 -0
  569. package/mcp-server/src/services/memory-verification.ts +68 -0
  570. package/mcp-server/src/services/memory-writer.ts +125 -0
  571. package/mcp-server/src/services/neural-interface.ts +1217 -73
  572. package/mcp-server/src/services/profiles.ts +428 -0
  573. package/mcp-server/src/services/secret-gate.ts +52 -0
  574. package/mcp-server/src/services/server-instructions.ts +122 -0
  575. package/mcp-server/src/services/sqlite.ts +1456 -823
  576. package/mcp-server/src/services/typesafe-bench.ts +247 -0
  577. package/mcp-server/src/services/typesafe-config.ts +790 -0
  578. package/mcp-server/src/services/typesafe.ts +390 -0
  579. package/mcp-server/src/services/vector-cache.ts +255 -0
  580. package/mcp-server/src/services/whiteboard-geometry.ts +711 -0
  581. package/mcp-server/src/tools/agents.ts +539 -0
  582. package/mcp-server/src/tools/bluesky.ts +1186 -0
  583. package/mcp-server/src/tools/browser-advanced.ts +15 -6
  584. package/mcp-server/src/tools/browser-batch.ts +178 -0
  585. package/mcp-server/src/tools/browser-cheatsheet.ts +155 -0
  586. package/mcp-server/src/tools/browser-interact.ts +362 -255
  587. package/mcp-server/src/tools/browser-navigate.ts +164 -77
  588. package/mcp-server/src/tools/browser-observe.ts +2222 -1330
  589. package/mcp-server/src/tools/browser.ts +181 -107
  590. package/mcp-server/src/tools/card.ts +7 -5
  591. package/mcp-server/src/tools/choice.ts +103 -0
  592. package/mcp-server/src/tools/computer.ts +190 -0
  593. package/mcp-server/src/tools/discord.ts +10 -23
  594. package/mcp-server/src/tools/fb-groups.ts +387 -0
  595. package/mcp-server/src/tools/forget.ts +1 -1
  596. package/mcp-server/src/tools/git.ts +3 -1
  597. package/mcp-server/src/tools/gsc/experience.ts +440 -0
  598. package/mcp-server/src/tools/gsc/helpers.ts +288 -0
  599. package/mcp-server/src/tools/gsc/indexing.ts +495 -0
  600. package/mcp-server/src/tools/gsc/inspect.ts +391 -0
  601. package/mcp-server/src/tools/gsc/navigate.ts +236 -0
  602. package/mcp-server/src/tools/gsc/performance.ts +352 -0
  603. package/mcp-server/src/tools/gsc/settings.ts +564 -0
  604. package/mcp-server/src/tools/gsc.ts +95 -0
  605. package/mcp-server/src/tools/image.ts +3 -1
  606. package/mcp-server/src/tools/leonardo-browser-tools.ts +47 -37
  607. package/mcp-server/src/tools/leonardo.ts +7 -5
  608. package/mcp-server/src/tools/loop.ts +118 -25
  609. package/mcp-server/src/tools/memories.ts +65 -5
  610. package/mcp-server/src/tools/morelogin.ts +81 -0
  611. package/mcp-server/src/tools/profile.ts +122 -0
  612. package/mcp-server/src/tools/recall.ts +105 -261
  613. package/mcp-server/src/tools/reflect.ts +171 -145
  614. package/mcp-server/src/tools/remember.ts +223 -115
  615. package/mcp-server/src/tools/style-guide-tools.ts +250 -0
  616. package/mcp-server/src/tools/style-guide.ts +16 -0
  617. package/mcp-server/src/tools/sync.ts +66 -9
  618. package/mcp-server/src/tools/tictactoe.ts +3 -1
  619. package/mcp-server/src/tools/utils.ts +22 -0
  620. package/mcp-server/src/tools/whiteboard-format.ts +394 -0
  621. package/mcp-server/src/tools/whiteboard-tools.ts +191 -183
  622. package/mcp-server/src/tools/whiteboard.ts +7 -5
  623. package/mcp-server/src/tools/youtube/analytics.ts +106 -0
  624. package/mcp-server/src/tools/youtube/dedup.ts +57 -0
  625. package/mcp-server/src/tools/youtube/download.ts +41 -0
  626. package/mcp-server/src/tools/youtube/helpers.ts +183 -0
  627. package/mcp-server/src/tools/youtube/media.ts +109 -0
  628. package/mcp-server/src/tools/youtube/metadata.ts +112 -0
  629. package/mcp-server/src/tools/youtube/navigate.ts +81 -0
  630. package/mcp-server/src/tools/youtube/playlist.ts +134 -0
  631. package/mcp-server/src/tools/youtube/schedule.ts +158 -0
  632. package/mcp-server/src/tools/youtube/source.ts +101 -0
  633. package/mcp-server/src/tools/youtube/upload.ts +296 -0
  634. package/mcp-server/src/tools/youtube.ts +47 -0
  635. package/mcp-server/src/tui.ts +8 -9
  636. package/neural-interface/games/TicTacToe/1.svg +1 -0
  637. package/neural-interface/games/TicTacToe/2.svg +1 -0
  638. package/neural-interface/games/TicTacToe/3.svg +1 -0
  639. package/neural-interface/games/TicTacToe/4.svg +1 -0
  640. package/neural-interface/games/TicTacToe/5.svg +1 -0
  641. package/neural-interface/games/TicTacToe/6.svg +1 -0
  642. package/neural-interface/games/TicTacToe/7.svg +1 -0
  643. package/neural-interface/games/TicTacToe/8.svg +1 -0
  644. package/neural-interface/games/TicTacToe/9.svg +1 -0
  645. package/neural-interface/games/TicTacToe/Board.svg +1 -0
  646. package/neural-interface/games/TicTacToe/Circle.svg +1 -0
  647. package/neural-interface/games/TicTacToe/Cross.svg +1 -0
  648. package/neural-interface/i18n/en.json +7022 -0
  649. package/neural-interface/i18n/pt-BR.json +7026 -0
  650. package/neural-interface/lib/assistant-api.js +1005 -0
  651. package/neural-interface/lib/assistant-attachments.js +121 -0
  652. package/neural-interface/lib/assistant-brains/claude.js +207 -0
  653. package/neural-interface/lib/assistant-brains/codex-browser-policy-hook.mjs +43 -0
  654. package/neural-interface/lib/assistant-brains/codex-route-gate-hook.mjs +56 -0
  655. package/neural-interface/lib/assistant-brains/codex.js +213 -0
  656. package/neural-interface/lib/assistant-brains/opencode-browser-policy.js +47 -0
  657. package/neural-interface/lib/assistant-brains/opencode-route-gate.js +62 -0
  658. package/neural-interface/lib/assistant-brains/opencode.js +320 -0
  659. package/neural-interface/lib/assistant-budget.js +318 -0
  660. package/neural-interface/lib/assistant-catalog.js +731 -0
  661. package/neural-interface/lib/assistant-clarify.js +664 -0
  662. package/neural-interface/lib/assistant-config.js +232 -0
  663. package/neural-interface/lib/assistant-dispatch.js +2744 -0
  664. package/neural-interface/lib/assistant-envelope.js +582 -0
  665. package/neural-interface/lib/assistant-evidence.js +236 -0
  666. package/neural-interface/lib/assistant-hidden-models.js +272 -0
  667. package/neural-interface/lib/assistant-jev.js +117 -0
  668. package/neural-interface/lib/assistant-judgments.js +111 -0
  669. package/neural-interface/lib/assistant-media.js +335 -0
  670. package/neural-interface/lib/assistant-memory.js +398 -0
  671. package/neural-interface/lib/assistant-persona.js +444 -0
  672. package/neural-interface/lib/assistant-plan-permissions.js +448 -0
  673. package/neural-interface/lib/assistant-playbooks/design.md +87 -0
  674. package/neural-interface/lib/assistant-playbooks.js +72 -0
  675. package/neural-interface/lib/assistant-pricing.js +159 -0
  676. package/neural-interface/lib/assistant-route-gate-codex.js +163 -0
  677. package/neural-interface/lib/assistant-route-gate.js +212 -0
  678. package/neural-interface/lib/assistant-router.js +1324 -0
  679. package/neural-interface/lib/assistant-runtime.js +3337 -0
  680. package/neural-interface/lib/assistant-task-prompt.js +472 -0
  681. package/neural-interface/lib/assistant-usage.js +1688 -0
  682. package/neural-interface/lib/augmented-path.js +70 -0
  683. package/neural-interface/lib/automation-storage-migration.js +54 -0
  684. package/neural-interface/lib/backup-service.js +851 -0
  685. package/neural-interface/lib/backup-zip-reader.js +262 -0
  686. package/neural-interface/lib/browser-assist-api.js +41 -0
  687. package/neural-interface/lib/browser-console.js +176 -0
  688. package/neural-interface/lib/browser-execution.js +241 -0
  689. package/neural-interface/lib/browser-extraction.js +191 -0
  690. package/neural-interface/lib/browser-language.js +83 -0
  691. package/neural-interface/lib/browser-screenshot.js +399 -0
  692. package/neural-interface/lib/browser-semantic-context.js +639 -0
  693. package/neural-interface/lib/browser-snapshots.js +192 -0
  694. package/neural-interface/lib/browser-tab-recovery.js +119 -0
  695. package/neural-interface/lib/browser-targets.js +70 -0
  696. package/neural-interface/lib/browser-tool-policy.js +926 -0
  697. package/neural-interface/lib/claude-accounts.js +230 -0
  698. package/neural-interface/lib/claude-agent-bridge.js +3203 -0
  699. package/neural-interface/lib/claude-bypass-policy.js +99 -0
  700. package/neural-interface/lib/claude-executable.js +241 -0
  701. package/neural-interface/lib/claude-history.js +429 -0
  702. package/neural-interface/lib/claude-model-catalog.js +444 -0
  703. package/neural-interface/lib/claude-panel-requests.js +165 -0
  704. package/neural-interface/lib/claude-panel-session.js +272 -0
  705. package/neural-interface/lib/claude-permission-rules.js +153 -0
  706. package/neural-interface/lib/claude-session-cleanup.js +71 -0
  707. package/neural-interface/lib/claude-session-list.js +82 -0
  708. package/neural-interface/lib/claude-session-ops.js +140 -0
  709. package/neural-interface/lib/claude-settings-view.js +51 -0
  710. package/neural-interface/lib/claude-skin-connect.js +79 -0
  711. package/neural-interface/lib/claude-stall-policy.js +7 -0
  712. package/neural-interface/lib/claude-temporary.js +435 -0
  713. package/neural-interface/lib/cli-update-planner.js +312 -0
  714. package/neural-interface/lib/codex-capabilities.d.ts +41 -0
  715. package/neural-interface/lib/codex-capabilities.js +148 -0
  716. package/neural-interface/lib/codex-collaboration-mode.js +17 -0
  717. package/neural-interface/lib/codex-compat-rpc.js +241 -0
  718. package/neural-interface/lib/codex-mcp-approvals.js +56 -0
  719. package/neural-interface/lib/codex-mcp-apps.js +47 -0
  720. package/neural-interface/lib/codex-model-context.js +202 -0
  721. package/neural-interface/lib/codex-plan-store.js +71 -0
  722. package/neural-interface/lib/codex-request-journal.js +242 -0
  723. package/neural-interface/lib/codex-runtime-path.js +213 -0
  724. package/neural-interface/lib/codex-session-catalog.js +231 -0
  725. package/neural-interface/lib/codex-session-settings.js +46 -0
  726. package/neural-interface/lib/codex-sidepanel-permissions.js +110 -0
  727. package/neural-interface/lib/codex-thread-history.js +165 -0
  728. package/neural-interface/lib/codex-user-verification.js +34 -0
  729. package/neural-interface/lib/codex-writer-lifecycle.js +152 -0
  730. package/neural-interface/lib/confined-fs.js +256 -0
  731. package/neural-interface/lib/db.js +922 -0
  732. package/neural-interface/lib/design-md.js +9 -0
  733. package/neural-interface/lib/desktop/api.js +92 -0
  734. package/neural-interface/lib/desktop/audit.js +62 -0
  735. package/neural-interface/lib/desktop/build.js +423 -0
  736. package/neural-interface/lib/desktop/config.js +606 -0
  737. package/neural-interface/lib/desktop/coords.js +76 -0
  738. package/neural-interface/lib/desktop/fake-helper.js +1192 -0
  739. package/neural-interface/lib/desktop/frames.js +77 -0
  740. package/neural-interface/lib/desktop/grants.js +84 -0
  741. package/neural-interface/lib/desktop/guards.js +170 -0
  742. package/neural-interface/lib/desktop/helper/SynabunDesktop.swift +3056 -0
  743. package/neural-interface/lib/desktop/lease.js +51 -0
  744. package/neural-interface/lib/desktop/manager.js +545 -0
  745. package/neural-interface/lib/desktop/press-contexts.js +103 -0
  746. package/neural-interface/lib/desktop/protocol.js +495 -0
  747. package/neural-interface/lib/desktop/service.js +1202 -0
  748. package/neural-interface/lib/effort-levels.js +148 -0
  749. package/neural-interface/lib/event-loop-monitor.js +67 -0
  750. package/neural-interface/lib/exec-loop-command.js +209 -0
  751. package/neural-interface/lib/folder-picker.ps1 +77 -0
  752. package/neural-interface/lib/http-guards.js +287 -0
  753. package/neural-interface/lib/jsonl-lines.js +94 -0
  754. package/neural-interface/lib/loop-logger.js +127 -0
  755. package/neural-interface/lib/mcp-client-config.js +133 -0
  756. package/neural-interface/lib/mcp-installer.js +487 -0
  757. package/neural-interface/lib/mcp-profile-refresh-coordinator.js +78 -0
  758. package/neural-interface/lib/mcp-profile-servers.js +120 -0
  759. package/neural-interface/lib/memo-cache.js +84 -0
  760. package/neural-interface/lib/memory-api.js +758 -0
  761. package/neural-interface/lib/memory-map-api.js +1150 -0
  762. package/neural-interface/lib/memory-map-layout.js +872 -0
  763. package/neural-interface/lib/memory-map-worker.js +165 -0
  764. package/neural-interface/lib/memory-session-capture.js +81 -0
  765. package/neural-interface/lib/memory-timers.js +62 -0
  766. package/neural-interface/lib/morelogin.js +301 -0
  767. package/neural-interface/lib/native-binary-runtime.js +382 -0
  768. package/neural-interface/lib/native-loop-goal.js +33 -0
  769. package/neural-interface/lib/native-loop-providers.js +1002 -0
  770. package/neural-interface/lib/native-loop-runtime.js +747 -0
  771. package/neural-interface/lib/offline-page.js +54 -0
  772. package/neural-interface/lib/opencode-hidden-models.js +113 -0
  773. package/neural-interface/lib/opencode-history.js +253 -0
  774. package/neural-interface/lib/opencode-runtime-config.js +58 -0
  775. package/neural-interface/lib/opencode-v2-client.js +486 -0
  776. package/neural-interface/lib/opencode-v2-ws-requests.js +955 -0
  777. package/neural-interface/lib/path-confine.js +213 -0
  778. package/neural-interface/lib/plugin-installer.js +264 -0
  779. package/neural-interface/lib/project-storage.js +766 -0
  780. package/neural-interface/lib/pty-host/core.js +603 -0
  781. package/neural-interface/lib/pty-host/flow.js +43 -0
  782. package/neural-interface/lib/pty-host/host.js +47 -0
  783. package/neural-interface/lib/pty-host/manager.js +360 -0
  784. package/neural-interface/lib/pty-host/protocol.js +81 -0
  785. package/neural-interface/lib/pty-host/snapshot.js +133 -0
  786. package/neural-interface/lib/remote-policy.js +582 -0
  787. package/neural-interface/lib/rulesets/api.js +175 -0
  788. package/neural-interface/lib/rulesets/fs-safe.js +245 -0
  789. package/neural-interface/lib/rulesets/installer.js +1453 -0
  790. package/neural-interface/lib/rulesets/json-edit.js +186 -0
  791. package/neural-interface/lib/rulesets/lock.js +170 -0
  792. package/neural-interface/lib/rulesets/managed-text.js +314 -0
  793. package/neural-interface/lib/rulesets/normalise.js +24 -0
  794. package/neural-interface/lib/rulesets/render.js +84 -0
  795. package/neural-interface/lib/schedule-launch-intent.js +40 -0
  796. package/neural-interface/lib/session-cache-builder.js +524 -0
  797. package/neural-interface/lib/session-chunker.js +344 -0
  798. package/neural-interface/lib/session-indexer.js +327 -0
  799. package/neural-interface/lib/session-title-generator.js +232 -0
  800. package/neural-interface/lib/skill-prompt-bridge.js +11 -0
  801. package/neural-interface/lib/style-guide/api.js +375 -0
  802. package/neural-interface/lib/style-guide/color.js +352 -0
  803. package/neural-interface/lib/style-guide/export-css.js +99 -0
  804. package/neural-interface/lib/style-guide/export-dtcg.js +209 -0
  805. package/neural-interface/lib/style-guide/export-tailwind.js +102 -0
  806. package/neural-interface/lib/style-guide/fonts.json +227 -0
  807. package/neural-interface/lib/style-guide/import.js +1268 -0
  808. package/neural-interface/lib/style-guide/pointers.js +103 -0
  809. package/neural-interface/lib/style-guide/presets.js +232 -0
  810. package/neural-interface/lib/style-guide/render-design-md.js +319 -0
  811. package/neural-interface/lib/style-guide/schema.js +848 -0
  812. package/neural-interface/lib/style-guide/security.js +43 -0
  813. package/neural-interface/lib/style-guide/store.js +491 -0
  814. package/neural-interface/lib/style-guide/summary.js +106 -0
  815. package/neural-interface/lib/style-guide/tokens.js +170 -0
  816. package/neural-interface/lib/synabun-update-plan.js +324 -0
  817. package/neural-interface/lib/synabun-version.js +179 -0
  818. package/neural-interface/lib/system-restore.js +99 -0
  819. package/neural-interface/lib/terminal-env.js +86 -0
  820. package/neural-interface/lib/ui-blob-store.js +106 -0
  821. package/neural-interface/lib/vector-cache.js +2 -0
  822. package/neural-interface/lib/virtual-socket.js +60 -0
  823. package/neural-interface/lib/whatsapp/api.js +146 -0
  824. package/neural-interface/lib/whatsapp/auth-store.js +389 -0
  825. package/neural-interface/lib/whatsapp/baileys-adapter.js +457 -0
  826. package/neural-interface/lib/whatsapp/brain.js +128 -0
  827. package/neural-interface/lib/whatsapp/bridge.js +1499 -0
  828. package/neural-interface/lib/whatsapp/cards.js +519 -0
  829. package/neural-interface/lib/whatsapp/commands.js +92 -0
  830. package/neural-interface/lib/whatsapp/config.js +291 -0
  831. package/neural-interface/lib/whatsapp/connector/entry.mjs +25 -0
  832. package/neural-interface/lib/whatsapp/connector/manifest.json +6 -0
  833. package/neural-interface/lib/whatsapp/connector/npm-shrinkwrap.json +717 -0
  834. package/neural-interface/lib/whatsapp/connector/package.json +8 -0
  835. package/neural-interface/lib/whatsapp/fake-baileys.js +444 -0
  836. package/neural-interface/lib/whatsapp/format.js +552 -0
  837. package/neural-interface/lib/whatsapp/host-core.js +1225 -0
  838. package/neural-interface/lib/whatsapp/host.js +119 -0
  839. package/neural-interface/lib/whatsapp/identity.js +288 -0
  840. package/neural-interface/lib/whatsapp/inbound.js +149 -0
  841. package/neural-interface/lib/whatsapp/installer.js +562 -0
  842. package/neural-interface/lib/whatsapp/manager.js +638 -0
  843. package/neural-interface/lib/whatsapp/paths.js +81 -0
  844. package/neural-interface/lib/whatsapp/protocol.js +327 -0
  845. package/neural-interface/lib/whatsapp/qr-svg.js +57 -0
  846. package/neural-interface/lib/whatsapp/redact.js +130 -0
  847. package/neural-interface/lib/whatsapp/service.js +1305 -0
  848. package/neural-interface/lib/whatsapp/vendor/qrcodegen.js +848 -0
  849. package/neural-interface/package-lock.json +4431 -0
  850. package/neural-interface/package.json +58 -27
  851. package/neural-interface/public/apple-touch-icon.png +0 -0
  852. package/neural-interface/public/category-logos/synabun.png +0 -0
  853. package/neural-interface/public/claude.svg +1 -0
  854. package/neural-interface/public/favicon-16x16.png +0 -0
  855. package/neural-interface/public/favicon-32x32.png +0 -0
  856. package/neural-interface/public/icon-192.png +0 -0
  857. package/neural-interface/public/icon-512.png +0 -0
  858. package/neural-interface/public/index.html +32 -182
  859. package/neural-interface/public/index2d.html +2 -2
  860. package/neural-interface/public/install-app.html +31 -0
  861. package/neural-interface/public/logo-synabun.png +0 -0
  862. package/neural-interface/public/logoHD.png +0 -0
  863. package/neural-interface/public/manifest.json +2 -0
  864. package/neural-interface/public/mcp.svg +4 -0
  865. package/neural-interface/public/offline.html +670 -299
  866. package/neural-interface/public/onboarding.html +804 -161
  867. package/neural-interface/public/opencode-logo-dark-square.svg +1 -0
  868. package/neural-interface/public/shared/agent-runtime-options.js +596 -0
  869. package/neural-interface/public/shared/api.js +339 -28
  870. package/neural-interface/public/shared/assistant/asst-accounts.js +318 -0
  871. package/neural-interface/public/shared/assistant/asst-agents-dock.js +296 -0
  872. package/neural-interface/public/shared/assistant/asst-api.js +270 -0
  873. package/neural-interface/public/shared/assistant/asst-brain-picker.js +744 -0
  874. package/neural-interface/public/shared/assistant/asst-budget.js +333 -0
  875. package/neural-interface/public/shared/assistant/asst-composer.js +656 -0
  876. package/neural-interface/public/shared/assistant/asst-computer.js +803 -0
  877. package/neural-interface/public/shared/assistant/asst-control.js +1018 -0
  878. package/neural-interface/public/shared/assistant/asst-hosts.js +262 -0
  879. package/neural-interface/public/shared/assistant/asst-mascot.js +313 -0
  880. package/neural-interface/public/shared/assistant/asst-menu.js +375 -0
  881. package/neural-interface/public/shared/assistant/asst-panel.js +1845 -0
  882. package/neural-interface/public/shared/assistant/asst-rack-styles.js +586 -0
  883. package/neural-interface/public/shared/assistant/asst-render.js +3305 -0
  884. package/neural-interface/public/shared/assistant/asst-route.js +1653 -0
  885. package/neural-interface/public/shared/assistant/asst-roving.js +75 -0
  886. package/neural-interface/public/shared/assistant/asst-sanitize.js +117 -0
  887. package/neural-interface/public/shared/assistant/asst-sidepanel-styles.js +488 -0
  888. package/neural-interface/public/shared/assistant/asst-sidepanel.js +675 -0
  889. package/neural-interface/public/shared/assistant/asst-slash.js +258 -0
  890. package/neural-interface/public/shared/assistant/asst-state.js +727 -0
  891. package/neural-interface/public/shared/assistant/asst-styles.js +1686 -0
  892. package/neural-interface/public/shared/assistant/asst-tool-kinds.js +1017 -0
  893. package/neural-interface/public/shared/assistant/asst-usage.js +444 -0
  894. package/neural-interface/public/shared/assistant/asst-ws.js +175 -0
  895. package/neural-interface/public/shared/automation-context.js +75 -0
  896. package/neural-interface/public/shared/blob-store.js +99 -0
  897. package/neural-interface/public/shared/cdx/cdx-capabilities.js +118 -0
  898. package/neural-interface/public/shared/cdx/cdx-cards.js +37 -0
  899. package/neural-interface/public/shared/cdx/cdx-commands.js +171 -0
  900. package/neural-interface/public/shared/cdx/cdx-context-menu.js +402 -0
  901. package/neural-interface/public/shared/cdx/cdx-context-model.js +220 -0
  902. package/neural-interface/public/shared/cdx/cdx-features.js +408 -0
  903. package/neural-interface/public/shared/cdx/cdx-icons.js +89 -0
  904. package/neural-interface/public/shared/cdx/cdx-mcp-app-host.js +414 -0
  905. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.html +6 -0
  906. package/neural-interface/public/shared/cdx/cdx-mcp-app-proxy.js +56 -0
  907. package/neural-interface/public/shared/cdx/cdx-mcp-app.js +178 -0
  908. package/neural-interface/public/shared/cdx/cdx-model-catalog.js +120 -0
  909. package/neural-interface/public/shared/cdx/cdx-output-model.js +261 -0
  910. package/neural-interface/public/shared/cdx/cdx-output.js +382 -0
  911. package/neural-interface/public/shared/cdx/cdx-panel.js +1372 -0
  912. package/neural-interface/public/shared/cdx/cdx-plan.js +266 -0
  913. package/neural-interface/public/shared/cdx/cdx-protocol.js +682 -0
  914. package/neural-interface/public/shared/cdx/cdx-render.js +3381 -0
  915. package/neural-interface/public/shared/cdx/cdx-requests.js +1136 -0
  916. package/neural-interface/public/shared/cdx/cdx-styles.js +3251 -0
  917. package/neural-interface/public/shared/cdx/cdx-tabs.js +7992 -0
  918. package/neural-interface/public/shared/cdx/cdx-ws.js +363 -0
  919. package/neural-interface/public/shared/cli-status.js +169 -0
  920. package/neural-interface/public/shared/command-runner-model.js +30 -0
  921. package/neural-interface/public/shared/constants.js +22 -5
  922. package/neural-interface/public/shared/cp/cp-agents.js +186 -0
  923. package/neural-interface/public/shared/cp/cp-bash.js +252 -0
  924. package/neural-interface/public/shared/cp/cp-compose.js +159 -0
  925. package/neural-interface/public/shared/cp/cp-context-menu.js +309 -0
  926. package/neural-interface/public/shared/cp/cp-context-model.js +157 -0
  927. package/neural-interface/public/shared/cp/cp-context-window.js +80 -0
  928. package/neural-interface/public/shared/cp/cp-ctx.js +11 -0
  929. package/neural-interface/public/shared/cp/cp-diff.js +255 -0
  930. package/neural-interface/public/shared/cp/cp-event-rows.js +637 -0
  931. package/neural-interface/public/shared/cp/cp-events.js +846 -0
  932. package/neural-interface/public/shared/cp/cp-markdown.js +104 -0
  933. package/neural-interface/public/shared/cp/cp-permission-model.js +905 -0
  934. package/neural-interface/public/shared/cp/cp-permissions.js +626 -0
  935. package/neural-interface/public/shared/cp/cp-rehydrate.js +113 -0
  936. package/neural-interface/public/shared/cp/cp-restore.js +224 -0
  937. package/neural-interface/public/shared/cp/cp-session-model.js +338 -0
  938. package/neural-interface/public/shared/cp/cp-session-settings.js +254 -0
  939. package/neural-interface/public/shared/cp/cp-sessions.js +227 -0
  940. package/neural-interface/public/shared/cp/cp-statusline.js +153 -0
  941. package/neural-interface/public/shared/cp/cp-styles.js +349 -0
  942. package/neural-interface/public/shared/cp/cp-tasks-model.js +282 -0
  943. package/neural-interface/public/shared/cp/cp-tasks.js +107 -0
  944. package/neural-interface/public/shared/cp/cp-temporary-view.js +56 -0
  945. package/neural-interface/public/shared/cp/cp-temporary.js +231 -0
  946. package/neural-interface/public/shared/cp/cp-tool-cards.js +326 -0
  947. package/neural-interface/public/shared/cp/cp-tool-results.js +618 -0
  948. package/neural-interface/public/shared/cp/cp-usage-model.js +124 -0
  949. package/neural-interface/public/shared/graph-activity.js +68 -0
  950. package/neural-interface/public/shared/html-shell.js +116 -17
  951. package/neural-interface/public/shared/i18n.js +132 -34
  952. package/neural-interface/public/shared/node-positions-store.js +44 -0
  953. package/neural-interface/public/shared/ocp-hidden-models.js +116 -0
  954. package/neural-interface/public/shared/ocp-v2/ocp-v2-approvals.js +355 -0
  955. package/neural-interface/public/shared/ocp-v2/ocp-v2-autoaccept-button.js +35 -0
  956. package/neural-interface/public/shared/ocp-v2/ocp-v2-automation-ownership.js +72 -0
  957. package/neural-interface/public/shared/ocp-v2/ocp-v2-binding.js +280 -0
  958. package/neural-interface/public/shared/ocp-v2/ocp-v2-caps.js +67 -0
  959. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes-logic.js +179 -0
  960. package/neural-interface/public/shared/ocp-v2/ocp-v2-changes.js +164 -0
  961. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +725 -0
  962. package/neural-interface/public/shared/ocp-v2/ocp-v2-compact-button.js +75 -0
  963. package/neural-interface/public/shared/ocp-v2/ocp-v2-composer-logic.js +1204 -0
  964. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm-logic.js +117 -0
  965. package/neural-interface/public/shared/ocp-v2/ocp-v2-confirm.js +59 -0
  966. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-gauge.js +252 -0
  967. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-menu.js +478 -0
  968. package/neural-interface/public/shared/ocp-v2/ocp-v2-context-model.js +179 -0
  969. package/neural-interface/public/shared/ocp-v2/ocp-v2-events.js +233 -0
  970. package/neural-interface/public/shared/ocp-v2/ocp-v2-icons.js +30 -0
  971. package/neural-interface/public/shared/ocp-v2/ocp-v2-manager.js +1065 -0
  972. package/neural-interface/public/shared/ocp-v2/ocp-v2-mention-hints.js +182 -0
  973. package/neural-interface/public/shared/ocp-v2/ocp-v2-modelpicker.js +655 -0
  974. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +2636 -0
  975. package/neural-interface/public/shared/ocp-v2/ocp-v2-plan.js +601 -0
  976. package/neural-interface/public/shared/ocp-v2/ocp-v2-profile-inheritance.js +78 -0
  977. package/neural-interface/public/shared/ocp-v2/ocp-v2-projectbar.js +649 -0
  978. package/neural-interface/public/shared/ocp-v2/ocp-v2-providers.js +35 -0
  979. package/neural-interface/public/shared/ocp-v2/ocp-v2-rehydrate.js +357 -0
  980. package/neural-interface/public/shared/ocp-v2/ocp-v2-render-logic.js +189 -0
  981. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +1869 -0
  982. package/neural-interface/public/shared/ocp-v2/ocp-v2-select.js +42 -0
  983. package/neural-interface/public/shared/ocp-v2/ocp-v2-send-logic.js +117 -0
  984. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +1714 -0
  985. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-actions.js +468 -0
  986. package/neural-interface/public/shared/ocp-v2/ocp-v2-session-widgets.js +63 -0
  987. package/neural-interface/public/shared/ocp-v2/ocp-v2-sessions-logic.js +366 -0
  988. package/neural-interface/public/shared/ocp-v2/ocp-v2-settings-link.js +19 -0
  989. package/neural-interface/public/shared/ocp-v2/ocp-v2-slash-hints.js +343 -0
  990. package/neural-interface/public/shared/ocp-v2/ocp-v2-state.js +746 -0
  991. package/neural-interface/public/shared/ocp-v2/ocp-v2-status-logic.js +347 -0
  992. package/neural-interface/public/shared/ocp-v2/ocp-v2-status.js +338 -0
  993. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +3543 -0
  994. package/neural-interface/public/shared/ocp-v2/ocp-v2-subagents-logic.js +482 -0
  995. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools-logic.js +351 -0
  996. package/neural-interface/public/shared/ocp-v2/ocp-v2-tools.js +168 -0
  997. package/neural-interface/public/shared/ocp-v2/ocp-v2-variantpicker.js +315 -0
  998. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +545 -0
  999. package/neural-interface/public/shared/provider-icons.js +30 -0
  1000. package/neural-interface/public/shared/pwa-install-page.js +34 -0
  1001. package/neural-interface/public/shared/pwa-install.css +12 -0
  1002. package/neural-interface/public/shared/pwa-install.js +28 -0
  1003. package/neural-interface/public/shared/session-title.js +100 -0
  1004. package/neural-interface/public/shared/settings/settings-ia.js +389 -0
  1005. package/neural-interface/public/shared/settings/settings-kit.js +234 -0
  1006. package/neural-interface/public/shared/settings/settings-rules.js +160 -0
  1007. package/neural-interface/public/shared/settings/settings-search.js +463 -0
  1008. package/neural-interface/public/shared/settings/settings-shell.js +570 -0
  1009. package/neural-interface/public/shared/start-bridge.js +583 -0
  1010. package/neural-interface/public/shared/state.js +5 -0
  1011. package/neural-interface/public/shared/storage.js +50 -7
  1012. package/neural-interface/public/shared/styleguide/sg-agents.js +42 -0
  1013. package/neural-interface/public/shared/styleguide/sg-brand.js +4 -0
  1014. package/neural-interface/public/shared/styleguide/sg-color-client.js +388 -0
  1015. package/neural-interface/public/shared/styleguide/sg-colors.js +151 -0
  1016. package/neural-interface/public/shared/styleguide/sg-components.js +35 -0
  1017. package/neural-interface/public/shared/styleguide/sg-history.js +41 -0
  1018. package/neural-interface/public/shared/styleguide/sg-icons-logo.js +38 -0
  1019. package/neural-interface/public/shared/styleguide/sg-imagery.js +4 -0
  1020. package/neural-interface/public/shared/styleguide/sg-import-export.js +48 -0
  1021. package/neural-interface/public/shared/styleguide/sg-kit.js +284 -0
  1022. package/neural-interface/public/shared/styleguide/sg-labels.js +318 -0
  1023. package/neural-interface/public/shared/styleguide/sg-layout.js +4 -0
  1024. package/neural-interface/public/shared/styleguide/sg-motion.js +5 -0
  1025. package/neural-interface/public/shared/styleguide/sg-panel.js +237 -0
  1026. package/neural-interface/public/shared/styleguide/sg-preview.js +138 -0
  1027. package/neural-interface/public/shared/styleguide/sg-rules.js +9 -0
  1028. package/neural-interface/public/shared/styleguide/sg-shape.js +24 -0
  1029. package/neural-interface/public/shared/styleguide/sg-state.js +132 -0
  1030. package/neural-interface/public/shared/styleguide/sg-typography.js +125 -0
  1031. package/neural-interface/public/shared/styles.css +8614 -1477
  1032. package/neural-interface/public/shared/synabun-mascot.js +1625 -0
  1033. package/neural-interface/public/shared/synabun-ticker.js +376 -0
  1034. package/neural-interface/public/shared/term-ready.js +307 -0
  1035. package/neural-interface/public/shared/term-renderer.js +343 -0
  1036. package/neural-interface/public/shared/ui-assistant-panel.js +10 -0
  1037. package/neural-interface/public/shared/ui-assistant.js +77 -0
  1038. package/neural-interface/public/shared/ui-automation-studio.js +5105 -3573
  1039. package/neural-interface/public/shared/ui-claude-panel.js +11685 -6333
  1040. package/neural-interface/public/shared/ui-codex-panel.js +12 -0
  1041. package/neural-interface/public/shared/ui-command-runner.js +251 -468
  1042. package/neural-interface/public/shared/ui-cost-widget.js +55 -34
  1043. package/neural-interface/public/shared/ui-detail.js +77 -14
  1044. package/neural-interface/public/shared/ui-explorer.js +360 -181
  1045. package/neural-interface/public/shared/ui-file-explorer.js +485 -107
  1046. package/neural-interface/public/shared/ui-help.js +2 -2
  1047. package/neural-interface/public/shared/ui-image-gallery.js +45 -21
  1048. package/neural-interface/public/shared/ui-judgments.js +1346 -0
  1049. package/neural-interface/public/shared/ui-keybinds.js +3 -2
  1050. package/neural-interface/public/shared/ui-link.js +105 -51
  1051. package/neural-interface/public/shared/ui-loading.js +222 -11
  1052. package/neural-interface/public/shared/ui-memory-maintenance.js +111 -0
  1053. package/neural-interface/public/shared/ui-menubar.js +100 -31
  1054. package/neural-interface/public/shared/ui-native-loop-router-state.js +94 -0
  1055. package/neural-interface/public/shared/ui-native-loop-router.js +493 -0
  1056. package/neural-interface/public/shared/ui-native-window-id.js +7 -0
  1057. package/neural-interface/public/shared/ui-navbar.js +357 -222
  1058. package/neural-interface/public/shared/ui-notifications.js +58 -12
  1059. package/neural-interface/public/shared/ui-opencode-panel-v2.js +17 -0
  1060. package/neural-interface/public/shared/ui-panels.js +15 -7
  1061. package/neural-interface/public/shared/ui-resume.js +823 -653
  1062. package/neural-interface/public/shared/ui-schedule-queue.js +172 -0
  1063. package/neural-interface/public/shared/ui-schedules-studio.js +1882 -0
  1064. package/neural-interface/public/shared/ui-scroll-follow.js +194 -0
  1065. package/neural-interface/public/shared/ui-sessions.js +789 -34
  1066. package/neural-interface/public/shared/ui-settings.js +5774 -2194
  1067. package/neural-interface/public/shared/ui-sidepanel-layout.js +109 -0
  1068. package/neural-interface/public/shared/ui-sidepanel-runtime.js +19 -0
  1069. package/neural-interface/public/shared/ui-sidepanel-session-entry.js +40 -0
  1070. package/neural-interface/public/shared/ui-sidepanel-sessions.js +221 -0
  1071. package/neural-interface/public/shared/ui-sidepanel-state.js +131 -0
  1072. package/neural-interface/public/shared/ui-sidepanel-tray.js +547 -0
  1073. package/neural-interface/public/shared/ui-sidepanel-windows.js +387 -0
  1074. package/neural-interface/public/shared/ui-skills.js +18 -32
  1075. package/neural-interface/public/shared/ui-styleguide.js +35 -0
  1076. package/neural-interface/public/shared/ui-sync.js +87 -0
  1077. package/neural-interface/public/shared/ui-terminal.js +7863 -6385
  1078. package/neural-interface/public/shared/ui-tool-updates.js +292 -0
  1079. package/neural-interface/public/shared/ui-tooltip.js +156 -15
  1080. package/neural-interface/public/shared/ui-tutorial-draw.js +119 -683
  1081. package/neural-interface/public/shared/ui-tutorial-layout.js +135 -0
  1082. package/neural-interface/public/shared/ui-tutorial-steps.js +59 -2209
  1083. package/neural-interface/public/shared/ui-tutorial.css +102 -0
  1084. package/neural-interface/public/shared/ui-tutorial.js +557 -1076
  1085. package/neural-interface/public/shared/ui-update.js +420 -68
  1086. package/neural-interface/public/shared/ui-whatsapp.js +941 -0
  1087. package/neural-interface/public/shared/ui-whiteboard.js +1076 -233
  1088. package/neural-interface/public/shared/ui-workspaces.js +2 -1
  1089. package/neural-interface/public/shared/utils.js +58 -0
  1090. package/neural-interface/public/shared/vterm-buffer.js +15 -5
  1091. package/neural-interface/public/shared/whatsapp/wa-phone.js +65 -0
  1092. package/neural-interface/public/shared/whatsapp/wa-view.js +411 -0
  1093. package/neural-interface/public/sidepanel-session.html +18 -0
  1094. package/neural-interface/public/sw.js +10 -2
  1095. package/neural-interface/public/synabun.png +0 -0
  1096. package/neural-interface/public/variant/2d/graph.js +1707 -1635
  1097. package/neural-interface/public/variant/2d/lasso.js +2 -1
  1098. package/neural-interface/public/variant/2d/layout.js +595 -594
  1099. package/neural-interface/public/variant/2d/main.js +557 -521
  1100. package/neural-interface/public/variant/2d/settings-gfx.js +18 -24
  1101. package/neural-interface/public/variant/3d/main.js +517 -500
  1102. package/neural-interface/public/variant/3d/map-controls.js +144 -0
  1103. package/neural-interface/public/variant/3d/map-data.js +251 -0
  1104. package/neural-interface/public/variant/3d/map-labels.js +241 -0
  1105. package/neural-interface/public/variant/3d/map-pick.js +90 -0
  1106. package/neural-interface/public/variant/3d/map-renderer.js +521 -0
  1107. package/neural-interface/public/variant/3d/map-shaders.js +158 -0
  1108. package/neural-interface/public/variant/3d/map-view.js +618 -0
  1109. package/neural-interface/public/vendor/three/manifest.json +3 -0
  1110. package/neural-interface/public/vendor/three/three-0.169.0.min.js +3844 -0
  1111. package/neural-interface/public/vendor/xterm/manifest.json +3 -0
  1112. package/neural-interface/public/vendor/xterm/xterm-6.0.0.css +285 -0
  1113. package/neural-interface/public/vendor/xterm/xterm-6.0.0.min.js +192 -0
  1114. package/neural-interface/scripts/build-vendor.mjs +64 -0
  1115. package/neural-interface/scripts/codex-protocol-fixture.mjs +83 -0
  1116. package/neural-interface/scripts/rebuild-pty.js +39 -22
  1117. package/neural-interface/scripts/vendor-three-entry.js +24 -0
  1118. package/neural-interface/scripts/vendor-xterm-entry.js +8 -0
  1119. package/neural-interface/server.js +33983 -15000
  1120. package/neural-interface/skins/default/skin.css +90 -0
  1121. package/neural-interface/skins/default/skin.json +8 -0
  1122. package/neural-interface/templates/rulesets/README.md +9 -0
  1123. package/neural-interface/templates/rulesets/claude.md +3 -0
  1124. package/neural-interface/templates/rulesets/codex.md +2 -0
  1125. package/neural-interface/templates/rulesets/coexistence.md +6 -0
  1126. package/neural-interface/templates/rulesets/core.md +26 -0
  1127. package/neural-interface/templates/rulesets/cursor.md +2 -0
  1128. package/neural-interface/templates/rulesets/gemini.md +2 -0
  1129. package/neural-interface/templates/rulesets/legacy-hashes.json +227 -0
  1130. package/neural-interface/templates/rulesets/manifest.json +12 -0
  1131. package/neural-interface/templates/rulesets/opencode.md +2 -0
  1132. package/package.json +131 -53
  1133. package/postinstall.js +55 -26
  1134. package/preuninstall.js +187 -0
  1135. package/scripts/restore-data-home-from-backup.mjs +239 -0
  1136. package/setup.js +872 -260
  1137. package/skills/leonardo/SKILL.md +19 -10
  1138. package/skills/leonardo/modules/image-prompter.md +18 -12
  1139. package/skills/leonardo/modules/video-prompter.md +19 -13
  1140. package/skills/synabun/SKILL.md +209 -185
  1141. package/skills/synabun/icon.png +0 -0
  1142. package/skills/synabun/modules/audit.md +380 -374
  1143. package/skills/synabun/modules/changelog.md +15 -6
  1144. package/skills/synabun/modules/idea.md +148 -144
  1145. package/skills/synabun/modules/memorize.md +13 -4
  1146. package/skills/synabun/modules/schedule.md +198 -0
  1147. package/skills/synabun/synabunicon.png +0 -0
  1148. package/updater.cmd +31 -0
  1149. package/updater.mjs +382 -0
  1150. package/updater.sh +29 -0
  1151. package/hooks/claude-code/test-user-learning.mjs +0 -531
  1152. package/neural-interface/public/claude-chat.css +0 -878
  1153. package/neural-interface/public/claude-chat.html +0 -92
  1154. package/neural-interface/public/claude-chat.js +0 -1168
  1155. package/neural-interface/public/index-legacy.html +0 -14677
  1156. package/neural-interface/public/index2d-legacy.html +0 -8193
  1157. package/neural-interface/public/shared/html-term-renderer.js +0 -1022
  1158. package/neural-interface/public/variant/3d/background.js +0 -884
  1159. package/neural-interface/public/variant/3d/camera.js +0 -661
  1160. package/neural-interface/public/variant/3d/gfx.js +0 -116
  1161. package/neural-interface/public/variant/3d/graph.js +0 -2399
  1162. package/neural-interface/public/variant/3d/settings-gfx.js +0 -228
  1163. 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,172 @@
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 installer) ── */
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
+ /* A step whose height follows what the installer reports: on a short window it scrolls (its parts keep their
554
+ height instead of being squeezed) rather than being cut off. */
555
+ .step[data-step="6"] { max-height: calc(90vh - 58px); }
556
+ .step[data-step="6"] > * { flex-shrink: 0; }
557
+ .step[data-step="6"] .subtitle { margin-bottom: 16px; }
558
+ /* The step's one primary action: what it does, then the button. */
559
+ .rules-install-all {
560
+ display: flex;
561
+ align-items: center;
562
+ gap: 14px;
563
+ padding: 12px 14px;
564
+ margin-bottom: 12px;
565
+ border: 1px solid var(--accent-border);
566
+ border-radius: var(--r-card);
567
+ background: var(--accent-bg);
568
+ }
569
+ .rules-install-all .ria-text { flex: 1 1 0; min-width: 0; font-size: 12px; color: var(--t-primary); line-height: 1.5; }
570
+ .rules-install-all .action-btn { flex-shrink: 0; padding: 9px 18px; font-size: 12px; white-space: nowrap; }
571
+ /* What the installer answered, and where the rules live. */
572
+ .rules-result { margin-bottom: 12px; font-size: 12px; color: var(--t-primary); line-height: 1.5; overflow-wrap: anywhere; }
573
+ .rules-result.ok .rr-message::before { content: '\2713'; margin-right: 8px; color: var(--green); }
574
+ .rules-result.fail .rr-message { color: var(--red); }
575
+ .rules-result .rr-where { margin-top: 4px; font-size: 11px; color: var(--t-muted); }
576
+ .rules-list {
577
+ display: flex;
578
+ flex-direction: column;
579
+ gap: 8px;
580
+ margin-bottom: 12px;
581
+ }
582
+ .rules-list:empty { display: none; }
583
+ .rules-list .mcp-toggle-row.has-note { align-items: flex-start; }
584
+ .rules-list .mtr-state {
585
+ margin-left: 6px;
586
+ font-size: 10px;
587
+ font-weight: 500;
588
+ color: var(--t-muted);
589
+ }
590
+ .rules-list .mtr-state.ok { color: var(--green); }
591
+ .rules-list .mtr-note { margin-top: 4px; font-size: 11px; color: var(--t-secondary); line-height: 1.45; overflow-wrap: anywhere; }
592
+ .rules-actions { display: flex; gap: 6px; flex-shrink: 0; }
593
+ .rules-actions button, .rules-note button {
594
+ padding: 5px 10px;
595
+ border-radius: 8px;
596
+ border: 1px solid var(--b-light);
597
+ background: var(--s-light);
598
+ color: var(--t-primary);
599
+ font-size: 11px;
600
+ font-family: inherit;
601
+ cursor: pointer;
602
+ white-space: nowrap;
603
+ transition: all var(--ease);
604
+ }
605
+ .rules-actions button:hover, .rules-note button:hover { background: var(--s-medium); color: var(--t-bright); border-color: var(--b-hover); }
606
+ .rules-actions button.primary { border-color: var(--accent-border); background: var(--s-active); color: var(--t-bright); font-weight: 600; }
607
+ .rules-actions button:disabled, .rules-note button:disabled { opacity: 0.4; cursor: default; }
608
+ .rules-note { font-size: 11px; color: var(--t-muted); margin-bottom: 12px; line-height: 1.5; }
609
+ .rules-note button { margin-left: 8px; }
610
+ /* Under the installer: the text SynaBun cannot install, to paste by hand. */
611
+ .rules-manual-label { margin: 4px 0 8px; font-size: 10px; color: var(--t-muted); text-transform: uppercase; letter-spacing: 0.5px; }
612
+ .rules-extra { margin-top: 8px; }
613
+ #rulesViewCode, #rulesCursorCode, #rulesCoexistCode { max-height: 160px; }
614
+ #rulesViewCode { margin-bottom: 12px; }
615
+
446
616
  /* ── Dependency List ── */
447
617
  .dep-list {
448
618
  list-style: none;
@@ -603,10 +773,11 @@
603
773
  color: var(--t-secondary);
604
774
  text-align: center;
605
775
  margin-top: 16px;
606
- opacity: 0;
776
+ opacity: 1;
607
777
  transition: opacity 0.6s ease;
608
778
  line-height: 1.8;
609
779
  }
780
+ .onboarding-animated .welcome-desc:not(.visible) { opacity: 0; }
610
781
  .welcome-desc.visible { opacity: 1; }
611
782
 
612
783
  /* ── Welcome Choice Cards ── */
@@ -614,11 +785,12 @@
614
785
  display: flex;
615
786
  gap: 14px;
616
787
  margin-top: 28px;
617
- opacity: 0;
788
+ opacity: 1;
618
789
  transition: opacity 0.5s ease;
619
790
  width: 100%;
620
791
  max-width: 440px;
621
792
  }
793
+ .onboarding-animated .welcome-choices:not(.visible) { opacity: 0; }
622
794
  .welcome-choices.visible { opacity: 1; }
623
795
  .welcome-choice {
624
796
  flex: 1;
@@ -906,9 +1078,16 @@
906
1078
 
907
1079
  <!-- Step 0: Welcome -->
908
1080
  <div class="step active" data-step="0" style="align-items:center;">
909
- <div id="synabun-bg"></div>
1081
+ <div id="synabun-bg" aria-hidden="true">
1082
+ <!-- Static first-paint fallback. The animation replaces this SVG. -->
1083
+ <svg viewBox="0 0 280 140" width="380" height="190" style="overflow:visible">
1084
+ <g class="syna-eye"><g class="syna-lid"><rect x="80" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
1085
+ <g class="syna-eye"><g class="syna-lid"><rect x="162" y="24" width="38" height="72" rx="19" fill="#ffffff"/></g></g>
1086
+ <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"/>
1087
+ </svg>
1088
+ </div>
910
1089
  <div style="display:flex;flex-direction:column;align-items:center;">
911
- <div class="typewriter-line" id="typewriter"></div>
1090
+ <div class="typewriter-line" id="typewriter">Hi! I'm SynaBun!</div>
912
1091
  <div class="welcome-desc" id="welcomeDesc">
913
1092
  Persistent vector memory for your AI coding tools.<br>
914
1093
  How would you like to get started?
@@ -1040,29 +1219,73 @@
1040
1219
  <span class="mascot-toast" id="mascotToast"></span>
1041
1220
  </div>
1042
1221
  <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>
1222
+ <p class="subtitle">Toggle on the AI coding tools you use. SynaBun registers itself with each one and installs its rules automatically.</p>
1223
+ <div class="mcp-toggle-list" id="mcpToggleList"></div>
1224
+ <label class="rules-option" for="rulesInstallOpt">
1225
+ <span class="key-backup-checkbox-wrap">
1226
+ <input type="checkbox" id="rulesInstallOpt" checked>
1227
+ <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>
1228
+ </span>
1229
+ <span>Install SynaBun's rules with each tool I connect</span>
1230
+ </label>
1231
+ <div class="mcp-other-section" id="mcpOtherSection">
1232
+ <div class="mcp-other-header" id="mcpOtherHeader">
1233
+ <span>Other providers (Cursor, Windsurf, etc.)</span>
1234
+ <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>
1235
+ </div>
1236
+ <div class="mcp-other-body" id="mcpOtherBody" style="display:none;">
1237
+ <div style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Add this MCP server JSON to your tool's config file:</div>
1238
+ <div class="code-copy-wrap" id="mcpCodeWrap">
1239
+ <div class="instructions-preview" id="mcpSetupCode"></div>
1240
+ <span class="code-copy-label">copy</span>
1241
+ </div>
1242
+ <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
1243
  </div>
1051
- <div id="mcpSetupHint" style="margin-top:6px;font-size:11px;color:var(--t-muted);"></div>
1052
1244
  </div>
1053
1245
  </div>
1054
1246
 
1055
- <!-- Step 6: Ruleset -->
1247
+ <!-- Step 6: Install SynaBun rules. The installer leads; the copy boxes at the bottom are only for what it cannot write. -->
1056
1248
  <div class="step right" data-step="6">
1057
- <div style="position:relative;display:flex;justify-content:center;align-items:center;">
1058
- <div class="step-eyes"></div>
1249
+ <div class="step-eyes"></div>
1250
+ <h2>Install SynaBun Rules</h2>
1251
+ <p class="subtitle">SynaBun installs its rules where each connected tool loads them for every project, and keeps them up to date. There is nothing to paste.</p>
1252
+ <div class="rules-note" id="rulesNote" role="status" style="display:none;"></div>
1253
+ <div class="rules-install-all" id="rulesInstallAll" style="display:none;">
1254
+ <div class="ria-text" id="rulesInstallAllHelp"></div>
1255
+ <button type="button" class="action-btn" id="rulesInstallAllBtn" aria-describedby="rulesInstallAllHelp"></button>
1256
+ </div>
1257
+ <div class="rules-result" id="rulesResult" role="status" style="display:none;">
1258
+ <div class="rr-message" id="rulesResultMessage"></div>
1259
+ <div class="rr-where" id="rulesResultWhere"></div>
1059
1260
  </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>
1261
+ <div class="rules-list" id="rulesList"></div>
1262
+ <div class="instructions-preview" id="rulesViewCode" role="region" tabindex="0" style="display:none;"></div>
1263
+ <div class="rules-note" id="rulesIdle" style="display:none;"></div>
1264
+ <div class="rules-manual-label">Manual setup</div>
1265
+ <div class="mcp-other-section" id="rulesCursorSection">
1266
+ <div class="mcp-other-header" id="rulesCursorHeader">
1267
+ <span>Cursor (its rules are pasted by hand)</span>
1268
+ <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>
1269
+ </div>
1270
+ <div class="mcp-other-body" id="rulesCursorBody" style="display:none;">
1271
+ <div id="rulesCursorHelp" style="font-size:12px;color:var(--t-secondary);margin-bottom:6px;">Cursor keeps its User Rules inside the app, so SynaBun cannot install them. Copy the rules and paste them into Cursor Settings &rarr; Rules.</div>
1272
+ <div class="code-copy-wrap" id="rulesCursorWrap">
1273
+ <div class="instructions-preview" id="rulesCursorCode"></div>
1274
+ <span class="code-copy-label">copy</span>
1275
+ </div>
1276
+ </div>
1277
+ </div>
1278
+ <div class="mcp-other-section rules-extra" id="rulesCoexistSection">
1279
+ <div class="mcp-other-header" id="rulesCoexistHeader">
1280
+ <span>Using another memory tool too? (optional snippet)</span>
1281
+ <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>
1282
+ </div>
1283
+ <div class="mcp-other-body" id="rulesCoexistBody" style="display:none;">
1284
+ <div id="rulesCoexistHelp" 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>
1285
+ <div class="code-copy-wrap" id="rulesCoexistWrap">
1286
+ <div class="instructions-preview" id="rulesCoexistCode"></div>
1287
+ <span class="code-copy-label">copy</span>
1288
+ </div>
1066
1289
  </div>
1067
1290
  </div>
1068
1291
  </div>
@@ -1073,7 +1296,7 @@
1073
1296
  <h2 style="text-align:center;margin-bottom:12px;">Setup Complete!</h2>
1074
1297
  <ul class="checklist" id="checklist"></ul>
1075
1298
  <div id="restartNotice" style="margin:16px 0 0;padding:12px 14px;background:rgba(255,255,255,0.04);border:1px solid rgba(255,255,255,0.10);border-radius:var(--r-card);font-size:12px;color:var(--t-primary);line-height:1.5;">
1076
- <span style="color:var(--t-bright);font-weight:600;">Restart required</span> — Relaunch <span id="restartToolName" style="color:var(--t-bright);font-weight:500;"></span> for the MCP changes to be picked up.
1299
+ <span style="color:var(--t-bright);font-weight:600;">Restart required</span> — Relaunch <span id="restartToolName" style="color:var(--t-bright);font-weight:500;"></span> for the MCP changes and SynaBun's rules to be picked up.
1077
1300
  </div>
1078
1301
  <div style="text-align:center;margin-top:16px;">
1079
1302
  <button class="action-btn" id="launchBtn" style="font-size:15px;padding:12px 32px;">Launch Neural Interface</button>
@@ -1183,30 +1406,45 @@
1183
1406
 
1184
1407
  <script type="module">
1185
1408
 
1409
+ // The rules step is the installer of Settings → AI connections: the same client calls and the same reading
1410
+ // of the status (see STEP 6). Both modules are import-free, so the wizard still loads nothing of the app.
1411
+ import { fetchRulesStatus, fetchRulesTextWithFallback, installRules, installAllRules } from './shared/api.js';
1412
+ import {
1413
+ describeRulesHost, describeRulesInstall, describeRulesInstallAll, describeRulesInPlace, rulesInstallPlan, catalogueTranslator,
1414
+ } from './shared/settings/settings-rules.js';
1415
+
1186
1416
  // ═══════════════════════════════════════════
1187
1417
  // STATE
1188
1418
  // ═══════════════════════════════════════════
1189
1419
 
1190
1420
  const TOTAL_STEPS = 8;
1191
1421
  let currentStep = 0;
1422
+ // Step 6: a connected tool still has no rules. Leaving the step then is a skip, and the Next button says so.
1423
+ let rulesPending = false;
1192
1424
 
1193
1425
  const wizardState = {
1194
1426
  collectionName: 'claude_memory',
1195
1427
  collectionDisplayName: 'Claude Memory',
1196
1428
  dbLocationPath: null,
1197
1429
  selectedTool: null,
1198
- projectRoot: '',
1430
+ enabledTools: [], // tool ids toggled on via Step 5 install toggles
1431
+ dataHome: '',
1432
+ packageRoot: '',
1433
+ mcpCommand: '',
1434
+ mcpArgs: [],
1199
1435
  buildReady: false,
1200
1436
  mcpWritten: false,
1201
1437
  projects: [],
1202
1438
  };
1203
1439
 
1440
+ // Tools with server-side MCP install/uninstall endpoints. Each row maps a
1441
+ // toggle to the POST/DELETE endpoint that writes the provider's config file.
1442
+ // `id` is also the host name of the rules API (/api/setup/rules/:host).
1204
1443
  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' },
1444
+ { id: 'claude', name: 'Claude Code', api: '/api/claude-code/mcp', configPath: '~/.claude.json' },
1445
+ { id: 'gemini', name: 'Gemini CLI', api: '/api/setup/gemini/mcp', configPath: '~/.gemini/settings.json' },
1446
+ { id: 'codex', name: 'Codex CLI', api: '/api/setup/codex/mcp', configPath: '~/.codex/config.toml' },
1447
+ { id: 'opencode', name: 'OpenCode', api: '/api/opencode/mcp', configPath: '~/.config/opencode/config.json' },
1210
1448
  ];
1211
1449
 
1212
1450
  // ═══════════════════════════════════════════
@@ -1286,10 +1524,11 @@ function goToStep(n) {
1286
1524
  function updateNav() {
1287
1525
  $prevBtn.disabled = currentStep === 0;
1288
1526
 
1289
- const labels = ['', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
1290
- $nextBtn.textContent = (labels[currentStep] || 'Next') + ' \u2192';
1527
+ const labels = ['Begin', 'Next', 'Next', 'Next', 'Next', 'Next', 'Next', 'Finish'];
1528
+ const label = currentStep === 6 && rulesPending ? 'Skip' : (labels[currentStep] || 'Next');
1529
+ $nextBtn.textContent = label + ' \u2192';
1291
1530
 
1292
- if (currentStep === 0 || currentStep === TOTAL_STEPS - 1) {
1531
+ if (currentStep === TOTAL_STEPS - 1) {
1293
1532
  $nextBtn.style.display = 'none';
1294
1533
  } else {
1295
1534
  $nextBtn.style.display = '';
@@ -1329,7 +1568,13 @@ function validateStep(n) {
1329
1568
  return true;
1330
1569
  }
1331
1570
  case 5: {
1332
- if (!wizardState.selectedTool) return false;
1571
+ // Allow advancing once any tool is toggled on OR the user copied the generic JSON.
1572
+ if (wizardState.enabledTools.length === 0 && !wizardState.mcpWritten) return false;
1573
+ // Default the restart hint (Step 7) to the first toggled-on tool; fall
1574
+ // back to Claude if only the generic JSON was copied.
1575
+ if (!wizardState.selectedTool) {
1576
+ wizardState.selectedTool = wizardState.enabledTools[0] || 'claude';
1577
+ }
1333
1578
  return true;
1334
1579
  }
1335
1580
  default:
@@ -1357,6 +1602,7 @@ async function onStepEnter(n) {
1357
1602
  }
1358
1603
  }
1359
1604
  if (n === 3) await onBuildStep();
1605
+ if (n === 5) await onToolIntegrationStep();
1360
1606
  if (n === 6) await onRulesetStep();
1361
1607
  if (n === 7) await onCompleteStep();
1362
1608
  // Re-measure after async content loads — but only if user is still on this step
@@ -1626,13 +1872,13 @@ function renderHappyBun() {}
1626
1872
  resizeViewport(0);
1627
1873
 
1628
1874
  try {
1629
- const buffer = await file.arrayBuffer();
1630
-
1875
+ // Post the File itself so the browser streams it from disk instead of
1876
+ // holding a multi-GB backup in memory.
1631
1877
  $statusText.textContent = 'Validating backup...';
1632
1878
  const previewRes = await fetch('/api/system/restore/preview', {
1633
1879
  method: 'POST',
1634
1880
  headers: { 'Content-Type': 'application/zip' },
1635
- body: buffer,
1881
+ body: file,
1636
1882
  });
1637
1883
  if (!previewRes.ok) {
1638
1884
  let errMsg = 'Invalid backup file';
@@ -1643,7 +1889,7 @@ function renderHappyBun() {}
1643
1889
 
1644
1890
  // Show confirmation
1645
1891
  $statusEl.style.display = 'none';
1646
- showRestoreConfirm(m, buffer);
1892
+ showRestoreConfirm(m, file);
1647
1893
 
1648
1894
  } catch (err) {
1649
1895
  $statusDot.className = 'wiz-status-dot red';
@@ -1652,7 +1898,7 @@ function renderHappyBun() {}
1652
1898
  }
1653
1899
  }
1654
1900
 
1655
- function showRestoreConfirm(m, buffer) {
1901
+ function showRestoreConfirm(m, file) {
1656
1902
  const fileCount = (m.files || []).length;
1657
1903
  const hasDb = !!(m.database);
1658
1904
 
@@ -1706,7 +1952,7 @@ function renderHappyBun() {}
1706
1952
  const restoreRes = await fetch('/api/system/restore', {
1707
1953
  method: 'POST',
1708
1954
  headers: { 'Content-Type': 'application/zip' },
1709
- body: buffer,
1955
+ body: file,
1710
1956
  });
1711
1957
  if (!restoreRes.ok) {
1712
1958
  let errMsg = 'Restore failed';
@@ -1801,31 +2047,71 @@ function renderHappyBun() {}
1801
2047
 
1802
2048
  async function onDepsStep() {
1803
2049
  const $list = document.getElementById('depList');
1804
- $list.innerHTML = '';
2050
+
2051
+ function createDepItem(name) {
2052
+ const li = document.createElement('li');
2053
+ li.className = 'dep-item checking visible';
2054
+
2055
+ const icon = document.createElement('div');
2056
+ icon.className = 'dep-icon';
2057
+
2058
+ const info = document.createElement('div');
2059
+ info.className = 'dep-info';
2060
+
2061
+ const title = document.createElement('div');
2062
+ title.className = 'dep-name';
2063
+ title.textContent = name;
2064
+
2065
+ const detail = document.createElement('div');
2066
+ detail.className = 'dep-detail';
2067
+ detail.textContent = 'Checking\u2026';
2068
+
2069
+ info.append(title, detail);
2070
+ li.append(icon, info);
2071
+ return li;
2072
+ }
2073
+
2074
+ function showCheckError(message) {
2075
+ const li = createDepItem('Environment check unavailable');
2076
+ li.classList.remove('checking');
2077
+ li.classList.add('fail');
2078
+ li.querySelector('.dep-icon').textContent = '!';
2079
+ li.querySelector('.dep-detail').textContent = message;
2080
+ $list.replaceChildren(li);
2081
+ resizeViewport(1);
2082
+ }
2083
+
2084
+ // Never leave this step blank while the server is still warming up.
2085
+ $list.replaceChildren(createDepItem('Node.js'), createDepItem('npm'));
2086
+ resizeViewport(1);
1805
2087
 
1806
2088
  let deps;
2089
+ const controller = new AbortController();
2090
+ const timeout = setTimeout(() => controller.abort(), 8000);
1807
2091
  try {
1808
- const res = await fetch('/api/setup/check-deps');
2092
+ const res = await fetch('/api/setup/check-deps', { signal: controller.signal });
2093
+ if (!res.ok) throw new Error(`Server returned ${res.status}`);
1809
2094
  const data = await res.json();
2095
+ if (!Array.isArray(data.deps) || data.deps.length === 0) {
2096
+ throw new Error('Server returned no dependency results');
2097
+ }
1810
2098
  deps = data.deps;
1811
- } catch {
1812
- $list.innerHTML = '<li style="color:var(--t-muted);font-size:13px;">Could not reach server.</li>';
2099
+ } catch (err) {
2100
+ showCheckError(err.name === 'AbortError'
2101
+ ? 'The server took too long to respond. Go back and try again.'
2102
+ : 'Could not complete the check. Make sure the SynaBun server is running.');
1813
2103
  return;
2104
+ } finally {
2105
+ clearTimeout(timeout);
1814
2106
  }
1815
2107
 
1816
- // Build all items hidden first
2108
+ // Replace the placeholders with the actual results. Keep them visible so a
2109
+ // slow response can never produce another empty panel.
1817
2110
  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);
2111
+ const li = createDepItem(dep.name || 'Dependency');
1827
2112
  return { li, dep };
1828
2113
  });
2114
+ $list.replaceChildren(...items.map(({ li }) => li));
1829
2115
 
1830
2116
  // Pre-size viewport to account for all items before animation
1831
2117
  resizeViewport(1);
@@ -1834,12 +2120,8 @@ async function onDepsStep() {
1834
2120
  for (let i = 0; i < items.length; i++) {
1835
2121
  const { li, dep } = items[i];
1836
2122
 
1837
- // Reveal with stagger
1838
- await wait(250);
1839
- li.classList.add('visible');
1840
-
1841
2123
  // Simulate a brief check delay, then resolve
1842
- await wait(400 + Math.random() * 200);
2124
+ await wait(180 + Math.random() * 100);
1843
2125
 
1844
2126
  li.classList.remove('checking');
1845
2127
  const icon = li.querySelector('.dep-icon');
@@ -2046,15 +2328,58 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2046
2328
  wizardState.projects.forEach((p, i) => {
2047
2329
  const card = document.createElement('div');
2048
2330
  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';
2331
+ 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';
2332
+ const safePath = p.path.replace(/\\/g, '/');
2050
2333
  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>
2334
+ <div style="display:flex;align-items:center;gap:10px">
2335
+ <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>
2336
+ <div style="flex:1;min-width:0">
2337
+ <div style="color:var(--t-bright);font-weight:500">${p.label}</div>
2338
+ <div style="color:var(--t-muted);font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap" title="${safePath}">${safePath}</div>
2339
+ </div>
2340
+ <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
2341
  </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
2342
  `;
2343
+ if (p.dubiousOwnership && !p.trusted) {
2344
+ const trustRow = document.createElement('div');
2345
+ trustRow.className = 'onboard-trust-row';
2346
+ 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)';
2347
+ trustRow.innerHTML = `
2348
+ <span>&#9888; Git ownership mismatch &mdash; workspace needs to be trusted</span>
2349
+ <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>
2350
+ `;
2351
+ const $btn = trustRow.querySelector('.onboard-trust-btn');
2352
+ $btn.addEventListener('click', async () => {
2353
+ $btn.disabled = true;
2354
+ $btn.textContent = 'Trusting...';
2355
+ try {
2356
+ const r = await fetch('/api/terminal/trust-workspace', {
2357
+ method: 'POST',
2358
+ headers: { 'Content-Type': 'application/json' },
2359
+ body: JSON.stringify({ path: p.trustPath || safePath }),
2360
+ });
2361
+ const d = await r.json();
2362
+ if (d.ok) {
2363
+ p.trusted = true;
2364
+ renderProjectList();
2365
+ } else {
2366
+ $btn.disabled = false;
2367
+ $btn.textContent = 'Trust workspace';
2368
+ $error.textContent = d.error || 'Trust failed';
2369
+ }
2370
+ } catch {
2371
+ $btn.disabled = false;
2372
+ $btn.textContent = 'Trust workspace';
2373
+ $error.textContent = 'Trust failed';
2374
+ }
2375
+ });
2376
+ card.appendChild(trustRow);
2377
+ } else if (p.trusted) {
2378
+ const okRow = document.createElement('div');
2379
+ okRow.style.cssText = 'font-size:11px;color:rgba(109,213,140,0.8)';
2380
+ okRow.textContent = '✓ Workspace trusted';
2381
+ card.appendChild(okRow);
2382
+ }
2058
2383
  card.querySelector('.onboard-project-remove').addEventListener('click', () => {
2059
2384
  wizardState.projects.splice(i, 1);
2060
2385
  renderProjectList();
@@ -2104,15 +2429,16 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2104
2429
 
2105
2430
  // Register via API
2106
2431
  $addBtn.innerHTML = '<div class="spinner" style="width:14px;height:14px"></div> Registering...';
2432
+ let integData = null;
2107
2433
  try {
2108
2434
  const res = await fetch('/api/claude-code/integrations', {
2109
2435
  method: 'POST',
2110
2436
  headers: { 'Content-Type': 'application/json' },
2111
2437
  body: JSON.stringify({ target: 'project', projectPath: folderPath, label }),
2112
2438
  });
2113
- const data = await res.json();
2114
- if (!data.ok) {
2115
- $error.textContent = data.error || 'Failed to register project.';
2439
+ integData = await res.json();
2440
+ if (!integData.ok) {
2441
+ $error.textContent = integData.error || 'Failed to register project.';
2116
2442
  $addBtn.disabled = false;
2117
2443
  $addBtn.innerHTML = origHTML;
2118
2444
  return;
@@ -2124,7 +2450,12 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2124
2450
  return;
2125
2451
  }
2126
2452
 
2127
- wizardState.projects.push({ path: folderPath, label });
2453
+ const projectEntry = { path: folderPath, label };
2454
+ if (integData && integData.dubiousOwnership && integData.trustPath) {
2455
+ projectEntry.dubiousOwnership = true;
2456
+ projectEntry.trustPath = integData.trustPath;
2457
+ }
2458
+ wizardState.projects.push(projectEntry);
2128
2459
  $addBtn.disabled = false;
2129
2460
  $addBtn.innerHTML = origHTML;
2130
2461
  renderProjectList();
@@ -2132,71 +2463,149 @@ document.getElementById('buildBtn').addEventListener('click', async () => {
2132
2463
  }
2133
2464
 
2134
2465
  // ═══════════════════════════════════════════
2135
- // STEP 5: Tool Selection
2466
+ // STEP 5: Tool Integration (install toggles + generic JSON fallback)
2136
2467
  // ═══════════════════════════════════════════
2137
2468
 
2138
- const $toolGrid = document.getElementById('toolGrid');
2469
+ const $toggleList = document.getElementById('mcpToggleList');
2470
+
2471
+ // Render one toggle row per installable tool. Statuses populate on enter.
2139
2472
  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);
2473
+ const row = document.createElement('div');
2474
+ row.className = 'mcp-toggle-row';
2475
+ row.dataset.id = t.id;
2476
+ row.innerHTML = `
2477
+ <div class="mtr-body">
2478
+ <div class="mtr-name">${t.name}</div>
2479
+ <div class="mtr-path" data-role="path">${t.configPath}</div>
2480
+ <div class="mtr-path" data-role="rules" style="display:none"></div>
2481
+ </div>
2482
+ <button class="mtr-toggle" data-role="toggle" aria-label="Toggle ${t.name}"></button>
2483
+ `;
2484
+ row.querySelector('[data-role="toggle"]').addEventListener('click', () => toggleTool(t.id));
2485
+ $toggleList.appendChild(row);
2146
2486
  });
2147
2487
 
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
- };
2488
+ async function onToolIntegrationStep() {
2489
+ // Fetch each provider's install state so toggles reflect reality.
2490
+ await Promise.all(TOOLS.map(async (t) => {
2491
+ try {
2492
+ const res = await fetch(t.api);
2493
+ const data = await res.json();
2494
+ const connected = !!data.connected;
2495
+ updateToggleRow(t.id, { connected });
2496
+ if (connected && !wizardState.enabledTools.includes(t.id)) {
2497
+ wizardState.enabledTools.push(t.id);
2498
+ }
2499
+ } catch { updateToggleRow(t.id, { connected: false }); }
2500
+ }));
2183
2501
  }
2184
2502
 
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 = '';
2503
+ function updateToggleRow(id, { connected, busy }) {
2504
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2505
+ if (!row) return;
2506
+ const toggle = row.querySelector('[data-role="toggle"]');
2507
+ const path = row.querySelector('[data-role="path"]');
2508
+ const tool = TOOLS.find(t => t.id === id);
2509
+ if (typeof connected === 'boolean') {
2510
+ row.classList.toggle('connected', connected);
2511
+ toggle.classList.toggle('on', connected);
2512
+ path.textContent = connected ? `Registered in ${tool.configPath}` : tool.configPath;
2513
+ }
2514
+ if (typeof busy === 'boolean') {
2515
+ toggle.classList.toggle('busy', busy);
2516
+ toggle.disabled = busy;
2517
+ }
2518
+ }
2196
2519
 
2520
+ // What the MCP toggle's response says about the tool's rules (its `rules`
2521
+ // object), as one line under the row: where they went, or why they did not.
2522
+ function showToggleRules(id, rules, { connected, wanted }) {
2523
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2524
+ const line = row?.querySelector('[data-role="rules"]');
2525
+ if (!line) return;
2526
+ let text = '';
2527
+ if (connected) {
2528
+ if (!rules) text = wanted ? `Rules not installed yet. ${RESTART_HINT}` : '';
2529
+ else if (rules.skipped) text = 'Rules not installed (you can install them in the next step)';
2530
+ else if (rules.ok === false) text = `Rules not installed: ${rules.error || rules.state || 'refused'}`;
2531
+ else if (rules.path) text = `Rules installed: ${rules.path}`;
2532
+ } else if (rules && rules.ok !== false && rules.kept && rules.kept.length) {
2533
+ // Disconnected. A copy the user edited is theirs: SynaBun left it where it is (and for OpenCode, so is a copy
2534
+ // their own line in config.json points at).
2535
+ text = `Your ${rules.kept[0].reason === 'listed-in-config' ? '' : 'edited '}rules were left in place: ${rules.kept[0].path}`;
2536
+ } else if (rules && rules.ok === false && rules.error) {
2537
+ // Disconnected, but rules could not be taken out (damaged markers, a symlink): say which and why.
2538
+ text = `Rules not removed: ${rules.error}`;
2539
+ }
2540
+ line.textContent = text;
2541
+ line.title = text;
2542
+ line.style.display = text ? '' : 'none';
2197
2543
  requestAnimationFrame(() => resizeViewport(currentStep));
2198
2544
  }
2199
2545
 
2546
+ async function toggleTool(id) {
2547
+ const tool = TOOLS.find(t => t.id === id);
2548
+ if (!tool) return;
2549
+ const row = $toggleList.querySelector(`[data-id="${id}"]`);
2550
+ const toggle = row.querySelector('[data-role="toggle"]');
2551
+ const wasOn = toggle.classList.contains('on');
2552
+ // Connecting a tool installs its rules too, unless the box is unchecked.
2553
+ const wantRules = document.getElementById('rulesInstallOpt')?.checked !== false;
2554
+ updateToggleRow(id, { busy: true });
2555
+ try {
2556
+ const res = await fetch(tool.api, wasOn ? { method: 'DELETE' } : {
2557
+ method: 'POST',
2558
+ headers: { 'Content-Type': 'application/json' },
2559
+ body: JSON.stringify(wantRules ? {} : { rules: false }),
2560
+ });
2561
+ const data = await res.json().catch(() => ({}));
2562
+ if (!res.ok || data.ok === false) {
2563
+ showMascotToast(data.error || `${tool.name} ${wasOn ? 'uninstall' : 'install'} failed`);
2564
+ updateToggleRow(id, { busy: false });
2565
+ return;
2566
+ }
2567
+ const nowOn = !wasOn;
2568
+ updateToggleRow(id, { connected: nowOn, busy: false });
2569
+ showToggleRules(id, data.rules, { connected: nowOn, wanted: wantRules });
2570
+ if (nowOn) {
2571
+ if (!wizardState.enabledTools.includes(id)) wizardState.enabledTools.push(id);
2572
+ wizardState.mcpWritten = true;
2573
+ showMascotToast(`${tool.name} connected`);
2574
+ } else {
2575
+ wizardState.enabledTools = wizardState.enabledTools.filter(x => x !== id);
2576
+ showMascotToast(`${tool.name} disconnected`);
2577
+ }
2578
+ } catch (err) {
2579
+ showMascotToast(`Failed: ${err.message}`);
2580
+ updateToggleRow(id, { busy: false });
2581
+ }
2582
+ }
2583
+
2584
+ // Generic MCP JSON for tools without a server integration (Cursor, Windsurf, other).
2585
+ function getGenericMcpJson() {
2586
+ const dataHome = (wizardState.dataHome || '').replace(/\\/g, '/');
2587
+ const pkgRoot = (wizardState.packageRoot || dataHome).replace(/\\/g, '/');
2588
+ const mcpPath = pkgRoot + '/mcp-server/run.mjs';
2589
+ const envPath = dataHome + '/.env';
2590
+ const env = { DOTENV_PATH: envPath, SYNABUN_DATA_HOME: dataHome, MEMORY_DATA_DIR: dataHome + '/mcp-data' };
2591
+ // A packaged application is started through its own executable; the server says which.
2592
+ const packaged = wizardState.mcpCommand && wizardState.mcpCommand !== 'node';
2593
+ const command = packaged ? wizardState.mcpCommand : 'node';
2594
+ const args = packaged ? wizardState.mcpArgs : [mcpPath];
2595
+ return JSON.stringify({ mcpServers: { SynaBun: { command, args, env } } }, null, 2);
2596
+ }
2597
+
2598
+ // "Other providers" collapsible — shows the generic MCP JSON for paste-based setups.
2599
+ const $otherHeader = document.getElementById('mcpOtherHeader');
2600
+ const $otherBody = document.getElementById('mcpOtherBody');
2601
+ const $otherSection = document.getElementById('mcpOtherSection');
2602
+ $otherHeader.addEventListener('click', () => {
2603
+ const isOpen = $otherSection.classList.toggle('open');
2604
+ $otherBody.style.display = isOpen ? '' : 'none';
2605
+ if (isOpen) document.getElementById('mcpSetupCode').textContent = getGenericMcpJson();
2606
+ requestAnimationFrame(() => resizeViewport(currentStep));
2607
+ });
2608
+
2200
2609
  function showMascotToast(msg, duration = 2000) {
2201
2610
  const toast = document.getElementById('mascotToast');
2202
2611
  if (!toast) return;
@@ -2207,6 +2616,7 @@ function showMascotToast(msg, duration = 2000) {
2207
2616
 
2208
2617
  document.getElementById('mcpCodeWrap').addEventListener('click', () => {
2209
2618
  const code = document.getElementById('mcpSetupCode').textContent;
2619
+ if (!code) return;
2210
2620
  navigator.clipboard.writeText(code);
2211
2621
  wizardState.mcpWritten = true;
2212
2622
  const label = document.querySelector('#mcpCodeWrap .code-copy-label');
@@ -2217,47 +2627,255 @@ document.getElementById('mcpCodeWrap').addEventListener('click', () => {
2217
2627
  });
2218
2628
 
2219
2629
  // ═══════════════════════════════════════════
2220
- // STEP 6: Ruleset
2630
+ // STEP 6: Install SynaBun rules
2221
2631
  // ═══════════════════════════════════════════
2632
+ // The installer, as Settings → AI connections → SynaBun rules shows it: one
2633
+ // button that installs the rules for every connected tool, then one row per
2634
+ // tool with where its rules live, what state they are in (GET /api/setup/rules)
2635
+ // and the action that state calls for, and under them what the installer
2636
+ // answered. The calls are the shared client's (shared/api.js). What a state is
2637
+ // called, which action it gets and every sentence about it come from
2638
+ // shared/settings/settings-rules.js and the Settings strings (i18n/en.json), so
2639
+ // the two surfaces cannot drift apart. Nothing is pasted in this step: the two
2640
+ // boxes under "Manual setup" hold what SynaBun cannot install (Cursor's User
2641
+ // Rules, the coexistence snippet). Nothing here has to be clicked to continue.
2642
+
2643
+ const RESTART_HINT = 'Restart SynaBun to finish this update.';
2644
+ const RULES_SETTINGS_PATH = 'Settings → AI connections → SynaBun rules';
2645
+ let rulesStatus = null; // null: the route is missing or failed
2646
+ let rulesTx = null; // the Settings strings; null until they are loaded
2647
+ let rulesReport = null; // what the last install answered: { message, note, ok }
2648
+ let rulesBusy = false; // an install is on its way: every button of the step waits
2649
+ let rulesViewHost = ''; // the tool whose rules text is open under the list
2650
+ const rulesTextCache = {};
2651
+
2652
+ // The wizard's names for the tools (the ones Step 5 shows), for every sentence that names one.
2653
+ const RULES_TOOL_NAMES = Object.fromEntries(TOOLS.map(t => [t.id, t.name]));
2654
+ const ruleToolNames = (hosts) => hosts.map(host => RULES_TOOL_NAMES[host] || host).join(', ');
2655
+
2656
+ // The words of this step are the Settings ones. One request; a failed one is tried again on the next visit.
2657
+ async function loadRulesStrings() {
2658
+ if (rulesTx) return rulesTx;
2659
+ try {
2660
+ const res = await fetch('/i18n/en.json');
2661
+ if (res.ok) rulesTx = catalogueTranslator(await res.json());
2662
+ } catch { /* the step says so and offers to try again */ }
2663
+ return rulesTx;
2664
+ }
2222
2665
 
2223
- async function onRulesetStep() {
2224
- const tool = TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0];
2225
- document.getElementById('rulesetFileName').textContent = tool.instrFile;
2666
+ // The rendered text for a host, from the rules route or the older read-only endpoint.
2667
+ async function loadRulesText(host) {
2668
+ if (!rulesTextCache[host]) rulesTextCache[host] = await fetchRulesTextWithFallback(host);
2669
+ return rulesTextCache[host];
2670
+ }
2226
2671
 
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';
2672
+ function enabledRuleTools() {
2673
+ return wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean);
2674
+ }
2230
2675
 
2231
- const $code = document.getElementById('rulesetCode');
2232
- if ($code.dataset.loadedFormat === format) return; // already loaded
2676
+ function renderRulesStep() {
2677
+ const el = (id) => document.getElementById(id);
2678
+ const tx = rulesTx;
2679
+ const plan = rulesInstallPlan(rulesStatus);
2680
+ const ready = !!tx && !!rulesStatus;
2681
+
2682
+ // What stands in the way, if anything: the step's own text, the installer, or no connected tool.
2683
+ const note = !tx ? 'This step could not load its text. Check that SynaBun is running, then try again.'
2684
+ : !rulesStatus ? `The rules installer did not answer. ${RESTART_HINT} The rules can also be installed later in ${RULES_SETTINGS_PATH}.`
2685
+ : !plan.connected.length ? 'No tool is connected yet. Connect one in the previous step and its rules are installed with it.'
2686
+ : '';
2687
+ const $note = el('rulesNote');
2688
+ $note.textContent = note;
2689
+ if (note && !ready) {
2690
+ const retry = document.createElement('button');
2691
+ retry.type = 'button';
2692
+ retry.textContent = 'Try again';
2693
+ retry.disabled = rulesBusy;
2694
+ retry.addEventListener('click', () => onRulesetStep());
2695
+ $note.appendChild(retry);
2696
+ }
2697
+ $note.style.display = note ? '' : 'none';
2698
+
2699
+ // The primary action, while a connected tool still has rules to install or update.
2700
+ rulesPending = ready && plan.pending.length > 0;
2701
+ el('rulesInstallAll').style.display = rulesPending ? '' : 'none';
2702
+ if (tx) {
2703
+ el('rulesInstallAllHelp').textContent = tx('settings.redesign.control.set002.help');
2704
+ el('rulesInstallAllBtn').textContent = tx('settings.redesign.control.set002.label');
2705
+ el('rulesCursorHelp').textContent = tx('settings.redesign.setup.cursorHelp');
2706
+ el('rulesCoexistHelp').textContent = tx('settings.redesign.setup.coexistHelp');
2707
+ }
2708
+ el('rulesInstallAllBtn').disabled = rulesBusy;
2709
+
2710
+ // The result: what the last install answered, or, with nothing left to install, the rules that are in place
2711
+ // (the toggles of Step 5 installed them) and the file each tool reads.
2712
+ const report = rulesReport || (ready && !rulesPending ? describeRulesInPlace(rulesStatus, { tx, labels: RULES_TOOL_NAMES }) : null);
2713
+ const $result = el('rulesResult');
2714
+ $result.style.display = report ? '' : 'none';
2715
+ if (report) {
2716
+ $result.className = 'rules-result ' + (report.ok === false ? 'fail' : 'ok');
2717
+ el('rulesResultMessage').textContent = report.message;
2718
+ el('rulesResultWhere').textContent = report.note || '';
2719
+ el('rulesResultWhere').style.display = report.note ? '' : 'none';
2720
+ }
2721
+
2722
+ // One row per tool that has rules or is connected. Without a status only the tools connected in Step 5 are known.
2723
+ const $list = el('rulesList');
2724
+ $list.innerHTML = '';
2725
+ const idle = [];
2726
+ for (const tool of (tx ? (rulesStatus ? TOOLS : enabledRuleTools()) : [])) {
2727
+ const info = rulesStatus?.hosts?.[tool.id];
2728
+ const view = describeRulesHost(info, { label: tool.name, version: rulesStatus?.version, tx });
2729
+ // Rules are for a tool that talks to SynaBun. One that is not connected and has none is only named, under
2730
+ // the list: connecting it in Step 5 installs them.
2731
+ if (view.known && view.state === 'not-installed' && !plan.connected.includes(tool.id)) { idle.push(tool.name); continue; }
2732
+ const row = document.createElement('div');
2733
+ row.className = 'mcp-toggle-row' + (view.good ? ' connected' : '') + (view.note ? ' has-note' : '');
2734
+ row.dataset.host = tool.id;
2735
+ row.innerHTML = `
2736
+ <div class="mtr-body">
2737
+ <div class="mtr-name">${tool.name}<span class="mtr-state${view.good ? ' ok' : ''}" data-role="state"></span></div>
2738
+ <div class="mtr-path" data-role="path"></div>
2739
+ <div class="mtr-note" data-role="note" style="display:none"></div>
2740
+ </div>
2741
+ <div class="rules-actions">
2742
+ ${view.action ? '<button type="button" class="primary" data-role="primary"></button>' : ''}
2743
+ ${view.known ? '<button type="button" data-role="view"></button>' : ''}
2744
+ </div>
2745
+ `;
2746
+ row.querySelector('[data-role="state"]').textContent = view.badge;
2747
+ const $path = row.querySelector('[data-role="path"]');
2748
+ $path.textContent = view.pathText;
2749
+ $path.title = view.path;
2750
+ const $rowNote = row.querySelector('[data-role="note"]');
2751
+ $rowNote.textContent = view.note;
2752
+ $rowNote.style.display = view.note ? '' : 'none';
2753
+ const $primary = row.querySelector('[data-role="primary"]');
2754
+ if ($primary) {
2755
+ $primary.textContent = view.actionLabel;
2756
+ $primary.disabled = rulesBusy;
2757
+ $primary.addEventListener('click', () => installToolRules(tool));
2758
+ }
2759
+ const $view = row.querySelector('[data-role="view"]');
2760
+ if ($view) {
2761
+ $view.textContent = tx(rulesViewHost === tool.id ? 'settings.redesign.setup.hide' : 'settings.redesign.setup.view');
2762
+ $view.setAttribute('aria-expanded', String(rulesViewHost === tool.id));
2763
+ $view.setAttribute('aria-controls', 'rulesViewCode');
2764
+ $view.addEventListener('click', () => viewRules(tool));
2765
+ }
2766
+ $list.appendChild(row);
2767
+ }
2768
+ el('rulesViewCode').style.display = rulesViewHost && $list.querySelector(`[data-host="${rulesViewHost}"] [data-role="view"]`) ? '' : 'none';
2769
+ // The other tools, in one line. With no tool connected at all, the note at the top already says it.
2770
+ const $idle = el('rulesIdle');
2771
+ $idle.textContent = idle.length && plan.connected.length ? `${tx('settings.redesign.setup.notConnected')}: ${idle.join(', ')}. Connecting a tool in the previous step installs its rules.` : '';
2772
+ $idle.style.display = $idle.textContent ? '' : 'none';
2233
2773
 
2234
- $code.textContent = 'Loading...';
2774
+ updateNav();
2775
+ requestAnimationFrame(() => resizeViewport(currentStep));
2776
+ }
2777
+
2778
+ // Run one install, keep what it answered for the result line, then read the status again.
2779
+ async function runRulesInstall(work) {
2780
+ if (rulesBusy) return;
2781
+ rulesBusy = true;
2782
+ renderRulesStep();
2235
2783
  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
- }
2245
- } catch {
2246
- $code.textContent = 'Failed to load ruleset.';
2784
+ rulesReport = await work();
2785
+ } catch (err) {
2786
+ // The server's own sentence (an edited copy, damaged markers, another SynaBun at work). A route that is not
2787
+ // there is the server that was not restarted.
2788
+ const message = err?.message === 'HTTP 404' ? RESTART_HINT : (err?.message || rulesTx('settings.redesign.setup.rulesActionFailed'));
2789
+ rulesReport = { message, note: '', ok: false };
2790
+ }
2791
+ rulesStatus = await fetchRulesStatus();
2792
+ rulesBusy = false;
2793
+ renderRulesStep();
2794
+ }
2795
+
2796
+ // "Install for all": every connected tool, by the installer's own rule. Same call as the button in Settings.
2797
+ function installAllToolRules() {
2798
+ runRulesInstall(async () => {
2799
+ const report = describeRulesInstallAll(await installAllRules(), { tx: rulesTx, labels: RULES_TOOL_NAMES });
2800
+ return { message: report.message, note: report.note, ok: report.failed.length === 0 };
2801
+ });
2802
+ }
2803
+
2804
+ // One tool's Install, Update or Replace. Replace is behind the confirm that says the edited copy is backed up.
2805
+ function installToolRules(tool) {
2806
+ const view = describeRulesHost(rulesStatus?.hosts?.[tool.id], { label: tool.name, version: rulesStatus?.version, tx: rulesTx });
2807
+ if (!view.action) return;
2808
+ if (view.force && !confirm(rulesTx('settings.redesign.setup.replaceYourEditedRulesWithSynabun', { label: tool.name }))) return;
2809
+ delete rulesTextCache[tool.id];
2810
+ runRulesInstall(async () => {
2811
+ const result = await installRules(tool.id, { force: view.force });
2812
+ return { message: describeRulesInstall(result, view.state, { label: tool.name, tx: rulesTx }), note: '', ok: true };
2813
+ });
2814
+ }
2815
+
2816
+ // View shows the exact text a tool receives, under the list; a second press hides it.
2817
+ async function viewRules(tool) {
2818
+ const $code = document.getElementById('rulesViewCode');
2819
+ if (rulesViewHost === tool.id) {
2820
+ rulesViewHost = '';
2821
+ } else {
2822
+ try { $code.textContent = await loadRulesText(tool.id); }
2823
+ catch { $code.textContent = rulesTx('settings.redesign.setup.couldNotLoadTheRules', { label: tool.name, RESTART_HINT }); }
2824
+ $code.setAttribute('aria-label', rulesTx('settings.redesign.setup.previewRules', { name: tool.name }));
2825
+ rulesViewHost = tool.id;
2247
2826
  }
2248
- if (currentStep === 6) resizeViewport(6);
2827
+ renderRulesStep();
2249
2828
  }
2250
2829
 
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);
2260
- });
2830
+ document.getElementById('rulesInstallAllBtn').addEventListener('click', () => installAllToolRules());
2831
+
2832
+ // A click-to-copy code box (the pattern of the MCP JSON box in Step 5). The
2833
+ // label says "copied!" only once the clipboard took the text; a browser that
2834
+ // refuses (no permission, no focus, no secure context) gets "copy failed".
2835
+ function wireRulesCopyBox(wrapId, codeId) {
2836
+ document.getElementById(wrapId).addEventListener('click', async () => {
2837
+ const $code = document.getElementById(codeId);
2838
+ if (!$code.dataset.loaded) return;
2839
+ const label = document.querySelector(`#${wrapId} .code-copy-label`);
2840
+ let copied = false;
2841
+ try {
2842
+ await navigator.clipboard.writeText($code.textContent);
2843
+ copied = true;
2844
+ } catch { /* reported on the label below */ }
2845
+ label.textContent = copied ? 'copied!' : 'copy failed';
2846
+ label.style.opacity = '1';
2847
+ clearTimeout(label._timer);
2848
+ label._timer = setTimeout(() => { label.textContent = 'copy'; label.style.opacity = ''; }, copied ? 2000 : 4000);
2849
+ });
2850
+ }
2851
+
2852
+ // A collapsible copy-only section, for text SynaBun cannot install: loads it the first time it opens.
2853
+ function wireRulesExtra(sectionId, headerId, bodyId, wrapId, codeId, host, name) {
2854
+ const $section = document.getElementById(sectionId);
2855
+ const $body = document.getElementById(bodyId);
2856
+ const $code = document.getElementById(codeId);
2857
+ document.getElementById(headerId).addEventListener('click', async () => {
2858
+ const isOpen = $section.classList.toggle('open');
2859
+ $body.style.display = isOpen ? '' : 'none';
2860
+ if (isOpen && !$code.dataset.loaded) {
2861
+ $code.textContent = 'Loading...';
2862
+ try { $code.textContent = await loadRulesText(host); $code.dataset.loaded = '1'; }
2863
+ catch { $code.textContent = `The ${name} could not be loaded. ${RESTART_HINT}`; }
2864
+ }
2865
+ requestAnimationFrame(() => resizeViewport(currentStep));
2866
+ });
2867
+ wireRulesCopyBox(wrapId, codeId);
2868
+ }
2869
+
2870
+ wireRulesExtra('rulesCursorSection', 'rulesCursorHeader', 'rulesCursorBody', 'rulesCursorWrap', 'rulesCursorCode', 'cursor', 'Cursor rules');
2871
+ wireRulesExtra('rulesCoexistSection', 'rulesCoexistHeader', 'rulesCoexistBody', 'rulesCoexistWrap', 'rulesCoexistCode', 'coexistence', 'coexistence snippet');
2872
+
2873
+ async function onRulesetStep() {
2874
+ rulesReport = null;
2875
+ [rulesStatus] = await Promise.all([fetchRulesStatus(), loadRulesStrings()]);
2876
+ renderRulesStep();
2877
+ if (currentStep === 6) resizeViewport(6);
2878
+ }
2261
2879
 
2262
2880
  // ═══════════════════════════════════════════
2263
2881
  // STEP 7: Complete
@@ -2266,11 +2884,14 @@ document.getElementById('rulesetCodeWrap').addEventListener('click', () => {
2266
2884
  async function onCompleteStep() {
2267
2885
  renderHappyBun();
2268
2886
 
2269
- const tool = TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0];
2270
- document.getElementById('restartToolName').textContent = tool.name;
2887
+ // List every tool the user toggled on; fall back to the selected tool if none.
2888
+ const enabled = wizardState.enabledTools.length
2889
+ ? wizardState.enabledTools.map(id => TOOLS.find(t => t.id === id)).filter(Boolean)
2890
+ : [TOOLS.find(t => t.id === wizardState.selectedTool) || TOOLS[0]];
2891
+ document.getElementById('restartToolName').textContent = enabled.map(t => t.name).join(', ');
2271
2892
 
2272
- // Auto-register hooks globally for Claude Code users
2273
- if (tool.id === 'claude') {
2893
+ // Auto-register hooks globally when Claude Code was toggled on
2894
+ if (enabled.some(t => t.id === 'claude')) {
2274
2895
  try {
2275
2896
  await fetch('/api/claude-code/integrations', {
2276
2897
  method: 'POST',
@@ -2281,12 +2902,23 @@ async function onCompleteStep() {
2281
2902
  } catch { /* non-critical — user can enable via Settings later */ }
2282
2903
  }
2283
2904
 
2905
+ // Rules count as installed when every connected tool has its copy in place. When they are not, the item says
2906
+ // for which tools and where the installer is from now on.
2907
+ rulesStatus = await fetchRulesStatus();
2908
+ const rulesPlan = rulesInstallPlan(rulesStatus);
2909
+ const rulesMissing = rulesPlan.connected.filter(host => !rulesPlan.inPlace.includes(host));
2910
+ const rulesInstalled = rulesPlan.connected.length > 0 && rulesMissing.length === 0;
2911
+ const rulesLabel = rulesInstalled ? 'Rules installed'
2912
+ : !rulesStatus ? `Rules not installed: the installer did not answer (${RULES_SETTINGS_PATH})`
2913
+ : !rulesPlan.connected.length ? 'Rules not installed: no tool is connected'
2914
+ : `Rules not installed for ${ruleToolNames(rulesMissing)} (${RULES_SETTINGS_PATH})`;
2915
+
2284
2916
  const items = [
2285
2917
  { label: 'Memory name set', done: !!wizardState.collectionName },
2286
2918
  { label: 'Dependencies installed & MCP built', done: wizardState.buildReady },
2287
2919
  { label: 'Projects registered', done: (wizardState.projects || []).length > 0 },
2288
- { label: 'MCP config copied', done: wizardState.mcpWritten },
2289
- { label: 'Ruleset copied', done: !!wizardState.rulesetCopied },
2920
+ { label: 'AI tool integration enabled', done: wizardState.enabledTools.length > 0 || wizardState.mcpWritten },
2921
+ { label: rulesLabel, done: rulesInstalled },
2290
2922
  ];
2291
2923
 
2292
2924
  const $list = document.getElementById('checklist');
@@ -2317,11 +2949,22 @@ async function init() {
2317
2949
  window.location.href = '/';
2318
2950
  return;
2319
2951
  }
2320
- if (data.projectDir) {
2321
- wizardState.projectRoot = data.projectDir;
2952
+ if (data.dataHome) {
2953
+ wizardState.dataHome = data.dataHome;
2954
+ }
2955
+ if (data.packageRoot) {
2956
+ wizardState.packageRoot = data.packageRoot;
2957
+ }
2958
+ if (data.mcpCommand && Array.isArray(data.mcpArgs)) {
2959
+ wizardState.mcpCommand = data.mcpCommand;
2960
+ wizardState.mcpArgs = data.mcpArgs;
2322
2961
  }
2323
2962
  } catch {}
2324
2963
 
2964
+ // Enable the entrance animation only after every top-level initializer has
2965
+ // run successfully. Until this point the static welcome remains usable and
2966
+ // visible instead of collapsing to a navigation-only shell.
2967
+ document.documentElement.classList.add('onboarding-animated');
2325
2968
  updateNav();
2326
2969
  startMascot();
2327
2970
  // Resize after mascot SVG is injected so scrollHeight includes it