synabun 2.0.0 → 2.0.7

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 (507) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/NOTICE +5 -0
  3. package/README.md +2 -1
  4. package/THIRD-PARTY-LICENSES.md +59 -0
  5. package/benchmarks/fixtures/browser/README.md +1 -1
  6. package/benchmarks/fixtures/desktop/README.md +1 -1
  7. package/docs/whatsapp.md +153 -18
  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 +26 -3
  12. package/hooks/claude-code/stop.mjs +5 -5
  13. package/lib/child-path.js +303 -0
  14. package/lib/claude-hooks.js +2 -1
  15. package/lib/data-home-migration.js +2 -0
  16. package/lib/desktop-app.js +265 -0
  17. package/lib/external-tools.js +7 -3
  18. package/lib/log-redact.js +102 -0
  19. package/lib/packaged-runtime.js +138 -11
  20. package/lib/start-launcher.js +88 -1
  21. package/mcp-server/dist/http.d.ts +3 -1
  22. package/mcp-server/dist/http.d.ts.map +1 -1
  23. package/mcp-server/dist/http.js +15 -4
  24. package/mcp-server/dist/http.js.map +1 -1
  25. package/mcp-server/dist/index.d.ts.map +1 -1
  26. package/mcp-server/dist/index.js +9 -6
  27. package/mcp-server/dist/index.js.map +1 -1
  28. package/mcp-server/dist/services/budget-judgments.d.ts +108 -0
  29. package/mcp-server/dist/services/budget-judgments.d.ts.map +1 -0
  30. package/mcp-server/dist/services/budget-judgments.js +153 -0
  31. package/mcp-server/dist/services/budget-judgments.js.map +1 -0
  32. package/mcp-server/dist/services/codex-config-heal.d.ts +5 -1
  33. package/mcp-server/dist/services/codex-config-heal.d.ts.map +1 -1
  34. package/mcp-server/dist/services/codex-config-heal.js +41 -4
  35. package/mcp-server/dist/services/codex-config-heal.js.map +1 -1
  36. package/mcp-server/dist/services/identity.d.ts +11 -0
  37. package/mcp-server/dist/services/identity.d.ts.map +1 -1
  38. package/mcp-server/dist/services/identity.js +24 -0
  39. package/mcp-server/dist/services/identity.js.map +1 -1
  40. package/mcp-server/dist/services/neural-interface.d.ts +13 -0
  41. package/mcp-server/dist/services/neural-interface.d.ts.map +1 -1
  42. package/mcp-server/dist/services/neural-interface.js +34 -2
  43. package/mcp-server/dist/services/neural-interface.js.map +1 -1
  44. package/mcp-server/dist/services/typesafe-config.d.ts +1 -1
  45. package/mcp-server/dist/services/typesafe-config.d.ts.map +1 -1
  46. package/mcp-server/dist/services/typesafe-config.js +4 -1
  47. package/mcp-server/dist/services/typesafe-config.js.map +1 -1
  48. package/mcp-server/dist/tools/agents.d.ts +10 -7
  49. package/mcp-server/dist/tools/agents.d.ts.map +1 -1
  50. package/mcp-server/dist/tools/agents.js +34 -13
  51. package/mcp-server/dist/tools/agents.js.map +1 -1
  52. package/mcp-server/dist/tools/whatsapp-send-file.d.ts +17 -0
  53. package/mcp-server/dist/tools/whatsapp-send-file.d.ts.map +1 -0
  54. package/mcp-server/dist/tools/whatsapp-send-file.js +44 -0
  55. package/mcp-server/dist/tools/whatsapp-send-file.js.map +1 -0
  56. package/mcp-server/dist/tui.js +2 -1
  57. package/mcp-server/dist/tui.js.map +1 -1
  58. package/mcp-server/dist/version.d.ts +5 -0
  59. package/mcp-server/dist/version.d.ts.map +1 -0
  60. package/mcp-server/dist/version.js +21 -0
  61. package/mcp-server/dist/version.js.map +1 -0
  62. package/mcp-server/package-lock.json +2 -2
  63. package/mcp-server/package.json +1 -3
  64. package/mcp-server/run.mjs +15 -9
  65. package/mcp-server/src/http.ts +18 -3
  66. package/mcp-server/src/index.ts +9 -6
  67. package/mcp-server/src/services/budget-judgments.ts +183 -0
  68. package/mcp-server/src/services/codex-config-heal.ts +35 -4
  69. package/mcp-server/src/services/identity.ts +27 -0
  70. package/mcp-server/src/services/neural-interface.ts +34 -2
  71. package/mcp-server/src/services/typesafe-config.ts +4 -1
  72. package/mcp-server/src/tools/agents.ts +33 -14
  73. package/mcp-server/src/tools/whatsapp-send-file.ts +51 -0
  74. package/mcp-server/src/tui.ts +2 -1
  75. package/mcp-server/src/version.ts +22 -0
  76. package/neural-interface/i18n/en.json +2126 -209
  77. package/neural-interface/i18n/pt-BR.json +2123 -207
  78. package/neural-interface/lib/account-usage.js +163 -0
  79. package/neural-interface/lib/assistant-api.js +316 -57
  80. package/neural-interface/lib/assistant-brains/claude.js +19 -2
  81. package/neural-interface/lib/assistant-brains/codex.js +3 -0
  82. package/neural-interface/lib/assistant-brains/opencode.js +17 -4
  83. package/neural-interface/lib/assistant-budget-planner.js +390 -0
  84. package/neural-interface/lib/assistant-budget-split.js +408 -0
  85. package/neural-interface/lib/assistant-budget.js +94 -95
  86. package/neural-interface/lib/assistant-catalog.js +179 -27
  87. package/neural-interface/lib/assistant-config.js +91 -14
  88. package/neural-interface/lib/assistant-dispatch.js +494 -138
  89. package/neural-interface/lib/assistant-hidden-models.js +393 -66
  90. package/neural-interface/lib/assistant-jev.js +26 -3
  91. package/neural-interface/lib/assistant-memory.js +24 -10
  92. package/neural-interface/lib/assistant-persona.js +73 -12
  93. package/neural-interface/lib/assistant-plan-permissions.js +8 -1
  94. package/neural-interface/lib/assistant-pricing.js +21 -6
  95. package/neural-interface/lib/assistant-route-accounts.js +14 -0
  96. package/neural-interface/lib/assistant-route-gate.js +19 -3
  97. package/neural-interface/lib/assistant-router.js +373 -42
  98. package/neural-interface/lib/assistant-runtime.js +488 -59
  99. package/neural-interface/lib/assistant-task-prompt.js +13 -3
  100. package/neural-interface/lib/assistant-test-density.js +142 -0
  101. package/neural-interface/lib/assistant-user-context-budgets.js +123 -0
  102. package/neural-interface/lib/assistant-user-context.js +908 -0
  103. package/neural-interface/lib/assistant-user-knowledge.js +328 -0
  104. package/neural-interface/lib/assistant-user-learn.js +404 -0
  105. package/neural-interface/lib/assistant-user-threads.js +226 -0
  106. package/neural-interface/lib/assistant-user-writer.js +183 -0
  107. package/neural-interface/lib/augmented-path.js +317 -53
  108. package/neural-interface/lib/browser-background-tab.js +134 -0
  109. package/neural-interface/lib/browser-screenshot.js +678 -61
  110. package/neural-interface/lib/claude-accounts.js +342 -31
  111. package/neural-interface/lib/claude-agent-bridge.js +123 -9
  112. package/neural-interface/lib/claude-executable.js +6 -1
  113. package/neural-interface/lib/claude-model-catalog.js +33 -5
  114. package/neural-interface/lib/claude-panel-auth.js +221 -0
  115. package/neural-interface/lib/claude-profile-api-key.js +62 -0
  116. package/neural-interface/lib/claude-temporary.js +46 -7
  117. package/neural-interface/lib/cli-install-api.js +137 -0
  118. package/neural-interface/lib/cli-install.js +797 -0
  119. package/neural-interface/lib/cli-path.js +130 -0
  120. package/neural-interface/lib/cli-resolver.js +744 -0
  121. package/neural-interface/lib/cli-update-planner.js +143 -7
  122. package/neural-interface/lib/cloudflared/install.js +533 -0
  123. package/neural-interface/lib/cloudflared/manager.js +545 -0
  124. package/neural-interface/lib/cloudflared/pins.js +115 -0
  125. package/neural-interface/lib/cloudflared/pins.json +63 -0
  126. package/neural-interface/lib/cloudflared/tunnel.js +265 -0
  127. package/neural-interface/lib/codex-account-auth.js +178 -0
  128. package/neural-interface/lib/codex-accounts.js +489 -0
  129. package/neural-interface/lib/codex-capabilities.js +2 -1
  130. package/neural-interface/lib/codex-compat-rpc.js +8 -2
  131. package/neural-interface/lib/codex-mcp-approvals.js +5 -1
  132. package/neural-interface/lib/codex-panel-auth.js +62 -0
  133. package/neural-interface/lib/codex-session-settings.js +1 -1
  134. package/neural-interface/lib/codex-settings-schema.js +120 -0
  135. package/neural-interface/lib/desktop/config.js +3 -0
  136. package/neural-interface/lib/editor-completion-endpoint.js +264 -0
  137. package/neural-interface/lib/editor-completion-opencode.js +436 -0
  138. package/neural-interface/lib/editor-completion.js +714 -0
  139. package/neural-interface/lib/editor-config.js +149 -0
  140. package/neural-interface/lib/editor-files-api.js +268 -0
  141. package/neural-interface/lib/editor-git-api.js +134 -0
  142. package/neural-interface/lib/file-explorer-api.js +1039 -0
  143. package/neural-interface/lib/file-explorer-system.js +355 -0
  144. package/neural-interface/lib/file-explorer-trash.ps1 +85 -0
  145. package/neural-interface/lib/file-explorer-watch.js +239 -0
  146. package/neural-interface/lib/git-bash/bzip2.js +339 -0
  147. package/neural-interface/lib/git-bash/claude-settings.js +73 -0
  148. package/neural-interface/lib/git-bash/extract-worker.js +34 -0
  149. package/neural-interface/lib/git-bash/install.js +529 -0
  150. package/neural-interface/lib/git-bash/licenses/COPYING +360 -0
  151. package/neural-interface/lib/git-bash/licenses/LGPL-2.1 +511 -0
  152. package/neural-interface/lib/git-bash/manager.js +268 -0
  153. package/neural-interface/lib/git-bash/pins.js +206 -0
  154. package/neural-interface/lib/git-bash/pins.json +34 -0
  155. package/neural-interface/lib/git-bash/resolver.js +194 -0
  156. package/neural-interface/lib/git-diff-api.js +103 -0
  157. package/neural-interface/lib/git-read.js +234 -0
  158. package/neural-interface/lib/greeting/api.js +89 -0
  159. package/neural-interface/lib/greeting/budgets.js +90 -0
  160. package/neural-interface/lib/greeting/engine.js +461 -0
  161. package/neural-interface/lib/greeting/facts.js +320 -0
  162. package/neural-interface/lib/greeting/sources.js +252 -0
  163. package/neural-interface/lib/greeting/writer.js +139 -0
  164. package/neural-interface/lib/http-guards.js +189 -13
  165. package/neural-interface/lib/install-details.js +145 -0
  166. package/neural-interface/lib/machine-names.js +88 -0
  167. package/neural-interface/lib/mcp-installer.js +14 -2
  168. package/neural-interface/lib/memory-api.js +31 -7
  169. package/neural-interface/lib/native-loop-providers.js +26 -8
  170. package/neural-interface/lib/native-loop-runtime.js +9 -4
  171. package/neural-interface/lib/os-path.js +319 -0
  172. package/neural-interface/lib/plugin-installer.js +4 -2
  173. package/neural-interface/lib/project-storage.js +5 -7
  174. package/neural-interface/lib/provider-panel-api-key-auth.js +92 -0
  175. package/neural-interface/lib/provider-panel-terminal-auth.js +95 -0
  176. package/neural-interface/lib/pty-host/core.js +2 -1
  177. package/neural-interface/lib/pty-host/manager.js +27 -2
  178. package/neural-interface/lib/remote-policy.js +20 -11
  179. package/neural-interface/lib/request-gate.js +589 -0
  180. package/neural-interface/lib/session-title-generator.js +4 -3
  181. package/neural-interface/lib/system-about.js +340 -0
  182. package/neural-interface/lib/system-activity.js +66 -0
  183. package/neural-interface/lib/terminal-env.js +11 -3
  184. package/neural-interface/lib/terminal-path.js +55 -0
  185. package/neural-interface/lib/ui-blob-api.js +108 -0
  186. package/neural-interface/lib/ui-blob-store.js +68 -0
  187. package/neural-interface/lib/virtual-socket.js +12 -1
  188. package/neural-interface/lib/whatsapp/baileys-adapter.js +165 -45
  189. package/neural-interface/lib/whatsapp/bridge.js +78 -34
  190. package/neural-interface/lib/whatsapp/commands.js +13 -14
  191. package/neural-interface/lib/whatsapp/config.js +134 -20
  192. package/neural-interface/lib/whatsapp/fake-baileys.js +99 -14
  193. package/neural-interface/lib/whatsapp/host-core.js +168 -35
  194. package/neural-interface/lib/whatsapp/inbound.js +5 -3
  195. package/neural-interface/lib/whatsapp/local-file.js +524 -0
  196. package/neural-interface/lib/whatsapp/manager.js +92 -32
  197. package/neural-interface/lib/whatsapp/paths.js +11 -1
  198. package/neural-interface/lib/whatsapp/protocol.js +65 -5
  199. package/neural-interface/lib/whatsapp/redact.js +63 -0
  200. package/neural-interface/lib/whatsapp/service.js +343 -91
  201. package/neural-interface/lib/whatsapp/transcription.js +463 -0
  202. package/neural-interface/package-lock.json +701 -2
  203. package/neural-interface/package.json +13 -2
  204. package/neural-interface/public/index.html +2 -0
  205. package/neural-interface/public/index2d.html +2 -0
  206. package/neural-interface/public/install-app.html +9 -6
  207. package/neural-interface/public/offline.html +19 -3
  208. package/neural-interface/public/onboarding.html +107 -2
  209. package/neural-interface/public/shared/account-i18n.js +7 -0
  210. package/neural-interface/public/shared/account-menu.js +539 -0
  211. package/neural-interface/public/shared/account-usage.js +19 -0
  212. package/neural-interface/public/shared/account-view.js +335 -0
  213. package/neural-interface/public/shared/agent-runtime-options.js +50 -14
  214. package/neural-interface/public/shared/assistant/asst-accounts.js +182 -184
  215. package/neural-interface/public/shared/assistant/asst-api.js +32 -2
  216. package/neural-interface/public/shared/assistant/asst-automation.js +286 -0
  217. package/neural-interface/public/shared/assistant/asst-brain-picker.js +430 -81
  218. package/neural-interface/public/shared/assistant/asst-budget.js +259 -303
  219. package/neural-interface/public/shared/assistant/asst-composer.js +11 -1
  220. package/neural-interface/public/shared/assistant/asst-mascot.js +140 -61
  221. package/neural-interface/public/shared/assistant/asst-menu.js +27 -11
  222. package/neural-interface/public/shared/assistant/asst-panel.js +198 -42
  223. package/neural-interface/public/shared/assistant/asst-render.js +197 -23
  224. package/neural-interface/public/shared/assistant/asst-route-models.js +108 -0
  225. package/neural-interface/public/shared/assistant/asst-route.js +95 -343
  226. package/neural-interface/public/shared/assistant/asst-routes-editor.js +534 -0
  227. package/neural-interface/public/shared/assistant/asst-sanitize.js +8 -1
  228. package/neural-interface/public/shared/assistant/asst-sidepanel.js +31 -9
  229. package/neural-interface/public/shared/assistant/asst-slash.js +1 -1
  230. package/neural-interface/public/shared/assistant/asst-state.js +186 -2
  231. package/neural-interface/public/shared/assistant/asst-styles.js +247 -11
  232. package/neural-interface/public/shared/blob-store.js +111 -22
  233. package/neural-interface/public/shared/cdx/cdx-commands.js +4 -1
  234. package/neural-interface/public/shared/cdx/cdx-features.js +22 -14
  235. package/neural-interface/public/shared/cdx/cdx-icons.js +2 -0
  236. package/neural-interface/public/shared/cdx/cdx-panel.js +80 -118
  237. package/neural-interface/public/shared/cdx/cdx-render.js +25 -89
  238. package/neural-interface/public/shared/cdx/cdx-settings.js +231 -0
  239. package/neural-interface/public/shared/cdx/cdx-styles.js +164 -107
  240. package/neural-interface/public/shared/cdx/cdx-tabs.js +348 -668
  241. package/neural-interface/public/shared/cdx/cdx-ws.js +2 -0
  242. package/neural-interface/public/shared/claude-account-view.js +3 -0
  243. package/neural-interface/public/shared/cli-install-view.js +392 -0
  244. package/neural-interface/public/shared/cli-status.js +282 -22
  245. package/neural-interface/public/shared/constants.js +6 -1
  246. package/neural-interface/public/shared/cp/cp-events.js +2 -1
  247. package/neural-interface/public/shared/cp/cp-rehydrate.js +2 -1
  248. package/neural-interface/public/shared/cp/cp-styles.js +61 -0
  249. package/neural-interface/public/shared/desktop-bridge.js +39 -0
  250. package/neural-interface/public/shared/desktop-titlebar-page.js +59 -0
  251. package/neural-interface/public/shared/desktop-titlebar-view.js +122 -0
  252. package/neural-interface/public/shared/desktop-titlebar.js +153 -0
  253. package/neural-interface/public/shared/desktop-update-view.js +462 -0
  254. package/neural-interface/public/shared/editor/editor-ai-logic.js +409 -0
  255. package/neural-interface/public/shared/editor/editor-ai.js +619 -0
  256. package/neural-interface/public/shared/editor/editor-commands.js +212 -0
  257. package/neural-interface/public/shared/editor/editor-compare.js +103 -0
  258. package/neural-interface/public/shared/editor/editor-completion-list.js +172 -0
  259. package/neural-interface/public/shared/editor/editor-doc.js +257 -0
  260. package/neural-interface/public/shared/editor/editor-git-logic.js +131 -0
  261. package/neural-interface/public/shared/editor/editor-git.js +95 -0
  262. package/neural-interface/public/shared/editor/editor-languages.js +156 -0
  263. package/neural-interface/public/shared/editor/editor-lint.js +229 -0
  264. package/neural-interface/public/shared/editor/editor-loader.js +51 -0
  265. package/neural-interface/public/shared/editor/editor-markdown.js +90 -0
  266. package/neural-interface/public/shared/editor/editor-menu.js +233 -0
  267. package/neural-interface/public/shared/editor/editor-minimap.js +371 -0
  268. package/neural-interface/public/shared/editor/editor-palette-logic.js +192 -0
  269. package/neural-interface/public/shared/editor/editor-palette.js +125 -0
  270. package/neural-interface/public/shared/editor/editor-panel-logic.js +288 -0
  271. package/neural-interface/public/shared/editor/editor-panel.js +2099 -0
  272. package/neural-interface/public/shared/editor/editor-prefs.js +224 -0
  273. package/neural-interface/public/shared/editor/editor-safety.js +500 -0
  274. package/neural-interface/public/shared/editor/editor-search.js +352 -0
  275. package/neural-interface/public/shared/editor/editor-statusbar.js +144 -0
  276. package/neural-interface/public/shared/editor/editor-tabs-logic.js +331 -0
  277. package/neural-interface/public/shared/editor/editor-tabs.js +233 -0
  278. package/neural-interface/public/shared/editor/editor-theme.js +244 -0
  279. package/neural-interface/public/shared/editor/editor-view.js +332 -0
  280. package/neural-interface/public/shared/explorer/fx-api.js +216 -0
  281. package/neural-interface/public/shared/explorer/fx-links.js +204 -0
  282. package/neural-interface/public/shared/explorer/fx-logic.js +537 -0
  283. package/neural-interface/public/shared/explorer/fx-main.js +865 -0
  284. package/neural-interface/public/shared/explorer/fx-names.js +87 -0
  285. package/neural-interface/public/shared/explorer/fx-ops.js +370 -0
  286. package/neural-interface/public/shared/explorer/fx-popups.js +490 -0
  287. package/neural-interface/public/shared/explorer/fx-tree.js +790 -0
  288. package/neural-interface/public/shared/file-links.js +339 -0
  289. package/neural-interface/public/shared/git-bash-view.js +145 -0
  290. package/neural-interface/public/shared/greeting/greeting-card.js +178 -0
  291. package/neural-interface/public/shared/greeting/greeting-view.js +148 -0
  292. package/neural-interface/public/shared/html-shell.js +161 -165
  293. package/neural-interface/public/shared/i18n.js +19 -1
  294. package/neural-interface/public/shared/install-details-view.js +86 -0
  295. package/neural-interface/public/shared/ocp-v2/ocp-v2-childpanel.js +4 -0
  296. package/neural-interface/public/shared/ocp-v2/ocp-v2-greeting.js +47 -0
  297. package/neural-interface/public/shared/ocp-v2/ocp-v2-panel.js +131 -17
  298. package/neural-interface/public/shared/ocp-v2/ocp-v2-render.js +7 -1
  299. package/neural-interface/public/shared/ocp-v2/ocp-v2-send.js +22 -0
  300. package/neural-interface/public/shared/ocp-v2/ocp-v2-styles.js +158 -0
  301. package/neural-interface/public/shared/ocp-v2/ocp-v2-ws.js +3 -2
  302. package/neural-interface/public/shared/pwa-install-page.js +32 -2
  303. package/neural-interface/public/shared/pwa-install.css +3 -3
  304. package/neural-interface/public/shared/pwa-install.js +100 -1
  305. package/neural-interface/public/shared/settings/settings-about-pane.js +271 -0
  306. package/neural-interface/public/shared/settings/settings-about.js +254 -0
  307. package/neural-interface/public/shared/settings/settings-code-editor-pane.js +412 -0
  308. package/neural-interface/public/shared/settings/settings-code-editor.js +328 -0
  309. package/neural-interface/public/shared/settings/settings-greeting.js +133 -0
  310. package/neural-interface/public/shared/settings/settings-ia.js +33 -4
  311. package/neural-interface/public/shared/settings/settings-user-context.js +154 -0
  312. package/neural-interface/public/shared/showcase-privacy.js +489 -0
  313. package/neural-interface/public/shared/start-bridge.js +238 -19
  314. package/neural-interface/public/shared/storage.js +30 -3
  315. package/neural-interface/public/shared/styles.css +1710 -770
  316. package/neural-interface/public/shared/synabun-mascot.js +68 -58
  317. package/neural-interface/public/shared/tunnel-view.js +167 -0
  318. package/neural-interface/public/shared/ui-claude-panel.js +369 -229
  319. package/neural-interface/public/shared/ui-cli-banner.js +355 -0
  320. package/neural-interface/public/shared/ui-detail.js +15 -0
  321. package/neural-interface/public/shared/ui-explorer.js +22 -0
  322. package/neural-interface/public/shared/ui-file-explorer.js +481 -2496
  323. package/neural-interface/public/shared/ui-file-links.js +103 -0
  324. package/neural-interface/public/shared/ui-git-bash.js +124 -0
  325. package/neural-interface/public/shared/ui-help.js +26 -0
  326. package/neural-interface/public/shared/ui-invite.js +126 -116
  327. package/neural-interface/public/shared/ui-judgments.js +10 -1
  328. package/neural-interface/public/shared/ui-keybinds.js +4 -0
  329. package/neural-interface/public/shared/ui-loading.js +187 -19
  330. package/neural-interface/public/shared/ui-menubar.js +25 -33
  331. package/neural-interface/public/shared/ui-native-loop-router-state.js +11 -0
  332. package/neural-interface/public/shared/ui-native-loop-router.js +15 -2
  333. package/neural-interface/public/shared/ui-navbar.js +48 -22
  334. package/neural-interface/public/shared/ui-provider-auth.js +104 -0
  335. package/neural-interface/public/shared/ui-provider-terminal-auth.js +223 -0
  336. package/neural-interface/public/shared/ui-sessions.js +9 -3
  337. package/neural-interface/public/shared/ui-settings.js +509 -490
  338. package/neural-interface/public/shared/ui-sidepanel-runtime.js +2 -1
  339. package/neural-interface/public/shared/ui-sidepanel-sessions.js +3 -1
  340. package/neural-interface/public/shared/ui-sync.js +22 -0
  341. package/neural-interface/public/shared/ui-terminal.js +40 -5
  342. package/neural-interface/public/shared/ui-tool-updates.js +5 -0
  343. package/neural-interface/public/shared/ui-tunnel.js +130 -0
  344. package/neural-interface/public/shared/ui-tutorial-steps.js +6 -2
  345. package/neural-interface/public/shared/ui-update.js +594 -5
  346. package/neural-interface/public/shared/ui-whatsapp.js +21 -6
  347. package/neural-interface/public/shared/ui-whiteboard.js +12 -0
  348. package/neural-interface/public/shared/ui-worker-end.js +245 -0
  349. package/neural-interface/public/shared/ui-workspaces.js +41 -27
  350. package/neural-interface/public/shared/whatsapp/wa-view.js +51 -8
  351. package/neural-interface/public/shared/worker-end.js +253 -0
  352. package/neural-interface/public/sw.js +2 -2
  353. package/neural-interface/public/variant/2d/main.js +10 -1
  354. package/neural-interface/public/variant/3d/main.js +10 -1
  355. package/neural-interface/public/vendor/codemirror/chunks/apl-CSDKT72Z.js +1 -0
  356. package/neural-interface/public/vendor/codemirror/chunks/asciiarmor-JYYPU5BM.js +1 -0
  357. package/neural-interface/public/vendor/codemirror/chunks/asn1-NRWCZDA6.js +1 -0
  358. package/neural-interface/public/vendor/codemirror/chunks/asterisk-5OU6D4ZQ.js +1 -0
  359. package/neural-interface/public/vendor/codemirror/chunks/brainfuck-ID4N4SYC.js +1 -0
  360. package/neural-interface/public/vendor/codemirror/chunks/chunk-4RZWGCS2.js +1 -0
  361. package/neural-interface/public/vendor/codemirror/chunks/chunk-ACTJM3JR.js +11 -0
  362. package/neural-interface/public/vendor/codemirror/chunks/chunk-S6BMAXLK.js +1 -0
  363. package/neural-interface/public/vendor/codemirror/chunks/chunk-TO2RDOHQ.js +3 -0
  364. package/neural-interface/public/vendor/codemirror/chunks/chunk-US2GMZZQ.js +13 -0
  365. package/neural-interface/public/vendor/codemirror/chunks/chunk-WYYO5ZAJ.js +1 -0
  366. package/neural-interface/public/vendor/codemirror/chunks/chunk-XALZTDJC.js +1 -0
  367. package/neural-interface/public/vendor/codemirror/chunks/chunk-YRNUTRDV.js +1 -0
  368. package/neural-interface/public/vendor/codemirror/chunks/chunk-Z3QOKH62.js +1 -0
  369. package/neural-interface/public/vendor/codemirror/chunks/clike-OWQBSOGL.js +1 -0
  370. package/neural-interface/public/vendor/codemirror/chunks/clojure-KV75UQWC.js +1 -0
  371. package/neural-interface/public/vendor/codemirror/chunks/cmake-GTEP5Y3C.js +1 -0
  372. package/neural-interface/public/vendor/codemirror/chunks/cobol-WCZ7QEGJ.js +1 -0
  373. package/neural-interface/public/vendor/codemirror/chunks/coffeescript-TGLBOT6B.js +1 -0
  374. package/neural-interface/public/vendor/codemirror/chunks/commonlisp-WVVI432V.js +1 -0
  375. package/neural-interface/public/vendor/codemirror/chunks/crystal-S6R6HLKQ.js +1 -0
  376. package/neural-interface/public/vendor/codemirror/chunks/css-PDA2RINP.js +1 -0
  377. package/neural-interface/public/vendor/codemirror/chunks/cypher-HL5QPL4C.js +1 -0
  378. package/neural-interface/public/vendor/codemirror/chunks/d-HHJH2HAJ.js +1 -0
  379. package/neural-interface/public/vendor/codemirror/chunks/diff-MN3A35BY.js +1 -0
  380. package/neural-interface/public/vendor/codemirror/chunks/dist-25SQLBVS.js +3 -0
  381. package/neural-interface/public/vendor/codemirror/chunks/dist-27ZGGJJS.js +1 -0
  382. package/neural-interface/public/vendor/codemirror/chunks/dist-4E52OJIF.js +1 -0
  383. package/neural-interface/public/vendor/codemirror/chunks/dist-6FT73XDC.js +2 -0
  384. package/neural-interface/public/vendor/codemirror/chunks/dist-BE6YGRMW.js +1 -0
  385. package/neural-interface/public/vendor/codemirror/chunks/dist-CJSGKW2O.js +1 -0
  386. package/neural-interface/public/vendor/codemirror/chunks/dist-CRPH2WLI.js +1 -0
  387. package/neural-interface/public/vendor/codemirror/chunks/dist-CTG7JEQN.js +1 -0
  388. package/neural-interface/public/vendor/codemirror/chunks/dist-I3FEVELX.js +1 -0
  389. package/neural-interface/public/vendor/codemirror/chunks/dist-IM5BBSWZ.js +1 -0
  390. package/neural-interface/public/vendor/codemirror/chunks/dist-KERUKTIF.js +1 -0
  391. package/neural-interface/public/vendor/codemirror/chunks/dist-LXTMWZAM.js +1 -0
  392. package/neural-interface/public/vendor/codemirror/chunks/dist-MABASSET.js +1 -0
  393. package/neural-interface/public/vendor/codemirror/chunks/dist-MJVBUZLL.js +3 -0
  394. package/neural-interface/public/vendor/codemirror/chunks/dist-MNB3WZVU.js +1 -0
  395. package/neural-interface/public/vendor/codemirror/chunks/dist-QYWXOE3U.js +7 -0
  396. package/neural-interface/public/vendor/codemirror/chunks/dist-TEBOFWLZ.js +1 -0
  397. package/neural-interface/public/vendor/codemirror/chunks/dist-UNXFROM3.js +1 -0
  398. package/neural-interface/public/vendor/codemirror/chunks/dist-XL2SLQO6.js +1 -0
  399. package/neural-interface/public/vendor/codemirror/chunks/dist-XO42Y3AP.js +6 -0
  400. package/neural-interface/public/vendor/codemirror/chunks/dist-Y2WWDWJK.js +1 -0
  401. package/neural-interface/public/vendor/codemirror/chunks/dist-YFEZKWMU.js +1 -0
  402. package/neural-interface/public/vendor/codemirror/chunks/dist-ZY7SWQO6.js +1 -0
  403. package/neural-interface/public/vendor/codemirror/chunks/dockerfile-3Y4R4NCH.js +1 -0
  404. package/neural-interface/public/vendor/codemirror/chunks/dtd-5343GJ4P.js +1 -0
  405. package/neural-interface/public/vendor/codemirror/chunks/dylan-FI2CXSW2.js +1 -0
  406. package/neural-interface/public/vendor/codemirror/chunks/ebnf-GNQ77YWA.js +1 -0
  407. package/neural-interface/public/vendor/codemirror/chunks/ecl-MRPUAE2L.js +1 -0
  408. package/neural-interface/public/vendor/codemirror/chunks/eiffel-DZROES27.js +1 -0
  409. package/neural-interface/public/vendor/codemirror/chunks/elm-4KICRFKQ.js +1 -0
  410. package/neural-interface/public/vendor/codemirror/chunks/erlang-3IHYC263.js +1 -0
  411. package/neural-interface/public/vendor/codemirror/chunks/factor-C6D3E5UK.js +1 -0
  412. package/neural-interface/public/vendor/codemirror/chunks/fcl-VYTWUJMI.js +1 -0
  413. package/neural-interface/public/vendor/codemirror/chunks/forth-ZBO2EH5M.js +1 -0
  414. package/neural-interface/public/vendor/codemirror/chunks/fortran-5NDCRWIK.js +1 -0
  415. package/neural-interface/public/vendor/codemirror/chunks/gas-SKRMOXFP.js +1 -0
  416. package/neural-interface/public/vendor/codemirror/chunks/gherkin-L45YXZLW.js +1 -0
  417. package/neural-interface/public/vendor/codemirror/chunks/groovy-GLPTLN44.js +1 -0
  418. package/neural-interface/public/vendor/codemirror/chunks/haskell-E7NF7P4Y.js +1 -0
  419. package/neural-interface/public/vendor/codemirror/chunks/haxe-K2NVDOB6.js +1 -0
  420. package/neural-interface/public/vendor/codemirror/chunks/http-Q6DRQIJB.js +1 -0
  421. package/neural-interface/public/vendor/codemirror/chunks/idl-MZYNJVLN.js +1 -0
  422. package/neural-interface/public/vendor/codemirror/chunks/javascript-6YRYK2HR.js +1 -0
  423. package/neural-interface/public/vendor/codemirror/chunks/julia-HXEL2T5G.js +1 -0
  424. package/neural-interface/public/vendor/codemirror/chunks/livescript-MV7CI2JZ.js +1 -0
  425. package/neural-interface/public/vendor/codemirror/chunks/lua-E36NHOOD.js +1 -0
  426. package/neural-interface/public/vendor/codemirror/chunks/mathematica-3XOZZCMC.js +1 -0
  427. package/neural-interface/public/vendor/codemirror/chunks/mbox-ODYGFKS7.js +1 -0
  428. package/neural-interface/public/vendor/codemirror/chunks/mirc-WB43AWF5.js +1 -0
  429. package/neural-interface/public/vendor/codemirror/chunks/mllike-ZT6ET7ZH.js +1 -0
  430. package/neural-interface/public/vendor/codemirror/chunks/modelica-LLMZPFGA.js +1 -0
  431. package/neural-interface/public/vendor/codemirror/chunks/mscgen-2OPNNYFH.js +1 -0
  432. package/neural-interface/public/vendor/codemirror/chunks/mumps-6P3HWJH6.js +1 -0
  433. package/neural-interface/public/vendor/codemirror/chunks/nginx-TCGKQTRW.js +1 -0
  434. package/neural-interface/public/vendor/codemirror/chunks/nsis-ATIGIXTJ.js +1 -0
  435. package/neural-interface/public/vendor/codemirror/chunks/ntriples-5PLBI5OV.js +1 -0
  436. package/neural-interface/public/vendor/codemirror/chunks/octave-QF2S3NL6.js +1 -0
  437. package/neural-interface/public/vendor/codemirror/chunks/oz-JFIVFFH2.js +1 -0
  438. package/neural-interface/public/vendor/codemirror/chunks/pascal-JG6SW76V.js +1 -0
  439. package/neural-interface/public/vendor/codemirror/chunks/perl-4B3IWVVO.js +1 -0
  440. package/neural-interface/public/vendor/codemirror/chunks/pig-ABEBH4MI.js +1 -0
  441. package/neural-interface/public/vendor/codemirror/chunks/powershell-H32XE7TL.js +1 -0
  442. package/neural-interface/public/vendor/codemirror/chunks/properties-NN644MMA.js +1 -0
  443. package/neural-interface/public/vendor/codemirror/chunks/protobuf-YKWQK2J3.js +1 -0
  444. package/neural-interface/public/vendor/codemirror/chunks/pug-RIYXEKFW.js +1 -0
  445. package/neural-interface/public/vendor/codemirror/chunks/puppet-JZQ5WPEV.js +1 -0
  446. package/neural-interface/public/vendor/codemirror/chunks/python-EBCGGHAC.js +1 -0
  447. package/neural-interface/public/vendor/codemirror/chunks/q-5UMH2YQY.js +1 -0
  448. package/neural-interface/public/vendor/codemirror/chunks/r-7XMGG453.js +1 -0
  449. package/neural-interface/public/vendor/codemirror/chunks/rpm-IEV7TSLR.js +1 -0
  450. package/neural-interface/public/vendor/codemirror/chunks/ruby-T4SPFPNM.js +1 -0
  451. package/neural-interface/public/vendor/codemirror/chunks/sas-GEDX67ET.js +1 -0
  452. package/neural-interface/public/vendor/codemirror/chunks/scheme-FTLOWKPC.js +1 -0
  453. package/neural-interface/public/vendor/codemirror/chunks/shell-HUFRKFSJ.js +1 -0
  454. package/neural-interface/public/vendor/codemirror/chunks/sieve-P5QUDVYO.js +1 -0
  455. package/neural-interface/public/vendor/codemirror/chunks/smalltalk-2SORJNQI.js +1 -0
  456. package/neural-interface/public/vendor/codemirror/chunks/solr-M22TGAR5.js +1 -0
  457. package/neural-interface/public/vendor/codemirror/chunks/sparql-4M3KL752.js +1 -0
  458. package/neural-interface/public/vendor/codemirror/chunks/spreadsheet-3K23LA4N.js +1 -0
  459. package/neural-interface/public/vendor/codemirror/chunks/sql-VHRFMUBI.js +1 -0
  460. package/neural-interface/public/vendor/codemirror/chunks/stex-QZDAQUY2.js +1 -0
  461. package/neural-interface/public/vendor/codemirror/chunks/stylus-7ZDKAKBD.js +1 -0
  462. package/neural-interface/public/vendor/codemirror/chunks/swift-WCLCLGMR.js +1 -0
  463. package/neural-interface/public/vendor/codemirror/chunks/tcl-JLMU6WOK.js +1 -0
  464. package/neural-interface/public/vendor/codemirror/chunks/textile-4CHDKZ4T.js +1 -0
  465. package/neural-interface/public/vendor/codemirror/chunks/tiddlywiki-DKMCZZQ4.js +1 -0
  466. package/neural-interface/public/vendor/codemirror/chunks/tiki-F4JIG36Q.js +1 -0
  467. package/neural-interface/public/vendor/codemirror/chunks/toml-BHMHTIM2.js +1 -0
  468. package/neural-interface/public/vendor/codemirror/chunks/troff-YQ2KV5NT.js +1 -0
  469. package/neural-interface/public/vendor/codemirror/chunks/ttcn-ZHRCVFJY.js +1 -0
  470. package/neural-interface/public/vendor/codemirror/chunks/ttcn-cfg-KJOVTY4X.js +1 -0
  471. package/neural-interface/public/vendor/codemirror/chunks/turtle-535P5N6I.js +1 -0
  472. package/neural-interface/public/vendor/codemirror/chunks/vb-76UMQHOT.js +1 -0
  473. package/neural-interface/public/vendor/codemirror/chunks/vbscript-CGNDTK6Z.js +1 -0
  474. package/neural-interface/public/vendor/codemirror/chunks/velocity-VSJDO5T5.js +1 -0
  475. package/neural-interface/public/vendor/codemirror/chunks/verilog-4T6ETXIP.js +1 -0
  476. package/neural-interface/public/vendor/codemirror/chunks/vhdl-T7FNAXUN.js +1 -0
  477. package/neural-interface/public/vendor/codemirror/chunks/webidl-P6MJSJ6J.js +1 -0
  478. package/neural-interface/public/vendor/codemirror/chunks/xquery-UOVILRGN.js +1 -0
  479. package/neural-interface/public/vendor/codemirror/chunks/yacas-CV2APROL.js +1 -0
  480. package/neural-interface/public/vendor/codemirror/chunks/z80-3KFNVM4M.js +1 -0
  481. package/neural-interface/public/vendor/codemirror/codemirror-6.43.14-75f05e67.min.js +2 -0
  482. package/neural-interface/public/vendor/codemirror/manifest.json +60 -0
  483. package/neural-interface/scripts/build-vendor.mjs +78 -2
  484. package/neural-interface/scripts/vendor-codemirror-entry.js +121 -0
  485. package/neural-interface/server.js +2085 -1629
  486. package/neural-interface/templates/rulesets/README.md +1 -1
  487. package/package.json +5 -8
  488. package/setup.js +53 -15
  489. package/benchmarks/browser-live-results.json +0 -79
  490. package/benchmarks/browser-v2-results.json +0 -258
  491. package/neural-interface/lib/codex-capabilities.d.ts +0 -41
  492. package/neural-interface/public/category-logos/claude.svg +0 -1
  493. package/neural-interface/public/category-logos/gemini-color.svg +0 -1
  494. package/neural-interface/public/category-logos/openai.svg +0 -1
  495. package/neural-interface/public/category-logos/synabun.png +0 -0
  496. package/neural-interface/public/claude.svg +0 -1
  497. package/neural-interface/public/gallery.svg +0 -6
  498. package/neural-interface/public/leonardoai.svg +0 -1
  499. package/neural-interface/public/mcp.svg +0 -4
  500. package/neural-interface/public/opencode-logo-dark-square.svg +0 -1
  501. package/neural-interface/public/pin-svgrepo-com.svg +0 -25
  502. package/neural-interface/public/sessionicon.svg +0 -8
  503. package/neural-interface/public/toolbar-album.svg +0 -8
  504. package/neural-interface/public/toolbar-question.svg +0 -6
  505. package/neural-interface/public/toolbar-sessions.svg +0 -6
  506. package/neural-interface/scripts/codex-protocol-fixture.mjs +0 -83
  507. 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,752 @@
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
+ "reasonBudgetShare": "This provider used up its share of the session budget.",
689
+ "reasonMaxTurns": "The run reached its turn limit.",
690
+ "reasonIdle": "The worker waited for a follow-up that did not come, and closed.",
691
+ "reasonRestart": "The server restarted while the run was open.",
692
+ "reasonKillAll": "Stopped together with every other run.",
693
+ "reasonCleared": "The run's state was removed.",
694
+ "reasonOther": "Stopped ({reason}).",
695
+ "durationSeconds": "{s}s",
696
+ "durationMinutes": "{m}m {s}s",
697
+ "durationHours": "{h}h {m}m"
698
+ },
699
+ "fileExplorer": {
700
+ "title": "File Explorer",
701
+ "tree": "Files of {project}",
702
+ "resize": "Resize the File Explorer",
703
+ "loadFailed": "The File Explorer could not be loaded. Reload the page.",
704
+ "needsRestart": "Starts working after the server is restarted.",
705
+ "filter": {
706
+ "placeholder": "Filter files...",
707
+ "label": "Filter files by name",
708
+ "clear": "Clear filter"
709
+ },
710
+ "toolbar": {
711
+ "newFile": "New file",
712
+ "newFolder": "New folder",
713
+ "goToFile": "Go to file",
714
+ "revealActive": "Show the open file in the tree",
715
+ "changedOnly": "Changed files only",
716
+ "collapseAll": "Collapse all",
717
+ "refresh": "Refresh",
718
+ "more": "More"
719
+ },
720
+ "project": {
721
+ "none": "No project",
722
+ "label": "Project: {name}",
723
+ "choose": "Choose a project",
724
+ "add": "Add project...",
725
+ "pickFolder": "Select the project folder",
726
+ "addFailed": "The project could not be added."
727
+ },
728
+ "branch": {
729
+ "label": "Branch {branch}: {count} changed"
730
+ },
731
+ "count": {
732
+ "items": {
733
+ "one": "1 item",
734
+ "other": "{count} items"
735
+ },
736
+ "selected": {
737
+ "one": "1 selected",
738
+ "other": "{count} selected"
739
+ },
740
+ "matches": {
741
+ "one": "1 match",
742
+ "other": "{count} matches"
743
+ },
744
+ "changed": {
745
+ "one": "1 changed",
746
+ "other": "{count} changed"
747
+ }
748
+ },
749
+ "state": {
750
+ "loading": "Loading...",
751
+ "searching": "Searching...",
752
+ "retry": "Try again",
753
+ "showMore": "Show more",
754
+ "more": {
755
+ "one": "1 more",
756
+ "other": "{count} more"
757
+ },
758
+ "truncated": "Showing {shown} of {total}. Filter by name to find the rest.",
759
+ "emptyFolder": "Empty folder",
760
+ "emptyProject": "This folder is empty.",
761
+ "noProject": "No project yet. Add a folder to see its files.",
762
+ "addProject": "Add project",
763
+ "noMatch": "No file matches “{query}”.",
764
+ "noChanges": "Nothing has changed since the last commit.",
765
+ "notRepo": "This project is not a git repository.",
766
+ "searchFailed": "The search did not work. Try again.",
767
+ "moreMatches": "Showing the first {count} matches. Type more to narrow them down.",
768
+ "partial": "The search stopped early in this large project. Type more to narrow it down.",
769
+ "restartHint": "Live updates, rename, move, the Trash and image preview start working after the server is restarted."
770
+ },
771
+ "git": {
772
+ "modified": "modified",
773
+ "mixed": "modified",
774
+ "staged": "staged",
775
+ "renamed": "renamed",
776
+ "added": "added",
777
+ "untracked": "new",
778
+ "deleted": "deleted",
779
+ "conflict": "conflict",
780
+ "contains": "holds changes",
781
+ "ignored": "ignored by git"
782
+ },
783
+ "row": {
784
+ "open": "open in the editor",
785
+ "unsaved": "unsaved changes",
786
+ "link": "link",
787
+ "linkOutside": "link out of the project",
788
+ "linkBroken": "broken link",
789
+ "cut": "cut"
790
+ },
791
+ "notice": {
792
+ "dismiss": "Dismiss"
793
+ },
794
+ "menu": {
795
+ "label": "Actions for {name}",
796
+ "labelMany": "Actions for {count} items",
797
+ "labelProject": "Actions for the project",
798
+ "back": "Back",
799
+ "open": "Open",
800
+ "openKeep": "Open and keep the tab",
801
+ "preview": "Preview",
802
+ "openAsText": "Open as text",
803
+ "send": {
804
+ "one": "Send to {name}",
805
+ "other": "Send {count} items to {name}"
806
+ },
807
+ "sendTo": "Send to...",
808
+ "newFile": "New file...",
809
+ "newFolder": "New folder...",
810
+ "expand": "Expand",
811
+ "collapse": "Collapse",
812
+ "collapseChildren": "Collapse folders inside",
813
+ "cut": "Cut",
814
+ "copy": "Copy",
815
+ "paste": "Paste",
816
+ "duplicate": "Duplicate",
817
+ "nothingCopied": "Nothing was cut or copied.",
818
+ "copyPath": {
819
+ "one": "Copy path",
820
+ "other": "Copy paths"
821
+ },
822
+ "copyRelativePath": {
823
+ "one": "Copy relative path",
824
+ "other": "Copy relative paths"
825
+ },
826
+ "copyName": "Copy name",
827
+ "color": "Folder color...",
828
+ "rename": "Rename...",
829
+ "delete": "Delete",
830
+ "deleteMany": "Delete {count} items",
831
+ "reveal": {
832
+ "darwin": "Reveal in Finder",
833
+ "win32": "Show in File Explorer",
834
+ "other": "Show in file manager"
835
+ },
836
+ "changedOnly": "Changed files only",
837
+ "sortBy": "Sort by...",
838
+ "sort": {
839
+ "name": "Name",
840
+ "date": "Date modified",
841
+ "size": "Size"
842
+ },
843
+ "expandAll": "Expand one more level",
844
+ "collapseAll": "Collapse all",
845
+ "refresh": "Refresh"
846
+ },
847
+ "colors": {
848
+ "amber": "Amber (default)",
849
+ "blue": "Blue",
850
+ "green": "Green",
851
+ "red": "Red",
852
+ "purple": "Purple",
853
+ "cyan": "Cyan",
854
+ "yellow": "Yellow",
855
+ "brown": "Brown",
856
+ "grey": "Grey"
857
+ },
858
+ "send": {
859
+ "assistant": "Assistant",
860
+ "session": "the focused session",
861
+ "done": {
862
+ "one": "Sent “{name}” to {target}.",
863
+ "other": "Sent {count} items to {target}."
864
+ },
865
+ "failed": "Could not send to {target}."
866
+ },
867
+ "edit": {
868
+ "rename": "New name for {name}",
869
+ "newFile": "Name of the new file",
870
+ "newFolder": "Name of the new folder",
871
+ "taken": "“{name}” is already in this folder.",
872
+ "gone": "“{name}” is gone from disk."
873
+ },
874
+ "delete": {
875
+ "titleOne": "Delete “{name}”?",
876
+ "titleMany": "Delete {count} items?",
877
+ "toTrash": {
878
+ "win32": "You can restore it from the Recycle Bin.",
879
+ "other": "You can put it back from the Trash."
880
+ },
881
+ "forGood": "This system has no Trash: it is deleted for good.",
882
+ "forGoodLegacy": "There is no Trash until the server is restarted: it is deleted for good.",
883
+ "unsaved": {
884
+ "one": "“{name}” has unsaved changes in the editor.",
885
+ "other": "{count} of them have unsaved changes in the editor."
886
+ },
887
+ "moveToTrash": {
888
+ "win32": "Move to Recycle Bin",
889
+ "other": "Move to Trash"
890
+ },
891
+ "deleteForever": "Delete for good",
892
+ "noTrashTitle": "No Trash on this disk",
893
+ "noTrashOne": "“{name}” is on a disk without a Trash. Nothing was deleted. Delete it for good?",
894
+ "noTrashMany": "{count} items are on a disk without a Trash and were not deleted. Delete them for good?",
895
+ "notEmpty": "Until the server is restarted, a folder can only be deleted when it is empty.",
896
+ "stopped": "Deleted {done} of {total} for good, then stopped at “{name}”. {why}",
897
+ "stoppedTrash": {
898
+ "win32": "Moved {done} of {total} to the Recycle Bin, then stopped at “{name}”. {why}",
899
+ "other": "Moved {done} of {total} to the Trash, then stopped at “{name}”. {why}"
900
+ },
901
+ "done": {
902
+ "one": "Deleted “{name}” for good.",
903
+ "other": "Deleted {count} items for good."
904
+ },
905
+ "doneTrash": {
906
+ "win32": {
907
+ "one": "Moved “{name}” to the Recycle Bin.",
908
+ "other": "Moved {count} items to the Recycle Bin."
909
+ },
910
+ "other": {
911
+ "one": "Moved “{name}” to the Trash.",
912
+ "other": "Moved {count} items to the Trash."
913
+ }
914
+ }
915
+ },
916
+ "replace": {
917
+ "title": "Replace what is there?",
918
+ "one": "“{name}” is already in “{folder}”.",
919
+ "many": "{count} items are already in “{folder}”.",
920
+ "toTrash": {
921
+ "win32": "What is replaced goes to the Recycle Bin.",
922
+ "other": "What is replaced goes to the Trash."
923
+ },
924
+ "forGood": "What is replaced cannot be brought back.",
925
+ "unsaved": {
926
+ "one": "“{name}” has unsaved changes in the editor. They are saved before it is replaced.",
927
+ "other": "{count} of them have unsaved changes in the editor. They are saved before they are replaced."
928
+ },
929
+ "notSaved": "“{name}” could not be saved. Nothing was replaced.",
930
+ "confirm": "Replace"
931
+ },
932
+ "move": {
933
+ "same": "It is already in that folder.",
934
+ "done": {
935
+ "one": "Moved “{name}” to “{folder}”.",
936
+ "other": "Moved {count} items to “{folder}”."
937
+ },
938
+ "stopped": "Moved {done} of {total}, then stopped at “{name}”. {why}"
939
+ },
940
+ "copy": {
941
+ "done": {
942
+ "one": "Copied “{name}” to “{folder}”.",
943
+ "other": "Copied {count} items to “{folder}”."
944
+ },
945
+ "stopped": "Copied {done} of {total}, then stopped at “{name}”. {why}",
946
+ "partial": "“{name}” is there only in part."
947
+ },
948
+ "duplicate": {
949
+ "done": {
950
+ "one": "Made “{name}”.",
951
+ "other": "Made {count} copies."
952
+ }
953
+ },
954
+ "clipboard": {
955
+ "cut": {
956
+ "one": "“{name}” cut. Pick a folder and paste.",
957
+ "other": "{count} items cut. Pick a folder and paste."
958
+ },
959
+ "copied": {
960
+ "one": "“{name}” copied. Pick a folder and paste.",
961
+ "other": "{count} items copied. Pick a folder and paste."
962
+ }
963
+ },
964
+ "copied": {
965
+ "path": {
966
+ "one": "Path copied.",
967
+ "other": "{count} paths copied."
968
+ },
969
+ "name": "Name copied.",
970
+ "failed": "The browser did not allow copying."
971
+ },
972
+ "upload": {
973
+ "none": "Nothing to copy.",
974
+ "progress": "Copying {done} of {total}...",
975
+ "tooMany": "That is more than {max} files. Copy the folder with the system's file manager.",
976
+ "done": {
977
+ "one": "Copied “{name}” into “{folder}”.",
978
+ "other": "Copied {count} files into “{folder}”."
979
+ }
980
+ },
981
+ "preview": {
982
+ "label": "Preview of {name}",
983
+ "image": "Image",
984
+ "openAsText": "Open as text",
985
+ "noPreview": "The picture shows after the server is restarted.",
986
+ "failed": "The picture could not be loaded.",
987
+ "notText": "Not text: the editor does not open it."
988
+ },
989
+ "kind": {
990
+ "archive": "Archive",
991
+ "document": "Document",
992
+ "audio": "Audio",
993
+ "video": "Video",
994
+ "font": "Font",
995
+ "database": "Database",
996
+ "program": "Program or library",
997
+ "diskImage": "Disk image or installer",
998
+ "design": "Design or image file",
999
+ "system": "System file"
1000
+ },
1001
+ "open": {
1002
+ "deleted": "“{name}” was deleted: it is not on disk.",
1003
+ "linkOutside": "“{name}” is a link that leads out of the project. It is not opened from here.",
1004
+ "linkBroken": "“{name}” is a link to something that is not there."
1005
+ },
1006
+ "reveal": {
1007
+ "none": "No file is open in the editor.",
1008
+ "notShown": "“{name}” is not in this project."
1009
+ },
1010
+ "watch": {
1011
+ "none": "This project cannot be watched right now. The tree is read again when you return to this window.",
1012
+ "partial": "Some open folders cannot be watched right now. The tree is read again when you return to this window."
1013
+ },
1014
+ "error": {
1015
+ "exists": "“{name}” is already there. Nothing was replaced.",
1016
+ "gone": "It is no longer on disk.",
1017
+ "denied": "The system did not allow it (no permission).",
1018
+ "root": "A project folder is not renamed, moved, deleted or replaced from here.",
1019
+ "intoSelf": "A folder cannot go into itself.",
1020
+ "tooLarge": "That file is too large.",
1021
+ "busy": "Another program is using it.",
1022
+ "noSpace": "The disk is full.",
1023
+ "outside": "That is outside the project folders.",
1024
+ "notDir": "That is not a folder.",
1025
+ "offline": "The server did not answer. Nothing was changed.",
1026
+ "noReveal": "This system has no file manager to show it in.",
1027
+ "noTrash": "There is no Trash for it. It was left as it is.",
1028
+ "changed": "A folder changed while this was under way. Nothing more was done.",
1029
+ "otherDisk": "It is on another disk. Copy it there, then delete the original.",
1030
+ "needsRestart": "That starts working after the server is restarted.",
1031
+ "owner": "Only the owner can use the File Explorer.",
1032
+ "limit": "That is too many at once.",
1033
+ "notImage": "That is not an image.",
1034
+ "failed": "That did not work.",
1035
+ "name": {
1036
+ "empty": "Type a name.",
1037
+ "dots": "“.” and “..” are not names.",
1038
+ "separator": "A name cannot contain “/” or “\\”.",
1039
+ "control": "A name cannot contain control characters.",
1040
+ "reserved": "Windows keeps that name for itself.",
1041
+ "chars": "On Windows a name cannot contain < > : \" | ? *",
1042
+ "trailing": "On Windows a name cannot end in a space or a dot.",
1043
+ "long": "That name is too long.",
1044
+ "other": "That name cannot be used."
1045
+ }
1046
+ },
1047
+ "gitPanel": {
1048
+ "label": "Branch and commit",
1049
+ "branch": "Branch",
1050
+ "commit": "Commit",
1051
+ "message": "Message...",
1052
+ "generate": "Generate message",
1053
+ "commitAction": "Commit all changes",
1054
+ "clean": "Clean working tree",
1055
+ "count": {
1056
+ "modified": "{count} modified",
1057
+ "added": "{count} added",
1058
+ "deleted": "{count} deleted",
1059
+ "untracked": "{count} new",
1060
+ "other": "{count} other"
1061
+ },
1062
+ "switched": "Switched to {branch}",
1063
+ "checkoutFailed": "Checkout failed",
1064
+ "commitFailed": "Commit failed",
1065
+ "committed": "Committed",
1066
+ "failed": "Failed",
1067
+ "noChanges": "No changes",
1068
+ "generateFailed": "Failed to generate message"
1069
+ },
1070
+ "trust": {
1071
+ "title": "Git ownership mismatch",
1072
+ "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.",
1073
+ "skip": "Skip",
1074
+ "confirm": "Trust workspace",
1075
+ "trusting": "Trusting...",
1076
+ "done": "Workspace trusted",
1077
+ "failed": "Trust failed"
1078
+ },
1079
+ "help": {
1080
+ "title": "File Explorer",
1081
+ "toggle": "Toggle file explorer",
1082
+ "move": "Move along the rows",
1083
+ "fold": "Open / close a folder, go to its parent",
1084
+ "open": "Open in the editor and keep the tab",
1085
+ "peek": "Look at a file in the reused tab",
1086
+ "range": "Select several rows",
1087
+ "typeAhead": "Go to a row by typing its name",
1088
+ "offers": "Go to “Show more” or “Try again”, and use it",
1089
+ "rename": "Rename",
1090
+ "delete": "Delete (to the Trash)",
1091
+ "clipboard": "Cut / copy / paste",
1092
+ "copyPath": "Copy path / relative path",
1093
+ "goToFile": "Go to file",
1094
+ "menu": "Open the menu",
1095
+ "escape": "Give up a cut, clear the filter"
1096
+ }
1097
+ },
279
1098
  "detail": {
280
1099
  "category": "Category",
281
1100
  "subcategory": "Subcategory",
@@ -551,7 +1370,8 @@
551
1370
  "memory_data": "Memory & data",
552
1371
  "tools": "Tools",
553
1372
  "automations": "Automations",
554
- "personalize": "Personalize"
1373
+ "personalize": "Personalize",
1374
+ "app": "SynaBun"
555
1375
  },
556
1376
  "nav": {
557
1377
  "ai_connections": {
@@ -597,6 +1417,14 @@
597
1417
  "appearance": {
598
1418
  "label": "Appearance",
599
1419
  "help": "Theme, size and icons"
1420
+ },
1421
+ "code_editor": {
1422
+ "label": "Code editor",
1423
+ "help": "Editing preferences and AI autocomplete"
1424
+ },
1425
+ "about": {
1426
+ "label": "About",
1427
+ "help": "Version, links and licenses"
600
1428
  }
601
1429
  },
602
1430
  "page": {
@@ -630,7 +1458,7 @@
630
1458
  },
631
1459
  "automations": {
632
1460
  "title": "Automations",
633
- "purpose": "Choose what happens automatically while you code: greetings, hooks, online access, social actions and the YouTube pipeline."
1461
+ "purpose": "Choose what happens automatically: the greeting, what the Assistant knows about you, hooks, online access, social actions and the YouTube pipeline."
634
1462
  },
635
1463
  "messages": {
636
1464
  "title": "Messages",
@@ -643,6 +1471,14 @@
643
1471
  "appearance": {
644
1472
  "title": "Appearance",
645
1473
  "purpose": "Choose a theme and adjust the size, colors and file icons of the interface."
1474
+ },
1475
+ "code_editor": {
1476
+ "title": "Code editor",
1477
+ "purpose": "Set up the editor that opens files from the File Explorer: how text is shown, indented and saved, and AI autocomplete."
1478
+ },
1479
+ "about": {
1480
+ "title": "About",
1481
+ "purpose": "The version you run, what it runs on, and the open-source software SynaBun is built with."
646
1482
  }
647
1483
  },
648
1484
  "section": {
@@ -670,12 +1506,12 @@
670
1506
  },
671
1507
  "automations": {
672
1508
  "greetings": {
673
- "title": "Greetings",
674
- "purpose": "What each assistant says when a session starts. Switch a greeting on to edit it."
1509
+ "title": "Greeting",
1510
+ "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
1511
  },
676
1512
  "automation_behavior": {
677
1513
  "title": "Automation behavior",
678
- "purpose": "What SynaBun does by itself while Claude Code works: remembering, learning and guarding."
1514
+ "purpose": "What the Assistant knows about you and brings up by itself, on any model. The older hooks for Claude Code are below."
679
1515
  },
680
1516
  "online_access": {
681
1517
  "title": "Online access",
@@ -959,6 +1795,30 @@
959
1795
  "title": "Language",
960
1796
  "purpose": "The language SynaBun speaks."
961
1797
  }
1798
+ },
1799
+ "code_editor": {
1800
+ "ai_autocomplete": {
1801
+ "title": "AI autocomplete",
1802
+ "purpose": "Grey suggestions after the caret that Tab accepts. Off until you switch it on."
1803
+ },
1804
+ "editing": {
1805
+ "title": "Editing",
1806
+ "purpose": "How the editor shows text, indents it and saves it. The View menu in the editor changes the same settings."
1807
+ }
1808
+ },
1809
+ "about": {
1810
+ "links": {
1811
+ "title": "Links",
1812
+ "purpose": "The project's pages. They open in your browser."
1813
+ },
1814
+ "system": {
1815
+ "title": "System",
1816
+ "purpose": "What this copy of SynaBun runs on. Copy info puts these details on the clipboard."
1817
+ },
1818
+ "dependencies": {
1819
+ "title": "Dependencies",
1820
+ "purpose": "Every package SynaBun ships with, the version installed here and its license."
1821
+ }
962
1822
  }
963
1823
  },
964
1824
  "common": {
@@ -1028,90 +1888,6 @@
1028
1888
  "label": "Back up now",
1029
1889
  "help": "Makes a backup right away in the chosen folder."
1030
1890
  },
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
1891
  "aut028": {
1116
1892
  "label": "Session startup",
1117
1893
  "help": "Loads memory and context when a new session begins."
@@ -1170,7 +1946,7 @@
1170
1946
  },
1171
1947
  "aut042": {
1172
1948
  "label": "Create an access key",
1173
- "help": "Makes a key that protects the public address. An existing key stops working."
1949
+ "help": "Makes the key that remote MCP is reached with. An existing key stops working."
1174
1950
  },
1175
1951
  "aut043": {
1176
1952
  "label": "Copy the access key",
@@ -1178,7 +1954,7 @@
1178
1954
  },
1179
1955
  "aut044": {
1180
1956
  "label": "Revoke",
1181
- "help": "Deletes the key. The public address then accepts anyone."
1957
+ "help": "Deletes the key. Connections that use it stop working."
1182
1958
  },
1183
1959
  "aut045": {
1184
1960
  "label": "Connect OpenClaw",
@@ -2396,10 +3172,6 @@
2396
3172
  "label": "Works with",
2397
3173
  "help": "Which assistants this part of SynaBun supports."
2398
3174
  },
2399
- "aut047": {
2400
- "label": "Placeholders you can use",
2401
- "help": "Shows the words in {braces} and what each becomes."
2402
- },
2403
3175
  "aut048": {
2404
3176
  "label": "Public address status",
2405
3177
  "help": "Whether the public address is running, and the address itself."
@@ -2420,6 +3192,26 @@
2420
3192
  "label": "Disconnect OpenClaw",
2421
3193
  "help": "Removes OpenClaw's memories from the map. OpenClaw's own files are not touched."
2422
3194
  },
3195
+ "aut053": {
3196
+ "label": "Knowledge of you",
3197
+ "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."
3198
+ },
3199
+ "aut054": {
3200
+ "label": "Recent-interaction nudges",
3201
+ "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."
3202
+ },
3203
+ "aut055": {
3204
+ "label": "Show the trace",
3205
+ "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."
3206
+ },
3207
+ "aut056": {
3208
+ "label": "What a new conversation is told about you",
3209
+ "help": "The digest every new Assistant conversation starts with. Select a line to open its memory and correct it."
3210
+ },
3211
+ "aut057": {
3212
+ "label": "See all in Memory",
3213
+ "help": "Opens the memory explorer on everything SynaBun knows about you."
3214
+ },
2423
3215
  "skl004": {
2424
3216
  "label": "Skills",
2425
3217
  "help": "Slash commands that give your assistants extra abilities."
@@ -2571,6 +3363,122 @@
2571
3363
  "app001": {
2572
3364
  "label": "Language",
2573
3365
  "help": "SynaBun reloads to apply the language."
3366
+ },
3367
+ "aut058": {
3368
+ "label": "Greet me when I come back",
3369
+ "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."
3370
+ },
3371
+ "aut059": {
3372
+ "label": "What a new session would open with",
3373
+ "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."
3374
+ },
3375
+ "aut060": {
3376
+ "label": "Write it now",
3377
+ "help": "Asks the writer for this sentence now instead of waiting for the background: one small call on the cheapest Claude model."
3378
+ },
3379
+ "edt001": {
3380
+ "label": "Suggest code as I type",
3381
+ "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."
3382
+ },
3383
+ "edt002": {
3384
+ "label": "Ask",
3385
+ "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."
3386
+ },
3387
+ "edt003": {
3388
+ "label": "Model",
3389
+ "help": "The connected OpenCode models you have not hidden, fast ones first. Test sends a fixed sample, never your code."
3390
+ },
3391
+ "edt004": {
3392
+ "label": "Find fastest",
3393
+ "help": "Sends the sample to up to four fast models and selects the quickest. It takes a few seconds."
3394
+ },
3395
+ "edt005": {
3396
+ "label": "Endpoint kind",
3397
+ "help": "Ollama, or a server that speaks the OpenAI completions or chat protocol."
3398
+ },
3399
+ "edt006": {
3400
+ "label": "Address",
3401
+ "help": "For Ollama, the server itself. For an OpenAI-compatible server, the full address a request is posted to."
3402
+ },
3403
+ "edt007": {
3404
+ "label": "Model name",
3405
+ "help": "The name the endpoint knows the model by."
3406
+ },
3407
+ "edt008": {
3408
+ "label": "Request shape",
3409
+ "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."
3410
+ },
3411
+ "edt009": {
3412
+ "label": "API key",
3413
+ "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."
3414
+ },
3415
+ "edt010": {
3416
+ "label": "Test endpoint",
3417
+ "help": "Sends a fixed sample to the endpoint, never your code."
3418
+ },
3419
+ "edt011": {
3420
+ "label": "Never sent",
3421
+ "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."
3422
+ },
3423
+ "edt012": {
3424
+ "label": "Restore the default list",
3425
+ "help": "Puts back the list SynaBun ships with: environment files, keys, certificates and credential files."
3426
+ },
3427
+ "edt013": {
3428
+ "label": "Today",
3429
+ "help": "Requests sent to a model today, their tokens, and how many suggestions you accepted."
3430
+ },
3431
+ "edt014": {
3432
+ "label": "Text size",
3433
+ "help": "The size of the text in the editor, from 10 to 18 px."
3434
+ },
3435
+ "edt015": {
3436
+ "label": "Ligatures",
3437
+ "help": "Draws character pairs such as => and != as one glyph, in fonts that have them."
3438
+ },
3439
+ "edt016": {
3440
+ "label": "Wrap long lines",
3441
+ "help": "A line wider than the editor continues on the next row instead of scrolling sideways."
3442
+ },
3443
+ "edt017": {
3444
+ "label": "Minimap",
3445
+ "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."
3446
+ },
3447
+ "edt018": {
3448
+ "label": "Indent guides",
3449
+ "help": "Thin vertical lines that show each level of indentation."
3450
+ },
3451
+ "edt019": {
3452
+ "label": "Show whitespace",
3453
+ "help": "Draws spaces and tabs as faint marks: nowhere, in the selected text, or everywhere."
3454
+ },
3455
+ "edt020": {
3456
+ "label": "Indent with",
3457
+ "help": "What the Tab key inserts. Detect follows the file that is open."
3458
+ },
3459
+ "edt021": {
3460
+ "label": "Tab size",
3461
+ "help": "How wide a tab is drawn, and how many spaces one level of indentation is. Detect follows the file that is open."
3462
+ },
3463
+ "edt022": {
3464
+ "label": "Trim trailing whitespace on save",
3465
+ "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."
3466
+ },
3467
+ "edt023": {
3468
+ "label": "End files with one newline on save",
3469
+ "help": "When a file is saved, a missing final line break is added and empty lines after the last line of text are removed."
3470
+ },
3471
+ "abt001": {
3472
+ "label": "Check for updates",
3473
+ "help": "Looks for a newer version of SynaBun and of the coding tools: the same check as Check for updates in the Apps menu."
3474
+ },
3475
+ "abt002": {
3476
+ "label": "Copy info",
3477
+ "help": "Copies the version, install, runtime, system and dependency versions as plain text, for a bug report. No paths, keys or settings."
3478
+ },
3479
+ "abt003": {
3480
+ "label": "Filter dependencies",
3481
+ "help": "Shows only the packages whose name contains what you type."
2574
3482
  }
2575
3483
  },
2576
3484
  "pane": {
@@ -3397,34 +4305,15 @@
3397
4305
  "failed": "failed"
3398
4306
  },
3399
4307
  "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.",
4308
+ "claudeOnly": "These apply to Claude Code sessions you run yourself. The Assistant uses the three settings above, on any model.",
3420
4309
  "ul": {
3421
4310
  "every": "Reflect every",
3422
4311
  "interactions": "interactions",
3423
4312
  "max": "at most",
3424
4313
  "perSession": "times per session"
3425
4314
  },
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.",
4315
+ "hooksTitle": "Hooks for standalone Claude Code",
4316
+ "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
4317
  "compat": {
3429
4318
  "claude": "Works with Claude",
3430
4319
  "gemini": "Works with Gemini",
@@ -3439,6 +4328,7 @@
3439
4328
  "apikey": {
3440
4329
  "title": "Access key",
3441
4330
  "none": "No key: anyone with the address can connect",
4331
+ "noneClosed": "No key: MCP cannot be reached from outside",
3442
4332
  "saveNow": "Copy it now. It will not be shown again."
3443
4333
  },
3444
4334
  "connectorsHint": "In {link}, open Connectors and add the connection address.",
@@ -3468,14 +4358,7 @@
3468
4358
  "active": "Active",
3469
4359
  "failedToToggleHook": "Failed to toggle hook",
3470
4360
  "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
4361
  "failedToSave": "Failed to save",
3478
- "greetingConfigSaved": "Greeting config saved",
3479
4362
  "dev": "dev",
3480
4363
  "skillUninstalledRestartToApply": "Skill uninstalled — restart {runtime} to apply",
3481
4364
  "skillInstalledRestartToApply": "Skill installed — restart {runtime} to apply",
@@ -3496,12 +4379,83 @@
3496
4379
  "failedToGenerateKey": "Failed to generate key",
3497
4380
  "copyKey": "Copy Key",
3498
4381
  "revokeThisApiKeyTheMcp": "Revoke this API key? The MCP endpoint will become open.",
4382
+ "revokeKeyClosed": "Revoke this access key? Nothing reaches MCP from outside until you create a new one.",
3499
4383
  "noKeyConfiguredTunnelIsOpen": "No key configured - tunnel is open",
3500
4384
  "generateKey": "Generate Key",
3501
- "goodMorning": "Good morning",
3502
- "goodAfternoon": "Good afternoon",
3503
- "goodEvening": "Good evening",
3504
- "failed2": "Failed: {message}"
4385
+ "failed2": "Failed: {message}",
4386
+ "uc": {
4387
+ "restart": "Restart SynaBun to use these: the server that is running was started before they were added.",
4388
+ "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.",
4389
+ "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.",
4390
+ "unreadable": "SynaBun could not read these settings ({reason}). Nothing was changed. Close Settings and open it again.",
4391
+ "unreadableNoReason": "SynaBun could not read these settings. Nothing was changed. Close Settings and open it again.",
4392
+ "applies": "A change applies from your next message to the Assistant.",
4393
+ "noStore": "Memory is not available on this server, so this does nothing for now.",
4394
+ "tokens": "{tokens} of {max} tokens",
4395
+ "openMemory": "Open this memory",
4396
+ "seed": "from an earlier note",
4397
+ "empty": "Nothing learned yet. It fills in as you tell the Assistant how you want things done.",
4398
+ "omitted": "{n} more did not fit and are brought up only when relevant.",
4399
+ "learn": {
4400
+ "killSwitch": "Not learning right now: smart judgments are switched off for this server (SYNABUN_TYPESAFE=off). What is already known is still used.",
4401
+ "masterOff": "Not learning right now: {page} is switched off. What is already known is still used.",
4402
+ "noKey": "Not learning right now: {page} has no API key. What is already known is still used.",
4403
+ "surfaceOff": "Not learning right now: “User learning” is switched off in {page}. What is already known is still used.",
4404
+ "waiting": "Not learning for a moment: {page} was asked to wait before its next request. What is already known is still used.",
4405
+ "unavailable": "Not learning right now: {page} is not available. What is already known is still used."
4406
+ },
4407
+ "openPage": "Open {page}",
4408
+ "writer": {
4409
+ "missing": "New statements are kept in your own words: the statement writer is not available on this server.",
4410
+ "failed": "The last statement was kept in your own words: the writer could not run ({reason}). It runs on your Claude Code login.",
4411
+ "failedNoReason": "The last statement was kept in your own words: the writer could not run. It runs on your Claude Code login."
4412
+ },
4413
+ "trace": {
4414
+ "nothing": "Nothing to show while both settings above are off."
4415
+ },
4416
+ "off": {
4417
+ "note": "Nothing: “Knowledge of you” is off, so a new conversation starts without a digest. What SynaBun has learned stays in Memory."
4418
+ },
4419
+ "save": {
4420
+ "on": "Could not switch “{name}” on: {reason}. Nothing was changed.",
4421
+ "off": "Could not switch “{name}” off: {reason}. Nothing was changed.",
4422
+ "noAnswer": "SynaBun did not answer",
4423
+ "oldServer": "the running server does not have this setting yet"
4424
+ }
4425
+ },
4426
+ "greet": {
4427
+ "state": {
4428
+ "oldServer": "Restart SynaBun to use this. The running server was started before the greeting existed.",
4429
+ "failed": "The greeting did not start: {reason}. Sessions open quietly until that is fixed and SynaBun is restarted.",
4430
+ "failedUnknown": "The greeting did not start. Sessions open quietly until that is fixed and SynaBun is restarted.",
4431
+ "unreadable": "The greeting setting could not be read ({reason}).",
4432
+ "unreadableUnknown": "The greeting setting could not be read.",
4433
+ "killed": "Switched off by SYNABUN_GREETING=off in the server's environment. This switch does nothing until that is removed and SynaBun is restarted."
4434
+ },
4435
+ "note": {
4436
+ "noWriter": "No Claude sign-in to write with: the greeting is put together from the records, without a model."
4437
+ },
4438
+ "preview": {
4439
+ "loading": "Reading your records…",
4440
+ "now": "A new session in {project} would open with this now:",
4441
+ "recent": "You were here {time} ago, so a new session in {project} opens quietly. After {gap} away it would say:",
4442
+ "moment": "a moment",
4443
+ "nothingNew": "The last greeting in {project} already said this, so a new session opens quietly until something changes:",
4444
+ "off": "Off. Switched on, a new session in {project} would open with:",
4445
+ "firstSession": "Nothing recorded in {project} yet. A first session opens quietly.",
4446
+ "nothingToSay": "Nothing to say in {project} right now. A new session opens quietly.",
4447
+ "error": "The preview could not be built ({reason}).",
4448
+ "spend": "Writer calls today: {calls} of {cap} · {cost}",
4449
+ "spendNone": "No writer calls today.",
4450
+ "writing": "Writing…"
4451
+ },
4452
+ "save": {
4453
+ "failed": "Could not save: {reason}. The switch is back where it was.",
4454
+ "oldServer": "Could not save: the running server does not have the greeting yet. Restart SynaBun.",
4455
+ "forbidden": "Could not save: this window is not allowed to change settings.",
4456
+ "noAnswer": "Could not save: the server did not answer. The switch is back where it was."
4457
+ }
4458
+ }
3505
4459
  },
3506
4460
  "discord": {
3507
4461
  "tokenHelp": "Create a bot at {link} and switch on its Message Content, Server Members and Presence intents.",
@@ -3633,6 +4587,7 @@
3633
4587
  "allCustomIconsReset": "All custom icons reset"
3634
4588
  },
3635
4589
  "judgments": {
4590
+ "budgetShareScore": "{provider}: share score {score} \u00b7 confidence {confidence}",
3636
4591
  "showEveryJudgmentAboutThisMemory": ": show every judgment about this memory in the log",
3637
4592
  "checkingTypesafe": "Checking TypeSafe…",
3638
4593
  "learnMoreAtTypesafe": "Learn more at",
@@ -4140,6 +5095,8 @@
4140
5095
  "longerAnswersAreCutThereWith": "Longer answers are cut there with a note; the full answer stays in SynaBun.",
4141
5096
  "freshConversation": "Fresh conversation",
4142
5097
  "inMessageYourself": "In \"Message yourself\"",
5098
+ "transcribeVoiceNotes": "Transcribe voice notes",
5099
+ "voiceNotesAreTurnedIntoText": "Turned into text on this computer by whisper.cpp and FFmpeg, which you install yourself; nothing goes to a transcription service. The text then reaches the Assistant like a typed message, and approvals still take a typed yes.",
4143
5100
  "commandsYouCanSend": "Commands you can send",
4144
5101
  "answerAQuestionOrAnApproval": "When SynaBun asks something, answer in your own words. An approval takes a plain yes or no; any other message approves nothing and carries the conversation on.",
4145
5102
  "whatSynabunMayDoFromWhatsapp": "What SynaBun may do from WhatsApp",
@@ -4168,7 +5125,7 @@
4168
5125
  "nowOnYourPhone": "Now on your phone:",
4169
5126
  "send": "send",
4170
5127
  "inTheWhatsappChatWithSynabun": "in the WhatsApp chat with SynaBun within",
4171
- "autonomousThenRunsFor8Hours": ". Autonomous then runs for 8 hours.",
5128
+ "autonomousUntilTurnedOff": ". Autonomous then stays on until you turn it off.",
4172
5129
  "noLog": "No log.",
4173
5130
  "theInstallLogIsEmpty": "The install log is empty.",
4174
5131
  "cancel": "Cancel",
@@ -4257,7 +5214,6 @@
4257
5214
  "tries": "tries",
4258
5215
  "previewSample": "{label}Here is what I found…",
4259
5216
  "ownerSince": "· since {date}",
4260
- "levelUntil": "until {time}",
4261
5217
  "errorCode": "Code: {code}",
4262
5218
  "sessionCurrent": "Current: {title}",
4263
5219
  "levelPaused": "· paused",
@@ -4314,7 +5270,7 @@
4314
5270
  },
4315
5271
  "autonomous": {
4316
5272
  "title": "Autonomous",
4317
- "body": "SynaBun acts without asking, like the Assistant on this computer. Turning it on takes a second click here and an ALLOW code sent from your phone within 5 minutes. It turns back to Ask after 8 hours. Autonomous can read any file your computer account can, including SynaBun's WhatsApp login. Use it only with a locked phone, ideally on a second number."
5273
+ "body": "SynaBun acts without asking, like the Assistant on this computer. Turning it on takes a second click here and an ALLOW code sent from your phone within 5 minutes. It stays on until you turn it off. Autonomous can read any file your computer account can, including SynaBun's WhatsApp login. Use it only with a locked phone, ideally on a second number."
4318
5274
  }
4319
5275
  },
4320
5276
  "progress": {
@@ -4360,7 +5316,7 @@
4360
5316
  },
4361
5317
  "prefix": {
4362
5318
  "label": "Only messages that start with sb",
4363
- "hint": "Keep using \"Message yourself\" for notes; start a message with sb (or sb:) to talk to SynaBun. Commands like /stop, the ALLOW code and replies to SynaBun's own messages always reach it."
5319
+ "hint": "Keep using \"Message yourself\" for notes; start a message with sb (or sb:) to talk to SynaBun, or say \"sb\" first in a voice note. Commands like /stop, the ALLOW code and replies to SynaBun's own messages always reach it."
4364
5320
  }
4365
5321
  },
4366
5322
  "commands": {
@@ -4390,12 +5346,13 @@
4390
5346
  }
4391
5347
  },
4392
5348
  "limits": {
4393
- "0": "Text and pictures (up to 4 per message, 5 MB each). Voice notes, videos, documents and stickers are not read yet.",
5349
+ "0": "Text and pictures (up to 4 per message, 5 MB each), and voice notes transcribed on this computer (up to 10 minutes and 20 MB each). Videos, documents and stickers are not read yet.",
4394
5350
  "1": "At most 20 messages a minute and 300 a day; 5 messages can wait in line while SynaBun works.",
4395
5351
  "2": "Messages older than 10 minutes when SynaBun comes back online are skipped (it tells you how many).",
4396
5352
  "3": "Answers are split into messages of 3,500 characters; the rest stays in SynaBun.",
4397
5353
  "4": "Computer use from WhatsApp is off until you turn it on above. Then: never at Read-only or while paused, after one yes per task at Ask on my phone, and without asking while Autonomous is active. Agents started from WhatsApp never get it.",
4398
- "5": "Levels, models and settings change only here, never from the phone."
5354
+ "5": "Levels, models and settings change only here, never from the phone.",
5355
+ "6": "A voice note is an ordinary message: it never approves anything and never runs a command. Approvals take a typed yes."
4399
5356
  },
4400
5357
  "privacyStays": {
4401
5358
  "session": {
@@ -4462,7 +5419,8 @@
4462
5419
  "3": "In \"Message yourself\", only messages typed on the phone reach SynaBun. Messages typed into that chat from WhatsApp Web or Desktop are ignored.",
4463
5420
  "4": "With \"Only messages that start with sb\", a note without sb never reaches SynaBun and is not logged; commands, the ALLOW code and replies to SynaBun's messages always get through.",
4464
5421
  "5": "The QR code expires after about a minute. Press \"Show a new code\" and scan faster, or link with your phone number instead.",
4465
- "6": "Stuck on \"Reconnecting\"? Check this computer's internet connection, then press Reconnect now."
5422
+ "6": "Stuck on \"Reconnecting\"? Check this computer's internet connection, then press Reconnect now.",
5423
+ "7": "Voice notes not transcribed? This computer needs whisper.cpp, its speech model and FFmpeg, which you install yourself; the line under \"Transcribe voice notes\" says what is missing."
4466
5424
  },
4467
5425
  "browserTools": "Not the same as the WhatsApp browser tools. The whatsapp MCP profile lets agents read WhatsApp Web in SynaBun's browser; this tab is you chatting with SynaBun from your phone. They do not share a session.",
4468
5426
  "uninstall": "Uninstalling SynaBun does not unlink WhatsApp. Use Unlink or Remove here first, or log SynaBun out under WhatsApp → Settings → Linked devices."
@@ -4487,7 +5445,7 @@
4487
5445
  "UNKNOWN": "Something unexpected happened. The install log has the details."
4488
5446
  },
4489
5447
  "error": {
4490
- "HOST_HELD": "The WhatsApp connector kept crashing, so SynaBun stopped it. Reconnect to try again; the install log may help.",
5448
+ "HOST_HELD": "The WhatsApp connector does not match this SynaBun version (it was updated while SynaBun ran), so SynaBun stopped it. Restart SynaBun to load the matching one.",
4491
5449
  "HOST_UNAVAILABLE": "The WhatsApp connector did not start.",
4492
5450
  "REPLACED": "Another copy of this WhatsApp link connected from somewhere else and took over. Reconnect here to take it back.",
4493
5451
  "LOCKED": "Another SynaBun is using the WhatsApp session files. Close it, then reconnect.",
@@ -4513,8 +5471,16 @@
4513
5471
  "banned": {
4514
5472
  "title": "WhatsApp refused this account",
4515
5473
  "sub": "WhatsApp blocked the account from linking devices, possibly a temporary or permanent ban. Check the WhatsApp app on the phone."
5474
+ },
5475
+ "invalid_session": {
5476
+ "title": "The saved WhatsApp session is invalid",
5477
+ "sub": "WhatsApp rejected this device session (badSession). Link again to pair it; automatic retries cannot repair the credentials."
4516
5478
  }
4517
5479
  },
5480
+ "warning": {
5481
+ "replaced": "Another copy is using this WhatsApp session. SynaBun retries every 5 minutes; close the other copy or unlink and link again.",
5482
+ "forbidden": "WhatsApp refused this account; it may be restricted or banned. SynaBun retries every 5 minutes; check WhatsApp on the phone."
5483
+ },
4518
5484
  "activity": {
4519
5485
  "inbound": "Received",
4520
5486
  "reply": "Sent",
@@ -4540,6 +5506,18 @@
4540
5506
  "effortDefault": "Default effort",
4541
5507
  "saved": "WhatsApp model saved. It applies from your next message."
4542
5508
  },
5509
+ "voice": {
5510
+ "ready": "Voice notes are transcribed on this computer.",
5511
+ "readyOff": "Voice notes can be transcribed on this computer; turned off.",
5512
+ "notSetUp": "Voice notes: not set up — missing {missing}.",
5513
+ "partInvalid": "{name}: the path set for it does not work",
5514
+ "part": {
5515
+ "engine": "whisper.cpp (whisper-cli)",
5516
+ "model": "the speech model (ggml-small.bin)",
5517
+ "ffmpeg": "FFmpeg",
5518
+ "tools": "the transcription tools"
5519
+ }
5520
+ },
4543
5521
  "phoneError": {
4544
5522
  "NEEDS_COUNTRY_CODE": "Add your country code first, for example +44 for the UK or +1 for the US.",
4545
5523
  "INVALID_CHARS": "Use digits only; spaces, dashes and brackets are fine.",
@@ -4622,7 +5600,6 @@
4622
5600
  "title": "Is this your WhatsApp?"
4623
5601
  },
4624
5602
  "connected": {
4625
- "until": "until {time}",
4626
5603
  "readOnlyBrain": "Read-only ({brain} brain)",
4627
5604
  "title": "Connected"
4628
5605
  },
@@ -4747,10 +5724,12 @@
4747
5724
  "browser": "chrome, chromium, profile, cookies, user agent, proxy, viewport, headless",
4748
5725
  "connected_tools": "mcp, server, plugin, tools, morelogin, profile, extension",
4749
5726
  "tool_access": "skills, slash commands, permissions, allow, deny, approve",
4750
- "automations": "hooks, greeting, tunnel, remote, cloudflare, social, youtube",
5727
+ "automations": "assistant, knowledge, hooks, greeting, tunnel, remote, cloudflare, social, youtube",
4751
5728
  "messages": "whatsapp, discord, phone, chat, bot, messaging",
4752
5729
  "notifications": "alerts, sound, volume, banner, toast, mute, desktop notification",
4753
- "appearance": "theme, dark mode, skin, color, font, text size, language, locale, icons, zoom, look"
5730
+ "appearance": "theme, dark mode, skin, color, font, text size, language, locale, icons, zoom, look",
5731
+ "code_editor": "editor, code, font, text size, word wrap, minimap, whitespace, indentation, tabs, autocomplete, completion, suggestions, copilot, ghost text, inline, ai, model, ollama, file",
5732
+ "about": "version, GitHub, license, dependencies, Node, Electron, Chromium, system, update, credits, copyright, release notes, changelog"
4754
5733
  },
4755
5734
  "section": {
4756
5735
  "ai_connections": {
@@ -4810,8 +5789,8 @@
4810
5789
  "tool_permissions": "allow, approve, auto approve, ask"
4811
5790
  },
4812
5791
  "automations": {
4813
- "greetings": "welcome, session start, reminder, hello, template",
4814
- "automation_behavior": "hooks, remember, recall, learning, subagents, compaction, guard",
5792
+ "greetings": "welcome, welcome back, hello, return, come back, away, where I left off, last session, what happened",
5793
+ "automation_behavior": "assistant, knowledge, about me, user context, preferences, digest, nudges, reminders, trace, hooks, remember, recall, learning, subagents, compaction, guard",
4815
5794
  "online_access": "tunnel, cloudflare, remote, public url, access key, api key, claude web, openclaw, bridge",
4816
5795
  "social_platform_access": "social media, twitter, x, facebook, instagram, linkedin, tiktok, permissions",
4817
5796
  "youtube_pipeline": "trailer, upload, download, oauth, client id, steam, channel, yt-dlp"
@@ -4847,6 +5826,15 @@
4847
5826
  "advanced_visual_tuning": "blur, transparency, opacity, shadow, radius, corners, font, glass",
4848
5827
  "file_icons": "file explorer, extension, svg, custom icon",
4849
5828
  "d2_graph": "2d, graph, spacing, glow, cards"
5829
+ },
5830
+ "code_editor": {
5831
+ "ai_autocomplete": "autocomplete, completion, suggestions, copilot, ghost text, inline, tab, model, opencode, ollama, openai, endpoint, api key, fastest, latency, excluded files, secrets, env",
5832
+ "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"
5833
+ },
5834
+ "about": {
5835
+ "links": "GitHub, repository, releases, changelog, issue, bug report, website, docs, documentation, npm, license, Discord, community",
5836
+ "system": "version, Node, Node.js, Electron, Chromium, SQLite, operating system, OS, macOS, Windows, Linux, architecture, data folder, port, install, diagnostics",
5837
+ "dependencies": "packages, libraries, npm, licenses, open source, third party, versions, node_modules"
4850
5838
  }
4851
5839
  },
4852
5840
  "control": {
@@ -4877,6 +5865,162 @@
4877
5865
  "ml007": "api key, app id, credentials"
4878
5866
  }
4879
5867
  }
5868
+ },
5869
+ "code_editor": {
5870
+ "state": {
5871
+ "oldServer": "Restart SynaBun to use this: the server that is running was started before AI autocomplete was added.",
5872
+ "unreadable": "SynaBun could not read these settings ({reason}). Nothing was changed. Close Settings and open it again.",
5873
+ "unreadableNoReason": "SynaBun could not read these settings. Nothing was changed. Close Settings and open it again."
5874
+ },
5875
+ "pill": {
5876
+ "on": "On",
5877
+ "off": "Off",
5878
+ "setup": "Needs a model",
5879
+ "unavailable": "Not available"
5880
+ },
5881
+ "engine": {
5882
+ "opencode": "OpenCode models",
5883
+ "endpoint": "An endpoint of my own"
5884
+ },
5885
+ "kind": {
5886
+ "ollama": "Ollama",
5887
+ "openai": "OpenAI-compatible"
5888
+ },
5889
+ "shape": {
5890
+ "fim": "Fill-in",
5891
+ "chat": "Chat"
5892
+ },
5893
+ "models": {
5894
+ "loading": "Reading the models…",
5895
+ "none": "No model is connected. Sign in to a provider in {page}.",
5896
+ "unavailable": "OpenCode is not running, so its models cannot be listed.",
5897
+ "start": "Start it and list the models",
5898
+ "fast": "fast",
5899
+ "free": "free",
5900
+ "price": "${input} in · ${output} out per million tokens",
5901
+ "noPrice": "price not listed",
5902
+ "notListed": "selected, but no longer in the list",
5903
+ "pick": "Use {model}",
5904
+ "test": "Test",
5905
+ "testNamed": "Test {model}"
5906
+ },
5907
+ "test": {
5908
+ "running": "Testing…",
5909
+ "ok": "{time} · {input} tokens in, {output} out · suggested: {sample}",
5910
+ "okNoTokens": "{time} · suggested: {sample}",
5911
+ "empty": "Answered in {time}, with nothing to suggest.",
5912
+ "failed": "Failed: {reason}",
5913
+ "noAnswer": "SynaBun did not answer"
5914
+ },
5915
+ "fastest": {
5916
+ "running": "Testing the fast models…",
5917
+ "found": "Fastest: {model}, {time}. Selected.",
5918
+ "none": "No model answered in time. Nothing was changed.",
5919
+ "noCandidates": "No fast model is connected. Pick one from the list."
5920
+ },
5921
+ "key": {
5922
+ "set": "A key is set",
5923
+ "notSet": "No key is set",
5924
+ "placeholder": "Paste a key",
5925
+ "placeholderReplace": "Paste a key to replace the one that is set",
5926
+ "save": "Save key",
5927
+ "remove": "Remove key",
5928
+ "saved": "Key saved.",
5929
+ "removed": "Key removed."
5930
+ },
5931
+ "url": {
5932
+ "invalid": "An address starts with http:// or https://. Nothing was changed.",
5933
+ "placeholderOllama": "http://localhost:11434",
5934
+ "placeholderOpenai": "https://api.example.com/v1/completions"
5935
+ },
5936
+ "save": {
5937
+ "failed": "Could not save: {reason}. Nothing was changed.",
5938
+ "oldServer": "the running server does not have this setting yet",
5939
+ "noAnswer": "SynaBun did not answer"
5940
+ },
5941
+ "usage": {
5942
+ "today": "{requests} requests · {input} tokens in, {output} out · {accepted} of {shown} suggestions accepted",
5943
+ "none": "No requests today."
5944
+ },
5945
+ "exclude": {
5946
+ "count": "{n} patterns",
5947
+ "empty": "The list is empty: every file may be sent."
5948
+ },
5949
+ "editing": {
5950
+ "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.",
5951
+ "fontSize": "{size} px",
5952
+ "detect": "Detect",
5953
+ "spaces": "Spaces",
5954
+ "tabs": "Tabs",
5955
+ "whitespace": {
5956
+ "none": "Hidden",
5957
+ "selection": "In the selection",
5958
+ "all": "Everywhere"
5959
+ }
5960
+ }
5961
+ },
5962
+ "about": {
5963
+ "loading": "Loading…",
5964
+ "version": "Version {version}",
5965
+ "channel": {
5966
+ "stable": "Stable",
5967
+ "prerelease": "Pre-release",
5968
+ "dev": "Development build"
5969
+ },
5970
+ "install": {
5971
+ "desktop": "Desktop app",
5972
+ "app": "Installed app",
5973
+ "npm": "npm install",
5974
+ "git": "Git clone"
5975
+ },
5976
+ "restartNote": "Links, dependencies and the full system details appear after SynaBun restarts: the server that is running is older than this page.",
5977
+ "copied": "Copied to the clipboard.",
5978
+ "copyFailed": "The browser did not allow copying.",
5979
+ "links": {
5980
+ "none": "No links found in package.json."
5981
+ },
5982
+ "link": {
5983
+ "repository": "GitHub repository",
5984
+ "releases": "Releases",
5985
+ "changelog": "Changelog",
5986
+ "issues": "Report an issue",
5987
+ "website": "Website",
5988
+ "docs": "Documentation",
5989
+ "npm": "npm package",
5990
+ "license": "License",
5991
+ "discord": "Discord",
5992
+ "x": "X"
5993
+ },
5994
+ "row": {
5995
+ "version": "Version",
5996
+ "install": "Install",
5997
+ "os": "Operating system",
5998
+ "dataFolder": "Data folder",
5999
+ "port": "Server port"
6000
+ },
6001
+ "package": {
6002
+ "neural_interface": "Neural Interface",
6003
+ "mcp_server": "MCP server",
6004
+ "desktop": "Desktop app",
6005
+ "whatsapp_connector": "WhatsApp connector"
6006
+ },
6007
+ "deps": {
6008
+ "filterPlaceholder": "Filter",
6009
+ "notInstalled": "not installed",
6010
+ "declared": "declared {range}",
6011
+ "optional": "optional",
6012
+ "onDemand": "Installed on demand, into the data folder, when you set up WhatsApp.",
6013
+ "vendored": "Bundled in the interface",
6014
+ "dev": "Development dependencies ({count})",
6015
+ "noMatch": "No package matches “{query}”.",
6016
+ "none": "No dependencies found."
6017
+ },
6018
+ "footer": {
6019
+ "license": "Licensed under {license}.",
6020
+ "copyright": "Copyright © {years} {holder}",
6021
+ "builtWith": "Built with open-source software"
6022
+ },
6023
+ "afterRestart": "Shown after SynaBun restarts."
4880
6024
  }
4881
6025
  }
4882
6026
  },
@@ -5101,8 +6245,116 @@
5101
6245
  "fullscreen": "Fullscreen (F11)",
5102
6246
  "toggleExplorer": "Toggle Explorer (F)"
5103
6247
  },
6248
+ "toolbar": {
6249
+ "hideTools": "Hide workspace tools",
6250
+ "showTools": "Show workspace tools",
6251
+ "workspaceNone": "Workspaces: none loaded",
6252
+ "workspaceActive": "Workspace: {name}",
6253
+ "quickSave": "Quick save",
6254
+ "memoryExplorer": "Memory Explorer",
6255
+ "fileExplorer": "File Explorer",
6256
+ "share": "Share / Invite",
6257
+ "keybinds": "Keybinds",
6258
+ "snapToGrid": "Snap to grid",
6259
+ "tileTerminals": "Tile terminals"
6260
+ },
5104
6261
 
6262
+ "accounts": {
6263
+ "apiShort": "API",
6264
+ "subscriptionBadge": "{service} account",
6265
+ "apiKeyBadge": "API key",
6266
+ "signedOut": "Signed out",
6267
+ "checking": "Checking…",
6268
+ "keyUnreadable": "Key unreadable",
6269
+ "defaultName": "Default",
6270
+ "current": "This tab",
6271
+ "nowNote": "Applies now: the next message runs under {label}.",
6272
+ "nextNote": "This chat stays on {current}. {label} opens in a new chat.",
6273
+ "sameNote": "This tab already uses {label}.",
6274
+ "missingNote": "That account is no longer set up. Choose another one.",
6275
+ "menuNoteNow": "The account you pick applies from the next message.",
6276
+ "menuNoteChat": "This chat stays on {label}. Picking another account opens a new chat.",
6277
+ "newChatUnder": "This chat runs under {label}.",
6278
+ "tooManyTabs": "Close a tab first: the most tabs are open.",
6279
+ "menuTitle": "{provider} accounts",
6280
+ "triggerLabel": "{provider} account: {summary}",
6281
+ "manage": "Manage {label}",
6282
+ "back": "All accounts",
6283
+ "addAccount": "Add account",
6284
+ "refresh": "Refresh",
6285
+ "subscriptionShort": "Subscription",
6286
+ "emptyAccounts": "No accounts yet.",
6287
+ "usageLeft": "{percent}% left",
6288
+ "usageLimited": "Limit reached",
6289
+ "usageResets": "Resets {time}",
6290
+ "reading": "Reading the accounts…",
6291
+ "readFailed": "Could not read the accounts. Try again.",
6292
+ "needsServer": "Choosing an account needs a newer SynaBun server: restart it to enable this.",
6293
+ "otherAccounts": "Other accounts…",
6294
+ "uses": "Uses",
6295
+ "usesGroup": "What {label} uses",
6296
+ "credSubscription": "{service} subscription",
6297
+ "credApiKey": "API key",
6298
+ "inUse": "in use",
6299
+ "signedIn": "Signed in",
6300
+ "notSignedIn": "Not signed in",
6301
+ "notChecked": "Not checked yet",
6302
+ "noKey": "None",
6303
+ "savedKey": "Saved",
6304
+ "keyUnreadableLong": "Saved key cannot be read: save it again",
6305
+ "keyKeptBy": "{hint}, kept by {cli}",
6306
+ "signIn": "Sign in with {service}",
6307
+ "useApiKey": "Use an API key",
6308
+ "signOut": "Sign out",
6309
+ "removeKey": "Remove key",
6310
+ "rename": "Rename",
6311
+ "remove": "Remove account",
6312
+ "save": "Save",
6313
+ "cancel": "Cancel",
6314
+ "keyPlaceholder": "Paste API key",
6315
+ "keyLabel": "API key for {label}",
6316
+ "nameLabel": "Account name",
6317
+ "freshPrompt": "Sign {label} in: with {service} (a terminal opens) or with an API key.",
6318
+ "signInPending": "Finish signing in in the terminal. This menu updates when {cli} confirms it.",
6319
+ "checkingKey": "Checking the key with {vendor}…",
6320
+ "keySavedNote": "{label} now uses its API key.",
6321
+ "modeSetApiKey": "{label} now uses its API key, from the next message.",
6322
+ "modeSetSubscription": "{label} now uses its {service} account, from the next message.",
6323
+ "signedOutNote": "{label} is signed out of {service}.",
6324
+ "keyRemovedNote": "The API key of {label} was removed.",
6325
+ "confirmSignOut": "Sign {label} out of {service}? {cli} removes the subscription login from this account.",
6326
+ "confirmRemoveKey": "Remove the API key saved for {label}?",
6327
+ "confirmRemove": "Remove {label}? Its folder, its sign-in and its saved key are deleted.",
6328
+ "busyTurn": "Finish or stop the current turn first.",
6329
+ "failed": "That did not work. Try again.",
6330
+ "errInvalidKey": "That doesn't look like an {vendor} API key.",
6331
+ "errOauthToken": "That's a Claude sign-in token. Use Sign in with Claude.",
6332
+ "errKeyRejected": "{vendor} rejected that key.",
6333
+ "errPermission": "Saving keys requires the owner’s SynaBun window. Reload and try again.",
6334
+ "errAccountUnavailable": "This account is no longer available. Select an account again.",
6335
+ "errAccountBusy": "Finish this account’s work, then try again.",
6336
+ "errUnreachable": "Couldn't reach {vendor} to check the key. Try again.",
6337
+ "errUnavailable": "{vendor} couldn't check the key. Try again shortly.",
6338
+ "errServer": "Couldn't reach SynaBun. Check the connection and try again.",
6339
+ "errStorage": "Couldn't save the key for this account."
6340
+ },
5105
6341
  "assistant": {
6342
+ "accountUsage": {
6343
+ "autoPicked": "Auto chose {to}: {usage}",
6344
+ "fallbackPicked": "{from} out of usage → {to}: {usage}",
6345
+ "allLimitedPicked": "All subscriptions limited; soonest reset → {to}: {usage}",
6346
+ "directWorkerHint": "Runs on a worker because this conversation belongs to another account.",
6347
+ "noSubscription": "Auto requires a signed-in subscription account.",
6348
+ "auto": "Auto · most usage left",
6349
+ "autoHint": "Signed-in subscriptions only. Another account runs on a worker.",
6350
+ "composerHint": "Pick the subscription with most usage left and start a new conversation.",
6351
+ "notApplicable": "Usage n/a",
6352
+ "limitedUntil": "Limited until {time}",
6353
+ "limited": "Limited",
6354
+ "unknown": "Usage unknown",
6355
+ "left": "{percent}% left",
6356
+ "resets": "resets {time}"
6357
+ },
5106
6358
  "usage": {
5107
6359
  "task": "Current task",
5108
6360
  "tokens": "tokens",
@@ -5674,7 +6926,10 @@
5674
6926
  "suggestSchedule": "Schedule …",
5675
6927
  "templateSchedule": "Schedule {caret}",
5676
6928
  "suggestRemember": "Remember …",
5677
- "templateRemember": "Remember {caret}"
6929
+ "templateRemember": "Remember {caret}",
6930
+ "project": "Project",
6931
+ "chooseProject": "Choose a project",
6932
+ "projectAria": "Choose a project (now: {project})"
5678
6933
  },
5679
6934
  "status": {
5680
6935
  "aborted": "Aborted.",
@@ -5685,6 +6940,7 @@
5685
6940
  "dispatchFailed": "Dispatch failed",
5686
6941
  "mode": "Permission mode: {mode}",
5687
6942
  "queued": "Queued at position {position} (concurrency limit).",
6943
+ "renameFailed": "Could not save the name “{name}”. The session is still called “{previous}”.",
5688
6944
  "resuming": "resuming {id}",
5689
6945
  "rewound": "Files rewound to checkpoint",
5690
6946
  "rewindFailed": "Rewind failed",
@@ -5692,6 +6948,7 @@
5692
6948
  "stopFailed": "Stop failed",
5693
6949
  "stopRequested": "Stop requested for {id}",
5694
6950
  "routeMode": "Model routing: {mode}",
6951
+ "testDensity": "Test density: {level}",
5695
6952
  "computerOn": "Computer use is on.",
5696
6953
  "computerOff": "Computer use is off.",
5697
6954
  "computerRemote": "Computer use in this WhatsApp conversation: {why}.",
@@ -5720,6 +6977,127 @@
5720
6977
  "done": "done",
5721
6978
  "error": "error"
5722
6979
  },
6980
+ "automation": {
6981
+ "title": "Automation",
6982
+ "sum": {
6983
+ "turn": "{n} tok this turn",
6984
+ "standing": "{n} standing",
6985
+ "none": "nothing injected"
6986
+ },
6987
+ "state": {
6988
+ "waiting": "learning after the reply",
6989
+ "running": "learning…",
6990
+ "learned": "learned 1 thing",
6991
+ "confirmed": "confirmed 1 thing",
6992
+ "replaced": "replaced 1 thing"
6993
+ },
6994
+ "group": {
6995
+ "injected": "Injected",
6996
+ "withheld": "Withheld",
6997
+ "learning": "Learning",
6998
+ "session": "This conversation"
6999
+ },
7000
+ "tier": {
7001
+ "digest": "Knowledge digest",
7002
+ "last-thread": "Last conversation",
7003
+ "environment": "Environment",
7004
+ "open-item": "Open item",
7005
+ "cue": "Knowledge cue",
7006
+ "delta": "New knowledge",
7007
+ "recall": "Related memories",
7008
+ "knowledge": "Knowledge of you",
7009
+ "nudges": "Recent-interaction nudges",
7010
+ "greeting": "Greeting",
7011
+ "turn": "Per-turn notes"
7012
+ },
7013
+ "tok": "{n} tok",
7014
+ "meta": {
7015
+ "standing": "system slot · frozen {time}",
7016
+ "standingRef": "already in the system slot, not resent",
7017
+ "memories": "{n} memories",
7018
+ "memory": "1 memory",
7019
+ "alreadyPresent": "already supplied earlier",
7020
+ "greetingWriter": "said at session open · written ahead by {model}",
7021
+ "greetingFallback": "said at session open · from the records, no model",
7022
+ "budget": "budget {used}/{max} tok"
7023
+ },
7024
+ "reason": {
7025
+ "layer-off": "switched off in Settings",
7026
+ "nothing-known": "nothing learned yet",
7027
+ "no-recent-thread": "no recent conversation to mention",
7028
+ "in-greeting": "already said in the greeting",
7029
+ "budget": "over the turn budget, kept for a later turn",
7030
+ "not-ranked": "not ranked relevant by Jev",
7031
+ "in-digest": "already in the digest",
7032
+ "already-told": "already told in this conversation",
7033
+ "replaced": "replaced by a newer statement",
7034
+ "one-per-turn": "one cue per turn",
7035
+ "unusable": "no usable statement",
7036
+ "not-delivered": "the turn ended before the notes could be delivered",
7037
+ "trivial": "trivial prompt",
7038
+ "pattern": "a command or an acknowledgement",
7039
+ "judged": "Jev: memory would not change the reply",
7040
+ "nothing-retrieved": "nothing relevant found",
7041
+ "disabled": "automatic recall is off",
7042
+ "error": "the search failed",
7043
+ "system": "not a prompt of yours"
7044
+ },
7045
+ "learn": {
7046
+ "waiting": "Your words are judged once the reply is done.",
7047
+ "running": "Jev is reading what you typed…",
7048
+ "skipped": "Not judged: {reason}.",
7049
+ "cues": "Cue words: {cues}",
7050
+ "judged": "Jev: lasting signal {p} · {facet} · {scope}",
7051
+ "matched": "Matches: {statement}",
7052
+ "contradicts": "Contradicts: {statement}",
7053
+ "created": "Learned: {statement}",
7054
+ "updated": "Confirmed (seen {n}×): {statement}",
7055
+ "superseded": "Replaced “{old}” with: {statement}",
7056
+ "none": "Nothing stored: {reason}.",
7057
+ "evidence": "Evidence: “{quote}”",
7058
+ "writer": "Written by {engine}",
7059
+ "writerOwn": "Kept as your own sentence ({reason})",
7060
+ "writerKept": "Statement kept as recorded",
7061
+ "cost": "{requests} Jev requests · {tokens} tok · {cost}",
7062
+ "scope": {
7063
+ "global": "all projects"
7064
+ }
7065
+ },
7066
+ "skip": {
7067
+ "no-cue": "no always / never / from-now-on wording",
7068
+ "trivial": "trivial prompt",
7069
+ "short": "too short",
7070
+ "origin": "not typed by you",
7071
+ "untrusted": "forwarded content",
7072
+ "no-typed-text": "only attachments or pasted text",
7073
+ "seen": "the same words were already judged",
7074
+ "gate-cap": "this conversation reached its limit of judgments",
7075
+ "write-cap": "this conversation reached its limit of learned facts",
7076
+ "layer-off": "Knowledge of you is off",
7077
+ "system": "not a prompt of yours"
7078
+ },
7079
+ "none": {
7080
+ "not-durable": "not a lasting preference",
7081
+ "no-answer": "Jev did not answer",
7082
+ "jev-unavailable": "Jev is off or has no key",
7083
+ "duplicate": "memory already states this",
7084
+ "write-cap": "this conversation reached its limit of learned facts",
7085
+ "no-evidence": "no sentence carried it",
7086
+ "no-statement": "no usable statement",
7087
+ "write-error": "the memory write failed",
7088
+ "no-store": "memory is not available",
7089
+ "error": "the learning step failed"
7090
+ },
7091
+ "writer": {
7092
+ "unverified": "the rewrite could not be checked",
7093
+ "not-faithful": "the rewrite added something",
7094
+ "no-writer": "no writer model",
7095
+ "writer-cap": "writer limit reached",
7096
+ "other": "the writer failed"
7097
+ },
7098
+ "totals": "Judged {gate}/{gateCap} · writer {writer}/{writerCap} · learned {writes}/{writeCap} · {tokens} tok injected over {turns} turns · {cost}",
7099
+ "open": "Open memory"
7100
+ },
5723
7101
  "memories": {
5724
7102
  "recalled": "Recalled",
5725
7103
  "saved": "Memory saved"
@@ -5853,7 +7231,7 @@
5853
7231
  "routesUnavailable": "Model routing is not available on this server.",
5854
7232
  "computerUsage": "Usage: /computer [on|off]",
5855
7233
  "computerUnavailable": "Computer use is not available here.",
5856
- "budget": "Set the money caps (per run, session, brain)"
7234
+ "budget": "Set the session budget and view provider shares"
5857
7235
  },
5858
7236
  "prompts": {
5859
7237
  "recall": "Use the SynaBun recall tool to search memory for: \"{query}\". Summarize the most relevant results with their IDs.",
@@ -5972,7 +7350,23 @@
5972
7350
  "opencode": "OpenCode plan agent (no file edits)"
5973
7351
  }
5974
7352
  },
7353
+ "tests": {
7354
+ "title": "Test density",
7355
+ "levels": {
7356
+ "none": "None",
7357
+ "light": "Light",
7358
+ "standard": "Standard",
7359
+ "thorough": "Thorough"
7360
+ },
7361
+ "desc": {
7362
+ "none": "No tests. Only checks that the change loads.",
7363
+ "light": "Runs the tests that cover the change. New tests only when they matter.",
7364
+ "standard": "Adds focused tests and runs the area's suite once.",
7365
+ "thorough": "Full coverage, whole suite, live checks."
7366
+ }
7367
+ },
5975
7368
  "accounts": {
7369
+ "signInAccount": "Sign in to {label}…",
5976
7370
  "title": "{provider} accounts",
5977
7371
  "add": "Add account…",
5978
7372
  "manage": "Manage…",
@@ -5994,7 +7388,40 @@
5994
7388
  "openLogin": "Open sign-in page",
5995
7389
  "enterCode": "Enter this code:",
5996
7390
  "loginTimeout": "Login was not confirmed. The account was created — use \"Log in\" to retry.",
5997
- "confirmRemove": "Remove account \"{label}\"? Its config directory is kept on disk."
7391
+ "confirmRemove": "Remove account \"{label}\"? Its config directory is kept on disk.",
7392
+ "noteClaude2": "Each account has its own CLAUDE_CONFIG_DIR (settings, sign-in, sessions) and runs on its Claude subscription or its API key. \"Default\" is your ambient ~/.claude.",
7393
+ "create": "Add account",
7394
+ "useBrain": "Use for the brain",
7395
+ "useWorkers": "Use for workers",
7396
+ "workersSet": "Claude Code workers now use {label} when a dispatch names no account.",
7397
+ "switchMode": "Use its {mode}",
7398
+ "modeSet": "{label} now uses its {mode}.",
7399
+ "finishInTerminal": "Finish signing in in the terminal. This list updates when Claude Code confirms it.",
7400
+ "signOut": "Sign out of Claude",
7401
+ "confirmSignOut": "Sign {label} out of Claude?",
7402
+ "signedOut": "{label} is signed out of Claude.",
7403
+ "removeKey": "Remove API key",
7404
+ "confirmRemoveKey": "Remove the API key saved for {label}?",
7405
+ "keyRemoved": "The API key of {label} was removed.",
7406
+ "pasteKey": "Paste API key",
7407
+ "keyFor": "API key for {label}",
7408
+ "checkingKey": "Checking the key with Anthropic…",
7409
+ "keySaved": "{label} now uses its API key.",
7410
+ "notSignedIn": "Not signed in",
7411
+ "checking": "Checking sign-in…",
7412
+ "workerTag": "workers use it",
7413
+ "subscription": "Claude subscription",
7414
+ "apiKey": "API key",
7415
+ "inUseNow": "in use",
7416
+ "renamePrompt": "Name for {label}",
7417
+ "confirmRemoveClaude": "Remove \"{label}\"? Its config directory, its sign-in and its saved key are deleted.",
7418
+ "chooseSignIn": "Sign it in: with Claude (a terminal opens) or with an API key.",
7419
+ "signInFirst": "Signed out: sign it in from Manage…",
7420
+ "usesHeader": "{label} uses (every session on it)",
7421
+ "workersHeader": "Claude Code workers use",
7422
+ "noteCodex2": "Each account has its own CODEX_HOME (sign-in, sessions) and runs on its ChatGPT subscription or its API key. \"Default\" is your ambient ~/.codex.",
7423
+ "codexWorkersHeader": "Codex workers use",
7424
+ "codexWorkersSet": "Codex workers now use {label} when a dispatch names no account."
5998
7425
  },
5999
7426
  "transcript": "Conversation",
6000
7427
  "toolbar": {
@@ -6036,55 +7463,57 @@
6036
7463
  },
6037
7464
  "budget": {
6038
7465
  "title": "Budget",
6039
- "menu": "Budget…",
7466
+ "menu": "Budget\u2026",
6040
7467
  "thisSession": "This session",
6041
- "caps": "Caps (US dollars)",
6042
- "defaultRun": "Default per-run cap",
6043
- "defaultRunDesc": "Each dispatched run stops at this spend unless the brain asks for another cap.",
6044
- "maxRun": "Largest per-run cap",
6045
- "maxRunDesc": "The most a brain may give one run (budget_usd).",
6046
- "sessionWarn": "Session warning",
6047
- "sessionWarnDesc": "The brain and this panel are warned once when the session spends this much.",
6048
- "sessionHard": "Session hard cap",
6049
- "sessionHardDesc": "Brain + every run of the session. At this spend runs stop, and dispatches, follow-ups and brain turns are refused.",
6050
- "brain": "Brain cap",
6051
- "brainDesc": "The central brain's own spend in one session, checked before every brain turn.",
6052
- "effective": "In effect: {value} · default {def}",
6053
- "sourceSaved": "saved",
6054
- "sourceDefault": "default",
6055
- "sourceLegacy": "from soft budget",
6056
- "sourceEdited": "edited",
6057
- "howEnforced": "How caps are enforced",
6058
- "brainRow": "Brain",
6059
- "resetAll": "Defaults",
6060
- "reload": "Reload",
6061
- "saved": "Budget saved — applies now.",
6062
- "saveFailed": "Could not save the budget",
6063
- "loadFailed": "Could not load the budget",
6064
- "conflict": "Changed elsewhere — reload to see the saved caps.",
6065
- "unavailable": "Budget settings are not available on this server yet (restart SynaBun to load them).",
7468
+ "amount": "Budget per session (USD)",
7469
+ "noLimit": "No limit",
7470
+ "perSession": "{amount} / session",
7471
+ "spendUnlimited": "{spent} \u00b7 no limit",
7472
+ "applies": "Applies to each new session and all open sessions. Jev splits it across providers.",
6066
7473
  "errNumber": "Enter an amount in US dollars.",
6067
7474
  "errRange": "Between {min} and {max}.",
6068
- "errMaxOverHard": "Cannot exceed the session hard cap ({hard}).",
6069
- "errDefaultOverMax": "Cannot exceed the largest per-run cap ({max}).",
6070
- "errWarnOverHard": "Must be below the session hard cap ({hard}).",
6071
- "errBrainOverHard": "Cannot exceed the session hard cap ({hard}).",
6072
- "sessionLine": "{total} spent of {hard} — brain {brain}, agents {agents}; {reserved} reserved by live runs, {available} left for new runs.",
6073
- "meterLabel": "Session spend against the hard cap",
6074
- "notMetered": "not metered",
6075
- "notMeteredCodex": "not metered (Codex brain)",
6076
- "unpriced": "{n} run(s) used a model with no known price: their tokens are recorded but the dollar caps cannot meter them.",
6077
- "pricingOk": "Codex list prices: models.dev (OpenCode cache).",
6078
- "pricingTable": "List prices: SynaBun's table, checked against the Anthropic and OpenAI pricing pages on {date}. A Codex model it does not list is priced from models.dev.",
6079
- "pricingDrift": "models.dev lists another price for {models}: the table may be out of date.",
6080
- "pricingMissing": "Codex list prices unavailable (no OpenCode models.dev cache): Codex runs are flagged unpriced.",
6081
- "repaired": "The saved file broke a rule ({fields}); the values in effect were corrected. Save to store them.",
6082
- "applies": "Saved caps apply at once to open sessions and their runs: the next dispatch, follow-up, turn end and metered step. A Claude run keeps the CLI cap it started with, and the dispatcher also stops it at the new cap after its turn.",
6083
- "chipSplit": "Brain {brain} · agents {agents}",
6084
- "chipCap": "{total} of the {hard} session cap",
6085
- "chipUnpriced": "{n} run(s) with unpriced usage"
7475
+ "invalid": "The server rejected this budget. Check the amount and try again.",
7476
+ "loadFailed": "Could not load the budget. Try again.",
7477
+ "saveFailed": "Could not save the budget. Your edit is kept; try again.",
7478
+ "conflict": "Changed elsewhere again. Your edit is kept; try again.",
7479
+ "retry": "Try again",
7480
+ "saving": "Saving\u2026",
7481
+ "saved": "Budget saved \u2014 applies now.",
7482
+ "chipSplit": "Brain {brain} \u00b7 agents {agents}",
7483
+ "chipUnpriced": "{n} run(s) with unpriced usage",
7484
+ "meterLabel": "Session spend against the budget",
7485
+ "brainRow": "Brain",
7486
+ "providerSpend": "{spent} spent",
7487
+ "providerAmounts": "Share {share} \u00b7 spent {spent} \u00b7 left for tasks {left}",
7488
+ "reserve": "{reserve} reserved for the brain within this share.",
7489
+ "dry": "Share used up",
7490
+ "fixedRule": "Fixed rule",
7491
+ "awaitingSplit": "The split is prepared when work starts.",
7492
+ "ineligible": {
7493
+ "no_models": "No available models",
7494
+ "signed_out": "Signed out",
7495
+ "limited": "Provider usage limit reached"
7496
+ },
7497
+ "fallback": {
7498
+ "jev_off": "Jev is off",
7499
+ "jev_unavailable": "Jev is unavailable",
7500
+ "jev_incomplete": "Jev returned an incomplete split",
7501
+ "nothing_left": "No budget left"
7502
+ }
6086
7503
  },
6087
7504
  "routes": {
7505
+ "budgetDecision": "budget re-route",
7506
+ "budgetProvider": "Budget: the {provider} share of this session's budget is used up.",
7507
+ "budgetSpent": "Budget: this session's budget is spent.",
7508
+ "budgetDryOne": "Budget: the {list} share is used up.",
7509
+ "budgetDryMany": "Budget: the {list} shares are used up.",
7510
+ "account": {
7511
+ "workersDefault": "Workers default",
7512
+ "removed": "{id} · account removed",
7513
+ "removedHint": "Account removed. Save another account choice before running this route.",
7514
+ "signedOut": "Signed out. Sign in from the provider account menu before running this route.",
7515
+ "conversationHint": "Uses this conversation’s account. Change it in the composer model selector."
7516
+ },
6088
7517
  "title": "Model routing",
6089
7518
  "editor": "Model routes…",
6090
7519
  "editorTitle": "Model routes",
@@ -6097,9 +7526,9 @@
6097
7526
  "always": "Always ask",
6098
7527
  "unsure": "Ask when unsure",
6099
7528
  "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."
7529
+ "alwaysDesc": "Confirm every actionable task.",
7530
+ "unsureDesc": "Confirm below {pct}% confidence or when a model cannot run the task.",
7531
+ "neverDesc": "Run saved routes immediately; otherwise the assistant chooses."
6103
7532
  },
6104
7533
  "correction": {
6105
7534
  "remembered": "your saved route {to} replaced {from}",
@@ -6119,11 +7548,11 @@
6119
7548
  "badge": {
6120
7549
  "suggested": "Suggested",
6121
7550
  "suggestedPct": "Suggested · {pct}",
6122
- "remembered": "Remembered",
7551
+ "remembered": "Your choice",
6123
7552
  "current": "Current",
6124
7553
  "cheaper": "Cheaper",
6125
7554
  "stronger": "Stronger",
6126
- "other": "Your pick",
7555
+ "other": "Your choice",
6127
7556
  "makesImages": "Makes images",
6128
7557
  "makesVideo": "Makes video",
6129
7558
  "canSee": "Can see"
@@ -6139,7 +7568,7 @@
6139
7568
  },
6140
7569
  "decidedBy": "decided by {model}",
6141
7570
  "youChose": "you chose",
6142
- "remembered": "remembered",
7571
+ "remembered": "your saved choice",
6143
7572
  "timeout": "default after timeout",
6144
7573
  "alternatives": "Also considered",
6145
7574
  "corrections": "Adjusted",
@@ -6149,7 +7578,7 @@
6149
7578
  "chooseModel": "Where should this run?",
6150
7579
  "other": "Other model…",
6151
7580
  "otherTitle": "Run on another model",
6152
- "rememberFor": "Remember for {taskClass} tasks",
7581
+ "rememberFor": "Use this choice for {taskClass} tasks",
6153
7582
  "rememberCurrent": "now: {current}",
6154
7583
  "run": "Run",
6155
7584
  "keys": "1–4 choose · Enter runs · Esc cancels",
@@ -6157,12 +7586,12 @@
6157
7586
  "cancelling": "Cancelling…",
6158
7587
  "expiresIn": "Expires in {time}",
6159
7588
  "invalid": "That route is not available. Pick another option.",
6160
- "brainDecides": "Let the brain decide",
7589
+ "brainDecides": "Assistant chooses",
6161
7590
  "resetAll": "Reset all",
6162
7591
  "whenToAsk": "When to ask",
6163
7592
  "taskRoutes": "Task routes",
6164
7593
  "visionRow": "Screenshots & images",
6165
- "visionDesc": "Used when a task needs a model that can see.",
7594
+ "visionDesc": "Fallback when a task needs a model that can see.",
6166
7595
  "noCapableModel": "No model in your catalog can make {medium} yet.",
6167
7596
  "incapableTip": "This model can't generate {medium}, so the route is not applied.",
6168
7597
  "noSeeingModel": "No model in your catalog can see images yet.",
@@ -6173,25 +7602,203 @@
6173
7602
  "images": "images",
6174
7603
  "videos": "videos"
6175
7604
  },
6176
- "effortAuto": "auto effort",
6177
- "effortAutoDefault": "auto ({effort})",
7605
+ "effortAuto": "Model default",
7606
+ "effortAutoDefault": "Default · {effort}",
6178
7607
  "effortUnsupported": "{effort} · unsupported",
6179
7608
  "source": {
6180
- "yours": "yours",
6181
- "remembered": "remembered",
6182
- "default": "default",
6183
- "disabled": "disabled",
6184
- "incapable": "incapable"
7609
+ "yours": "Your choice",
7610
+ "remembered": "Your choice",
7611
+ "default": "Assistant chooses",
7612
+ "disabled": "Hidden",
7613
+ "incapable": "Needs attention"
6185
7614
  },
6186
7615
  "reset": "Reset {taskClass}",
6187
- "resetTip": "Back to default",
7616
+ "resetTip": "Let the assistant choose",
6188
7617
  "reload": "Reload",
6189
7618
  "unavailable": "Model routing is not available on this server yet.",
6190
7619
  "loadFailed": "Could not load model routes",
6191
- "conflict": "Changed elsewhere — reload",
7620
+ "conflict": "Settings changed elsewhere. Reload to keep your edits and review the latest choices.",
6192
7621
  "invalidField": "Invalid routing setting: {field}",
6193
- "saveFailed": "Could not save",
6194
- "saved": "Model routes saved."
7622
+ "saveFailed": "Could not save. Your edits are kept; try again.",
7623
+ "saved": "Model routes saved.",
7624
+ "effortDefaultUnknown": "Default · unknown",
7625
+ "effortNotSupported": "Not supported",
7626
+ "resetChoice": "Reset",
7627
+ "reloadModels": "Reload models",
7628
+ "fieldLabel": "{task}: {field}, {value}",
7629
+ "editorEffortAuto": "Auto",
7630
+ "editorInConversation": "This conversation",
7631
+ "editorUnusedValue": "—",
7632
+ "editorSessionOverride": "This conversation overrides the default: {mode}.",
7633
+ "notApplied": "Not applied",
7634
+ "modeSummary": {
7635
+ "always-ask": "Asks before every task. Routes saved in Never ask are offered first on the route card.",
7636
+ "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.",
7637
+ "never": "Runs valid saved routes immediately; the Assistant chooses for other tasks. Plain Chat stays on the current brain."
7638
+ },
7639
+ "defaultScope": "Default for conversations. Saved task choices are shared across all modes.",
7640
+ "sessionOverride": "This conversation uses {mode}. Its override is changed from the route chip or /routes.",
7641
+ "brainLabel": "Routing brain: {model}",
7642
+ "withChoice": "With your choice",
7643
+ "withoutChoice": "Assistant chooses",
7644
+ "effortNote": "Default effort uses the model default when the brain does not propose a level.",
7645
+ "workerOnly": "Worker only",
7646
+ "needsVision": "Needs vision",
7647
+ "needs": {
7648
+ "image": "Needs image output",
7649
+ "video": "Needs video output"
7650
+ },
7651
+ "chatCurrent": "Uses the current brain",
7652
+ "workerChooses": "Worker · assistant chooses",
7653
+ "inConversation": "In conversation",
7654
+ "onWorker": "{provider} worker",
7655
+ "conversationDesc": "Continue this conversation on the chosen model for this task.",
7656
+ "workerDesc": "Hand the task to a worker and show its result here.",
7657
+ "otherProviderWorker": "A model from another provider runs on a worker.",
7658
+ "chatInactive": "Plain chat stays on the current brain. A stored Chat choice is not applied in any mode.",
7659
+ "visionFallback": "Vision fallback, not a task class. Used when the chosen model cannot see image input.",
7660
+ "columns": {
7661
+ "account": "Account",
7662
+ "task": "Task",
7663
+ "model": "Model",
7664
+ "effort": "Effort",
7665
+ "run": "Runs in",
7666
+ "reset": "Reset"
7667
+ },
7668
+ "behavior": {
7669
+ "always-ask": {
7670
+ "saved": "Guides the brain’s suggestion and is offered on the route card.",
7671
+ "unsaved": "The brain suggests a route; you confirm before it runs.",
7672
+ "note": "Every actionable task asks for your choice. A task with no capable model cannot run."
7673
+ },
7674
+ "ask-unsure": {
7675
+ "saved": "Guides the brain’s choice. It can choose another model if the task needs one.",
7676
+ "unsaved": "The brain chooses a model and where it runs.",
7677
+ "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."
7678
+ },
7679
+ "never": {
7680
+ "saved": "Runs on your saved model and destination immediately, when the choice is valid.",
7681
+ "unsaved": "The brain chooses a route and runs it immediately.",
7682
+ "note": "Disabled or incompatible choices are skipped. Invalid model picks can be corrected. A task with no capable model cannot run."
7683
+ }
7684
+ },
7685
+ "efforts": {
7686
+ "none": "None",
7687
+ "thinking": "Thinking",
7688
+ "minimal": "Minimal",
7689
+ "low": "Low",
7690
+ "medium": "Medium",
7691
+ "high": "High",
7692
+ "xhigh": "Extra high",
7693
+ "max": "Maximum",
7694
+ "ultra": "Ultra"
7695
+ },
7696
+ "issue": {
7697
+ "disabled": "Hidden in Models. Show it there or choose another model.",
7698
+ "missing": "Not in the current list. Reload models, choose a listed model or reset this choice.",
7699
+ "unavailable": "Model unavailable. Choose an available model or reset this choice.",
7700
+ "blind": "This task needs vision. Choose a model that can see images.",
7701
+ "unknownVision": "Vision is unverified. Choose a model known to see images or reset this choice.",
7702
+ "incapable": "This model cannot generate {medium}. Choose one that can.",
7703
+ "effort": "Saved effort is unsupported. Choose a supported level or use the default.",
7704
+ "unverified": "Could not verify this model. Reload models before relying on this choice."
7705
+ },
7706
+ "issueLabel": {
7707
+ "disabled": "Hidden",
7708
+ "missing": "Not listed",
7709
+ "unavailable": "Unavailable",
7710
+ "blind": "Needs vision",
7711
+ "unknownVision": "Vision unverified",
7712
+ "incapable": "Incompatible",
7713
+ "effort": "Unsupported effort",
7714
+ "unverified": "Unverified"
7715
+ },
7716
+ "editorState": {
7717
+ "modelsUpdated": "Model list updated. Your unsaved changes are kept.",
7718
+ "discardTitle": "Discard unsaved changes?",
7719
+ "discardDesc": "Your saved settings will stay as they are.",
7720
+ "resetTitle": "Reset {count} saved choices?",
7721
+ "resetDesc": "The assistant will choose for these tasks. Nothing changes until you save.",
7722
+ "keepEditing": "Keep editing",
7723
+ "discard": "Discard changes",
7724
+ "resetConfirm": "Reset choices",
7725
+ "moreBelow": "More task routes below ↓",
7726
+ "saving": "Saving…",
7727
+ "unsavedOne": "1 unsaved change",
7728
+ "unsaved": "{count} unsaved changes",
7729
+ "noChanges": "No unsaved changes",
7730
+ "fixChoices": "Fix the highlighted choices or reset them before saving.",
7731
+ "offline": "Offline. Your edits are kept. Reconnect to save or reload models.",
7732
+ "loadingRoutes": "Loading routing settings and models…",
7733
+ "loadingModels": "Loading models…",
7734
+ "modelsFailed": "Could not refresh the model list. Showing provider lists where available. Reload models to verify your choices.",
7735
+ "modelsEmpty": "No models are available. Check Models or connect a provider, then reload.",
7736
+ "tasksEmpty": "No task classes are available on this server.",
7737
+ "edited": " · edited",
7738
+ "settingsReloaded": "Latest settings loaded. Your edits are kept; review them before saving.",
7739
+ "permission": "You do not have permission to edit routing settings."
7740
+ },
7741
+ "menu": {
7742
+ "priceUnknown": "Price unknown",
7743
+ "contextUnknown": "Context unknown",
7744
+ "contextTokens": "{count} tokens",
7745
+ "hiddenCount": "{count} hidden in Models",
7746
+ "noCompatible": "No compatible models shown for this provider.",
7747
+ "providerEmpty": "No models shown for this provider.",
7748
+ "noMatches": "No matching models. Check Models for hidden choices.",
7749
+ "failed": "Model list could not be refreshed. Provider lists may be out of date.",
7750
+ "hiddenHelp": "Missing a model? Your Models list controls what is shown."
7751
+ },
7752
+ "classes": {
7753
+ "chat": {
7754
+ "label": "Chat",
7755
+ "desc": "Conversation and questions answered from knowledge or memory"
7756
+ },
7757
+ "quick": {
7758
+ "label": "Quick task",
7759
+ "desc": "Small edits, one-off shell commands and lookups"
7760
+ },
7761
+ "code": {
7762
+ "label": "Coding",
7763
+ "desc": "A feature or bug fix inside one repository"
7764
+ },
7765
+ "complex": {
7766
+ "label": "Complex engineering",
7767
+ "desc": "Architecture, cross-file refactors and hard debugging"
7768
+ },
7769
+ "review": {
7770
+ "label": "Review",
7771
+ "desc": "A second model reviews code, a plan or a result"
7772
+ },
7773
+ "research": {
7774
+ "label": "Research",
7775
+ "desc": "Web or codebase research and summaries"
7776
+ },
7777
+ "browser": {
7778
+ "label": "Browser",
7779
+ "desc": "Web tasks in the SynaBun browser"
7780
+ },
7781
+ "computer": {
7782
+ "label": "Computer use",
7783
+ "desc": "Operate desktop apps on this Mac"
7784
+ },
7785
+ "automation": {
7786
+ "label": "Automation",
7787
+ "desc": "Loops, schedules and recurring work"
7788
+ },
7789
+ "design": {
7790
+ "label": "Design",
7791
+ "desc": "UI/UX research, design systems, mockups and prototypes"
7792
+ },
7793
+ "image_gen": {
7794
+ "label": "Image creation",
7795
+ "desc": "Create images with a model that generates them"
7796
+ },
7797
+ "video_gen": {
7798
+ "label": "Video creation",
7799
+ "desc": "Create videos with a model that generates them"
7800
+ }
7801
+ }
6195
7802
  },
6196
7803
  "computer": {
6197
7804
  "toggle": "Computer",
@@ -7018,5 +8625,315 @@
7018
8625
  "body": "Click ? whenever you want to pick it up again. Nothing in your workspace was changed."
7019
8626
  }
7020
8627
  }
8628
+ },
8629
+ "codexSettings": {
8630
+ "title": "Codex Settings",
8631
+ "close": "Close",
8632
+ "account": "Account",
8633
+ "models": "Model & reasoning",
8634
+ "permissions": "Permissions",
8635
+ "tools": "Tools",
8636
+ "advanced": "Advanced",
8637
+ "loading": "Loading…",
8638
+ "error": "Could not save or load settings: {message}",
8639
+ "default": "(default)",
8640
+ "defaultAccount": "Default account",
8641
+ "manage": "Manage account",
8642
+ "usage": "{name}: {percent}% used · resets {time}",
8643
+ "unknown": "unknown",
8644
+ "runtime": "CLI {cli} · Automation SDK {sdk} · Protocol {protocol}",
8645
+ "mcp": "MCP servers",
8646
+ "alwaysAllowed": "Always allowed",
8647
+ "loginRequired": "Login required",
8648
+ "running": "Running",
8649
+ "configured": "{value} (configured)",
8650
+ "refresh": "Refresh",
8651
+ "revoke": "Revoke",
8652
+ "authenticate": "Authenticate",
8653
+ "noMcp": "Configure MCP servers in $CODEX_HOME/config.toml under [mcp_servers].",
8654
+ "folders": "Always allowed folders",
8655
+ "write": "Write",
8656
+ "read": "Read",
8657
+ "none": "None",
8658
+ "applyTo": "Apply to",
8659
+ "savedDefaults": "Saved defaults",
8660
+ "currentThread": "Current thread",
8661
+ "scopeHint": "Saved defaults affect new threads. Current thread choices apply to subsequent turns. MCP settings apply to this account; allowed folders apply across Codex tabs.",
8662
+ "features": "Runtime features",
8663
+ "on": "On",
8664
+ "off": "Off",
8665
+ "saveDefaults": "Save defaults",
8666
+ "applyThread": "Apply to current thread",
8667
+ "saving": "Saving…",
8668
+ "saved": "Saved and verified",
8669
+ "notApplied": "The effective value did not change for {keys}. Check the source layer or managed configuration.",
8670
+ "busy": "Wait for the active turn to finish.",
8671
+ "noSchema": "The running CLI did not report its settings schema. No settings will be written.",
8672
+ "tokens": "tokens",
8673
+ "source": "Source: {layer}",
8674
+ "managed": "Managed configuration",
8675
+ "model": "Model",
8676
+ "reviewModel": "Review model",
8677
+ "effort": "Reasoning effort",
8678
+ "summary": "Reasoning summary",
8679
+ "serviceTier": "Service tier",
8680
+ "personality": "Personality",
8681
+ "approval": "Approval policy",
8682
+ "sandbox": "Sandbox mode",
8683
+ "webSearch": "Web search",
8684
+ "provider": "Provider",
8685
+ "verbosity": "Response verbosity",
8686
+ "contextWindow": "Context window",
8687
+ "autoCompact": "Auto-compact",
8688
+ "gateway": "Gateway OAuth",
8689
+ "cancel": "Cancel",
8690
+ "signIn": "Sign in",
8691
+ "httpsRequired": "Authorization requires an HTTPS URL.",
8692
+ "continueAt": "Continue sign-in at {host}",
8693
+ "openHost": "Open {host}",
8694
+ "verification": "User verification · Experimental",
8695
+ "credentialReady": "Local credential ready",
8696
+ "credentialMissing": "No local credential",
8697
+ "localCredential": "Device credential only. Registration is managed by the verification provider.",
8698
+ "remove": "Remove",
8699
+ "enroll": "Enroll",
8700
+ "removeCredential": "Remove the local user verification credential?",
8701
+ "changedConversation": "This conversation changed. Reopen Settings to continue.",
8702
+ "configRepaired": "Codex configuration repaired. The original was backed up.",
8703
+ "warningHelp": "Edit the reported key in the reported config file, then reconnect Codex. Existing messages do not block sending.",
8704
+ "dismiss": "Dismiss",
8705
+ "openSettings": "Open settings",
8706
+ "gatewayStates": {
8707
+ "notReady": "Sign-in required",
8708
+ "started": "Waiting for sign-in",
8709
+ "succeeded": "Signed in",
8710
+ "failed": "Sign-in failed"
8711
+ },
8712
+ "values": {
8713
+ "never": "Never",
8714
+ "untrusted": "Untrusted commands",
8715
+ "on-request": "On request",
8716
+ "read-only": "Read only",
8717
+ "workspace-write": "Workspace write",
8718
+ "danger-full-access": "Full access",
8719
+ "auto": "Automatic",
8720
+ "concise": "Concise",
8721
+ "detailed": "Detailed",
8722
+ "none": "None",
8723
+ "low": "Low",
8724
+ "medium": "Medium",
8725
+ "high": "High",
8726
+ "disabled": "Disabled",
8727
+ "cached": "Cached",
8728
+ "indexed": "Indexed",
8729
+ "live": "Live",
8730
+ "friendly": "Friendly",
8731
+ "pragmatic": "Pragmatic"
8732
+ }
8733
+ },
8734
+ "desktop": {
8735
+ "update": {
8736
+ "source": "SynaBun app",
8737
+ "tooltip": "SynaBun update available: v{current} → v{latest}",
8738
+ "tooltipDownloading": "Downloading SynaBun v{latest}",
8739
+ "tooltipReady": "SynaBun v{latest} is ready: it installs when SynaBun is idle",
8740
+ "titleAvailable": "Update available",
8741
+ "titleDownloading": "Downloading the update",
8742
+ "titleDownloaded": "Update ready",
8743
+ "titleInstalling": "Installing the update",
8744
+ "titleMove": "Move SynaBun to Applications",
8745
+ "titleManual": "Install the update yourself",
8746
+ "titleError": "The update did not finish",
8747
+ "notesLabel": "What's new",
8748
+ "notesEmpty": "This release has no notes.",
8749
+ "snapshot": "Before v{version} starts for the first time, SynaBun takes a verified snapshot of your data.",
8750
+ "backup": "Download full backup",
8751
+ "backupWorking": "Creating backup...",
8752
+ "backupDone": "{file} ({size} MB)",
8753
+ "backupFailed": "Backup failed: {reason}",
8754
+ "later": "Later",
8755
+ "download": "Download update",
8756
+ "downloadStarting": "Starting the download.",
8757
+ "progress": "{transferred} of {total} MB",
8758
+ "progressUnknown": "{transferred} MB downloaded",
8759
+ "hide": "Hide",
8760
+ "hideHint": "The download continues while this is hidden. SynaBun installs the update by itself when nothing is running.",
8761
+ "readyBody": "SynaBun v{version} is downloaded. It installs by itself once nothing is running: SynaBun shows a one-minute notice, then restarts into it. It also installs when you quit SynaBun.",
8762
+ "waitingBody": "Waiting for: {list}.",
8763
+ "countdownBody": "SynaBun restarts into v{version} in {seconds} s.",
8764
+ "postponedBody": "Postponed until {time}. It also installs when you quit SynaBun.",
8765
+ "nowBody": "SynaBun restarts into v{version} as soon as nothing is running.",
8766
+ "installNow": "Install now",
8767
+ "installingBody": "SynaBun is stopping its server and installing v{version}. It closes and opens again by itself.",
8768
+ "moveBody": "macOS is running SynaBun from a disk image or a temporary location, where it cannot update itself. Move it to the Applications folder; SynaBun opens again from there and can update.",
8769
+ "move": "Move to Applications",
8770
+ "manualBody": "SynaBun cannot replace itself in its current folder. Download the disk image of v{version}, open it and drag SynaBun to the Applications folder.",
8771
+ "manualReady": "The disk image of v{version} is downloaded. Open it and drag SynaBun to the Applications folder to replace the old copy.",
8772
+ "manualFile": "File: {path}",
8773
+ "manualDownload": "Download disk image",
8774
+ "showFile": "Show disk image",
8775
+ "errorFallback": "SynaBun could not check for updates. Check the connection and try again.",
8776
+ "errorNext": "SynaBun keeps the version it runs and tries again at its next check. You can try now, or download the new version yourself.",
8777
+ "manualLink": "Download it yourself",
8778
+ "close": "Close",
8779
+ "retry": "Try again",
8780
+ "testFeed": "test feed",
8781
+ "metaAvailable": "From the SynaBun app",
8782
+ "metaDownloading": "Downloading: {percent}%",
8783
+ "metaDownloaded": "Ready: installs when SynaBun is idle",
8784
+ "metaCountdown": "Restarting to install it",
8785
+ "metaPostponed": "Postponed: installs on quit or later"
8786
+ },
8787
+ "busy": {
8788
+ "assistant": "an Assistant run or dispatched agent",
8789
+ "claude-panel": "a Claude Code panel reply",
8790
+ "codex-panel": "a Codex panel reply",
8791
+ "opencode-panel": "an OpenCode panel reply",
8792
+ "claude-cli": "a Claude Code session in use",
8793
+ "loop": "a loop",
8794
+ "schedule": "a schedule",
8795
+ "backup": "a backup",
8796
+ "maintenance": "indexing or an install",
8797
+ "unknown": "work SynaBun cannot see the end of",
8798
+ "test": "the test switch"
8799
+ },
8800
+ "notice": {
8801
+ "countdownTitle": "Updating to v{version}",
8802
+ "countdownLine": "SynaBun restarts in {seconds} s.",
8803
+ "later": "Later",
8804
+ "postponed": "SynaBun asks again in an hour, or installs the update when you quit it.",
8805
+ "updatedTitle": "SynaBun is updated",
8806
+ "updatedLine": "Now v{version}, updated from v{previous}.",
8807
+ "updatedLineShort": "Now v{version}.",
8808
+ "failedTitle": "The update did not finish",
8809
+ "details": "Details",
8810
+ "close": "Close"
8811
+ },
8812
+ "menu": {
8813
+ "quit": "Quit SynaBun"
8814
+ },
8815
+ "offline": {
8816
+ "hint": "The SynaBun app restarts its server by itself. If it stays offline, quit SynaBun and open it again.",
8817
+ "stalled": "The server has not come back. Quit SynaBun and open it again.",
8818
+ "failedHint": "Quit SynaBun and open it again. If the start fails, the start screen says why."
8819
+ },
8820
+ "titleBar": {
8821
+ "appMenu": "SynaBun menu"
8822
+ }
8823
+ },
8824
+ "desktopShell": {
8825
+ "update": {
8826
+ "installingAtLaunch": "SynaBun downloaded v{version} earlier and installs it before it starts. It opens again when it is done.",
8827
+ "updateAvailableManualDetail": "This copy cannot replace itself where it is. Download the new disk image and install it the way you installed SynaBun.",
8828
+ "updateDownloading": "SynaBun v{version} is downloading",
8829
+ "updateAutoDetail": "SynaBun installs it by itself as soon as nothing is running, after a one-minute notice you can postpone. It also installs when you quit SynaBun.",
8830
+ "installNow": "Install now",
8831
+ "downloadYourself": "Download it yourself",
8832
+ "countdownTitle": "Updating SynaBun to v{version}",
8833
+ "countdownBody": "SynaBun restarts in one minute. Open SynaBun to postpone it.",
8834
+ "updatedTitle": "SynaBun is updated",
8835
+ "updatedBody": "SynaBun now runs v{version} (it was v{previous}).",
8836
+ "errorSwapFailed": "The update to v{version} did not install ({reason}). SynaBun kept v{previous}."
8837
+ }
8838
+ },
8839
+ "cliInstall": {
8840
+ "titleMissing": "{label} is not installed",
8841
+ "titleBroken": "{label} failed to start",
8842
+ "titleInstalling": "Installing {label}…",
8843
+ "titleFailed": "{label} could not be installed",
8844
+ "titleDone": "{label} is installed",
8845
+ "titlePath": "Run {label} in your other terminals",
8846
+ "bodyPath": "SynaBun terminals are ready. Add {dir} to your PATH for other terminals.",
8847
+ "addPath": "Add to PATH",
8848
+ "addingPath": "Adding…",
8849
+ "pathFailed": "PATH could not be updated: {error}",
8850
+ "copyPathDiagnostics": "Copy PATH diagnostics",
8851
+ "stepPath": "Adding the CLI folder to your PATH…",
8852
+ "stepPathAdded": "Added {dir} to your PATH",
8853
+ "bodyMissing": "Install it with one click from {vendor}'s official installer, or run:",
8854
+ "bodyMissingArchive": "Install it with one click from {vendor}'s official release, or run:",
8855
+ "bodyMissingManual": "Install it with this command, then re-check:",
8856
+ "bodyBroken": "{label} was found at {path}, but it could not be started:",
8857
+ "bodyBrokenVersion": "{label} {version} was found at {path}, but it could not be started:",
8858
+ "bodyBrokenLatched": "{label} is installed, but it could not be started:",
8859
+ "bodyBrokenHint": "Check the CLI path in Settings, then re-check.",
8860
+ "configuredFailed": "The path set in Settings did not work: {error}",
8861
+ "bodyFailedManual": "Run it yourself:",
8862
+ "doneNotOnPath": "It is in {dir}. SynaBun finds it there; add that folder to your PATH to run it in a terminal.",
8863
+ "doneAddedToPath": "Added {dir} to your PATH. New terminal windows and tabs pick it up.",
8864
+ "stepStart": "Starting the official installer…",
8865
+ "stepDownload": "Downloading…",
8866
+ "stepDownloadProgress": "Downloading: {received} of {total} MB",
8867
+ "stepDownloadReceived": "Downloading: {received} MB",
8868
+ "stepVerify": "Checking the download…",
8869
+ "stepRun": "Running the official installer…",
8870
+ "stepExtract": "Unpacking…",
8871
+ "stepPlace": "Putting it in place…",
8872
+ "stepCheck": "Checking that it starts…",
8873
+ "errorOffline": "The download server could not be reached. Check the connection and try again.",
8874
+ "errorHttp": "The download server answered with an error. Try again in a moment.",
8875
+ "errorChecksum": "The download did not match its published checksum, so it was removed and never run.",
8876
+ "errorInterrupted": "The download stopped before it was complete. Nothing was kept. Try again.",
8877
+ "errorTimeout": "The installer took too long and was stopped.",
8878
+ "errorInstallerFailed": "The official installer stopped with an error.",
8879
+ "errorNotFound": "The installer finished, but SynaBun does not find {label} afterwards.",
8880
+ "errorUnpack": "The download could not be unpacked, so it was removed.",
8881
+ "errorDisk": "The files could not be written. Check free space and permissions, then try again.",
8882
+ "errorCancelled": "The installation was stopped.",
8883
+ "errorUnsupported": "There is no one-click install for this system. Use the command below or the install guide.",
8884
+ "errorRefused": "SynaBun refused the request. Install from SynaBun on this computer.",
8885
+ "errorConnection": "The connection to SynaBun closed before the installation finished.",
8886
+ "errorUnknown": "The installation did not finish.",
8887
+ "install": "Install",
8888
+ "installing": "Installing…",
8889
+ "retry": "Try again",
8890
+ "guide": "Install guide",
8891
+ "recheck": "Re-check",
8892
+ "checking": "Checking…",
8893
+ "copy": "Copy",
8894
+ "copied": "Copied",
8895
+ "dismiss": "Dismiss",
8896
+ "logLabel": "Installer output"
8897
+ },
8898
+ "gitBash": {
8899
+ "label": "Git Bash for Claude Code (Windows)",
8900
+ "help": "Claude Code on Windows runs its Bash tool and its hooks in Git Bash. SynaBun uses the Git for Windows of this PC, or its own copy when the PC has none.",
8901
+ "badgeSystem": "On this PC",
8902
+ "badgeReady": "SynaBun's copy",
8903
+ "badgeMissing": "Not found",
8904
+ "badgeDownloading": "Downloading",
8905
+ "badgeFailed": "Not installed",
8906
+ "badgeOff": "Off",
8907
+ "sourceEnv": "CLAUDE_CODE_GIT_BASH_PATH names {path}.",
8908
+ "sourceSettings": "Your Claude Code settings name {path}.",
8909
+ "sourceSystem": "Git for Windows on this PC: {path}",
8910
+ "sourceSystemPassed": "Git for Windows on this PC: {path}. Claude Code would not find it by itself, so SynaBun names it.",
8911
+ "sourceBundled": "Git for Windows {version}, installed with SynaBun: {path}",
8912
+ "sourceDownloaded": "Git for Windows {version}, downloaded by SynaBun: {path}",
8913
+ "missing": "No Git Bash on this PC. SynaBun downloads its own copy of Git for Windows {version} ({size} MB) and checks it against its published SHA-256.",
8914
+ "stepDownload": "Downloading Git for Windows {version}: {done} of {total} MB",
8915
+ "stepExtract": "Unpacking Git for Windows {version}: {percent}%",
8916
+ "stepVerify": "Checking every file against the pinned release…",
8917
+ "stepPlace": "Putting it in place…",
8918
+ "failed": "Git for Windows could not be put in place. {reason}",
8919
+ "off": "Turned off: SYNABUN_GIT_BASH=off is set, so SynaBun downloads nothing and names no Git Bash.",
8920
+ "unsupported": "No Git for Windows release is pinned for this processor. Install Git for Windows from git-scm.com.",
8921
+ "settingsNamed": "A claude you start in another terminal uses it too: your Claude Code settings name it.",
8922
+ "settingsKept": "Your Claude Code settings name a Git Bash that is not there ({value}). SynaBun left that value as it is.",
8923
+ "settingsError": "Your Claude Code settings could not be updated: {message}",
8924
+ "download": "Download",
8925
+ "retry": "Try again",
8926
+ "recheck": "Re-check",
8927
+ "checking": "Checking…",
8928
+ "errorOffline": "The download server could not be reached. Check the connection and try again.",
8929
+ "errorHttp": "The download server answered with an error. Try again in a moment.",
8930
+ "errorInterrupted": "The download stopped before it was complete. Nothing was kept.",
8931
+ "errorTimeout": "Nothing arrived from the download server for too long.",
8932
+ "errorChecksum": "What arrived is not the published release, so it was removed and never run.",
8933
+ "errorUnpack": "The download could not be unpacked, so it was removed.",
8934
+ "errorDisk": "The files could not be written. Check free space (about 550 MB) and permissions.",
8935
+ "errorCancelled": "The download was stopped.",
8936
+ "errorUnknown": "The download did not finish.",
8937
+ "errorRequest": "SynaBun did not answer: {message}"
7021
8938
  }
7022
8939
  }