nastech-app 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1111) hide show
  1. package/.claude/agents/i18n-translator.md +119 -0
  2. package/.claude/settings.json +8 -0
  3. package/.eas/workflows/ota.yaml +9 -0
  4. package/.eas/workflows/preview.yaml +12 -0
  5. package/.easignore +12 -0
  6. package/.github/workflows/eas-build.yml +24 -0
  7. package/CHANGELOG.md +117 -0
  8. package/CLAUDE.md +413 -0
  9. package/GoogleService-Info.plist +30 -0
  10. package/LICENSE +21 -0
  11. package/NasTechapp.md +383 -0
  12. package/README.md +75 -0
  13. package/Stores.md +85 -0
  14. package/TERMS.md +83 -0
  15. package/app.config.js +153 -0
  16. package/babel.config.js +28 -0
  17. package/deploy/nastech-app.yaml +51 -0
  18. package/docs/marketing/README-creators.md +73 -0
  19. package/eas-build-post-install.sh +11 -0
  20. package/eas-build-pre-install.sh +27 -0
  21. package/eas.json +78 -0
  22. package/google-services.json +67 -0
  23. package/index.ts +3 -0
  24. package/logo.png +0 -0
  25. package/metro.config.js +54 -0
  26. package/nativewind-env.d.ts +1 -0
  27. package/package.json +233 -0
  28. package/patches/.keep +0 -0
  29. package/plugins/withEinkCompatibility.js +156 -0
  30. package/public/.well-known/apple-app-site-association +22 -0
  31. package/public/.well-known/assetlinks.json +12 -0
  32. package/public/canvaskit.wasm +0 -0
  33. package/public/favicon-active.ico +0 -0
  34. package/release-dev.sh +7 -0
  35. package/release-production.sh +3 -0
  36. package/release.cjs +160 -0
  37. package/sources/-session/SessionView.tsx +944 -0
  38. package/sources/-session/sessionOverlayNav.ts +34 -0
  39. package/sources/app/(app)/_layout.tsx +321 -0
  40. package/sources/app/(app)/artifacts/[id].tsx +279 -0
  41. package/sources/app/(app)/artifacts/edit/[id].tsx +318 -0
  42. package/sources/app/(app)/artifacts/index.tsx +264 -0
  43. package/sources/app/(app)/artifacts/new.tsx +219 -0
  44. package/sources/app/(app)/changelog.tsx +113 -0
  45. package/sources/app/(app)/dev/colors.tsx +197 -0
  46. package/sources/app/(app)/dev/device-info.tsx +183 -0
  47. package/sources/app/(app)/dev/expo-constants.tsx +394 -0
  48. package/sources/app/(app)/dev/index.tsx +400 -0
  49. package/sources/app/(app)/dev/input-styles.tsx +1951 -0
  50. package/sources/app/(app)/dev/inverted-list.tsx +295 -0
  51. package/sources/app/(app)/dev/list-demo.tsx +125 -0
  52. package/sources/app/(app)/dev/logs.tsx +160 -0
  53. package/sources/app/(app)/dev/messages-demo-data.ts +479 -0
  54. package/sources/app/(app)/dev/messages-demo.tsx +45 -0
  55. package/sources/app/(app)/dev/modal-demo.tsx +211 -0
  56. package/sources/app/(app)/dev/multi-text-input.tsx +224 -0
  57. package/sources/app/(app)/dev/purchases.tsx +228 -0
  58. package/sources/app/(app)/dev/qr-test.tsx +168 -0
  59. package/sources/app/(app)/dev/session-composer.tsx +812 -0
  60. package/sources/app/(app)/dev/shimmer-demo.tsx +275 -0
  61. package/sources/app/(app)/dev/tests.tsx +203 -0
  62. package/sources/app/(app)/dev/tools2.tsx +556 -0
  63. package/sources/app/(app)/dev/typography.tsx +177 -0
  64. package/sources/app/(app)/dev/unistyles-demo.tsx +376 -0
  65. package/sources/app/(app)/friends/index.tsx +167 -0
  66. package/sources/app/(app)/friends/search.tsx +232 -0
  67. package/sources/app/(app)/inbox/index.tsx +124 -0
  68. package/sources/app/(app)/index.tsx +264 -0
  69. package/sources/app/(app)/machine/[id].tsx +646 -0
  70. package/sources/app/(app)/new/index.tsx +1611 -0
  71. package/sources/app/(app)/restore/index.tsx +167 -0
  72. package/sources/app/(app)/restore/manual.tsx +138 -0
  73. package/sources/app/(app)/server.tsx +234 -0
  74. package/sources/app/(app)/session/[id]/file.tsx +527 -0
  75. package/sources/app/(app)/session/[id]/files.tsx +442 -0
  76. package/sources/app/(app)/session/[id]/info.tsx +655 -0
  77. package/sources/app/(app)/session/[id]/message/[messageId].tsx +125 -0
  78. package/sources/app/(app)/session/[id].tsx +10 -0
  79. package/sources/app/(app)/session/recent.tsx +270 -0
  80. package/sources/app/(app)/settings/account.tsx +600 -0
  81. package/sources/app/(app)/settings/agents.tsx +180 -0
  82. package/sources/app/(app)/settings/appearance.tsx +259 -0
  83. package/sources/app/(app)/settings/connect/claude.tsx +178 -0
  84. package/sources/app/(app)/settings/features.tsx +177 -0
  85. package/sources/app/(app)/settings/index.tsx +3 -0
  86. package/sources/app/(app)/settings/language.tsx +106 -0
  87. package/sources/app/(app)/settings/usage.tsx +11 -0
  88. package/sources/app/(app)/settings/voice/language.tsx +114 -0
  89. package/sources/app/(app)/settings/voice.tsx +274 -0
  90. package/sources/app/(app)/terminal/connect.tsx +241 -0
  91. package/sources/app/(app)/terminal/index.tsx +184 -0
  92. package/sources/app/(app)/text-selection.tsx +149 -0
  93. package/sources/app/(app)/user/[id].tsx +314 -0
  94. package/sources/app/+html.tsx +39 -0
  95. package/sources/app/_layout.tsx +402 -0
  96. package/sources/assets/animations/game.json +1 -0
  97. package/sources/assets/animations/owl.json +1 -0
  98. package/sources/assets/animations/popcorn.json +1 -0
  99. package/sources/assets/animations/robot.json +1 -0
  100. package/sources/assets/animations/sparkles.json +1 -0
  101. package/sources/assets/animations/stone.json +1 -0
  102. package/sources/assets/fonts/BricolageGrotesque-Bold.ttf +0 -0
  103. package/sources/assets/fonts/IBMPlexMono-Italic.ttf +0 -0
  104. package/sources/assets/fonts/IBMPlexMono-Regular.ttf +0 -0
  105. package/sources/assets/fonts/IBMPlexMono-SemiBold.ttf +0 -0
  106. package/sources/assets/fonts/IBMPlexSans-Italic.ttf +0 -0
  107. package/sources/assets/fonts/IBMPlexSans-Regular.ttf +0 -0
  108. package/sources/assets/fonts/IBMPlexSans-SemiBold.ttf +0 -0
  109. package/sources/assets/fonts/SpaceMono-Regular.ttf +0 -0
  110. package/sources/assets/images/brutalist/Abstract-1.png +0 -0
  111. package/sources/assets/images/brutalist/Abstract-10.png +0 -0
  112. package/sources/assets/images/brutalist/Abstract-100.png +0 -0
  113. package/sources/assets/images/brutalist/Abstract-101.png +0 -0
  114. package/sources/assets/images/brutalist/Abstract-102.png +0 -0
  115. package/sources/assets/images/brutalist/Abstract-103.png +0 -0
  116. package/sources/assets/images/brutalist/Abstract-104.png +0 -0
  117. package/sources/assets/images/brutalist/Abstract-105.png +0 -0
  118. package/sources/assets/images/brutalist/Abstract-106.png +0 -0
  119. package/sources/assets/images/brutalist/Abstract-107.png +0 -0
  120. package/sources/assets/images/brutalist/Abstract-108.png +0 -0
  121. package/sources/assets/images/brutalist/Abstract-109.png +0 -0
  122. package/sources/assets/images/brutalist/Abstract-11.png +0 -0
  123. package/sources/assets/images/brutalist/Abstract-110.png +0 -0
  124. package/sources/assets/images/brutalist/Abstract-111.png +0 -0
  125. package/sources/assets/images/brutalist/Abstract-112.png +0 -0
  126. package/sources/assets/images/brutalist/Abstract-113.png +0 -0
  127. package/sources/assets/images/brutalist/Abstract-114.png +0 -0
  128. package/sources/assets/images/brutalist/Abstract-115.png +0 -0
  129. package/sources/assets/images/brutalist/Abstract-116.png +0 -0
  130. package/sources/assets/images/brutalist/Abstract-117.png +0 -0
  131. package/sources/assets/images/brutalist/Abstract-118.png +0 -0
  132. package/sources/assets/images/brutalist/Abstract-119.png +0 -0
  133. package/sources/assets/images/brutalist/Abstract-12.png +0 -0
  134. package/sources/assets/images/brutalist/Abstract-120.png +0 -0
  135. package/sources/assets/images/brutalist/Abstract-121.png +0 -0
  136. package/sources/assets/images/brutalist/Abstract-122.png +0 -0
  137. package/sources/assets/images/brutalist/Abstract-123.png +0 -0
  138. package/sources/assets/images/brutalist/Abstract-124.png +0 -0
  139. package/sources/assets/images/brutalist/Abstract-125.png +0 -0
  140. package/sources/assets/images/brutalist/Abstract-126.png +0 -0
  141. package/sources/assets/images/brutalist/Abstract-127.png +0 -0
  142. package/sources/assets/images/brutalist/Abstract-128.png +0 -0
  143. package/sources/assets/images/brutalist/Abstract-129.png +0 -0
  144. package/sources/assets/images/brutalist/Abstract-13.png +0 -0
  145. package/sources/assets/images/brutalist/Abstract-130.png +0 -0
  146. package/sources/assets/images/brutalist/Abstract-131.png +0 -0
  147. package/sources/assets/images/brutalist/Abstract-132.png +0 -0
  148. package/sources/assets/images/brutalist/Abstract-133.png +0 -0
  149. package/sources/assets/images/brutalist/Abstract-134.png +0 -0
  150. package/sources/assets/images/brutalist/Abstract-135.png +0 -0
  151. package/sources/assets/images/brutalist/Abstract-136.png +0 -0
  152. package/sources/assets/images/brutalist/Abstract-137.png +0 -0
  153. package/sources/assets/images/brutalist/Abstract-138.png +0 -0
  154. package/sources/assets/images/brutalist/Abstract-139.png +0 -0
  155. package/sources/assets/images/brutalist/Abstract-14.png +0 -0
  156. package/sources/assets/images/brutalist/Abstract-140.png +0 -0
  157. package/sources/assets/images/brutalist/Abstract-141.png +0 -0
  158. package/sources/assets/images/brutalist/Abstract-142.png +0 -0
  159. package/sources/assets/images/brutalist/Abstract-143.png +0 -0
  160. package/sources/assets/images/brutalist/Abstract-144.png +0 -0
  161. package/sources/assets/images/brutalist/Abstract-145.png +0 -0
  162. package/sources/assets/images/brutalist/Abstract-146.png +0 -0
  163. package/sources/assets/images/brutalist/Abstract-147.png +0 -0
  164. package/sources/assets/images/brutalist/Abstract-148.png +0 -0
  165. package/sources/assets/images/brutalist/Abstract-149.png +0 -0
  166. package/sources/assets/images/brutalist/Abstract-15.png +0 -0
  167. package/sources/assets/images/brutalist/Abstract-150.png +0 -0
  168. package/sources/assets/images/brutalist/Abstract-151.png +0 -0
  169. package/sources/assets/images/brutalist/Abstract-152.png +0 -0
  170. package/sources/assets/images/brutalist/Abstract-153.png +0 -0
  171. package/sources/assets/images/brutalist/Abstract-154.png +0 -0
  172. package/sources/assets/images/brutalist/Abstract-155.png +0 -0
  173. package/sources/assets/images/brutalist/Abstract-156.png +0 -0
  174. package/sources/assets/images/brutalist/Abstract-157.png +0 -0
  175. package/sources/assets/images/brutalist/Abstract-158.png +0 -0
  176. package/sources/assets/images/brutalist/Abstract-159.png +0 -0
  177. package/sources/assets/images/brutalist/Abstract-16.png +0 -0
  178. package/sources/assets/images/brutalist/Abstract-160.png +0 -0
  179. package/sources/assets/images/brutalist/Abstract-161.png +0 -0
  180. package/sources/assets/images/brutalist/Abstract-162.png +0 -0
  181. package/sources/assets/images/brutalist/Abstract-163.png +0 -0
  182. package/sources/assets/images/brutalist/Abstract-164.png +0 -0
  183. package/sources/assets/images/brutalist/Abstract-165.png +0 -0
  184. package/sources/assets/images/brutalist/Abstract-166.png +0 -0
  185. package/sources/assets/images/brutalist/Abstract-167.png +0 -0
  186. package/sources/assets/images/brutalist/Abstract-168.png +0 -0
  187. package/sources/assets/images/brutalist/Abstract-169.png +0 -0
  188. package/sources/assets/images/brutalist/Abstract-17.png +0 -0
  189. package/sources/assets/images/brutalist/Abstract-170.png +0 -0
  190. package/sources/assets/images/brutalist/Abstract-171.png +0 -0
  191. package/sources/assets/images/brutalist/Abstract-172.png +0 -0
  192. package/sources/assets/images/brutalist/Abstract-173.png +0 -0
  193. package/sources/assets/images/brutalist/Abstract-174.png +0 -0
  194. package/sources/assets/images/brutalist/Abstract-175.png +0 -0
  195. package/sources/assets/images/brutalist/Abstract-176.png +0 -0
  196. package/sources/assets/images/brutalist/Abstract-177.png +0 -0
  197. package/sources/assets/images/brutalist/Abstract-178.png +0 -0
  198. package/sources/assets/images/brutalist/Abstract-179.png +0 -0
  199. package/sources/assets/images/brutalist/Abstract-18.png +0 -0
  200. package/sources/assets/images/brutalist/Abstract-180.png +0 -0
  201. package/sources/assets/images/brutalist/Abstract-181.png +0 -0
  202. package/sources/assets/images/brutalist/Abstract-182.png +0 -0
  203. package/sources/assets/images/brutalist/Abstract-183.png +0 -0
  204. package/sources/assets/images/brutalist/Abstract-184.png +0 -0
  205. package/sources/assets/images/brutalist/Abstract-185.png +0 -0
  206. package/sources/assets/images/brutalist/Abstract-186.png +0 -0
  207. package/sources/assets/images/brutalist/Abstract-187.png +0 -0
  208. package/sources/assets/images/brutalist/Abstract-188.png +0 -0
  209. package/sources/assets/images/brutalist/Abstract-189.png +0 -0
  210. package/sources/assets/images/brutalist/Abstract-19.png +0 -0
  211. package/sources/assets/images/brutalist/Abstract-190.png +0 -0
  212. package/sources/assets/images/brutalist/Abstract-191.png +0 -0
  213. package/sources/assets/images/brutalist/Abstract-192.png +0 -0
  214. package/sources/assets/images/brutalist/Abstract-193.png +0 -0
  215. package/sources/assets/images/brutalist/Abstract-194.png +0 -0
  216. package/sources/assets/images/brutalist/Abstract-195.png +0 -0
  217. package/sources/assets/images/brutalist/Abstract-196.png +0 -0
  218. package/sources/assets/images/brutalist/Abstract-197.png +0 -0
  219. package/sources/assets/images/brutalist/Abstract-198.png +0 -0
  220. package/sources/assets/images/brutalist/Abstract-199.png +0 -0
  221. package/sources/assets/images/brutalist/Abstract-2.png +0 -0
  222. package/sources/assets/images/brutalist/Abstract-20.png +0 -0
  223. package/sources/assets/images/brutalist/Abstract-200.png +0 -0
  224. package/sources/assets/images/brutalist/Abstract-201.png +0 -0
  225. package/sources/assets/images/brutalist/Abstract-202.png +0 -0
  226. package/sources/assets/images/brutalist/Abstract-203.png +0 -0
  227. package/sources/assets/images/brutalist/Abstract-204.png +0 -0
  228. package/sources/assets/images/brutalist/Abstract-205.png +0 -0
  229. package/sources/assets/images/brutalist/Abstract-206.png +0 -0
  230. package/sources/assets/images/brutalist/Abstract-207.png +0 -0
  231. package/sources/assets/images/brutalist/Abstract-208.png +0 -0
  232. package/sources/assets/images/brutalist/Abstract-209.png +0 -0
  233. package/sources/assets/images/brutalist/Abstract-21.png +0 -0
  234. package/sources/assets/images/brutalist/Abstract-210.png +0 -0
  235. package/sources/assets/images/brutalist/Abstract-211.png +0 -0
  236. package/sources/assets/images/brutalist/Abstract-212.png +0 -0
  237. package/sources/assets/images/brutalist/Abstract-213.png +0 -0
  238. package/sources/assets/images/brutalist/Abstract-214.png +0 -0
  239. package/sources/assets/images/brutalist/Abstract-215.png +0 -0
  240. package/sources/assets/images/brutalist/Abstract-216.png +0 -0
  241. package/sources/assets/images/brutalist/Abstract-217.png +0 -0
  242. package/sources/assets/images/brutalist/Abstract-218.png +0 -0
  243. package/sources/assets/images/brutalist/Abstract-219.png +0 -0
  244. package/sources/assets/images/brutalist/Abstract-22.png +0 -0
  245. package/sources/assets/images/brutalist/Abstract-220.png +0 -0
  246. package/sources/assets/images/brutalist/Abstract-221.png +0 -0
  247. package/sources/assets/images/brutalist/Abstract-222.png +0 -0
  248. package/sources/assets/images/brutalist/Abstract-223.png +0 -0
  249. package/sources/assets/images/brutalist/Abstract-224.png +0 -0
  250. package/sources/assets/images/brutalist/Abstract-225.png +0 -0
  251. package/sources/assets/images/brutalist/Abstract-226.png +0 -0
  252. package/sources/assets/images/brutalist/Abstract-227.png +0 -0
  253. package/sources/assets/images/brutalist/Abstract-228.png +0 -0
  254. package/sources/assets/images/brutalist/Abstract-229.png +0 -0
  255. package/sources/assets/images/brutalist/Abstract-23.png +0 -0
  256. package/sources/assets/images/brutalist/Abstract-230.png +0 -0
  257. package/sources/assets/images/brutalist/Abstract-231.png +0 -0
  258. package/sources/assets/images/brutalist/Abstract-232.png +0 -0
  259. package/sources/assets/images/brutalist/Abstract-233.png +0 -0
  260. package/sources/assets/images/brutalist/Abstract-234.png +0 -0
  261. package/sources/assets/images/brutalist/Abstract-235.png +0 -0
  262. package/sources/assets/images/brutalist/Abstract-236.png +0 -0
  263. package/sources/assets/images/brutalist/Abstract-237.png +0 -0
  264. package/sources/assets/images/brutalist/Abstract-238.png +0 -0
  265. package/sources/assets/images/brutalist/Abstract-239.png +0 -0
  266. package/sources/assets/images/brutalist/Abstract-24.png +0 -0
  267. package/sources/assets/images/brutalist/Abstract-240.png +0 -0
  268. package/sources/assets/images/brutalist/Abstract-241.png +0 -0
  269. package/sources/assets/images/brutalist/Abstract-242.png +0 -0
  270. package/sources/assets/images/brutalist/Abstract-243.png +0 -0
  271. package/sources/assets/images/brutalist/Abstract-244.png +0 -0
  272. package/sources/assets/images/brutalist/Abstract-245.png +0 -0
  273. package/sources/assets/images/brutalist/Abstract-246.png +0 -0
  274. package/sources/assets/images/brutalist/Abstract-247.png +0 -0
  275. package/sources/assets/images/brutalist/Abstract-248.png +0 -0
  276. package/sources/assets/images/brutalist/Abstract-249.png +0 -0
  277. package/sources/assets/images/brutalist/Abstract-25.png +0 -0
  278. package/sources/assets/images/brutalist/Abstract-250.png +0 -0
  279. package/sources/assets/images/brutalist/Abstract-251.png +0 -0
  280. package/sources/assets/images/brutalist/Abstract-252.png +0 -0
  281. package/sources/assets/images/brutalist/Abstract-253.png +0 -0
  282. package/sources/assets/images/brutalist/Abstract-254.png +0 -0
  283. package/sources/assets/images/brutalist/Abstract-255.png +0 -0
  284. package/sources/assets/images/brutalist/Abstract-256.png +0 -0
  285. package/sources/assets/images/brutalist/Abstract-257.png +0 -0
  286. package/sources/assets/images/brutalist/Abstract-258.png +0 -0
  287. package/sources/assets/images/brutalist/Abstract-259.png +0 -0
  288. package/sources/assets/images/brutalist/Abstract-26.png +0 -0
  289. package/sources/assets/images/brutalist/Abstract-260.png +0 -0
  290. package/sources/assets/images/brutalist/Abstract-261.png +0 -0
  291. package/sources/assets/images/brutalist/Abstract-262.png +0 -0
  292. package/sources/assets/images/brutalist/Abstract-27.png +0 -0
  293. package/sources/assets/images/brutalist/Abstract-28.png +0 -0
  294. package/sources/assets/images/brutalist/Abstract-29.png +0 -0
  295. package/sources/assets/images/brutalist/Abstract-3.png +0 -0
  296. package/sources/assets/images/brutalist/Abstract-30.png +0 -0
  297. package/sources/assets/images/brutalist/Abstract-31.png +0 -0
  298. package/sources/assets/images/brutalist/Abstract-32.png +0 -0
  299. package/sources/assets/images/brutalist/Abstract-33.png +0 -0
  300. package/sources/assets/images/brutalist/Abstract-34.png +0 -0
  301. package/sources/assets/images/brutalist/Abstract-35.png +0 -0
  302. package/sources/assets/images/brutalist/Abstract-36.png +0 -0
  303. package/sources/assets/images/brutalist/Abstract-37.png +0 -0
  304. package/sources/assets/images/brutalist/Abstract-38.png +0 -0
  305. package/sources/assets/images/brutalist/Abstract-39.png +0 -0
  306. package/sources/assets/images/brutalist/Abstract-4.png +0 -0
  307. package/sources/assets/images/brutalist/Abstract-40.png +0 -0
  308. package/sources/assets/images/brutalist/Abstract-41.png +0 -0
  309. package/sources/assets/images/brutalist/Abstract-42.png +0 -0
  310. package/sources/assets/images/brutalist/Abstract-43.png +0 -0
  311. package/sources/assets/images/brutalist/Abstract-44.png +0 -0
  312. package/sources/assets/images/brutalist/Abstract-45.png +0 -0
  313. package/sources/assets/images/brutalist/Abstract-46.png +0 -0
  314. package/sources/assets/images/brutalist/Abstract-47.png +0 -0
  315. package/sources/assets/images/brutalist/Abstract-48.png +0 -0
  316. package/sources/assets/images/brutalist/Abstract-49.png +0 -0
  317. package/sources/assets/images/brutalist/Abstract-5.png +0 -0
  318. package/sources/assets/images/brutalist/Abstract-50.png +0 -0
  319. package/sources/assets/images/brutalist/Abstract-51.png +0 -0
  320. package/sources/assets/images/brutalist/Abstract-52.png +0 -0
  321. package/sources/assets/images/brutalist/Abstract-53.png +0 -0
  322. package/sources/assets/images/brutalist/Abstract-54.png +0 -0
  323. package/sources/assets/images/brutalist/Abstract-55.png +0 -0
  324. package/sources/assets/images/brutalist/Abstract-56.png +0 -0
  325. package/sources/assets/images/brutalist/Abstract-57.png +0 -0
  326. package/sources/assets/images/brutalist/Abstract-58.png +0 -0
  327. package/sources/assets/images/brutalist/Abstract-59.png +0 -0
  328. package/sources/assets/images/brutalist/Abstract-6.png +0 -0
  329. package/sources/assets/images/brutalist/Abstract-60.png +0 -0
  330. package/sources/assets/images/brutalist/Abstract-61.png +0 -0
  331. package/sources/assets/images/brutalist/Abstract-62.png +0 -0
  332. package/sources/assets/images/brutalist/Abstract-63.png +0 -0
  333. package/sources/assets/images/brutalist/Abstract-64.png +0 -0
  334. package/sources/assets/images/brutalist/Abstract-65.png +0 -0
  335. package/sources/assets/images/brutalist/Abstract-66.png +0 -0
  336. package/sources/assets/images/brutalist/Abstract-67.png +0 -0
  337. package/sources/assets/images/brutalist/Abstract-68.png +0 -0
  338. package/sources/assets/images/brutalist/Abstract-69.png +0 -0
  339. package/sources/assets/images/brutalist/Abstract-7.png +0 -0
  340. package/sources/assets/images/brutalist/Abstract-70.png +0 -0
  341. package/sources/assets/images/brutalist/Abstract-71.png +0 -0
  342. package/sources/assets/images/brutalist/Abstract-72.png +0 -0
  343. package/sources/assets/images/brutalist/Abstract-73.png +0 -0
  344. package/sources/assets/images/brutalist/Abstract-74.png +0 -0
  345. package/sources/assets/images/brutalist/Abstract-75.png +0 -0
  346. package/sources/assets/images/brutalist/Abstract-76.png +0 -0
  347. package/sources/assets/images/brutalist/Abstract-77.png +0 -0
  348. package/sources/assets/images/brutalist/Abstract-78.png +0 -0
  349. package/sources/assets/images/brutalist/Abstract-79.png +0 -0
  350. package/sources/assets/images/brutalist/Abstract-8.png +0 -0
  351. package/sources/assets/images/brutalist/Abstract-80.png +0 -0
  352. package/sources/assets/images/brutalist/Abstract-81.png +0 -0
  353. package/sources/assets/images/brutalist/Abstract-82.png +0 -0
  354. package/sources/assets/images/brutalist/Abstract-83.png +0 -0
  355. package/sources/assets/images/brutalist/Abstract-84.png +0 -0
  356. package/sources/assets/images/brutalist/Abstract-85.png +0 -0
  357. package/sources/assets/images/brutalist/Abstract-86.png +0 -0
  358. package/sources/assets/images/brutalist/Abstract-87.png +0 -0
  359. package/sources/assets/images/brutalist/Abstract-88.png +0 -0
  360. package/sources/assets/images/brutalist/Abstract-89.png +0 -0
  361. package/sources/assets/images/brutalist/Abstract-9.png +0 -0
  362. package/sources/assets/images/brutalist/Abstract-90.png +0 -0
  363. package/sources/assets/images/brutalist/Abstract-91.png +0 -0
  364. package/sources/assets/images/brutalist/Abstract-92.png +0 -0
  365. package/sources/assets/images/brutalist/Abstract-93.png +0 -0
  366. package/sources/assets/images/brutalist/Abstract-94.png +0 -0
  367. package/sources/assets/images/brutalist/Abstract-95.png +0 -0
  368. package/sources/assets/images/brutalist/Abstract-96.png +0 -0
  369. package/sources/assets/images/brutalist/Abstract-97.png +0 -0
  370. package/sources/assets/images/brutalist/Abstract-98.png +0 -0
  371. package/sources/assets/images/brutalist/Abstract-99.png +0 -0
  372. package/sources/assets/images/brutalist/Bauhaus-1.png +0 -0
  373. package/sources/assets/images/brutalist/Bauhaus-10.png +0 -0
  374. package/sources/assets/images/brutalist/Bauhaus-11.png +0 -0
  375. package/sources/assets/images/brutalist/Bauhaus-12.png +0 -0
  376. package/sources/assets/images/brutalist/Bauhaus-13.png +0 -0
  377. package/sources/assets/images/brutalist/Bauhaus-14.png +0 -0
  378. package/sources/assets/images/brutalist/Bauhaus-15.png +0 -0
  379. package/sources/assets/images/brutalist/Bauhaus-16.png +0 -0
  380. package/sources/assets/images/brutalist/Bauhaus-17.png +0 -0
  381. package/sources/assets/images/brutalist/Bauhaus-18.png +0 -0
  382. package/sources/assets/images/brutalist/Bauhaus-19.png +0 -0
  383. package/sources/assets/images/brutalist/Bauhaus-2.png +0 -0
  384. package/sources/assets/images/brutalist/Bauhaus-20.png +0 -0
  385. package/sources/assets/images/brutalist/Bauhaus-21.png +0 -0
  386. package/sources/assets/images/brutalist/Bauhaus-22.png +0 -0
  387. package/sources/assets/images/brutalist/Bauhaus-23.png +0 -0
  388. package/sources/assets/images/brutalist/Bauhaus-24.png +0 -0
  389. package/sources/assets/images/brutalist/Bauhaus-25.png +0 -0
  390. package/sources/assets/images/brutalist/Bauhaus-26.png +0 -0
  391. package/sources/assets/images/brutalist/Bauhaus-27.png +0 -0
  392. package/sources/assets/images/brutalist/Bauhaus-28.png +0 -0
  393. package/sources/assets/images/brutalist/Bauhaus-29.png +0 -0
  394. package/sources/assets/images/brutalist/Bauhaus-3.png +0 -0
  395. package/sources/assets/images/brutalist/Bauhaus-30.png +0 -0
  396. package/sources/assets/images/brutalist/Bauhaus-31.png +0 -0
  397. package/sources/assets/images/brutalist/Bauhaus-32.png +0 -0
  398. package/sources/assets/images/brutalist/Bauhaus-33.png +0 -0
  399. package/sources/assets/images/brutalist/Bauhaus-34.png +0 -0
  400. package/sources/assets/images/brutalist/Bauhaus-35.png +0 -0
  401. package/sources/assets/images/brutalist/Bauhaus-36.png +0 -0
  402. package/sources/assets/images/brutalist/Bauhaus-37.png +0 -0
  403. package/sources/assets/images/brutalist/Bauhaus-38.png +0 -0
  404. package/sources/assets/images/brutalist/Bauhaus-39.png +0 -0
  405. package/sources/assets/images/brutalist/Bauhaus-4.png +0 -0
  406. package/sources/assets/images/brutalist/Bauhaus-40.png +0 -0
  407. package/sources/assets/images/brutalist/Bauhaus-5.png +0 -0
  408. package/sources/assets/images/brutalist/Bauhaus-6.png +0 -0
  409. package/sources/assets/images/brutalist/Bauhaus-7.png +0 -0
  410. package/sources/assets/images/brutalist/Bauhaus-8.png +0 -0
  411. package/sources/assets/images/brutalist/Bauhaus-9.png +0 -0
  412. package/sources/assets/images/brutalist/Brutalism-1.png +0 -0
  413. package/sources/assets/images/brutalist/Brutalism-10.png +0 -0
  414. package/sources/assets/images/brutalist/Brutalism-100.png +0 -0
  415. package/sources/assets/images/brutalist/Brutalism-101.png +0 -0
  416. package/sources/assets/images/brutalist/Brutalism-102.png +0 -0
  417. package/sources/assets/images/brutalist/Brutalism-103.png +0 -0
  418. package/sources/assets/images/brutalist/Brutalism-104.png +0 -0
  419. package/sources/assets/images/brutalist/Brutalism-105.png +0 -0
  420. package/sources/assets/images/brutalist/Brutalism-106.png +0 -0
  421. package/sources/assets/images/brutalist/Brutalism-107.png +0 -0
  422. package/sources/assets/images/brutalist/Brutalism-108.png +0 -0
  423. package/sources/assets/images/brutalist/Brutalism-109.png +0 -0
  424. package/sources/assets/images/brutalist/Brutalism-11.png +0 -0
  425. package/sources/assets/images/brutalist/Brutalism-110.png +0 -0
  426. package/sources/assets/images/brutalist/Brutalism-111.png +0 -0
  427. package/sources/assets/images/brutalist/Brutalism-112.png +0 -0
  428. package/sources/assets/images/brutalist/Brutalism-113.png +0 -0
  429. package/sources/assets/images/brutalist/Brutalism-114.png +0 -0
  430. package/sources/assets/images/brutalist/Brutalism-115.png +0 -0
  431. package/sources/assets/images/brutalist/Brutalism-116.png +0 -0
  432. package/sources/assets/images/brutalist/Brutalism-117.png +0 -0
  433. package/sources/assets/images/brutalist/Brutalism-118.png +0 -0
  434. package/sources/assets/images/brutalist/Brutalism-12.png +0 -0
  435. package/sources/assets/images/brutalist/Brutalism-13.png +0 -0
  436. package/sources/assets/images/brutalist/Brutalism-14.png +0 -0
  437. package/sources/assets/images/brutalist/Brutalism-15.png +0 -0
  438. package/sources/assets/images/brutalist/Brutalism-16.png +0 -0
  439. package/sources/assets/images/brutalist/Brutalism-17.png +0 -0
  440. package/sources/assets/images/brutalist/Brutalism-18.png +0 -0
  441. package/sources/assets/images/brutalist/Brutalism-19.png +0 -0
  442. package/sources/assets/images/brutalist/Brutalism-2.png +0 -0
  443. package/sources/assets/images/brutalist/Brutalism-20.png +0 -0
  444. package/sources/assets/images/brutalist/Brutalism-21.png +0 -0
  445. package/sources/assets/images/brutalist/Brutalism-22.png +0 -0
  446. package/sources/assets/images/brutalist/Brutalism-23.png +0 -0
  447. package/sources/assets/images/brutalist/Brutalism-24.png +0 -0
  448. package/sources/assets/images/brutalist/Brutalism-25.png +0 -0
  449. package/sources/assets/images/brutalist/Brutalism-26.png +0 -0
  450. package/sources/assets/images/brutalist/Brutalism-27.png +0 -0
  451. package/sources/assets/images/brutalist/Brutalism-28.png +0 -0
  452. package/sources/assets/images/brutalist/Brutalism-29.png +0 -0
  453. package/sources/assets/images/brutalist/Brutalism-3.png +0 -0
  454. package/sources/assets/images/brutalist/Brutalism-30.png +0 -0
  455. package/sources/assets/images/brutalist/Brutalism-31.png +0 -0
  456. package/sources/assets/images/brutalist/Brutalism-32.png +0 -0
  457. package/sources/assets/images/brutalist/Brutalism-33.png +0 -0
  458. package/sources/assets/images/brutalist/Brutalism-34.png +0 -0
  459. package/sources/assets/images/brutalist/Brutalism-35.png +0 -0
  460. package/sources/assets/images/brutalist/Brutalism-36.png +0 -0
  461. package/sources/assets/images/brutalist/Brutalism-37.png +0 -0
  462. package/sources/assets/images/brutalist/Brutalism-38.png +0 -0
  463. package/sources/assets/images/brutalist/Brutalism-39.png +0 -0
  464. package/sources/assets/images/brutalist/Brutalism-4.png +0 -0
  465. package/sources/assets/images/brutalist/Brutalism-40.png +0 -0
  466. package/sources/assets/images/brutalist/Brutalism-41.png +0 -0
  467. package/sources/assets/images/brutalist/Brutalism-42.png +0 -0
  468. package/sources/assets/images/brutalist/Brutalism-43.png +0 -0
  469. package/sources/assets/images/brutalist/Brutalism-44.png +0 -0
  470. package/sources/assets/images/brutalist/Brutalism-45.png +0 -0
  471. package/sources/assets/images/brutalist/Brutalism-46.png +0 -0
  472. package/sources/assets/images/brutalist/Brutalism-47.png +0 -0
  473. package/sources/assets/images/brutalist/Brutalism-48.png +0 -0
  474. package/sources/assets/images/brutalist/Brutalism-49.png +0 -0
  475. package/sources/assets/images/brutalist/Brutalism-5.png +0 -0
  476. package/sources/assets/images/brutalist/Brutalism-50.png +0 -0
  477. package/sources/assets/images/brutalist/Brutalism-51.png +0 -0
  478. package/sources/assets/images/brutalist/Brutalism-52.png +0 -0
  479. package/sources/assets/images/brutalist/Brutalism-53.png +0 -0
  480. package/sources/assets/images/brutalist/Brutalism-54.png +0 -0
  481. package/sources/assets/images/brutalist/Brutalism-55.png +0 -0
  482. package/sources/assets/images/brutalist/Brutalism-56.png +0 -0
  483. package/sources/assets/images/brutalist/Brutalism-57.png +0 -0
  484. package/sources/assets/images/brutalist/Brutalism-58.png +0 -0
  485. package/sources/assets/images/brutalist/Brutalism-59.png +0 -0
  486. package/sources/assets/images/brutalist/Brutalism-6.png +0 -0
  487. package/sources/assets/images/brutalist/Brutalism-60.png +0 -0
  488. package/sources/assets/images/brutalist/Brutalism-61.png +0 -0
  489. package/sources/assets/images/brutalist/Brutalism-62.png +0 -0
  490. package/sources/assets/images/brutalist/Brutalism-63.png +0 -0
  491. package/sources/assets/images/brutalist/Brutalism-64.png +0 -0
  492. package/sources/assets/images/brutalist/Brutalism-65.png +0 -0
  493. package/sources/assets/images/brutalist/Brutalism-66.png +0 -0
  494. package/sources/assets/images/brutalist/Brutalism-67.png +0 -0
  495. package/sources/assets/images/brutalist/Brutalism-68.png +0 -0
  496. package/sources/assets/images/brutalist/Brutalism-69.png +0 -0
  497. package/sources/assets/images/brutalist/Brutalism-7.png +0 -0
  498. package/sources/assets/images/brutalist/Brutalism-70.png +0 -0
  499. package/sources/assets/images/brutalist/Brutalism-71.png +0 -0
  500. package/sources/assets/images/brutalist/Brutalism-72.png +0 -0
  501. package/sources/assets/images/brutalist/Brutalism-73.png +0 -0
  502. package/sources/assets/images/brutalist/Brutalism-74.png +0 -0
  503. package/sources/assets/images/brutalist/Brutalism-75.png +0 -0
  504. package/sources/assets/images/brutalist/Brutalism-76.png +0 -0
  505. package/sources/assets/images/brutalist/Brutalism-77.png +0 -0
  506. package/sources/assets/images/brutalist/Brutalism-78.png +0 -0
  507. package/sources/assets/images/brutalist/Brutalism-79.png +0 -0
  508. package/sources/assets/images/brutalist/Brutalism-8.png +0 -0
  509. package/sources/assets/images/brutalist/Brutalism-80.png +0 -0
  510. package/sources/assets/images/brutalist/Brutalism-81.png +0 -0
  511. package/sources/assets/images/brutalist/Brutalism-82.png +0 -0
  512. package/sources/assets/images/brutalist/Brutalism-83.png +0 -0
  513. package/sources/assets/images/brutalist/Brutalism-84.png +0 -0
  514. package/sources/assets/images/brutalist/Brutalism-85.png +0 -0
  515. package/sources/assets/images/brutalist/Brutalism-86.png +0 -0
  516. package/sources/assets/images/brutalist/Brutalism-87.png +0 -0
  517. package/sources/assets/images/brutalist/Brutalism-88.png +0 -0
  518. package/sources/assets/images/brutalist/Brutalism-89.png +0 -0
  519. package/sources/assets/images/brutalist/Brutalism-9.png +0 -0
  520. package/sources/assets/images/brutalist/Brutalism-90.png +0 -0
  521. package/sources/assets/images/brutalist/Brutalism-91.png +0 -0
  522. package/sources/assets/images/brutalist/Brutalism-92.png +0 -0
  523. package/sources/assets/images/brutalist/Brutalism-93.png +0 -0
  524. package/sources/assets/images/brutalist/Brutalism-94.png +0 -0
  525. package/sources/assets/images/brutalist/Brutalism-95.png +0 -0
  526. package/sources/assets/images/brutalist/Brutalism-96.png +0 -0
  527. package/sources/assets/images/brutalist/Brutalism-97.png +0 -0
  528. package/sources/assets/images/brutalist/Brutalism-98.png +0 -0
  529. package/sources/assets/images/brutalist/Brutalism-99.png +0 -0
  530. package/sources/assets/images/favicon-active.png +0 -0
  531. package/sources/assets/images/favicon.png +0 -0
  532. package/sources/assets/images/gradients/01.png +0 -0
  533. package/sources/assets/images/gradients/02.png +0 -0
  534. package/sources/assets/images/gradients/03.png +0 -0
  535. package/sources/assets/images/gradients/04.png +0 -0
  536. package/sources/assets/images/gradients/05.png +0 -0
  537. package/sources/assets/images/gradients/06.png +0 -0
  538. package/sources/assets/images/gradients/07.png +0 -0
  539. package/sources/assets/images/gradients/08.png +0 -0
  540. package/sources/assets/images/gradients/09.png +0 -0
  541. package/sources/assets/images/gradients/10.png +0 -0
  542. package/sources/assets/images/gradients/100.png +0 -0
  543. package/sources/assets/images/gradients/11.png +0 -0
  544. package/sources/assets/images/gradients/12.png +0 -0
  545. package/sources/assets/images/gradients/13.png +0 -0
  546. package/sources/assets/images/gradients/14.png +0 -0
  547. package/sources/assets/images/gradients/15.png +0 -0
  548. package/sources/assets/images/gradients/16.png +0 -0
  549. package/sources/assets/images/gradients/17.png +0 -0
  550. package/sources/assets/images/gradients/18.png +0 -0
  551. package/sources/assets/images/gradients/19.png +0 -0
  552. package/sources/assets/images/gradients/20.png +0 -0
  553. package/sources/assets/images/gradients/21.png +0 -0
  554. package/sources/assets/images/gradients/22.png +0 -0
  555. package/sources/assets/images/gradients/23.png +0 -0
  556. package/sources/assets/images/gradients/24.png +0 -0
  557. package/sources/assets/images/gradients/25.png +0 -0
  558. package/sources/assets/images/gradients/26.png +0 -0
  559. package/sources/assets/images/gradients/27.png +0 -0
  560. package/sources/assets/images/gradients/28.png +0 -0
  561. package/sources/assets/images/gradients/29.png +0 -0
  562. package/sources/assets/images/gradients/30.png +0 -0
  563. package/sources/assets/images/gradients/31.png +0 -0
  564. package/sources/assets/images/gradients/32.png +0 -0
  565. package/sources/assets/images/gradients/33.png +0 -0
  566. package/sources/assets/images/gradients/34.png +0 -0
  567. package/sources/assets/images/gradients/35.png +0 -0
  568. package/sources/assets/images/gradients/36.png +0 -0
  569. package/sources/assets/images/gradients/37.png +0 -0
  570. package/sources/assets/images/gradients/38.png +0 -0
  571. package/sources/assets/images/gradients/39.png +0 -0
  572. package/sources/assets/images/gradients/40.png +0 -0
  573. package/sources/assets/images/gradients/41.png +0 -0
  574. package/sources/assets/images/gradients/42.png +0 -0
  575. package/sources/assets/images/gradients/43.png +0 -0
  576. package/sources/assets/images/gradients/44.png +0 -0
  577. package/sources/assets/images/gradients/45.png +0 -0
  578. package/sources/assets/images/gradients/46.png +0 -0
  579. package/sources/assets/images/gradients/47.png +0 -0
  580. package/sources/assets/images/gradients/48.png +0 -0
  581. package/sources/assets/images/gradients/49.png +0 -0
  582. package/sources/assets/images/gradients/50.png +0 -0
  583. package/sources/assets/images/gradients/51.png +0 -0
  584. package/sources/assets/images/gradients/52.png +0 -0
  585. package/sources/assets/images/gradients/53.png +0 -0
  586. package/sources/assets/images/gradients/54.png +0 -0
  587. package/sources/assets/images/gradients/55.png +0 -0
  588. package/sources/assets/images/gradients/56.png +0 -0
  589. package/sources/assets/images/gradients/57.png +0 -0
  590. package/sources/assets/images/gradients/58.png +0 -0
  591. package/sources/assets/images/gradients/59.png +0 -0
  592. package/sources/assets/images/gradients/60.png +0 -0
  593. package/sources/assets/images/gradients/61.png +0 -0
  594. package/sources/assets/images/gradients/62.png +0 -0
  595. package/sources/assets/images/gradients/63.png +0 -0
  596. package/sources/assets/images/gradients/64.png +0 -0
  597. package/sources/assets/images/gradients/65.png +0 -0
  598. package/sources/assets/images/gradients/66.png +0 -0
  599. package/sources/assets/images/gradients/67.png +0 -0
  600. package/sources/assets/images/gradients/68.png +0 -0
  601. package/sources/assets/images/gradients/69.png +0 -0
  602. package/sources/assets/images/gradients/70.png +0 -0
  603. package/sources/assets/images/gradients/71.png +0 -0
  604. package/sources/assets/images/gradients/72.png +0 -0
  605. package/sources/assets/images/gradients/73.png +0 -0
  606. package/sources/assets/images/gradients/74.png +0 -0
  607. package/sources/assets/images/gradients/75.png +0 -0
  608. package/sources/assets/images/gradients/76.png +0 -0
  609. package/sources/assets/images/gradients/77.png +0 -0
  610. package/sources/assets/images/gradients/78.png +0 -0
  611. package/sources/assets/images/gradients/79.png +0 -0
  612. package/sources/assets/images/gradients/80.png +0 -0
  613. package/sources/assets/images/gradients/81.png +0 -0
  614. package/sources/assets/images/gradients/82.png +0 -0
  615. package/sources/assets/images/gradients/83.png +0 -0
  616. package/sources/assets/images/gradients/84.png +0 -0
  617. package/sources/assets/images/gradients/85.png +0 -0
  618. package/sources/assets/images/gradients/86.png +0 -0
  619. package/sources/assets/images/gradients/87.png +0 -0
  620. package/sources/assets/images/gradients/88.png +0 -0
  621. package/sources/assets/images/gradients/89.png +0 -0
  622. package/sources/assets/images/gradients/90.png +0 -0
  623. package/sources/assets/images/gradients/91.png +0 -0
  624. package/sources/assets/images/gradients/92.png +0 -0
  625. package/sources/assets/images/gradients/93.png +0 -0
  626. package/sources/assets/images/gradients/94.png +0 -0
  627. package/sources/assets/images/gradients/95.png +0 -0
  628. package/sources/assets/images/gradients/96.png +0 -0
  629. package/sources/assets/images/gradients/97.png +0 -0
  630. package/sources/assets/images/gradients/98.png +0 -0
  631. package/sources/assets/images/gradients/99.png +0 -0
  632. package/sources/assets/images/icon-adaptive.png +0 -0
  633. package/sources/assets/images/icon-claude.png +0 -0
  634. package/sources/assets/images/icon-claude@2x.png +0 -0
  635. package/sources/assets/images/icon-claude@3x.png +0 -0
  636. package/sources/assets/images/icon-gemini.png +0 -0
  637. package/sources/assets/images/icon-gemini@2x.png +0 -0
  638. package/sources/assets/images/icon-gemini@3x.png +0 -0
  639. package/sources/assets/images/icon-gpt.png +0 -0
  640. package/sources/assets/images/icon-gpt@2x.png +0 -0
  641. package/sources/assets/images/icon-gpt@3x.png +0 -0
  642. package/sources/assets/images/icon-monochrome.png +0 -0
  643. package/sources/assets/images/icon-notification.png +0 -0
  644. package/sources/assets/images/icon-openclaw.png +0 -0
  645. package/sources/assets/images/icon-openclaw@2x.png +0 -0
  646. package/sources/assets/images/icon-openclaw@3x.png +0 -0
  647. package/sources/assets/images/icon-tauri.png +0 -0
  648. package/sources/assets/images/icon-voice-white.png +0 -0
  649. package/sources/assets/images/icon-voice.png +0 -0
  650. package/sources/assets/images/icon-voice@2x.png +0 -0
  651. package/sources/assets/images/icon-voice@3x.png +0 -0
  652. package/sources/assets/images/icon.png +0 -0
  653. package/sources/assets/images/logo-black.png +0 -0
  654. package/sources/assets/images/logo-white.png +0 -0
  655. package/sources/assets/images/logotype-dark.png +0 -0
  656. package/sources/assets/images/logotype-dark@2x.png +0 -0
  657. package/sources/assets/images/logotype-dark@3x.png +0 -0
  658. package/sources/assets/images/logotype-light.png +0 -0
  659. package/sources/assets/images/logotype-light@2x.png +0 -0
  660. package/sources/assets/images/logotype-light@3x.png +0 -0
  661. package/sources/assets/images/logotype.png +0 -0
  662. package/sources/assets/images/logotype@2x.png +0 -0
  663. package/sources/assets/images/logotype@3x.png +0 -0
  664. package/sources/assets/images/splash-android-dark.png +0 -0
  665. package/sources/assets/images/splash-android-light.png +0 -0
  666. package/sources/assets/images/transparent.png +0 -0
  667. package/sources/assets/images/zen-icon.png +0 -0
  668. package/sources/auth/AuthContext.tsx +100 -0
  669. package/sources/auth/authAccountApprove.ts +2 -0
  670. package/sources/auth/authApprove.ts +2 -0
  671. package/sources/auth/authChallenge.ts +8 -0
  672. package/sources/auth/authGetToken.ts +4 -0
  673. package/sources/auth/authQRStart.ts +17 -0
  674. package/sources/auth/authQRWait.ts +13 -0
  675. package/sources/auth/secretKeyBackup.spec.ts +465 -0
  676. package/sources/auth/secretKeyBackup.ts +179 -0
  677. package/sources/auth/tokenStorage.ts +27 -0
  678. package/sources/changelog/changelog.json +60 -0
  679. package/sources/changelog/index.ts +3 -0
  680. package/sources/changelog/parser.ts +23 -0
  681. package/sources/changelog/storage.ts +17 -0
  682. package/sources/changelog/types.ts +10 -0
  683. package/sources/components/ActiveSessionsGroupCompact.tsx +567 -0
  684. package/sources/components/AgentContentView.ios.tsx +70 -0
  685. package/sources/components/AgentContentView.tsx +48 -0
  686. package/sources/components/AgentInput.tsx +1468 -0
  687. package/sources/components/AgentInputAttachmentStrip.tsx +122 -0
  688. package/sources/components/AgentInputAutocomplete.tsx +96 -0
  689. package/sources/components/AgentInputSuggestionView.tsx +106 -0
  690. package/sources/components/AllFilesDiffView.tsx +515 -0
  691. package/sources/components/Avatar.tsx +149 -0
  692. package/sources/components/AvatarBrutalist.tsx +501 -0
  693. package/sources/components/AvatarGradient.tsx +147 -0
  694. package/sources/components/AvatarSkia.tsx +111 -0
  695. package/sources/components/AvatarSkia.web.tsx +113 -0
  696. package/sources/components/ChatFooter.tsx +50 -0
  697. package/sources/components/ChatHeaderView.tsx +180 -0
  698. package/sources/components/ChatList.tsx +283 -0
  699. package/sources/components/CodeEditor.tsx +22 -0
  700. package/sources/components/CodeEditor.web.tsx +180 -0
  701. package/sources/components/CodeView.tsx +33 -0
  702. package/sources/components/CommandPalette/CommandPalette.tsx +72 -0
  703. package/sources/components/CommandPalette/CommandPaletteInput.tsx +65 -0
  704. package/sources/components/CommandPalette/CommandPaletteItem.tsx +141 -0
  705. package/sources/components/CommandPalette/CommandPaletteModal.tsx +148 -0
  706. package/sources/components/CommandPalette/CommandPaletteProvider.tsx +141 -0
  707. package/sources/components/CommandPalette/CommandPaletteResults.tsx +129 -0
  708. package/sources/components/CommandPalette/index.ts +3 -0
  709. package/sources/components/CommandPalette/types.ts +15 -0
  710. package/sources/components/CommandPalette/useCommandPalette.ts +107 -0
  711. package/sources/components/CommandView.tsx +135 -0
  712. package/sources/components/CompactGitStatus.tsx +88 -0
  713. package/sources/components/ConnectButton.tsx +117 -0
  714. package/sources/components/Deferred.tsx +18 -0
  715. package/sources/components/DuplicateSheet.tsx +295 -0
  716. package/sources/components/EmptyMainScreen.tsx +171 -0
  717. package/sources/components/EmptyMessages.tsx +123 -0
  718. package/sources/components/EmptySessionsTablet.tsx +111 -0
  719. package/sources/components/ExternalLink.tsx +22 -0
  720. package/sources/components/FAB.tsx +53 -0
  721. package/sources/components/FABWide.tsx +59 -0
  722. package/sources/components/FeedItemCard.tsx +98 -0
  723. package/sources/components/FileIcon.tsx +63 -0
  724. package/sources/components/FileViewPanel.tsx +673 -0
  725. package/sources/components/FilesSidebar.tsx +739 -0
  726. package/sources/components/FloatingOverlay.tsx +48 -0
  727. package/sources/components/GitStatusBadge.tsx +82 -0
  728. package/sources/components/HeaderLogo.tsx +28 -0
  729. package/sources/components/HomeHeader.tsx +243 -0
  730. package/sources/components/HorizontalScrollView.tsx +88 -0
  731. package/sources/components/InboxView.tsx +260 -0
  732. package/sources/components/InlineFileDiff.tsx +277 -0
  733. package/sources/components/Item.tsx +315 -0
  734. package/sources/components/ItemGroup.tsx +147 -0
  735. package/sources/components/ItemList.tsx +102 -0
  736. package/sources/components/MainView.tsx +324 -0
  737. package/sources/components/MessageView.tsx +299 -0
  738. package/sources/components/MultiTextInput.tsx +285 -0
  739. package/sources/components/MultiTextInput.web.tsx +220 -0
  740. package/sources/components/OAuthView.tsx +374 -0
  741. package/sources/components/PermissionModeSelector.tsx +68 -0
  742. package/sources/components/PlaceholderContainerView.tsx +47 -0
  743. package/sources/components/PlusPlus.tsx +34 -0
  744. package/sources/components/PlusPlus.web.tsx +34 -0
  745. package/sources/components/ProjectGitStatus.tsx +102 -0
  746. package/sources/components/RoundButton.tsx +130 -0
  747. package/sources/components/SearchableListSelector.tsx +675 -0
  748. package/sources/components/SessionActionsNativeMenu.android.tsx +58 -0
  749. package/sources/components/SessionActionsNativeMenu.ios.tsx +55 -0
  750. package/sources/components/SessionActionsNativeMenu.tsx +20 -0
  751. package/sources/components/SessionActionsNativeMenu.web.tsx +13 -0
  752. package/sources/components/SessionActionsPopover.tsx +240 -0
  753. package/sources/components/SessionsList.tsx +471 -0
  754. package/sources/components/SessionsListWrapper.tsx +72 -0
  755. package/sources/components/SettingsView.tsx +470 -0
  756. package/sources/components/SettingsViewWrapper.tsx +21 -0
  757. package/sources/components/Shaker.tsx +42 -0
  758. package/sources/components/Shaker.web.tsx +46 -0
  759. package/sources/components/ShimmerView.tsx +106 -0
  760. package/sources/components/SidebarNavigator.tsx +218 -0
  761. package/sources/components/SidebarView.tsx +104 -0
  762. package/sources/components/SimpleSyntaxHighlighter.tsx +322 -0
  763. package/sources/components/StatusBarProvider.tsx +12 -0
  764. package/sources/components/StatusDot.tsx +49 -0
  765. package/sources/components/StyledText.tsx +35 -0
  766. package/sources/components/Switch.tsx +20 -0
  767. package/sources/components/TabBar.tsx +140 -0
  768. package/sources/components/ToolGroupView.tsx +101 -0
  769. package/sources/components/TransitionStack.tsx +14 -0
  770. package/sources/components/UpdateBanner.tsx +74 -0
  771. package/sources/components/UserCard.tsx +41 -0
  772. package/sources/components/UserSearchResult.tsx +129 -0
  773. package/sources/components/VoiceAssistantStatusBar.tsx +260 -0
  774. package/sources/components/VoiceBars.tsx +95 -0
  775. package/sources/components/autocomplete/applySuggestion.test.ts +194 -0
  776. package/sources/components/autocomplete/applySuggestion.ts +61 -0
  777. package/sources/components/autocomplete/findActiveWord.test.ts +365 -0
  778. package/sources/components/autocomplete/findActiveWord.ts +207 -0
  779. package/sources/components/autocomplete/suggestions.ts +79 -0
  780. package/sources/components/autocomplete/useActiveSuggestions.ts +130 -0
  781. package/sources/components/autocomplete/useActiveWord.ts +19 -0
  782. package/sources/components/diff/DiffView.tsx +188 -0
  783. package/sources/components/diff/PierreDiffView.tsx +253 -0
  784. package/sources/components/diff/calculateDiff.ts +317 -0
  785. package/sources/components/entityColor.ts +51 -0
  786. package/sources/components/haptics.ts +9 -0
  787. package/sources/components/haptics.web.ts +7 -0
  788. package/sources/components/layout.ts +44 -0
  789. package/sources/components/markdown/MarkdownView.tsx +670 -0
  790. package/sources/components/markdown/MermaidRenderer.tsx +233 -0
  791. package/sources/components/markdown/linkUtils.test.ts +17 -0
  792. package/sources/components/markdown/linkUtils.ts +5 -0
  793. package/sources/components/markdown/parseMarkdown.test.ts +64 -0
  794. package/sources/components/markdown/parseMarkdown.ts +46 -0
  795. package/sources/components/markdown/parseMarkdownBlock.test.ts +108 -0
  796. package/sources/components/markdown/parseMarkdownBlock.ts +200 -0
  797. package/sources/components/markdown/parseMarkdownSpans.ts +88 -0
  798. package/sources/components/modelModeOptions.test.ts +114 -0
  799. package/sources/components/modelModeOptions.ts +257 -0
  800. package/sources/components/navigation/Header.tsx +252 -0
  801. package/sources/components/parseLocalCommandMessage.spec.ts +96 -0
  802. package/sources/components/parseLocalCommandMessage.ts +97 -0
  803. package/sources/components/qr/QRCode.tsx +178 -0
  804. package/sources/components/qr/QRCode.web.tsx +229 -0
  805. package/sources/components/qr/index.ts +2 -0
  806. package/sources/components/qr/qrMatrix.ts +48 -0
  807. package/sources/components/tools/PermissionFooter.tsx +527 -0
  808. package/sources/components/tools/ToolDiffView.tsx +60 -0
  809. package/sources/components/tools/ToolError.tsx +49 -0
  810. package/sources/components/tools/ToolFullView.tsx +193 -0
  811. package/sources/components/tools/ToolHeader.tsx +93 -0
  812. package/sources/components/tools/ToolSectionView.tsx +42 -0
  813. package/sources/components/tools/ToolStatusIndicator.tsx +36 -0
  814. package/sources/components/tools/ToolView.tsx +340 -0
  815. package/sources/components/tools/knownTools.tsx +957 -0
  816. package/sources/components/tools/views/AskUserQuestionView.tsx +357 -0
  817. package/sources/components/tools/views/BashView.tsx +47 -0
  818. package/sources/components/tools/views/BashViewFull.tsx +81 -0
  819. package/sources/components/tools/views/CodexBashView.tsx +126 -0
  820. package/sources/components/tools/views/CodexDiffView.tsx +79 -0
  821. package/sources/components/tools/views/CodexPatchView.tsx +186 -0
  822. package/sources/components/tools/views/EditView.tsx +33 -0
  823. package/sources/components/tools/views/EditViewFull.tsx +38 -0
  824. package/sources/components/tools/views/ExitPlanToolView.tsx +21 -0
  825. package/sources/components/tools/views/FileView.tsx +118 -0
  826. package/sources/components/tools/views/GeminiEditView.tsx +75 -0
  827. package/sources/components/tools/views/GeminiExecuteView.tsx +92 -0
  828. package/sources/components/tools/views/MCPToolView.tsx +31 -0
  829. package/sources/components/tools/views/MultiEditView.tsx +41 -0
  830. package/sources/components/tools/views/MultiEditViewFull.tsx +84 -0
  831. package/sources/components/tools/views/TaskView.tsx +129 -0
  832. package/sources/components/tools/views/TodoView.tsx +90 -0
  833. package/sources/components/tools/views/WriteView.tsx +29 -0
  834. package/sources/components/tools/views/_all.tsx +88 -0
  835. package/sources/components/usage/UsageBar.tsx +80 -0
  836. package/sources/components/usage/UsageChart.tsx +164 -0
  837. package/sources/components/usage/UsagePanel.tsx +283 -0
  838. package/sources/components/web/FaviconPermissionIndicator.tsx +44 -0
  839. package/sources/config.ts +3 -0
  840. package/sources/constants/Languages.ts +116 -0
  841. package/sources/constants/Typography.ts +116 -0
  842. package/sources/dev/testRunner.ts +277 -0
  843. package/sources/docs/autocomplete-text-manipulation.md +224 -0
  844. package/sources/encryption/aes.appspec.ts +25 -0
  845. package/sources/encryption/aes.ts +21 -0
  846. package/sources/encryption/aes.web.test.ts +73 -0
  847. package/sources/encryption/aes.web.ts +79 -0
  848. package/sources/encryption/base64.appspec.ts +240 -0
  849. package/sources/encryption/base64.native.ts +12 -0
  850. package/sources/encryption/base64.ts +46 -0
  851. package/sources/encryption/blob.test.ts +120 -0
  852. package/sources/encryption/blob.ts +58 -0
  853. package/sources/encryption/deriveKey.appspec.ts +72 -0
  854. package/sources/encryption/deriveKey.ts +46 -0
  855. package/sources/encryption/hex.ts +17 -0
  856. package/sources/encryption/hmac_sha512.appspec.ts +40 -0
  857. package/sources/encryption/hmac_sha512.ts +42 -0
  858. package/sources/encryption/libsodium.lib.ts +2 -0
  859. package/sources/encryption/libsodium.lib.web.ts +2 -0
  860. package/sources/encryption/libsodium.ts +58 -0
  861. package/sources/encryption/text.test.ts +61 -0
  862. package/sources/encryption/text.ts +11 -0
  863. package/sources/hooks/useAsyncCommand.ts +25 -0
  864. package/sources/hooks/useAttachmentImage.ts +134 -0
  865. package/sources/hooks/useAutocomplete.ts +69 -0
  866. package/sources/hooks/useAutocompleteSession.ts +53 -0
  867. package/sources/hooks/useChangelog.ts +45 -0
  868. package/sources/hooks/useCheckCameraPermissions.ts +25 -0
  869. package/sources/hooks/useConnectAccount.ts +107 -0
  870. package/sources/hooks/useConnectTerminal.ts +112 -0
  871. package/sources/hooks/useDemoMessages.ts +48 -0
  872. package/sources/hooks/useDraft.ts +120 -0
  873. package/sources/hooks/useElapsedTime.ts +36 -0
  874. package/sources/hooks/useGetPath.ts +13 -0
  875. package/sources/hooks/useGitStatusFiles.ts +45 -0
  876. package/sources/hooks/useGlobalKeyboard.ts +29 -0
  877. package/sources/hooks/useGroupedMessages.ts +149 -0
  878. package/sources/hooks/useImagePicker.ts +135 -0
  879. package/sources/hooks/useInboxHasContent.ts +19 -0
  880. package/sources/hooks/useMultiClick.ts +56 -0
  881. package/sources/hooks/useNasTechAction.ts +45 -0
  882. package/sources/hooks/useNativeUpdate.ts +10 -0
  883. package/sources/hooks/useNavigateToSession.ts +20 -0
  884. package/sources/hooks/useNewSessionDraft.ts +70 -0
  885. package/sources/hooks/usePrefetchFileContents.ts +162 -0
  886. package/sources/hooks/useSearch.ts +120 -0
  887. package/sources/hooks/useSessionQuickActions.ts +325 -0
  888. package/sources/hooks/useTauriDrag.ts +76 -0
  889. package/sources/hooks/useTauriZoom.ts +67 -0
  890. package/sources/hooks/useUpdates.ts +84 -0
  891. package/sources/hooks/useVisibleSessionListViewData.ts +65 -0
  892. package/sources/hooks/useWorktreeCleanup.ts +69 -0
  893. package/sources/log.ts +108 -0
  894. package/sources/modal/ModalManager.ts +203 -0
  895. package/sources/modal/ModalProvider.tsx +103 -0
  896. package/sources/modal/components/BaseModal.tsx +122 -0
  897. package/sources/modal/components/CustomModal.tsx +42 -0
  898. package/sources/modal/components/WebAlertModal.tsx +139 -0
  899. package/sources/modal/components/WebPromptModal.tsx +185 -0
  900. package/sources/modal/index.ts +3 -0
  901. package/sources/modal/types.ts +79 -0
  902. package/sources/nastech-wire/index.ts +10 -0
  903. package/sources/nastech-wire/legacyProtocol.ts +27 -0
  904. package/sources/nastech-wire/messageMeta.ts +14 -0
  905. package/sources/nastech-wire/messages.ts +113 -0
  906. package/sources/nastech-wire/sessionProtocol.ts +134 -0
  907. package/sources/nastech-wire/voice.ts +34 -0
  908. package/sources/polyfills/screenOrientation.ts +33 -0
  909. package/sources/realtime/RealtimeProvider.tsx +20 -0
  910. package/sources/realtime/RealtimeProvider.web.tsx +15 -0
  911. package/sources/realtime/RealtimeSession.ts +200 -0
  912. package/sources/realtime/RealtimeVoiceSession.tsx +211 -0
  913. package/sources/realtime/RealtimeVoiceSession.web.tsx +209 -0
  914. package/sources/realtime/hooks/contextFormatters.ts +127 -0
  915. package/sources/realtime/hooks/voiceHooks.ts +232 -0
  916. package/sources/realtime/realtimeClientTools.ts +94 -0
  917. package/sources/realtime/types.ts +19 -0
  918. package/sources/realtime/voiceConfig.ts +31 -0
  919. package/sources/realtime/voiceExperiment.ts +91 -0
  920. package/sources/realtime/voiceSystemPrompt.ts +75 -0
  921. package/sources/scripts/compareTranslations.ts +217 -0
  922. package/sources/scripts/parseChangelog.ts +87 -0
  923. package/sources/sync/__testdata__/trace_0.json +3986 -0
  924. package/sources/sync/__testdata__/trace_1.json +1391 -0
  925. package/sources/sync/__testdata__/trace_2.json +182 -0
  926. package/sources/sync/agentDefaults.ts +108 -0
  927. package/sources/sync/apiArtifacts.ts +143 -0
  928. package/sources/sync/apiAttachments.ts +217 -0
  929. package/sources/sync/apiFeed.ts +60 -0
  930. package/sources/sync/apiFriends.ts +217 -0
  931. package/sources/sync/apiGithub.spec.ts +97 -0
  932. package/sources/sync/apiGithub.ts +103 -0
  933. package/sources/sync/apiKv.ts +270 -0
  934. package/sources/sync/apiPush.ts +83 -0
  935. package/sources/sync/apiServices.ts +64 -0
  936. package/sources/sync/apiSocket.ts +290 -0
  937. package/sources/sync/apiTypes.spec.ts +23 -0
  938. package/sources/sync/apiTypes.ts +213 -0
  939. package/sources/sync/apiUsage.ts +130 -0
  940. package/sources/sync/apiVoice.ts +57 -0
  941. package/sources/sync/appConfig.ts +95 -0
  942. package/sources/sync/artifactTypes.ts +85 -0
  943. package/sources/sync/attachmentTypes.ts +28 -0
  944. package/sources/sync/encryption/artifactEncryption.ts +83 -0
  945. package/sources/sync/encryption/encryption.ts +220 -0
  946. package/sources/sync/encryption/encryptionCache.ts +248 -0
  947. package/sources/sync/encryption/encryptor.appspec.ts +409 -0
  948. package/sources/sync/encryption/encryptor.ts +126 -0
  949. package/sources/sync/encryption/machineEncryption.ts +122 -0
  950. package/sources/sync/encryption/sessionEncryption.ts +207 -0
  951. package/sources/sync/feedTypes.ts +43 -0
  952. package/sources/sync/friendTypes.ts +92 -0
  953. package/sources/sync/git-parsers/LineParser.ts +62 -0
  954. package/sources/sync/git-parsers/parseBranch.ts +97 -0
  955. package/sources/sync/git-parsers/parseDiff.ts +180 -0
  956. package/sources/sync/git-parsers/parseStatus.ts +162 -0
  957. package/sources/sync/git-parsers/parseStatusV2.ts +307 -0
  958. package/sources/sync/gitStatusFiles.ts +185 -0
  959. package/sources/sync/gitStatusSync.ts +282 -0
  960. package/sources/sync/localSettings.ts +67 -0
  961. package/sources/sync/messageMeta.test.ts +87 -0
  962. package/sources/sync/messageMeta.ts +36 -0
  963. package/sources/sync/modeHacks.test.ts +29 -0
  964. package/sources/sync/modeHacks.ts +22 -0
  965. package/sources/sync/nastechApi.ts +124 -0
  966. package/sources/sync/ops.ts +776 -0
  967. package/sources/sync/persistence.ts +322 -0
  968. package/sources/sync/profile.ts +95 -0
  969. package/sources/sync/projectFiles.ts +54 -0
  970. package/sources/sync/prompt/systemPrompt.ts +20 -0
  971. package/sources/sync/purchases.ts +67 -0
  972. package/sources/sync/pushRegistration.ts +229 -0
  973. package/sources/sync/reducer/activityUpdateAccumulator.test.ts +492 -0
  974. package/sources/sync/reducer/activityUpdateAccumulator.ts +96 -0
  975. package/sources/sync/reducer/messageToEvent.ts +85 -0
  976. package/sources/sync/reducer/phase0-skipping.spec.ts +206 -0
  977. package/sources/sync/reducer/reducer.spec.ts +3169 -0
  978. package/sources/sync/reducer/reducer.ts +1214 -0
  979. package/sources/sync/reducer/reducerTracer.spec.ts +502 -0
  980. package/sources/sync/reducer/reducerTracer.ts +310 -0
  981. package/sources/sync/revenueCat/index.ts +21 -0
  982. package/sources/sync/revenueCat/revenueCat.ts +215 -0
  983. package/sources/sync/revenueCat/revenueCat.web.ts +238 -0
  984. package/sources/sync/revenueCat/types.ts +82 -0
  985. package/sources/sync/serverConfig.ts +72 -0
  986. package/sources/sync/settings.spec.ts +456 -0
  987. package/sources/sync/settings.ts +186 -0
  988. package/sources/sync/storage.ts +1653 -0
  989. package/sources/sync/storageTypes.spec.ts +24 -0
  990. package/sources/sync/storageTypes.ts +215 -0
  991. package/sources/sync/suggestionCommands.ts +149 -0
  992. package/sources/sync/suggestionFile.ts +206 -0
  993. package/sources/sync/sync.ts +2555 -0
  994. package/sources/sync/typesMessage.ts +69 -0
  995. package/sources/sync/typesMessageMeta.test.ts +14 -0
  996. package/sources/sync/typesMessageMeta.ts +17 -0
  997. package/sources/sync/typesRaw.spec.ts +2010 -0
  998. package/sources/sync/typesRaw.ts +1183 -0
  999. package/sources/sync/uploadFormFile.ts +29 -0
  1000. package/sources/sync/uploadFormFile.web.ts +14 -0
  1001. package/sources/sync/webTabTitle.ts +58 -0
  1002. package/sources/text/README.md +223 -0
  1003. package/sources/text/_all.ts +104 -0
  1004. package/sources/text/_default.ts +1015 -0
  1005. package/sources/text/index.ts +215 -0
  1006. package/sources/text/translations/ca.ts +993 -0
  1007. package/sources/text/translations/en.ts +1009 -0
  1008. package/sources/text/translations/es.ts +995 -0
  1009. package/sources/text/translations/it.ts +992 -0
  1010. package/sources/text/translations/ja.ts +993 -0
  1011. package/sources/text/translations/pl.ts +1024 -0
  1012. package/sources/text/translations/pt.ts +992 -0
  1013. package/sources/text/translations/ru.ts +1023 -0
  1014. package/sources/text/translations/zh-Hans.ts +992 -0
  1015. package/sources/text/translations/zh-Hant.ts +991 -0
  1016. package/sources/theme.css +72 -0
  1017. package/sources/theme.dark.json +31 -0
  1018. package/sources/theme.figma.json +457 -0
  1019. package/sources/theme.gen.ts +10 -0
  1020. package/sources/theme.light.json +31 -0
  1021. package/sources/theme.ts +452 -0
  1022. package/sources/track/index.ts +171 -0
  1023. package/sources/track/tracking.ts +12 -0
  1024. package/sources/track/useTrackScreens.ts +10 -0
  1025. package/sources/types/react-native-webrtc-web-shim.d.ts +6 -0
  1026. package/sources/unistyles.ts +97 -0
  1027. package/sources/utils/codexUnifiedDiff.spec.ts +43 -0
  1028. package/sources/utils/codexUnifiedDiff.ts +70 -0
  1029. package/sources/utils/consoleLogging.ts +145 -0
  1030. package/sources/utils/copySessionMetadataToClipboard.ts +53 -0
  1031. package/sources/utils/debounce.test.ts +646 -0
  1032. package/sources/utils/debounce.ts +122 -0
  1033. package/sources/utils/deviceCalculations.test.ts +318 -0
  1034. package/sources/utils/deviceCalculations.ts +87 -0
  1035. package/sources/utils/errors.ts +10 -0
  1036. package/sources/utils/formatPermissionParams.ts +23 -0
  1037. package/sources/utils/isTauri.ts +7 -0
  1038. package/sources/utils/loadSkia.ts +3 -0
  1039. package/sources/utils/loadSkia.web.ts +5 -0
  1040. package/sources/utils/lock.ts +40 -0
  1041. package/sources/utils/machineUtils.ts +6 -0
  1042. package/sources/utils/messageUtils.ts +254 -0
  1043. package/sources/utils/microphonePermissions.ts +109 -0
  1044. package/sources/utils/notificationRouting.test.ts +51 -0
  1045. package/sources/utils/notificationRouting.ts +81 -0
  1046. package/sources/utils/oauth.ts +143 -0
  1047. package/sources/utils/openExternalUrl.ts +19 -0
  1048. package/sources/utils/parseToken.ts +23 -0
  1049. package/sources/utils/pasteImages.web.ts +81 -0
  1050. package/sources/utils/pathUtils.spec.ts +226 -0
  1051. package/sources/utils/pathUtils.ts +75 -0
  1052. package/sources/utils/platform.ts +19 -0
  1053. package/sources/utils/readFileBytes.ts +11 -0
  1054. package/sources/utils/readFileBytes.web.ts +12 -0
  1055. package/sources/utils/requestReview.ts +135 -0
  1056. package/sources/utils/responsive.ts +87 -0
  1057. package/sources/utils/resumeCommand.test.ts +78 -0
  1058. package/sources/utils/resumeCommand.ts +70 -0
  1059. package/sources/utils/sessionFileLinks.test.ts +112 -0
  1060. package/sources/utils/sessionFileLinks.ts +388 -0
  1061. package/sources/utils/sessionUtils.ts +226 -0
  1062. package/sources/utils/stringUtils.ts +41 -0
  1063. package/sources/utils/sync.ts +164 -0
  1064. package/sources/utils/thumbhash.ts +17 -0
  1065. package/sources/utils/thumbhash.web.ts +85 -0
  1066. package/sources/utils/time.ts +41 -0
  1067. package/sources/utils/toSnakeCase.test.ts +182 -0
  1068. package/sources/utils/toSnakeCase.ts +40 -0
  1069. package/sources/utils/toolCommand.test.ts +23 -0
  1070. package/sources/utils/toolCommand.ts +35 -0
  1071. package/sources/utils/toolComparison.test.ts +101 -0
  1072. package/sources/utils/toolComparison.ts +73 -0
  1073. package/sources/utils/toolErrorParser.test.ts +126 -0
  1074. package/sources/utils/toolErrorParser.ts +102 -0
  1075. package/sources/utils/trimIdent.ts +27 -0
  1076. package/sources/utils/truncateForLogs.ts +37 -0
  1077. package/sources/utils/versionUtils.test.ts +58 -0
  1078. package/sources/utils/versionUtils.ts +69 -0
  1079. package/sources/utils/web/faviconGenerator.ts +39 -0
  1080. package/sources/utils/worktree.ts +192 -0
  1081. package/sources/wire/index.ts +97 -0
  1082. package/src-tauri/Cargo.lock +5978 -0
  1083. package/src-tauri/Cargo.toml +27 -0
  1084. package/src-tauri/build.rs +3 -0
  1085. package/src-tauri/capabilities/default.json +27 -0
  1086. package/src-tauri/deny.toml +53 -0
  1087. package/src-tauri/entitlements.plist +24 -0
  1088. package/src-tauri/icons/128x128.png +0 -0
  1089. package/src-tauri/icons/128x128@2x.png +0 -0
  1090. package/src-tauri/icons/32x32.png +0 -0
  1091. package/src-tauri/icons/64x64.png +0 -0
  1092. package/src-tauri/icons/Square107x107Logo.png +0 -0
  1093. package/src-tauri/icons/Square142x142Logo.png +0 -0
  1094. package/src-tauri/icons/Square150x150Logo.png +0 -0
  1095. package/src-tauri/icons/Square284x284Logo.png +0 -0
  1096. package/src-tauri/icons/Square30x30Logo.png +0 -0
  1097. package/src-tauri/icons/Square310x310Logo.png +0 -0
  1098. package/src-tauri/icons/Square44x44Logo.png +0 -0
  1099. package/src-tauri/icons/Square71x71Logo.png +0 -0
  1100. package/src-tauri/icons/Square89x89Logo.png +0 -0
  1101. package/src-tauri/icons/StoreLogo.png +0 -0
  1102. package/src-tauri/icons/icon.icns +0 -0
  1103. package/src-tauri/icons/icon.ico +0 -0
  1104. package/src-tauri/icons/icon.png +0 -0
  1105. package/src-tauri/src/lib.rs +18 -0
  1106. package/src-tauri/src/main.rs +6 -0
  1107. package/src-tauri/tauri.conf.json +51 -0
  1108. package/src-tauri/tauri.dev.conf.json +20 -0
  1109. package/src-tauri/tauri.preview.conf.json +20 -0
  1110. package/tsconfig.json +45 -0
  1111. package/vitest.config.ts +26 -0
@@ -0,0 +1,1023 @@
1
+ import type { TranslationStructure } from '../_default';
2
+
3
+ /**
4
+ * Russian plural helper function
5
+ * Russian has 3 plural forms: one, few, many
6
+ * @param options - Object containing count and the three plural forms
7
+ * @returns The appropriate form based on Russian plural rules
8
+ */
9
+ function plural({ count, one, few, many }: { count: number; one: string; few: string; many: string }): string {
10
+ const n = Math.abs(count);
11
+ const n10 = n % 10;
12
+ const n100 = n % 100;
13
+
14
+ // Rule: ends in 1 but not 11
15
+ if (n10 === 1 && n100 !== 11) return one;
16
+
17
+ // Rule: ends in 2-4 but not 12-14
18
+ if (n10 >= 2 && n10 <= 4 && (n100 < 10 || n100 >= 20)) return few;
19
+
20
+ // Rule: everything else (0, 5-9, 11-19, etc.)
21
+ return many;
22
+ }
23
+
24
+ /**
25
+ * Russian translations for the NasTech app
26
+ * Must match the exact structure of the English translations
27
+ */
28
+ export const ru: TranslationStructure = {
29
+ tabs: {
30
+ // Tab navigation labels
31
+ inbox: 'Входящие',
32
+ sessions: 'Терминалы',
33
+ settings: 'Настройки',
34
+ },
35
+
36
+ inbox: {
37
+ // Inbox screen
38
+ emptyTitle: 'Входящие пусты',
39
+ emptyDescription: 'Подключитесь к друзьям, чтобы начать делиться сессиями',
40
+ updates: 'Обновления',
41
+ },
42
+
43
+ common: {
44
+ // Simple string constants
45
+ cancel: 'Отмена',
46
+ authenticate: 'Авторизация',
47
+ save: 'Сохранить',
48
+ saveAs: 'Сохранить как',
49
+ error: 'Ошибка',
50
+ success: 'Успешно',
51
+ ok: 'ОК',
52
+ continue: 'Продолжить',
53
+ back: 'Назад',
54
+ create: 'Создать',
55
+ rename: 'Переименовать',
56
+ reset: 'Сбросить',
57
+ logout: 'Выйти',
58
+ yes: 'Да',
59
+ no: 'Нет',
60
+ discard: 'Отменить',
61
+ version: 'Версия',
62
+ copied: 'Скопировано',
63
+ copy: 'Копировать',
64
+ scanning: 'Сканирование...',
65
+ urlPlaceholder: 'https://example.com',
66
+ home: 'Главная',
67
+ message: 'Сообщение',
68
+ files: 'Файлы',
69
+ fileViewer: 'Просмотр файла',
70
+ loading: 'Загрузка...',
71
+ retry: 'Повторить',
72
+ delete: 'Удалить',
73
+ optional: 'необязательно',
74
+ },
75
+
76
+ connect: {
77
+ restoreAccount: 'Восстановить аккаунт',
78
+ enterSecretKey: 'Пожалуйста, введите секретный ключ',
79
+ invalidSecretKey: 'Неверный секретный ключ. Проверьте и попробуйте снова.',
80
+ enterUrlManually: 'Ввести URL вручную',
81
+ },
82
+
83
+ settings: {
84
+ title: 'Настройки',
85
+ connectedAccounts: 'Подключенные аккаунты',
86
+ connectAccount: 'Подключить аккаунт',
87
+ github: 'GitHub',
88
+ machines: 'Машины',
89
+ showOfflineMachines: ({ count }: { count: number }) => {
90
+ const lastTwo = count % 100;
91
+ const lastOne = count % 10;
92
+ if (lastTwo >= 11 && lastTwo <= 14) return `Показать ${count} оффлайн-машин`;
93
+ if (lastOne === 1) return `Показать ${count} оффлайн-машину`;
94
+ if (lastOne >= 2 && lastOne <= 4) return `Показать ${count} оффлайн-машины`;
95
+ return `Показать ${count} оффлайн-машин`;
96
+ },
97
+ hideOfflineMachines: 'Скрыть оффлайн-машины',
98
+ features: 'Функции',
99
+ social: 'Социальное',
100
+ account: 'Аккаунт',
101
+ accountSubtitle: 'Управление учётной записью',
102
+ appearance: 'Внешний вид',
103
+ appearanceSubtitle: 'Настройка внешнего вида приложения',
104
+ voiceAssistant: 'Голосовой ассистент',
105
+ voiceAssistantSubtitle: 'Настройка предпочтений голосового взаимодействия',
106
+ featuresTitle: 'Возможности',
107
+ featuresSubtitle: 'Включить или отключить функции приложения',
108
+ developer: 'Разработчик',
109
+ developerTools: 'Инструменты разработчика',
110
+ about: 'О программе',
111
+ aboutFooter: 'NasTech — мобильное приложение для работы с Codex и Claude Code. Использует сквозное шифрование, все данные аккаунта хранятся только на вашем устройстве. Не связано с Anthropic.',
112
+ whatsNew: 'Что нового',
113
+ whatsNewSubtitle: 'Посмотреть последние обновления и улучшения',
114
+ reportIssue: 'Сообщить о проблеме',
115
+ privacyPolicy: 'Политика конфиденциальности',
116
+ termsOfService: 'Условия использования',
117
+ eula: 'EULA',
118
+ supportUs: 'Поддержите нас',
119
+ supportUsSubtitlePro: 'Спасибо за вашу поддержку!',
120
+ supportUsSubtitle: 'Поддержать разработку проекта',
121
+ scanQrCodeToAuthenticate: 'Отсканируйте QR-код для авторизации',
122
+ githubConnected: ({ login }: { login: string }) => `Подключен как @${login}`,
123
+ connectGithubAccount: 'Подключить аккаунт GitHub',
124
+ claudeAuthSuccess: 'Успешно подключено к Claude',
125
+ exchangingTokens: 'Обмен токенов...',
126
+ usage: 'Использование',
127
+ usageSubtitle: 'Просмотр использования API и затрат',
128
+ // Dynamic settings messages
129
+ accountConnected: ({ service }: { service: string }) => `Аккаунт ${service} подключен`,
130
+ machineStatus: ({ name, status }: { name: string; status: 'online' | 'offline' }) =>
131
+ `${name} ${status === 'online' ? 'online' : 'offline'}`,
132
+ featureToggled: ({ feature, enabled }: { feature: string; enabled: boolean }) =>
133
+ `${feature} ${enabled ? 'включена' : 'отключена'}`,
134
+ },
135
+
136
+ settingsAppearance: {
137
+ // Appearance settings screen
138
+ theme: 'Тема',
139
+ themeDescription: 'Выберите предпочтительную цветовую схему',
140
+ themeOptions: {
141
+ adaptive: 'Адаптивная',
142
+ light: 'Светлая',
143
+ dark: 'Тёмная',
144
+ },
145
+ themeDescriptions: {
146
+ adaptive: 'Следовать настройкам системы',
147
+ light: 'Всегда использовать светлую тему',
148
+ dark: 'Всегда использовать тёмную тему',
149
+ },
150
+ display: 'Отображение',
151
+ displayDescription: 'Управление макетом и интервалами',
152
+ inlineToolCalls: 'Встроенные вызовы инструментов',
153
+ inlineToolCallsDescription: 'Отображать вызовы инструментов прямо в сообщениях чата',
154
+ expandTodoLists: 'Развернуть списки задач',
155
+ expandTodoListsDescription: 'Показывать все задачи вместо только изменений',
156
+ showLineNumbersInDiffs: 'Показывать номера строк в различиях',
157
+ showLineNumbersInDiffsDescription: 'Отображать номера строк в различиях кода',
158
+ showLineNumbersInToolViews: 'Показывать номера строк в представлениях инструментов',
159
+ showLineNumbersInToolViewsDescription: 'Отображать номера строк в различиях представлений инструментов',
160
+ wrapLinesInDiffs: 'Перенос строк в различиях',
161
+ wrapLinesInDiffsDescription: 'Переносить длинные строки вместо горизонтальной прокрутки в представлениях различий',
162
+ diffStyle: 'Вид сравнения',
163
+ diffStyleDescription: 'Показывать различия в одну колонку (unified) или рядом (split). Режим split доступен только на web.',
164
+ diffStyleOptions: {
165
+ unified: 'Unified',
166
+ split: 'Split',
167
+ },
168
+ alwaysShowContextSize: 'Всегда показывать размер контекста',
169
+ alwaysShowContextSizeDescription: 'Отображать использование контекста даже когда не близко к лимиту',
170
+ avatarStyle: 'Стиль аватара',
171
+ avatarStyleDescription: 'Выберите внешний вид аватара сессии',
172
+ avatarOptions: {
173
+ pixelated: 'Пиксельная',
174
+ gradient: 'Градиентная',
175
+ brutalist: 'Бруталистская',
176
+ },
177
+ showFlavorIcons: 'Показывать иконки провайдеров ИИ',
178
+ showFlavorIconsDescription: 'Отображать иконки провайдеров ИИ на аватарах сессий',
179
+ },
180
+
181
+ settingsFeatures: {
182
+ // Features settings screen
183
+ experiments: 'Эксперименты',
184
+ experimentsDescription: 'Включить экспериментальные функции, которые всё ещё разрабатываются. Эти функции могут быть нестабильными или изменяться без предупреждения.',
185
+ experimentalFeatures: 'Экспериментальные функции',
186
+ experimentalFeaturesEnabled: 'Экспериментальные функции включены',
187
+ experimentalFeaturesDisabled: 'Используются только стабильные функции',
188
+ webFeatures: 'Веб-функции',
189
+ webFeaturesDescription: 'Функции, доступные только в веб-версии приложения.',
190
+ enterToSend: 'Enter для отправки',
191
+ enterToSendEnabled: 'Нажмите Enter для отправки (Shift+Enter для новой строки)',
192
+ enterToSendDisabled: 'Enter вставляет новую строку',
193
+ commandPalette: 'Command Palette',
194
+ commandPaletteEnabled: 'Нажмите ⌘K для открытия',
195
+ commandPaletteDisabled: 'Быстрый доступ к командам отключён',
196
+ markdownCopyV2: 'Markdown Copy v2',
197
+ markdownCopyV2Subtitle: 'Долгое нажатие открывает модальное окно копирования',
198
+ hideInactiveSessions: 'Скрывать неактивные сессии',
199
+ hideInactiveSessionsSubtitle: 'Показывать в списке только активные чаты',
200
+ groupToolCalls: 'Группировать вызовы инструментов',
201
+ groupToolCallsSubtitle: 'Сворачивать подряд идущие вызовы инструментов в один блок',
202
+ privacy: 'Конфиденциальность',
203
+ privacyDescription: 'Полностью отключает всю аналитику и телеметрию. Никакие данные не будут отправляться в PostHog или другие сервисы отслеживания.',
204
+ disableAnalytics: 'Отключить аналитику',
205
+ analyticsDisabled: 'Вся аналитика и телеметрия отключены',
206
+ analyticsEnabled: 'Анонимная аналитика использования активна',
207
+ imageUpload: 'Загрузка изображений',
208
+ imageUploadSubtitle: 'Прикрепляйте изображения к сообщениям для анализа Claude',
209
+ },
210
+
211
+ errors: {
212
+ networkError: 'Произошла ошибка сети',
213
+ serverError: 'Произошла ошибка сервера',
214
+ unknownError: 'Произошла неизвестная ошибка',
215
+ connectionTimeout: 'Время соединения истекло',
216
+ authenticationFailed: 'Ошибка авторизации',
217
+ permissionDenied: 'Доступ запрещен',
218
+ fileNotFound: 'Файл не найден',
219
+ invalidFormat: 'Неверный формат',
220
+ operationFailed: 'Операция не выполнена',
221
+ tryAgain: 'Пожалуйста, попробуйте снова',
222
+ contactSupport: 'Если проблема сохранится, обратитесь в поддержку',
223
+ sessionNotFound: 'Сессия не найдена',
224
+ voiceSessionFailed: 'Не удалось запустить голосовую сессию',
225
+ voiceServiceUnavailable: 'Голосовой сервис временно недоступен',
226
+ voiceLimitReachedTitle: 'Лимит голоса достигнут',
227
+ voiceHardLimitReached: ({ hours }: { hours: number }) => `Вы использовали ${hours}+ часов голосового общения в этом месяце. Это максимально допустимый лимит. Вы можете настроить собственного агента ElevenLabs в настройках голоса, чтобы использовать свою квоту.`,
228
+ voiceConversationLimitReached: 'Вы достигли максимального количества голосовых разговоров в этом месяце. Возможно, в будущем мы добавим голосовое использование по запросу — пожалуйста, создайте заявку на github.com/nastech-ai/nastech/issues, если вы столкнулись с этим ограничением.',
229
+ oauthInitializationFailed: 'Не удалось инициализировать процесс OAuth',
230
+ tokenStorageFailed: 'Не удалось сохранить токены аутентификации',
231
+ oauthStateMismatch: 'Ошибка проверки безопасности. Попробуйте снова',
232
+ tokenExchangeFailed: 'Не удалось обменять код авторизации',
233
+ oauthAuthorizationDenied: 'В авторизации отказано',
234
+ webViewLoadFailed: 'Не удалось загрузить страницу аутентификации',
235
+ failedToLoadProfile: 'Не удалось загрузить профиль пользователя',
236
+ userNotFound: 'Пользователь не найден',
237
+ sessionDeleted: 'Сессия была удалена',
238
+ sessionDeletedDescription: 'Эта сессия была окончательно удалена',
239
+
240
+ // Error functions with context
241
+ fieldError: ({ field, reason }: { field: string; reason: string }) =>
242
+ `${field}: ${reason}`,
243
+ validationError: ({ field, min, max }: { field: string; min: number; max: number }) =>
244
+ `${field} должно быть от ${min} до ${max}`,
245
+ retryIn: ({ seconds }: { seconds: number }) =>
246
+ `Повторить через ${seconds} ${plural({ count: seconds, one: 'секунду', few: 'секунды', many: 'секунд' })}`,
247
+ errorWithCode: ({ message, code }: { message: string; code: number | string }) =>
248
+ `${message} (Ошибка ${code})`,
249
+ disconnectServiceFailed: ({ service }: { service: string }) =>
250
+ `Не удалось отключить ${service}`,
251
+ connectServiceFailed: ({ service }: { service: string }) =>
252
+ `Не удалось подключить ${service}. Пожалуйста, попробуйте снова.`,
253
+ failedToLoadFriends: 'Не удалось загрузить список друзей',
254
+ failedToAcceptRequest: 'Не удалось принять запрос в друзья',
255
+ failedToRejectRequest: 'Не удалось отклонить запрос в друзья',
256
+ failedToRemoveFriend: 'Не удалось удалить друга',
257
+ searchFailed: 'Поиск не удался. Пожалуйста, попробуйте снова.',
258
+ failedToSendRequest: 'Не удалось отправить запрос в друзья',
259
+ },
260
+
261
+ newSession: {
262
+ title: 'Начать новую сессию',
263
+ machineOffline: 'Машина недоступна',
264
+ switchMachinesHint: '• Переключите машину, нажав на неё выше',
265
+ },
266
+
267
+ sessionHistory: {
268
+ // Used by session history screen
269
+ title: 'История сессий',
270
+ empty: 'Сессии не найдены',
271
+ today: 'Сегодня',
272
+ yesterday: 'Вчера',
273
+ daysAgo: ({ count }: { count: number }) => `${count} ${plural({ count, one: 'день', few: 'дня', many: 'дней' })} назад`,
274
+ viewAll: 'Посмотреть все сессии',
275
+ },
276
+
277
+ server: {
278
+ // Used by Server Configuration screen (app/(app)/server.tsx)
279
+ serverConfiguration: 'Настройка сервера',
280
+ enterServerUrl: 'Пожалуйста, введите URL сервера',
281
+ notValidNasTechServer: 'Это не валидный сервер NasTech',
282
+ changeServer: 'Изменить сервер',
283
+ continueWithServer: 'Продолжить с этим сервером?',
284
+ resetToDefault: 'Сбросить по умолчанию',
285
+ resetServerDefault: 'Сбросить сервер по умолчанию?',
286
+ validating: 'Проверка...',
287
+ validatingServer: 'Проверка сервера...',
288
+ serverReturnedError: 'Сервер вернул ошибку',
289
+ failedToConnectToServer: 'Не удалось подключиться к серверу',
290
+ currentlyUsingCustomServer: 'Сейчас используется пользовательский сервер',
291
+ customServerUrlLabel: 'URL пользовательского сервера',
292
+ advancedFeatureFooter: 'Это расширенная функция. Изменяйте сервер только если знаете, что делаете. Вам нужно будет выйти и войти снова после изменения серверов.'
293
+ },
294
+
295
+ sessionInfo: {
296
+ // Used by Session Info screen (app/(app)/session/[id]/info.tsx)
297
+ killSession: 'Завершить сессию',
298
+ killSessionConfirm: 'Вы уверены, что хотите завершить эту сессию?',
299
+ archiveSession: 'Архивировать сессию',
300
+ archiveSessionConfirm: 'Вы уверены, что хотите архивировать эту сессию?',
301
+ nastechSessionIdCopied: 'ID сессии NasTech скопирован в буфер обмена',
302
+ failedToCopySessionId: 'Не удалось скопировать ID сессии NasTech',
303
+ nastechSessionId: 'ID сессии NasTech',
304
+ claudeCodeSessionId: 'ID сессии Claude Code',
305
+ claudeCodeSessionIdCopied: 'ID сессии Claude Code скопирован в буфер обмена',
306
+ codexThreadId: 'ID треда Codex',
307
+ codexThreadIdCopied: 'ID треда Codex скопирован в буфер обмена',
308
+ aiProvider: 'Поставщик ИИ',
309
+ failedToCopyClaudeCodeSessionId: 'Не удалось скопировать ID сессии Claude Code',
310
+ failedToCopyCodexThreadId: 'Не удалось скопировать ID треда Codex',
311
+ metadataCopied: 'Метаданные скопированы в буфер обмена',
312
+ failedToCopyMetadata: 'Не удалось скопировать метаданные',
313
+ failedToKillSession: 'Не удалось завершить сессию',
314
+ failedToArchiveSession: 'Не удалось архивировать сессию',
315
+ connectionStatus: 'Статус подключения',
316
+ created: 'Создано',
317
+ lastUpdated: 'Последнее обновление',
318
+ sequence: 'Последовательность',
319
+ quickActions: 'Быстрые действия',
320
+ viewMachine: 'Посмотреть машину',
321
+ viewMachineSubtitle: 'Посмотреть детали машины и сессии',
322
+ resumeSession: 'Resume Session',
323
+ resumeSessionSubtitle: 'Resume this session on the same machine',
324
+ resumeSessionSameMachineOnly: 'This session can only be resumed on the same machine it started on.',
325
+ resumeSessionMachineOffline: 'This machine is offline. Resume is only available while it is online.',
326
+ resumeSessionNeedsNasTechAgent: 'Resume is unavailable on this machine. Run `nastech-agent auth login` to enable it.',
327
+ resumeSessionMissingMachine: 'This session is missing its machine metadata, so it cannot be resumed.',
328
+ resumeSessionMissingBackendId: 'This session does not have a resumable Claude or Codex identifier.',
329
+ resumeSessionUnexpectedDirectoryPrompt: 'Resume cannot create directories. Start the session manually from its original path.',
330
+ killSessionSubtitle: 'Немедленно завершить сессию',
331
+ archiveSessionSubtitle: 'Архивировать эту сессию и остановить её',
332
+ metadata: 'Метаданные',
333
+ host: 'Хост',
334
+ path: 'Путь',
335
+ operatingSystem: 'Операционная система',
336
+ processId: 'ID процесса',
337
+ nastechHome: 'Домашний каталог NasTech',
338
+ copyMetadata: 'Копировать метаданные',
339
+ agentState: 'Состояние агента',
340
+ controlledByUser: 'Управляется пользователем',
341
+ pendingRequests: 'Ожидающие запросы',
342
+ activity: 'Активность',
343
+ thinking: 'Думает',
344
+ thinkingSince: 'Думает с',
345
+ cliVersion: 'Версия CLI',
346
+ cliVersionOutdated: 'Требуется обновление CLI',
347
+ cliVersionOutdatedMessage: ({ currentVersion, requiredVersion }: { currentVersion: string; requiredVersion: string }) =>
348
+ `Установлена версия ${currentVersion}. Обновите до ${requiredVersion} или новее`,
349
+ updateCliInstructions: 'Пожалуйста, выполните pip install -U nastech-agent',
350
+ deleteSession: 'Удалить сессию',
351
+ deleteSessionSubtitle: 'Удалить эту сессию навсегда',
352
+ deleteSessionConfirm: 'Удалить сессию навсегда?',
353
+ deleteSessionWarning: 'Это действие нельзя отменить. Все сообщения и данные, связанные с этой сессией, будут удалены навсегда.',
354
+ failedToDeleteSession: 'Не удалось удалить сессию',
355
+ sessionDeleted: 'Сессия успешно удалена',
356
+ worktreeCleanupTitle: 'Удалить Worktree?',
357
+ worktreeCleanupMessage: 'В Worktree нет незафиксированных изменений. Хотите удалить файлы Worktree?',
358
+ worktreeCleanupDelete: 'Удалить Worktree',
359
+ worktreeCleanupKeep: 'Сохранить файлы',
360
+ },
361
+
362
+ components: {
363
+ emptyMainScreen: {
364
+ // Used by EmptyMainScreen component
365
+ readyToCode: 'Готовы к программированию?',
366
+ installCli: 'Install NasTech CLI',
367
+ runIt: 'Запустите его',
368
+ scanQrCode: 'Отсканируйте QR-код',
369
+ openCamera: 'Открыть камеру',
370
+ },
371
+ },
372
+
373
+ profile: {
374
+ userProfile: 'Профиль пользователя',
375
+ details: 'Детали',
376
+ firstName: 'Имя',
377
+ lastName: 'Фамилия',
378
+ username: 'Имя пользователя',
379
+ status: 'Статус',
380
+ },
381
+
382
+
383
+ status: {
384
+ connected: 'подключено',
385
+ connecting: 'подключение',
386
+ disconnected: 'отключено',
387
+ error: 'ошибка',
388
+ online: 'online',
389
+ offline: 'offline',
390
+ lastSeen: ({ time }: { time: string }) => `в сети ${time}`,
391
+ permissionRequired: 'требуется разрешение',
392
+ activeNow: 'Активен сейчас',
393
+ unknown: 'неизвестно',
394
+ unread: 'новые результаты',
395
+ },
396
+
397
+ time: {
398
+ justNow: 'только что',
399
+ minutesAgo: ({ count }: { count: number }) => `${count} ${plural({ count, one: 'минуту', few: 'минуты', many: 'минут' })} назад`,
400
+ hoursAgo: ({ count }: { count: number }) => `${count} ${plural({ count, one: 'час', few: 'часа', many: 'часов' })} назад`,
401
+ daysAgo: ({ count }: { count: number }) => `${count} ${plural({ count, one: 'день', few: 'дня', many: 'дней' })} назад`,
402
+ },
403
+
404
+ session: {
405
+ inputPlaceholder: 'Введите сообщение...',
406
+ inactiveArchived: 'Эта сессия неактивна.',
407
+ resumeFromTerminal: 'Чтобы возобновить её из терминала:',
408
+ newChat: 'Новый чат',
409
+ forkAction: 'Форкнуть сессию',
410
+ forkSubtitle: 'Продолжить в новой сессии с тем же контекстом',
411
+ duplicateAction: 'Откатиться к сообщению…',
412
+ duplicateSubtitle: 'Вернуться к выбранной точке и попробовать иначе',
413
+ forkFromHere: 'Форкнуть отсюда',
414
+ duplicateSheetTitle: 'Выберите точку отката',
415
+ duplicateSheetSubtitle: 'Новая сессия сохранит выбранный ход целиком (ваше сообщение и ответ агента) и отбросит все следующие запросы.',
416
+ duplicateSheetConfirm: 'Откатить',
417
+ duplicateSheetEmpty: 'В этой сессии пока нет сообщений, к которым можно откатиться.',
418
+ duplicateRowDisabled: 'К этому сообщению нельзя откатиться.',
419
+ forkedFromLabel: 'Форкнуто из',
420
+ forkedFromSubtitle: 'Открыть исходную сессию, из которой сделан форк',
421
+ forkErrorOffline: 'Машина оффлайн. Форк доступен, только пока машина с сессией онлайн.',
422
+ forkErrorMissingUuid: 'Выбранная точка отката больше не существует в исходной сессии — попробуйте форк без обрезки.',
423
+ forkErrorMissingMetadata: 'Не хватает метаданных сессии для форка.',
424
+ forkErrorGeneric: 'Не удалось форкнуть сессию.',
425
+ forkClaudeOnly: 'Форк сейчас поддерживается только для Claude-сессий.',
426
+ },
427
+
428
+ commandPalette: {
429
+ placeholder: 'Введите команду или поиск...',
430
+ },
431
+
432
+ agentInput: {
433
+ permissionMode: {
434
+ title: 'РЕЖИМ РАЗРЕШЕНИЙ',
435
+ default: 'По умолчанию',
436
+ acceptEdits: 'Принимать правки',
437
+ plan: 'Режим планирования',
438
+ dontAsk: 'Не спрашивать',
439
+ bypassPermissions: 'YOLO режим',
440
+ badgeAcceptAllEdits: 'Принимать все правки',
441
+ badgeBypassAllPermissions: 'Обход всех разрешений',
442
+ badgePlanMode: 'Режим планирования',
443
+ },
444
+ agent: {
445
+ claude: 'Claude',
446
+ codex: 'Codex',
447
+ gemini: 'Gemini',
448
+ openclaw: 'OpenClaw',
449
+ },
450
+ model: {
451
+ title: 'МОДЕЛЬ',
452
+ configureInCli: 'Настройте модели в настройках CLI',
453
+ },
454
+ effort: {
455
+ title: 'УСИЛИЕ',
456
+ },
457
+ codexPermissionMode: {
458
+ title: 'РЕЖИМ РАЗРЕШЕНИЙ CODEX',
459
+ default: 'Настройки CLI',
460
+ readOnly: 'Read Only Mode',
461
+ safeYolo: 'Safe YOLO',
462
+ yolo: 'YOLO',
463
+ badgeReadOnly: 'Только чтение',
464
+ badgeSafeYolo: 'Safe YOLO',
465
+ badgeYolo: 'YOLO',
466
+ },
467
+ codexModel: {
468
+ title: 'CODEX MODEL',
469
+ gpt5CodexLow: 'gpt-5-codex low',
470
+ gpt5CodexMedium: 'gpt-5-codex medium',
471
+ gpt5CodexHigh: 'gpt-5-codex high',
472
+ gpt5Minimal: 'GPT-5 Minimal',
473
+ gpt5Low: 'GPT-5 Low',
474
+ gpt5Medium: 'GPT-5 Medium',
475
+ gpt5High: 'GPT-5 High',
476
+ },
477
+ geminiPermissionMode: {
478
+ title: 'РЕЖИМ РАЗРЕШЕНИЙ',
479
+ default: 'По умолчанию',
480
+ autoEdit: 'Авто-редактирование',
481
+ yolo: 'YOLO',
482
+ plan: 'Планирование',
483
+ badgeAutoEdit: 'Авто-редактирование',
484
+ badgeYolo: 'YOLO',
485
+ badgePlan: 'Планирование',
486
+ },
487
+ context: {
488
+ remaining: ({ percent }: { percent: number }) => `Осталось ${percent}%`,
489
+ },
490
+ suggestion: {
491
+ fileLabel: 'ФАЙЛ',
492
+ folderLabel: 'ПАПКА',
493
+ },
494
+ noMachinesAvailable: 'Нет машин',
495
+ },
496
+
497
+ machineLauncher: {
498
+ showLess: 'Показать меньше',
499
+ showAll: ({ count }: { count: number }) => `Показать все (${count} ${plural({ count, one: 'путь', few: 'пути', many: 'путей' })})`,
500
+ enterCustomPath: 'Ввести свой путь',
501
+ offlineUnableToSpawn: 'Невозможно создать сессию, машина offline',
502
+ },
503
+
504
+ sidebar: {
505
+ sessionsTitle: 'NasTech',
506
+ showArchived: 'Показать архив',
507
+ hideArchived: 'Скрыть архив',
508
+ newSession: 'Новая сессия',
509
+ },
510
+
511
+ zen: {
512
+ toggle: 'Дзен-режим',
513
+ },
514
+
515
+ toolView: {
516
+ input: 'Входные данные',
517
+ output: 'Результат',
518
+ },
519
+
520
+ toolGroup: {
521
+ editedFiles: ({ count }: { count: number }) => `${plural({ count, one: 'Отредактирован', few: 'Отредактировано', many: 'Отредактировано' })} ${count} ${plural({ count, one: 'файл', few: 'файла', many: 'файлов' })}`,
522
+ readFiles: ({ count }: { count: number }) => `${plural({ count, one: 'Прочитан', few: 'Прочитано', many: 'Прочитано' })} ${count} ${plural({ count, one: 'файл', few: 'файла', many: 'файлов' })}`,
523
+ ranCommands: ({ count }: { count: number }) => `${plural({ count, one: 'Выполнена', few: 'Выполнено', many: 'Выполнено' })} ${count} ${plural({ count, one: 'команда', few: 'команды', many: 'команд' })}`,
524
+ searched: ({ count }: { count: number }) => `${plural({ count, one: 'Выполнен', few: 'Выполнено', many: 'Выполнено' })} ${count} ${plural({ count, one: 'поиск', few: 'поиска', many: 'поисков' })}`,
525
+ fetchedUrls: ({ count }: { count: number }) => `${plural({ count, one: 'Загружен', few: 'Загружено', many: 'Загружено' })} ${count} URL`,
526
+ ranTasks: ({ count }: { count: number }) => `${plural({ count, one: 'Выполнена', few: 'Выполнено', many: 'Выполнено' })} ${count} ${plural({ count, one: 'задача', few: 'задачи', many: 'задач' })}`,
527
+ usedTools: ({ count }: { count: number }) => `${plural({ count, one: 'Использован', few: 'Использовано', many: 'Использовано' })} ${count} ${plural({ count, one: 'инструмент', few: 'инструмента', many: 'инструментов' })}`,
528
+ },
529
+
530
+ tools: {
531
+ fullView: {
532
+ description: 'Описание',
533
+ inputParams: 'Входные параметры',
534
+ output: 'Результат',
535
+ error: 'Ошибка',
536
+ completed: 'Инструмент выполнен успешно',
537
+ noOutput: 'Результат не получен',
538
+ running: 'Выполняется...',
539
+ rawJsonDevMode: 'Исходный JSON (режим разработчика)',
540
+ },
541
+ taskView: {
542
+ initializing: 'Инициализация агента...',
543
+ moreTools: ({ count }: { count: number }) => `+${count} ещё ${plural({ count, one: 'инструмент', few: 'инструмента', many: 'инструментов' })}`,
544
+ },
545
+ multiEdit: {
546
+ editNumber: ({ index, total }: { index: number; total: number }) => `Правка ${index} из ${total}`,
547
+ replaceAll: 'Заменить все',
548
+ },
549
+ names: {
550
+ task: 'Задача',
551
+ terminal: 'Терминал',
552
+ searchFiles: 'Поиск файлов',
553
+ search: 'Поиск',
554
+ searchContent: 'Поиск содержимого',
555
+ listFiles: 'Список файлов',
556
+ planProposal: 'Предложение плана',
557
+ readFile: 'Чтение файла',
558
+ editFile: 'Редактирование файла',
559
+ writeFile: 'Запись файла',
560
+ fetchUrl: 'Получение URL',
561
+ readNotebook: 'Чтение блокнота',
562
+ editNotebook: 'Редактирование блокнота',
563
+ todoList: 'Список задач',
564
+ webSearch: 'Веб-поиск',
565
+ reasoning: 'Рассуждение',
566
+ applyChanges: 'Обновить файл',
567
+ viewDiff: 'Текущие изменения файла',
568
+ question: 'Вопрос',
569
+ },
570
+ desc: {
571
+ terminalCmd: ({ cmd }: { cmd: string }) => `Терминал(команда: ${cmd})`,
572
+ searchPattern: ({ pattern }: { pattern: string }) => `Поиск(шаблон: ${pattern})`,
573
+ searchPath: ({ basename }: { basename: string }) => `Поиск(путь: ${basename})`,
574
+ fetchUrlHost: ({ host }: { host: string }) => `Получение URL(адрес: ${host})`,
575
+ editNotebookMode: ({ path, mode }: { path: string; mode: string }) => `Редактирование блокнота(файл: ${path}, режим: ${mode})`,
576
+ todoListCount: ({ count }: { count: number }) => `Список задач(количество: ${count})`,
577
+ webSearchQuery: ({ query }: { query: string }) => `Веб-поиск(запрос: ${query})`,
578
+ grepPattern: ({ pattern }: { pattern: string }) => `grep(шаблон: ${pattern})`,
579
+ multiEditEdits: ({ path, count }: { path: string; count: number }) => `${path} (${count} ${plural({ count, one: 'правка', few: 'правки', many: 'правок' })})`,
580
+ readingFile: ({ file }: { file: string }) => `Чтение ${file}`,
581
+ writingFile: ({ file }: { file: string }) => `Запись ${file}`,
582
+ modifyingFile: ({ file }: { file: string }) => `Изменение ${file}`,
583
+ modifyingFiles: ({ count }: { count: number }) => `Изменение ${count} ${plural({ count, one: 'файла', few: 'файлов', many: 'файлов' })}`,
584
+ modifyingMultipleFiles: ({ file, count }: { file: string; count: number }) => `${file} и ещё ${count}`,
585
+ showingDiff: 'Показ изменений',
586
+ },
587
+ askUserQuestion: {
588
+ submit: 'Отправить ответ',
589
+ multipleQuestions: ({ count }: { count: number }) => `${count} ${plural({ count, one: 'вопрос', few: 'вопроса', many: 'вопросов' })}`,
590
+ other: 'Другое',
591
+ otherDescription: 'Введите свой ответ',
592
+ otherPlaceholder: 'Введите ваш ответ...',
593
+ }
594
+ },
595
+
596
+ files: {
597
+ changes: 'Изменения',
598
+ searchPlaceholder: 'Поиск файлов...',
599
+ detachedHead: 'отделённый HEAD',
600
+ summary: ({ staged, unstaged }: { staged: number; unstaged: number }) => `${staged} подготовлено • ${unstaged} не подготовлено`,
601
+ notRepo: 'Не является git-репозиторием',
602
+ notUnderGit: 'Эта папка не находится под управлением git',
603
+ searching: 'Поиск файлов...',
604
+ noFilesFound: 'Файлы не найдены',
605
+ noFilesInProject: 'Файлов в проекте нет',
606
+ tryDifferentTerm: 'Попробуйте другой поисковый запрос',
607
+ searchResults: ({ count }: { count: number }) => `Результаты поиска (${count})`,
608
+ projectRoot: 'Корень проекта',
609
+ stagedChanges: ({ count }: { count: number }) => `Подготовленные изменения (${count})`,
610
+ unstagedChanges: ({ count }: { count: number }) => `Неподготовленные изменения (${count})`,
611
+ // File viewer strings
612
+ loadingFile: ({ fileName }: { fileName: string }) => `Загрузка ${fileName}...`,
613
+ binaryFile: 'Бинарный файл',
614
+ cannotDisplayBinary: 'Невозможно отобразить содержимое бинарного файла',
615
+ diff: 'Различия',
616
+ file: 'Файл',
617
+ fileEmpty: 'Файл пустой',
618
+ noChanges: 'Нет изменений для отображения',
619
+ noChangesTitle: 'Нет изменений',
620
+ noChangesSubtitle: 'Рабочее дерево чистое',
621
+ deleted: 'Удалён',
622
+ changedFiles: ({ count }: { count: number }) => `${count} ${count === 1 ? 'изменённый файл' : count < 5 ? 'изменённых файла' : 'изменённых файлов'}`,
623
+ allFiles: 'Все файлы',
624
+ editFile: 'Редактировать',
625
+ saveFile: 'Сохранить',
626
+ failedToRead: 'Не удалось прочитать файл',
627
+ failedToSave: 'Не удалось сохранить файл',
628
+ fileConflict: 'Конфликт файла',
629
+ fileConflictDescription: 'Файл был изменён на устройстве пока вы его редактировали. Перезагрузите чтобы увидеть актуальную версию.',
630
+ reload: 'Перезагрузить',
631
+ overwrite: 'Перезаписать',
632
+ },
633
+
634
+ settingsVoice: {
635
+ // Voice settings screen
636
+ languageTitle: 'Язык',
637
+ languageDescription: 'Выберите предпочтительный язык для взаимодействия с голосовым помощником. Эта настройка синхронизируется на всех ваших устройствах.',
638
+ preferredLanguage: 'Предпочтительный язык',
639
+ preferredLanguageSubtitle: 'Язык, используемый для ответов голосового помощника',
640
+ language: {
641
+ searchPlaceholder: 'Поиск языков...',
642
+ title: 'Языки',
643
+ footer: ({ count }: { count: number }) => `Доступно ${count} ${plural({ count, one: 'язык', few: 'языка', many: 'языков' })}`,
644
+ autoDetect: 'Автоопределение',
645
+ },
646
+ // Bring your own agent
647
+ byoTitle: 'Используйте своего агента',
648
+ byoDescription: 'Используйте собственного агента ElevenLabs вместо стандартного NasTech. Подписка не требуется — подключайтесь напрямую через свой аккаунт ElevenLabs. Ваш агент должен определить два клиентских инструмента: messageClaudeCode (отправляет текст агенту кодирования) и processPermissionRequest (разрешает или запрещает использование инструментов). Контекст сессии передаётся через динамическую переменную {{initialConversationContext}}.',
649
+ customAgentId: 'ElevenLabs Agent ID',
650
+ customAgentIdNotSet: 'Не настроено',
651
+ customAgentIdDescription: 'Введите ваш ElevenLabs Agent ID. Оставьте пустым, чтобы использовать стандартный NasTech.',
652
+ customAgentIdPlaceholder: 'e.g. abc123def456',
653
+ bypassToken: 'Прямое подключение',
654
+ bypassTokenSubtitle: 'Пропустить сервер NasTech, подключиться напрямую к ElevenLabs',
655
+ promptGuideTitle: 'Руководство по промптам агента',
656
+ promptGuideDescription: 'Вашему агенту ElevenLabs необходимы:\n\n• Инструмент: messageClaudeCode — параметр: message (string). Отправляет сообщение в активную сессию кодирования.\n• Инструмент: processPermissionRequest — параметр: decision ("allow" или "deny"). Одобряет или отклоняет ожидающее разрешение на использование инструмента.\n• Динамическая переменная: {{initialConversationContext}} — получает историю и контекст сессии при запуске.\n\nАгент выступает голосовым мостом между пользователем и агентами кодирования. Он должен быть кратким, отвечать только при обращении и сообщать, когда агент кодирования завершает работу.',
657
+ usageTitle: 'Использование (последние 30 дней)',
658
+ usageFooter: 'Время голосового общения за последние 30 дней. Бесплатный тариф: 20 мин. С подпиской: 5 часов. Макс. 100 разговоров в месяц.',
659
+ usageLabel: 'Голосовое время',
660
+ conversationsLabel: 'Разговоры',
661
+ usageUsed: ({ used, limit }: { used: string; limit: string }) => `${used} использовано из ${limit}`,
662
+ supportTitle: 'Улучшить голос',
663
+ supportSubtitle: 'Больше голосового времени и поддержка разработки',
664
+ },
665
+
666
+ settingsAccount: {
667
+ // Account settings screen
668
+ accountInformation: 'Информация об аккаунте',
669
+ status: 'Статус',
670
+ statusActive: 'Активный',
671
+ statusNotAuthenticated: 'Не авторизован',
672
+ anonymousId: 'Анонимный ID',
673
+ publicId: 'Публичный ID',
674
+ notAvailable: 'Недоступно',
675
+ linkNewDevice: 'Привязать новое устройство',
676
+ linkNewDeviceSubtitle: 'Отсканируйте QR-код для привязки устройства',
677
+ profile: 'Профиль',
678
+ name: 'Имя',
679
+ github: 'GitHub',
680
+ tapToDisconnect: 'Нажмите для отключения',
681
+ server: 'Сервер',
682
+ backup: 'Резервная копия',
683
+ backupDescription: 'Ваш секретный ключ - единственный способ восстановить ваш аккаунт. Сохраните его в безопасном месте, например в менеджере паролей.',
684
+ secretKey: 'Секретный ключ',
685
+ tapToReveal: 'Нажмите для показа',
686
+ tapToHide: 'Нажмите для скрытия',
687
+ secretKeyLabel: 'СЕКРЕТНЫЙ КЛЮЧ (НАЖМИТЕ ДЛЯ КОПИРОВАНИЯ)',
688
+ secretKeyCopied: 'Секретный ключ скопирован в буфер обмена. Сохраните его в безопасном месте!',
689
+ secretKeyCopyFailed: 'Не удалось скопировать секретный ключ',
690
+ privacy: 'Конфиденциальность',
691
+ privacyDescription: 'Помогите улучшить приложение, поделившись анонимными данными об использовании. Никакая личная информация не собирается.',
692
+ analytics: 'Аналитика',
693
+ analyticsDisabled: 'Данные не передаются',
694
+ analyticsEnabled: 'Анонимные данные об использовании передаются',
695
+ dangerZone: 'Опасная зона',
696
+ logout: 'Выйти',
697
+ logoutSubtitle: 'Выйти из аккаунта и очистить локальные данные',
698
+ logoutConfirm: 'Вы уверены, что хотите выйти? Убедитесь, что вы сохранили резервную копию секретного ключа!',
699
+ },
700
+
701
+ connectButton: {
702
+ authenticate: 'Авторизация терминала',
703
+ authenticateWithUrlPaste: 'Авторизация терминала через URL',
704
+ pasteAuthUrl: 'Вставьте авторизационный URL из терминала',
705
+ },
706
+
707
+ updateBanner: {
708
+ updateAvailable: 'Доступно обновление',
709
+ pressToApply: 'Нажмите, чтобы применить обновление',
710
+ whatsNew: 'Что нового',
711
+ seeLatest: 'Посмотреть последние обновления и улучшения',
712
+ nativeUpdateAvailable: 'Доступно обновление приложения',
713
+ tapToUpdateAppStore: 'Нажмите для обновления в App Store',
714
+ tapToUpdatePlayStore: 'Нажмите для обновления в Play Store',
715
+ },
716
+
717
+ changelog: {
718
+ // Used by the changelog screen
719
+ version: ({ version }: { version: number }) => `Версия ${version}`,
720
+ noEntriesAvailable: 'Записи журнала изменений недоступны.',
721
+ },
722
+
723
+ terminal: {
724
+ // Used by terminal connection screens
725
+ webBrowserRequired: 'Требуется веб-браузер',
726
+ webBrowserRequiredDescription: 'Ссылки подключения терминала можно открывать только в веб-браузере по соображениям безопасности. Используйте сканер QR-кодов или откройте эту ссылку на компьютере.',
727
+ processingConnection: 'Обработка подключения...',
728
+ invalidConnectionLink: 'Неверная ссылка подключения',
729
+ invalidConnectionLinkDescription: 'Ссылка подключения отсутствует или неверна. Проверьте URL и попробуйте снова.',
730
+ connectTerminal: 'Подключить терминал',
731
+ terminalRequestDescription: 'Терминал запрашивает подключение к вашему аккаунту NasTech. Это позволит терминалу безопасно отправлять и получать сообщения.',
732
+ connectionDetails: 'Детали подключения',
733
+ publicKey: 'Публичный ключ',
734
+ encryption: 'Шифрование',
735
+ endToEndEncrypted: 'Сквозное шифрование',
736
+ acceptConnection: 'Принять подключение',
737
+ connecting: 'Подключение...',
738
+ reject: 'Отклонить',
739
+ security: 'Безопасность',
740
+ securityFooter: 'Эта ссылка подключения была безопасно обработана в вашем браузере и никогда не отправлялась на сервер. Ваши личные данные останутся в безопасности, и только вы можете расшифровать сообщения.',
741
+ securityFooterDevice: 'Это подключение было безопасно обработано на вашем устройстве и никогда не отправлялось на сервер. Ваши личные данные останутся в безопасности, и только вы можете расшифровать сообщения.',
742
+ clientSideProcessing: 'Обработка на стороне клиента',
743
+ linkProcessedLocally: 'Ссылка обработана локально в браузере',
744
+ linkProcessedOnDevice: 'Ссылка обработана локально на устройстве',
745
+ },
746
+
747
+ modals: {
748
+ // Used across connect flows and settings
749
+ authenticateTerminal: 'Авторизация терминала',
750
+ pasteUrlFromTerminal: 'Вставьте URL авторизации из вашего терминала',
751
+ deviceLinkedSuccessfully: 'Устройство успешно связано',
752
+ terminalConnectedSuccessfully: 'Терминал успешно подключен',
753
+ invalidAuthUrl: 'Неверный URL авторизации',
754
+ developerMode: 'Режим разработчика',
755
+ developerModeEnabled: 'Режим разработчика включен',
756
+ developerModeDisabled: 'Режим разработчика отключен',
757
+ disconnectGithub: 'Отключить GitHub',
758
+ disconnectGithubConfirm: 'Вы уверены, что хотите отключить аккаунт GitHub?',
759
+ disconnectService: ({ service }: { service: string }) =>
760
+ `Отключить ${service}`,
761
+ disconnectServiceConfirm: ({ service }: { service: string }) =>
762
+ `Вы уверены, что хотите отключить ${service} от вашего аккаунта?`,
763
+ disconnect: 'Отключить',
764
+ failedToConnectTerminal: 'Не удалось подключить терминал',
765
+ cameraPermissionsRequiredToConnectTerminal: 'Для подключения терминала требуется доступ к камере',
766
+ failedToLinkDevice: 'Не удалось связать устройство',
767
+ cameraPermissionsRequiredToScanQr: 'Для сканирования QR-кодов требуется доступ к камере'
768
+ },
769
+
770
+ navigation: {
771
+ // Navigation titles and screen headers
772
+ connectTerminal: 'Подключить терминал',
773
+ linkNewDevice: 'Связать новое устройство',
774
+ restoreWithSecretKey: 'Восстановить секретным ключом',
775
+ whatsNew: 'Что нового',
776
+ friends: 'Друзья',
777
+ },
778
+
779
+ welcome: {
780
+ // Main welcome screen for unauthenticated users
781
+ title: 'Мобильный клиент Codex и Claude Code',
782
+ subtitle: 'Сквозное шифрование, аккаунт хранится только на вашем устройстве.',
783
+ createAccount: 'Создать аккаунт',
784
+ linkOrRestoreAccount: 'Связать или восстановить аккаунт',
785
+ loginWithMobileApp: 'Войти через мобильное приложение',
786
+ },
787
+
788
+ review: {
789
+ // Used by utils/requestReview.ts
790
+ enjoyingApp: 'Нравится приложение?',
791
+ feedbackPrompt: 'Мы будем рады вашему отзыву!',
792
+ yesILoveIt: 'Да, мне нравится!',
793
+ notReally: 'Не совсем'
794
+ },
795
+
796
+ items: {
797
+ // Used by Item component for copy toast
798
+ copiedToClipboard: ({ label }: { label: string }) => `${label} скопировано в буфер обмена`
799
+ },
800
+
801
+ machine: {
802
+ offlineUnableToSpawn: 'Запуск отключен: машина offline',
803
+ offlineHelp: '• Убедитесь, что компьютер online\n• Выполните `nastech daemon status` для диагностики\n• Используете последнюю версию CLI? Обновите командой `pip install -U nastech-agent`',
804
+ launchNewSessionInDirectory: 'Запустить новую сессию в папке',
805
+ daemon: 'Daemon',
806
+ status: 'Статус',
807
+ stopDaemon: 'Остановить daemon',
808
+ lastKnownPid: 'Последний известный PID',
809
+ lastKnownHttpPort: 'Последний известный HTTP порт',
810
+ startedAt: 'Запущен в',
811
+ cliVersion: 'Версия CLI',
812
+ daemonStateVersion: 'Версия состояния daemon',
813
+ activeSessions: ({ count }: { count: number }) => `Активные сессии (${count})`,
814
+ machineGroup: 'Машина',
815
+ host: 'Хост',
816
+ machineId: 'ID машины',
817
+ username: 'Имя пользователя',
818
+ homeDirectory: 'Домашний каталог',
819
+ platform: 'Платформа',
820
+ architecture: 'Архитектура',
821
+ lastSeen: 'Последняя активность',
822
+ never: 'Никогда',
823
+ metadataVersion: 'Версия метаданных',
824
+ cliAvailability: 'Доступность CLI',
825
+ cliInstalled: 'Установлен',
826
+ cliNotFound: 'Не найден',
827
+ lastDetected: 'Последнее обнаружение',
828
+ untitledSession: 'Безымянная сессия',
829
+ back: 'Назад',
830
+ dangerZone: 'Опасная зона',
831
+ delete: 'Удалить машину',
832
+ deleteFooter: 'Удаляет машину из вашего аккаунта. История сессий сохраняется, но вы больше не сможете запускать новые сессии на ней.',
833
+ deleteConfirmTitle: 'Удалить эту машину?',
834
+ deleteConfirmMessage: 'Машина будет удалена из вашего аккаунта. История сессий сохраняется, но вы больше не сможете запускать новые сессии, пока не подключите демон заново.',
835
+ deleteFailed: 'Не удалось удалить машину.',
836
+ },
837
+
838
+ message: {
839
+ switchedToMode: ({ mode }: { mode: string }) => `Переключено в режим ${mode}`,
840
+ unknownEvent: 'Неизвестное событие',
841
+ usageLimitUntil: ({ time }: { time: string }) => `Лимит использования достигнут до ${time}`,
842
+ unknownTime: 'неизвестное время',
843
+ },
844
+
845
+ codex: {
846
+ // Codex permission dialog buttons
847
+ permissions: {
848
+ yesForSession: 'Да, и не спрашивать для этой сессии',
849
+ stopAndExplain: 'Остановить и объяснить, что делать',
850
+ }
851
+ },
852
+
853
+ claude: {
854
+ // Claude permission dialog buttons
855
+ permissions: {
856
+ yesAllowAllEdits: 'Да, разрешить все правки в этой сессии',
857
+ yesAllowEverything: 'Да, разрешить всё в этой сессии',
858
+ yesForTool: 'Да, больше не спрашивать для этого инструмента',
859
+ noTellClaude: 'Нет, дать обратную связь',
860
+ }
861
+ },
862
+
863
+ settingsLanguage: {
864
+ // Language settings screen
865
+ title: 'Язык',
866
+ description: 'Выберите предпочтительный язык интерфейса приложения. Настройки синхронизируются на всех ваших устройствах.',
867
+ currentLanguage: 'Текущий язык',
868
+ automatic: 'Автоматически',
869
+ automaticSubtitle: 'Определять по настройкам устройства',
870
+ needsRestart: 'Язык изменён',
871
+ needsRestartMessage: 'Приложение нужно перезапустить для применения новых языковых настроек.',
872
+ restartNow: 'Перезапустить',
873
+ },
874
+
875
+ textSelection: {
876
+ // Text selection screen
877
+ selectText: 'Выделить диапазон текста',
878
+ title: 'Выделить текст',
879
+ noTextProvided: 'Текст не предоставлен',
880
+ textNotFound: 'Текст не найден или устарел',
881
+ textCopied: 'Текст скопирован в буфер обмена',
882
+ failedToCopy: 'Не удалось скопировать текст в буфер обмена',
883
+ noTextToCopy: 'Нет текста для копирования',
884
+ },
885
+
886
+ markdown: {
887
+ // Markdown copy functionality
888
+ codeCopied: 'Код скопирован',
889
+ copyFailed: 'Ошибка копирования',
890
+ mermaidRenderFailed: 'Не удалось отобразить диаграмму mermaid',
891
+ },
892
+
893
+ artifacts: {
894
+ // Artifacts feature
895
+ title: 'Артефакты',
896
+ countSingular: '1 артефакт',
897
+ countPlural: ({ count }: { count: number }) => {
898
+ const n = Math.abs(count);
899
+ const n10 = n % 10;
900
+ const n100 = n % 100;
901
+
902
+ if (n10 === 1 && n100 !== 11) {
903
+ return `${count} артефакт`;
904
+ }
905
+ if (n10 >= 2 && n10 <= 4 && (n100 < 10 || n100 >= 20)) {
906
+ return `${count} артефакта`;
907
+ }
908
+ return `${count} артефактов`;
909
+ },
910
+ empty: 'Артефактов пока нет',
911
+ emptyDescription: 'Создайте первый артефакт, чтобы начать',
912
+ new: 'Новый артефакт',
913
+ edit: 'Редактировать артефакт',
914
+ delete: 'Удалить',
915
+ updateError: 'Не удалось обновить артефакт. Пожалуйста, попробуйте еще раз.',
916
+ notFound: 'Артефакт не найден',
917
+ discardChanges: 'Отменить изменения?',
918
+ discardChangesDescription: 'У вас есть несохраненные изменения. Вы уверены, что хотите их отменить?',
919
+ deleteConfirm: 'Удалить артефакт?',
920
+ deleteConfirmDescription: 'Это действие нельзя отменить',
921
+ titleLabel: 'ЗАГОЛОВОК',
922
+ titlePlaceholder: 'Введите заголовок для вашего артефакта',
923
+ bodyLabel: 'СОДЕРЖИМОЕ',
924
+ bodyPlaceholder: 'Напишите ваш контент здесь...',
925
+ emptyFieldsError: 'Пожалуйста, введите заголовок или содержимое',
926
+ createError: 'Не удалось создать артефакт. Пожалуйста, попробуйте снова.',
927
+ save: 'Сохранить',
928
+ saving: 'Сохранение...',
929
+ loading: 'Загрузка артефактов...',
930
+ error: 'Не удалось загрузить артефакт',
931
+ },
932
+
933
+ friends: {
934
+ // Friends feature
935
+ title: 'Друзья',
936
+ manageFriends: 'Управляйте своими друзьями и связями',
937
+ searchTitle: 'Найти друзей',
938
+ pendingRequests: 'Запросы в друзья',
939
+ myFriends: 'Мои друзья',
940
+ noFriendsYet: 'У вас пока нет друзей',
941
+ findFriends: 'Найти друзей',
942
+ remove: 'Удалить',
943
+ pendingRequest: 'Ожидается',
944
+ sentOn: ({ date }: { date: string }) => `Отправлено ${date}`,
945
+ accept: 'Принять',
946
+ reject: 'Отклонить',
947
+ addFriend: 'Добавить в друзья',
948
+ alreadyFriends: 'Уже в друзьях',
949
+ requestPending: 'Запрос отправлен',
950
+ searchInstructions: 'Введите имя пользователя для поиска друзей',
951
+ searchPlaceholder: 'Введите имя пользователя...',
952
+ searching: 'Поиск...',
953
+ userNotFound: 'Пользователь не найден',
954
+ noUserFound: 'Пользователь с таким именем не найден',
955
+ checkUsername: 'Пожалуйста, проверьте имя пользователя и попробуйте снова',
956
+ howToFind: 'Как найти друзей',
957
+ findInstructions: 'Ищите друзей по имени пользователя. И вы, и ваш друг должны подключить GitHub для отправки запросов в друзья.',
958
+ requestSent: 'Запрос в друзья отправлен!',
959
+ requestAccepted: 'Запрос в друзья принят!',
960
+ requestRejected: 'Запрос в друзья отклонён',
961
+ friendRemoved: 'Друг удалён',
962
+ confirmRemove: 'Удалить из друзей',
963
+ confirmRemoveMessage: 'Вы уверены, что хотите удалить этого друга?',
964
+ cannotAddYourself: 'Вы не можете отправить запрос в друзья самому себе',
965
+ bothMustHaveGithub: 'Оба пользователя должны подключить GitHub, чтобы стать друзьями',
966
+ status: {
967
+ none: 'Не подключен',
968
+ requested: 'Запрос отправлен',
969
+ pending: 'Запрос ожидается',
970
+ friend: 'Друзья',
971
+ rejected: 'Отклонено',
972
+ },
973
+ acceptRequest: 'Принять запрос',
974
+ removeFriend: 'Удалить из друзей',
975
+ removeFriendConfirm: ({ name }: { name: string }) => `Вы уверены, что хотите удалить ${name} из друзей?`,
976
+ requestSentDescription: ({ name }: { name: string }) => `Ваш запрос в друзья отправлен пользователю ${name}`,
977
+ requestFriendship: 'Отправить запрос в друзья',
978
+ cancelRequest: 'Отменить запрос в друзья',
979
+ cancelRequestConfirm: ({ name }: { name: string }) => `Отменить ваш запрос в друзья к ${name}?`,
980
+ denyRequest: 'Отклонить запрос',
981
+ nowFriendsWith: ({ name }: { name: string }) => `Теперь вы друзья с ${name}`,
982
+ },
983
+
984
+ usage: {
985
+ // Usage panel strings
986
+ today: 'Сегодня',
987
+ last7Days: 'Последние 7 дней',
988
+ last30Days: 'Последние 30 дней',
989
+ totalTokens: 'Всего токенов',
990
+ totalCost: 'Общая стоимость',
991
+ tokens: 'Токены',
992
+ cost: 'Стоимость',
993
+ usageOverTime: 'Использование во времени',
994
+ byModel: 'По модели',
995
+ noData: 'Данные об использовании недоступны',
996
+ },
997
+
998
+ imageUpload: {
999
+ permissionTitle: 'Доступ к библиотеке фото',
1000
+ permissionMessage: 'Разрешите доступ к вашей библиотеке фото, чтобы прикреплять изображения к сообщениям.',
1001
+ limitTitle: 'Достигнут лимит изображений',
1002
+ limitMessage: ({ max }: { max: number }) => `Можно прикрепить не более ${max} изображений на сообщение.`,
1003
+ fileTooLargeTitle: 'Файл слишком большой',
1004
+ fileTooLargeMessage: ({ name, maxMb }: { name: string; maxMb: number }) => `"${name}" превышает лимит ${maxMb}МБ и не был добавлен.`,
1005
+ uploadFailedTitle: 'Ошибка загрузки',
1006
+ uploadFailedMessage: ({ count }: { count: number }) => count === 1
1007
+ ? 'Одно изображение не удалось загрузить — оно не было отправлено.'
1008
+ : `${count} изображений не удалось загрузить — они не были отправлены.`,
1009
+ notSupportedTitle: 'Изображения не поддерживаются',
1010
+ notSupportedMessage: 'Этот агент не поддерживает изображения. Отправлен только текст.',
1011
+ },
1012
+
1013
+ feed: {
1014
+ // Feed notifications for friend requests and acceptances
1015
+ friendRequestFrom: ({ name }: { name: string }) => `${name} отправил вам запрос в друзья`,
1016
+ friendRequestGeneric: 'Новый запрос в друзья',
1017
+ friendAccepted: ({ name }: { name: string }) => `Вы теперь друзья с ${name}`,
1018
+ friendAcceptedGeneric: 'Запрос в друзья принят',
1019
+ },
1020
+
1021
+ } as const;
1022
+
1023
+ export type TranslationsRu = typeof ru;