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
@@ -45,6 +45,60 @@
45
45
  "discard": "Discard"
46
46
  },
47
47
 
48
+ "greeting": {
49
+ "label": "Greeting from SynaBun",
50
+ "back": "Back after {time}",
51
+ "time": {
52
+ "minute": "1 minute",
53
+ "minutes": "{n} minutes",
54
+ "hour": "1 hour",
55
+ "hours": "{n} hours",
56
+ "day": "1 day",
57
+ "days": "{n} days",
58
+ "week": "1 week",
59
+ "weeks": "{n} weeks",
60
+ "month": "1 month",
61
+ "months": "{n} months"
62
+ },
63
+ "basis": {
64
+ "one": "Based on 1 record",
65
+ "many": "Based on {n} records",
66
+ "none": "What this is based on"
67
+ },
68
+ "kind": {
69
+ "thread": "Last conversation",
70
+ "session": "Last session",
71
+ "open": "Open",
72
+ "memory": "Noted",
73
+ "run": "Run",
74
+ "schedule": "Schedule",
75
+ "elsewhere": "Elsewhere",
76
+ "git": "Working tree",
77
+ "owner": "About you"
78
+ },
79
+ "agent": {
80
+ "assistant": "Assistant",
81
+ "claude-code": "Claude Code",
82
+ "codex": "Codex",
83
+ "opencode": "OpenCode"
84
+ },
85
+ "open": "Open memory",
86
+ "source": {
87
+ "writer": "Written ahead by {model}",
88
+ "fallback": "Put together from the records, no model"
89
+ },
90
+ "why": {
91
+ "not-prepared": "nothing was written ahead yet",
92
+ "out-of-date": "what was written ahead was older than the news",
93
+ "no-writer": "no Claude sign-in to write with",
94
+ "daily-cap": "the daily limit of writer calls was reached",
95
+ "other": "the writer gave no usable sentence"
96
+ },
97
+ "tokens": "{n} tokens",
98
+ "prepared": "written {time} ago",
99
+ "free": "no tokens spent"
100
+ },
101
+
48
102
  "nav": {
49
103
  "view": "View",
50
104
  "graph": "Graph",
@@ -170,13 +224,32 @@
170
224
  "elapsedLabel": "Time since Start was pressed",
171
225
  "headingStarting": "Starting the server",
172
226
  "headingReady": "Server is up",
173
- "headingFailed": "The server did not start"
227
+ "headingFailed": "The server did not start",
228
+ "restartAsked": "Asked the server to restart.",
229
+ "restartStopping": "The server accepted the restart and is shutting down.",
230
+ "restartSlowStop": "Still shutting down after {seconds} s.",
231
+ "restartDown": "The server stopped answering. Waiting for it to come back.",
232
+ "restartRespawning": "The supervisor is starting the server again.",
233
+ "restartStalled": "The server has not come back. Start it with the button, or run the command below.",
234
+ "restartRefused": "The server did not accept the restart: {reason}",
235
+ "restartUnreachable": "The server did not answer the restart request.",
236
+ "restartStillRunning": "The server accepted the restart but did not shut down.",
237
+ "trailAccepted": "Restart accepted",
238
+ "trailNoAnswer": "Server stopped answering",
239
+ "trailStopped": "Server process exited",
240
+ "restartElapsedLabel": "Time since the restart began",
241
+ "headingRestarting": "Restarting the server",
242
+ "headingRestartFailed": "The server did not restart"
174
243
  },
175
244
  "runCommandOr": "Or run this command:",
176
245
  "runCommandSetup": "Run this command once. It also sets up the Start button:",
177
246
  "serverOffline": "Server Offline",
178
247
  "serverNotRunning": "The Neural Interface server is not running",
179
248
  "connectionFailed": "Connection Failed",
249
+ "restartSubAsked": "You asked for this restart. SynaBun reloads when the server is back.",
250
+ "restartSubTold": "A restart of the server was requested. SynaBun reloads when it is back.",
251
+ "restartSubRefused": "SynaBun is still running.",
252
+ "restartBack": "Back to SynaBun",
180
253
  "health": {
181
254
  "databaseUnreachable": {
182
255
  "title": "Database Unreachable",
@@ -276,6 +349,751 @@
276
349
  }
277
350
  },
278
351
 
352
+ "editor": {
353
+ "header": {
354
+ "close": "Close editor",
355
+ "find": "Find",
356
+ "wordWrap": "Toggle word wrap",
357
+ "shortcuts": "Keyboard shortcuts",
358
+ "raw": "Raw",
359
+ "preview": "Preview",
360
+ "discard": "Discard",
361
+ "save": "Save",
362
+ "closeButton": "Close",
363
+ "view": "View options",
364
+ "diff": "Compare with the last commit"
365
+ },
366
+ "shortcuts": {
367
+ "title": "Keyboard Shortcuts",
368
+ "click": "Click",
369
+ "drag": "Drag"
370
+ },
371
+ "command": {
372
+ "save": "Save",
373
+ "find": "Find",
374
+ "replace": "Replace",
375
+ "findNext": "Find next",
376
+ "findPrevious": "Find previous",
377
+ "goToLine": "Go to line",
378
+ "undo": "Undo",
379
+ "redo": "Redo",
380
+ "selectNextOccurrence": "Select next occurrence",
381
+ "selectAllOccurrences": "Select all occurrences",
382
+ "copyLineDown": "Copy line down",
383
+ "copyLineUp": "Copy line up",
384
+ "moveLineDown": "Move line down",
385
+ "moveLineUp": "Move line up",
386
+ "deleteLine": "Delete line",
387
+ "toggleLineComment": "Toggle line comment",
388
+ "toggleBlockComment": "Toggle block comment",
389
+ "indent": "Indent",
390
+ "outdent": "Outdent",
391
+ "addCursor": "Add cursor",
392
+ "addCursorBelow": "Add cursor below",
393
+ "addCursorAbove": "Add cursor above",
394
+ "columnSelection": "Column selection",
395
+ "fold": "Fold",
396
+ "unfold": "Unfold",
397
+ "jumpToBracket": "Jump to matching bracket",
398
+ "toggleWordWrap": "Toggle word wrap",
399
+ "dismiss": "Close find bar",
400
+ "aiAccept": "Accept suggestion",
401
+ "aiAcceptWord": "Accept one word of the suggestion",
402
+ "aiDismiss": "Dismiss suggestion",
403
+ "aiTrigger": "Ask for a suggestion now",
404
+ "nextTab": "Next tab",
405
+ "previousTab": "Previous tab",
406
+ "closeTab": "Close tab",
407
+ "toggleMinimap": "Toggle minimap",
408
+ "toggleIndentGuides": "Toggle indent guides",
409
+ "cycleWhitespace": "Change how whitespace is shown",
410
+ "fontLarger": "Larger text",
411
+ "fontSmaller": "Smaller text",
412
+ "fontReset": "Reset text size",
413
+ "commandPalette": "Command palette",
414
+ "goToFile": "Go to file",
415
+ "nextProblem": "Go to next problem",
416
+ "previousProblem": "Go to previous problem",
417
+ "toggleDiff": "Compare with the last commit"
418
+ },
419
+ "find": {
420
+ "placeholder": "Find...",
421
+ "label": "Find",
422
+ "matchCase": "Match case",
423
+ "wholeWord": "Whole word",
424
+ "regexp": "Regular expression",
425
+ "previous": "Previous",
426
+ "next": "Next",
427
+ "close": "Close",
428
+ "replacePlaceholder": "Replace...",
429
+ "replaceLabel": "Replace with",
430
+ "replace": "Replace",
431
+ "replaceAll": "All",
432
+ "invalid": "Invalid pattern",
433
+ "noResults": "No results",
434
+ "count": "{current} of {total}",
435
+ "total": {
436
+ "one": "{count} result",
437
+ "other": "{count} results"
438
+ }
439
+ },
440
+ "goto": {
441
+ "label": "Go to Line",
442
+ "placeholder": "Line...",
443
+ "range": "1 to {max}"
444
+ },
445
+ "fold": {
446
+ "fold": "Fold",
447
+ "unfold": "Unfold"
448
+ },
449
+ "aria": {
450
+ "content": "File contents"
451
+ },
452
+ "status": {
453
+ "plainText": "Plain Text",
454
+ "spaces": "Spaces: {n}",
455
+ "tabSize": "Tab Size: {n}",
456
+ "eolMixed": "Mixed → {eol}",
457
+ "utf8Bom": "UTF-8 with BOM",
458
+ "position": "Ln {line}, Col {column}",
459
+ "positionSelected": "Ln {line}, Col {column} ({selected} selected)",
460
+ "cursors": "Ln {line}, Col {column} ({count} cursors)",
461
+ "cursorsSelected": "Ln {line}, Col {column} ({count} cursors, {selected} selected)",
462
+ "selectLanguage": "Select language",
463
+ "selectIndent": "Select indentation",
464
+ "selectEol": "Select line ending",
465
+ "goToLine": "Go to line",
466
+ "languageSearch": "Search languages...",
467
+ "languageAuto": "Auto detect",
468
+ "languageNone": "No language matches",
469
+ "indentTabs": "Tabs",
470
+ "indentDetect": "Detect"
471
+ },
472
+ "banner": {
473
+ "planReview": "Editing plan — save to return to review",
474
+ "planSend": "Editing plan — save to send to {name}",
475
+ "changelog": "Editing changelog — save to send to Claude",
476
+ "planSaveFailed": "{message} Your edits are still open."
477
+ },
478
+ "toast": {
479
+ "saved": "Saved",
480
+ "saveFailed": "Save failed",
481
+ "planSaved": "Plan saved",
482
+ "changelogSaved": "Changelog saved — sending to Claude",
483
+ "cannotOpen": "Cannot open file",
484
+ "openFailed": "Failed to open file",
485
+ "planChanged": "The plan file changed. Reopen the current plan revision.",
486
+ "restartForOpencodeConfig": "Restart Synabun to apply OpenCode config editor support",
487
+ "tooLarge": "This file is too large to open in the editor.",
488
+ "tooLargeOver": "This file is larger than {size}, the most the editor opens.",
489
+ "changedOnDisk": "The file changed on disk. Your edits were not saved.",
490
+ "pathCopied": "Path copied",
491
+ "notInTree": "This file is not in a project of the File Explorer."
492
+ },
493
+ "error": {
494
+ "bundle": "The editor could not be loaded.",
495
+ "retry": "Retry",
496
+ "planMissingRevision": "This plan editor is missing its revision. Reopen the plan to save.",
497
+ "planChanged": "The plan changed. Reopen the latest revision before saving."
498
+ },
499
+ "refused": {
500
+ "binary": "{name} is a binary file. It cannot be edited here.",
501
+ "encoding": "{name} is not UTF-8 text. It was not opened, because saving it here would damage it."
502
+ },
503
+ "confirm": {
504
+ "close": "Discard unsaved changes?",
505
+ "discard": "Discard changes?",
506
+ "reload": "Discard your changes and reload the file from disk?",
507
+ "closeOne": "Discard unsaved changes in {name}?",
508
+ "closeMany": "Discard unsaved changes in {count} files?\n\n{files}"
509
+ },
510
+ "conflict": {
511
+ "text": "This file changed on disk after you opened it.",
512
+ "overwrite": "Overwrite",
513
+ "reload": "Reload"
514
+ },
515
+ "tabs": {
516
+ "label": "Open files",
517
+ "close": "Close {name}",
518
+ "closeUnsaved": "Close {name} (unsaved changes)",
519
+ "plan": "Plan",
520
+ "changelog": "Changelog",
521
+ "menu": {
522
+ "label": "Tab actions",
523
+ "close": "Close",
524
+ "closeOthers": "Close others",
525
+ "closeSaved": "Close saved",
526
+ "copyPath": "Copy path",
527
+ "reveal": "Reveal in tree"
528
+ }
529
+ },
530
+ "disk": {
531
+ "changed": "This file changed on disk.",
532
+ "deleted": "This file was deleted or moved on disk.",
533
+ "compare": "Compare",
534
+ "keepMine": "Keep mine",
535
+ "keepOpen": "Keep open",
536
+ "closeTab": "Close tab"
537
+ },
538
+ "backup": {
539
+ "restored": "Unsaved changes restored",
540
+ "restoredChanged": "Unsaved changes restored. The file has changed on disk since they were made.",
541
+ "keep": "Keep",
542
+ "discard": "Discard"
543
+ },
544
+ "compare": {
545
+ "text": "Comparing your version with the file on disk",
546
+ "close": "Close comparison",
547
+ "useDisk": "Use disk version",
548
+ "unchanged": "{count} unchanged lines",
549
+ "failed": "The file could not be read from disk."
550
+ },
551
+ "ai": {
552
+ "chip": "AI",
553
+ "title": "AI autocomplete",
554
+ "consent": "Sends the code around the caret to the model you choose. Files on the excluded list are never sent.",
555
+ "state": {
556
+ "off": "AI autocomplete is off",
557
+ "excluded": "AI autocomplete is off for this file: its name is on the list of files that are never sent",
558
+ "ready": "AI autocomplete is ready",
559
+ "thinking": "AI autocomplete is asking the model"
560
+ },
561
+ "problem": {
562
+ "rate": "Too many requests. Trying again in {seconds} s.",
563
+ "noModel": "No model is selected yet. Choose one below.",
564
+ "noEndpoint": "The endpoint has no address or no model yet. Set them in Settings.",
565
+ "timeout": "The model did not answer in time.",
566
+ "network": "SynaBun did not answer.",
567
+ "engine": "The model call failed: {message}",
568
+ "engineUnknown": "The model call failed.",
569
+ "server": "The request failed."
570
+ },
571
+ "model": "Model",
572
+ "modelNone": "Choose a model",
573
+ "modelsLoading": "Loading models…",
574
+ "modelsUnavailable": "OpenCode is not running, so its models cannot be listed.",
575
+ "modelsFailed": "The models could not be read.",
576
+ "price": "${input} in / ${output} out per million tokens",
577
+ "priceFree": "free",
578
+ "endpointModel": "Your endpoint: {model}",
579
+ "endpointNone": "Your endpoint is not set up yet.",
580
+ "findFastest": "Find fastest",
581
+ "finding": "Testing models…",
582
+ "fastest": "Fastest: {model}, {time}. Selected.",
583
+ "fastestNone": "No model answered in time.",
584
+ "today": {
585
+ "one": "Today: {count} request · {input} tokens in · {output} out",
586
+ "other": "Today: {count} requests · {input} tokens in · {output} out"
587
+ },
588
+ "todayNone": "No requests today.",
589
+ "todayFailed": "Today's use could not be read.",
590
+ "settings": "More in Settings"
591
+ },
592
+ "view": {
593
+ "wordWrap": "Word wrap",
594
+ "minimap": "Minimap",
595
+ "indentGuides": "Indent guides",
596
+ "whitespaceNone": "Whitespace: hidden",
597
+ "whitespaceSelection": "Whitespace: in the selection",
598
+ "whitespaceAll": "Whitespace: everywhere",
599
+ "fontLarger": "Larger text",
600
+ "fontSmaller": "Smaller text",
601
+ "fontReset": "Reset text size",
602
+ "fontSize": "{size} px"
603
+ },
604
+ "palette": {
605
+ "commands": "Command palette",
606
+ "commandsPlaceholder": "Type a command...",
607
+ "noCommand": "No command matches",
608
+ "files": "Go to file",
609
+ "filesPlaceholder": "Type a file name...",
610
+ "noFile": "No file matches",
611
+ "typeToSearch": "Type to search this project's files",
612
+ "noProject": "Select a project in the File Explorer to search its files",
613
+ "searchFailed": "The files could not be searched.",
614
+ "searching": "Searching…"
615
+ },
616
+ "diff": {
617
+ "text": "Comparing your version with the last commit",
618
+ "close": "Close comparison",
619
+ "revert": "Revert change",
620
+ "failed": "The comparison could not be loaded."
621
+ }
622
+ },
623
+ "fileLinks": {
624
+ "open": "Open in editor",
625
+ "openAtLine": "Open in editor at line {line}",
626
+ "openAtLineColumn": "Open in editor at line {line}, column {column}",
627
+ "missing": "{name} was not found, or it is a folder.",
628
+ "notText": "{name} is not a text file the editor can open.",
629
+ "tooLarge": "{name} is too large to open in the editor.",
630
+ "outside": "{name} is outside your registered projects. Add its folder as a project to open it here.",
631
+ "failed": "Could not reach SynaBun to open {name}. Check that the server is running."
632
+ },
633
+ "tunnel": {
634
+ "stateOff": "Off",
635
+ "stateDownloading": "Getting the tunnel program",
636
+ "stateStarting": "Starting",
637
+ "stateRunning": "On",
638
+ "stateFailed": "Did not start",
639
+ "stateUnsupported": "Not available",
640
+ "stateRestart": "Restart needed",
641
+ "idle": "A public address through Cloudflare, for invite links and remote MCP.",
642
+ "idleDownload": "A public address through Cloudflare, for invite links and remote MCP. The first start downloads the tunnel program ({size} MB).",
643
+ "downloading": "Downloading the tunnel program: {received} of {total} MB",
644
+ "starting": "Waiting for Cloudflare to give an address…",
645
+ "restart": "Restart SynaBun to use the public address: the server that is running was started before it could download the tunnel program.",
646
+ "unsupported": "Cloudflare publishes no tunnel program for this system. If you install cloudflared yourself, SynaBun uses it.",
647
+ "errorOffline": "The tunnel program could not be downloaded: the download server was not reached. Check the connection and try again.",
648
+ "errorHttp": "The tunnel program could not be downloaded: the download server answered with an error. Try again in a moment.",
649
+ "errorInterrupted": "The download stopped before it was complete. Nothing was kept. Try again.",
650
+ "errorTimeout": "The download stalled. Nothing was kept. Try again.",
651
+ "errorChecksum": "The download was not the file SynaBun expects, so it was removed and never run. Try again; if it happens again, something on the network is changing the file.",
652
+ "errorUnpack": "The downloaded file could not be unpacked, so it was removed. Try again.",
653
+ "errorDisk": "The tunnel program could not be saved in SynaBun's data folder. Check free space and permissions, then try again.",
654
+ "errorLaunch": "The tunnel program could not be started on this computer. Try again.",
655
+ "errorExited": "Cloudflare gave no address. The tunnel program said: {reason}",
656
+ "errorExitedNoReason": "The tunnel program stopped before Cloudflare gave an address. Try again.",
657
+ "errorNoAddress": "Cloudflare gave no address in time. Try again.",
658
+ "errorEnded": "The tunnel stopped. Start it again for a new address.",
659
+ "errorRefused": "SynaBun refused this request. Start the tunnel from SynaBun on this computer.",
660
+ "errorUnknown": "The tunnel did not start: {reason}",
661
+ "errorUnknownNoReason": "The tunnel did not start. Try again.",
662
+ "start": "Start tunnel",
663
+ "stop": "Stop",
664
+ "cancel": "Cancel",
665
+ "retry": "Try again",
666
+ "copyBundled": "cloudflared {version}, included with SynaBun",
667
+ "copyDownloaded": "cloudflared {version}, downloaded by SynaBun",
668
+ "copySystem": "cloudflared {version}, installed on this computer",
669
+ "copySystemWhy": "SynaBun could not download its own copy, so the one installed on this computer is used.",
670
+ "mcpKeyNeeded": "Remote MCP needs an access key. Create one below; the address to connect is then this one followed by /mcp/ and the key."
671
+ },
672
+ "workerEnd": {
673
+ "complete": "Task complete",
674
+ "blocked": "Blocked",
675
+ "needsInput": "Needs input",
676
+ "failed": "Task failed",
677
+ "stopped": "Stopped",
678
+ "interrupted": "Interrupted",
679
+ "back": "Back to Assistant",
680
+ "backHint": "Close this tab and open the Assistant session that dispatched it",
681
+ "warmNote": "The worker is still open for follow-ups. Going back closes it.",
682
+ "failedNoReason": "The run ended with an error.",
683
+ "reasonUser": "Stopped by you.",
684
+ "reasonAssistant": "Stopped by the Assistant.",
685
+ "reasonAssistantSaid": "Stopped by the Assistant: {reason}",
686
+ "reasonTimeCap": "The run reached its time limit.",
687
+ "reasonBudget": "The run reached its budget limit.",
688
+ "reasonMaxTurns": "The run reached its turn limit.",
689
+ "reasonIdle": "The worker waited for a follow-up that did not come, and closed.",
690
+ "reasonRestart": "The server restarted while the run was open.",
691
+ "reasonKillAll": "Stopped together with every other run.",
692
+ "reasonCleared": "The run's state was removed.",
693
+ "reasonOther": "Stopped ({reason}).",
694
+ "durationSeconds": "{s}s",
695
+ "durationMinutes": "{m}m {s}s",
696
+ "durationHours": "{h}h {m}m"
697
+ },
698
+ "fileExplorer": {
699
+ "title": "File Explorer",
700
+ "tree": "Files of {project}",
701
+ "resize": "Resize the File Explorer",
702
+ "loadFailed": "The File Explorer could not be loaded. Reload the page.",
703
+ "needsRestart": "Starts working after the server is restarted.",
704
+ "filter": {
705
+ "placeholder": "Filter files...",
706
+ "label": "Filter files by name",
707
+ "clear": "Clear filter"
708
+ },
709
+ "toolbar": {
710
+ "newFile": "New file",
711
+ "newFolder": "New folder",
712
+ "goToFile": "Go to file",
713
+ "revealActive": "Show the open file in the tree",
714
+ "changedOnly": "Changed files only",
715
+ "collapseAll": "Collapse all",
716
+ "refresh": "Refresh",
717
+ "more": "More"
718
+ },
719
+ "project": {
720
+ "none": "No project",
721
+ "label": "Project: {name}",
722
+ "choose": "Choose a project",
723
+ "add": "Add project...",
724
+ "pickFolder": "Select the project folder",
725
+ "addFailed": "The project could not be added."
726
+ },
727
+ "branch": {
728
+ "label": "Branch {branch}: {count} changed"
729
+ },
730
+ "count": {
731
+ "items": {
732
+ "one": "1 item",
733
+ "other": "{count} items"
734
+ },
735
+ "selected": {
736
+ "one": "1 selected",
737
+ "other": "{count} selected"
738
+ },
739
+ "matches": {
740
+ "one": "1 match",
741
+ "other": "{count} matches"
742
+ },
743
+ "changed": {
744
+ "one": "1 changed",
745
+ "other": "{count} changed"
746
+ }
747
+ },
748
+ "state": {
749
+ "loading": "Loading...",
750
+ "searching": "Searching...",
751
+ "retry": "Try again",
752
+ "showMore": "Show more",
753
+ "more": {
754
+ "one": "1 more",
755
+ "other": "{count} more"
756
+ },
757
+ "truncated": "Showing {shown} of {total}. Filter by name to find the rest.",
758
+ "emptyFolder": "Empty folder",
759
+ "emptyProject": "This folder is empty.",
760
+ "noProject": "No project yet. Add a folder to see its files.",
761
+ "addProject": "Add project",
762
+ "noMatch": "No file matches “{query}”.",
763
+ "noChanges": "Nothing has changed since the last commit.",
764
+ "notRepo": "This project is not a git repository.",
765
+ "searchFailed": "The search did not work. Try again.",
766
+ "moreMatches": "Showing the first {count} matches. Type more to narrow them down.",
767
+ "partial": "The search stopped early in this large project. Type more to narrow it down.",
768
+ "restartHint": "Live updates, rename, move, the Trash and image preview start working after the server is restarted."
769
+ },
770
+ "git": {
771
+ "modified": "modified",
772
+ "mixed": "modified",
773
+ "staged": "staged",
774
+ "renamed": "renamed",
775
+ "added": "added",
776
+ "untracked": "new",
777
+ "deleted": "deleted",
778
+ "conflict": "conflict",
779
+ "contains": "holds changes",
780
+ "ignored": "ignored by git"
781
+ },
782
+ "row": {
783
+ "open": "open in the editor",
784
+ "unsaved": "unsaved changes",
785
+ "link": "link",
786
+ "linkOutside": "link out of the project",
787
+ "linkBroken": "broken link",
788
+ "cut": "cut"
789
+ },
790
+ "notice": {
791
+ "dismiss": "Dismiss"
792
+ },
793
+ "menu": {
794
+ "label": "Actions for {name}",
795
+ "labelMany": "Actions for {count} items",
796
+ "labelProject": "Actions for the project",
797
+ "back": "Back",
798
+ "open": "Open",
799
+ "openKeep": "Open and keep the tab",
800
+ "preview": "Preview",
801
+ "openAsText": "Open as text",
802
+ "send": {
803
+ "one": "Send to {name}",
804
+ "other": "Send {count} items to {name}"
805
+ },
806
+ "sendTo": "Send to...",
807
+ "newFile": "New file...",
808
+ "newFolder": "New folder...",
809
+ "expand": "Expand",
810
+ "collapse": "Collapse",
811
+ "collapseChildren": "Collapse folders inside",
812
+ "cut": "Cut",
813
+ "copy": "Copy",
814
+ "paste": "Paste",
815
+ "duplicate": "Duplicate",
816
+ "nothingCopied": "Nothing was cut or copied.",
817
+ "copyPath": {
818
+ "one": "Copy path",
819
+ "other": "Copy paths"
820
+ },
821
+ "copyRelativePath": {
822
+ "one": "Copy relative path",
823
+ "other": "Copy relative paths"
824
+ },
825
+ "copyName": "Copy name",
826
+ "color": "Folder color...",
827
+ "rename": "Rename...",
828
+ "delete": "Delete",
829
+ "deleteMany": "Delete {count} items",
830
+ "reveal": {
831
+ "darwin": "Reveal in Finder",
832
+ "win32": "Show in File Explorer",
833
+ "other": "Show in file manager"
834
+ },
835
+ "changedOnly": "Changed files only",
836
+ "sortBy": "Sort by...",
837
+ "sort": {
838
+ "name": "Name",
839
+ "date": "Date modified",
840
+ "size": "Size"
841
+ },
842
+ "expandAll": "Expand one more level",
843
+ "collapseAll": "Collapse all",
844
+ "refresh": "Refresh"
845
+ },
846
+ "colors": {
847
+ "amber": "Amber (default)",
848
+ "blue": "Blue",
849
+ "green": "Green",
850
+ "red": "Red",
851
+ "purple": "Purple",
852
+ "cyan": "Cyan",
853
+ "yellow": "Yellow",
854
+ "brown": "Brown",
855
+ "grey": "Grey"
856
+ },
857
+ "send": {
858
+ "assistant": "Assistant",
859
+ "session": "the focused session",
860
+ "done": {
861
+ "one": "Sent “{name}” to {target}.",
862
+ "other": "Sent {count} items to {target}."
863
+ },
864
+ "failed": "Could not send to {target}."
865
+ },
866
+ "edit": {
867
+ "rename": "New name for {name}",
868
+ "newFile": "Name of the new file",
869
+ "newFolder": "Name of the new folder",
870
+ "taken": "“{name}” is already in this folder.",
871
+ "gone": "“{name}” is gone from disk."
872
+ },
873
+ "delete": {
874
+ "titleOne": "Delete “{name}”?",
875
+ "titleMany": "Delete {count} items?",
876
+ "toTrash": {
877
+ "win32": "You can restore it from the Recycle Bin.",
878
+ "other": "You can put it back from the Trash."
879
+ },
880
+ "forGood": "This system has no Trash: it is deleted for good.",
881
+ "forGoodLegacy": "There is no Trash until the server is restarted: it is deleted for good.",
882
+ "unsaved": {
883
+ "one": "“{name}” has unsaved changes in the editor.",
884
+ "other": "{count} of them have unsaved changes in the editor."
885
+ },
886
+ "moveToTrash": {
887
+ "win32": "Move to Recycle Bin",
888
+ "other": "Move to Trash"
889
+ },
890
+ "deleteForever": "Delete for good",
891
+ "noTrashTitle": "No Trash on this disk",
892
+ "noTrashOne": "“{name}” is on a disk without a Trash. Nothing was deleted. Delete it for good?",
893
+ "noTrashMany": "{count} items are on a disk without a Trash and were not deleted. Delete them for good?",
894
+ "notEmpty": "Until the server is restarted, a folder can only be deleted when it is empty.",
895
+ "stopped": "Deleted {done} of {total} for good, then stopped at “{name}”. {why}",
896
+ "stoppedTrash": {
897
+ "win32": "Moved {done} of {total} to the Recycle Bin, then stopped at “{name}”. {why}",
898
+ "other": "Moved {done} of {total} to the Trash, then stopped at “{name}”. {why}"
899
+ },
900
+ "done": {
901
+ "one": "Deleted “{name}” for good.",
902
+ "other": "Deleted {count} items for good."
903
+ },
904
+ "doneTrash": {
905
+ "win32": {
906
+ "one": "Moved “{name}” to the Recycle Bin.",
907
+ "other": "Moved {count} items to the Recycle Bin."
908
+ },
909
+ "other": {
910
+ "one": "Moved “{name}” to the Trash.",
911
+ "other": "Moved {count} items to the Trash."
912
+ }
913
+ }
914
+ },
915
+ "replace": {
916
+ "title": "Replace what is there?",
917
+ "one": "“{name}” is already in “{folder}”.",
918
+ "many": "{count} items are already in “{folder}”.",
919
+ "toTrash": {
920
+ "win32": "What is replaced goes to the Recycle Bin.",
921
+ "other": "What is replaced goes to the Trash."
922
+ },
923
+ "forGood": "What is replaced cannot be brought back.",
924
+ "unsaved": {
925
+ "one": "“{name}” has unsaved changes in the editor. They are saved before it is replaced.",
926
+ "other": "{count} of them have unsaved changes in the editor. They are saved before they are replaced."
927
+ },
928
+ "notSaved": "“{name}” could not be saved. Nothing was replaced.",
929
+ "confirm": "Replace"
930
+ },
931
+ "move": {
932
+ "same": "It is already in that folder.",
933
+ "done": {
934
+ "one": "Moved “{name}” to “{folder}”.",
935
+ "other": "Moved {count} items to “{folder}”."
936
+ },
937
+ "stopped": "Moved {done} of {total}, then stopped at “{name}”. {why}"
938
+ },
939
+ "copy": {
940
+ "done": {
941
+ "one": "Copied “{name}” to “{folder}”.",
942
+ "other": "Copied {count} items to “{folder}”."
943
+ },
944
+ "stopped": "Copied {done} of {total}, then stopped at “{name}”. {why}",
945
+ "partial": "“{name}” is there only in part."
946
+ },
947
+ "duplicate": {
948
+ "done": {
949
+ "one": "Made “{name}”.",
950
+ "other": "Made {count} copies."
951
+ }
952
+ },
953
+ "clipboard": {
954
+ "cut": {
955
+ "one": "“{name}” cut. Pick a folder and paste.",
956
+ "other": "{count} items cut. Pick a folder and paste."
957
+ },
958
+ "copied": {
959
+ "one": "“{name}” copied. Pick a folder and paste.",
960
+ "other": "{count} items copied. Pick a folder and paste."
961
+ }
962
+ },
963
+ "copied": {
964
+ "path": {
965
+ "one": "Path copied.",
966
+ "other": "{count} paths copied."
967
+ },
968
+ "name": "Name copied.",
969
+ "failed": "The browser did not allow copying."
970
+ },
971
+ "upload": {
972
+ "none": "Nothing to copy.",
973
+ "progress": "Copying {done} of {total}...",
974
+ "tooMany": "That is more than {max} files. Copy the folder with the system's file manager.",
975
+ "done": {
976
+ "one": "Copied “{name}” into “{folder}”.",
977
+ "other": "Copied {count} files into “{folder}”."
978
+ }
979
+ },
980
+ "preview": {
981
+ "label": "Preview of {name}",
982
+ "image": "Image",
983
+ "openAsText": "Open as text",
984
+ "noPreview": "The picture shows after the server is restarted.",
985
+ "failed": "The picture could not be loaded.",
986
+ "notText": "Not text: the editor does not open it."
987
+ },
988
+ "kind": {
989
+ "archive": "Archive",
990
+ "document": "Document",
991
+ "audio": "Audio",
992
+ "video": "Video",
993
+ "font": "Font",
994
+ "database": "Database",
995
+ "program": "Program or library",
996
+ "diskImage": "Disk image or installer",
997
+ "design": "Design or image file",
998
+ "system": "System file"
999
+ },
1000
+ "open": {
1001
+ "deleted": "“{name}” was deleted: it is not on disk.",
1002
+ "linkOutside": "“{name}” is a link that leads out of the project. It is not opened from here.",
1003
+ "linkBroken": "“{name}” is a link to something that is not there."
1004
+ },
1005
+ "reveal": {
1006
+ "none": "No file is open in the editor.",
1007
+ "notShown": "“{name}” is not in this project."
1008
+ },
1009
+ "watch": {
1010
+ "none": "This project cannot be watched right now. The tree is read again when you return to this window.",
1011
+ "partial": "Some open folders cannot be watched right now. The tree is read again when you return to this window."
1012
+ },
1013
+ "error": {
1014
+ "exists": "“{name}” is already there. Nothing was replaced.",
1015
+ "gone": "It is no longer on disk.",
1016
+ "denied": "The system did not allow it (no permission).",
1017
+ "root": "A project folder is not renamed, moved, deleted or replaced from here.",
1018
+ "intoSelf": "A folder cannot go into itself.",
1019
+ "tooLarge": "That file is too large.",
1020
+ "busy": "Another program is using it.",
1021
+ "noSpace": "The disk is full.",
1022
+ "outside": "That is outside the project folders.",
1023
+ "notDir": "That is not a folder.",
1024
+ "offline": "The server did not answer. Nothing was changed.",
1025
+ "noReveal": "This system has no file manager to show it in.",
1026
+ "noTrash": "There is no Trash for it. It was left as it is.",
1027
+ "changed": "A folder changed while this was under way. Nothing more was done.",
1028
+ "otherDisk": "It is on another disk. Copy it there, then delete the original.",
1029
+ "needsRestart": "That starts working after the server is restarted.",
1030
+ "owner": "Only the owner can use the File Explorer.",
1031
+ "limit": "That is too many at once.",
1032
+ "notImage": "That is not an image.",
1033
+ "failed": "That did not work.",
1034
+ "name": {
1035
+ "empty": "Type a name.",
1036
+ "dots": "“.” and “..” are not names.",
1037
+ "separator": "A name cannot contain “/” or “\\”.",
1038
+ "control": "A name cannot contain control characters.",
1039
+ "reserved": "Windows keeps that name for itself.",
1040
+ "chars": "On Windows a name cannot contain < > : \" | ? *",
1041
+ "trailing": "On Windows a name cannot end in a space or a dot.",
1042
+ "long": "That name is too long.",
1043
+ "other": "That name cannot be used."
1044
+ }
1045
+ },
1046
+ "gitPanel": {
1047
+ "label": "Branch and commit",
1048
+ "branch": "Branch",
1049
+ "commit": "Commit",
1050
+ "message": "Message...",
1051
+ "generate": "Generate message",
1052
+ "commitAction": "Commit all changes",
1053
+ "clean": "Clean working tree",
1054
+ "count": {
1055
+ "modified": "{count} modified",
1056
+ "added": "{count} added",
1057
+ "deleted": "{count} deleted",
1058
+ "untracked": "{count} new",
1059
+ "other": "{count} other"
1060
+ },
1061
+ "switched": "Switched to {branch}",
1062
+ "checkoutFailed": "Checkout failed",
1063
+ "commitFailed": "Commit failed",
1064
+ "committed": "Committed",
1065
+ "failed": "Failed",
1066
+ "noChanges": "No changes",
1067
+ "generateFailed": "Failed to generate message"
1068
+ },
1069
+ "trust": {
1070
+ "title": "Git ownership mismatch",
1071
+ "body": "Git refuses to read this workspace because another user account owns it. Trusting it adds the folder to your global safe.directory setting, so SynaBun can show its branch and changes.",
1072
+ "skip": "Skip",
1073
+ "confirm": "Trust workspace",
1074
+ "trusting": "Trusting...",
1075
+ "done": "Workspace trusted",
1076
+ "failed": "Trust failed"
1077
+ },
1078
+ "help": {
1079
+ "title": "File Explorer",
1080
+ "toggle": "Toggle file explorer",
1081
+ "move": "Move along the rows",
1082
+ "fold": "Open / close a folder, go to its parent",
1083
+ "open": "Open in the editor and keep the tab",
1084
+ "peek": "Look at a file in the reused tab",
1085
+ "range": "Select several rows",
1086
+ "typeAhead": "Go to a row by typing its name",
1087
+ "offers": "Go to “Show more” or “Try again”, and use it",
1088
+ "rename": "Rename",
1089
+ "delete": "Delete (to the Trash)",
1090
+ "clipboard": "Cut / copy / paste",
1091
+ "copyPath": "Copy path / relative path",
1092
+ "goToFile": "Go to file",
1093
+ "menu": "Open the menu",
1094
+ "escape": "Give up a cut, clear the filter"
1095
+ }
1096
+ },
279
1097
  "detail": {
280
1098
  "category": "Category",
281
1099
  "subcategory": "Subcategory",
@@ -597,6 +1415,10 @@
597
1415
  "appearance": {
598
1416
  "label": "Appearance",
599
1417
  "help": "Theme, size and icons"
1418
+ },
1419
+ "code_editor": {
1420
+ "label": "Code editor",
1421
+ "help": "Editing preferences and AI autocomplete"
600
1422
  }
601
1423
  },
602
1424
  "page": {
@@ -630,7 +1452,7 @@
630
1452
  },
631
1453
  "automations": {
632
1454
  "title": "Automations",
633
- "purpose": "Choose what happens automatically while you code: greetings, hooks, online access, social actions and the YouTube pipeline."
1455
+ "purpose": "Choose what happens automatically: the greeting, what the Assistant knows about you, hooks, online access, social actions and the YouTube pipeline."
634
1456
  },
635
1457
  "messages": {
636
1458
  "title": "Messages",
@@ -643,6 +1465,10 @@
643
1465
  "appearance": {
644
1466
  "title": "Appearance",
645
1467
  "purpose": "Choose a theme and adjust the size, colors and file icons of the interface."
1468
+ },
1469
+ "code_editor": {
1470
+ "title": "Code editor",
1471
+ "purpose": "Set up the editor that opens files from the File Explorer: how text is shown, indented and saved, and AI autocomplete."
646
1472
  }
647
1473
  },
648
1474
  "section": {
@@ -670,12 +1496,12 @@
670
1496
  },
671
1497
  "automations": {
672
1498
  "greetings": {
673
- "title": "Greetings",
674
- "purpose": "What each assistant says when a session starts. Switch a greeting on to edit it."
1499
+ "title": "Greeting",
1500
+ "purpose": "One greeting for every agent. When you come back and open a new session, SynaBun says in a sentence or two where you left off and what happened while you were away."
675
1501
  },
676
1502
  "automation_behavior": {
677
1503
  "title": "Automation behavior",
678
- "purpose": "What SynaBun does by itself while Claude Code works: remembering, learning and guarding."
1504
+ "purpose": "What the Assistant knows about you and brings up by itself, on any model. The older hooks for Claude Code are below."
679
1505
  },
680
1506
  "online_access": {
681
1507
  "title": "Online access",
@@ -959,6 +1785,16 @@
959
1785
  "title": "Language",
960
1786
  "purpose": "The language SynaBun speaks."
961
1787
  }
1788
+ },
1789
+ "code_editor": {
1790
+ "ai_autocomplete": {
1791
+ "title": "AI autocomplete",
1792
+ "purpose": "Grey suggestions after the caret that Tab accepts. Off until you switch it on."
1793
+ },
1794
+ "editing": {
1795
+ "title": "Editing",
1796
+ "purpose": "How the editor shows text, indents it and saves it. The View menu in the editor changes the same settings."
1797
+ }
962
1798
  }
963
1799
  },
964
1800
  "common": {
@@ -1028,90 +1864,6 @@
1028
1864
  "label": "Back up now",
1029
1865
  "help": "Makes a backup right away in the chosen folder."
1030
1866
  },
1031
- "aut001": {
1032
- "label": "Show the Claude Code greeting",
1033
- "help": "Switches the Claude Code greeting on or off. Switch it on to edit it."
1034
- },
1035
- "aut002": {
1036
- "label": "Greeting for",
1037
- "help": "Each project can have its own greeting. The default is used when a project has none."
1038
- },
1039
- "aut003": {
1040
- "label": "Greeting text",
1041
- "help": "What the assistant says first. Words in {braces} are filled in for you."
1042
- },
1043
- "aut004": {
1044
- "label": "Show reminders",
1045
- "help": "Lists your reminders under the greeting."
1046
- },
1047
- "aut005": {
1048
- "label": "Show last session",
1049
- "help": "Adds a line about what the last session did."
1050
- },
1051
- "aut009": {
1052
- "label": "Add reminder",
1053
- "help": "Adds an empty reminder row."
1054
- },
1055
- "aut010": {
1056
- "label": "Save greeting",
1057
- "help": "Saves the greeting for the project chosen above."
1058
- },
1059
- "aut011": {
1060
- "label": "Show the Codex greeting",
1061
- "help": "Switches the Codex greeting on or off. Switch it on to edit it."
1062
- },
1063
- "aut012": {
1064
- "label": "Greeting for",
1065
- "help": "Each project can have its own greeting. The default is used when a project has none."
1066
- },
1067
- "aut013": {
1068
- "label": "Greeting text",
1069
- "help": "What the assistant says first. Words in {braces} are filled in for you."
1070
- },
1071
- "aut014": {
1072
- "label": "Show reminders",
1073
- "help": "Lists your reminders under the greeting."
1074
- },
1075
- "aut015": {
1076
- "label": "Show last session",
1077
- "help": "Adds a line about what the last session did."
1078
- },
1079
- "aut016": {
1080
- "label": "Add reminder",
1081
- "help": "Adds an empty reminder row."
1082
- },
1083
- "aut017": {
1084
- "label": "Save greeting",
1085
- "help": "Saves the greeting for the project chosen above."
1086
- },
1087
- "aut018": {
1088
- "label": "Show the OpenCode greeting",
1089
- "help": "Switches the OpenCode greeting on or off. Switch it on to edit it."
1090
- },
1091
- "aut019": {
1092
- "label": "Greeting for",
1093
- "help": "Each project can have its own greeting. The default is used when a project has none."
1094
- },
1095
- "aut020": {
1096
- "label": "Greeting text",
1097
- "help": "What the assistant says first. Words in {braces} are filled in for you."
1098
- },
1099
- "aut021": {
1100
- "label": "Show reminders",
1101
- "help": "Lists your reminders under the greeting."
1102
- },
1103
- "aut022": {
1104
- "label": "Show last session",
1105
- "help": "Adds a line about what the last session did."
1106
- },
1107
- "aut026": {
1108
- "label": "Add reminder",
1109
- "help": "Adds an empty reminder row."
1110
- },
1111
- "aut027": {
1112
- "label": "Save greeting",
1113
- "help": "Saves the greeting for the project chosen above."
1114
- },
1115
1867
  "aut028": {
1116
1868
  "label": "Session startup",
1117
1869
  "help": "Loads memory and context when a new session begins."
@@ -1170,7 +1922,7 @@
1170
1922
  },
1171
1923
  "aut042": {
1172
1924
  "label": "Create an access key",
1173
- "help": "Makes a key that protects the public address. An existing key stops working."
1925
+ "help": "Makes the key that remote MCP is reached with. An existing key stops working."
1174
1926
  },
1175
1927
  "aut043": {
1176
1928
  "label": "Copy the access key",
@@ -1178,7 +1930,7 @@
1178
1930
  },
1179
1931
  "aut044": {
1180
1932
  "label": "Revoke",
1181
- "help": "Deletes the key. The public address then accepts anyone."
1933
+ "help": "Deletes the key. Connections that use it stop working."
1182
1934
  },
1183
1935
  "aut045": {
1184
1936
  "label": "Connect OpenClaw",
@@ -2396,10 +3148,6 @@
2396
3148
  "label": "Works with",
2397
3149
  "help": "Which assistants this part of SynaBun supports."
2398
3150
  },
2399
- "aut047": {
2400
- "label": "Placeholders you can use",
2401
- "help": "Shows the words in {braces} and what each becomes."
2402
- },
2403
3151
  "aut048": {
2404
3152
  "label": "Public address status",
2405
3153
  "help": "Whether the public address is running, and the address itself."
@@ -2420,6 +3168,26 @@
2420
3168
  "label": "Disconnect OpenClaw",
2421
3169
  "help": "Removes OpenClaw's memories from the map. OpenClaw's own files are not touched."
2422
3170
  },
3171
+ "aut053": {
3172
+ "label": "Knowledge of you",
3173
+ "help": "Starts each Assistant conversation with a short digest of what SynaBun has learned about how you work, and keeps learning from what you type. Learning needs Jev. Off: no digest and nothing new is learned; what is already in Memory stays."
3174
+ },
3175
+ "aut054": {
3176
+ "label": "Recent-interaction nudges",
3177
+ "help": "Reminds the Assistant of the last conversation, of what is still open and of what changed since. Off: no reminders, and no record of a conversation is kept for the next one."
3178
+ },
3179
+ "aut055": {
3180
+ "label": "Show the trace",
3181
+ "help": "Adds one line under each reply in the Assistant panel: what the model was told, what was held back and what was learned. Needs one of the two settings above. Off: new replies get no line; the two settings keep working."
3182
+ },
3183
+ "aut056": {
3184
+ "label": "What a new conversation is told about you",
3185
+ "help": "The digest every new Assistant conversation starts with. Select a line to open its memory and correct it."
3186
+ },
3187
+ "aut057": {
3188
+ "label": "See all in Memory",
3189
+ "help": "Opens the memory explorer on everything SynaBun knows about you."
3190
+ },
2423
3191
  "skl004": {
2424
3192
  "label": "Skills",
2425
3193
  "help": "Slash commands that give your assistants extra abilities."
@@ -2571,6 +3339,110 @@
2571
3339
  "app001": {
2572
3340
  "label": "Language",
2573
3341
  "help": "SynaBun reloads to apply the language."
3342
+ },
3343
+ "aut058": {
3344
+ "label": "Greet me when I come back",
3345
+ "help": "In the Assistant, the Claude Code, Codex and OpenCode panels and a terminal Claude Code session: after an hour away, and only when there is something new to say. SynaBun writes it ahead of time, so the session's own model spends nothing on it. Off: every session opens quietly."
3346
+ },
3347
+ "aut059": {
3348
+ "label": "What a new session would open with",
3349
+ "help": "Built from your recent conversations and sessions, the runs you dispatched, schedules that did not complete and what SynaBun knows about you. Open “Based on” to see the records and what the sentence cost."
3350
+ },
3351
+ "aut060": {
3352
+ "label": "Write it now",
3353
+ "help": "Asks the writer for this sentence now instead of waiting for the background: one small call on the cheapest Claude model."
3354
+ },
3355
+ "edt001": {
3356
+ "label": "Suggest code as I type",
3357
+ "help": "Each time you pause typing, the code around the caret is sent to the model you choose below, and its suggestion appears as grey text. Files on the “Never sent” list are not sent. Off: nothing is sent and no model is asked."
3358
+ },
3359
+ "edt002": {
3360
+ "label": "Ask",
3361
+ "help": "OpenCode models are asked through a small OpenCode server of their own, started when a suggestion is first needed and stopped after ten idle minutes. An endpoint of your own is a local Ollama, or any address that speaks the OpenAI protocol."
3362
+ },
3363
+ "edt003": {
3364
+ "label": "Model",
3365
+ "help": "The connected OpenCode models you have not hidden, fast ones first. Test sends a fixed sample, never your code."
3366
+ },
3367
+ "edt004": {
3368
+ "label": "Find fastest",
3369
+ "help": "Sends the sample to up to four fast models and selects the quickest. It takes a few seconds."
3370
+ },
3371
+ "edt005": {
3372
+ "label": "Endpoint kind",
3373
+ "help": "Ollama, or a server that speaks the OpenAI completions or chat protocol."
3374
+ },
3375
+ "edt006": {
3376
+ "label": "Address",
3377
+ "help": "For Ollama, the server itself. For an OpenAI-compatible server, the full address a request is posted to."
3378
+ },
3379
+ "edt007": {
3380
+ "label": "Model name",
3381
+ "help": "The name the endpoint knows the model by."
3382
+ },
3383
+ "edt008": {
3384
+ "label": "Request shape",
3385
+ "help": "Fill-in sends the text before and after the caret, for models trained to fill a gap. Chat sends a message, for any chat model."
3386
+ },
3387
+ "edt009": {
3388
+ "label": "API key",
3389
+ "help": "Sent to the endpoint as a bearer token. Kept in SynaBun's .env file: it is never shown again and never sent back to this page."
3390
+ },
3391
+ "edt010": {
3392
+ "label": "Test endpoint",
3393
+ "help": "Sends a fixed sample to the endpoint, never your code."
3394
+ },
3395
+ "edt011": {
3396
+ "label": "Never sent",
3397
+ "help": "File names AI autocomplete never reads, one pattern per line; * stands for any run of characters. Text that holds a private key is not sent either, whatever the file is called."
3398
+ },
3399
+ "edt012": {
3400
+ "label": "Restore the default list",
3401
+ "help": "Puts back the list SynaBun ships with: environment files, keys, certificates and credential files."
3402
+ },
3403
+ "edt013": {
3404
+ "label": "Today",
3405
+ "help": "Requests sent to a model today, their tokens, and how many suggestions you accepted."
3406
+ },
3407
+ "edt014": {
3408
+ "label": "Text size",
3409
+ "help": "The size of the text in the editor, from 10 to 18 px."
3410
+ },
3411
+ "edt015": {
3412
+ "label": "Ligatures",
3413
+ "help": "Draws character pairs such as => and != as one glyph, in fonts that have them."
3414
+ },
3415
+ "edt016": {
3416
+ "label": "Wrap long lines",
3417
+ "help": "A line wider than the editor continues on the next row instead of scrolling sideways."
3418
+ },
3419
+ "edt017": {
3420
+ "label": "Minimap",
3421
+ "help": "An overview of the file at the right edge of the editor. It is left out when the editor is narrower than 760 px, and for files over 2 MB."
3422
+ },
3423
+ "edt018": {
3424
+ "label": "Indent guides",
3425
+ "help": "Thin vertical lines that show each level of indentation."
3426
+ },
3427
+ "edt019": {
3428
+ "label": "Show whitespace",
3429
+ "help": "Draws spaces and tabs as faint marks: nowhere, in the selected text, or everywhere."
3430
+ },
3431
+ "edt020": {
3432
+ "label": "Indent with",
3433
+ "help": "What the Tab key inserts. Detect follows the file that is open."
3434
+ },
3435
+ "edt021": {
3436
+ "label": "Tab size",
3437
+ "help": "How wide a tab is drawn, and how many spaces one level of indentation is. Detect follows the file that is open."
3438
+ },
3439
+ "edt022": {
3440
+ "label": "Trim trailing whitespace on save",
3441
+ "help": "Removes spaces and tabs at the end of every line when a file is saved. Markdown files are left as they are: two spaces at the end of a line are a line break there."
3442
+ },
3443
+ "edt023": {
3444
+ "label": "End files with one newline on save",
3445
+ "help": "When a file is saved, a missing final line break is added and empty lines after the last line of text are removed."
2574
3446
  }
2575
3447
  },
2576
3448
  "pane": {
@@ -3397,34 +4269,15 @@
3397
4269
  "failed": "failed"
3398
4270
  },
3399
4271
  "hooks": {
3400
- "greeting": {
3401
- "title": {
3402
- "cc": "Claude Code greeting",
3403
- "codex": "Codex panel greeting",
3404
- "opencode": "OpenCode panel greeting"
3405
- },
3406
- "purpose": {
3407
- "cc": "What Claude Code says when a session starts.",
3408
- "codex": "For the Codex panel only. It is kept separately from Claude's.",
3409
- "opencode": "For the OpenCode panel only. It is kept separately from the others."
3410
- },
3411
- "global": "All projects (default)",
3412
- "templatePlaceholder": "{time_greeting}! Working on **{project_label}** ({branch} branch). {date}.",
3413
- "placeholder": "Placeholder",
3414
- "showsAs": "Shows as",
3415
- "example": "Example",
3416
- "reminders": "Reminders",
3417
- "remindersHelp": "Short commands shown under the greeting, such as a start script. Drag a row to reorder."
3418
- },
3419
- "claudeOnly": "These apply to Claude Code. The Codex and OpenCode panels do not read them.",
4272
+ "claudeOnly": "These apply to Claude Code sessions you run yourself. The Assistant uses the three settings above, on any model.",
3420
4273
  "ul": {
3421
4274
  "every": "Reflect every",
3422
4275
  "interactions": "interactions",
3423
4276
  "max": "at most",
3424
4277
  "perSession": "times per session"
3425
4278
  },
3426
- "hooksTitle": "Hooks",
3427
- "hooksPurpose": "The moments in a Claude Code session when SynaBun steps in. Leave them on unless you are tracking down a problem.",
4279
+ "hooksTitle": "Hooks for standalone Claude Code",
4280
+ "hooksPurpose": "For Claude Code sessions outside the Assistant: memory behaviors and the moments when SynaBun steps in. Leave them on unless you are tracking down a problem.",
3428
4281
  "compat": {
3429
4282
  "claude": "Works with Claude",
3430
4283
  "gemini": "Works with Gemini",
@@ -3439,6 +4292,7 @@
3439
4292
  "apikey": {
3440
4293
  "title": "Access key",
3441
4294
  "none": "No key: anyone with the address can connect",
4295
+ "noneClosed": "No key: MCP cannot be reached from outside",
3442
4296
  "saveNow": "Copy it now. It will not be shown again."
3443
4297
  },
3444
4298
  "connectorsHint": "In {link}, open Connectors and add the connection address.",
@@ -3468,14 +4322,7 @@
3468
4322
  "active": "Active",
3469
4323
  "failedToToggleHook": "Failed to toggle hook",
3470
4324
  "failedToToggleFeature": "Failed to toggle feature",
3471
- "failedToToggleCodexGreeting": "Failed to toggle Codex greeting",
3472
- "failedToToggleOpencodeGreeting": "Failed to toggle OpenCode greeting",
3473
- "dragToReorder": "Drag to reorder",
3474
- "label": "Label",
3475
- "command": "Command",
3476
- "remove": "Remove",
3477
4325
  "failedToSave": "Failed to save",
3478
- "greetingConfigSaved": "Greeting config saved",
3479
4326
  "dev": "dev",
3480
4327
  "skillUninstalledRestartToApply": "Skill uninstalled — restart {runtime} to apply",
3481
4328
  "skillInstalledRestartToApply": "Skill installed — restart {runtime} to apply",
@@ -3496,12 +4343,83 @@
3496
4343
  "failedToGenerateKey": "Failed to generate key",
3497
4344
  "copyKey": "Copy Key",
3498
4345
  "revokeThisApiKeyTheMcp": "Revoke this API key? The MCP endpoint will become open.",
4346
+ "revokeKeyClosed": "Revoke this access key? Nothing reaches MCP from outside until you create a new one.",
3499
4347
  "noKeyConfiguredTunnelIsOpen": "No key configured - tunnel is open",
3500
4348
  "generateKey": "Generate Key",
3501
- "goodMorning": "Good morning",
3502
- "goodAfternoon": "Good afternoon",
3503
- "goodEvening": "Good evening",
3504
- "failed2": "Failed: {message}"
4349
+ "failed2": "Failed: {message}",
4350
+ "uc": {
4351
+ "restart": "Restart SynaBun to use these: the server that is running was started before they were added.",
4352
+ "failed": "The Assistant is running without these: this part of SynaBun did not start ({reason}). Restart SynaBun; if it happens again, the server log says why.",
4353
+ "failedNoReason": "The Assistant is running without these: this part of SynaBun did not start. Restart SynaBun; if it happens again, the server log says why.",
4354
+ "unreadable": "SynaBun could not read these settings ({reason}). Nothing was changed. Close Settings and open it again.",
4355
+ "unreadableNoReason": "SynaBun could not read these settings. Nothing was changed. Close Settings and open it again.",
4356
+ "applies": "A change applies from your next message to the Assistant.",
4357
+ "noStore": "Memory is not available on this server, so this does nothing for now.",
4358
+ "tokens": "{tokens} of {max} tokens",
4359
+ "openMemory": "Open this memory",
4360
+ "seed": "from an earlier note",
4361
+ "empty": "Nothing learned yet. It fills in as you tell the Assistant how you want things done.",
4362
+ "omitted": "{n} more did not fit and are brought up only when relevant.",
4363
+ "learn": {
4364
+ "killSwitch": "Not learning right now: smart judgments are switched off for this server (SYNABUN_TYPESAFE=off). What is already known is still used.",
4365
+ "masterOff": "Not learning right now: {page} is switched off. What is already known is still used.",
4366
+ "noKey": "Not learning right now: {page} has no API key. What is already known is still used.",
4367
+ "surfaceOff": "Not learning right now: “User learning” is switched off in {page}. What is already known is still used.",
4368
+ "waiting": "Not learning for a moment: {page} was asked to wait before its next request. What is already known is still used.",
4369
+ "unavailable": "Not learning right now: {page} is not available. What is already known is still used."
4370
+ },
4371
+ "openPage": "Open {page}",
4372
+ "writer": {
4373
+ "missing": "New statements are kept in your own words: the statement writer is not available on this server.",
4374
+ "failed": "The last statement was kept in your own words: the writer could not run ({reason}). It runs on your Claude Code login.",
4375
+ "failedNoReason": "The last statement was kept in your own words: the writer could not run. It runs on your Claude Code login."
4376
+ },
4377
+ "trace": {
4378
+ "nothing": "Nothing to show while both settings above are off."
4379
+ },
4380
+ "off": {
4381
+ "note": "Nothing: “Knowledge of you” is off, so a new conversation starts without a digest. What SynaBun has learned stays in Memory."
4382
+ },
4383
+ "save": {
4384
+ "on": "Could not switch “{name}” on: {reason}. Nothing was changed.",
4385
+ "off": "Could not switch “{name}” off: {reason}. Nothing was changed.",
4386
+ "noAnswer": "SynaBun did not answer",
4387
+ "oldServer": "the running server does not have this setting yet"
4388
+ }
4389
+ },
4390
+ "greet": {
4391
+ "state": {
4392
+ "oldServer": "Restart SynaBun to use this. The running server was started before the greeting existed.",
4393
+ "failed": "The greeting did not start: {reason}. Sessions open quietly until that is fixed and SynaBun is restarted.",
4394
+ "failedUnknown": "The greeting did not start. Sessions open quietly until that is fixed and SynaBun is restarted.",
4395
+ "unreadable": "The greeting setting could not be read ({reason}).",
4396
+ "unreadableUnknown": "The greeting setting could not be read.",
4397
+ "killed": "Switched off by SYNABUN_GREETING=off in the server's environment. This switch does nothing until that is removed and SynaBun is restarted."
4398
+ },
4399
+ "note": {
4400
+ "noWriter": "No Claude sign-in to write with: the greeting is put together from the records, without a model."
4401
+ },
4402
+ "preview": {
4403
+ "loading": "Reading your records…",
4404
+ "now": "A new session in {project} would open with this now:",
4405
+ "recent": "You were here {time} ago, so a new session in {project} opens quietly. After {gap} away it would say:",
4406
+ "moment": "a moment",
4407
+ "nothingNew": "The last greeting in {project} already said this, so a new session opens quietly until something changes:",
4408
+ "off": "Off. Switched on, a new session in {project} would open with:",
4409
+ "firstSession": "Nothing recorded in {project} yet. A first session opens quietly.",
4410
+ "nothingToSay": "Nothing to say in {project} right now. A new session opens quietly.",
4411
+ "error": "The preview could not be built ({reason}).",
4412
+ "spend": "Writer calls today: {calls} of {cap} · {cost}",
4413
+ "spendNone": "No writer calls today.",
4414
+ "writing": "Writing…"
4415
+ },
4416
+ "save": {
4417
+ "failed": "Could not save: {reason}. The switch is back where it was.",
4418
+ "oldServer": "Could not save: the running server does not have the greeting yet. Restart SynaBun.",
4419
+ "forbidden": "Could not save: this window is not allowed to change settings.",
4420
+ "noAnswer": "Could not save: the server did not answer. The switch is back where it was."
4421
+ }
4422
+ }
3505
4423
  },
3506
4424
  "discord": {
3507
4425
  "tokenHelp": "Create a bot at {link} and switch on its Message Content, Server Members and Presence intents.",
@@ -4747,10 +5665,11 @@
4747
5665
  "browser": "chrome, chromium, profile, cookies, user agent, proxy, viewport, headless",
4748
5666
  "connected_tools": "mcp, server, plugin, tools, morelogin, profile, extension",
4749
5667
  "tool_access": "skills, slash commands, permissions, allow, deny, approve",
4750
- "automations": "hooks, greeting, tunnel, remote, cloudflare, social, youtube",
5668
+ "automations": "assistant, knowledge, hooks, greeting, tunnel, remote, cloudflare, social, youtube",
4751
5669
  "messages": "whatsapp, discord, phone, chat, bot, messaging",
4752
5670
  "notifications": "alerts, sound, volume, banner, toast, mute, desktop notification",
4753
- "appearance": "theme, dark mode, skin, color, font, text size, language, locale, icons, zoom, look"
5671
+ "appearance": "theme, dark mode, skin, color, font, text size, language, locale, icons, zoom, look",
5672
+ "code_editor": "editor, code, font, text size, word wrap, minimap, whitespace, indentation, tabs, autocomplete, completion, suggestions, copilot, ghost text, inline, ai, model, ollama, file"
4754
5673
  },
4755
5674
  "section": {
4756
5675
  "ai_connections": {
@@ -4810,8 +5729,8 @@
4810
5729
  "tool_permissions": "allow, approve, auto approve, ask"
4811
5730
  },
4812
5731
  "automations": {
4813
- "greetings": "welcome, session start, reminder, hello, template",
4814
- "automation_behavior": "hooks, remember, recall, learning, subagents, compaction, guard",
5732
+ "greetings": "welcome, welcome back, hello, return, come back, away, where I left off, last session, what happened",
5733
+ "automation_behavior": "assistant, knowledge, about me, user context, preferences, digest, nudges, reminders, trace, hooks, remember, recall, learning, subagents, compaction, guard",
4815
5734
  "online_access": "tunnel, cloudflare, remote, public url, access key, api key, claude web, openclaw, bridge",
4816
5735
  "social_platform_access": "social media, twitter, x, facebook, instagram, linkedin, tiktok, permissions",
4817
5736
  "youtube_pipeline": "trailer, upload, download, oauth, client id, steam, channel, yt-dlp"
@@ -4847,6 +5766,10 @@
4847
5766
  "advanced_visual_tuning": "blur, transparency, opacity, shadow, radius, corners, font, glass",
4848
5767
  "file_icons": "file explorer, extension, svg, custom icon",
4849
5768
  "d2_graph": "2d, graph, spacing, glow, cards"
5769
+ },
5770
+ "code_editor": {
5771
+ "ai_autocomplete": "autocomplete, completion, suggestions, copilot, ghost text, inline, tab, model, opencode, ollama, openai, endpoint, api key, fastest, latency, excluded files, secrets, env",
5772
+ "editing": "font size, text size, ligatures, word wrap, wrap lines, minimap, indent guides, whitespace, spaces, tabs, tab size, indentation, trim trailing whitespace, final newline, on save"
4850
5773
  }
4851
5774
  },
4852
5775
  "control": {
@@ -4877,6 +5800,99 @@
4877
5800
  "ml007": "api key, app id, credentials"
4878
5801
  }
4879
5802
  }
5803
+ },
5804
+ "code_editor": {
5805
+ "state": {
5806
+ "oldServer": "Restart SynaBun to use this: the server that is running was started before AI autocomplete was added.",
5807
+ "unreadable": "SynaBun could not read these settings ({reason}). Nothing was changed. Close Settings and open it again.",
5808
+ "unreadableNoReason": "SynaBun could not read these settings. Nothing was changed. Close Settings and open it again."
5809
+ },
5810
+ "pill": {
5811
+ "on": "On",
5812
+ "off": "Off",
5813
+ "setup": "Needs a model",
5814
+ "unavailable": "Not available"
5815
+ },
5816
+ "engine": {
5817
+ "opencode": "OpenCode models",
5818
+ "endpoint": "An endpoint of my own"
5819
+ },
5820
+ "kind": {
5821
+ "ollama": "Ollama",
5822
+ "openai": "OpenAI-compatible"
5823
+ },
5824
+ "shape": {
5825
+ "fim": "Fill-in",
5826
+ "chat": "Chat"
5827
+ },
5828
+ "models": {
5829
+ "loading": "Reading the models…",
5830
+ "none": "No model is connected. Sign in to a provider in {page}.",
5831
+ "unavailable": "OpenCode is not running, so its models cannot be listed.",
5832
+ "start": "Start it and list the models",
5833
+ "fast": "fast",
5834
+ "free": "free",
5835
+ "price": "${input} in · ${output} out per million tokens",
5836
+ "noPrice": "price not listed",
5837
+ "notListed": "selected, but no longer in the list",
5838
+ "pick": "Use {model}",
5839
+ "test": "Test",
5840
+ "testNamed": "Test {model}"
5841
+ },
5842
+ "test": {
5843
+ "running": "Testing…",
5844
+ "ok": "{time} · {input} tokens in, {output} out · suggested: {sample}",
5845
+ "okNoTokens": "{time} · suggested: {sample}",
5846
+ "empty": "Answered in {time}, with nothing to suggest.",
5847
+ "failed": "Failed: {reason}",
5848
+ "noAnswer": "SynaBun did not answer"
5849
+ },
5850
+ "fastest": {
5851
+ "running": "Testing the fast models…",
5852
+ "found": "Fastest: {model}, {time}. Selected.",
5853
+ "none": "No model answered in time. Nothing was changed.",
5854
+ "noCandidates": "No fast model is connected. Pick one from the list."
5855
+ },
5856
+ "key": {
5857
+ "set": "A key is set",
5858
+ "notSet": "No key is set",
5859
+ "placeholder": "Paste a key",
5860
+ "placeholderReplace": "Paste a key to replace the one that is set",
5861
+ "save": "Save key",
5862
+ "remove": "Remove key",
5863
+ "saved": "Key saved.",
5864
+ "removed": "Key removed."
5865
+ },
5866
+ "url": {
5867
+ "invalid": "An address starts with http:// or https://. Nothing was changed.",
5868
+ "placeholderOllama": "http://localhost:11434",
5869
+ "placeholderOpenai": "https://api.example.com/v1/completions"
5870
+ },
5871
+ "save": {
5872
+ "failed": "Could not save: {reason}. Nothing was changed.",
5873
+ "oldServer": "the running server does not have this setting yet",
5874
+ "noAnswer": "SynaBun did not answer"
5875
+ },
5876
+ "usage": {
5877
+ "today": "{requests} requests · {input} tokens in, {output} out · {accepted} of {shown} suggestions accepted",
5878
+ "none": "No requests today."
5879
+ },
5880
+ "exclude": {
5881
+ "count": "{n} patterns",
5882
+ "empty": "The list is empty: every file may be sent."
5883
+ },
5884
+ "editing": {
5885
+ "oldServer": "Restart SynaBun to use this: the server that is running was started before the editor kept its settings. Until then, the View menu in the editor changes them for the open page.",
5886
+ "fontSize": "{size} px",
5887
+ "detect": "Detect",
5888
+ "spaces": "Spaces",
5889
+ "tabs": "Tabs",
5890
+ "whitespace": {
5891
+ "none": "Hidden",
5892
+ "selection": "In the selection",
5893
+ "all": "Everywhere"
5894
+ }
5895
+ }
4880
5896
  }
4881
5897
  }
4882
5898
  },
@@ -5101,6 +6117,19 @@
5101
6117
  "fullscreen": "Fullscreen (F11)",
5102
6118
  "toggleExplorer": "Toggle Explorer (F)"
5103
6119
  },
6120
+ "toolbar": {
6121
+ "hideTools": "Hide workspace tools",
6122
+ "showTools": "Show workspace tools",
6123
+ "workspaceNone": "Workspaces: none loaded",
6124
+ "workspaceActive": "Workspace: {name}",
6125
+ "quickSave": "Quick save",
6126
+ "memoryExplorer": "Memory Explorer",
6127
+ "fileExplorer": "File Explorer",
6128
+ "share": "Share / Invite",
6129
+ "keybinds": "Keybinds",
6130
+ "snapToGrid": "Snap to grid",
6131
+ "tileTerminals": "Tile terminals"
6132
+ },
5104
6133
 
5105
6134
  "assistant": {
5106
6135
  "usage": {
@@ -5674,7 +6703,10 @@
5674
6703
  "suggestSchedule": "Schedule …",
5675
6704
  "templateSchedule": "Schedule {caret}",
5676
6705
  "suggestRemember": "Remember …",
5677
- "templateRemember": "Remember {caret}"
6706
+ "templateRemember": "Remember {caret}",
6707
+ "project": "Project",
6708
+ "chooseProject": "Choose a project",
6709
+ "projectAria": "Choose a project (now: {project})"
5678
6710
  },
5679
6711
  "status": {
5680
6712
  "aborted": "Aborted.",
@@ -5685,6 +6717,7 @@
5685
6717
  "dispatchFailed": "Dispatch failed",
5686
6718
  "mode": "Permission mode: {mode}",
5687
6719
  "queued": "Queued at position {position} (concurrency limit).",
6720
+ "renameFailed": "Could not save the name “{name}”. The session is still called “{previous}”.",
5688
6721
  "resuming": "resuming {id}",
5689
6722
  "rewound": "Files rewound to checkpoint",
5690
6723
  "rewindFailed": "Rewind failed",
@@ -5692,6 +6725,7 @@
5692
6725
  "stopFailed": "Stop failed",
5693
6726
  "stopRequested": "Stop requested for {id}",
5694
6727
  "routeMode": "Model routing: {mode}",
6728
+ "testDensity": "Test density: {level}",
5695
6729
  "computerOn": "Computer use is on.",
5696
6730
  "computerOff": "Computer use is off.",
5697
6731
  "computerRemote": "Computer use in this WhatsApp conversation: {why}.",
@@ -5720,6 +6754,127 @@
5720
6754
  "done": "done",
5721
6755
  "error": "error"
5722
6756
  },
6757
+ "automation": {
6758
+ "title": "Automation",
6759
+ "sum": {
6760
+ "turn": "{n} tok this turn",
6761
+ "standing": "{n} standing",
6762
+ "none": "nothing injected"
6763
+ },
6764
+ "state": {
6765
+ "waiting": "learning after the reply",
6766
+ "running": "learning…",
6767
+ "learned": "learned 1 thing",
6768
+ "confirmed": "confirmed 1 thing",
6769
+ "replaced": "replaced 1 thing"
6770
+ },
6771
+ "group": {
6772
+ "injected": "Injected",
6773
+ "withheld": "Withheld",
6774
+ "learning": "Learning",
6775
+ "session": "This conversation"
6776
+ },
6777
+ "tier": {
6778
+ "digest": "Knowledge digest",
6779
+ "last-thread": "Last conversation",
6780
+ "environment": "Environment",
6781
+ "open-item": "Open item",
6782
+ "cue": "Knowledge cue",
6783
+ "delta": "New knowledge",
6784
+ "recall": "Related memories",
6785
+ "knowledge": "Knowledge of you",
6786
+ "nudges": "Recent-interaction nudges",
6787
+ "greeting": "Greeting",
6788
+ "turn": "Per-turn notes"
6789
+ },
6790
+ "tok": "{n} tok",
6791
+ "meta": {
6792
+ "standing": "system slot · frozen {time}",
6793
+ "standingRef": "already in the system slot, not resent",
6794
+ "memories": "{n} memories",
6795
+ "memory": "1 memory",
6796
+ "alreadyPresent": "already supplied earlier",
6797
+ "greetingWriter": "said at session open · written ahead by {model}",
6798
+ "greetingFallback": "said at session open · from the records, no model",
6799
+ "budget": "budget {used}/{max} tok"
6800
+ },
6801
+ "reason": {
6802
+ "layer-off": "switched off in Settings",
6803
+ "nothing-known": "nothing learned yet",
6804
+ "no-recent-thread": "no recent conversation to mention",
6805
+ "in-greeting": "already said in the greeting",
6806
+ "budget": "over the turn budget, kept for a later turn",
6807
+ "not-ranked": "not ranked relevant by Jev",
6808
+ "in-digest": "already in the digest",
6809
+ "already-told": "already told in this conversation",
6810
+ "replaced": "replaced by a newer statement",
6811
+ "one-per-turn": "one cue per turn",
6812
+ "unusable": "no usable statement",
6813
+ "not-delivered": "the turn ended before the notes could be delivered",
6814
+ "trivial": "trivial prompt",
6815
+ "pattern": "a command or an acknowledgement",
6816
+ "judged": "Jev: memory would not change the reply",
6817
+ "nothing-retrieved": "nothing relevant found",
6818
+ "disabled": "automatic recall is off",
6819
+ "error": "the search failed",
6820
+ "system": "not a prompt of yours"
6821
+ },
6822
+ "learn": {
6823
+ "waiting": "Your words are judged once the reply is done.",
6824
+ "running": "Jev is reading what you typed…",
6825
+ "skipped": "Not judged: {reason}.",
6826
+ "cues": "Cue words: {cues}",
6827
+ "judged": "Jev: lasting signal {p} · {facet} · {scope}",
6828
+ "matched": "Matches: {statement}",
6829
+ "contradicts": "Contradicts: {statement}",
6830
+ "created": "Learned: {statement}",
6831
+ "updated": "Confirmed (seen {n}×): {statement}",
6832
+ "superseded": "Replaced “{old}” with: {statement}",
6833
+ "none": "Nothing stored: {reason}.",
6834
+ "evidence": "Evidence: “{quote}”",
6835
+ "writer": "Written by {engine}",
6836
+ "writerOwn": "Kept as your own sentence ({reason})",
6837
+ "writerKept": "Statement kept as recorded",
6838
+ "cost": "{requests} Jev requests · {tokens} tok · {cost}",
6839
+ "scope": {
6840
+ "global": "all projects"
6841
+ }
6842
+ },
6843
+ "skip": {
6844
+ "no-cue": "no always / never / from-now-on wording",
6845
+ "trivial": "trivial prompt",
6846
+ "short": "too short",
6847
+ "origin": "not typed by you",
6848
+ "untrusted": "forwarded content",
6849
+ "no-typed-text": "only attachments or pasted text",
6850
+ "seen": "the same words were already judged",
6851
+ "gate-cap": "this conversation reached its limit of judgments",
6852
+ "write-cap": "this conversation reached its limit of learned facts",
6853
+ "layer-off": "Knowledge of you is off",
6854
+ "system": "not a prompt of yours"
6855
+ },
6856
+ "none": {
6857
+ "not-durable": "not a lasting preference",
6858
+ "no-answer": "Jev did not answer",
6859
+ "jev-unavailable": "Jev is off or has no key",
6860
+ "duplicate": "memory already states this",
6861
+ "write-cap": "this conversation reached its limit of learned facts",
6862
+ "no-evidence": "no sentence carried it",
6863
+ "no-statement": "no usable statement",
6864
+ "write-error": "the memory write failed",
6865
+ "no-store": "memory is not available",
6866
+ "error": "the learning step failed"
6867
+ },
6868
+ "writer": {
6869
+ "unverified": "the rewrite could not be checked",
6870
+ "not-faithful": "the rewrite added something",
6871
+ "no-writer": "no writer model",
6872
+ "writer-cap": "writer limit reached",
6873
+ "other": "the writer failed"
6874
+ },
6875
+ "totals": "Judged {gate}/{gateCap} · writer {writer}/{writerCap} · learned {writes}/{writeCap} · {tokens} tok injected over {turns} turns · {cost}",
6876
+ "open": "Open memory"
6877
+ },
5723
6878
  "memories": {
5724
6879
  "recalled": "Recalled",
5725
6880
  "saved": "Memory saved"
@@ -5972,6 +7127,21 @@
5972
7127
  "opencode": "OpenCode plan agent (no file edits)"
5973
7128
  }
5974
7129
  },
7130
+ "tests": {
7131
+ "title": "Test density",
7132
+ "levels": {
7133
+ "none": "None",
7134
+ "light": "Light",
7135
+ "standard": "Standard",
7136
+ "thorough": "Thorough"
7137
+ },
7138
+ "desc": {
7139
+ "none": "No tests. Only checks that the change loads.",
7140
+ "light": "Runs the tests that cover the change. New tests only when they matter.",
7141
+ "standard": "Adds focused tests and runs the area's suite once.",
7142
+ "thorough": "Full coverage, whole suite, live checks."
7143
+ }
7144
+ },
5975
7145
  "accounts": {
5976
7146
  "title": "{provider} accounts",
5977
7147
  "add": "Add account…",
@@ -6097,9 +7267,9 @@
6097
7267
  "always": "Always ask",
6098
7268
  "unsure": "Ask when unsure",
6099
7269
  "never": "Never ask",
6100
- "alwaysDesc": "Show the route card before every task.",
6101
- "unsureDesc": "{model} routes on its own when confident, asks otherwise.",
6102
- "neverDesc": "{model} sorts each request; your task routes apply without asking."
7270
+ "alwaysDesc": "Confirm every actionable task.",
7271
+ "unsureDesc": "Confirm below {pct}% confidence or when a model cannot run the task.",
7272
+ "neverDesc": "Run saved routes immediately; otherwise the assistant chooses."
6103
7273
  },
6104
7274
  "correction": {
6105
7275
  "remembered": "your saved route {to} replaced {from}",
@@ -6119,11 +7289,11 @@
6119
7289
  "badge": {
6120
7290
  "suggested": "Suggested",
6121
7291
  "suggestedPct": "Suggested · {pct}",
6122
- "remembered": "Remembered",
7292
+ "remembered": "Your choice",
6123
7293
  "current": "Current",
6124
7294
  "cheaper": "Cheaper",
6125
7295
  "stronger": "Stronger",
6126
- "other": "Your pick",
7296
+ "other": "Your choice",
6127
7297
  "makesImages": "Makes images",
6128
7298
  "makesVideo": "Makes video",
6129
7299
  "canSee": "Can see"
@@ -6139,7 +7309,7 @@
6139
7309
  },
6140
7310
  "decidedBy": "decided by {model}",
6141
7311
  "youChose": "you chose",
6142
- "remembered": "remembered",
7312
+ "remembered": "your saved choice",
6143
7313
  "timeout": "default after timeout",
6144
7314
  "alternatives": "Also considered",
6145
7315
  "corrections": "Adjusted",
@@ -6149,7 +7319,7 @@
6149
7319
  "chooseModel": "Where should this run?",
6150
7320
  "other": "Other model…",
6151
7321
  "otherTitle": "Run on another model",
6152
- "rememberFor": "Remember for {taskClass} tasks",
7322
+ "rememberFor": "Use this choice for {taskClass} tasks",
6153
7323
  "rememberCurrent": "now: {current}",
6154
7324
  "run": "Run",
6155
7325
  "keys": "1–4 choose · Enter runs · Esc cancels",
@@ -6157,12 +7327,12 @@
6157
7327
  "cancelling": "Cancelling…",
6158
7328
  "expiresIn": "Expires in {time}",
6159
7329
  "invalid": "That route is not available. Pick another option.",
6160
- "brainDecides": "Let the brain decide",
7330
+ "brainDecides": "Assistant chooses",
6161
7331
  "resetAll": "Reset all",
6162
7332
  "whenToAsk": "When to ask",
6163
7333
  "taskRoutes": "Task routes",
6164
7334
  "visionRow": "Screenshots & images",
6165
- "visionDesc": "Used when a task needs a model that can see.",
7335
+ "visionDesc": "Fallback when a task needs a model that can see.",
6166
7336
  "noCapableModel": "No model in your catalog can make {medium} yet.",
6167
7337
  "incapableTip": "This model can't generate {medium}, so the route is not applied.",
6168
7338
  "noSeeingModel": "No model in your catalog can see images yet.",
@@ -6173,25 +7343,202 @@
6173
7343
  "images": "images",
6174
7344
  "videos": "videos"
6175
7345
  },
6176
- "effortAuto": "auto effort",
6177
- "effortAutoDefault": "auto ({effort})",
7346
+ "effortAuto": "Model default",
7347
+ "effortAutoDefault": "Default · {effort}",
6178
7348
  "effortUnsupported": "{effort} · unsupported",
6179
7349
  "source": {
6180
- "yours": "yours",
6181
- "remembered": "remembered",
6182
- "default": "default",
6183
- "disabled": "disabled",
6184
- "incapable": "incapable"
7350
+ "yours": "Your choice",
7351
+ "remembered": "Your choice",
7352
+ "default": "Assistant chooses",
7353
+ "disabled": "Hidden",
7354
+ "incapable": "Needs attention"
6185
7355
  },
6186
7356
  "reset": "Reset {taskClass}",
6187
- "resetTip": "Back to default",
7357
+ "resetTip": "Let the assistant choose",
6188
7358
  "reload": "Reload",
6189
7359
  "unavailable": "Model routing is not available on this server yet.",
6190
7360
  "loadFailed": "Could not load model routes",
6191
- "conflict": "Changed elsewhere — reload",
7361
+ "conflict": "Settings changed elsewhere. Reload to keep your edits and review the latest choices.",
6192
7362
  "invalidField": "Invalid routing setting: {field}",
6193
- "saveFailed": "Could not save",
6194
- "saved": "Model routes saved."
7363
+ "saveFailed": "Could not save. Your edits are kept; try again.",
7364
+ "saved": "Model routes saved.",
7365
+ "effortDefaultUnknown": "Default · unknown",
7366
+ "effortNotSupported": "Not supported",
7367
+ "resetChoice": "Reset",
7368
+ "reloadModels": "Reload models",
7369
+ "fieldLabel": "{task}: {field}, {value}",
7370
+ "editorEffortAuto": "Auto",
7371
+ "editorInConversation": "This conversation",
7372
+ "editorUnusedValue": "—",
7373
+ "editorSessionOverride": "This conversation overrides the default: {mode}.",
7374
+ "notApplied": "Not applied",
7375
+ "modeSummary": {
7376
+ "always-ask": "Asks before every task. Routes saved in Never ask are offered first on the route card.",
7377
+ "ask-unsure": "Asks below {pct}% confidence or if a model cannot run the task. Routes saved in Never ask are offered first on the route card.",
7378
+ "never": "Runs valid saved routes immediately; the Assistant chooses for other tasks. Plain Chat stays on the current brain."
7379
+ },
7380
+ "defaultScope": "Default for conversations. Saved task choices are shared across all modes.",
7381
+ "sessionOverride": "This conversation uses {mode}. Its override is changed from the route chip or /routes.",
7382
+ "brainLabel": "Routing brain: {model}",
7383
+ "withChoice": "With your choice",
7384
+ "withoutChoice": "Assistant chooses",
7385
+ "effortNote": "Default effort uses the model default when the brain does not propose a level.",
7386
+ "workerOnly": "Worker only",
7387
+ "needsVision": "Needs vision",
7388
+ "needs": {
7389
+ "image": "Needs image output",
7390
+ "video": "Needs video output"
7391
+ },
7392
+ "chatCurrent": "Uses the current brain",
7393
+ "workerChooses": "Worker · assistant chooses",
7394
+ "inConversation": "In conversation",
7395
+ "onWorker": "{provider} worker",
7396
+ "conversationDesc": "Continue this conversation on the chosen model for this task.",
7397
+ "workerDesc": "Hand the task to a worker and show its result here.",
7398
+ "otherProviderWorker": "A model from another provider runs on a worker.",
7399
+ "chatInactive": "Plain chat stays on the current brain. A stored Chat choice is not applied in any mode.",
7400
+ "visionFallback": "Vision fallback, not a task class. Used when the chosen model cannot see image input.",
7401
+ "columns": {
7402
+ "task": "Task",
7403
+ "model": "Model",
7404
+ "effort": "Effort",
7405
+ "run": "Runs in",
7406
+ "reset": "Reset"
7407
+ },
7408
+ "behavior": {
7409
+ "always-ask": {
7410
+ "saved": "Guides the brain’s suggestion and is offered on the route card.",
7411
+ "unsaved": "The brain suggests a route; you confirm before it runs.",
7412
+ "note": "Every actionable task asks for your choice. A task with no capable model cannot run."
7413
+ },
7414
+ "ask-unsure": {
7415
+ "saved": "Guides the brain’s choice. It can choose another model if the task needs one.",
7416
+ "unsaved": "The brain chooses a model and where it runs.",
7417
+ "note": "Asks below {pct}% confidence, or when a model is missing, unknown, disabled or lacks a required capability. A task with no capable model cannot run."
7418
+ },
7419
+ "never": {
7420
+ "saved": "Runs on your saved model and destination immediately, when the choice is valid.",
7421
+ "unsaved": "The brain chooses a route and runs it immediately.",
7422
+ "note": "Disabled or incompatible choices are skipped. Invalid model picks can be corrected. A task with no capable model cannot run."
7423
+ }
7424
+ },
7425
+ "efforts": {
7426
+ "none": "None",
7427
+ "thinking": "Thinking",
7428
+ "minimal": "Minimal",
7429
+ "low": "Low",
7430
+ "medium": "Medium",
7431
+ "high": "High",
7432
+ "xhigh": "Extra high",
7433
+ "max": "Maximum",
7434
+ "ultra": "Ultra"
7435
+ },
7436
+ "issue": {
7437
+ "disabled": "Hidden in Models. Show it there or choose another model.",
7438
+ "missing": "Not in the current list. Reload models, choose a listed model or reset this choice.",
7439
+ "unavailable": "Model unavailable. Choose an available model or reset this choice.",
7440
+ "blind": "This task needs vision. Choose a model that can see images.",
7441
+ "unknownVision": "Vision is unverified. Choose a model known to see images or reset this choice.",
7442
+ "incapable": "This model cannot generate {medium}. Choose one that can.",
7443
+ "effort": "Saved effort is unsupported. Choose a supported level or use the default.",
7444
+ "unverified": "Could not verify this model. Reload models before relying on this choice."
7445
+ },
7446
+ "issueLabel": {
7447
+ "disabled": "Hidden",
7448
+ "missing": "Not listed",
7449
+ "unavailable": "Unavailable",
7450
+ "blind": "Needs vision",
7451
+ "unknownVision": "Vision unverified",
7452
+ "incapable": "Incompatible",
7453
+ "effort": "Unsupported effort",
7454
+ "unverified": "Unverified"
7455
+ },
7456
+ "editorState": {
7457
+ "modelsUpdated": "Model list updated. Your unsaved changes are kept.",
7458
+ "discardTitle": "Discard unsaved changes?",
7459
+ "discardDesc": "Your saved settings will stay as they are.",
7460
+ "resetTitle": "Reset {count} saved choices?",
7461
+ "resetDesc": "The assistant will choose for these tasks. Nothing changes until you save.",
7462
+ "keepEditing": "Keep editing",
7463
+ "discard": "Discard changes",
7464
+ "resetConfirm": "Reset choices",
7465
+ "moreBelow": "More task routes below ↓",
7466
+ "saving": "Saving…",
7467
+ "unsavedOne": "1 unsaved change",
7468
+ "unsaved": "{count} unsaved changes",
7469
+ "noChanges": "No unsaved changes",
7470
+ "fixChoices": "Fix the highlighted choices or reset them before saving.",
7471
+ "offline": "Offline. Your edits are kept. Reconnect to save or reload models.",
7472
+ "loadingRoutes": "Loading routing settings and models…",
7473
+ "loadingModels": "Loading models…",
7474
+ "modelsFailed": "Could not refresh the model list. Showing provider lists where available. Reload models to verify your choices.",
7475
+ "modelsEmpty": "No models are available. Check Models or connect a provider, then reload.",
7476
+ "tasksEmpty": "No task classes are available on this server.",
7477
+ "edited": " · edited",
7478
+ "settingsReloaded": "Latest settings loaded. Your edits are kept; review them before saving.",
7479
+ "permission": "You do not have permission to edit routing settings."
7480
+ },
7481
+ "menu": {
7482
+ "priceUnknown": "Price unknown",
7483
+ "contextUnknown": "Context unknown",
7484
+ "contextTokens": "{count} tokens",
7485
+ "hiddenCount": "{count} hidden in Models",
7486
+ "noCompatible": "No compatible models shown for this provider.",
7487
+ "providerEmpty": "No models shown for this provider.",
7488
+ "noMatches": "No matching models. Check Models for hidden choices.",
7489
+ "failed": "Model list could not be refreshed. Provider lists may be out of date.",
7490
+ "hiddenHelp": "Missing a model? Your Models list controls what is shown."
7491
+ },
7492
+ "classes": {
7493
+ "chat": {
7494
+ "label": "Chat",
7495
+ "desc": "Conversation and questions answered from knowledge or memory"
7496
+ },
7497
+ "quick": {
7498
+ "label": "Quick task",
7499
+ "desc": "Small edits, one-off shell commands and lookups"
7500
+ },
7501
+ "code": {
7502
+ "label": "Coding",
7503
+ "desc": "A feature or bug fix inside one repository"
7504
+ },
7505
+ "complex": {
7506
+ "label": "Complex engineering",
7507
+ "desc": "Architecture, cross-file refactors and hard debugging"
7508
+ },
7509
+ "review": {
7510
+ "label": "Review",
7511
+ "desc": "A second model reviews code, a plan or a result"
7512
+ },
7513
+ "research": {
7514
+ "label": "Research",
7515
+ "desc": "Web or codebase research and summaries"
7516
+ },
7517
+ "browser": {
7518
+ "label": "Browser",
7519
+ "desc": "Web tasks in the SynaBun browser"
7520
+ },
7521
+ "computer": {
7522
+ "label": "Computer use",
7523
+ "desc": "Operate desktop apps on this Mac"
7524
+ },
7525
+ "automation": {
7526
+ "label": "Automation",
7527
+ "desc": "Loops, schedules and recurring work"
7528
+ },
7529
+ "design": {
7530
+ "label": "Design",
7531
+ "desc": "UI/UX research, design systems, mockups and prototypes"
7532
+ },
7533
+ "image_gen": {
7534
+ "label": "Image creation",
7535
+ "desc": "Create images with a model that generates them"
7536
+ },
7537
+ "video_gen": {
7538
+ "label": "Video creation",
7539
+ "desc": "Create videos with a model that generates them"
7540
+ }
7541
+ }
6195
7542
  },
6196
7543
  "computer": {
6197
7544
  "toggle": "Computer",