synabun 2.0.7 → 2.0.9

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 (346) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +1 -1
  3. package/hooks/claude-code/post-plan.mjs +6 -30
  4. package/hooks/claude-code/session-start.mjs +1 -4
  5. package/hooks/claude-code/shared.mjs +106 -72
  6. package/lib/package-processes.js +670 -0
  7. package/lib/runtime-dependencies.js +225 -0
  8. package/mcp-server/dist/services/browser-bench.d.ts +1 -1
  9. package/mcp-server/dist/services/browser-bench.d.ts.map +1 -1
  10. package/mcp-server/dist/services/browser-bench.js +1 -1
  11. package/mcp-server/dist/services/browser-bench.js.map +1 -1
  12. package/mcp-server/dist/services/categories.d.ts +35 -2
  13. package/mcp-server/dist/services/categories.d.ts.map +1 -1
  14. package/mcp-server/dist/services/categories.js +77 -33
  15. package/mcp-server/dist/services/categories.js.map +1 -1
  16. package/mcp-server/dist/services/desktop-bench.d.ts +7 -7
  17. package/mcp-server/dist/services/desktop-bench.d.ts.map +1 -1
  18. package/mcp-server/dist/services/desktop-bench.js +1 -1
  19. package/mcp-server/dist/services/desktop-bench.js.map +1 -1
  20. package/mcp-server/dist/tools/agents.d.ts +1 -1
  21. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  22. package/mcp-server/dist/tools/agents.js +1 -1
  23. package/mcp-server/dist/tools/agents.js.map +1 -1
  24. package/mcp-server/dist/tools/bluesky.js +1 -1
  25. package/mcp-server/dist/tools/bluesky.js.map +1 -1
  26. package/mcp-server/dist/tools/browser-advanced.d.ts +1 -1
  27. package/mcp-server/dist/tools/browser-advanced.d.ts.map +1 -1
  28. package/mcp-server/dist/tools/browser-advanced.js +1 -1
  29. package/mcp-server/dist/tools/browser-advanced.js.map +1 -1
  30. package/mcp-server/dist/tools/browser-batch.d.ts +1 -1
  31. package/mcp-server/dist/tools/browser-batch.d.ts.map +1 -1
  32. package/mcp-server/dist/tools/browser-batch.js +1 -1
  33. package/mcp-server/dist/tools/browser-batch.js.map +1 -1
  34. package/mcp-server/dist/tools/browser-cheatsheet.d.ts +1 -1
  35. package/mcp-server/dist/tools/browser-cheatsheet.d.ts.map +1 -1
  36. package/mcp-server/dist/tools/browser-cheatsheet.js +1 -1
  37. package/mcp-server/dist/tools/browser-cheatsheet.js.map +1 -1
  38. package/mcp-server/dist/tools/browser-interact.d.ts +1 -1
  39. package/mcp-server/dist/tools/browser-interact.d.ts.map +1 -1
  40. package/mcp-server/dist/tools/browser-interact.js +1 -1
  41. package/mcp-server/dist/tools/browser-interact.js.map +1 -1
  42. package/mcp-server/dist/tools/browser-navigate.d.ts +1 -1
  43. package/mcp-server/dist/tools/browser-navigate.d.ts.map +1 -1
  44. package/mcp-server/dist/tools/browser-navigate.js +1 -1
  45. package/mcp-server/dist/tools/browser-navigate.js.map +1 -1
  46. package/mcp-server/dist/tools/browser-observe.d.ts +1 -1
  47. package/mcp-server/dist/tools/browser-observe.d.ts.map +1 -1
  48. package/mcp-server/dist/tools/browser-observe.js +1 -1
  49. package/mcp-server/dist/tools/browser-observe.js.map +1 -1
  50. package/mcp-server/dist/tools/card-tools.d.ts +1 -1
  51. package/mcp-server/dist/tools/card-tools.d.ts.map +1 -1
  52. package/mcp-server/dist/tools/card-tools.js +1 -1
  53. package/mcp-server/dist/tools/card-tools.js.map +1 -1
  54. package/mcp-server/dist/tools/category.d.ts +1 -1
  55. package/mcp-server/dist/tools/category.d.ts.map +1 -1
  56. package/mcp-server/dist/tools/category.js +5 -1
  57. package/mcp-server/dist/tools/category.js.map +1 -1
  58. package/mcp-server/dist/tools/choice.d.ts +1 -1
  59. package/mcp-server/dist/tools/choice.d.ts.map +1 -1
  60. package/mcp-server/dist/tools/choice.js +1 -1
  61. package/mcp-server/dist/tools/choice.js.map +1 -1
  62. package/mcp-server/dist/tools/computer.d.ts +1 -1
  63. package/mcp-server/dist/tools/computer.d.ts.map +1 -1
  64. package/mcp-server/dist/tools/computer.js +1 -1
  65. package/mcp-server/dist/tools/computer.js.map +1 -1
  66. package/mcp-server/dist/tools/discord-channel.d.ts +1 -1
  67. package/mcp-server/dist/tools/discord-channel.d.ts.map +1 -1
  68. package/mcp-server/dist/tools/discord-channel.js +1 -1
  69. package/mcp-server/dist/tools/discord-channel.js.map +1 -1
  70. package/mcp-server/dist/tools/discord-guild.d.ts +1 -1
  71. package/mcp-server/dist/tools/discord-guild.d.ts.map +1 -1
  72. package/mcp-server/dist/tools/discord-guild.js +1 -1
  73. package/mcp-server/dist/tools/discord-guild.js.map +1 -1
  74. package/mcp-server/dist/tools/discord-member.d.ts +1 -1
  75. package/mcp-server/dist/tools/discord-member.d.ts.map +1 -1
  76. package/mcp-server/dist/tools/discord-member.js +1 -1
  77. package/mcp-server/dist/tools/discord-member.js.map +1 -1
  78. package/mcp-server/dist/tools/discord-message.d.ts +1 -1
  79. package/mcp-server/dist/tools/discord-message.d.ts.map +1 -1
  80. package/mcp-server/dist/tools/discord-message.js +1 -1
  81. package/mcp-server/dist/tools/discord-message.js.map +1 -1
  82. package/mcp-server/dist/tools/discord-onboarding.d.ts +1 -1
  83. package/mcp-server/dist/tools/discord-onboarding.d.ts.map +1 -1
  84. package/mcp-server/dist/tools/discord-onboarding.js +1 -1
  85. package/mcp-server/dist/tools/discord-onboarding.js.map +1 -1
  86. package/mcp-server/dist/tools/discord-role.d.ts +1 -1
  87. package/mcp-server/dist/tools/discord-role.d.ts.map +1 -1
  88. package/mcp-server/dist/tools/discord-role.js +1 -1
  89. package/mcp-server/dist/tools/discord-role.js.map +1 -1
  90. package/mcp-server/dist/tools/discord-thread.d.ts +1 -1
  91. package/mcp-server/dist/tools/discord-thread.d.ts.map +1 -1
  92. package/mcp-server/dist/tools/discord-thread.js +1 -1
  93. package/mcp-server/dist/tools/discord-thread.js.map +1 -1
  94. package/mcp-server/dist/tools/discord-webhook.d.ts +1 -1
  95. package/mcp-server/dist/tools/discord-webhook.d.ts.map +1 -1
  96. package/mcp-server/dist/tools/discord-webhook.js +1 -1
  97. package/mcp-server/dist/tools/discord-webhook.js.map +1 -1
  98. package/mcp-server/dist/tools/fb-groups.d.ts +1 -1
  99. package/mcp-server/dist/tools/fb-groups.d.ts.map +1 -1
  100. package/mcp-server/dist/tools/fb-groups.js +1 -1
  101. package/mcp-server/dist/tools/fb-groups.js.map +1 -1
  102. package/mcp-server/dist/tools/forget.d.ts +1 -1
  103. package/mcp-server/dist/tools/forget.d.ts.map +1 -1
  104. package/mcp-server/dist/tools/forget.js +1 -1
  105. package/mcp-server/dist/tools/forget.js.map +1 -1
  106. package/mcp-server/dist/tools/git-tools.d.ts +1 -1
  107. package/mcp-server/dist/tools/git-tools.d.ts.map +1 -1
  108. package/mcp-server/dist/tools/git-tools.js +1 -1
  109. package/mcp-server/dist/tools/git-tools.js.map +1 -1
  110. package/mcp-server/dist/tools/gsc/experience.d.ts +1 -1
  111. package/mcp-server/dist/tools/gsc/experience.d.ts.map +1 -1
  112. package/mcp-server/dist/tools/gsc/experience.js +1 -1
  113. package/mcp-server/dist/tools/gsc/experience.js.map +1 -1
  114. package/mcp-server/dist/tools/gsc/indexing.d.ts +1 -1
  115. package/mcp-server/dist/tools/gsc/indexing.d.ts.map +1 -1
  116. package/mcp-server/dist/tools/gsc/indexing.js +1 -1
  117. package/mcp-server/dist/tools/gsc/indexing.js.map +1 -1
  118. package/mcp-server/dist/tools/gsc/inspect.d.ts +1 -1
  119. package/mcp-server/dist/tools/gsc/inspect.d.ts.map +1 -1
  120. package/mcp-server/dist/tools/gsc/inspect.js +1 -1
  121. package/mcp-server/dist/tools/gsc/inspect.js.map +1 -1
  122. package/mcp-server/dist/tools/gsc/navigate.d.ts +1 -1
  123. package/mcp-server/dist/tools/gsc/navigate.d.ts.map +1 -1
  124. package/mcp-server/dist/tools/gsc/navigate.js +1 -1
  125. package/mcp-server/dist/tools/gsc/navigate.js.map +1 -1
  126. package/mcp-server/dist/tools/gsc/performance.d.ts +1 -1
  127. package/mcp-server/dist/tools/gsc/performance.d.ts.map +1 -1
  128. package/mcp-server/dist/tools/gsc/performance.js +1 -1
  129. package/mcp-server/dist/tools/gsc/performance.js.map +1 -1
  130. package/mcp-server/dist/tools/gsc/settings.d.ts +1 -1
  131. package/mcp-server/dist/tools/gsc/settings.d.ts.map +1 -1
  132. package/mcp-server/dist/tools/gsc/settings.js +1 -1
  133. package/mcp-server/dist/tools/gsc/settings.js.map +1 -1
  134. package/mcp-server/dist/tools/image-tools.d.ts +1 -1
  135. package/mcp-server/dist/tools/image-tools.d.ts.map +1 -1
  136. package/mcp-server/dist/tools/image-tools.js +1 -1
  137. package/mcp-server/dist/tools/image-tools.js.map +1 -1
  138. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts +1 -1
  139. package/mcp-server/dist/tools/leonardo-browser-tools.d.ts.map +1 -1
  140. package/mcp-server/dist/tools/leonardo-browser-tools.js +1 -1
  141. package/mcp-server/dist/tools/leonardo-browser-tools.js.map +1 -1
  142. package/mcp-server/dist/tools/loop.d.ts +1 -1
  143. package/mcp-server/dist/tools/loop.d.ts.map +1 -1
  144. package/mcp-server/dist/tools/loop.js +1 -1
  145. package/mcp-server/dist/tools/loop.js.map +1 -1
  146. package/mcp-server/dist/tools/memories.d.ts +1 -1
  147. package/mcp-server/dist/tools/memories.d.ts.map +1 -1
  148. package/mcp-server/dist/tools/memories.js +1 -1
  149. package/mcp-server/dist/tools/memories.js.map +1 -1
  150. package/mcp-server/dist/tools/morelogin.d.ts +1 -1
  151. package/mcp-server/dist/tools/morelogin.d.ts.map +1 -1
  152. package/mcp-server/dist/tools/morelogin.js +1 -1
  153. package/mcp-server/dist/tools/morelogin.js.map +1 -1
  154. package/mcp-server/dist/tools/profile.d.ts +1 -1
  155. package/mcp-server/dist/tools/profile.d.ts.map +1 -1
  156. package/mcp-server/dist/tools/profile.js +1 -1
  157. package/mcp-server/dist/tools/profile.js.map +1 -1
  158. package/mcp-server/dist/tools/recall.d.ts +1 -1
  159. package/mcp-server/dist/tools/recall.d.ts.map +1 -1
  160. package/mcp-server/dist/tools/recall.js +1 -1
  161. package/mcp-server/dist/tools/recall.js.map +1 -1
  162. package/mcp-server/dist/tools/reflect.d.ts +1 -1
  163. package/mcp-server/dist/tools/reflect.d.ts.map +1 -1
  164. package/mcp-server/dist/tools/reflect.js +1 -1
  165. package/mcp-server/dist/tools/reflect.js.map +1 -1
  166. package/mcp-server/dist/tools/remember.d.ts +1 -1
  167. package/mcp-server/dist/tools/remember.d.ts.map +1 -1
  168. package/mcp-server/dist/tools/remember.js +13 -11
  169. package/mcp-server/dist/tools/remember.js.map +1 -1
  170. package/mcp-server/dist/tools/restore.d.ts +1 -1
  171. package/mcp-server/dist/tools/restore.d.ts.map +1 -1
  172. package/mcp-server/dist/tools/restore.js +1 -1
  173. package/mcp-server/dist/tools/restore.js.map +1 -1
  174. package/mcp-server/dist/tools/style-guide-tools.d.ts +1 -1
  175. package/mcp-server/dist/tools/style-guide-tools.d.ts.map +1 -1
  176. package/mcp-server/dist/tools/style-guide-tools.js +1 -1
  177. package/mcp-server/dist/tools/style-guide-tools.js.map +1 -1
  178. package/mcp-server/dist/tools/sync.d.ts +1 -1
  179. package/mcp-server/dist/tools/sync.d.ts.map +1 -1
  180. package/mcp-server/dist/tools/sync.js +1 -1
  181. package/mcp-server/dist/tools/sync.js.map +1 -1
  182. package/mcp-server/dist/tools/tictactoe-tools.d.ts +1 -1
  183. package/mcp-server/dist/tools/tictactoe-tools.d.ts.map +1 -1
  184. package/mcp-server/dist/tools/tictactoe-tools.js +1 -1
  185. package/mcp-server/dist/tools/tictactoe-tools.js.map +1 -1
  186. package/mcp-server/dist/tools/utils.d.ts +1 -1
  187. package/mcp-server/dist/tools/utils.d.ts.map +1 -1
  188. package/mcp-server/dist/tools/utils.js +1 -1
  189. package/mcp-server/dist/tools/utils.js.map +1 -1
  190. package/mcp-server/dist/tools/whatsapp-send-file.d.ts +1 -1
  191. package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -1
  192. package/mcp-server/dist/tools/whatsapp-send-file.js +1 -1
  193. package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -1
  194. package/mcp-server/dist/tools/whiteboard-tools.d.ts +3 -3
  195. package/mcp-server/dist/tools/whiteboard-tools.d.ts.map +1 -1
  196. package/mcp-server/dist/tools/whiteboard-tools.js +1 -1
  197. package/mcp-server/dist/tools/whiteboard-tools.js.map +1 -1
  198. package/mcp-server/dist/tools/youtube/analytics.d.ts +1 -1
  199. package/mcp-server/dist/tools/youtube/analytics.d.ts.map +1 -1
  200. package/mcp-server/dist/tools/youtube/analytics.js +1 -1
  201. package/mcp-server/dist/tools/youtube/analytics.js.map +1 -1
  202. package/mcp-server/dist/tools/youtube/download.d.ts +1 -1
  203. package/mcp-server/dist/tools/youtube/download.d.ts.map +1 -1
  204. package/mcp-server/dist/tools/youtube/download.js +1 -1
  205. package/mcp-server/dist/tools/youtube/download.js.map +1 -1
  206. package/mcp-server/dist/tools/youtube/media.d.ts +1 -1
  207. package/mcp-server/dist/tools/youtube/media.d.ts.map +1 -1
  208. package/mcp-server/dist/tools/youtube/media.js +1 -1
  209. package/mcp-server/dist/tools/youtube/media.js.map +1 -1
  210. package/mcp-server/dist/tools/youtube/metadata.d.ts +1 -1
  211. package/mcp-server/dist/tools/youtube/metadata.d.ts.map +1 -1
  212. package/mcp-server/dist/tools/youtube/metadata.js +1 -1
  213. package/mcp-server/dist/tools/youtube/metadata.js.map +1 -1
  214. package/mcp-server/dist/tools/youtube/navigate.d.ts +1 -1
  215. package/mcp-server/dist/tools/youtube/navigate.d.ts.map +1 -1
  216. package/mcp-server/dist/tools/youtube/navigate.js +1 -1
  217. package/mcp-server/dist/tools/youtube/navigate.js.map +1 -1
  218. package/mcp-server/dist/tools/youtube/playlist.d.ts +1 -1
  219. package/mcp-server/dist/tools/youtube/playlist.d.ts.map +1 -1
  220. package/mcp-server/dist/tools/youtube/playlist.js +1 -1
  221. package/mcp-server/dist/tools/youtube/playlist.js.map +1 -1
  222. package/mcp-server/dist/tools/youtube/schedule.d.ts +1 -1
  223. package/mcp-server/dist/tools/youtube/schedule.d.ts.map +1 -1
  224. package/mcp-server/dist/tools/youtube/schedule.js +1 -1
  225. package/mcp-server/dist/tools/youtube/schedule.js.map +1 -1
  226. package/mcp-server/dist/tools/youtube/source.d.ts +1 -1
  227. package/mcp-server/dist/tools/youtube/source.d.ts.map +1 -1
  228. package/mcp-server/dist/tools/youtube/source.js +1 -1
  229. package/mcp-server/dist/tools/youtube/source.js.map +1 -1
  230. package/mcp-server/dist/tools/youtube/upload.d.ts +1 -1
  231. package/mcp-server/dist/tools/youtube/upload.d.ts.map +1 -1
  232. package/mcp-server/dist/tools/youtube/upload.js +4 -9
  233. package/mcp-server/dist/tools/youtube/upload.js.map +1 -1
  234. package/mcp-server/dist/tui.js +16 -4
  235. package/mcp-server/dist/tui.js.map +1 -1
  236. package/mcp-server/package-lock.json +3 -3
  237. package/mcp-server/package.json +3 -3
  238. package/mcp-server/src/services/browser-bench.ts +1 -1
  239. package/mcp-server/src/services/categories.ts +77 -32
  240. package/mcp-server/src/services/desktop-bench.ts +1 -1
  241. package/mcp-server/src/tools/agents.ts +1 -1
  242. package/mcp-server/src/tools/bluesky.ts +1 -1
  243. package/mcp-server/src/tools/browser-advanced.ts +1 -1
  244. package/mcp-server/src/tools/browser-batch.ts +1 -1
  245. package/mcp-server/src/tools/browser-cheatsheet.ts +1 -1
  246. package/mcp-server/src/tools/browser-interact.ts +1 -1
  247. package/mcp-server/src/tools/browser-navigate.ts +1 -1
  248. package/mcp-server/src/tools/browser-observe.ts +1 -1
  249. package/mcp-server/src/tools/card-tools.ts +1 -1
  250. package/mcp-server/src/tools/category.ts +6 -1
  251. package/mcp-server/src/tools/choice.ts +1 -1
  252. package/mcp-server/src/tools/computer.ts +1 -1
  253. package/mcp-server/src/tools/discord-channel.ts +1 -1
  254. package/mcp-server/src/tools/discord-guild.ts +1 -1
  255. package/mcp-server/src/tools/discord-member.ts +1 -1
  256. package/mcp-server/src/tools/discord-message.ts +1 -1
  257. package/mcp-server/src/tools/discord-onboarding.ts +1 -1
  258. package/mcp-server/src/tools/discord-role.ts +1 -1
  259. package/mcp-server/src/tools/discord-thread.ts +1 -1
  260. package/mcp-server/src/tools/discord-webhook.ts +1 -1
  261. package/mcp-server/src/tools/fb-groups.ts +1 -1
  262. package/mcp-server/src/tools/forget.ts +1 -1
  263. package/mcp-server/src/tools/git-tools.ts +1 -1
  264. package/mcp-server/src/tools/gsc/experience.ts +1 -1
  265. package/mcp-server/src/tools/gsc/indexing.ts +1 -1
  266. package/mcp-server/src/tools/gsc/inspect.ts +1 -1
  267. package/mcp-server/src/tools/gsc/navigate.ts +1 -1
  268. package/mcp-server/src/tools/gsc/performance.ts +1 -1
  269. package/mcp-server/src/tools/gsc/settings.ts +1 -1
  270. package/mcp-server/src/tools/image-tools.ts +1 -1
  271. package/mcp-server/src/tools/leonardo-browser-tools.ts +1 -1
  272. package/mcp-server/src/tools/loop.ts +1 -1
  273. package/mcp-server/src/tools/memories.ts +1 -1
  274. package/mcp-server/src/tools/morelogin.ts +1 -1
  275. package/mcp-server/src/tools/profile.ts +1 -1
  276. package/mcp-server/src/tools/recall.ts +1 -1
  277. package/mcp-server/src/tools/reflect.ts +1 -1
  278. package/mcp-server/src/tools/remember.ts +13 -12
  279. package/mcp-server/src/tools/restore.ts +1 -1
  280. package/mcp-server/src/tools/style-guide-tools.ts +1 -1
  281. package/mcp-server/src/tools/sync.ts +1 -1
  282. package/mcp-server/src/tools/tictactoe-tools.ts +1 -1
  283. package/mcp-server/src/tools/utils.ts +1 -1
  284. package/mcp-server/src/tools/whatsapp-send-file.ts +1 -1
  285. package/mcp-server/src/tools/whiteboard-tools.ts +1 -1
  286. package/mcp-server/src/tools/youtube/analytics.ts +1 -1
  287. package/mcp-server/src/tools/youtube/download.ts +1 -1
  288. package/mcp-server/src/tools/youtube/media.ts +1 -1
  289. package/mcp-server/src/tools/youtube/metadata.ts +1 -1
  290. package/mcp-server/src/tools/youtube/navigate.ts +1 -1
  291. package/mcp-server/src/tools/youtube/playlist.ts +1 -1
  292. package/mcp-server/src/tools/youtube/schedule.ts +1 -1
  293. package/mcp-server/src/tools/youtube/source.ts +1 -1
  294. package/mcp-server/src/tools/youtube/upload.ts +4 -12
  295. package/mcp-server/src/tui.ts +22 -9
  296. package/neural-interface/i18n/en.json +18 -0
  297. package/neural-interface/i18n/pt-BR.json +18 -0
  298. package/neural-interface/lib/agent-sandbox-elevation.js +102 -0
  299. package/neural-interface/lib/agent-sandbox-setting.js +57 -0
  300. package/neural-interface/lib/assistant-api.js +19 -0
  301. package/neural-interface/lib/assistant-route-gate-codex.js +3 -1
  302. package/neural-interface/lib/assistant-runtime.js +5 -1
  303. package/neural-interface/lib/codex-account-auth.js +4 -2
  304. package/neural-interface/lib/codex-accounts.js +14 -1
  305. package/neural-interface/lib/codex-settings-schema.js +5 -3
  306. package/neural-interface/lib/exec-loop-command.js +3 -1
  307. package/neural-interface/lib/install-details.js +23 -5
  308. package/neural-interface/lib/native-loop-providers.js +6 -1
  309. package/neural-interface/lib/provider-panel-terminal-auth.js +3 -2
  310. package/neural-interface/lib/session-indexer.js +3 -1
  311. package/neural-interface/lib/session-title-generator.js +2 -0
  312. package/neural-interface/package-lock.json +2 -2
  313. package/neural-interface/package.json +1 -1
  314. package/neural-interface/public/shared/account-menu.js +4 -1
  315. package/neural-interface/public/shared/account-usage.js +62 -2
  316. package/neural-interface/public/shared/account-view.js +2 -1
  317. package/neural-interface/public/shared/assistant/asst-account-menu.js +298 -0
  318. package/neural-interface/public/shared/assistant/asst-api.js +7 -0
  319. package/neural-interface/public/shared/assistant/asst-brain-picker.js +232 -75
  320. package/neural-interface/public/shared/assistant/asst-menu.js +204 -77
  321. package/neural-interface/public/shared/assistant/asst-model-chip.js +135 -0
  322. package/neural-interface/public/shared/assistant/asst-panel.js +39 -2
  323. package/neural-interface/public/shared/assistant/asst-styles.js +66 -17
  324. package/neural-interface/public/shared/cdx/cdx-panel.js +1 -1
  325. package/neural-interface/public/shared/cdx/cdx-styles.js +45 -5
  326. package/neural-interface/public/shared/cdx/cdx-tabs.js +3 -0
  327. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -1
  328. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +4 -1
  329. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +51 -2
  330. package/neural-interface/public/shared/showcase-privacy.js +2 -1
  331. package/neural-interface/public/shared/styles.css +3 -1
  332. package/neural-interface/public/shared/ui-claude-panel.js +50 -4
  333. package/neural-interface/public/shared/ui-explorer.js +2 -0
  334. package/neural-interface/public/shared/ui-sync.js +2 -0
  335. package/neural-interface/public/shared/ui-update.js +4 -2
  336. package/neural-interface/scripts/rebuild-pty.js +14 -2
  337. package/neural-interface/server.js +180 -86
  338. package/npm-shrinkwrap.json +4424 -0
  339. package/package.json +54 -2
  340. package/postinstall.js +61 -47
  341. package/preuninstall.js +8 -35
  342. package/setup.js +76 -44
  343. package/skills/synabun/modules/idea.md +1 -1
  344. package/skills/synabun/modules/schedule.md +1 -1
  345. package/updater.cmd +2 -2
  346. package/updater.mjs +97 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synabun",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "Local-first persistent vector memory, MCP tooling, and multi-agent workflows for AI assistants",
5
5
  "license": "Apache-2.0",
6
6
  "author": "The SynaBun Authors",
@@ -67,6 +67,9 @@
67
67
  "lib/paths.d.ts",
68
68
  "lib/data-home-migration.js",
69
69
  "lib/first-launch-protection.js",
70
+ "lib/runtime-dependencies.js",
71
+ "lib/package-processes.js",
72
+ "npm-shrinkwrap.json",
70
73
  "lib/client-config-repair.js",
71
74
  "lib/claude-hooks.js",
72
75
  "lib/claude-usage-audit.js",
@@ -98,7 +101,56 @@
98
101
  "build:windows:x86": "node packaging/build.mjs build --target windows-x86",
99
102
  "postinstall": "node postinstall.js",
100
103
  "preuninstall": "node preuninstall.js",
101
- "prepublishOnly": "npm --prefix mcp-server ci --ignore-scripts && npm --prefix neural-interface ci --ignore-scripts && npm run mcp:build && node -e \"const fs = require('node:fs'); for (const path of ['mcp-server/dist/index.js', 'NOTICE', 'THIRD-PARTY-LICENSES.md']) fs.accessSync(path)\" && npm run pack:check"
104
+ "prepublishOnly": "npm --prefix mcp-server ci --ignore-scripts && npm --prefix neural-interface ci --ignore-scripts && npm run mcp:build && node -e \"const fs = require('node:fs'); for (const path of ['mcp-server/dist/index.js', 'NOTICE', 'THIRD-PARTY-LICENSES.md']) fs.accessSync(path)\" && npm run pack:check",
105
+ "prepack": "node lib/root-dependencies.mjs --check",
106
+ "deps:check": "node lib/root-dependencies.mjs --check",
107
+ "deps:sync": "node lib/root-dependencies.mjs --write"
108
+ },
109
+ "dependencies": {
110
+ "@anthropic-ai/claude-agent-sdk": "0.3.288",
111
+ "@huggingface/transformers": "^3.0.0",
112
+ "@inquirer/prompts": "^8.2.0",
113
+ "@modelcontextprotocol/sdk": "^1.12.1",
114
+ "@openai/codex-sdk": "^0.160.0",
115
+ "@opencode-ai/sdk": "1.18.34",
116
+ "@xterm/addon-fit": "0.11.0",
117
+ "@xterm/addon-search": "0.16.0",
118
+ "@xterm/addon-serialize": "0.14.0",
119
+ "@xterm/addon-unicode11": "0.9.0",
120
+ "@xterm/addon-web-links": "0.12.0",
121
+ "@xterm/addon-webgl": "0.19.0",
122
+ "@xterm/headless": "6.0.0",
123
+ "@xterm/xterm": "6.0.0",
124
+ "adm-zip": "^0.6.0",
125
+ "archiver": "^7.0.1",
126
+ "chalk": "^5.6.2",
127
+ "dotenv": "^16.4.7",
128
+ "express": "^4.21.2",
129
+ "node-html-markdown": "^2.0.0",
130
+ "playwright": "^1.59.1",
131
+ "undici": "^8.5.0",
132
+ "uuid": "^14.0.0",
133
+ "ws": "^8.21.0",
134
+ "zod": "^4.4.3"
135
+ },
136
+ "optionalDependencies": {
137
+ "node-pty": "^1.1.0"
138
+ },
139
+ "devDependencies": {
140
+ "@types/express": "^5.0.0",
141
+ "@types/node": "^22.12.0",
142
+ "typescript": "^5.9.3"
143
+ },
144
+ "overrides": {
145
+ "@hono/node-server": "^1.19.13",
146
+ "brace-expansion": "^2.1.2",
147
+ "esbuild": "^0.28.1",
148
+ "hono": "^4.12.25",
149
+ "lodash": "^4.18.1",
150
+ "postcss": "^8.5.10",
151
+ "protobufjs": "^7.6.5",
152
+ "tar": "^7.5.19",
153
+ "vite": "^8.0.16"
102
154
  },
103
155
  "keywords": [
104
156
  "ai-agents",
package/postinstall.js CHANGED
@@ -3,17 +3,21 @@
3
3
  /**
4
4
  * SynaBun — NPM postinstall script
5
5
  *
6
- * Runs automatically after `npm install -g synabun`.
7
- * Installs subdependencies and builds the MCP server.
6
+ * Runs after `npm i -g synabun` (and after `npm install` in a checkout). npm
7
+ * has already installed every runtime dependency at the package root, at the
8
+ * versions npm-shrinkwrap.json pins, so nothing is installed here: this only
9
+ * finishes what npm cannot (node-pty's binary, the MCP build of a fresh
10
+ * checkout, the synabun:// handler, the updater shim's executable bit).
8
11
  * Does NOT start the server — that's setup.js / `synabun` command.
9
12
  */
10
13
 
11
- import { execSync } from 'node:child_process';
12
- import { existsSync, chmodSync } from 'node:fs';
13
- import { resolve, dirname } from 'node:path';
14
+ import { execFileSync } from 'node:child_process';
15
+ import { existsSync, chmodSync, lstatSync, readlinkSync, unlinkSync } from 'node:fs';
16
+ import { resolve, dirname, basename, join } from 'node:path';
14
17
  import { fileURLToPath } from 'node:url';
15
18
  import { platform } from 'node:os';
16
19
  import { registerStartLauncher } from './lib/start-launcher.js';
20
+ import { mcpCompiler } from './lib/runtime-dependencies.js';
17
21
 
18
22
  const __dirname = dirname(fileURLToPath(import.meta.url));
19
23
 
@@ -28,44 +32,22 @@ const c = {
28
32
  red: '\x1b[31m',
29
33
  };
30
34
 
31
- function ok(msg) { console.log(` ${c.green}\u2713${c.reset} ${msg}`); }
35
+ function ok(msg) { console.log(` ${c.green}✓${c.reset} ${msg}`); }
32
36
  function warn(msg) { console.log(` ${c.yellow}!${c.reset} ${msg}`); }
33
- function fail(msg) { console.log(` ${c.red}\u2717${c.reset} ${msg}`); }
34
- function info(msg) { console.log(` ${c.cyan}\u2192${c.reset} ${msg}`); }
35
-
36
- // ── Dependency installation ──
37
-
38
- function needsInstall(dir) {
39
- return !existsSync(resolve(dir, 'node_modules', '.package-lock.json'));
40
- }
41
-
42
- function installDeps(name, dir, { includeDev = false } = {}) {
43
- if (!needsInstall(dir)) {
44
- ok(`${name} dependencies already installed`);
45
- return;
46
- }
47
-
48
- info(`Installing ${name} dependencies...`);
49
- try {
50
- const omitFlag = includeDev ? '' : ' --omit=dev';
51
- execSync(`npm install${omitFlag} --ignore-scripts`, {
52
- cwd: dir,
53
- stdio: 'inherit',
54
- timeout: 300_000,
55
- });
56
- ok(`${name} dependencies installed`);
57
- } catch (err) {
58
- fail(`Failed to install ${name} dependencies`);
59
- console.error(err.stderr?.toString() || err.message);
60
- process.exit(1);
61
- }
62
- }
63
-
64
- function needsBuild() {
65
- return !existsSync(resolve(__dirname, 'mcp-server', 'dist', 'index.js'));
66
- }
37
+ function fail(msg) { console.log(` ${c.red}✗${c.reset} ${msg}`); }
38
+ function info(msg) { console.log(` ${c.cyan}→${c.reset} ${msg}`); }
67
39
 
68
40
  // ── node-pty native rebuild ──
41
+ //
42
+ // On an install or an update npm runs no dependency's install script
43
+ // (npm-shrinkwrap.json keeps them off: lib/root-dependencies.mjs
44
+ // withoutInstallScript), so node-pty is this script's: its prebuilt binary on
45
+ // macOS and Windows, with the execute bit of its spawn helper restored; a
46
+ // compile where it has none (Linux) or the one it has does not start. Never
47
+ // fatal: without it only the terminal is missing. A bare `npm rebuild -g`
48
+ // reads each package's own package.json and runs those scripts after all:
49
+ // SynaBun never runs one, and its repair is `npm i -g synabun@<version>` or
50
+ // `npm rebuild -g synabun --ignore-scripts` followed by this script.
69
51
 
70
52
  function rebuildPty() {
71
53
  const rebuildScript = resolve(__dirname, 'neural-interface', 'scripts', 'rebuild-pty.js');
@@ -74,20 +56,23 @@ function rebuildPty() {
74
56
  return;
75
57
  }
76
58
 
77
- info('Rebuilding node-pty native addon...');
59
+ info('Checking node-pty native addon...');
78
60
  try {
79
- execSync(`node "${rebuildScript}"`, {
61
+ execFileSync(process.execPath, [rebuildScript], {
80
62
  cwd: resolve(__dirname, 'neural-interface'),
81
63
  stdio: 'inherit',
82
64
  timeout: 120_000,
83
65
  });
84
- ok('node-pty rebuilt');
66
+ ok('node-pty ready');
85
67
  } catch (err) {
86
68
  warn('node-pty rebuild failed (terminal features may not work)');
87
69
  }
88
70
  }
89
71
 
90
72
  // ── MCP server build ──
73
+ //
74
+ // A published package carries mcp-server/dist; a fresh checkout compiles it,
75
+ // with the TypeScript of the root's devDependencies.
91
76
 
92
77
  function buildMcpServer() {
93
78
  const distIndex = resolve(__dirname, 'mcp-server', 'dist', 'index.js');
@@ -97,8 +82,13 @@ function buildMcpServer() {
97
82
  }
98
83
 
99
84
  info('Building MCP server from source...');
85
+ const tsc = mcpCompiler(__dirname);
86
+ if (!tsc) {
87
+ fail('MCP server build failed: TypeScript is not installed (run npm install in the package root)');
88
+ return;
89
+ }
100
90
  try {
101
- execSync('npx tsc', {
91
+ execFileSync(process.execPath, [tsc, '-p', resolve(__dirname, 'mcp-server')], {
102
92
  cwd: resolve(__dirname, 'mcp-server'),
103
93
  stdio: ['ignore', 'pipe', 'pipe'],
104
94
  timeout: 120_000,
@@ -114,6 +104,31 @@ function buildMcpServer() {
114
104
  }
115
105
  }
116
106
 
107
+ // ── Links an older postinstall left ──
108
+ //
109
+ // Up to 2.0.8 this script ran `npm install` in mcp-server/ and neural-interface/
110
+ // itself. Inside `npm i -g`, npm sets npm_config_global for its scripts, so each
111
+ // of those installs put its folder in the global packages as a link of its own,
112
+ // beside SynaBun: claude-memory-mcp -> synabun/mcp-server and
113
+ // neural-memory-interface -> synabun/neural-interface. Only such a link, pointing
114
+ // at this package's own folder, is removed.
115
+
116
+ function removeStalePartLinks() {
117
+ const parent = dirname(__dirname);
118
+ if (basename(parent) !== 'node_modules') return;
119
+ const same = (a, b) => (platform() === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b);
120
+ for (const [name, folder] of [['claude-memory-mcp', 'mcp-server'], ['neural-memory-interface', 'neural-interface']]) {
121
+ const link = join(parent, name);
122
+ try {
123
+ if (!lstatSync(link).isSymbolicLink()) continue;
124
+ const target = readlinkSync(link).replace(/^\\\\\?\\/, '');
125
+ if (!same(resolve(parent, target), resolve(__dirname, folder))) continue;
126
+ unlinkSync(link);
127
+ ok(`Removed ${name}, a link an older SynaBun left in the global packages`);
128
+ } catch {}
129
+ }
130
+ }
131
+
117
132
  // ── Protocol handler registration ──
118
133
  //
119
134
  // The synabun:// handler behind the offline page's Start Server button. The
@@ -151,14 +166,13 @@ function ensureUpdaterShExecutable() {
151
166
  function main() {
152
167
  console.log(`\n ${c.cyan}SynaBun${c.reset} ${c.dim}postinstall${c.reset}\n`);
153
168
 
154
- installDeps('Neural Interface', resolve(__dirname, 'neural-interface'));
155
- installDeps('MCP Server', resolve(__dirname, 'mcp-server'), { includeDev: needsBuild() });
169
+ removeStalePartLinks();
156
170
  rebuildPty();
157
171
  buildMcpServer();
158
172
  registerProtocolHandler();
159
173
  ensureUpdaterShExecutable();
160
174
 
161
- console.log(`\n ${c.green}\u2713${c.reset} Setup complete. Run ${c.cyan}synabun${c.reset} to start.\n`);
175
+ console.log(`\n ${c.green}✓${c.reset} Setup complete. Run ${c.cyan}synabun${c.reset} to start.\n`);
162
176
  }
163
177
 
164
178
  main();
package/preuninstall.js CHANGED
@@ -78,50 +78,23 @@ async function tryGracefulServerShutdown() {
78
78
  // keep file handles inside the install dir open, causing EBUSY when npm
79
79
  // tries to rename it.
80
80
  //
81
- // We nuke any process whose command line references the SynaBun install
82
- // path. This catches every orphan regardless of how they got that way.
81
+ // Windows: lib/package-processes.js, the same step the updater runs (node
82
+ // processes with an argument inside the install path, anything whose program
83
+ // file is inside it; never this process, its parents or its children).
84
+ // Elsewhere: any process whose command line references the install path.
83
85
  // Skips the current PID (we are the preuninstall process itself).
84
86
 
85
- killOrphansInsideInstall();
87
+ await killOrphansInsideInstall();
86
88
 
87
- function killOrphansInsideInstall() {
89
+ async function killOrphansInsideInstall() {
88
90
  const installPath = __dirname;
89
91
  const selfPid = process.pid;
90
92
  const plat = platform();
91
93
 
92
94
  if (plat === 'win32') {
93
- // PowerShell: Get-CimInstance returns every process with CommandLine.
94
- // Pass the install path via env so this PowerShell command line does not
95
- // itself contain the path we are trying to match and kill.
96
- // Stop-Process -Force kills synchronously; -ErrorAction SilentlyContinue
97
- // suppresses "process already exited" noise.
98
- const ps = `
99
- $ErrorActionPreference = 'SilentlyContinue';
100
- $installPath = $env:SYNABUN_INSTALL_PATH;
101
- $selfPid = [int]$env:SYNABUN_PREUNINSTALL_PID;
102
- Get-CimInstance Win32_Process |
103
- Where-Object {
104
- $_.ProcessId -ne $selfPid -and
105
- $_.ProcessId -ne $PID -and (
106
- ($_.CommandLine -and $_.CommandLine -like "*$installPath*") -or
107
- ($_.ExecutablePath -and $_.ExecutablePath -like "$installPath*")
108
- )
109
- } |
110
- ForEach-Object {
111
- Write-Host (' Killing orphan PID ' + $_.ProcessId + ' (' + $_.Name + ')');
112
- Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue
113
- }
114
- `.trim();
115
95
  try {
116
- execSync(`powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps.replace(/"/g, '\\"').replace(/\n/g, ' ')}"`, {
117
- stdio: 'inherit',
118
- timeout: 8000,
119
- env: {
120
- ...process.env,
121
- SYNABUN_INSTALL_PATH: installPath,
122
- SYNABUN_PREUNINSTALL_PID: String(selfPid),
123
- },
124
- });
96
+ const { stopPackageProcesses } = await import('./lib/package-processes.js');
97
+ await stopPackageProcesses({ roots: [installPath], selfPid, log: line => console.log(line) });
125
98
  } catch {
126
99
  // PowerShell unavailable, blocked, or timed out. Fall through.
127
100
  }
package/setup.js CHANGED
@@ -8,17 +8,18 @@
8
8
  * 1. Checks Node.js version (>=22)
9
9
  * 2. Ensures data directory exists (~/.synabun or %APPDATA%/synabun)
10
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)
11
+ * 4. Checks that the runtime dependencies resolve (npm installs them with the
12
+ * package); runs npm only for a checkout nobody installed or a missing module
13
+ * 5. Builds the MCP server TypeScript (if dist/ is missing)
13
14
  * 6. Takes a verified snapshot of user state before a new version first runs
14
15
  * (lib/first-launch-protection.js). If it cannot, the launch stops here.
15
16
  * 7. Starts the Neural Interface Express server
16
17
  * 8. Auto-opens browser to onboarding wizard (or main page if setup complete)
17
18
  */
18
19
 
19
- import { execFileSync, execSync, spawn, exec } from 'node:child_process';
20
+ import { execFileSync, spawn, exec } from 'node:child_process';
20
21
  import { existsSync, readFileSync, writeFileSync, cpSync, readdirSync, mkdirSync, unlinkSync, createWriteStream, statSync, renameSync } from 'node:fs';
21
- import { resolve, dirname } from 'node:path';
22
+ import { resolve, dirname, join } from 'node:path';
22
23
  import { fileURLToPath } from 'node:url';
23
24
  import { platform } from 'node:os';
24
25
  import {
@@ -48,6 +49,9 @@ import {
48
49
  RESTART_REPORT_ENV, noteSupervisorFailure, openRestartReport, openSupervisorRecord, registerStartLauncher, resolvePort,
49
50
  } from './lib/start-launcher.js';
50
51
  import { packagedRuntime } from './lib/packaged-runtime.js';
52
+ import {
53
+ OPTIONAL_AT_ROOT, checkRuntimeDependencies, findInstalled, installAtPackageRoot, installKind, mcpCompiler,
54
+ } from './lib/runtime-dependencies.js';
51
55
 
52
56
  const __dirname = dirname(fileURLToPath(import.meta.url));
53
57
 
@@ -288,45 +292,68 @@ function checkNodeVersion() {
288
292
  ok(`Node.js v${process.versions.node}`);
289
293
  }
290
294
 
291
- // ── Phase 2: Dependency installation ──
292
-
293
- function needsInstall(dir) {
294
- const nm = resolve(dir, 'node_modules');
295
- if (!existsSync(resolve(nm, '.package-lock.json'))) return true;
296
- // Guard against a corrupted/partially-wiped node_modules where
297
- // .package-lock.json survived but the actual packages didn't.
298
- try {
299
- const pkg = JSON.parse(readFileSync(resolve(dir, 'package.json'), 'utf8'));
300
- const dep = Object.keys(pkg.dependencies || {})[0];
301
- if (dep && !existsSync(resolve(nm, dep))) return true;
302
- } catch {
303
- return true;
304
- }
305
- return false;
295
+ // ── Phase 2: Runtime dependencies ──
296
+ //
297
+ // `npm i -g synabun` installed them at the package root, at the versions
298
+ // npm-shrinkwrap.json pins; a desktop build and a development checkout carry
299
+ // them in each part's node_modules. This step only checks that Node finds them
300
+ // (lib/runtime-dependencies.js). npm runs here only for what is really missing,
301
+ // a checkout nobody installed or a module that disappeared: once, at the
302
+ // package root, and never inside a packaged application.
303
+
304
+ // The repair of an npm install: this version again, from the registry, which keeps the dependencies' install
305
+ // scripts off as every install and update does. Never a bare `npm rebuild -g`: it reads each dependency's own
306
+ // package.json and runs those scripts (onnxruntime-node's CUDA download, sharp's source build).
307
+ function npmRepairCommand() {
308
+ let version = null;
309
+ try { version = JSON.parse(readFileSync(resolve(PACKAGE_ROOT, 'package.json'), 'utf-8')).version; } catch {}
310
+ return `npm i -g synabun${version ? `@${version}` : ''}`;
306
311
  }
307
312
 
308
- function installDeps(name, dir, { includeDev = false } = {}) {
309
- if (!needsInstall(dir)) {
310
- ok(`${name} dependencies already installed`);
313
+ function ensureRuntimeDependencies() {
314
+ const report = checkRuntimeDependencies({ packageRoot: PACKAGE_ROOT });
315
+ // A fresh checkout compiles the MCP server, with the TypeScript of the root's devDependencies.
316
+ const compilerMissing = needsBuild() && !mcpCompiler(PACKAGE_ROOT);
317
+ if (report.ok && !compilerMissing) {
318
+ ok('Runtime dependencies present');
319
+ for (const part of report.parts) for (const name of part.optional) warn(`${name} is not installed: ${OPTIONAL_AT_ROOT[name]}`);
311
320
  return;
312
321
  }
313
322
 
314
- info(`Installing ${name} dependencies...`);
315
- startPhase('dependencies', { name });
316
- try {
317
- const omitFlag = includeDev ? '' : ' --omit=dev';
318
- execSync(`npm install${omitFlag} --ignore-scripts`, {
319
- cwd: dir,
320
- stdio: 'inherit',
321
- timeout: 300_000,
322
- });
323
- ok(`${name} dependencies installed`);
324
- } catch (err) {
325
- fail(`Failed to install ${name} dependencies`);
326
- console.error(err.stderr?.toString() || err.message);
327
- startFailed('DEPENDENCIES_FAILED', `npm could not install the ${name} dependencies`);
323
+ for (const part of report.parts) if (part.error) fail(part.error);
324
+ const names = [...report.missing.map(item => item.name), ...(compilerMissing ? ['typescript (builds the MCP server)'] : [])];
325
+ if (names.length) warn(`Missing: ${names.slice(0, 8).join(', ')}${names.length > 8 ? ` and ${names.length - 8} more` : ''}`);
326
+ const kind = installKind({ packageRoot: PACKAGE_ROOT, packaged: !!packagedRuntime() });
327
+ if (kind === 'packaged') {
328
+ fail('This SynaBun application is incomplete. Reinstall it from https://synabun.ai');
329
+ startFailed('DEPENDENCIES_MISSING', 'the application is incomplete: reinstall it');
328
330
  process.exit(1);
329
331
  }
332
+
333
+ info(`Installing them with npm in ${PACKAGE_ROOT}...`);
334
+ startPhase('dependencies', { name: 'SynaBun' });
335
+ const logsDir = resolve(DATA_HOME, 'data', 'npm-logs');
336
+ const result = installAtPackageRoot({ packageRoot: PACKAGE_ROOT, includeDev: needsBuild(), logsDir });
337
+ const after = result.ok ? checkRuntimeDependencies({ packageRoot: PACKAGE_ROOT }) : null;
338
+ if (!result.ok || !after.ok) {
339
+ fail('npm could not install the runtime dependencies');
340
+ info(`Command: ${result.command}`);
341
+ info(`Folder: ${result.cwd}`);
342
+ info(`Exit code: ${result.status ?? 'none'}${result.signal ? `, signal ${result.signal}` : ''}${result.timedOut ? ' (stopped after 20 minutes)' : result.error ? ` (${result.error})` : ''}`);
343
+ info(`npm log: ${result.logFile || `none written (folder ${logsDir})`}`);
344
+ if (after && !after.ok) info(`Still missing: ${after.missing.map(item => item.name).join(', ')}`);
345
+ if (kind === 'npm') info(`To repair: close SynaBun and every AI client that uses it, then run ${npmRepairCommand()}`);
346
+ startFailed('DEPENDENCIES_FAILED', `npm could not install the runtime dependencies (exit ${result.status ?? result.signal ?? result.error})`, { exitCode: result.status ?? undefined });
347
+ process.exit(1);
348
+ }
349
+ ok(`Runtime dependencies installed (${result.seconds} s)`);
350
+ // That install ran no package scripts: node-pty still needs building where it has no prebuilt binary.
351
+ const rebuild = resolve(PACKAGE_ROOT, 'neural-interface', 'scripts', 'rebuild-pty.js');
352
+ try {
353
+ execFileSync(process.execPath, [rebuild], { cwd: resolve(PACKAGE_ROOT, 'neural-interface'), stdio: 'inherit', timeout: 180_000, windowsHide: true });
354
+ } catch {
355
+ warn('node-pty could not be prepared: terminal features may not work');
356
+ }
330
357
  }
331
358
 
332
359
  // ── Phase 3: Playwright Chromium (for browser automation) ──
@@ -348,10 +375,11 @@ function installPlaywrightChromium() {
348
375
  info('Installing Playwright Chromium (for browser automation)...');
349
376
  startPhase('browser');
350
377
  try {
351
- const cli = resolve(niDir, 'node_modules', 'playwright', 'cli.js');
352
- const options = { cwd: niDir, stdio: 'inherit', timeout: 120_000 };
353
- if (existsSync(cli)) execFileSync(process.execPath, [cli, 'install', 'chromium'], options);
354
- else execSync('npx playwright install chromium', options);
378
+ // SynaBun's own Playwright (the package root's in an npm install, the part's in a checkout), never `npx`:
379
+ // npx would fetch the newest Playwright, whose Chromium is not the one this version drives.
380
+ const playwright = findInstalled(niDir, 'playwright', { stopAt: PACKAGE_ROOT });
381
+ if (!playwright) throw new Error('playwright is not installed');
382
+ execFileSync(process.execPath, [join(playwright.path, 'cli.js'), 'install', 'chromium'], { cwd: niDir, stdio: 'inherit', timeout: 120_000 });
355
383
  ok('Playwright Chromium installed');
356
384
  } catch (err) {
357
385
  console.log(' (optional) Playwright Chromium install failed — system Chrome will be used');
@@ -373,8 +401,13 @@ function buildMcpServer() {
373
401
 
374
402
  info('Building MCP server from source...');
375
403
  startPhase('build');
404
+ const tsc = mcpCompiler(PACKAGE_ROOT);
405
+ if (!tsc) {
406
+ fail('MCP server build failed: TypeScript is not installed (npm install at the package root installs it)');
407
+ return;
408
+ }
376
409
  try {
377
- execSync('npx tsc', {
410
+ execFileSync(process.execPath, [tsc, '-p', resolve(PACKAGE_ROOT, 'mcp-server')], {
378
411
  cwd: resolve(PACKAGE_ROOT, 'mcp-server'),
379
412
  stdio: ['ignore', 'pipe', 'pipe'],
380
413
  windowsHide: !!packagedRuntime(),
@@ -841,11 +874,10 @@ async function main() {
841
874
  checkNodeVersion();
842
875
  console.log('');
843
876
 
844
- // Dependencies (installed in global package location)
877
+ // Dependencies (npm installed them with the package; this only checks)
845
878
  // A slow step names itself when it begins (startPhase inside each); between
846
879
  // them the record goes back to 'checking', so it never names a finished one.
847
- installDeps('Neural Interface', resolve(PACKAGE_ROOT, 'neural-interface'));
848
- installDeps('MCP Server', resolve(PACKAGE_ROOT, 'mcp-server'), { includeDev: needsBuild() });
880
+ ensureRuntimeDependencies();
849
881
  startPhase('checking');
850
882
  console.log('');
851
883
 
@@ -128,7 +128,7 @@ If the user says yes:
128
128
  2. If not, create it with the runtime's category-management tool using:
129
129
  - `name`: "ideas"
130
130
  - `description`: "Brainstormed features, experiments, and creative explorations"
131
- - `parent`: the current project's parent category (e.g., "my-project") — or no parent if no project match
131
+ - `parent`: the current project's parent category (e.g., "my-project") only when it is in the list from step 1 — otherwise no parent (a fresh install has no categories; SynaBun also creates `ideas` with no parent on the first `remember` into it)
132
132
  3. For each idea the user wants saved, call `remember` with:
133
133
  - `content`: The full idea text (title + concept + reasoning chain + next steps)
134
134
  - `category`: "ideas"
@@ -139,7 +139,7 @@ Rules baked in: `model`/`profile` **top level**; `{iterations,maxMinutes}` in `o
139
139
 
140
140
  ## Phase 5 — Remember (one MCP call)
141
141
 
142
- `remember` `category:"schedules"` (if missing, `category` action `create` child under parent `synabun`), `project:"synabun"`, `importance:6`, `tags:["schedule","<platform/topic>","conversational-created"]`, content = 4–6 lines: name, template id, schedule id, cron, group, profile/model, date.
142
+ `remember` `category:"schedules"` (SynaBun creates it on the first save, with no parent; if the runtime still reports it unknown, `category` action `create` it first, under parent `synabun` only when that category exists in `category` action `list`, otherwise with no parent), `project:"synabun"`, `importance:6`, `tags:["schedule","<platform/topic>","conversational-created"]`, content = 4–6 lines: name, template id, schedule id, cron, group, profile/model, date.
143
143
 
144
144
  ## Phase 6 — Done (one line)
145
145
 
package/updater.cmd CHANGED
@@ -2,7 +2,7 @@
2
2
  setlocal enableextensions
3
3
  title SynaBun Updater
4
4
 
5
- rem ───────────────────────────────────────────────────────
5
+ rem -------------------------------------------------------
6
6
  rem Windows shim for the cross-platform updater (updater.mjs).
7
7
  rem Invoked by the running SynaBun server via:
8
8
  rem start "" "<install>\updater.cmd" --payload payload.json
@@ -11,7 +11,7 @@ rem We use a shim instead of spawning node directly so cmd's
11
11
  rem quoting rules don't mangle the command line, and so the
12
12
  rem window stays open for the user to read npm output even
13
13
  rem if node exits unexpectedly.
14
- rem ───────────────────────────────────────────────────────
14
+ rem -------------------------------------------------------
15
15
 
16
16
  set "SCRIPT_DIR=%~dp0"
17
17
  set "EXIT_CODE=0"