synabun 2.0.0 → 2.0.5

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 (334) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/NOTICE +5 -0
  3. package/README.md +1 -1
  4. package/THIRD-PARTY-LICENSES.md +46 -0
  5. package/benchmarks/fixtures/browser/README.md +1 -1
  6. package/benchmarks/fixtures/desktop/README.md +1 -1
  7. package/docs/whatsapp.md +2 -2
  8. package/hooks/claude-code/pre-compact.mjs +11 -0
  9. package/hooks/claude-code/prompt-submit.mjs +60 -184
  10. package/hooks/claude-code/session-start.mjs +73 -16
  11. package/hooks/claude-code/shared.mjs +20 -0
  12. package/hooks/claude-code/stop.mjs +5 -5
  13. package/lib/start-launcher.js +88 -1
  14. package/mcp-server/package-lock.json +2 -2
  15. package/mcp-server/package.json +1 -3
  16. package/neural-interface/i18n/en.json +1500 -153
  17. package/neural-interface/i18n/pt-BR.json +1498 -152
  18. package/neural-interface/lib/assistant-api.js +62 -6
  19. package/neural-interface/lib/assistant-brains/claude.js +4 -0
  20. package/neural-interface/lib/assistant-catalog.js +179 -27
  21. package/neural-interface/lib/assistant-config.js +31 -2
  22. package/neural-interface/lib/assistant-dispatch.js +62 -13
  23. package/neural-interface/lib/assistant-hidden-models.js +393 -66
  24. package/neural-interface/lib/assistant-memory.js +24 -10
  25. package/neural-interface/lib/assistant-persona.js +6 -2
  26. package/neural-interface/lib/assistant-pricing.js +21 -6
  27. package/neural-interface/lib/assistant-runtime.js +181 -12
  28. package/neural-interface/lib/assistant-task-prompt.js +13 -3
  29. package/neural-interface/lib/assistant-test-density.js +142 -0
  30. package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
  31. package/neural-interface/lib/assistant-user-context.js +908 -0
  32. package/neural-interface/lib/assistant-user-knowledge.js +328 -0
  33. package/neural-interface/lib/assistant-user-learn.js +404 -0
  34. package/neural-interface/lib/assistant-user-threads.js +226 -0
  35. package/neural-interface/lib/assistant-user-writer.js +181 -0
  36. package/neural-interface/lib/browser-background-tab.js +134 -0
  37. package/neural-interface/lib/browser-screenshot.js +678 -61
  38. package/neural-interface/lib/claude-agent-bridge.js +33 -6
  39. package/neural-interface/lib/claude-model-catalog.js +30 -2
  40. package/neural-interface/lib/claude-temporary.js +46 -7
  41. package/neural-interface/lib/cloudflared/install.js +533 -0
  42. package/neural-interface/lib/cloudflared/manager.js +545 -0
  43. package/neural-interface/lib/cloudflared/pins.js +115 -0
  44. package/neural-interface/lib/cloudflared/pins.json +63 -0
  45. package/neural-interface/lib/cloudflared/tunnel.js +265 -0
  46. package/neural-interface/lib/editor-completion-endpoint.js +264 -0
  47. package/neural-interface/lib/editor-completion-opencode.js +436 -0
  48. package/neural-interface/lib/editor-completion.js +714 -0
  49. package/neural-interface/lib/editor-config.js +149 -0
  50. package/neural-interface/lib/editor-files-api.js +268 -0
  51. package/neural-interface/lib/editor-git-api.js +134 -0
  52. package/neural-interface/lib/file-explorer-api.js +1039 -0
  53. package/neural-interface/lib/file-explorer-system.js +355 -0
  54. package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
  55. package/neural-interface/lib/file-explorer-watch.js +239 -0
  56. package/neural-interface/lib/git-diff-api.js +103 -0
  57. package/neural-interface/lib/git-read.js +202 -0
  58. package/neural-interface/lib/greeting/api.js +89 -0
  59. package/neural-interface/lib/greeting/budgets.js +90 -0
  60. package/neural-interface/lib/greeting/engine.js +461 -0
  61. package/neural-interface/lib/greeting/facts.js +320 -0
  62. package/neural-interface/lib/greeting/sources.js +252 -0
  63. package/neural-interface/lib/greeting/writer.js +139 -0
  64. package/neural-interface/lib/http-guards.js +189 -13
  65. package/neural-interface/lib/machine-names.js +88 -0
  66. package/neural-interface/lib/memory-api.js +31 -7
  67. package/neural-interface/lib/native-loop-providers.js +10 -5
  68. package/neural-interface/lib/plugin-installer.js +4 -2
  69. package/neural-interface/lib/project-storage.js +5 -7
  70. package/neural-interface/lib/request-gate.js +589 -0
  71. package/neural-interface/lib/ui-blob-api.js +108 -0
  72. package/neural-interface/lib/ui-blob-store.js +68 -0
  73. package/neural-interface/package-lock.json +701 -2
  74. package/neural-interface/package.json +13 -2
  75. package/neural-interface/public/install-app.html +9 -6
  76. package/neural-interface/public/offline.html +3 -2
  77. package/neural-interface/public/onboarding.html +12 -1
  78. package/neural-interface/public/shared/agent-runtime-options.js +22 -6
  79. package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
  80. package/neural-interface/public/shared/assistant/asst-brain-picker.js +312 -62
  81. package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
  82. package/neural-interface/public/shared/assistant/asst-mascot.js +18 -58
  83. package/neural-interface/public/shared/assistant/asst-menu.js +12 -8
  84. package/neural-interface/public/shared/assistant/asst-panel.js +150 -28
  85. package/neural-interface/public/shared/assistant/asst-render.js +162 -19
  86. package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
  87. package/neural-interface/public/shared/assistant/asst-route.js +23 -329
  88. package/neural-interface/public/shared/assistant/asst-routes-editor.js +495 -0
  89. package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
  90. package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
  91. package/neural-interface/public/shared/assistant/asst-state.js +185 -1
  92. package/neural-interface/public/shared/assistant/asst-styles.js +158 -4
  93. package/neural-interface/public/shared/blob-store.js +111 -22
  94. package/neural-interface/public/shared/cdx/cdx-panel.js +32 -11
  95. package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
  96. package/neural-interface/public/shared/cdx/cdx-styles.js +36 -0
  97. package/neural-interface/public/shared/cdx/cdx-tabs.js +87 -4
  98. package/neural-interface/public/shared/constants.js +6 -1
  99. package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
  100. package/neural-interface/public/shared/cp/cp-styles.js +15 -0
  101. package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
  102. package/neural-interface/public/shared/editor/editor-ai.js +619 -0
  103. package/neural-interface/public/shared/editor/editor-commands.js +212 -0
  104. package/neural-interface/public/shared/editor/editor-compare.js +103 -0
  105. package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
  106. package/neural-interface/public/shared/editor/editor-doc.js +257 -0
  107. package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
  108. package/neural-interface/public/shared/editor/editor-git.js +95 -0
  109. package/neural-interface/public/shared/editor/editor-languages.js +156 -0
  110. package/neural-interface/public/shared/editor/editor-lint.js +229 -0
  111. package/neural-interface/public/shared/editor/editor-loader.js +51 -0
  112. package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
  113. package/neural-interface/public/shared/editor/editor-menu.js +233 -0
  114. package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
  115. package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
  116. package/neural-interface/public/shared/editor/editor-palette.js +125 -0
  117. package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
  118. package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
  119. package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
  120. package/neural-interface/public/shared/editor/editor-safety.js +500 -0
  121. package/neural-interface/public/shared/editor/editor-search.js +352 -0
  122. package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
  123. package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
  124. package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
  125. package/neural-interface/public/shared/editor/editor-theme.js +244 -0
  126. package/neural-interface/public/shared/editor/editor-view.js +332 -0
  127. package/neural-interface/public/shared/explorer/fx-api.js +216 -0
  128. package/neural-interface/public/shared/explorer/fx-links.js +204 -0
  129. package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
  130. package/neural-interface/public/shared/explorer/fx-main.js +865 -0
  131. package/neural-interface/public/shared/explorer/fx-names.js +87 -0
  132. package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
  133. package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
  134. package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
  135. package/neural-interface/public/shared/file-links.js +339 -0
  136. package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
  137. package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
  138. package/neural-interface/public/shared/html-shell.js +160 -165
  139. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
  140. package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
  141. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +99 -17
  142. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
  143. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +5 -0
  144. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +40 -0
  145. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
  146. package/neural-interface/public/shared/pwa-install-page.js +29 -1
  147. package/neural-interface/public/shared/pwa-install.css +3 -3
  148. package/neural-interface/public/shared/pwa-install.js +100 -1
  149. package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
  150. package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
  151. package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
  152. package/neural-interface/public/shared/settings/settings-ia.js +18 -4
  153. package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
  154. package/neural-interface/public/shared/start-bridge.js +238 -19
  155. package/neural-interface/public/shared/styles.css +1414 -721
  156. package/neural-interface/public/shared/synabun-mascot.js +20 -56
  157. package/neural-interface/public/shared/tunnel-view.js +167 -0
  158. package/neural-interface/public/shared/ui-claude-panel.js +157 -16
  159. package/neural-interface/public/shared/ui-detail.js +15 -0
  160. package/neural-interface/public/shared/ui-explorer.js +22 -0
  161. package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
  162. package/neural-interface/public/shared/ui-file-links.js +103 -0
  163. package/neural-interface/public/shared/ui-help.js +26 -0
  164. package/neural-interface/public/shared/ui-invite.js +126 -116
  165. package/neural-interface/public/shared/ui-keybinds.js +4 -0
  166. package/neural-interface/public/shared/ui-loading.js +159 -15
  167. package/neural-interface/public/shared/ui-menubar.js +12 -30
  168. package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
  169. package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
  170. package/neural-interface/public/shared/ui-navbar.js +45 -21
  171. package/neural-interface/public/shared/ui-settings.js +455 -488
  172. package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
  173. package/neural-interface/public/shared/ui-sync.js +16 -0
  174. package/neural-interface/public/shared/ui-terminal.js +23 -5
  175. package/neural-interface/public/shared/ui-tunnel.js +130 -0
  176. package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
  177. package/neural-interface/public/shared/ui-whiteboard.js +12 -0
  178. package/neural-interface/public/shared/ui-worker-end.js +245 -0
  179. package/neural-interface/public/shared/ui-workspaces.js +41 -27
  180. package/neural-interface/public/shared/worker-end.js +251 -0
  181. package/neural-interface/public/sw.js +2 -2
  182. package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
  183. package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
  184. package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
  185. package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
  186. package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
  187. package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
  188. package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
  189. package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
  190. package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
  191. package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
  192. package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
  193. package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
  194. package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
  195. package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
  196. package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
  197. package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
  198. package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
  199. package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
  200. package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
  201. package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
  202. package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
  203. package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
  204. package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
  205. package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
  206. package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
  207. package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
  208. package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
  209. package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
  210. package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
  211. package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
  212. package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
  213. package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
  214. package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
  215. package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
  216. package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
  217. package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
  218. package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
  219. package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
  220. package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
  221. package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
  222. package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
  223. package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
  224. package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
  225. package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
  226. package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
  227. package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
  228. package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
  229. package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
  230. package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
  231. package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
  232. package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
  233. package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
  234. package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
  235. package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
  236. package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
  237. package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
  238. package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
  239. package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
  240. package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
  241. package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
  242. package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
  243. package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
  244. package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
  245. package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
  246. package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
  247. package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
  248. package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
  249. package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
  250. package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
  251. package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
  252. package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
  253. package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
  254. package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
  255. package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
  256. package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
  257. package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
  258. package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
  259. package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
  260. package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
  261. package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
  262. package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
  263. package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
  264. package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
  265. package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
  266. package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
  267. package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
  268. package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
  269. package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
  270. package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
  271. package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
  272. package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
  273. package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
  274. package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
  275. package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
  276. package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
  277. package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
  278. package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
  279. package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
  280. package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
  281. package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
  282. package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
  283. package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
  284. package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
  285. package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
  286. package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
  287. package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
  288. package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
  289. package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
  290. package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
  291. package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
  292. package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
  293. package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
  294. package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
  295. package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
  296. package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
  297. package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
  298. package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
  299. package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
  300. package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
  301. package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
  302. package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
  303. package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
  304. package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
  305. package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
  306. package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
  307. package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
  308. package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
  309. package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
  310. package/neural-interface/scripts/build-vendor.mjs +78 -2
  311. package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
  312. package/neural-interface/server.js +873 -1028
  313. package/neural-interface/templates/rulesets/README.md +1 -1
  314. package/package.json +2 -8
  315. package/setup.js +44 -7
  316. package/benchmarks/browser-live-results.json +0 -79
  317. package/benchmarks/browser-v2-results.json +0 -258
  318. package/neural-interface/lib/codex-capabilities.d.ts +0 -41
  319. package/neural-interface/public/category-logos/claude.svg +0 -1
  320. package/neural-interface/public/category-logos/gemini-color.svg +0 -1
  321. package/neural-interface/public/category-logos/openai.svg +0 -1
  322. package/neural-interface/public/category-logos/synabun.png +0 -0
  323. package/neural-interface/public/claude.svg +0 -1
  324. package/neural-interface/public/gallery.svg +0 -6
  325. package/neural-interface/public/leonardoai.svg +0 -1
  326. package/neural-interface/public/mcp.svg +0 -4
  327. package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
  328. package/neural-interface/public/pin-svgrepo-com.svg +0 -25
  329. package/neural-interface/public/sessionicon.svg +0 -8
  330. package/neural-interface/public/toolbar-album.svg +0 -8
  331. package/neural-interface/public/toolbar-question.svg +0 -6
  332. package/neural-interface/public/toolbar-sessions.svg +0 -6
  333. package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
  334. package/skills/synabun/synabunicon.png +0 -0
@@ -3,8 +3,10 @@
3
3
  /**
4
4
  * SynaBun SessionStart Hook for Claude Code
5
5
  *
6
- * Injects a lean session-start context: greeting, single recall directive,
7
- * and (when applicable) compaction indexing instructions.
6
+ * Injects a lean session-start context: the memory header and (when
7
+ * applicable) compaction indexing instructions. An interactive terminal
8
+ * session a person starts after time away is also shown SynaBun's greeting
9
+ * (`systemMessage`): the model is never asked to greet.
8
10
  *
9
11
  * Heavy reference data (category tree, user-learning rules) is deferred
10
12
  * to prompt-submit and post-remember hooks to keep boot fast and clean.
@@ -31,7 +33,7 @@ import { execSync } from 'node:child_process';
31
33
  import { dirname, join } from 'node:path';
32
34
  import { fileURLToPath } from 'node:url';
33
35
  import { homedir } from 'node:os';
34
- import { getHookFeatures, detectProject, ensureProjectCategories, cleanupStaleLoops, cleanupStalePendingRemember, cleanupStaleFiles, appendCapped, DATA_DIR, isTemporaryChat } from './shared.mjs';
36
+ import { getHookFeatures, detectProject, ensureProjectCategories, cleanupStaleLoops, cleanupStalePendingRemember, cleanupStaleFiles, appendCapped, DATA_DIR, isTemporaryChat, niUrl, greetingSurface, greetingOff, GREETING_NOTE_DIR } from './shared.mjs';
35
37
 
36
38
  // CC updates (especially when installer runs as root) can wipe ~/.claude.json
37
39
  // or strip mcpServers.SynaBun, leaving the side panel/CLI with MCP disabled
@@ -65,7 +67,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url));
65
67
  const PRECOMPACT_DIR = join(DATA_DIR, 'precompact');
66
68
  const DEBUG_LOG = join(DATA_DIR, 'compact-debug.log');
67
69
  const LOOP_DIR = join(DATA_DIR, 'loop');
68
- // NOTE: Greeting helpers removed — greeting is now built entirely by prompt-submit.mjs
70
+ // NOTE: the template greeting and its helpers are gone. SynaBun writes the greeting itself (openGreeting below).
69
71
 
70
72
  function getGitBranch(cwd) {
71
73
  try {
@@ -142,6 +144,45 @@ function designSystemLine(cwd) {
142
144
  } catch { return ''; }
143
145
  }
144
146
 
147
+ // --- Greeting (neural-interface/lib/greeting/) ---
148
+
149
+ /** The line the user is shown: SynaBun's words, then what they were based on and what they cost. */
150
+ function greetingLine(greeting) {
151
+ const head = greeting.away ? `SynaBun \u00b7 back after ${greeting.away}` : 'SynaBun';
152
+ const records = Array.isArray(greeting.basis) ? greeting.basis.length : 0;
153
+ const cost = greeting.source === 'writer'
154
+ ? `written ahead by ${greeting.model || 'Claude'}${Number(greeting.costUsd) > 0 ? ` for $${Number(greeting.costUsd).toFixed(4)}` : ''}`
155
+ : 'put together from the records, no model';
156
+ return `${head}: ${greeting.text}\n(${records === 1 ? 'based on 1 record' : `based on ${records} records`}, ${cost})`;
157
+ }
158
+
159
+ /**
160
+ * Ask SynaBun's greeting engine whether this opening is a return worth a greeting (a lookup: the
161
+ * sentence was written ahead of time). → the line to show the user, or ''. The note for the model
162
+ * is kept for prompt-submit.mjs, which adds it to the first prompt, once.
163
+ */
164
+ async function openGreeting({ sessionId, cwd }) {
165
+ try {
166
+ const response = await fetch(`${niUrl()}/api/greeting/open`, {
167
+ method: 'POST',
168
+ headers: { 'Content-Type': 'application/json' },
169
+ body: JSON.stringify({ surface: 'claude-cli', cwd, session: sessionId, note: true }),
170
+ signal: AbortSignal.timeout(1200),
171
+ });
172
+ if (!response.ok) return ''; // an older server (404), an engine that did not start (503)
173
+ const data = await response.json();
174
+ const greeting = data?.greeting;
175
+ if (!greeting || typeof greeting.text !== 'string' || !greeting.text.trim()) return '';
176
+ if (typeof data.note === 'string' && data.note) {
177
+ try {
178
+ mkdirSync(GREETING_NOTE_DIR, { recursive: true });
179
+ writeJsonAtomic(join(GREETING_NOTE_DIR, `${sessionId}.json`), { id: greeting.id || null, note: data.note, at: new Date().toISOString() });
180
+ } catch { /* the greeting is still shown; the model simply is not told */ }
181
+ }
182
+ return greetingLine(greeting);
183
+ } catch { return ''; }
184
+ }
185
+
145
186
  // --- Main ---
146
187
 
147
188
  async function main() {
@@ -208,10 +249,10 @@ async function main() {
208
249
  const context = [];
209
250
 
210
251
  // ============================================================
211
- // BLOCK 0: GREETING (highest attention, unless compaction or loop)
252
+ // BLOCK 0: LOOP DETECTION (a loop session gets a minimal context and returns here)
212
253
  // ============================================================
213
254
 
214
- // Detect active loop — skip greeting + recall for autonomous loop sessions
255
+ // Detect active loop — an autonomous loop session gets no recall directive and is never greeted
215
256
  // Check both pending files (first iteration) AND active state files (subsequent iterations after /clear).
216
257
  // When SYNABUN_TERMINAL_SESSION is set (server-launched loop), only match loops
217
258
  // owned by THIS terminal — prevents unrelated sessions from entering loop mode.
@@ -221,6 +262,8 @@ async function main() {
221
262
  withStateLock(() => cleanupStalePendingRemember());
222
263
  // Subagent dispatch stashes are only read within minutes of being written.
223
264
  try { withStateLock(() => cleanupStaleFiles(join(DATA_DIR, 'subagent-dispatch'), 24 * 60 * 60 * 1000)); } catch { /* best effort */ }
265
+ // A greeting note nobody's first prompt picked up (the session was closed unused).
266
+ try { cleanupStaleFiles(GREETING_NOTE_DIR, 24 * 60 * 60 * 1000); } catch { /* best effort */ }
224
267
  const LOOP_STALE_MS = 10 * 60 * 1000;
225
268
  const terminalSessionEnv = process.env.SYNABUN_TERMINAL_SESSION || '';
226
269
  let isLoopSession = false;
@@ -242,7 +285,7 @@ async function main() {
242
285
  // - env set → require exact terminalSessionId match
243
286
  // - env unset → only match loops WITHOUT terminalSessionId
244
287
  // A non-loop CLI (env unset) must NOT latch onto a scheduled loop
245
- // and suppress its greeting + recall.
288
+ // and lose its context and its greeting.
246
289
  if (terminalSessionEnv) {
247
290
  if (data.terminalSessionId !== terminalSessionEnv) continue;
248
291
  } else {
@@ -282,9 +325,10 @@ async function main() {
282
325
  return;
283
326
  }
284
327
 
285
- // NOTE: Greeting is NOT injected here. It is injected by prompt-submit.mjs
286
- // on the FIRST user message only, so it never persists in session context
287
- // and cannot trigger re-greeting on subsequent messages.
328
+ // NOTE: no greeting is put in the model's context here. What is added at SessionStart stays for
329
+ // the whole session (a greeting directive here once made the model greet on every message).
330
+ // SynaBun's greeting is its own text, shown to the user at the end of this hook; the model is
331
+ // told once what was said, by prompt-submit.mjs, with the first prompt.
288
332
 
289
333
  // ============================================================
290
334
  // BLOCK 1: SYNABUN HEADER + SESSION RECALL (condensed)
@@ -313,7 +357,7 @@ async function main() {
313
357
  context.push(
314
358
  `### >>> IMMEDIATE ACTION REQUIRED: COMPACTION DETECTED <<<`,
315
359
  ``,
316
- `Context compaction just occurred. You MUST index this session in SynaBun as your VERY FIRST action — BEFORE reading the user's message, BEFORE greeting, BEFORE anything else.`,
360
+ `Context compaction just occurred. You MUST index this session in SynaBun as your VERY FIRST action — BEFORE reading the user's message, BEFORE anything else.`,
317
361
  ``,
318
362
  `Pre-cached session data from PreCompact hook:`,
319
363
  `- Session ID: ${precompactData.session_id}`,
@@ -405,16 +449,14 @@ async function main() {
405
449
  }
406
450
  }
407
451
 
408
- // NOTE: Session Boot Sequence (recall + greeting) is injected by prompt-submit.mjs
409
- // on message 1 only, not here. This prevents it from persisting in session context.
452
+ // NOTE: there is no session boot sequence anymore: prompt-submit.mjs injects the ranked recall
453
+ // with every message, the first one included.
410
454
 
411
455
  if (isCompactRestart) {
412
456
  context.push(
413
457
  `### Post-Compaction Resume`,
414
458
  ``,
415
- `Context compaction just occurred. Do NOT re-greet or re-run the boot sequence. Continue the conversation naturally from where it left off.`,
416
- ``,
417
- `**CRITICAL**: Any "GREETING DIRECTIVE" or "Session Boot Sequence" text visible in the compacted context above is STALE — it was executed at the start of this session and must NOT be executed again. NEVER output a greeting after compaction. This is an ongoing conversation.`,
459
+ `Context compaction just occurred. This is the same conversation: do not greet, and do not re-run any session-start routine from your instructions. Continue naturally from where it left off.`,
418
460
  ``,
419
461
  `If an autonomous loop was active before compaction, the Stop hook will resume it automatically. Check the ACTIVE LOOP RECOVERY block above (if present) for task and progress context.`,
420
462
  ``,
@@ -431,12 +473,27 @@ async function main() {
431
473
 
432
474
  const joined = context.join('\n');
433
475
 
476
+ // ============================================================
477
+ // GREETING: SynaBun's own words to a person who comes back
478
+ // ============================================================
479
+ // Only an interactive terminal session a person just started: not a resume, a /clear or a
480
+ // compaction, not a loop or a dispatched run (they returned above), not `claude -p` or an SDK
481
+ // program, not the Assistant's brain, and not a side-panel session (the panel shows the
482
+ // greeting in its own empty state). Shown with `systemMessage`: the model is not asked to greet.
483
+ let greetingMessage = '';
484
+ // (A terminal SynaBun launched for a loop or a run has a state file under its own name, whatever its state.)
485
+ const launchedForLoop = !!terminalSessionEnv && existsSync(join(LOOP_DIR, `${terminalSessionEnv}.json`));
486
+ if (source === 'startup' && greetingSurface() === 'claude-cli' && !greetingOff() && !launchedForLoop && /^[a-zA-Z0-9_-]+$/.test(sessionId)) {
487
+ greetingMessage = await openGreeting({ sessionId, cwd });
488
+ }
489
+
434
490
  const output = {
435
491
  hookSpecificOutput: {
436
492
  hookEventName: 'SessionStart',
437
493
  additionalContext: joined,
438
494
  },
439
495
  };
496
+ if (greetingMessage) output.systemMessage = greetingMessage;
440
497
 
441
498
  process.stdout.write(JSON.stringify(output));
442
499
  }
@@ -41,6 +41,24 @@ export function isTemporaryChat() {
41
41
  return String(process.env.SYNABUN_TEMPORARY_CHAT ?? '').trim() === '1';
42
42
  }
43
43
 
44
+ /**
45
+ * Where a Claude Code session was opened, for SynaBun's greeting (neural-interface/lib/greeting/):
46
+ * 'claude-panel' for a session of the Claude Code side panel (its bridge sets the marker, and the
47
+ * panel shows the greeting itself), 'claude-cli' for an interactive terminal session, null for
48
+ * everything else: `claude -p`, an SDK program, the Assistant's brain. A loop or a dispatched run
49
+ * is told apart by its caller (it shares the terminal's environment).
50
+ */
51
+ export function greetingSurface(env = process.env) {
52
+ if (env.SYNABUN_ASSISTANT_SESSION) return null;
53
+ if (String(env.SYNABUN_PANEL_SESSION ?? '').trim() === '1') return 'claude-panel';
54
+ return env.CLAUDE_CODE_ENTRYPOINT === 'cli' ? 'claude-cli' : null;
55
+ }
56
+
57
+ /** SYNABUN_GREETING=off: no greeting is asked for, whatever Settings says. */
58
+ export function greetingOff(env = process.env) {
59
+ return /^(off|0|false|no)$/i.test(String(env.SYNABUN_GREETING ?? '').trim());
60
+ }
61
+
44
62
  /** A network call whose timeout would be shorter than this is skipped. */
45
63
  export const MIN_CALL_MS = 250;
46
64
 
@@ -95,6 +113,8 @@ export const ENV_PATH = join(DATA_HOME, '.env');
95
113
  export const HOOK_FEATURES_PATH = join(DATA_DIR, 'hook-features.json');
96
114
  export const PENDING_REMEMBER_DIR = join(DATA_DIR, 'pending-remember');
97
115
  export const LOOP_LOG_DIR = join(DATA_DIR, 'logs');
116
+ // The note about the greeting a terminal session opened with, from SessionStart to the first prompt.
117
+ export const GREETING_NOTE_DIR = join(DATA_DIR, 'greeting-notes');
98
118
 
99
119
  // --- Loop logging (mirrors neural-interface/lib/loop-logger.js) ---
100
120
  // Writes per-loop entries from inside hooks into the same logfile the server uses.
@@ -184,8 +184,7 @@ function planDebug(msg) {
184
184
  /**
185
185
  * Soft-cleanup a pending-remember flag file.
186
186
  * Resets enforcement fields (editCount, retries, files) while preserving
187
- * session-wide tracking (messageCount, greetingDelivered, etc.) to prevent
188
- * the greeting from re-firing mid-session.
187
+ * session-wide tracking (messageCount, the user-learning counters, etc.).
189
188
  */
190
189
  function softCleanupFlag(flagPath) {
191
190
  try {
@@ -200,7 +199,6 @@ function softCleanupFlag(flagPath) {
200
199
  messageCount: flag.messageCount || 0,
201
200
  totalSessionMessages: flag.totalSessionMessages || 0,
202
201
  totalEdits: flag.totalEdits || 0,
203
- greetingDelivered: flag.greetingDelivered || false,
204
202
  categoryTreeInjected: flag.categoryTreeInjected || false,
205
203
  rememberCount: flag.rememberCount || 0,
206
204
  planRetries: flag.planRetries || 0,
@@ -225,7 +223,7 @@ function softCleanupFlag(flagPath) {
225
223
  writeJsonAtomic(flagPath, cleaned);
226
224
  } catch {
227
225
  // If we can't clean up gracefully, leave the file as-is
228
- // (better than deleting and resetting greeting tracking)
226
+ // (better than deleting and resetting the session's counters)
229
227
  }
230
228
  }
231
229
 
@@ -920,7 +918,9 @@ function handleStop({ sessionId, lastMessage, cwd, transcriptPath, judged = {},
920
918
  // CHECK 2.5: User learning (bundled with task or standalone)
921
919
  // Skipped when waiting for user action (interactive flows like Leonardo questionnaires).
922
920
  // Limited to 1 retry to minimize chat noise.
923
- if (!waitingForUser && flag.userLearningPending && !flag.userLearningObserved) {
921
+ // Never inside the Assistant's brain (SYNABUN_ASSISTANT_SESSION): SynaBun's harness learns
922
+ // about the user there, and prompt-submit.mjs never arms this in it.
923
+ if (!waitingForUser && flag.userLearningPending && !flag.userLearningObserved && !process.env.SYNABUN_ASSISTANT_SESSION) {
924
924
  const ulRetries = flag.userLearningRetries || 0;
925
925
  if (ulRetries < 1) {
926
926
  flag.userLearningRetries = ulRetries + 1;
@@ -18,6 +18,8 @@
18
18
  * running, the Terminal asked to open, the supervisor's own
19
19
  * phases, the server answering) on a loopback beacon the
20
20
  * offline page reads, because that page has no server to ask.
21
+ * A restart is reported the same way, by the supervisor that
22
+ * brings the server back (`openRestartReport`).
21
23
  *
22
24
  * Nothing here stays running: the OS starts the launcher per click and it
23
25
  * exits once the server answers.
@@ -823,6 +825,9 @@ export function publicSupervisorState(record) {
823
825
  * rebinding a name), gives the answer only to a page of this server's own
824
826
  * loopback origin, and changes nothing. A port it cannot have is not an
825
827
  * error: the launch goes on unreported and the page says less.
828
+ *
829
+ * `reason: 'restart'` is a supervisor bringing its server back, not a launcher
830
+ * starting one: the answer then says so, and its first step is 'restart'.
826
831
  */
827
832
  export function createStartBeacon({
828
833
  port,
@@ -830,12 +835,14 @@ export function createStartBeacon({
830
835
  now = () => Date.now(),
831
836
  launchId = randomBytes(8).toString('hex'),
832
837
  logPath = null,
838
+ reason = 'start',
833
839
  createServerImpl = createServer,
834
840
  } = {}) {
841
+ const restart = reason === 'restart';
835
842
  const beaconPort = startBeaconPort(port);
836
843
  const hosts = new Set([`127.0.0.1:${beaconPort}`, `localhost:${beaconPort}`]);
837
844
  const origins = new Set([`http://localhost:${port}`, `http://127.0.0.1:${port}`, `http://[::1]:${port}`]);
838
- const status = { state: 'starting', steps: [{ id: 'received', at: startedAt }], supervisor: null, error: null };
845
+ const status = { state: 'starting', steps: [{ id: restart ? 'restart' : 'received', at: startedAt }], supervisor: null, error: null };
839
846
  let server = null;
840
847
  let listening = false;
841
848
  let closed = false;
@@ -858,6 +865,7 @@ export function createStartBeacon({
858
865
  supervisor: status.supervisor,
859
866
  error: status.error,
860
867
  log: logPath,
868
+ ...(restart ? { reason: 'restart' } : {}),
861
869
  });
862
870
 
863
871
  function handle(req, res) {
@@ -991,6 +999,85 @@ export function createStartBeacon({
991
999
  };
992
1000
  }
993
1001
 
1002
+ // ═══════════════════════════════════════════
1003
+ // Progress: a restart
1004
+ // ═══════════════════════════════════════════
1005
+
1006
+ /** Set by a server that had no supervisor for the one it starts to restart it: that start is a restart's. */
1007
+ export const RESTART_REPORT_ENV = 'SYNABUN_RESTART_REPORT';
1008
+ /** How long a restart's report stays once the server said it is listening: a page polls every 300 ms. */
1009
+ export const RESTART_REPORT_SETTLE_MS = 3000;
1010
+
1011
+ /**
1012
+ * A restart reports itself the way a launch does, on the start beacon, for as
1013
+ * long as the server is away: the page that asked has no server to ask. Opened
1014
+ * by the supervisor (setup.js) when the server it runs exits to be restarted
1015
+ * (`exited: true`: it saw that process end), and by a supervisor that a server
1016
+ * without one started in its place.
1017
+ *
1018
+ * phase() — the supervisor's record changed: pass on what it says now
1019
+ * failed(error) — it ended without a server; resolves once a page has read
1020
+ * why (`lingerMs` at the most), so the caller can exit then
1021
+ * close() — over
1022
+ *
1023
+ * Only what the supervisor writes after the report began goes out: a record
1024
+ * from before it (the server that just stopped was 'listening') is not news.
1025
+ * The report ends by itself a moment after the server says it is listening.
1026
+ * Never throws; a beacon it cannot have leaves the restart unreported.
1027
+ */
1028
+ export function openRestartReport({
1029
+ port,
1030
+ dataHome,
1031
+ exited = false,
1032
+ now = () => Date.now(),
1033
+ settleMs = RESTART_REPORT_SETTLE_MS,
1034
+ lingerMs = BEACON_LINGER_MS,
1035
+ beacon = createStartBeacon,
1036
+ } = {}) {
1037
+ const startedAt = now();
1038
+ let report = null;
1039
+ try { report = beacon({ port, startedAt, now, reason: 'restart' }); } catch {}
1040
+ let over = !report;
1041
+ let settle = null;
1042
+ const close = () => {
1043
+ if (over) return;
1044
+ over = true;
1045
+ if (settle) clearTimeout(settle);
1046
+ settle = null;
1047
+ try { report.close(); } catch {}
1048
+ };
1049
+ // An earlier report (a restart right before this one) may still be letting go.
1050
+ let listening = Promise.resolve(false);
1051
+ if (report) {
1052
+ try { listening = Promise.resolve(report.listen({ retryMs: 5000 })).catch(() => false); } catch {}
1053
+ if (exited) report.step('exited');
1054
+ }
1055
+ return {
1056
+ get open() { return !over; },
1057
+ phase() {
1058
+ if (over) return;
1059
+ let record = null;
1060
+ try { record = readJson(launcherStatePaths(dataHome).supervisor); } catch {}
1061
+ if (!record || !(Number(record.phaseAt) >= startedAt)) return;
1062
+ report.supervisor(record);
1063
+ if (record.phase === 'listening' && !settle) {
1064
+ settle = setTimeout(close, settleMs);
1065
+ settle.unref?.();
1066
+ }
1067
+ },
1068
+ async failed(error) {
1069
+ if (over) return;
1070
+ if (settle) clearTimeout(settle);
1071
+ settle = null;
1072
+ report.finish('failed', error);
1073
+ await listening; // a failure right after it opened: let it be reachable first
1074
+ try { await report.linger(lingerMs); } catch {}
1075
+ close();
1076
+ },
1077
+ close,
1078
+ };
1079
+ }
1080
+
994
1081
  const LOGIN_ENV_SHELLS = new Set(['zsh', 'bash', 'sh', 'dash', 'ksh', 'mksh', 'yash', 'fish']);
995
1082
  /** What a launch decides for itself. A profile may export its own; the launch's values stand. */
996
1083
  const LAUNCH_SETTINGS = ['SYNABUN_DATA_HOME', 'NEURAL_PORT', 'SYNABUN_OPEN_BROWSER'];
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "claude-memory-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.0.5",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "claude-memory-mcp",
9
- "version": "2.0.0",
9
+ "version": "2.0.5",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@huggingface/transformers": "^3.0.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-memory-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.0.5",
4
4
  "private": true,
5
5
  "description": "Private MCP server runtime bundled with SynaBun for persistent memory and agent tooling",
6
6
  "license": "Apache-2.0",
@@ -16,8 +16,6 @@
16
16
  "main": "dist/index.js",
17
17
  "scripts": {
18
18
  "build": "node ./node_modules/typescript/bin/tsc",
19
- "test": "node ./node_modules/vitest/vitest.mjs run",
20
- "test:watch": "node ./node_modules/vitest/vitest.mjs",
21
19
  "start": "node dist/index.js",
22
20
  "setup:embeddings": "node dist/scripts/setup-embeddings.js",
23
21
  "start:http": "node dist/preload-http.js",