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
package/setup.js CHANGED
@@ -1,260 +1,872 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * SynaBun — Single-command setup & launch
5
- *
6
- * Usage: node setup.js (or: npm start)
7
- *
8
- * 1. Checks Node.js version (>=22)
9
- * 2. Installs npm deps for neural-interface/ and mcp-server/
10
- * 3. Builds the MCP server TypeScript (if dist/ is missing or stale)
11
- * 4. Starts the Neural Interface Express server
12
- * 5. Auto-opens browser to onboarding wizard (or main page if setup complete)
13
- */
14
-
15
- import { execSync, spawn, exec } from 'node:child_process';
16
- import { existsSync, readFileSync, statSync } from 'node:fs';
17
- import { resolve, dirname } from 'node:path';
18
- import { fileURLToPath } from 'node:url';
19
- import { platform } from 'node:os';
20
-
21
- const __dirname = dirname(fileURLToPath(import.meta.url));
22
-
23
- // ── ANSI color helpers ──
24
-
25
- const c = {
26
- reset: '\x1b[0m',
27
- bold: '\x1b[1m',
28
- dim: '\x1b[2m',
29
- cyan: '\x1b[36m',
30
- green: '\x1b[32m',
31
- yellow: '\x1b[33m',
32
- red: '\x1b[31m',
33
- };
34
-
35
- function ok(msg) { console.log(` ${c.green}\u2713${c.reset} ${msg}`); }
36
- function warn(msg) { console.log(` ${c.yellow}!${c.reset} ${msg}`); }
37
- function fail(msg) { console.log(` ${c.red}\u2717${c.reset} ${msg}`); }
38
- function info(msg) { console.log(` ${c.cyan}\u2192${c.reset} ${msg}`); }
39
-
40
- // ── Phase 1: Prerequisite checks ──
41
-
42
- function checkNodeVersion() {
43
- const [major] = process.versions.node.split('.').map(Number);
44
- if (major < 22) {
45
- fail(`Node.js 22+ required, found v${process.versions.node}`);
46
- process.exit(1);
47
- }
48
- ok(`Node.js v${process.versions.node}`);
49
- }
50
-
51
- // ── Phase 2: Dependency installation ──
52
-
53
- function needsInstall(dir) {
54
- // Check for .package-lock.json which npm creates after a successful install
55
- // A bare node_modules/ directory (e.g. from a failed npx or partial install) is not enough
56
- return !existsSync(resolve(dir, 'node_modules', '.package-lock.json'));
57
- }
58
-
59
- function installDeps(name, dir) {
60
- if (!needsInstall(dir)) {
61
- ok(`${name} dependencies already installed`);
62
- return;
63
- }
64
-
65
- info(`Installing ${name} dependencies...`);
66
- try {
67
- execSync('npm install', {
68
- cwd: dir,
69
- stdio: 'inherit',
70
- timeout: 300_000,
71
- });
72
- ok(`${name} dependencies installed`);
73
- } catch (err) {
74
- fail(`Failed to install ${name} dependencies`);
75
- console.error(err.stderr?.toString() || err.message);
76
- process.exit(1);
77
- }
78
- }
79
-
80
- // ── Phase 3: Playwright Chromium (for browser automation) ──
81
-
82
- function installPlaywrightChromium() {
83
- const niDir = resolve(__dirname, 'neural-interface');
84
- // Check if already installed by resolving the executable path
85
- try {
86
- const result = execSync('node -e "const pw=require(\'playwright\');const p=pw.chromium.executablePath();process.stdout.write(p)"', {
87
- cwd: niDir, encoding: 'utf8', timeout: 10_000,
88
- });
89
- if (existsSync(result)) {
90
- ok('Playwright Chromium already installed');
91
- return;
92
- }
93
- } catch { /* not installed */ }
94
-
95
- info('Installing Playwright Chromium (for browser automation)...');
96
- try {
97
- execSync('npx playwright install chromium', {
98
- cwd: niDir,
99
- stdio: 'inherit',
100
- timeout: 120_000,
101
- });
102
- ok('Playwright Chromium installed');
103
- } catch (err) {
104
- // Non-fatal — system Chrome will be used as fallback
105
- console.log(' (optional) Playwright Chromium install failed — system Chrome will be used');
106
- }
107
- }
108
-
109
- // ── Phase 4: MCP server build ──
110
-
111
- function needsBuild() {
112
- const distIndex = resolve(__dirname, 'mcp-server', 'dist', 'index.js');
113
- if (!existsSync(distIndex)) return true;
114
-
115
- const srcIndex = resolve(__dirname, 'mcp-server', 'src', 'index.ts');
116
- try {
117
- return statSync(srcIndex).mtimeMs > statSync(distIndex).mtimeMs;
118
- } catch {
119
- return true;
120
- }
121
- }
122
-
123
- function buildMcpServer() {
124
- if (!needsBuild()) {
125
- ok('MCP server already built');
126
- return;
127
- }
128
-
129
- info('Building MCP server...');
130
- try {
131
- execSync('npm run build', {
132
- cwd: resolve(__dirname, 'mcp-server'),
133
- stdio: 'pipe',
134
- timeout: 60_000,
135
- });
136
- ok('MCP server built');
137
- } catch (err) {
138
- fail('MCP server build failed');
139
- console.error(err.stderr?.toString() || err.message);
140
- process.exit(1);
141
- }
142
- }
143
-
144
- // ── Phase 4: Setup state detection ──
145
-
146
- function isSetupComplete() {
147
- const envPath = resolve(__dirname, '.env');
148
- try {
149
- const content = readFileSync(envPath, 'utf-8');
150
- for (const line of content.split('\n')) {
151
- const trimmed = line.trim();
152
- if (trimmed.startsWith('SETUP_COMPLETE=')) {
153
- return trimmed.split('=')[1] === 'true';
154
- }
155
- }
156
- } catch {}
157
- return false;
158
- }
159
-
160
- // ── Phase 5: Server launch + browser open ──
161
-
162
- function openBrowser(url) {
163
- const plat = platform();
164
- const fallback = () => { warn('Could not open browser automatically'); info(`Open manually: ${url}`); };
165
-
166
- if (plat === 'win32') {
167
- exec(`start "" "${url}"`, (err) => { if (err) fallback(); });
168
- } else if (plat === 'darwin') {
169
- exec(`open "${url}"`, (err) => { if (err) fallback(); });
170
- } else {
171
- exec(`xdg-open "${url}"`, (err) => { if (err) fallback(); });
172
- }
173
- }
174
-
175
- function startServer() {
176
- const serverPath = resolve(__dirname, 'neural-interface', 'server.js');
177
-
178
- info('Starting Neural Interface server...');
179
- console.log('');
180
-
181
- const child = spawn('node', [serverPath], {
182
- cwd: resolve(__dirname, 'neural-interface'),
183
- stdio: ['ignore', 'pipe', 'pipe'],
184
- });
185
-
186
- let opened = false;
187
- const setupComplete = isSetupComplete();
188
-
189
- child.stdout.on('data', (data) => {
190
- process.stdout.write(data.toString());
191
-
192
- if (!opened && data.toString().includes('Server:')) {
193
- opened = true;
194
- const port = data.toString().match(/Server:\s+http:\/\/localhost:(\d+)/)?.[1] || '3344';
195
- const url = `http://localhost:${port}${setupComplete ? '/' : '/onboarding.html'}`;
196
-
197
- if (!setupComplete) setTimeout(() => openBrowser(url), 1500);
198
- }
199
- });
200
-
201
- child.stderr.on('data', (data) => {
202
- process.stderr.write(data.toString());
203
- });
204
-
205
- child.on('exit', (code) => {
206
- if (code !== 0 && code !== null) {
207
- fail(`Server exited with code ${code}`);
208
- process.exit(code);
209
- }
210
- });
211
-
212
- // Clean shutdown on Ctrl+C
213
- process.on('SIGINT', () => { child.kill('SIGINT'); process.exit(0); });
214
- process.on('SIGTERM', () => { child.kill('SIGTERM'); process.exit(0); });
215
- }
216
-
217
- // ── Main ──
218
-
219
- function main() {
220
- console.log('');
221
- console.log(` ${c.cyan}╔═══════════════════════════════════╗${c.reset}`);
222
- console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
223
- console.log(` ${c.cyan}║${c.reset} ${c.bold}${c.cyan}[██] [██]${c.reset} ${c.bold}${c.cyan}SynaBun${c.reset} ${c.cyan}║${c.reset}`);
224
- console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
225
- console.log(` ${c.cyan}║${c.reset} ${c.dim}Persistent Vector Memory${c.reset} ${c.cyan}║${c.reset}`);
226
- console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
227
- console.log(` ${c.cyan}╚═══════════════════════════════════╝${c.reset}`);
228
- console.log(` ${c.dim}synabun.ai${c.reset}`);
229
- console.log('');
230
-
231
- // Prerequisites
232
- checkNodeVersion();
233
- console.log('');
234
-
235
- // Dependencies
236
- installDeps('Neural Interface', resolve(__dirname, 'neural-interface'));
237
- installDeps('MCP Server', resolve(__dirname, 'mcp-server'));
238
- console.log('');
239
-
240
- // Playwright browser
241
- installPlaywrightChromium();
242
- console.log('');
243
-
244
- // Build
245
- buildMcpServer();
246
- console.log('');
247
-
248
- // State
249
- if (isSetupComplete()) {
250
- ok('Setup already complete');
251
- } else {
252
- info('First-time setup \u2014 opening onboarding wizard');
253
- }
254
- console.log('');
255
-
256
- // Launch
257
- startServer();
258
- }
259
-
260
- main();
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * SynaBun — Single-command setup & launch
5
+ *
6
+ * Usage: node setup.js (or: npm start)
7
+ *
8
+ * 1. Checks Node.js version (>=22)
9
+ * 2. Ensures data directory exists (~/.synabun or %APPDATA%/synabun)
10
+ * 3. Migrates data from old scaffolded installs if detected
11
+ * 4. Installs npm deps for neural-interface/ and mcp-server/
12
+ * 5. Builds the MCP server TypeScript (if dist/ is missing or stale)
13
+ * 6. Takes a verified snapshot of user state before a new version first runs
14
+ * (lib/first-launch-protection.js). If it cannot, the launch stops here.
15
+ * 7. Starts the Neural Interface Express server
16
+ * 8. Auto-opens browser to onboarding wizard (or main page if setup complete)
17
+ */
18
+
19
+ import { execSync, spawn, exec } from 'node:child_process';
20
+ import { existsSync, readFileSync, writeFileSync, cpSync, readdirSync, mkdirSync, unlinkSync, createWriteStream, statSync, renameSync } from 'node:fs';
21
+ import { resolve, dirname } from 'node:path';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { platform } from 'node:os';
24
+ import {
25
+ getDataHome,
26
+ getDataHomeDiagnostics,
27
+ getPlatformDataHome,
28
+ ensureDataDirs,
29
+ PACKAGE_ROOT,
30
+ } from './lib/paths.js';
31
+ import {
32
+ DATA_HOME_MANIFEST,
33
+ acknowledgeLegacyDataRoot,
34
+ dataHomeHasState,
35
+ inspectDataHome,
36
+ migrateDataHome,
37
+ planDataHomeMigration,
38
+ resolveDataHomeConflict,
39
+ } from './lib/data-home-migration.js';
40
+ import { auditAndRepairClientConfigs } from './lib/client-config-repair.js';
41
+ import {
42
+ SNAPSHOT_FAILED_EXIT_CODE,
43
+ describeSnapshotFailure,
44
+ protectFirstLaunchAfterUpdate,
45
+ recordLauncherFailure,
46
+ } from './lib/first-launch-protection.js';
47
+ import { noteSupervisorFailure, openSupervisorRecord, registerStartLauncher } from './lib/start-launcher.js';
48
+ import { packagedRuntime } from './lib/packaged-runtime.js';
49
+
50
+ const __dirname = dirname(fileURLToPath(import.meta.url));
51
+
52
+ // ── ANSI color helpers ──
53
+
54
+ const c = {
55
+ reset: '\x1b[0m',
56
+ bold: '\x1b[1m',
57
+ dim: '\x1b[2m',
58
+ cyan: '\x1b[36m',
59
+ green: '\x1b[32m',
60
+ yellow: '\x1b[33m',
61
+ red: '\x1b[31m',
62
+ };
63
+
64
+ function ok(msg) { console.log(` ${c.green}\u2713${c.reset} ${msg}`); }
65
+ function warn(msg) { console.log(` ${c.yellow}!${c.reset} ${msg}`); }
66
+ function fail(msg) { console.log(` ${c.red}\u2717${c.reset} ${msg}`); }
67
+ function info(msg) { console.log(` ${c.cyan}\u2192${c.reset} ${msg}`); }
68
+
69
+ // ── Data home resolution ──
70
+
71
+ const REQUESTED_DATA_HOME = getDataHome();
72
+ const REQUESTED_DATA_HOME_DIAGNOSTICS = getDataHomeDiagnostics(REQUESTED_DATA_HOME, PACKAGE_ROOT);
73
+ // Old client registrations can inject SYNABUN_DATA_HOME=<checkout>. Never let
74
+ // that legacy override keep mutable state inside replaceable application code.
75
+ const DATA_HOME = REQUESTED_DATA_HOME_DIAGNOSTICS.dataHomeInsidePackage
76
+ ? getPlatformDataHome()
77
+ : REQUESTED_DATA_HOME;
78
+ process.env.SYNABUN_DATA_HOME = DATA_HOME;
79
+ process.env.MEMORY_DATA_DIR = resolve(DATA_HOME, 'mcp-data');
80
+
81
+ // What this start is doing, written where the Start Server launcher reads it
82
+ // (DATA_HOME/data/supervisor.json): the offline page that asked for the start
83
+ // has no server to ask, and shows these phases instead of a guess. Each phase
84
+ // is noted when it begins. Opened in main(), once the data home is settled.
85
+ let supervisor = null;
86
+ const startPhase = (name, detail) => { try { supervisor?.phase(name, detail); } catch {} };
87
+ const startFailed = (code, message, extra = {}) => { try { supervisor?.fail({ code, message, ...extra }); } catch {} };
88
+
89
+ // ── Migration: move legacy in-repository state to the platform data home ──
90
+
91
+ function looksLikeSynabunCheckout(root) {
92
+ return existsSync(resolve(root, 'neural-interface', 'server.js'))
93
+ && existsSync(resolve(root, 'setup.js'));
94
+ }
95
+
96
+ function getLegacyDataRoots() {
97
+ const values = [];
98
+ if (resolve(REQUESTED_DATA_HOME) !== resolve(DATA_HOME)) values.push(REQUESTED_DATA_HOME);
99
+ values.push(PACKAGE_ROOT);
100
+ if (looksLikeSynabunCheckout(process.cwd())) values.push(process.cwd());
101
+ let acknowledged = [];
102
+ try {
103
+ const manifest = JSON.parse(readFileSync(resolve(DATA_HOME, DATA_HOME_MANIFEST), 'utf-8'));
104
+ acknowledged = Array.isArray(manifest.acknowledgedLegacyRoots)
105
+ ? manifest.acknowledgedLegacyRoots.map(value => resolve(value))
106
+ : [];
107
+ } catch {}
108
+ return [...new Set(values.map(value => resolve(value)))]
109
+ .filter(value => value !== resolve(DATA_HOME) && !acknowledged.includes(value) && dataHomeHasState(value));
110
+ }
111
+
112
+ function formatDataSummary(label, summary) {
113
+ const memory = summary.memory?.exists
114
+ ? `${summary.memory.memoryCount ?? '?'} memories, DB ${summary.memory.integrity}`
115
+ : 'no memory DB';
116
+ return `${label}: ${summary.root}\n`
117
+ + ` ${summary.fileCount} files, ${summary.schedules} schedules, ${summary.templates} templates, ${summary.groups} groups, ${memory}\n`
118
+ + ` backup: ${summary.backup?.status || 'unknown'}, latest change: ${summary.latestModifiedAt || 'unknown'}\n`
119
+ + ` fingerprint: ${summary.fingerprint}`;
120
+ }
121
+
122
+ function printDataHomeConflict(plan) {
123
+ fail('SynaBun found different user state in two locations and stopped before changing either copy.');
124
+ console.log('');
125
+ console.log(` ${formatDataSummary('Legacy ', plan.sourceSummary)}`);
126
+ console.log(` ${formatDataSummary('External', plan.targetSummary)}`);
127
+ console.log('');
128
+ info('Review the report with: synabun doctor');
129
+ info('Keep external state: synabun migrate-data --choose external');
130
+ info('Restore legacy state: synabun migrate-data --choose legacy');
131
+ console.log('');
132
+ }
133
+
134
+ function preflightDataHome() {
135
+ const legacyRoots = getLegacyDataRoots();
136
+ if (!legacyRoots.length) return { status: 'ready', target: DATA_HOME };
137
+
138
+ for (const source of legacyRoots) {
139
+ const plan = planDataHomeMigration({ sourceRoot: source, targetRoot: DATA_HOME });
140
+ if (!plan.targetHasState) {
141
+ info(`Detected legacy SynaBun data in ${source}`);
142
+ const result = migrateDataHome({ sourceRoot: source, targetRoot: DATA_HOME });
143
+ ok(`Copied and verified ${result.marker.sourceFileCount} files in ${DATA_HOME}`);
144
+ info(`The source was preserved at ${source}`);
145
+ console.log('');
146
+ return { status: 'migrated', source, target: DATA_HOME, result };
147
+ }
148
+ if (plan.identical) {
149
+ acknowledgeLegacyDataRoot({ targetRoot: DATA_HOME, sourceRoot: source });
150
+ continue;
151
+ }
152
+ printDataHomeConflict(plan);
153
+ return { status: 'conflict', source, target: DATA_HOME, plan };
154
+ }
155
+ return { status: 'ready', target: DATA_HOME, identicalLegacyRoots: legacyRoots };
156
+ }
157
+
158
+ function readOption(name) {
159
+ const index = process.argv.indexOf(name);
160
+ return index >= 0 ? process.argv[index + 1] : null;
161
+ }
162
+
163
+ function handleMigrateDataCommand() {
164
+ const sourceRoot = resolve(readOption('--from') || getLegacyDataRoots()[0] || PACKAGE_ROOT);
165
+ const targetRoot = resolve(readOption('--to') || getPlatformDataHome());
166
+ const choice = readOption('--choose');
167
+ const apply = process.argv.includes('--apply');
168
+ const plan = planDataHomeMigration({ sourceRoot, targetRoot });
169
+
170
+ console.log('');
171
+ console.log(` ${c.bold}SynaBun Data Migration${c.reset}`);
172
+ console.log(` Source: ${plan.sourceRoot}`);
173
+ console.log(` Destination: ${plan.targetRoot}`);
174
+ console.log(` Files: ${plan.files.length} (${plan.newFiles} new, ${plan.sameFiles} identical, ${plan.conflicts.length} conflicts)`);
175
+ if (plan.skippedSymlinks.length) console.log(` Skipped: ${plan.skippedSymlinks.length} symlink(s)`);
176
+ console.log('');
177
+
178
+ if (choice) {
179
+ if (!['external', 'legacy'].includes(choice)) throw new Error('--choose must be external or legacy');
180
+ const result = resolveDataHomeConflict({ sourceRoot, targetRoot, choice });
181
+ ok(`Selected ${choice} data after preserving both roots at ${result.recoveryRoot}`);
182
+ if (result.displacedTarget) info(`Previous external root preserved at ${result.displacedTarget}`);
183
+ console.log('');
184
+ return;
185
+ }
186
+
187
+ if (!apply) {
188
+ info('Dry run only. Re-run with --apply when the destination is empty.');
189
+ if (plan.targetHasState) info('Both roots have state; use synabun doctor, then --choose external or --choose legacy.');
190
+ console.log('');
191
+ return;
192
+ }
193
+
194
+ const result = migrateDataHome({ sourceRoot, targetRoot });
195
+ ok(`Migration complete: ${result.marker.sourceFileCount} files verified`);
196
+ if (result.backupRoot) info(`Previous destination preserved at ${result.backupRoot}`);
197
+ info(`Source preserved at ${sourceRoot}`);
198
+ console.log('');
199
+ }
200
+
201
+ function handleDoctorCommand() {
202
+ const legacyRoots = getLegacyDataRoots();
203
+ const report = {
204
+ version: 1,
205
+ checkedAt: new Date().toISOString(),
206
+ packageRoot: PACKAGE_ROOT,
207
+ requestedDataHome: REQUESTED_DATA_HOME,
208
+ activeDataHome: DATA_HOME,
209
+ unsafeRequestedOverride: REQUESTED_DATA_HOME_DIAGNOSTICS.dataHomeInsidePackage,
210
+ active: inspectDataHome(DATA_HOME),
211
+ clients: auditAndRepairClientConfigs({ dataHome: DATA_HOME, packageRoot: PACKAGE_ROOT, apply: false }),
212
+ legacy: legacyRoots.map(root => inspectDataHome(root)),
213
+ conflicts: legacyRoots.map(root => planDataHomeMigration({ sourceRoot: root, targetRoot: DATA_HOME }))
214
+ .filter(plan => plan.targetHasState && !plan.identical)
215
+ .map(plan => ({
216
+ sourceRoot: plan.sourceRoot,
217
+ targetRoot: plan.targetRoot,
218
+ conflicts: plan.conflicts,
219
+ targetOnlyFiles: plan.targetOnlyFiles,
220
+ sourceSummary: plan.sourceSummary,
221
+ targetSummary: plan.targetSummary,
222
+ })),
223
+ };
224
+ if (process.argv.includes('--json')) {
225
+ console.log(JSON.stringify(report, null, 2));
226
+ return;
227
+ }
228
+ console.log('');
229
+ console.log(` ${c.bold}SynaBun Doctor${c.reset}`);
230
+ console.log(` Application: ${PACKAGE_ROOT}`);
231
+ console.log(` Data home: ${DATA_HOME}`);
232
+ if (report.unsafeRequestedOverride) warn(`Ignored unsafe data-home override: ${REQUESTED_DATA_HOME}`);
233
+ console.log('');
234
+ console.log(` ${formatDataSummary('Active ', report.active)}`);
235
+ for (const summary of report.legacy) console.log(` ${formatDataSummary('Legacy ', summary)}`);
236
+ console.log('');
237
+ if (report.conflicts.length) {
238
+ fail(`${report.conflicts.length} divergent data root${report.conflicts.length === 1 ? '' : 's'} require an explicit choice.`);
239
+ } else {
240
+ ok('No divergent data roots detected.');
241
+ }
242
+ const staleClients = report.clients.changed.length;
243
+ if (staleClients) warn(`${staleClients} client registration${staleClients === 1 ? '' : 's'} use stale SynaBun paths.`);
244
+ else ok('Connected client registrations use canonical paths.');
245
+ console.log('');
246
+ }
247
+
248
+ // The offline page's Start Server button hands the OS a synabun:// link. Keep
249
+ // the handler pointing at this install: a GitHub checkout never ran the npm
250
+ // postinstall, and node or the package may have moved since it did.
251
+ function ensureStartLauncher() {
252
+ const result = registerStartLauncher({ packageRoot: PACKAGE_ROOT });
253
+ if (result.state === 'skipped') return;
254
+ if (!result.ok) warn(`Could not register the Start Server launcher: ${result.errors[0]}`);
255
+ else if (result.changed) ok('Start Server launcher registered (synabun://)');
256
+ }
257
+
258
+ function repairClientConfigs() {
259
+ try {
260
+ const result = auditAndRepairClientConfigs({ dataHome: DATA_HOME, packageRoot: PACKAGE_ROOT, apply: true });
261
+ if (result.changed.length) ok(`Repaired ${result.changed.length} SynaBun client registration${result.changed.length === 1 ? '' : 's'}`);
262
+ } catch (error) {
263
+ warn(`Could not audit client registrations: ${error.message}`);
264
+ }
265
+ }
266
+
267
+ // ── Phase 1: Prerequisite checks ──
268
+
269
+ function checkNodeVersion() {
270
+ const [major] = process.versions.node.split('.').map(Number);
271
+ if (major < 22) {
272
+ fail(`Node.js 22+ required, found v${process.versions.node}`);
273
+ process.exit(1);
274
+ }
275
+ ok(`Node.js v${process.versions.node}`);
276
+ }
277
+
278
+ // ── Phase 2: Dependency installation ──
279
+
280
+ function needsInstall(dir) {
281
+ const nm = resolve(dir, 'node_modules');
282
+ if (!existsSync(resolve(nm, '.package-lock.json'))) return true;
283
+ // Guard against a corrupted/partially-wiped node_modules where
284
+ // .package-lock.json survived but the actual packages didn't.
285
+ try {
286
+ const pkg = JSON.parse(readFileSync(resolve(dir, 'package.json'), 'utf8'));
287
+ const dep = Object.keys(pkg.dependencies || {})[0];
288
+ if (dep && !existsSync(resolve(nm, dep))) return true;
289
+ } catch {
290
+ return true;
291
+ }
292
+ return false;
293
+ }
294
+
295
+ function installDeps(name, dir, { includeDev = false } = {}) {
296
+ if (!needsInstall(dir)) {
297
+ ok(`${name} dependencies already installed`);
298
+ return;
299
+ }
300
+
301
+ info(`Installing ${name} dependencies...`);
302
+ startPhase('dependencies', { name });
303
+ try {
304
+ const omitFlag = includeDev ? '' : ' --omit=dev';
305
+ execSync(`npm install${omitFlag} --ignore-scripts`, {
306
+ cwd: dir,
307
+ stdio: 'inherit',
308
+ timeout: 300_000,
309
+ });
310
+ ok(`${name} dependencies installed`);
311
+ } catch (err) {
312
+ fail(`Failed to install ${name} dependencies`);
313
+ console.error(err.stderr?.toString() || err.message);
314
+ startFailed('DEPENDENCIES_FAILED', `npm could not install the ${name} dependencies`);
315
+ process.exit(1);
316
+ }
317
+ }
318
+
319
+ // ── Phase 3: Playwright Chromium (for browser automation) ──
320
+
321
+ function installPlaywrightChromium() {
322
+ const niDir = resolve(PACKAGE_ROOT, 'neural-interface');
323
+ try {
324
+ const result = execSync('node -e "const pw=require(\'playwright\');const p=pw.chromium.executablePath();process.stdout.write(p)"', {
325
+ cwd: niDir, encoding: 'utf8', timeout: 10_000,
326
+ });
327
+ if (existsSync(result)) {
328
+ ok('Playwright Chromium already installed');
329
+ return;
330
+ }
331
+ } catch { /* not installed */ }
332
+
333
+ info('Installing Playwright Chromium (for browser automation)...');
334
+ startPhase('browser');
335
+ try {
336
+ execSync('npx playwright install chromium', {
337
+ cwd: niDir,
338
+ stdio: 'inherit',
339
+ timeout: 120_000,
340
+ });
341
+ ok('Playwright Chromium installed');
342
+ } catch (err) {
343
+ console.log(' (optional) Playwright Chromium install failed — system Chrome will be used');
344
+ }
345
+ }
346
+
347
+ // ── Phase 4: MCP server build ──
348
+
349
+ function needsBuild() {
350
+ const distIndex = resolve(PACKAGE_ROOT, 'mcp-server', 'dist', 'index.js');
351
+ return !existsSync(distIndex);
352
+ }
353
+
354
+ function buildMcpServer() {
355
+ if (!needsBuild()) {
356
+ ok('MCP server already built');
357
+ return;
358
+ }
359
+
360
+ info('Building MCP server from source...');
361
+ startPhase('build');
362
+ try {
363
+ execSync('npx tsc', {
364
+ cwd: resolve(PACKAGE_ROOT, 'mcp-server'),
365
+ stdio: ['ignore', 'pipe', 'pipe'],
366
+ windowsHide: !!packagedRuntime(),
367
+ timeout: 120_000,
368
+ });
369
+ ok('MCP server built');
370
+ } catch (err) {
371
+ fail('MCP server build failed:');
372
+ const stdout = err.stdout?.toString().trim();
373
+ const stderr = err.stderr?.toString().trim();
374
+ if (stdout) console.error(stdout);
375
+ if (stderr) console.error(stderr);
376
+ if (!stdout && !stderr) console.error(err.message);
377
+ console.error('\n Report this at: https://github.com/danilokhury/Synabun/issues');
378
+ }
379
+ }
380
+
381
+ // ── Phase 5: Setup state detection ──
382
+
383
+ function isSetupComplete() {
384
+ const envPath = resolve(DATA_HOME, '.env');
385
+ try {
386
+ const content = readFileSync(envPath, 'utf-8');
387
+ for (const line of content.split('\n')) {
388
+ const trimmed = line.trim();
389
+ if (trimmed.startsWith('SETUP_COMPLETE=')) {
390
+ return trimmed.split('=')[1] === 'true';
391
+ }
392
+ }
393
+ } catch {}
394
+ return false;
395
+ }
396
+
397
+ // ── Phase 6: Server launch + browser open ──
398
+
399
+ function openBrowser(url) {
400
+ const plat = platform();
401
+ const fallback = () => { warn('Could not open browser automatically'); info(`Open manually: ${url}`); };
402
+
403
+ if (plat === 'win32') {
404
+ exec(`start "" "${url}"`, (err) => { if (err) fallback(); });
405
+ } else if (plat === 'darwin') {
406
+ exec(`open "${url}"`, (err) => { if (err) fallback(); });
407
+ } else {
408
+ exec(`xdg-open "${url}"`, (err) => { if (err) fallback(); });
409
+ }
410
+ }
411
+
412
+ // Sentinel exit code for supervised restart. Server exits with this code via
413
+ // /api/server/restart; the supervisor below respawns instead of giving up.
414
+ // 75 = sysexits EX_TEMPFAIL — conventional "transient, retry" signal.
415
+ const RESTART_EXIT_CODE = 75;
416
+
417
+ // Marker file written by /api/server/restart before tearing down. If the
418
+ // server crashes during shutdown (e.g. native module mutex error in sqlite/
419
+ // playwright/node-pty), the exit code will not be 75 — but the marker tells
420
+ // the supervisor the user asked for a restart, so we respawn anyway.
421
+ const RESTART_MARKER = resolve(DATA_HOME, 'restart-requested');
422
+
423
+ function startServer() {
424
+ const serverPath = resolve(PACKAGE_ROOT, 'neural-interface', 'server.js');
425
+ const niDir = resolve(PACKAGE_ROOT, 'neural-interface');
426
+ const setupComplete = isSetupComplete();
427
+
428
+ // Clear any stale marker from a previous run so we do not respawn on a
429
+ // clean exit from this child.
430
+ try { if (existsSync(RESTART_MARKER)) unlinkSync(RESTART_MARKER); } catch {}
431
+
432
+ info('Starting Neural Interface server...');
433
+ console.log('');
434
+
435
+ // Capture the server's stdout/stderr to log files so diagnostics survive
436
+ // regardless of how the supervisor itself was launched (Apps dropdown, manual
437
+ // `node setup.js`, or launchd). Previously logs only reached the launching
438
+ // terminal — when started outside a terminal they were lost, leaving
439
+ // data/server-*.log frozen at the last launchd run. Rotate at 50MB so capture
440
+ // never grows unbounded.
441
+ const LOG_DIR = resolve(DATA_HOME, 'data');
442
+ const STDOUT_LOG = resolve(LOG_DIR, 'server-stdout.log');
443
+ const STDERR_LOG = resolve(LOG_DIR, 'server-stderr.log');
444
+ try { mkdirSync(LOG_DIR, { recursive: true }); } catch {}
445
+ const rotateIfLarge = (p) => {
446
+ try { if (existsSync(p) && statSync(p).size > 50 * 1024 * 1024) renameSync(p, p + '.1'); } catch {}
447
+ };
448
+ rotateIfLarge(STDOUT_LOG);
449
+ rotateIfLarge(STDERR_LOG);
450
+ let outLog = null, errLog = null;
451
+ try { outLog = createWriteStream(STDOUT_LOG, { flags: 'a' }); } catch (e) { warn(`Could not open stdout log: ${e.message}`); }
452
+ try { errLog = createWriteStream(STDERR_LOG, { flags: 'a' }); } catch (e) { warn(`Could not open stderr log: ${e.message}`); }
453
+ // A full disk reports asynchronously from WriteStream.write(). Without an
454
+ // error listener that event terminates the supervisor itself, even though
455
+ // the child server's persistence paths already handle ENOSPC. Disable only
456
+ // the affected capture stream and keep the server console/supervision alive.
457
+ const disableLogStream = (kind, stream, error) => {
458
+ if (kind === 'stdout' && outLog === stream) outLog = null;
459
+ if (kind === 'stderr' && errLog === stream) errLog = null;
460
+ warn(`Could not persist ${kind} server log: ${error.message} — continuing without file capture.`);
461
+ try { stream.destroy(); } catch {}
462
+ };
463
+ const stdoutLog = outLog;
464
+ const stderrLog = errLog;
465
+ stdoutLog?.on('error', (error) => disableLogStream('stdout', stdoutLog, error));
466
+ stderrLog?.on('error', (error) => disableLogStream('stderr', stderrLog, error));
467
+ const stamp = `\n===== supervisor start ${new Date().toISOString()} (pid ${process.pid}) =====\n`;
468
+ try { outLog?.write(stamp); errLog?.write(stamp); } catch {}
469
+
470
+ let firstLaunch = true;
471
+ let currentChild = null;
472
+ let shuttingDown = false;
473
+ const restartLog = [];
474
+ const CRASH_WINDOW_MS = 60_000;
475
+ const CRASH_LIMIT = 5;
476
+
477
+ function spawnOnce() {
478
+ const child = spawn(process.execPath, ['--disable-warning=ExperimentalWarning', '--max-old-space-size=6144', serverPath], {
479
+ cwd: niDir,
480
+ stdio: ['ignore', 'pipe', 'pipe'],
481
+ windowsHide: !!packagedRuntime(),
482
+ env: {
483
+ ...process.env,
484
+ SYNABUN_DATA_HOME: DATA_HOME,
485
+ MEMORY_DATA_DIR: resolve(DATA_HOME, 'mcp-data'),
486
+ SYNABUN_SUPERVISED: '1',
487
+ },
488
+ });
489
+ currentChild = child;
490
+ startPhase('server', { pid: child.pid });
491
+ child.on('error', (error) => {
492
+ fail(`Could not start the server: ${error.message}`);
493
+ startFailed('SERVER_SPAWN_FAILED', `the server could not be started: ${error.message}`);
494
+ process.exit(1);
495
+ });
496
+
497
+ let opened = !firstLaunch;
498
+ let announced = false;
499
+ child.stdout.on('data', (data) => {
500
+ const s = data.toString();
501
+ process.stdout.write(s);
502
+ try { outLog?.write(s); } catch {}
503
+ // The server prints its address from its listen callback: it is up.
504
+ if (!announced && s.includes('Server:')) {
505
+ announced = true;
506
+ startPhase('listening', { port: Number(s.match(/Server:\s+http:\/\/localhost:(\d+)/)?.[1]) || undefined });
507
+ }
508
+ if (!opened && s.includes('Server:')) {
509
+ opened = true;
510
+ const port = s.match(/Server:\s+http:\/\/localhost:(\d+)/)?.[1] || '3344';
511
+ const url = `http://localhost:${port}${setupComplete ? '/' : '/onboarding.html'}`;
512
+ // The Start Server button already has a tab waiting for the server.
513
+ if (process.env.SYNABUN_OPEN_BROWSER !== '0') setTimeout(() => openBrowser(url), 1500);
514
+ }
515
+ });
516
+ child.stderr.on('data', (data) => {
517
+ const s = data.toString();
518
+ process.stderr.write(s);
519
+ try { errLog?.write(s); } catch {}
520
+ });
521
+
522
+ child.on('exit', (code) => {
523
+ currentChild = null;
524
+ if (shuttingDown) return;
525
+
526
+ // Treat a present marker file the same as exit code 75. Native module
527
+ // crashes during shutdown can clobber the exit code; the marker keeps
528
+ // restart reliable in that case.
529
+ let restartRequested = code === RESTART_EXIT_CODE;
530
+ if (!restartRequested && existsSync(RESTART_MARKER)) {
531
+ restartRequested = true;
532
+ info(`Server exited with code ${code} but restart marker present — respawning.`);
533
+ }
534
+ try { if (existsSync(RESTART_MARKER)) unlinkSync(RESTART_MARKER); } catch {}
535
+
536
+ if (restartRequested) {
537
+ if (code === RESTART_EXIT_CODE) info('Server requested restart — respawning...');
538
+ const now = Date.now();
539
+ restartLog.push(now);
540
+ while (restartLog.length && now - restartLog[0] > CRASH_WINDOW_MS) restartLog.shift();
541
+ if (restartLog.length > CRASH_LIMIT) {
542
+ fail(`Server restarted ${restartLog.length} times in ${Math.round(CRASH_WINDOW_MS / 1000)}s — aborting supervisor.`);
543
+ startFailed('RESTART_LOOP', `the server restarted ${restartLog.length} times in ${Math.round(CRASH_WINDOW_MS / 1000)} s`);
544
+ process.exit(1);
545
+ }
546
+ firstLaunch = false;
547
+ setTimeout(spawnOnce, 250);
548
+ return;
549
+ }
550
+
551
+ if (code !== 0 && code !== null) {
552
+ fail(`Server exited with code ${code}`);
553
+ startFailed('SERVER_EXITED', `the server exited with code ${code}`, { exitCode: code });
554
+ process.exit(code);
555
+ }
556
+ process.exit(0);
557
+ });
558
+ }
559
+
560
+ spawnOnce();
561
+
562
+ const stop = (sig) => {
563
+ shuttingDown = true;
564
+ if (currentChild) {
565
+ try { currentChild.kill(sig); } catch {}
566
+ }
567
+ process.exit(0);
568
+ };
569
+ process.on('SIGINT', () => stop('SIGINT'));
570
+ process.on('SIGTERM', () => stop('SIGTERM'));
571
+ }
572
+
573
+ // ── CLI: profile subcommand ──
574
+
575
+ const TOOL_GROUPS = {
576
+ memory: { label: 'Memory', tools: 6, alwaysOn: true },
577
+ category: { label: 'Categories', tools: 1, alwaysOn: true },
578
+ sync: { label: 'Sync', tools: 1, alwaysOn: true },
579
+ loop: { label: 'Loop', tools: 1, alwaysOn: true },
580
+ profile: { label: 'Profile', tools: 1, alwaysOn: true },
581
+ git: { label: 'Git', tools: 1 },
582
+ image: { label: 'Images', tools: 1 },
583
+ whiteboard: { label: 'Whiteboard', tools: 5 },
584
+ card: { label: 'Cards', tools: 5 },
585
+ tictactoe: { label: 'TicTacToe', tools: 1 },
586
+ browser: { label: 'Browser', tools: 18 },
587
+ browser_twitter: { label: 'Twitter/X', tools: 1 },
588
+ browser_facebook: { label: 'Facebook', tools: 1 },
589
+ browser_tiktok: { label: 'TikTok', tools: 4 },
590
+ browser_whatsapp: { label: 'WhatsApp', tools: 2 },
591
+ browser_instagram: { label: 'Instagram', tools: 5 },
592
+ browser_linkedin: { label: 'LinkedIn', tools: 8 },
593
+ leonardo: { label: 'Leonardo', tools: 5 },
594
+ discord: { label: 'Discord', tools: 8 },
595
+ gsc: { label: 'Google Search Console', tools: 30 },
596
+ };
597
+
598
+ function readRegistry(dataHome) {
599
+ const registryPath = resolve(dataHome, 'data', 'mcp-registry.json');
600
+ try {
601
+ if (existsSync(registryPath)) return JSON.parse(readFileSync(registryPath, 'utf-8'));
602
+ } catch {}
603
+ return null;
604
+ }
605
+
606
+ function getProfiles(dataHome) {
607
+ const registry = readRegistry(dataHome);
608
+ if (registry?.profiles) return registry.profiles;
609
+ // Fallback defaults
610
+ return {
611
+ core: { label: 'Core', groups: ['git', 'image'] },
612
+ standard: { label: 'Standard', groups: ['git', 'image', 'whiteboard', 'card', 'tictactoe'] },
613
+ twitter: { label: 'Twitter/X', groups: ['git', 'image', 'browser', 'browser_twitter'] },
614
+ facebook: { label: 'Facebook', groups: ['git', 'image', 'browser', 'browser_facebook'] },
615
+ tiktok: { label: 'TikTok', groups: ['git', 'image', 'browser', 'browser_tiktok'] },
616
+ whatsapp: { label: 'WhatsApp', groups: ['git', 'image', 'browser', 'browser_whatsapp'] },
617
+ instagram: { label: 'Instagram', groups: ['git', 'image', 'browser', 'browser_instagram'] },
618
+ linkedin: { label: 'LinkedIn', groups: ['git', 'image', 'browser', 'browser_linkedin'] },
619
+ discord: { label: 'Discord', groups: ['git', 'image', 'discord'] },
620
+ browser: { label: 'Browser', groups: ['git', 'image', 'whiteboard', 'card', 'tictactoe', 'browser', 'browser_twitter', 'browser_facebook', 'browser_tiktok', 'browser_whatsapp', 'browser_instagram', 'browser_linkedin', 'leonardo', 'gsc'] },
621
+ full: { label: 'Full', groups: ['git', 'image', 'whiteboard', 'card', 'tictactoe', 'browser', 'browser_twitter', 'browser_facebook', 'browser_tiktok', 'browser_whatsapp', 'browser_instagram', 'browser_linkedin', 'leonardo', 'discord', 'gsc'] },
622
+ leonardoai: { label: 'LeonardoAI', groups: ['leonardo'] },
623
+ gsc: { label: 'GSC', groups: ['git', 'image', 'browser', 'gsc'] },
624
+ };
625
+ }
626
+
627
+ function countProfileTools(groups) {
628
+ const alwaysOn = Object.values(TOOL_GROUPS).filter(g => g.alwaysOn).reduce((s, g) => s + g.tools, 0);
629
+ const groupTools = (groups || []).reduce((s, g) => s + (TOOL_GROUPS[g]?.tools || 0), 0);
630
+ return alwaysOn + groupTools;
631
+ }
632
+
633
+ function getCurrentProfile(dataHome) {
634
+ const profilePath = resolve(dataHome, 'data', 'active-profile.json');
635
+ try {
636
+ if (existsSync(profilePath)) {
637
+ const data = JSON.parse(readFileSync(profilePath, 'utf-8'));
638
+ if (data.profile) return data.profile;
639
+ }
640
+ } catch {}
641
+ return 'full';
642
+ }
643
+
644
+ function writeProfile(dataHome, profileName) {
645
+ const payload = JSON.stringify({ profile: profileName }, null, 2) + '\n';
646
+
647
+ // Write to data/active-profile.json (Neural Interface reads this)
648
+ const niPath = resolve(dataHome, 'data', 'active-profile.json');
649
+ const niDir = resolve(niPath, '..');
650
+ if (!existsSync(niDir)) mkdirSync(niDir, { recursive: true });
651
+ writeFileSync(niPath, payload, 'utf-8');
652
+
653
+ // Write to mcp-data/active-profile.json (MCP server watches this)
654
+ const mcpPath = resolve(dataHome, 'mcp-data', 'active-profile.json');
655
+ const mcpDir = resolve(mcpPath, '..');
656
+ if (!existsSync(mcpDir)) mkdirSync(mcpDir, { recursive: true });
657
+ writeFileSync(mcpPath, payload, 'utf-8');
658
+ }
659
+
660
+ function handleProfileCommand(dataHome) {
661
+ const sub = process.argv[3];
662
+ const profiles = getProfiles(dataHome);
663
+ const current = getCurrentProfile(dataHome);
664
+
665
+ // synabun profile OR synabun profile list
666
+ if (!sub || sub === 'list') {
667
+ console.log('');
668
+ console.log(` ${c.bold}Available MCP Profiles${c.reset}`);
669
+ console.log('');
670
+ for (const [name, prof] of Object.entries(profiles)) {
671
+ const label = prof.label || name;
672
+ const tools = countProfileTools(prof.groups);
673
+ const active = name === current ? ` ${c.green}← active${c.reset}` : '';
674
+ const groups = (prof.groups || []).join(', ');
675
+ console.log(` ${c.cyan}${name.padEnd(14)}${c.reset} ${c.dim}${label.padEnd(12)}${c.reset} ~${String(tools).padStart(2)} tools ${c.dim}[${groups}]${c.reset}${active}`);
676
+ }
677
+ console.log('');
678
+ console.log(` ${c.dim}Usage: synabun profile set <name>${c.reset}`);
679
+ console.log('');
680
+ return;
681
+ }
682
+
683
+ // synabun profile get
684
+ if (sub === 'get') {
685
+ const prof = profiles[current];
686
+ const tools = prof ? countProfileTools(prof.groups) : '?';
687
+ console.log('');
688
+ console.log(` ${c.bold}Current Profile:${c.reset} ${c.cyan}${current}${c.reset} (~${tools} tools)`);
689
+ if (prof?.groups) console.log(` ${c.dim}Groups: ${prof.groups.join(', ')}${c.reset}`);
690
+ console.log('');
691
+ return;
692
+ }
693
+
694
+ // synabun profile set <name>
695
+ if (sub === 'set') {
696
+ const name = process.argv[4]?.toLowerCase().trim();
697
+ if (!name) {
698
+ fail('Missing profile name. Usage: synabun profile set <name>');
699
+ console.log(` ${c.dim}Run "synabun profile list" to see available profiles.${c.reset}`);
700
+ process.exit(1);
701
+ }
702
+ if (!profiles[name]) {
703
+ fail(`Unknown profile "${name}"`);
704
+ console.log('');
705
+ console.log(` ${c.dim}Available profiles:${c.reset} ${Object.keys(profiles).join(', ')}`);
706
+ process.exit(1);
707
+ }
708
+ writeProfile(dataHome, name);
709
+ const prof = profiles[name];
710
+ const tools = countProfileTools(prof.groups);
711
+ ok(`Profile set to ${c.cyan}${name}${c.reset} (${prof.label}, ~${tools} tools)`);
712
+ console.log(` ${c.dim}Groups: ${prof.groups.join(', ')}${c.reset}`);
713
+ console.log('');
714
+ console.log(` ${c.dim}Running MCP servers will pick up the change automatically.${c.reset}`);
715
+ return;
716
+ }
717
+
718
+ fail(`Unknown subcommand "${sub}". Usage: synabun profile [list|get|set <name>]`);
719
+ process.exit(1);
720
+ }
721
+
722
+ // ── Main ──
723
+
724
+ async function main() {
725
+ const version = JSON.parse(readFileSync(resolve(PACKAGE_ROOT, 'package.json'), 'utf-8')).version;
726
+
727
+ // ── Subcommand routing (before setup flow) ──
728
+ const cmd = process.argv[2];
729
+ if (cmd === 'profile') {
730
+ handleProfileCommand(DATA_HOME);
731
+ process.exit(0);
732
+ }
733
+ if (cmd === 'migrate-data') {
734
+ handleMigrateDataCommand();
735
+ process.exit(0);
736
+ }
737
+ if (cmd === 'doctor') {
738
+ handleDoctorCommand();
739
+ process.exit(0);
740
+ }
741
+ if (cmd === 'restore-backup') {
742
+ const backupPath = readOption('--from') || readOption('--backup');
743
+ if (!backupPath) throw new Error('Usage: synabun restore-backup --from <backup.zip> [--apply]');
744
+ const { restoreDataHomeFromBackup } = await import('./scripts/restore-data-home-from-backup.mjs');
745
+ const result = await restoreDataHomeFromBackup({
746
+ backupPath,
747
+ targetRoot: DATA_HOME,
748
+ legacyRoot: PACKAGE_ROOT,
749
+ apply: process.argv.includes('--apply'),
750
+ });
751
+ for (const item of result.invalidJson || []) warn(`Restored as backed up, but not valid JSON: ${item.path} (${item.error})`);
752
+ if (!result.applied) {
753
+ info(`Verified backup: ${result.database.memories} memories, SQLite ${result.database.integrity}`);
754
+ info('Dry run only. Re-run with --apply after stopping SynaBun MCP/server processes.');
755
+ } else {
756
+ ok(`Restored ${result.database.memories} memories to ${result.targetRoot}`);
757
+ if (result.displacedTarget) info(`Previous external state preserved at ${result.displacedTarget}`);
758
+ }
759
+ process.exit(0);
760
+ }
761
+ if (cmd === 'version' || cmd === '--version' || cmd === '-v') {
762
+ console.log(`synabun v${version}`);
763
+ process.exit(0);
764
+ }
765
+
766
+ // Banner
767
+ console.log('');
768
+ console.log(` ${c.cyan}╔═══════════════════════════════════╗${c.reset}`);
769
+ console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
770
+ console.log(` ${c.cyan}║${c.reset} ${c.bold}${c.cyan}[██] [██]${c.reset} ${c.bold}${c.cyan}SynaBun${c.reset} ${c.cyan}║${c.reset}`);
771
+ console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
772
+ console.log(` ${c.cyan}║${c.reset} ${c.dim}Persistent Vector Memory${c.reset} ${c.cyan}║${c.reset}`);
773
+ console.log(` ${c.cyan}║${c.reset} ${c.cyan}║${c.reset}`);
774
+ console.log(` ${c.cyan}╚═══════════════════════════════════╝${c.reset}`);
775
+ console.log(` ${c.dim}synabun.ai${c.reset}`);
776
+ console.log('');
777
+ info(`v${version}`);
778
+ info(`Data: ${DATA_HOME}`);
779
+ console.log('');
780
+
781
+ // Inspect and migrate before creating empty destination directories. A
782
+ // divergent pair stops normal launch without overwriting either root.
783
+ const preflight = preflightDataHome();
784
+ if (preflight.status === 'conflict') {
785
+ noteSupervisorFailure(DATA_HOME, {
786
+ code: 'DATA_HOME_CONFLICT',
787
+ message: 'SynaBun found different user state in two locations and stopped before changing either. Run "synabun doctor".',
788
+ exitCode: 2,
789
+ });
790
+ process.exit(2);
791
+ }
792
+
793
+ // Ensure data directories
794
+ ensureDataDirs(DATA_HOME);
795
+
796
+ // From here until this process exits a start is under way: the Start Server
797
+ // launcher reads this record so a second click never starts a second one,
798
+ // and passes what it says on to the page that is waiting.
799
+ supervisor = openSupervisorRecord(DATA_HOME);
800
+ process.on('exit', supervisor.release);
801
+
802
+ // Prerequisites
803
+ checkNodeVersion();
804
+ console.log('');
805
+
806
+ // Dependencies (installed in global package location)
807
+ // A slow step names itself when it begins (startPhase inside each); between
808
+ // them the record goes back to 'checking', so it never names a finished one.
809
+ installDeps('Neural Interface', resolve(PACKAGE_ROOT, 'neural-interface'));
810
+ installDeps('MCP Server', resolve(PACKAGE_ROOT, 'mcp-server'), { includeDev: needsBuild() });
811
+ startPhase('checking');
812
+ console.log('');
813
+
814
+ // Playwright browser
815
+ installPlaywrightChromium();
816
+ startPhase('checking');
817
+ console.log('');
818
+
819
+ // Build
820
+ buildMcpServer();
821
+ startPhase('checking');
822
+ console.log('');
823
+
824
+ // A new version never runs on user state that has no verified snapshot. When
825
+ // the snapshot cannot be created the launch stops here, before the server
826
+ // (and any data migration) starts. There is no flag to launch anyway.
827
+ const protection = await protectFirstLaunchAfterUpdate({
828
+ dataHome: DATA_HOME,
829
+ version,
830
+ log: { info, ok, warn },
831
+ onProgress: (detail) => startPhase('snapshot', { version, ...detail }),
832
+ });
833
+ if (protection.status === 'failed') {
834
+ const failure = describeSnapshotFailure({ ...protection, dataHome: DATA_HOME, version });
835
+ // Server logging has not begun, and a detached launch (the updater's
836
+ // relaunch, a restart without a terminal) has nowhere to print.
837
+ const logPath = recordLauncherFailure({ dataHome: DATA_HOME, exitCode: SNAPSHOT_FAILED_EXIT_CODE, ...failure });
838
+ console.log('');
839
+ fail(failure.headline);
840
+ for (const line of failure.lines) info(line);
841
+ if (logPath) info(`This message is also in: ${logPath}`);
842
+ console.log('');
843
+ startFailed('SNAPSHOT_FAILED', failure.headline, { exitCode: SNAPSHOT_FAILED_EXIT_CODE });
844
+ process.exit(SNAPSHOT_FAILED_EXIT_CODE);
845
+ }
846
+ startPhase('checking');
847
+ console.log('');
848
+
849
+ // Existing registrations can carry checkout-local DOTENV_PATH and data-home
850
+ // overrides. Rewrite only their SynaBun entry after the new MCP build exists.
851
+ repairClientConfigs();
852
+ ensureStartLauncher();
853
+ console.log('');
854
+
855
+ // State
856
+ if (isSetupComplete()) {
857
+ ok('Setup already complete');
858
+ } else {
859
+ info('First-time setup \u2014 opening onboarding wizard');
860
+ }
861
+ console.log('');
862
+
863
+ // Launch
864
+ startServer();
865
+ }
866
+
867
+ main().catch(error => {
868
+ fail(error.message);
869
+ recordLauncherFailure({ dataHome: DATA_HOME, exitCode: 1, headline: `SynaBun did not start: ${error.message}` });
870
+ startFailed('SETUP_FAILED', error.message);
871
+ process.exit(1);
872
+ });