@surething/cockpit 1.0.253 → 1.0.255

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 (640) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +6 -3
  3. package/.next-prod/build-manifest.json +2 -2
  4. package/.next-prod/prerender-manifest.json +3 -3
  5. package/.next-prod/routes-manifest.json +18 -0
  6. package/.next-prod/server/app/_global-error/page.js +3 -3
  7. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next-prod/server/app/_global-error.html +1 -1
  10. package/.next-prod/server/app/_global-error.rsc +1 -1
  11. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next-prod/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  14. package/.next-prod/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next-prod/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next-prod/server/app/_not-found/page.js +2 -2
  18. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next-prod/server/app/_not-found.html +2 -2
  21. package/.next-prod/server/app/_not-found.rsc +3 -3
  22. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
  23. package/.next-prod/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  25. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next-prod/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  29. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  30. package/.next-prod/server/app/api/bash/route.js +1 -1
  31. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  32. package/.next-prod/server/app/api/chat/codex/route.js +2 -2
  33. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  34. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  35. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  36. package/.next-prod/server/app/api/chat/kimi/route.js +2 -2
  37. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  39. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/chat/pty-input/route.js +1 -1
  41. package/.next-prod/server/app/api/chat/pty-input/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/chat/route.js +1 -1
  43. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  45. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  47. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/commands/route.js +1 -1
  49. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/comments/route.js +1 -1
  51. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/db/columns/route.js +1 -1
  53. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/db/connect/route.js +2 -2
  55. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  57. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/db/export/route.js +1 -1
  59. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/db/query/route.js +1 -1
  61. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/db/schemas/route.js +1 -1
  63. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/deepseek/balance/route.js +1 -0
  65. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -0
  66. package/.next-prod/server/app/api/deepseek/balance/route_client-reference-manifest.js +1 -0
  67. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  68. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  69. package/.next-prod/server/app/api/deepseek/models/route.js +1 -0
  70. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -0
  71. package/.next-prod/server/app/api/deepseek/models/route_client-reference-manifest.js +1 -0
  72. package/.next-prod/server/app/api/dev/spans/route.js +1 -1
  73. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  74. package/.next-prod/server/app/api/extension/version/route.js +1 -1
  75. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  76. package/.next-prod/server/app/api/file/route.js +1 -1
  77. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  78. package/.next-prod/server/app/api/files/blame/route.js +1 -1
  79. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  80. package/.next-prod/server/app/api/files/clipboard/route.js +1 -1
  81. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  82. package/.next-prod/server/app/api/files/copy/route.js +1 -1
  83. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  84. package/.next-prod/server/app/api/files/delete/route.js +1 -1
  85. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  86. package/.next-prod/server/app/api/files/expanded/route.js +1 -1
  87. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  88. package/.next-prod/server/app/api/files/index/route.js +1 -1
  89. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  90. package/.next-prod/server/app/api/files/init/route.js +1 -1
  91. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  92. package/.next-prod/server/app/api/files/paste/route.js +1 -1
  93. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  94. package/.next-prod/server/app/api/files/read/route.js +1 -1
  95. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  96. package/.next-prod/server/app/api/files/readdir/route.js +1 -1
  97. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  98. package/.next-prod/server/app/api/files/recent/route.js +1 -1
  99. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  100. package/.next-prod/server/app/api/files/save/route.js +1 -1
  101. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  102. package/.next-prod/server/app/api/files/search/route.js +1 -1
  103. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/files/stat/route.js +1 -1
  105. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/files/text/route.js +1 -1
  107. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/git/branch-diff/route.js +1 -1
  109. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  111. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  113. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  115. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  117. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  119. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  121. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  122. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  123. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/git/status/route.js +1 -1
  125. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  127. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  129. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  130. package/.next-prod/server/app/api/global-state/route.js +1 -1
  131. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  132. package/.next-prod/server/app/api/health/route.js +1 -1
  133. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  134. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  135. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  137. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/jupyter/load/route.js +1 -1
  139. package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
  140. package/.next-prod/server/app/api/jupyter/save/route.js +1 -1
  141. package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/jupyter/shutdown/route.js +1 -1
  143. package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
  144. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  145. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  147. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  149. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  151. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  153. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/mysql/columns/route.js +1 -1
  155. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  157. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  159. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  161. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  163. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/api/mysql/schemas/route.js +2 -2
  165. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  167. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  169. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  171. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  173. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  174. package/.next-prod/server/app/api/note/route.js +1 -1
  175. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  176. package/.next-prod/server/app/api/ollama/config/route.js +1 -1
  177. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  178. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  179. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  180. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  181. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  182. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  183. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  184. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  185. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  186. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  187. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  188. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  189. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  190. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  191. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  192. package/.next-prod/server/app/api/project-state/route.js +1 -1
  193. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  194. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  195. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  196. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  197. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  198. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  199. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  200. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  201. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  202. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  203. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  204. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  205. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  206. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  207. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  208. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  209. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  210. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  211. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  212. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  213. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  214. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  215. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  216. package/.next-prod/server/app/api/projects/route.js +1 -1
  217. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  218. package/.next-prod/server/app/api/prompts/config/route.js +1 -0
  219. package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -0
  220. package/.next-prod/server/app/api/prompts/config/route_client-reference-manifest.js +1 -0
  221. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  222. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  223. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  224. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  225. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  226. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  227. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  228. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  229. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  230. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  231. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  232. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  233. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  234. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  235. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  236. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  237. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  238. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  239. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  240. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  241. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  242. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  243. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  244. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  245. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  246. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  247. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  248. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  249. package/.next-prod/server/app/api/review/order/route.js +1 -1
  250. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  251. package/.next-prod/server/app/api/review/route.js +1 -1
  252. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  253. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  254. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  255. package/.next-prod/server/app/api/review/users/route.js +1 -1
  256. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  257. package/.next-prod/server/app/api/scheduled-tasks/route.js +4 -3
  258. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  259. package/.next-prod/server/app/api/services/config/route.js +1 -1
  260. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  261. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  262. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  263. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  264. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  265. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  266. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  267. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  268. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  269. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  270. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  271. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  272. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  273. package/.next-prod/server/app/api/sessions/route.js +1 -1
  274. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  275. package/.next-prod/server/app/api/settings/route.js +1 -1
  276. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  277. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  278. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  279. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  280. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  281. package/.next-prod/server/app/api/skills/route.js +1 -1
  282. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  283. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  284. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  285. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  286. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  287. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  288. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  289. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  290. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  291. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  292. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  293. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  294. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  295. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  296. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  297. package/.next-prod/server/app/api/version/route.js +1 -1
  298. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  299. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  300. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  301. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  302. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  303. package/.next-prod/server/app/m/page.js +2 -2
  304. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  305. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  306. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  307. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  308. package/.next-prod/server/app/page.js +2 -2
  309. package/.next-prod/server/app/page.js.nft.json +1 -1
  310. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  311. package/.next-prod/server/app/project/page.js +2 -2
  312. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  313. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  314. package/.next-prod/server/app/review/[id]/page.js +2 -2
  315. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  316. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  317. package/.next-prod/server/app-paths-manifest.json +6 -3
  318. package/.next-prod/server/chunks/304.js +1 -1
  319. package/.next-prod/server/chunks/3863.js +2 -2
  320. package/.next-prod/server/chunks/{4848.js → 4338.js} +2 -2
  321. package/.next-prod/server/chunks/6548.js +1 -0
  322. package/.next-prod/server/chunks/{293.js → 7139.js} +4 -4
  323. package/.next-prod/server/chunks/9419.js +91 -0
  324. package/.next-prod/server/chunks/9658.js +12 -12
  325. package/.next-prod/server/chunks/9830.js +1 -1
  326. package/.next-prod/server/functions-config-manifest.json +1 -0
  327. package/.next-prod/server/middleware-build-manifest.js +1 -1
  328. package/.next-prod/server/pages/404.html +2 -2
  329. package/.next-prod/server/pages/500.html +1 -1
  330. package/.next-prod/server/server-reference-manifest.json +1 -1
  331. package/.next-prod/static/JD1OQjo1JkC0HtJ7Nawnu/_buildManifest.js +1 -0
  332. package/.next-prod/static/chunks/{4304-408f5bddd7583676.js → 2308-c6b5ed3c19252dce.js} +3 -3
  333. package/.next-prod/static/chunks/6260-d083071702689ed3.js +25 -0
  334. package/.next-prod/static/chunks/6784-11dddca80af27810.js +0 -0
  335. package/.next-prod/static/chunks/9530-71cba64daec9add7.js +15 -0
  336. package/.next-prod/static/chunks/app/_global-error/{page-51252a3b116b8135.js → page-0ad1f48c09ff2c02.js} +1 -1
  337. package/.next-prod/static/chunks/app/api/agent/test/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
  338. package/.next-prod/static/chunks/app/api/bash/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
  339. package/.next-prod/static/chunks/app/api/chat/codex/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
  340. package/.next-prod/static/chunks/app/api/chat/deepseek/route-0ad1f48c09ff2c02.js +1 -0
  341. package/.next-prod/static/chunks/app/api/chat/kimi/route-0ad1f48c09ff2c02.js +1 -0
  342. package/.next-prod/static/chunks/app/api/chat/ollama/route-0ad1f48c09ff2c02.js +1 -0
  343. package/.next-prod/static/chunks/app/api/chat/pty-input/route-0ad1f48c09ff2c02.js +1 -0
  344. package/.next-prod/static/chunks/app/api/chat/route-0ad1f48c09ff2c02.js +1 -0
  345. package/.next-prod/static/chunks/app/api/chat/stop/route-0ad1f48c09ff2c02.js +1 -0
  346. package/.next-prod/static/chunks/app/api/claude-stats/route-0ad1f48c09ff2c02.js +1 -0
  347. package/.next-prod/static/chunks/app/api/commands/route-0ad1f48c09ff2c02.js +1 -0
  348. package/.next-prod/static/chunks/app/api/comments/route-0ad1f48c09ff2c02.js +1 -0
  349. package/.next-prod/static/chunks/app/api/db/columns/route-0ad1f48c09ff2c02.js +1 -0
  350. package/.next-prod/static/chunks/app/api/db/connect/route-0ad1f48c09ff2c02.js +1 -0
  351. package/.next-prod/static/chunks/app/api/db/disconnect/route-0ad1f48c09ff2c02.js +1 -0
  352. package/.next-prod/static/chunks/app/api/db/export/route-0ad1f48c09ff2c02.js +1 -0
  353. package/.next-prod/static/chunks/app/api/db/query/route-0ad1f48c09ff2c02.js +1 -0
  354. package/.next-prod/static/chunks/app/api/db/schemas/route-0ad1f48c09ff2c02.js +1 -0
  355. package/.next-prod/static/chunks/app/api/deepseek/balance/route-0ad1f48c09ff2c02.js +1 -0
  356. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-0ad1f48c09ff2c02.js +1 -0
  357. package/.next-prod/static/chunks/app/api/deepseek/models/route-0ad1f48c09ff2c02.js +1 -0
  358. package/.next-prod/static/chunks/app/api/dev/spans/route-0ad1f48c09ff2c02.js +1 -0
  359. package/.next-prod/static/chunks/app/api/extension/version/route-0ad1f48c09ff2c02.js +1 -0
  360. package/.next-prod/static/chunks/app/api/file/route-0ad1f48c09ff2c02.js +1 -0
  361. package/.next-prod/static/chunks/app/api/files/blame/route-0ad1f48c09ff2c02.js +1 -0
  362. package/.next-prod/static/chunks/app/api/files/clipboard/route-0ad1f48c09ff2c02.js +1 -0
  363. package/.next-prod/static/chunks/app/api/files/copy/route-0ad1f48c09ff2c02.js +1 -0
  364. package/.next-prod/static/chunks/app/api/files/delete/route-0ad1f48c09ff2c02.js +1 -0
  365. package/.next-prod/static/chunks/app/api/files/expanded/route-0ad1f48c09ff2c02.js +1 -0
  366. package/.next-prod/static/chunks/app/api/files/index/route-0ad1f48c09ff2c02.js +1 -0
  367. package/.next-prod/static/chunks/app/api/files/init/route-0ad1f48c09ff2c02.js +1 -0
  368. package/.next-prod/static/chunks/app/api/files/paste/route-0ad1f48c09ff2c02.js +1 -0
  369. package/.next-prod/static/chunks/app/api/files/read/route-0ad1f48c09ff2c02.js +1 -0
  370. package/.next-prod/static/chunks/app/api/files/readdir/route-0ad1f48c09ff2c02.js +1 -0
  371. package/.next-prod/static/chunks/app/api/files/recent/route-0ad1f48c09ff2c02.js +1 -0
  372. package/.next-prod/static/chunks/app/api/files/save/route-0ad1f48c09ff2c02.js +1 -0
  373. package/.next-prod/static/chunks/app/api/files/search/route-0ad1f48c09ff2c02.js +1 -0
  374. package/.next-prod/static/chunks/app/api/files/stat/route-0ad1f48c09ff2c02.js +1 -0
  375. package/.next-prod/static/chunks/app/api/files/text/route-0ad1f48c09ff2c02.js +1 -0
  376. package/.next-prod/static/chunks/app/api/git/branch-diff/route-0ad1f48c09ff2c02.js +1 -0
  377. package/.next-prod/static/chunks/app/api/git/branches/route-0ad1f48c09ff2c02.js +1 -0
  378. package/.next-prod/static/chunks/app/api/git/commit-diff/route-0ad1f48c09ff2c02.js +1 -0
  379. package/.next-prod/static/chunks/app/api/git/commits/route-0ad1f48c09ff2c02.js +1 -0
  380. package/.next-prod/static/chunks/app/api/git/current-branch/route-0ad1f48c09ff2c02.js +1 -0
  381. package/.next-prod/static/chunks/app/api/git/diff/route-0ad1f48c09ff2c02.js +1 -0
  382. package/.next-prod/static/chunks/app/api/git/discard/route-0ad1f48c09ff2c02.js +1 -0
  383. package/.next-prod/static/chunks/app/api/git/stage/route-0ad1f48c09ff2c02.js +1 -0
  384. package/.next-prod/static/chunks/app/api/git/status/route-0ad1f48c09ff2c02.js +1 -0
  385. package/.next-prod/static/chunks/app/api/git/unstage/route-0ad1f48c09ff2c02.js +1 -0
  386. package/.next-prod/static/chunks/app/api/git/worktree/route-0ad1f48c09ff2c02.js +1 -0
  387. package/.next-prod/static/chunks/app/api/global-state/route-0ad1f48c09ff2c02.js +1 -0
  388. package/.next-prod/static/chunks/app/api/health/route-0ad1f48c09ff2c02.js +1 -0
  389. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-0ad1f48c09ff2c02.js +1 -0
  390. package/.next-prod/static/chunks/app/api/html-apps/route-0ad1f48c09ff2c02.js +1 -0
  391. package/.next-prod/static/chunks/app/api/jupyter/load/route-0ad1f48c09ff2c02.js +1 -0
  392. package/.next-prod/static/chunks/app/api/jupyter/save/route-0ad1f48c09ff2c02.js +1 -0
  393. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-0ad1f48c09ff2c02.js +1 -0
  394. package/.next-prod/static/chunks/app/api/lsp/definition/route-0ad1f48c09ff2c02.js +1 -0
  395. package/.next-prod/static/chunks/app/api/lsp/hover/route-0ad1f48c09ff2c02.js +1 -0
  396. package/.next-prod/static/chunks/app/api/lsp/references/route-0ad1f48c09ff2c02.js +1 -0
  397. package/.next-prod/static/chunks/app/api/lsp/status/route-0ad1f48c09ff2c02.js +1 -0
  398. package/.next-prod/static/chunks/app/api/lsp/warmup/route-0ad1f48c09ff2c02.js +1 -0
  399. package/.next-prod/static/chunks/app/api/mysql/columns/route-0ad1f48c09ff2c02.js +1 -0
  400. package/.next-prod/static/chunks/app/api/mysql/connect/route-0ad1f48c09ff2c02.js +1 -0
  401. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-0ad1f48c09ff2c02.js +1 -0
  402. package/.next-prod/static/chunks/app/api/mysql/export/route-0ad1f48c09ff2c02.js +1 -0
  403. package/.next-prod/static/chunks/app/api/mysql/query/route-0ad1f48c09ff2c02.js +1 -0
  404. package/.next-prod/static/chunks/app/api/mysql/schemas/route-0ad1f48c09ff2c02.js +1 -0
  405. package/.next-prod/static/chunks/app/api/neo4j/connect/route-0ad1f48c09ff2c02.js +1 -0
  406. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-0ad1f48c09ff2c02.js +1 -0
  407. package/.next-prod/static/chunks/app/api/neo4j/query/route-0ad1f48c09ff2c02.js +1 -0
  408. package/.next-prod/static/chunks/app/api/neo4j/schema/route-0ad1f48c09ff2c02.js +1 -0
  409. package/.next-prod/static/chunks/app/api/note/route-0ad1f48c09ff2c02.js +1 -0
  410. package/.next-prod/static/chunks/app/api/ollama/config/route-0ad1f48c09ff2c02.js +1 -0
  411. package/.next-prod/static/chunks/app/api/ollama/models/route-0ad1f48c09ff2c02.js +1 -0
  412. package/.next-prod/static/chunks/app/api/ollama/start/route-0ad1f48c09ff2c02.js +1 -0
  413. package/.next-prod/static/chunks/app/api/open-cursor/route-0ad1f48c09ff2c02.js +1 -0
  414. package/.next-prod/static/chunks/app/api/open-vscode/route-0ad1f48c09ff2c02.js +1 -0
  415. package/.next-prod/static/chunks/app/api/pick-folder/route-0ad1f48c09ff2c02.js +1 -0
  416. package/.next-prod/static/chunks/app/api/pinned-sessions/route-0ad1f48c09ff2c02.js +1 -0
  417. package/.next-prod/static/chunks/app/api/project-settings/route-0ad1f48c09ff2c02.js +1 -0
  418. package/.next-prod/static/chunks/app/api/project-state/route-0ad1f48c09ff2c02.js +1 -0
  419. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-0ad1f48c09ff2c02.js +1 -0
  420. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-0ad1f48c09ff2c02.js +1 -0
  421. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-0ad1f48c09ff2c02.js +1 -0
  422. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-0ad1f48c09ff2c02.js +1 -0
  423. package/.next-prod/static/chunks/app/api/projectGraph/context/route-0ad1f48c09ff2c02.js +1 -0
  424. package/.next-prod/static/chunks/app/api/projectGraph/file/route-0ad1f48c09ff2c02.js +1 -0
  425. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-0ad1f48c09ff2c02.js +1 -0
  426. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-0ad1f48c09ff2c02.js +1 -0
  427. package/.next-prod/static/chunks/app/api/projectGraph/related/route-0ad1f48c09ff2c02.js +1 -0
  428. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-0ad1f48c09ff2c02.js +1 -0
  429. package/.next-prod/static/chunks/app/api/projectGraph/search/route-0ad1f48c09ff2c02.js +1 -0
  430. package/.next-prod/static/chunks/app/api/projects/route-0ad1f48c09ff2c02.js +1 -0
  431. package/.next-prod/static/chunks/app/api/prompts/config/route-0ad1f48c09ff2c02.js +1 -0
  432. package/.next-prod/static/chunks/app/api/push/public-key/route-0ad1f48c09ff2c02.js +1 -0
  433. package/.next-prod/static/chunks/app/api/push/subscribe/route-0ad1f48c09ff2c02.js +1 -0
  434. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-0ad1f48c09ff2c02.js +1 -0
  435. package/.next-prod/static/chunks/app/api/redis/command/route-0ad1f48c09ff2c02.js +1 -0
  436. package/.next-prod/static/chunks/app/api/redis/connect/route-0ad1f48c09ff2c02.js +1 -0
  437. package/.next-prod/static/chunks/app/api/redis/delete/route-0ad1f48c09ff2c02.js +1 -0
  438. package/.next-prod/static/chunks/app/api/redis/disconnect/route-0ad1f48c09ff2c02.js +1 -0
  439. package/.next-prod/static/chunks/app/api/redis/get/route-0ad1f48c09ff2c02.js +1 -0
  440. package/.next-prod/static/chunks/app/api/redis/keys/route-0ad1f48c09ff2c02.js +1 -0
  441. package/.next-prod/static/chunks/app/api/redis/set/route-0ad1f48c09ff2c02.js +1 -0
  442. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-0ad1f48c09ff2c02.js +1 -0
  443. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-0ad1f48c09ff2c02.js +1 -0
  444. package/.next-prod/static/chunks/app/api/review/[id]/route-0ad1f48c09ff2c02.js +1 -0
  445. package/.next-prod/static/chunks/app/api/review/identify/route-0ad1f48c09ff2c02.js +1 -0
  446. package/.next-prod/static/chunks/app/api/review/order/route-0ad1f48c09ff2c02.js +1 -0
  447. package/.next-prod/static/chunks/app/api/review/route-0ad1f48c09ff2c02.js +1 -0
  448. package/.next-prod/static/chunks/app/api/review/share-info/route-0ad1f48c09ff2c02.js +1 -0
  449. package/.next-prod/static/chunks/app/api/review/users/route-0ad1f48c09ff2c02.js +1 -0
  450. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-0ad1f48c09ff2c02.js +1 -0
  451. package/.next-prod/static/chunks/app/api/services/config/route-0ad1f48c09ff2c02.js +1 -0
  452. package/.next-prod/static/chunks/app/api/services/scripts/route-0ad1f48c09ff2c02.js +1 -0
  453. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-0ad1f48c09ff2c02.js +1 -0
  454. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-0ad1f48c09ff2c02.js +1 -0
  455. package/.next-prod/static/chunks/app/api/session-by-path/route-0ad1f48c09ff2c02.js +1 -0
  456. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-0ad1f48c09ff2c02.js +1 -0
  457. package/.next-prod/static/chunks/app/api/sessions/projects/route-0ad1f48c09ff2c02.js +1 -0
  458. package/.next-prod/static/chunks/app/api/sessions/route-0ad1f48c09ff2c02.js +1 -0
  459. package/.next-prod/static/chunks/app/api/settings/route-0ad1f48c09ff2c02.js +1 -0
  460. package/.next-prod/static/chunks/app/api/skills/[id]/route-0ad1f48c09ff2c02.js +1 -0
  461. package/.next-prod/static/chunks/app/api/skills/content/route-0ad1f48c09ff2c02.js +1 -0
  462. package/.next-prod/static/chunks/app/api/skills/route-0ad1f48c09ff2c02.js +1 -0
  463. package/.next-prod/static/chunks/app/api/snapshots/diff/route-0ad1f48c09ff2c02.js +1 -0
  464. package/.next-prod/static/chunks/app/api/snapshots/route-0ad1f48c09ff2c02.js +1 -0
  465. package/.next-prod/static/chunks/app/api/terminal/aliases/route-0ad1f48c09ff2c02.js +1 -0
  466. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-0ad1f48c09ff2c02.js +1 -0
  467. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-0ad1f48c09ff2c02.js +1 -0
  468. package/.next-prod/static/chunks/app/api/terminal/env/route-0ad1f48c09ff2c02.js +1 -0
  469. package/.next-prod/static/chunks/app/api/terminal/history/route-0ad1f48c09ff2c02.js +1 -0
  470. package/.next-prod/static/chunks/app/api/version/route-0ad1f48c09ff2c02.js +1 -0
  471. package/.next-prod/static/chunks/app/apps/[...path]/route-0ad1f48c09ff2c02.js +1 -0
  472. package/.next-prod/static/chunks/app/{layout-145570f39a827c0f.js → layout-d43dd702b3ee9d15.js} +1 -1
  473. package/.next-prod/static/chunks/app/m/{page-6c37d1fb9db9b9d6.js → page-56faaf1f36f2588e.js} +1 -1
  474. package/.next-prod/static/chunks/app/manifest.webmanifest/route-0ad1f48c09ff2c02.js +1 -0
  475. package/.next-prod/static/chunks/app/{page-487095ac01a4c1ef.js → page-8e7a3d723260097a.js} +1 -1
  476. package/.next-prod/static/chunks/app/project/{page-487095ac01a4c1ef.js → page-8e7a3d723260097a.js} +1 -1
  477. package/.next-prod/static/chunks/app/review/[id]/page-c0136423507b7547.js +1 -0
  478. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-0ad1f48c09ff2c02.js +1 -0
  479. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-0ad1f48c09ff2c02.js +1 -0
  480. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-0ad1f48c09ff2c02.js +1 -0
  481. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-0ad1f48c09ff2c02.js +1 -0
  482. package/.next-prod/static/css/7a396fd0cfd8a652.css +1 -0
  483. package/.next-prod/trace +14 -14
  484. package/.next-prod/trace-build +1 -1
  485. package/.next-prod/types/app/api/deepseek/balance/route.ts +351 -0
  486. package/.next-prod/types/app/api/deepseek/models/route.ts +351 -0
  487. package/.next-prod/types/app/api/prompts/config/route.ts +351 -0
  488. package/.next-prod/types/routes.d.ts +4 -1
  489. package/.next-prod/types/validator.ts +27 -0
  490. package/dist/{chunk-RUNUGDPP.mjs → chunk-ALNGHUH4.mjs} +44 -30
  491. package/dist/{chunk-7WPYQYA6.mjs → chunk-LEWYJIIE.mjs} +4 -4
  492. package/dist/{chunk-BRW4ZEIC.mjs → chunk-UBB3LJGR.mjs} +56 -7
  493. package/dist/httpApi.mjs +2 -2
  494. package/dist/scheduledTasks.mjs +2750 -287
  495. package/dist/{server-MCN5AIEU.mjs → server-D7CF4MB3.mjs} +2 -2
  496. package/dist/wsServer.mjs +7 -6
  497. package/package.json +1 -1
  498. package/.next-prod/server/chunks/6038.js +0 -1
  499. package/.next-prod/server/chunks/7338.js +0 -89
  500. package/.next-prod/static/8aWX4sRFsO4Rx4DD9L9w-/_buildManifest.js +0 -1
  501. package/.next-prod/static/chunks/2876-4336c42044f38302.js +0 -25
  502. package/.next-prod/static/chunks/6784-c9969c13c13b25af.js +0 -0
  503. package/.next-prod/static/chunks/9530-27352e6f8bafeb3c.js +0 -15
  504. package/.next-prod/static/chunks/app/api/chat/deepseek/route-51252a3b116b8135.js +0 -1
  505. package/.next-prod/static/chunks/app/api/chat/kimi/route-51252a3b116b8135.js +0 -1
  506. package/.next-prod/static/chunks/app/api/chat/ollama/route-51252a3b116b8135.js +0 -1
  507. package/.next-prod/static/chunks/app/api/chat/pty-input/route-51252a3b116b8135.js +0 -1
  508. package/.next-prod/static/chunks/app/api/chat/route-51252a3b116b8135.js +0 -1
  509. package/.next-prod/static/chunks/app/api/chat/stop/route-51252a3b116b8135.js +0 -1
  510. package/.next-prod/static/chunks/app/api/claude-stats/route-51252a3b116b8135.js +0 -1
  511. package/.next-prod/static/chunks/app/api/commands/route-51252a3b116b8135.js +0 -1
  512. package/.next-prod/static/chunks/app/api/comments/route-51252a3b116b8135.js +0 -1
  513. package/.next-prod/static/chunks/app/api/db/columns/route-51252a3b116b8135.js +0 -1
  514. package/.next-prod/static/chunks/app/api/db/connect/route-51252a3b116b8135.js +0 -1
  515. package/.next-prod/static/chunks/app/api/db/disconnect/route-51252a3b116b8135.js +0 -1
  516. package/.next-prod/static/chunks/app/api/db/export/route-51252a3b116b8135.js +0 -1
  517. package/.next-prod/static/chunks/app/api/db/query/route-51252a3b116b8135.js +0 -1
  518. package/.next-prod/static/chunks/app/api/db/schemas/route-51252a3b116b8135.js +0 -1
  519. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-51252a3b116b8135.js +0 -1
  520. package/.next-prod/static/chunks/app/api/dev/spans/route-51252a3b116b8135.js +0 -1
  521. package/.next-prod/static/chunks/app/api/extension/version/route-51252a3b116b8135.js +0 -1
  522. package/.next-prod/static/chunks/app/api/file/route-51252a3b116b8135.js +0 -1
  523. package/.next-prod/static/chunks/app/api/files/blame/route-51252a3b116b8135.js +0 -1
  524. package/.next-prod/static/chunks/app/api/files/clipboard/route-51252a3b116b8135.js +0 -1
  525. package/.next-prod/static/chunks/app/api/files/copy/route-51252a3b116b8135.js +0 -1
  526. package/.next-prod/static/chunks/app/api/files/delete/route-51252a3b116b8135.js +0 -1
  527. package/.next-prod/static/chunks/app/api/files/expanded/route-51252a3b116b8135.js +0 -1
  528. package/.next-prod/static/chunks/app/api/files/index/route-51252a3b116b8135.js +0 -1
  529. package/.next-prod/static/chunks/app/api/files/init/route-51252a3b116b8135.js +0 -1
  530. package/.next-prod/static/chunks/app/api/files/paste/route-51252a3b116b8135.js +0 -1
  531. package/.next-prod/static/chunks/app/api/files/read/route-51252a3b116b8135.js +0 -1
  532. package/.next-prod/static/chunks/app/api/files/readdir/route-51252a3b116b8135.js +0 -1
  533. package/.next-prod/static/chunks/app/api/files/recent/route-51252a3b116b8135.js +0 -1
  534. package/.next-prod/static/chunks/app/api/files/save/route-51252a3b116b8135.js +0 -1
  535. package/.next-prod/static/chunks/app/api/files/search/route-51252a3b116b8135.js +0 -1
  536. package/.next-prod/static/chunks/app/api/files/stat/route-51252a3b116b8135.js +0 -1
  537. package/.next-prod/static/chunks/app/api/files/text/route-51252a3b116b8135.js +0 -1
  538. package/.next-prod/static/chunks/app/api/git/branch-diff/route-51252a3b116b8135.js +0 -1
  539. package/.next-prod/static/chunks/app/api/git/branches/route-51252a3b116b8135.js +0 -1
  540. package/.next-prod/static/chunks/app/api/git/commit-diff/route-51252a3b116b8135.js +0 -1
  541. package/.next-prod/static/chunks/app/api/git/commits/route-51252a3b116b8135.js +0 -1
  542. package/.next-prod/static/chunks/app/api/git/current-branch/route-51252a3b116b8135.js +0 -1
  543. package/.next-prod/static/chunks/app/api/git/diff/route-51252a3b116b8135.js +0 -1
  544. package/.next-prod/static/chunks/app/api/git/discard/route-51252a3b116b8135.js +0 -1
  545. package/.next-prod/static/chunks/app/api/git/stage/route-51252a3b116b8135.js +0 -1
  546. package/.next-prod/static/chunks/app/api/git/status/route-51252a3b116b8135.js +0 -1
  547. package/.next-prod/static/chunks/app/api/git/unstage/route-51252a3b116b8135.js +0 -1
  548. package/.next-prod/static/chunks/app/api/git/worktree/route-51252a3b116b8135.js +0 -1
  549. package/.next-prod/static/chunks/app/api/global-state/route-51252a3b116b8135.js +0 -1
  550. package/.next-prod/static/chunks/app/api/health/route-51252a3b116b8135.js +0 -1
  551. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-51252a3b116b8135.js +0 -1
  552. package/.next-prod/static/chunks/app/api/html-apps/route-51252a3b116b8135.js +0 -1
  553. package/.next-prod/static/chunks/app/api/jupyter/load/route-51252a3b116b8135.js +0 -1
  554. package/.next-prod/static/chunks/app/api/jupyter/save/route-51252a3b116b8135.js +0 -1
  555. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-51252a3b116b8135.js +0 -1
  556. package/.next-prod/static/chunks/app/api/lsp/definition/route-51252a3b116b8135.js +0 -1
  557. package/.next-prod/static/chunks/app/api/lsp/hover/route-51252a3b116b8135.js +0 -1
  558. package/.next-prod/static/chunks/app/api/lsp/references/route-51252a3b116b8135.js +0 -1
  559. package/.next-prod/static/chunks/app/api/lsp/status/route-51252a3b116b8135.js +0 -1
  560. package/.next-prod/static/chunks/app/api/lsp/warmup/route-51252a3b116b8135.js +0 -1
  561. package/.next-prod/static/chunks/app/api/mysql/columns/route-51252a3b116b8135.js +0 -1
  562. package/.next-prod/static/chunks/app/api/mysql/connect/route-51252a3b116b8135.js +0 -1
  563. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-51252a3b116b8135.js +0 -1
  564. package/.next-prod/static/chunks/app/api/mysql/export/route-51252a3b116b8135.js +0 -1
  565. package/.next-prod/static/chunks/app/api/mysql/query/route-51252a3b116b8135.js +0 -1
  566. package/.next-prod/static/chunks/app/api/mysql/schemas/route-51252a3b116b8135.js +0 -1
  567. package/.next-prod/static/chunks/app/api/neo4j/connect/route-51252a3b116b8135.js +0 -1
  568. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-51252a3b116b8135.js +0 -1
  569. package/.next-prod/static/chunks/app/api/neo4j/query/route-51252a3b116b8135.js +0 -1
  570. package/.next-prod/static/chunks/app/api/neo4j/schema/route-51252a3b116b8135.js +0 -1
  571. package/.next-prod/static/chunks/app/api/note/route-51252a3b116b8135.js +0 -1
  572. package/.next-prod/static/chunks/app/api/ollama/config/route-51252a3b116b8135.js +0 -1
  573. package/.next-prod/static/chunks/app/api/ollama/models/route-51252a3b116b8135.js +0 -1
  574. package/.next-prod/static/chunks/app/api/ollama/start/route-51252a3b116b8135.js +0 -1
  575. package/.next-prod/static/chunks/app/api/open-cursor/route-51252a3b116b8135.js +0 -1
  576. package/.next-prod/static/chunks/app/api/open-vscode/route-51252a3b116b8135.js +0 -1
  577. package/.next-prod/static/chunks/app/api/pick-folder/route-51252a3b116b8135.js +0 -1
  578. package/.next-prod/static/chunks/app/api/pinned-sessions/route-51252a3b116b8135.js +0 -1
  579. package/.next-prod/static/chunks/app/api/project-settings/route-51252a3b116b8135.js +0 -1
  580. package/.next-prod/static/chunks/app/api/project-state/route-51252a3b116b8135.js +0 -1
  581. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-51252a3b116b8135.js +0 -1
  582. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-51252a3b116b8135.js +0 -1
  583. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-51252a3b116b8135.js +0 -1
  584. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-51252a3b116b8135.js +0 -1
  585. package/.next-prod/static/chunks/app/api/projectGraph/context/route-51252a3b116b8135.js +0 -1
  586. package/.next-prod/static/chunks/app/api/projectGraph/file/route-51252a3b116b8135.js +0 -1
  587. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-51252a3b116b8135.js +0 -1
  588. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-51252a3b116b8135.js +0 -1
  589. package/.next-prod/static/chunks/app/api/projectGraph/related/route-51252a3b116b8135.js +0 -1
  590. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-51252a3b116b8135.js +0 -1
  591. package/.next-prod/static/chunks/app/api/projectGraph/search/route-51252a3b116b8135.js +0 -1
  592. package/.next-prod/static/chunks/app/api/projects/route-51252a3b116b8135.js +0 -1
  593. package/.next-prod/static/chunks/app/api/push/public-key/route-51252a3b116b8135.js +0 -1
  594. package/.next-prod/static/chunks/app/api/push/subscribe/route-51252a3b116b8135.js +0 -1
  595. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-51252a3b116b8135.js +0 -1
  596. package/.next-prod/static/chunks/app/api/redis/command/route-51252a3b116b8135.js +0 -1
  597. package/.next-prod/static/chunks/app/api/redis/connect/route-51252a3b116b8135.js +0 -1
  598. package/.next-prod/static/chunks/app/api/redis/delete/route-51252a3b116b8135.js +0 -1
  599. package/.next-prod/static/chunks/app/api/redis/disconnect/route-51252a3b116b8135.js +0 -1
  600. package/.next-prod/static/chunks/app/api/redis/get/route-51252a3b116b8135.js +0 -1
  601. package/.next-prod/static/chunks/app/api/redis/keys/route-51252a3b116b8135.js +0 -1
  602. package/.next-prod/static/chunks/app/api/redis/set/route-51252a3b116b8135.js +0 -1
  603. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-51252a3b116b8135.js +0 -1
  604. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-51252a3b116b8135.js +0 -1
  605. package/.next-prod/static/chunks/app/api/review/[id]/route-51252a3b116b8135.js +0 -1
  606. package/.next-prod/static/chunks/app/api/review/identify/route-51252a3b116b8135.js +0 -1
  607. package/.next-prod/static/chunks/app/api/review/order/route-51252a3b116b8135.js +0 -1
  608. package/.next-prod/static/chunks/app/api/review/route-51252a3b116b8135.js +0 -1
  609. package/.next-prod/static/chunks/app/api/review/share-info/route-51252a3b116b8135.js +0 -1
  610. package/.next-prod/static/chunks/app/api/review/users/route-51252a3b116b8135.js +0 -1
  611. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-51252a3b116b8135.js +0 -1
  612. package/.next-prod/static/chunks/app/api/services/config/route-51252a3b116b8135.js +0 -1
  613. package/.next-prod/static/chunks/app/api/services/scripts/route-51252a3b116b8135.js +0 -1
  614. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-51252a3b116b8135.js +0 -1
  615. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-51252a3b116b8135.js +0 -1
  616. package/.next-prod/static/chunks/app/api/session-by-path/route-51252a3b116b8135.js +0 -1
  617. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-51252a3b116b8135.js +0 -1
  618. package/.next-prod/static/chunks/app/api/sessions/projects/route-51252a3b116b8135.js +0 -1
  619. package/.next-prod/static/chunks/app/api/sessions/route-51252a3b116b8135.js +0 -1
  620. package/.next-prod/static/chunks/app/api/settings/route-51252a3b116b8135.js +0 -1
  621. package/.next-prod/static/chunks/app/api/skills/[id]/route-51252a3b116b8135.js +0 -1
  622. package/.next-prod/static/chunks/app/api/skills/content/route-51252a3b116b8135.js +0 -1
  623. package/.next-prod/static/chunks/app/api/skills/route-51252a3b116b8135.js +0 -1
  624. package/.next-prod/static/chunks/app/api/snapshots/diff/route-51252a3b116b8135.js +0 -1
  625. package/.next-prod/static/chunks/app/api/snapshots/route-51252a3b116b8135.js +0 -1
  626. package/.next-prod/static/chunks/app/api/terminal/aliases/route-51252a3b116b8135.js +0 -1
  627. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-51252a3b116b8135.js +0 -1
  628. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-51252a3b116b8135.js +0 -1
  629. package/.next-prod/static/chunks/app/api/terminal/env/route-51252a3b116b8135.js +0 -1
  630. package/.next-prod/static/chunks/app/api/terminal/history/route-51252a3b116b8135.js +0 -1
  631. package/.next-prod/static/chunks/app/api/version/route-51252a3b116b8135.js +0 -1
  632. package/.next-prod/static/chunks/app/apps/[...path]/route-51252a3b116b8135.js +0 -1
  633. package/.next-prod/static/chunks/app/manifest.webmanifest/route-51252a3b116b8135.js +0 -1
  634. package/.next-prod/static/chunks/app/review/[id]/page-c9716ea0049cc328.js +0 -1
  635. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-51252a3b116b8135.js +0 -1
  636. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-51252a3b116b8135.js +0 -1
  637. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-51252a3b116b8135.js +0 -1
  638. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-51252a3b116b8135.js +0 -1
  639. package/.next-prod/static/css/5aa1c710591e36bb.css +0 -1
  640. /package/.next-prod/static/{8aWX4sRFsO4Rx4DD9L9w- → JD1OQjo1JkC0HtJ7Nawnu}/_ssgManifest.js +0 -0
@@ -10,7 +10,7 @@ import {
10
10
  setRunAbort,
11
11
  startRun,
12
12
  updateGlobalState
13
- } from "./chunk-RUNUGDPP.mjs";
13
+ } from "./chunk-ALNGHUH4.mjs";
14
14
  import {
15
15
  AgentError,
16
16
  AppRuntime,
@@ -24,20 +24,25 @@ import {
24
24
  SKILLS_FILE,
25
25
  SnapshotService,
26
26
  createOllamaModel,
27
+ createOpenAiCompatModel,
27
28
  encodePath,
28
29
  findCodexSessionPath,
29
30
  findKimiSessionPath,
31
+ getBuiltinSessionsRoot,
30
32
  getClaude2SessionPath,
31
33
  getClaudeSessionPath,
34
+ getDeepseekBuiltinSessionPath,
32
35
  getDeepseekSessionPath,
33
36
  getOllamaSessionPath,
37
+ getSessionFilePath,
34
38
  mutateJsonFile,
35
39
  notePendingRecord,
36
40
  readJsonFile,
41
+ sanitizedSpawnEnv,
37
42
  settlePendingRecord,
38
43
  withFileLock,
39
44
  writeJsonFile
40
- } from "./chunk-BRW4ZEIC.mjs";
45
+ } from "./chunk-UBB3LJGR.mjs";
41
46
  import {
42
47
  __export
43
48
  } from "./chunk-7P6ASYW6.mjs";
@@ -2577,7 +2582,7 @@ ${tempImageFiles.map((f) => f.path).join("\n")}` : prompt;
2577
2582
  cols,
2578
2583
  rows,
2579
2584
  cwd,
2580
- env: process.env
2585
+ env: sanitizedSpawnEnv()
2581
2586
  });
2582
2587
  } catch (e) {
2583
2588
  cleanupImages();
@@ -3037,8 +3042,10 @@ function buildClaudeOptions(ctx) {
3037
3042
  },
3038
3043
  includePartialMessages: true,
3039
3044
  abortController: abort,
3040
- // claude2 engine: override config directory to ~/.claude2.
3041
- ...engine === "claude2" && { env: { ...process.env, CLAUDE_CONFIG_DIR: CLAUDE2_DIR } }
3045
+ // env is ALWAYS passed (not just for claude2): without it the SDK inherits
3046
+ // process.env verbatim, handing the agent this server's NODE_ENV=production.
3047
+ // See sanitizedSpawnEnv. claude2 additionally points at ~/.claude2.
3048
+ env: sanitizedSpawnEnv(engine === "claude2" ? { CLAUDE_CONFIG_DIR: CLAUDE2_DIR } : {})
3042
3049
  });
3043
3050
  }
3044
3051
  var claudeSpec = {
@@ -3062,93 +3069,82 @@ async function readDeepseekApiKey() {
3062
3069
  return creds.apiKey?.trim() ?? "";
3063
3070
  }
3064
3071
 
3065
- // packages/feature/agent/src/server/engines/deepseek.ts
3066
- var DEEPSEEK_BASE_URL = "https://api.deepseek.com/anthropic";
3067
- var DEFAULT_MODEL = "deepseek-v4-pro";
3068
- var SMALL_FAST_MODEL = "deepseek-v4-flash";
3069
- var ALLOWED_MODELS = /* @__PURE__ */ new Set(["deepseek-v4-flash", "deepseek-v4-pro"]);
3070
- async function readSettings() {
3071
- return readJsonFile(SETTINGS_FILE, {});
3072
- }
3073
- function resolveModel(requested, saved) {
3074
- if (typeof requested === "string" && ALLOWED_MODELS.has(requested)) return requested;
3075
- if (saved && ALLOWED_MODELS.has(saved)) return saved;
3076
- return DEFAULT_MODEL;
3077
- }
3078
- function buildDeepseekEnv(apiKey, model) {
3079
- const { ANTHROPIC_AUTH_TOKEN: _t, ANTHROPIC_API_KEY: _k, ...inherited } = process.env;
3080
- void _t;
3081
- void _k;
3082
- return {
3083
- ...inherited,
3084
- ANTHROPIC_BASE_URL: DEEPSEEK_BASE_URL,
3085
- ANTHROPIC_API_KEY: apiKey,
3086
- // DeepSeek sends this as x-api-key (fully supported)
3087
- ANTHROPIC_MODEL: model,
3088
- ANTHROPIC_SMALL_FAST_MODEL: SMALL_FAST_MODEL,
3089
- CLAUDE_CONFIG_DIR: DEEPSEEK_DIR,
3090
- DISABLE_PROMPT_CACHING: "1",
3091
- // DeepSeek runs its own server-side prefix KV cache
3092
- CLAUDE_CODE_USE_BEDROCK: "0",
3093
- CLAUDE_CODE_USE_VERTEX: "0",
3094
- CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
3095
- };
3096
- }
3097
- function buildDeepseekOptions(ctx, env) {
3098
- return (abort, resume) => ({
3099
- ...resume && { resume },
3100
- ...ctx.cwd && { cwd: ctx.cwd },
3101
- settingSources: ["user", "project", "local"],
3102
- permissionMode: "bypassPermissions",
3103
- allowDangerouslySkipPermissions: true,
3104
- includePartialMessages: true,
3105
- abortController: abort,
3106
- env
3107
- });
3108
- }
3109
- var deepseekSpec = {
3110
- name: "deepseek",
3111
- // Pre-check BEFORE startRun: API key must exist; resolve model into params (no registry pollution).
3112
- async preflight(params) {
3113
- const settings = await readSettings();
3114
- const apiKey = await readDeepseekApiKey();
3115
- if (!apiKey) {
3116
- return {
3117
- ok: false,
3118
- status: 400,
3119
- error: "DeepSeek API key is not configured. Open the DeepSeek picker in the chat header to set one."
3120
- };
3121
- }
3122
- params.model = resolveModel(typeof params.model === "string" ? params.model : void 0, settings.engines?.deepseek?.model);
3123
- return { ok: true };
3124
- },
3125
- runner: {
3126
- async run(ctx) {
3127
- const apiKey = await readDeepseekApiKey();
3128
- const model = typeof ctx.params.model === "string" ? ctx.params.model : DEFAULT_MODEL;
3129
- const env = buildDeepseekEnv(apiKey, model);
3130
- await runSdkLoop(ctx, buildDeepseekOptions(ctx, env));
3131
- },
3132
- resolveTitle: (cwd, sessionId) => getSessionTitle(cwd, sessionId)
3133
- }
3134
- };
3135
-
3136
- // packages/feature/agent/src/server/engines/ollama/index.ts
3072
+ // packages/feature/agent/src/server/engines/builtinAgent/index.ts
3137
3073
  import { streamText, stepCountIs } from "ai";
3138
3074
  import { randomUUID as randomUUID3 } from "crypto";
3139
3075
 
3140
- // packages/feature/agent/src/server/engines/ollama/session.ts
3076
+ // packages/feature/agent/src/server/engines/builtinAgent/prompt.ts
3077
+ function buildSystemPrompt(cwd) {
3078
+ return `You are a coding agent. You help the user build and modify software using the provided tools.
3079
+
3080
+ CWD: ${cwd}
3081
+
3082
+ ## Language
3083
+
3084
+ ALWAYS reply in the SAME language as the user's most recent message \u2014 whatever language they used (Chinese, English, Japanese, French, Spanish, \u2026), mirror it. Do NOT default to English just because this system prompt is written in English. If the user switches language mid-conversation, switch with them on the next reply.
3085
+
3086
+ Exceptions that stay as-is regardless of reply language:
3087
+ - Tool "thought" parameters: keep the "PREVIOUS / THIS / EXPECT" template in English.
3088
+ - Code, identifiers, file paths, shell commands, and error messages quoted from tool output: keep original.
3089
+ - Only your natural-language prose to the user follows the user's language.
3090
+
3091
+ ## Workflow
3092
+
3093
+ 1. Plan: call TodoWrite FIRST to break down the task into steps (all pending, first one in_progress).
3094
+ 2. Act: execute steps one by one. After completing each step, call TodoWrite to update progress (mark completed, set next in_progress).
3095
+ 3. Check: after each tool call, assess \u2014 did it succeed? Is the overall task done? If not, continue to the next step.
3096
+ 4. Respond: you MUST always end with a text response to the user. Summarize what was done, what was found, or what remains.
3097
+
3098
+ IMPORTANT: never stop in the middle of a task silently. If you cannot continue (error, missing info, blocked), respond to the user explaining why and what is needed.
3099
+
3100
+ NEVER repeat a tool call with the same or similar arguments. When a search finds nothing, follow this escalation:
3101
+ 1. Simplify the pattern (shorter keyword, remove qualifiers, use a single core term)
3102
+ 2. Broaden the path (search parent directory, or omit path to search entire CWD)
3103
+ 3. Switch tool (Grep \u2192 Glob for filenames, Grep \u2192 Bash with find, or Read a likely file directly)
3104
+ 4. Give up after 3 failed attempts on the same topic \u2014 tell the user what you tried and ask for guidance.
3105
+
3106
+ ## Tools
3107
+
3108
+ - Read: read a file by line range.
3109
+ - Edit: exact string replacement in an existing file (prefer over Write).
3110
+ - Write: create new files or full rewrites only.
3111
+ - Bash: run shell commands.
3112
+ - Grep: ripgrep search. ALWAYS use Grep (never rg/grep via Bash).
3113
+ - Glob: fast file listing by glob pattern.
3114
+ - TodoWrite: plan tasks and track progress. ALWAYS call this first.
3115
+
3116
+ Every tool has a "thought" parameter \u2014 ALWAYS fill it using this format:
3117
+ "PREVIOUS: [what the last tool returned and whether it achieved the goal] \u2192 THIS: [what I am doing now and why] \u2192 EXPECT: [what result I expect]"
3118
+ Example: "PREVIOUS: Grep found 3 matches in cache.go \u2192 THIS: Read cache.go to see full implementation \u2192 EXPECT: understand the caching logic"
3119
+ If this is the first tool call, write "PREVIOUS: n/a" for the first part.
3120
+
3121
+ ## Rules
3122
+
3123
+ Tool usage:
3124
+ - Read before modify: do NOT edit a file you haven't Read.
3125
+ - Absolute paths only: resolve relative paths against CWD.
3126
+
3127
+ Accuracy:
3128
+ - Verify before retracting: when the user questions you, use tools to verify first, then respond based on evidence. Do NOT blindly agree you were wrong.
3129
+ - Honesty over confidence: only state what is backed by tool output. If unsure, say so and state what info is needed or propose a verification plan. Never fabricate data.
3130
+
3131
+ ## Output
3132
+
3133
+ - Be concise. Lead with the action or answer.
3134
+ - Only elaborate on decisions, blockers, or milestones.`;
3135
+ }
3136
+
3137
+ // packages/feature/agent/src/server/engines/builtinAgent/session.ts
3141
3138
  import { readFileSync as readFileSync3, existsSync, mkdirSync as mkdirSync2, appendFileSync } from "fs";
3142
3139
  import { join as join3 } from "path";
3143
- var SESSIONS_ROOT = join3(COCKPIT_DIR, "ollama-sessions");
3144
- function getSessionDir(cwd) {
3145
- return join3(SESSIONS_ROOT, encodePath(cwd));
3140
+ function getSessionDir(root, cwd) {
3141
+ return join3(root, encodePath(cwd));
3146
3142
  }
3147
- function getSessionPath(cwd, sessionId) {
3148
- return join3(getSessionDir(cwd), `${sessionId}.jsonl`);
3143
+ function getSessionPath(root, cwd, sessionId) {
3144
+ return join3(getSessionDir(root, cwd), `${sessionId}.jsonl`);
3149
3145
  }
3150
- function readSessionMessages(cwd, sessionId) {
3151
- const path2 = getSessionPath(cwd, sessionId);
3146
+ function readSessionMessages(root, cwd, sessionId) {
3147
+ const path2 = getSessionPath(root, cwd, sessionId);
3152
3148
  if (!existsSync(path2)) return [];
3153
3149
  const lines = readFileSync3(path2, "utf-8").split("\n").filter(Boolean);
3154
3150
  const transcriptEntries = [];
@@ -3182,23 +3178,35 @@ function readSessionMessages(cwd, sessionId) {
3182
3178
  }
3183
3179
  }
3184
3180
  const messages = [];
3181
+ let assistantParts = [];
3182
+ const flushAssistant = () => {
3183
+ const parts = assistantParts.filter((p) => p.type !== "text" || String(p.text || "").length > 0);
3184
+ assistantParts = [];
3185
+ if (parts.length === 0) return;
3186
+ if (parts.length === 1 && parts[0].type === "text") {
3187
+ messages.push({ role: "assistant", content: String(parts[0].text || "") });
3188
+ } else {
3189
+ messages.push({ role: "assistant", content: parts });
3190
+ }
3191
+ };
3185
3192
  for (const entry of transcriptEntries) {
3186
3193
  if (entry.type === "user" && entry.message?.role === "user" && Array.isArray(entry.message.content)) {
3187
3194
  const text = entry.message.content.filter((b) => b.type === "text").map((b) => b.text || "").join("\n");
3195
+ flushAssistant();
3196
+ if (!text) continue;
3188
3197
  messages.push({ role: "user", content: text });
3189
3198
  continue;
3190
3199
  }
3191
3200
  if (entry.type === "assistant" && Array.isArray(entry.message?.content)) {
3192
- const parts = [];
3193
3201
  for (const block of entry.message.content) {
3194
3202
  if (block.type === "text") {
3195
- parts.push({ type: "text", text: block.text || "" });
3203
+ assistantParts.push({ type: "text", text: block.text || "" });
3196
3204
  } else if (block.type === "tool_use") {
3197
3205
  const toolCallId = block.id || "";
3198
3206
  if (!toolCallId) continue;
3199
3207
  if (!toolResultIds.has(toolCallId)) continue;
3200
3208
  const toolName = block.name || toolNameById.get(toolCallId) || "tool";
3201
- parts.push({
3209
+ assistantParts.push({
3202
3210
  type: "tool-call",
3203
3211
  toolCallId,
3204
3212
  toolName,
@@ -3206,13 +3214,6 @@ function readSessionMessages(cwd, sessionId) {
3206
3214
  });
3207
3215
  }
3208
3216
  }
3209
- if (parts.length === 1 && parts[0].type === "text") {
3210
- messages.push({ role: "assistant", content: String(parts[0].text || "") });
3211
- } else if (parts.length > 0) {
3212
- messages.push({ role: "assistant", content: parts });
3213
- } else {
3214
- messages.push({ role: "assistant", content: "" });
3215
- }
3216
3217
  continue;
3217
3218
  }
3218
3219
  if (entry.type === "user" && Array.isArray(entry.message?.content)) {
@@ -3223,6 +3224,7 @@ function readSessionMessages(cwd, sessionId) {
3223
3224
  const toolCallId = tr.tool_use_id || "";
3224
3225
  if (!toolCallId) continue;
3225
3226
  if (!toolCallIds.has(toolCallId)) continue;
3227
+ flushAssistant();
3226
3228
  const toolName = toolNameById.get(toolCallId) || "tool";
3227
3229
  messages.push({
3228
3230
  role: "tool",
@@ -3238,16 +3240,17 @@ function readSessionMessages(cwd, sessionId) {
3238
3240
  }
3239
3241
  }
3240
3242
  }
3243
+ flushAssistant();
3241
3244
  return messages;
3242
3245
  }
3243
- function appendSessionLine(cwd, sessionId, line) {
3244
- const dir = getSessionDir(cwd);
3246
+ function appendSessionLine(root, cwd, sessionId, line) {
3247
+ const dir = getSessionDir(root, cwd);
3245
3248
  mkdirSync2(dir, { recursive: true });
3246
- const path2 = getSessionPath(cwd, sessionId);
3249
+ const path2 = getSessionPath(root, cwd, sessionId);
3247
3250
  appendFileSync(path2, JSON.stringify(line) + "\n", "utf-8");
3248
3251
  }
3249
- function appendUserText(cwd, sessionId, text, opts) {
3250
- appendSessionLine(cwd, sessionId, {
3252
+ function appendUserText(root, cwd, sessionId, text, opts) {
3253
+ appendSessionLine(root, cwd, sessionId, {
3251
3254
  type: "user",
3252
3255
  uuid: opts?.uuid,
3253
3256
  sessionId,
@@ -3255,8 +3258,8 @@ function appendUserText(cwd, sessionId, text, opts) {
3255
3258
  message: { role: "user", content: [{ type: "text", text }] }
3256
3259
  });
3257
3260
  }
3258
- function appendAssistantMessage(cwd, sessionId, content, opts) {
3259
- appendSessionLine(cwd, sessionId, {
3261
+ function appendAssistantMessage(root, cwd, sessionId, content, opts) {
3262
+ appendSessionLine(root, cwd, sessionId, {
3260
3263
  type: "assistant",
3261
3264
  uuid: opts?.uuid,
3262
3265
  sessionId,
@@ -3264,8 +3267,8 @@ function appendAssistantMessage(cwd, sessionId, content, opts) {
3264
3267
  message: { role: "assistant", content, ...opts?.usage ? { usage: opts.usage } : {} }
3265
3268
  });
3266
3269
  }
3267
- function appendToolResult(cwd, sessionId, toolUseId, content, opts) {
3268
- appendSessionLine(cwd, sessionId, {
3270
+ function appendToolResult(root, cwd, sessionId, toolUseId, content, opts) {
3271
+ appendSessionLine(root, cwd, sessionId, {
3269
3272
  type: "user",
3270
3273
  uuid: opts?.uuid,
3271
3274
  sessionId,
@@ -3283,7 +3286,7 @@ function appendToolResult(cwd, sessionId, toolUseId, content, opts) {
3283
3286
  });
3284
3287
  }
3285
3288
 
3286
- // packages/feature/agent/src/server/engines/ollama/tools.ts
3289
+ // packages/feature/agent/src/server/engines/builtinAgent/tools.ts
3287
3290
  import { tool, zodSchema } from "ai";
3288
3291
 
3289
3292
  // node_modules/zod/v4/classic/external.js
@@ -17054,7 +17057,7 @@ function date4(params) {
17054
17057
  // node_modules/zod/v4/classic/external.js
17055
17058
  config(en_default());
17056
17059
 
17057
- // packages/feature/agent/src/server/engines/ollama/tools.ts
17060
+ // packages/feature/agent/src/server/engines/builtinAgent/tools.ts
17058
17061
  import { readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
17059
17062
  import { writeFile, mkdir, readdir, stat, unlink } from "fs/promises";
17060
17063
  import { isAbsolute, join as join4 } from "path";
@@ -17233,7 +17236,7 @@ function createTools(context) {
17233
17236
  encoding: "utf-8",
17234
17237
  timeout: timeout ?? 6e4,
17235
17238
  maxBuffer: 10 * 1024 * 1024,
17236
- env: { ...process.env, FORCE_COLOR: "0", CI: "1" }
17239
+ env: sanitizedSpawnEnv({ FORCE_COLOR: "0", CI: "1" })
17237
17240
  });
17238
17241
  if (stdout.length === 0) {
17239
17242
  if (stderr.length === 0) {
@@ -17332,7 +17335,7 @@ ${stderrCapped}`;
17332
17335
  encoding: "utf-8",
17333
17336
  timeout: 15e3,
17334
17337
  maxBuffer: 10 * 1024 * 1024,
17335
- env: { ...process.env, FORCE_COLOR: "0" }
17338
+ env: sanitizedSpawnEnv({ FORCE_COLOR: "0" })
17336
17339
  });
17337
17340
  const GREP_CAP = 32e3;
17338
17341
  const spillPath = stdout.length > GREP_CAP ? await spillToFile(stdout, "grep") : void 0;
@@ -17372,7 +17375,16 @@ ${summary}`;
17372
17375
  };
17373
17376
  }
17374
17377
 
17375
- // packages/feature/agent/src/server/engines/ollama/stream.ts
17378
+ // packages/feature/agent/src/server/engines/builtinAgent/stream.ts
17379
+ function formatToolError(error48) {
17380
+ if (error48 instanceof Error) return error48.message || String(error48);
17381
+ if (typeof error48 === "string") return error48;
17382
+ try {
17383
+ return JSON.stringify(error48);
17384
+ } catch {
17385
+ return String(error48);
17386
+ }
17387
+ }
17376
17388
  async function consumeStream(fullStream, safeEnqueue, _sessionId, opts) {
17377
17389
  let text = "";
17378
17390
  const toolCalls = [];
@@ -17420,7 +17432,7 @@ async function consumeStream(fullStream, safeEnqueue, _sessionId, opts) {
17420
17432
  }
17421
17433
  case "tool-result": {
17422
17434
  const content = String(part.output);
17423
- opts?.onToolResult?.(part.toolCallId, content);
17435
+ opts?.onToolResult?.(part.toolCallId, content, false);
17424
17436
  safeEnqueue(
17425
17437
  `data: ${JSON.stringify({
17426
17438
  type: "user",
@@ -17429,6 +17441,27 @@ async function consumeStream(fullStream, safeEnqueue, _sessionId, opts) {
17429
17441
  }
17430
17442
  })}
17431
17443
 
17444
+ `
17445
+ );
17446
+ break;
17447
+ }
17448
+ // A tool that threw (or whose input failed schema validation) emits `tool-error`,
17449
+ // never `tool-result`. Skipping it left the tool_use dangling in the transcript;
17450
+ // on the NEXT turn that call was dropped on replay, the assistant message it lived
17451
+ // in became empty, and the provider rejected the whole request with
17452
+ // "Invalid assistant message: content or tool_calls must be set" — a permanently
17453
+ // unusable session. Every tool call must close with a result line, success or not.
17454
+ case "tool-error": {
17455
+ const content = formatToolError(part.error);
17456
+ opts?.onToolResult?.(part.toolCallId, content, true);
17457
+ safeEnqueue(
17458
+ `data: ${JSON.stringify({
17459
+ type: "user",
17460
+ message: {
17461
+ content: [{ type: "tool_result", tool_use_id: part.toolCallId, content, is_error: true }]
17462
+ }
17463
+ })}
17464
+
17432
17465
  `
17433
17466
  );
17434
17467
  break;
@@ -17466,194 +17499,242 @@ function emitResultMessage(promptTokens, completionTokens, safeEnqueue) {
17466
17499
  );
17467
17500
  }
17468
17501
 
17469
- // packages/feature/agent/src/server/engines/ollama/index.ts
17470
- var DEFAULT_MODEL2 = "qwen3.5:35b-a3b-coding-nvfp4";
17471
- function buildSystemPrompt(cwd) {
17472
- return `You are a coding agent. You help the user build and modify software using the provided tools.
17473
-
17474
- CWD: ${cwd}
17475
-
17476
- ## Language
17477
-
17478
- ALWAYS reply in the SAME language as the user's most recent message \u2014 whatever language they used (Chinese, English, Japanese, French, Spanish, \u2026), mirror it. Do NOT default to English just because this system prompt is written in English. If the user switches language mid-conversation, switch with them on the next reply.
17479
-
17480
- Exceptions that stay as-is regardless of reply language:
17481
- - Tool "thought" parameters: keep the "PREVIOUS / THIS / EXPECT" template in English.
17482
- - Code, identifiers, file paths, shell commands, and error messages quoted from tool output: keep original.
17483
- - Only your natural-language prose to the user follows the user's language.
17484
-
17485
- ## Workflow
17486
-
17487
- 1. Plan: call TodoWrite FIRST to break down the task into steps (all pending, first one in_progress).
17488
- 2. Act: execute steps one by one. After completing each step, call TodoWrite to update progress (mark completed, set next in_progress).
17489
- 3. Check: after each tool call, assess \u2014 did it succeed? Is the overall task done? If not, continue to the next step.
17490
- 4. Respond: you MUST always end with a text response to the user. Summarize what was done, what was found, or what remains.
17491
-
17492
- IMPORTANT: never stop in the middle of a task silently. If you cannot continue (error, missing info, blocked), respond to the user explaining why and what is needed.
17493
-
17494
- NEVER repeat a tool call with the same or similar arguments. When a search finds nothing, follow this escalation:
17495
- 1. Simplify the pattern (shorter keyword, remove qualifiers, use a single core term)
17496
- 2. Broaden the path (search parent directory, or omit path to search entire CWD)
17497
- 3. Switch tool (Grep \u2192 Glob for filenames, Grep \u2192 Bash with find, or Read a likely file directly)
17498
- 4. Give up after 3 failed attempts on the same topic \u2014 tell the user what you tried and ask for guidance.
17499
-
17500
- ## Tools
17501
-
17502
- - Read: read a file by line range.
17503
- - Edit: exact string replacement in an existing file (prefer over Write).
17504
- - Write: create new files or full rewrites only.
17505
- - Bash: run shell commands.
17506
- - Grep: ripgrep search. ALWAYS use Grep (never rg/grep via Bash).
17507
- - Glob: fast file listing by glob pattern.
17508
- - TodoWrite: plan tasks and track progress. ALWAYS call this first.
17509
-
17510
- Every tool has a "thought" parameter \u2014 ALWAYS fill it using this format:
17511
- "PREVIOUS: [what the last tool returned and whether it achieved the goal] \u2192 THIS: [what I am doing now and why] \u2192 EXPECT: [what result I expect]"
17512
- Example: "PREVIOUS: Grep found 3 matches in cache.go \u2192 THIS: Read cache.go to see full implementation \u2192 EXPECT: understand the caching logic"
17513
- If this is the first tool call, write "PREVIOUS: n/a" for the first part.
17514
-
17515
- ## Rules
17516
-
17517
- Tool usage:
17518
- - Read before modify: do NOT edit a file you haven't Read.
17519
- - Absolute paths only: resolve relative paths against CWD.
17520
-
17521
- Accuracy:
17522
- - Verify before retracting: when the user questions you, use tools to verify first, then respond based on evidence. Do NOT blindly agree you were wrong.
17523
- - Honesty over confidence: only state what is backed by tool output. If unsure, say so and state what info is needed or propose a verification plan. Never fabricate data.
17524
-
17525
- ## Output
17526
-
17527
- - Be concise. Lead with the action or answer.
17528
- - Only elaborate on decisions, blockers, or milestones.`;
17502
+ // packages/feature/agent/src/server/engines/builtinAgent/index.ts
17503
+ function requireTextPrompt(params) {
17504
+ return typeof params.prompt === "string" && params.prompt.trim() ? { ok: true } : { ok: false, status: 400, error: "The built-in agent requires a text prompt" };
17529
17505
  }
17530
- var ollamaSpec = {
17531
- name: "ollama",
17532
- // Ollama has no image support here — require a text prompt (the SDK orchestrator allows
17533
- // images-only for claude/deepseek; without this an images-only message reaches the runner
17534
- // with an undefined prompt).
17535
- async preflight(params) {
17536
- return typeof params.prompt === "string" && params.prompt.trim() ? { ok: true } : { ok: false, status: 400, error: "ollama requires a text prompt" };
17537
- },
17538
- runner: {
17539
- async run(ctx) {
17540
- const cwd = ctx.cwd || process.cwd();
17541
- const sid = ctx.currentKey();
17542
- ctx.rekey(sid);
17543
- const model = typeof ctx.params.model === "string" && ctx.params.model || DEFAULT_MODEL2;
17544
- const prompt = ctx.prompt;
17545
- const emit = (data) => {
17546
- if (data.startsWith("data: [DONE]")) return;
17547
- try {
17548
- ctx.emit(JSON.parse(data.slice(6)));
17549
- } catch {
17550
- }
17551
- };
17552
- const existing = readSessionMessages(cwd, sid);
17553
- const messages = [...existing, { role: "user", content: prompt }];
17554
- appendUserText(cwd, sid, prompt, { uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() });
17555
- emit(`data: ${JSON.stringify({ type: "system", subtype: "init", session_id: sid })}
17506
+ async function runBuiltinAgent(ctx, config2) {
17507
+ const { sessionsRoot } = config2;
17508
+ const cwd = ctx.cwd || process.cwd();
17509
+ const sid = ctx.currentKey();
17510
+ ctx.rekey(sid);
17511
+ const model = typeof ctx.params.model === "string" && ctx.params.model || config2.defaultModel;
17512
+ const prompt = ctx.prompt;
17513
+ const emit = (data) => {
17514
+ if (data.startsWith("data: [DONE]")) return;
17515
+ try {
17516
+ ctx.emit(JSON.parse(data.slice(6)));
17517
+ } catch {
17518
+ }
17519
+ };
17520
+ const noHistory = ctx.params.noHistory === true;
17521
+ const existing = noHistory ? [] : readSessionMessages(sessionsRoot, cwd, sid);
17522
+ const messages = [...existing, { role: "user", content: prompt }];
17523
+ appendUserText(sessionsRoot, cwd, sid, prompt, { uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() });
17524
+ emit(`data: ${JSON.stringify({ type: "system", subtype: "init", session_id: sid })}
17556
17525
 
17557
17526
  `);
17558
- const context = { cwd, todos: [] };
17559
- const languageModel = await createOllamaModel(model);
17560
- const result = streamText({
17561
- model: languageModel,
17562
- system: buildSystemPrompt(cwd),
17563
- messages,
17564
- tools: createTools(context),
17565
- stopWhen: stepCountIs(256),
17566
- temperature: 0,
17567
- abortSignal: ctx.signal
17568
- });
17569
- const pendingToolCalls = /* @__PURE__ */ new Map();
17570
- const flushPendingToolCallsAsErrors = (reason) => {
17571
- if (pendingToolCalls.size === 0) return;
17572
- for (const [toolUseId] of pendingToolCalls) {
17527
+ const context = { cwd, todos: [] };
17528
+ const languageModel = await config2.createModel(model);
17529
+ const result = streamText({
17530
+ model: languageModel,
17531
+ system: buildSystemPrompt(cwd),
17532
+ messages,
17533
+ tools: createTools(context),
17534
+ stopWhen: stepCountIs(256),
17535
+ temperature: 0,
17536
+ abortSignal: ctx.signal
17537
+ });
17538
+ const pendingToolCalls = /* @__PURE__ */ new Map();
17539
+ const flushPendingToolCallsAsErrors = (reason) => {
17540
+ if (pendingToolCalls.size === 0) return;
17541
+ for (const [toolUseId] of pendingToolCalls) {
17542
+ try {
17543
+ appendToolResult(sessionsRoot, cwd, sid, toolUseId, reason, {
17544
+ uuid: randomUUID3(),
17545
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
17546
+ is_error: true
17547
+ });
17548
+ } catch {
17549
+ }
17550
+ try {
17551
+ emit(
17552
+ `data: ${JSON.stringify({
17553
+ type: "user",
17554
+ message: { content: [{ type: "tool_result", tool_use_id: toolUseId, content: reason, is_error: true }] }
17555
+ })}
17556
+
17557
+ `
17558
+ );
17559
+ } catch {
17560
+ }
17561
+ }
17562
+ pendingToolCalls.clear();
17563
+ };
17564
+ try {
17565
+ const { text } = await consumeStream(
17566
+ result.fullStream,
17567
+ emit,
17568
+ sid,
17569
+ {
17570
+ onToolCall: (toolUseId, toolName, input) => {
17573
17571
  try {
17574
- appendToolResult(cwd, sid, toolUseId, reason, {
17572
+ pendingToolCalls.set(toolUseId, { name: toolName, input });
17573
+ appendAssistantMessage(
17574
+ sessionsRoot,
17575
+ cwd,
17576
+ sid,
17577
+ [{ type: "tool_use", id: toolUseId, name: toolName, input }],
17578
+ { uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() }
17579
+ );
17580
+ } catch {
17581
+ }
17582
+ },
17583
+ onToolResult: (toolUseId, content, isError) => {
17584
+ try {
17585
+ pendingToolCalls.delete(toolUseId);
17586
+ appendToolResult(sessionsRoot, cwd, sid, toolUseId, content, {
17575
17587
  uuid: randomUUID3(),
17576
17588
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
17577
- is_error: true
17589
+ is_error: Boolean(isError)
17578
17590
  });
17579
17591
  } catch {
17580
17592
  }
17593
+ },
17594
+ onTextFlush: (flushedText) => {
17581
17595
  try {
17582
- emit(
17583
- `data: ${JSON.stringify({
17584
- type: "user",
17585
- message: { content: [{ type: "tool_result", tool_use_id: toolUseId, content: reason, is_error: true }] }
17586
- })}
17587
-
17588
- `
17589
- );
17596
+ appendAssistantMessage(sessionsRoot, cwd, sid, [{ type: "text", text: flushedText }], {
17597
+ uuid: randomUUID3(),
17598
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
17599
+ });
17590
17600
  } catch {
17591
17601
  }
17592
17602
  }
17593
- pendingToolCalls.clear();
17594
- };
17595
- try {
17596
- const { text } = await consumeStream(
17597
- result.fullStream,
17598
- emit,
17599
- sid,
17600
- {
17601
- onToolCall: (toolUseId, toolName, input) => {
17602
- try {
17603
- pendingToolCalls.set(toolUseId, { name: toolName, input });
17604
- appendAssistantMessage(cwd, sid, [{ type: "tool_use", id: toolUseId, name: toolName, input }], {
17605
- uuid: randomUUID3(),
17606
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
17607
- });
17608
- } catch {
17609
- }
17610
- },
17611
- onToolResult: (toolUseId, content) => {
17612
- try {
17613
- pendingToolCalls.delete(toolUseId);
17614
- appendToolResult(cwd, sid, toolUseId, content, {
17615
- uuid: randomUUID3(),
17616
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
17617
- is_error: false
17618
- });
17619
- } catch {
17620
- }
17621
- },
17622
- onTextFlush: (flushedText) => {
17623
- try {
17624
- appendAssistantMessage(cwd, sid, [{ type: "text", text: flushedText }], {
17625
- uuid: randomUUID3(),
17626
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
17627
- });
17628
- } catch {
17629
- }
17630
- }
17631
- }
17632
- );
17633
- const usage = await result.usage;
17634
- emitResultMessage(usage.inputTokens || 0, usage.outputTokens || 0, emit);
17635
- if (!ctx.signal.aborted) {
17636
- appendAssistantMessage(cwd, sid, text ? [{ type: "text", text }] : [], {
17637
- uuid: randomUUID3(),
17638
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
17639
- usage: {
17640
- input_tokens: usage.inputTokens || 0,
17641
- output_tokens: usage.outputTokens || 0,
17642
- cache_creation_input_tokens: 0,
17643
- cache_read_input_tokens: 0
17644
- }
17645
- });
17646
- }
17647
- } catch (error48) {
17648
- if (ctx.signal.aborted) {
17649
- flushPendingToolCallsAsErrors("Tool call cancelled (request aborted).");
17650
- return;
17651
- }
17652
- flushPendingToolCallsAsErrors("Tool call failed (stream error).");
17653
- throw error48;
17654
17603
  }
17604
+ );
17605
+ const usage = await result.usage;
17606
+ emitResultMessage(usage.inputTokens || 0, usage.outputTokens || 0, emit);
17607
+ if (!ctx.signal.aborted) {
17608
+ appendAssistantMessage(sessionsRoot, cwd, sid, text ? [{ type: "text", text }] : [], {
17609
+ uuid: randomUUID3(),
17610
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
17611
+ usage: {
17612
+ input_tokens: usage.inputTokens || 0,
17613
+ output_tokens: usage.outputTokens || 0,
17614
+ cache_creation_input_tokens: 0,
17615
+ cache_read_input_tokens: 0
17616
+ }
17617
+ });
17618
+ }
17619
+ } catch (error48) {
17620
+ if (ctx.signal.aborted) {
17621
+ flushPendingToolCallsAsErrors("Tool call cancelled (request aborted).");
17622
+ return;
17655
17623
  }
17656
- // No resolveTitle → teardown uses 'unread' with undefined title (matches original).
17624
+ flushPendingToolCallsAsErrors("Tool call failed (stream error).");
17625
+ throw error48;
17626
+ }
17627
+ }
17628
+
17629
+ // packages/feature/agent/src/server/engines/deepseek.ts
17630
+ var DEEPSEEK_BASE_URL = "https://api.deepseek.com/anthropic";
17631
+ var DEFAULT_MODEL = "deepseek-v4-pro";
17632
+ var SMALL_FAST_MODEL = "deepseek-v4-flash";
17633
+ var ALLOWED_MODELS = /* @__PURE__ */ new Set(["deepseek-v4-flash", "deepseek-v4-pro"]);
17634
+ var DEEPSEEK_OPENAI_BASE_URL = "https://api.deepseek.com/v1";
17635
+ var BUILTIN_DEFAULT_MODEL = DEFAULT_MODEL;
17636
+ async function readSettings() {
17637
+ return readJsonFile(SETTINGS_FILE, {});
17638
+ }
17639
+ function resolveModel(requested, saved) {
17640
+ if (typeof requested === "string" && ALLOWED_MODELS.has(requested)) return requested;
17641
+ if (saved && ALLOWED_MODELS.has(saved)) return saved;
17642
+ return DEFAULT_MODEL;
17643
+ }
17644
+ function resolveBuiltinModel(requested, saved) {
17645
+ if (typeof requested === "string" && requested.trim()) return requested.trim();
17646
+ if (saved && saved.trim()) return saved.trim();
17647
+ return BUILTIN_DEFAULT_MODEL;
17648
+ }
17649
+ function buildBuiltinConfig(apiKey) {
17650
+ return {
17651
+ sessionsRoot: getBuiltinSessionsRoot("deepseek"),
17652
+ defaultModel: BUILTIN_DEFAULT_MODEL,
17653
+ createModel: async (modelName) => createOpenAiCompatModel({ baseURL: DEEPSEEK_OPENAI_BASE_URL, apiKey, modelName })
17654
+ };
17655
+ }
17656
+ function buildDeepseekEnv(apiKey, model) {
17657
+ return sanitizedSpawnEnv({
17658
+ ANTHROPIC_AUTH_TOKEN: void 0,
17659
+ ANTHROPIC_BASE_URL: DEEPSEEK_BASE_URL,
17660
+ ANTHROPIC_API_KEY: apiKey,
17661
+ // DeepSeek sends this as x-api-key (fully supported)
17662
+ ANTHROPIC_MODEL: model,
17663
+ ANTHROPIC_SMALL_FAST_MODEL: SMALL_FAST_MODEL,
17664
+ CLAUDE_CONFIG_DIR: DEEPSEEK_DIR,
17665
+ DISABLE_PROMPT_CACHING: "1",
17666
+ // DeepSeek runs its own server-side prefix KV cache
17667
+ CLAUDE_CODE_USE_BEDROCK: "0",
17668
+ CLAUDE_CODE_USE_VERTEX: "0",
17669
+ CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
17670
+ });
17671
+ }
17672
+ function buildDeepseekOptions(ctx, env) {
17673
+ return (abort, resume) => ({
17674
+ ...resume && { resume },
17675
+ ...ctx.cwd && { cwd: ctx.cwd },
17676
+ settingSources: ["user", "project", "local"],
17677
+ permissionMode: "bypassPermissions",
17678
+ allowDangerouslySkipPermissions: true,
17679
+ includePartialMessages: true,
17680
+ abortController: abort,
17681
+ env
17682
+ });
17683
+ }
17684
+ var isBuiltinMode = (params) => params.mode === "builtin";
17685
+ var deepseekSpec = {
17686
+ name: "deepseek",
17687
+ // Pre-check BEFORE startRun: API key must exist; resolve model into params (no registry pollution).
17688
+ async preflight(params) {
17689
+ const settings = await readSettings();
17690
+ const apiKey = await readDeepseekApiKey();
17691
+ if (!apiKey) {
17692
+ return {
17693
+ ok: false,
17694
+ status: 400,
17695
+ error: "DeepSeek API key is not configured. Open the DeepSeek picker in the chat header to set one."
17696
+ };
17697
+ }
17698
+ const requested = typeof params.model === "string" ? params.model : void 0;
17699
+ if (isBuiltinMode(params)) {
17700
+ const textCheck = requireTextPrompt(params);
17701
+ if (!textCheck.ok) return textCheck;
17702
+ params.model = resolveBuiltinModel(requested, settings.engines?.deepseek?.builtinModel);
17703
+ return { ok: true };
17704
+ }
17705
+ params.model = resolveModel(requested, settings.engines?.deepseek?.model);
17706
+ return { ok: true };
17707
+ },
17708
+ runner: {
17709
+ async run(ctx) {
17710
+ const apiKey = await readDeepseekApiKey();
17711
+ if (isBuiltinMode(ctx.params)) {
17712
+ await runBuiltinAgent(ctx, buildBuiltinConfig(apiKey));
17713
+ return;
17714
+ }
17715
+ const model = typeof ctx.params.model === "string" ? ctx.params.model : DEFAULT_MODEL;
17716
+ const env = buildDeepseekEnv(apiKey, model);
17717
+ await runSdkLoop(ctx, buildDeepseekOptions(ctx, env));
17718
+ },
17719
+ resolveTitle: (cwd, sessionId) => getSessionTitle(cwd, sessionId)
17720
+ }
17721
+ };
17722
+
17723
+ // packages/feature/agent/src/server/engines/ollama.ts
17724
+ var DEFAULT_MODEL2 = "qwen3.5:35b-a3b-coding-nvfp4";
17725
+ var OLLAMA_CONFIG = {
17726
+ sessionsRoot: getBuiltinSessionsRoot("ollama"),
17727
+ defaultModel: DEFAULT_MODEL2,
17728
+ createModel: (model) => createOllamaModel(model)
17729
+ };
17730
+ var ollamaSpec = {
17731
+ name: "ollama",
17732
+ async preflight(params) {
17733
+ return requireTextPrompt(params);
17734
+ },
17735
+ runner: {
17736
+ run: (ctx) => runBuiltinAgent(ctx, OLLAMA_CONFIG)
17737
+ // No resolveTitle → teardown uses 'unread' with undefined title.
17657
17738
  }
17658
17739
  };
17659
17740
 
@@ -17711,7 +17792,7 @@ var kimiSpec = {
17711
17792
  const child = spawn2("kimi", args, {
17712
17793
  stdio: ["ignore", "pipe", "pipe"],
17713
17794
  cwd: cwd || void 0,
17714
- env: { ...process.env }
17795
+ env: sanitizedSpawnEnv()
17715
17796
  });
17716
17797
  ctx.signal.addEventListener("abort", () => child.kill("SIGTERM"), { once: true });
17717
17798
  if (sessionId) {
@@ -17848,7 +17929,7 @@ var codexSpec = {
17848
17929
  const child = spawn3("codex", args, {
17849
17930
  stdio: ["ignore", "pipe", "pipe"],
17850
17931
  cwd: cwd || void 0,
17851
- env: { ...process.env }
17932
+ env: sanitizedSpawnEnv()
17852
17933
  });
17853
17934
  ctx.signal.addEventListener("abort", () => child.kill("SIGTERM"), { once: true });
17854
17935
  const pendingToolCalls = /* @__PURE__ */ new Map();
@@ -17975,8 +18056,2366 @@ function getEngineSpec(engine) {
17975
18056
  return SPECS[engine ?? "claude"];
17976
18057
  }
17977
18058
 
18059
+ // packages/shared/i18n/src/index.ts
18060
+ import i18n from "i18next";
18061
+
18062
+ // packages/shared/i18n/locales/en.json
18063
+ var en_default2 = {
18064
+ common: {
18065
+ save: "Save",
18066
+ cancel: "Cancel",
18067
+ delete: "Delete",
18068
+ close: "Close",
18069
+ copy: "Copy",
18070
+ edit: "Edit",
18071
+ file: "File",
18072
+ codeMap: "Code Map",
18073
+ diff: "Diff",
18074
+ confirm: "Confirm",
18075
+ loading: "Loading...",
18076
+ search: "Search",
18077
+ refresh: "Refresh",
18078
+ retry: "Retry",
18079
+ submit: "Submit",
18080
+ copied: "Copied",
18081
+ saved: "Saved",
18082
+ failed: "Failed",
18083
+ noMatch: "No matches",
18084
+ noData: "No data",
18085
+ done: "Done",
18086
+ justNow: "just now",
18087
+ minutesAgo: "{{count}}m ago",
18088
+ hoursAgo: "{{count}}h ago",
18089
+ daysAgo: "{{count}}d ago",
18090
+ monthsAgo: "{{count}}mo ago",
18091
+ yearsAgo: "{{count}}y ago",
18092
+ saveFailed: "Save failed",
18093
+ copyFailed: "Copy failed",
18094
+ deleteFailed: "Delete failed",
18095
+ operationFailed: "Operation failed",
18096
+ copiedPath: "Path copied",
18097
+ copyPath: "Copy path",
18098
+ openInConsole: "Open in Console bubble",
18099
+ copyAbsPath: "Copy absolute path",
18100
+ loadMore: "Load more",
18101
+ noResult: "No results",
18102
+ selected: "Selected",
18103
+ selectAll: "Select all",
18104
+ hint: "Notice",
18105
+ confirmBtn: "OK",
18106
+ cancelBtn: "Cancel",
18107
+ preview: "Preview",
18108
+ readable: "Readable",
18109
+ previous: "Previous",
18110
+ next: "Next",
18111
+ all: "All",
18112
+ input: "Input",
18113
+ result: "Result",
18114
+ line: "Line",
18115
+ lines: "lines",
18116
+ running: "Running",
18117
+ connecting: "Connecting",
18118
+ connected: "Connected",
18119
+ connectionFailed: "Connection failed",
18120
+ builtin: "Built-in",
18121
+ global: "Global",
18122
+ project: "Project",
18123
+ current: "Current"
18124
+ },
18125
+ htmlApps: {
18126
+ addTooltip: "Add to HTML panel",
18127
+ added: "Added to HTML panel",
18128
+ alreadyAdded: "Already added",
18129
+ addFailed: "Failed to add"
18130
+ },
18131
+ skills: {
18132
+ addTooltip: "Add to Skills panel",
18133
+ added: "Added to Skills panel",
18134
+ alreadyAdded: "Already added",
18135
+ addFailed: "Failed to add",
18136
+ title: "Skills",
18137
+ searchPlaceholder: "Search skills...",
18138
+ clearSearch: "Clear",
18139
+ addSkill: "Add Skill",
18140
+ emptyNoSkills: 'No skills yet. Click "Add Skill" to add one.',
18141
+ emptyNoMatch: "No skills match your search.",
18142
+ pathLabel: "Absolute path to SKILL.md",
18143
+ pathPlaceholder: "/Users/you/.../skills/foo/SKILL.md",
18144
+ add: "Add",
18145
+ adding: "Adding...",
18146
+ invalid: "Invalid",
18147
+ copyPath: "Copy path",
18148
+ noDescription: "No description",
18149
+ previewTitle: "Skill Preview",
18150
+ source: "Source",
18151
+ cannotRead: "File cannot be read."
18152
+ },
18153
+ toast: {
18154
+ savedSuccess: "Saved",
18155
+ saveFailed: "Save failed",
18156
+ copiedName: "Copied: {{name}}",
18157
+ copyFailed: "Copy failed",
18158
+ deleteFailed: "Delete failed",
18159
+ operationFailed: "Operation failed",
18160
+ staged: "Staged",
18161
+ stageFailed: "Stage failed",
18162
+ unstaged: "Unstaged",
18163
+ unstageFailed: "Unstage failed",
18164
+ stagedNFiles: "Staged {{count}} files",
18165
+ unstagedNFiles: "Unstaged {{count}} files",
18166
+ discardFailed: "Discard failed",
18167
+ discardedNFiles: "Discarded changes in {{count}} files",
18168
+ stagedAllFiles: "All files staged",
18169
+ deletedFile: "File deleted",
18170
+ discardedChanges: "Changes discarded",
18171
+ pastedFile: "Pasted: {{name}}",
18172
+ pasteFailed: "Paste failed",
18173
+ noFileToPaste: "No file to paste",
18174
+ createdFile: "Created: {{name}}",
18175
+ createFailed: "Create failed",
18176
+ movedToTrash: "Moved to trash: {{name}}",
18177
+ copiedPageUrl: "Page URL copied",
18178
+ copiedDirPath: "Directory path copied",
18179
+ switchedToBranch: "Switched to {{branch}}",
18180
+ switchBranchFailed: "Branch switch failed",
18181
+ loadBranchFailed: "Failed to load branches",
18182
+ copiedCommand: "Copied: {{command}}",
18183
+ copiedMessage: "Message copied",
18184
+ copiedUrl: "URL copied",
18185
+ copiedOutput: "Output copied",
18186
+ copiedCmd: "Command copied",
18187
+ copiedComment: "Comment copied",
18188
+ copiedAllComments: "All comments copied",
18189
+ copiedFileContent: "File content copied",
18190
+ copiedQA: "Copied {{count}} Q&A",
18191
+ copiedAllQA: "All Q&A copied",
18192
+ sentQA: "Sent to AI",
18193
+ readFileFailed: "Failed to read file",
18194
+ reviewCreated: "Review created, link copied",
18195
+ reviewUpdated: "Review updated, link copied",
18196
+ reviewCreateFailed: "Failed to create review",
18197
+ sharingClosed: "Sharing disabled",
18198
+ sharingCloseFailed: "Failed to disable sharing",
18199
+ linkCopied: "Link copied",
18200
+ addCommentFailed: "Failed to add comment",
18201
+ deleteCommentFailed: "Failed to delete comment",
18202
+ editCommentFailed: "Failed to edit comment",
18203
+ addReplyFailed: "Failed to add reply",
18204
+ deleteReplyFailed: "Failed to delete reply",
18205
+ editReplyFailed: "Failed to edit reply",
18206
+ disconnected: "Disconnected: {{id}}",
18207
+ pluginReloading: "Reloading extension...",
18208
+ worktreeCreateSuccess: "Worktree created: {{name}}",
18209
+ worktreeCreateFailed: "Failed to create worktree",
18210
+ worktreeLoadFailed: "Failed to load worktree list",
18211
+ worktreeDeleted: "Worktree deleted",
18212
+ worktreeDeleteFailed: "Failed to delete worktree",
18213
+ worktreeLocked: "Locked",
18214
+ worktreeUnlocked: "Unlocked"
18215
+ },
18216
+ workspace: {
18217
+ selectProject: "Select a project to start",
18218
+ searchProjectPath: "Search project path...",
18219
+ loadingProjects: "Loading projects...",
18220
+ projectNotFound: "No projects found",
18221
+ sessions: "{{count}} sessions",
18222
+ loadingSessions: "Loading sessions...",
18223
+ noSessions: "No sessions",
18224
+ loadingText: "Loading...",
18225
+ openProject: "Open Project",
18226
+ expandSidebar: "Expand sidebar",
18227
+ collapseSidebar: "Collapse sidebar",
18228
+ notes: "Notes",
18229
+ skills: "Skills",
18230
+ settings: "Settings",
18231
+ help: "Help",
18232
+ updateAvailable: "v{{version}} available",
18233
+ copyUpgradeCommand: "Copy cockpit update",
18234
+ viewChangelog: "View changelog",
18235
+ upgradeCommandCopied: "Copied `cockpit update`",
18236
+ projectNotes: "Project Notes",
18237
+ closeProject: "Close project"
18238
+ },
18239
+ mobile: {
18240
+ useDesktop: "Desktop",
18241
+ messagePlaceholder: "Message\u2026",
18242
+ send: "Send",
18243
+ stop: "Stop",
18244
+ enableNotifications: "Enable notifications",
18245
+ disableNotifications: "Disable notifications",
18246
+ notifyError: "Could not enable notifications"
18247
+ },
18248
+ sessions: {
18249
+ recentSessions: "Recent Sessions",
18250
+ runningCount: "{{count}} running",
18251
+ unreadCount: "{{count}} unread",
18252
+ noSessions: "No sessions yet",
18253
+ running: "Running",
18254
+ done: "Done",
18255
+ pinnedSessions: "Pinned Sessions",
18256
+ noPinnedSessions: "No pinned sessions. Click the pin icon in the tab bar to add.",
18257
+ editTitle: "Edit title",
18258
+ remove: "Remove",
18259
+ projectSessions: "Project Sessions",
18260
+ browseAllSessions: "Browse all sessions",
18261
+ sessionList: "Session List",
18262
+ searchSessions: "Search sessions...",
18263
+ searchRecentSessions: "Search recent sessions",
18264
+ loadSessionsFailed: "Failed to load sessions",
18265
+ loadingSessions: "Loading sessions...",
18266
+ noMatchingSessions: "No matching sessions",
18267
+ noSessionsYet: "No sessions yet",
18268
+ projectList: "Project List",
18269
+ openFolder: "Open Folder",
18270
+ selectingFolder: "Selecting...",
18271
+ loadingHistory: "Loading history..."
18272
+ },
18273
+ scheduledTasks: {
18274
+ title: "Scheduled Tasks",
18275
+ aboutToTrigger: "About to trigger",
18276
+ secondsLater: "in {{count}}s",
18277
+ minutesLater: "in {{count}}m",
18278
+ hoursMinutesLater: "in {{h}}h {{m}}m",
18279
+ hoursLater: "in {{h}}h",
18280
+ onceType: "Once ({{minutes}}min)",
18281
+ everyNMinutes: "Every {{minutes}}min",
18282
+ completed: "Completed",
18283
+ paused: "Paused",
18284
+ activeCount: "{{running}} active",
18285
+ pausedCount: "{{paused}} paused",
18286
+ noScheduledTasks: "No scheduled tasks. Click the clock button in the chat input to create one.",
18287
+ lastResult: "Last",
18288
+ runNow: "Run now",
18289
+ resume: "Resume",
18290
+ pause: "Pause",
18291
+ completedCount: "Completed ({{count}})",
18292
+ success: "Success",
18293
+ failure: "Failed",
18294
+ createTask: "Create Scheduled Task",
18295
+ editTask: "Edit Scheduled Task",
18296
+ sendMessage: "Message",
18297
+ messagePlaceholder: "Enter message to send...",
18298
+ taskFile: "Task File",
18299
+ taskFilePlaceholder: "/Users/you/project/tasks/daily-report.md",
18300
+ taskFileHint: "Absolute path. On each fire the agent reads this file first and acts on what it describes \u2014 edits take effect on the next run.",
18301
+ taskFilePromptHeader: "Read this task file first, then act accordingly:",
18302
+ type: "Type",
18303
+ once: "Once",
18304
+ interval: "Interval",
18305
+ quickSelect: "Quick Select",
18306
+ customCron: "Custom Cron Expression",
18307
+ customMinutes: "Custom minutes",
18308
+ cronPlaceholder: "e.g. 0 9 * * 1-5 (weekdays at 9am)",
18309
+ cronFormat: "Format: min hour day month weekday (e.g. 0 9 * * 1-5)",
18310
+ minutesPlaceholder: "Minutes",
18311
+ limitTimeRange: "Limit execution time range",
18312
+ to: "to",
18313
+ saveBtn: "Save ({{modKey}}\u21A9)",
18314
+ createBtn: "Create ({{modKey}}\u21A9)",
18315
+ "5minLater": "In 5 minutes",
18316
+ "15minLater": "In 15 minutes",
18317
+ "30minLater": "In 30 minutes",
18318
+ "1hourLater": "In 1 hour",
18319
+ every15min: "Every 15 min",
18320
+ every30min: "Every 30 min",
18321
+ every1hour: "Every 1 hour",
18322
+ every2hours: "Every 2 hours",
18323
+ daily9am: "Daily 09:00",
18324
+ daily6pm: "Daily 18:00",
18325
+ weeklyMon9am: "Mon 09:00",
18326
+ monthly1st9am: "1st of month 09:00"
18327
+ },
18328
+ cron: {
18329
+ everyNMinutes: "Every {{n}} minutes",
18330
+ everyNHours: "Every {{n}} hours",
18331
+ everyMinute: "Every minute",
18332
+ everyHourAtMin: "Every hour at minute {{m}}",
18333
+ hourlyEveryMin: "{{h}}:xx every minute",
18334
+ daily: "Daily at {{time}}",
18335
+ weekdays: "Weekdays",
18336
+ weekends: "Weekends",
18337
+ dowSun: "Sun",
18338
+ dowMon: "Mon",
18339
+ dowTue: "Tue",
18340
+ dowWed: "Wed",
18341
+ dowThu: "Thu",
18342
+ dowFri: "Fri",
18343
+ dowSat: "Sat",
18344
+ monthPrefix: "",
18345
+ dayOfMonth: "",
18346
+ dayRange: "{{a}}th to {{b}}th",
18347
+ weekdayPrefix: "",
18348
+ weekdayRange: "{{a}} to {{b}}"
18349
+ },
18350
+ blockViewer: {
18351
+ empty: {
18352
+ body: "Select a file in the left tree to see its code map.",
18353
+ hint: "or press \u2318K to search."
18354
+ },
18355
+ fileMode: {
18356
+ loading: "Loading\u2026",
18357
+ notFound: "This file is not indexed (unsupported language or beyond the file cap)."
18358
+ },
18359
+ search: {
18360
+ tooltip: "Search (\u2318K)",
18361
+ hint: "Start typing to search",
18362
+ noResults: "No matches",
18363
+ files: "Files",
18364
+ symbols: "Symbols"
18365
+ },
18366
+ viewerToggle: {
18367
+ toBlock: "Show code map",
18368
+ toCode: "Back to code view"
18369
+ },
18370
+ toc: {
18371
+ title: "this file",
18372
+ empty: "No functions detected.",
18373
+ notIndexed: "File not in project graph (unsupported language / not in git tracked set / file cap reached)."
18374
+ },
18375
+ history: {
18376
+ title: "history",
18377
+ empty: "Click an input or output pin to begin tracing.",
18378
+ clear: "Clear history"
18379
+ },
18380
+ refresh: "Rebuild project graph",
18381
+ retry: "Retry"
18382
+ },
18383
+ blockDiffViewer: {
18384
+ loading: "Building code map\u2026",
18385
+ unsupported: "Code map diff is not available for this file type.",
18386
+ unsupportedHint: "Switch back to the regular diff view to read it.",
18387
+ error: "Code map diff failed: {{message}}",
18388
+ noBlockChanges: "No code-map changes (formatting / whitespace only).",
18389
+ noBefore: "(new)",
18390
+ noAfter: "(removed)",
18391
+ kind: {
18392
+ added: "added",
18393
+ deleted: "deleted",
18394
+ modified: "modified"
18395
+ }
18396
+ },
18397
+ fileBrowser: {
18398
+ directoryTree: "Tree",
18399
+ searchTab: "Search",
18400
+ recentTab: "Recent",
18401
+ changesTab: "Status",
18402
+ historyTab: "History",
18403
+ searchFiles: "Search files...",
18404
+ clear: "Clear",
18405
+ exactMatchOn: "Exact match (on)",
18406
+ exactMatchOff: "Exact match (off)",
18407
+ refreshTree: "Refresh directory tree",
18408
+ collapseAll: "Collapse all directories",
18409
+ searchFileContent: "Search file contents...",
18410
+ caseSensitive: "Case sensitive",
18411
+ wholeWord: "Whole word",
18412
+ regex: "Regex",
18413
+ fileTypes: "File types (ts,tsx)",
18414
+ compareMode: "Compare",
18415
+ compareModeOff: "Close branch comparison",
18416
+ compareModeOn: "Compare with selected branch",
18417
+ createFile: "New File",
18418
+ createFileIn: "New File (in {{path}}/)",
18419
+ fileName: "File name...",
18420
+ noRecentFiles: "No recent files",
18421
+ stagingArea: "Staged ({{count}})",
18422
+ changesSummary_one: "{{count}} change",
18423
+ changesSummary_other: "{{count}} changes",
18424
+ noChanges: "No changes in working tree",
18425
+ refreshChanges: "Refresh changes",
18426
+ unstageAll: "Unstage all",
18427
+ noStagedFiles: "No staged files",
18428
+ unstageNFiles: "Unstage {{count}} files",
18429
+ unstageFile: "Unstage",
18430
+ workspace: "Workspace ({{count}})",
18431
+ discardAll: "Discard all",
18432
+ stageAll: "Stage all",
18433
+ noUnstagedChanges: "No unstaged changes",
18434
+ discardNFiles: "Discard changes in {{count}} files",
18435
+ stageNFiles: "Stage {{count}} files",
18436
+ discardChanges: "Discard changes",
18437
+ stageFile: "Stage file",
18438
+ loadingDiff: "Loading diff...",
18439
+ noDiffFiles: "No diff files",
18440
+ nFilesChanged: "{{count}} files changed (vs {{branch}})",
18441
+ loadingCommits: "Loading commits...",
18442
+ noCommits: "No commits",
18443
+ allLoaded: "All {{count}} records loaded",
18444
+ locateInTree: "Locate in directory tree",
18445
+ unsaved: "Unsaved",
18446
+ saveBeforeSwitch: "Current file has unsaved changes. Save before switching?",
18447
+ saveAndSwitch: "Save and switch",
18448
+ closeEdit: "Close edit (ESC)",
18449
+ closeBtn: "Close",
18450
+ copyFileContent: "Copy file content",
18451
+ toggleJsonReadable: "Toggle JSON readable mode",
18452
+ previewMarkdown: "Preview Markdown",
18453
+ exitPreview: "Exit Preview",
18454
+ viewBlame: "View line-by-line change history",
18455
+ viewDiff: "View changes against HEAD",
18456
+ exitDiff: "Exit Diff",
18457
+ diffLoadFailed: "Failed to load diff",
18458
+ editFile: "Edit file",
18459
+ backToPreview: "Back to preview",
18460
+ cannotPreview: "Cannot preview this file",
18461
+ selectFileToPreview: "Select a file to preview",
18462
+ staged: "Staged",
18463
+ unstaged: "Unstaged",
18464
+ selectFileToViewDiff: "Select a file to view diff",
18465
+ loadingDiffContent: "Loading diff...",
18466
+ clickCompareToLoad: 'Click "Compare" to load branch diff',
18467
+ selectCommitToView: "Select a commit to view details",
18468
+ confirmDelete: "Confirm Delete",
18469
+ confirmDeleteMessage: "Move <file>{{name}}</file> to trash?",
18470
+ nFilesNMatches: "{{files}} files, {{matches}} matches",
18471
+ resultsTruncated: "Results truncated",
18472
+ noContentSearchResults: "No results",
18473
+ enterKeywordToSearch: "Enter keyword to search file contents",
18474
+ searchMinChars: "Search requires at least 2 characters"
18475
+ },
18476
+ codeViewer: {
18477
+ fileModifiedExternally: "File was modified externally. Saving will overwrite external changes.",
18478
+ useDiskVersion: "Use disk version",
18479
+ forceOverwrite: "Force overwrite",
18480
+ searchPlaceholder: "Search...",
18481
+ caseSensitive: "Case sensitive",
18482
+ wholeWordMatch: "Whole word match",
18483
+ unsavedConfirm: "You have unsaved changes. Close anyway?",
18484
+ discardChanges: "Discard changes",
18485
+ continueEditing: "Continue editing",
18486
+ unsavedExitConfirm: "You have unsaved changes. Exit edit mode?",
18487
+ clickToViewDetails: "Click to view details",
18488
+ clickToViewCommit: "Click to view commit details",
18489
+ nComments: "{{count}} comments",
18490
+ searchChat: "Search chat...",
18491
+ prevShiftEnter: "Previous (Shift+Enter)",
18492
+ nextEnter: "Next (Enter)",
18493
+ closeEsc: "Close (Esc)"
18494
+ },
18495
+ chat: {
18496
+ startConversation: "Start a conversation",
18497
+ loadMoreHistory: "Load more...",
18498
+ scrollUpForMore: "\u2191 Scroll up to load more history",
18499
+ claudeThinking: "Claude is thinking...",
18500
+ jumpToStart: "Jump to start",
18501
+ jumpToLatest: "Jump to latest",
18502
+ copyMessage: "Copy message",
18503
+ forkSession: "Fork session from here",
18504
+ imageN: "Image {{index}}",
18505
+ imagePreview: "Image preview",
18506
+ toolCalls: "{{count}} tool calls",
18507
+ collapse: "\u25B2 Collapse",
18508
+ expand: "\u25BC Expand",
18509
+ subagent: "Subagent",
18510
+ subagentEmpty: "No subagent transcript found",
18511
+ subagentViewTitle: "View subagent transcript",
18512
+ workflowRun: "Run details",
18513
+ workflowViewTitle: "View workflow run details",
18514
+ workflowEmpty: "No workflow run journal found",
18515
+ workflowAgents: "agents",
18516
+ workflowViewAgent: "View",
18517
+ workflowUngrouped: "Ungrouped",
18518
+ viewQuestions: "View questions",
18519
+ viewAllFileChanges: "View all file changes",
18520
+ requestFailed: "Request failed",
18521
+ cannotReadStream: "Cannot read response stream",
18522
+ errorRetry: "An error occurred, please retry",
18523
+ placeholder: "Type a message, Enter to send (Shift+Enter for new line, paste images; start a line with / (main session) or @ (subagent) for commands, multiple allowed)",
18524
+ placeholderDisabled: "Generating... you can keep typing (ESC to cancel; if stuck, cancel and resend 'continue')",
18525
+ imageSizeLimit: "Image size exceeds limit (max 5MB), current: {{size}}MB",
18526
+ stageAll: "Stage all files (git add -A)",
18527
+ viewGitChanges: "View Git changes",
18528
+ viewAllComments: "View all comments",
18529
+ userMessages: "User messages",
18530
+ projectNotes: "Project Notes",
18531
+ scheduledTasks: "Scheduled Tasks",
18532
+ quickPrompts: "Quick Prompts",
18533
+ globalPrompts: "Global Prompts",
18534
+ projectPrompts: "Project Prompts",
18535
+ noQuickPrompts: "No quick prompts yet",
18536
+ addQuickPrompt: "Add quick prompt",
18537
+ quickPromptPlaceholder: "One-line prompt \u2014 Enter to save, Esc to cancel",
18538
+ context: "Context",
18539
+ output: "Output",
18540
+ copiedCommandTooltip: "Copied!",
18541
+ copyCommandTooltip: "Copy command: claude -r {{sessionId}}",
18542
+ executedCommand: "Executed `{{command}}`{{exitInfo}}, output:\n```\n{{output}}\n```",
18543
+ executedCommandFailed: "Failed to execute `{{command}}`: {{error}}",
18544
+ executionMode: "Execution Mode",
18545
+ checkBalance: "Check balance",
18546
+ balanceFailed: "Query failed \u2014 check the API key",
18547
+ balanceNeedsKey: "Set a DeepSeek API key first",
18548
+ balanceUnavailable: "Account is not available for requests",
18549
+ balanceEmpty: "No balance returned",
18550
+ openUsagePage: "Open DeepSeek usage console",
18551
+ ptyModeHint: "Subscription billing mode: uses interactive claude CLI",
18552
+ planMode: "Plan mode",
18553
+ planModeDesc: "read-only \xB7 plan first, no edits",
18554
+ planModeOn: "Plan mode on \u2014 read-only; send a task to get a plan",
18555
+ planModeOff: "Plan mode off",
18556
+ planModeHint: "Plan mode: read-only exploration that produces a plan without editing. Uncheck and resend to implement.",
18557
+ noHistory: "Independent task",
18558
+ noHistoryDesc: "no history sent",
18559
+ noHistoryHint: "Independent task: each message is sent to the model on its own, with no prior conversation. The transcript above still records everything.",
18560
+ planTitle: "Plan (awaiting your review)",
18561
+ approvePlan: "Approve & run",
18562
+ planApproveHint: "No approval dialog here \u2014 click to exit plan mode and execute",
18563
+ approvePlanPrompt: "Approved \u2014 proceed with the plan above.",
18564
+ ptyTerminal: "PTY Terminal",
18565
+ ptyRunning: "running",
18566
+ ptyCollapse: "Collapse",
18567
+ ptyExpand: "Expand",
18568
+ ptyStuck: "PTY seems stuck (waiting for a dialog?). Please handle it in the terminal below.",
18569
+ ptyTimedOut: "PTY timed out without manual handling; the turn was terminated.",
18570
+ ptyCrash: "Claude CLI render crash (upstream bug): {{error}}. This session's history may contain edits that fail to render.",
18571
+ ptyQuestionEsc: "AI asked an interactive question, which cannot be answered in this mode; it was auto-cancelled and the turn was ended. See the question in the chat and answer it in your next message."
18572
+ },
18573
+ console: {
18574
+ enterCommandOrUrl: "Enter a command or URL to start",
18575
+ emptyIntro: "Type any of the following in the input bar to create a bubble:",
18576
+ bubbleCommand: "Command",
18577
+ bubbleInteractive: "Interactive",
18578
+ bubbleBrowser: "Browser",
18579
+ bubbleBrowserNoteIframe: "Some sites block iframe embedding \u2014 install Cockpit Bridge under Settings \u2192 Browser Extension before opening.",
18580
+ bubbleBrowserNoteCookie: "If a logged-in site first shows as signed out, refresh a few times to restore it.",
18581
+ bubbleDatabase: "Database",
18582
+ bubbleNotebook: "Notebook",
18583
+ loadingMore: "Loading...",
18584
+ loadMoreHistory: "Load more history",
18585
+ quickCommands: "Quick Commands",
18586
+ singleColumn: "Single column",
18587
+ dualColumn: "Dual column",
18588
+ envVars: "Environment Variables",
18589
+ launchZsh: "Launch zsh terminal",
18590
+ htmlApps: "HTML apps",
18591
+ inputPlaceholder: "Enter command or URL and press Enter... (\u2191\u2193 history, Tab complete)",
18592
+ scopeProject: "Project",
18593
+ scopeGlobal: "Global",
18594
+ tabSwitchEscClose: "Tab to switch \xB7 Esc to close",
18595
+ copyOutput: "Copy output",
18596
+ copyCommand: "Copy command",
18597
+ rerun: "Re-run",
18598
+ deleteRecord: "Delete record",
18599
+ searchPlaceholder: "Search...",
18600
+ searchMode: "Search",
18601
+ filterMode: "Filter",
18602
+ prevShiftEnter: "Previous (Shift+Enter)",
18603
+ nextEnter: "Next (Enter)",
18604
+ loadingTerminal: "Loading terminal...",
18605
+ clickToInput: "Click terminal area to type",
18606
+ stdinPlaceholder: "stdin input...",
18607
+ runningText: "Running...",
18608
+ exitCode: "Exit code: {{code}}",
18609
+ totalLines: "{{count}} lines total",
18610
+ globalCommands: "Global Commands",
18611
+ projectCommands: "Project Commands",
18612
+ noCustomCommands: "No custom commands yet",
18613
+ namePlaceholder: "Name",
18614
+ commandPlaceholder: "Command",
18615
+ restoreTooltip: "Restore ({{modKey}}M / ESC)",
18616
+ screenshotting: "Screenshotting...",
18617
+ outputFileDeleted: "[Output file deleted]"
18618
+ },
18619
+ browser: {
18620
+ blankPage: "Blank page",
18621
+ copyUrl: "Copy URL",
18622
+ openInNewWindow: "Open in new window",
18623
+ exitMaximize: "Exit maximize ({{modKey}}M)",
18624
+ maximize: "Maximize ({{modKey}}M)",
18625
+ pageLoadFailed: "Page load failed",
18626
+ clickToWake: "Click to wake",
18627
+ sleeping: "Sleeping",
18628
+ loadingPage: "Loading...",
18629
+ loadFailed: "Load failed"
18630
+ },
18631
+ database: {
18632
+ connectionFailed: "Connection failed",
18633
+ connected: "Connected",
18634
+ connecting: "Connecting...",
18635
+ refreshTableList: "Refresh table list",
18636
+ filterTable: "T Tables",
18637
+ filterView: "V Views",
18638
+ noTables: "No tables",
18639
+ tabStructure: "Structure",
18640
+ tabData: "Data",
18641
+ tabSql: "SQL",
18642
+ filterActive: "Filter: {{count}} cols",
18643
+ clearAllFilters: "Clear all filters",
18644
+ deleteNRows: "Delete {{count}} rows",
18645
+ confirmDeleteRows: "Confirm delete?",
18646
+ copyCsvSelected: "Copy selected rows as CSV",
18647
+ copyCsvAll: "Export all as CSV",
18648
+ copyJsonSelected: "Copy selected rows as JSON",
18649
+ copyJsonAll: "Export all as JSON",
18650
+ copyCSV: "Copy CSV",
18651
+ CSV: "CSV",
18652
+ copyJSON: "Copy JSON",
18653
+ JSON: "JSON",
18654
+ selectTable: "Select a table",
18655
+ selectTableToView: "Select a table to view structure",
18656
+ selectTableForData: "Select a table to view data",
18657
+ columns: "Columns",
18658
+ colName: "Name",
18659
+ colType: "Type",
18660
+ colNullable: "Nullable",
18661
+ colDefault: "Default",
18662
+ primaryKey: "Primary Key",
18663
+ foreignKeys: "Foreign Keys",
18664
+ indexes: "Indexes",
18665
+ enable: "Enable",
18666
+ commaValues: "Comma-separated values",
18667
+ likePattern: "%pattern%",
18668
+ valuePlaceholder: "Value",
18669
+ apply: "Apply",
18670
+ clearFilter: "Clear",
18671
+ addRow: "+ Add Row",
18672
+ totalRows: "{{count}} rows",
18673
+ rowsAffected: "{{command}} \u2014 {{count}} rows affected ({{duration}}ms)",
18674
+ queryRows: "{{count}} rows ({{duration}}ms)",
18675
+ resultTruncated: "[Results truncated to 1000 rows]",
18676
+ sqlPlaceholder: "Enter SQL... ({{modKey}}Enter to execute)",
18677
+ executing: "Executing...",
18678
+ execute: "\u25B6 Execute",
18679
+ deleteRowsFailed: "{{count}} rows failed to delete",
18680
+ inputParams: "Input Parameters",
18681
+ resultLabel: "Result"
18682
+ },
18683
+ mysql: {
18684
+ connectionFailed: "Connection failed",
18685
+ connected: "Connected",
18686
+ connecting: "Connecting...",
18687
+ refreshTableList: "Refresh table list",
18688
+ filterTable: "T Tables",
18689
+ filterView: "V Views",
18690
+ noTables: "No tables",
18691
+ tabStructure: "Structure",
18692
+ tabData: "Data",
18693
+ tabSql: "SQL",
18694
+ filterActive: "Filter: {{count}} cols",
18695
+ clearAllFilters: "Clear all filters",
18696
+ deleteNRows: "Delete {{count}} rows",
18697
+ confirmDeleteRows: "Confirm delete?",
18698
+ copyCsvSelected: "Copy selected rows as CSV",
18699
+ copyCsvAll: "Export all as CSV",
18700
+ copyJsonSelected: "Copy selected rows as JSON",
18701
+ copyJsonAll: "Export all as JSON",
18702
+ copyCSV: "Copy CSV",
18703
+ CSV: "CSV",
18704
+ copyJSON: "Copy JSON",
18705
+ JSON: "JSON",
18706
+ selectTable: "Select a table",
18707
+ selectTableToView: "Select a table to view structure",
18708
+ selectTableForData: "Select a table to view data",
18709
+ columns: "Columns",
18710
+ colName: "Name",
18711
+ colType: "Type",
18712
+ colNullable: "Nullable",
18713
+ colDefault: "Default",
18714
+ primaryKey: "Primary Key",
18715
+ foreignKeys: "Foreign Keys",
18716
+ indexes: "Indexes",
18717
+ enable: "Enable",
18718
+ commaValues: "Comma-separated values",
18719
+ likePattern: "%pattern%",
18720
+ valuePlaceholder: "Value",
18721
+ apply: "Apply",
18722
+ clearFilter: "Clear",
18723
+ addRow: "+ Add Row",
18724
+ totalRows: "{{count}} rows",
18725
+ rowsAffected: "{{command}} \u2014 {{count}} rows affected ({{duration}}ms)",
18726
+ queryRows: "{{count}} rows ({{duration}}ms)",
18727
+ resultTruncated: "[Results truncated to 1000 rows]",
18728
+ sqlPlaceholder: "Enter SQL... ({{modKey}}Enter to execute)",
18729
+ executing: "Executing...",
18730
+ execute: "\u25B6 Execute",
18731
+ deleteRowsFailed: "{{count}} rows failed to delete"
18732
+ },
18733
+ redis: {
18734
+ neverExpires: "Never expires",
18735
+ expired: "Expired",
18736
+ loadFailed: "Load failed",
18737
+ deleteFailed: "Delete failed",
18738
+ saveFailed: "Save failed",
18739
+ scanPlaceholder: "SCAN pattern...",
18740
+ scanSearch: "Search (SCAN)",
18741
+ noKeys: "No keys",
18742
+ loadMore: "Load more...",
18743
+ tabData: "Data",
18744
+ tabInfo: "Info",
18745
+ tabCli: "CLI",
18746
+ selectKey: "Select a key",
18747
+ keyNotExist: "Key does not exist",
18748
+ unsupportedType: "Unsupported type: {{type}}",
18749
+ nItems: "{{total}} items",
18750
+ showingN: "showing {{count}}",
18751
+ nMembers: "{{total}} members",
18752
+ nEntries: "{{total}} entries",
18753
+ cliHint: "Enter Redis commands, e.g. PING, GET key, KEYS *",
18754
+ cliPlaceholder: "Enter command..."
18755
+ },
18756
+ git: {
18757
+ switchBranch: "Switch branch",
18758
+ searchBranch: "Search branches...",
18759
+ noBranches: "No branches available",
18760
+ noMatchingBranches: "No matching branches",
18761
+ localBranches: "Local Branches",
18762
+ remoteBranches: "Remote Branches",
18763
+ branchNotFound: "Branch not found",
18764
+ selectBranch: "Select branch...",
18765
+ currentBranch: "Current",
18766
+ notGitRepo: "Current directory is not a Git repository",
18767
+ cannotGetBranches: "Cannot get branch info",
18768
+ getBranchesFailed: "Failed to get branch info",
18769
+ discardAllConfirm: "Discard changes in {{count}} workspace files? This cannot be undone.",
18770
+ worktree: {
18771
+ title: "Git Worktree",
18772
+ count: "{{count}} worktrees",
18773
+ selectBranch: "Select branch",
18774
+ addWorktree: "+ Add Worktree",
18775
+ confirmDelete: "Confirm Delete",
18776
+ confirmDeleteMsg: "Delete this worktree?",
18777
+ path: "Path:",
18778
+ branch: "Branch:",
18779
+ locked: "Locked",
18780
+ unlock: "Unlock",
18781
+ lock: "Lock",
18782
+ searchBranch: "Search branches...",
18783
+ noBranches: "No available branches"
18784
+ }
18785
+ },
18786
+ comments: {
18787
+ addComment: "Add Comment",
18788
+ lineRange: "Line {{start}}-{{end}}",
18789
+ inputPlaceholder: "Enter comment...",
18790
+ newComment: "New comment {{range}}",
18791
+ commentPlaceholder: "Enter comment... ({{modKey}}Enter to submit, Esc to cancel)",
18792
+ nComments: "{{count}} comments",
18793
+ allComments: "All Comments",
18794
+ copyAllComments: "Copy all comments",
18795
+ noComments: "No comments yet",
18796
+ clearAll: "Clear all",
18797
+ totalComments: "{{count}} comments total",
18798
+ aiReply: "AI Reply",
18799
+ noContent: "(no content)",
18800
+ linesCount: "({{count}} lines)",
18801
+ codeRef: "Here are my annotated comments and references:",
18802
+ note: "Note: {{content}}",
18803
+ submitting: "Submitting...",
18804
+ enterSubmit: "Enter to submit \xB7 Shift+Enter for new line",
18805
+ submitComment: "Submit Comment",
18806
+ askAI: "Ask AI",
18807
+ inputQuestion: "Enter your question...",
18808
+ aiGenerating: "Generating, please wait...",
18809
+ enterSend: "Enter to send \xB7 Shift+Enter for new line",
18810
+ sendToAI: "Send to AI",
18811
+ aiResponding: "AI is responding..."
18812
+ },
18813
+ fileContextMenu: {
18814
+ createFile: "New File",
18815
+ copyFile: "Copy File",
18816
+ copyFolder: "Copy Folder",
18817
+ pasteHere: "Paste Here",
18818
+ deleteFile: "Delete File",
18819
+ deleteFolder: "Delete Folder",
18820
+ copyRelativePath: "Copy Relative Path",
18821
+ copyAbsolutePath: "Copy Absolute Path",
18822
+ copyRelativeDirPath: "Copy Relative Dir Path",
18823
+ copyAbsoluteDirPath: "Copy Absolute Dir Path",
18824
+ copyFileName: "Copy File Name",
18825
+ copyFolderName: "Copy Folder Name"
18826
+ },
18827
+ settings: {
18828
+ title: "Settings",
18829
+ theme: "Theme",
18830
+ themeLight: "Light",
18831
+ themeDark: "Dark",
18832
+ themeSystem: "System",
18833
+ browserExtension: "Browser Extension",
18834
+ extensionInstalled: "Cockpit Bridge installed",
18835
+ extensionNotInstalled: "Cockpit Bridge not installed",
18836
+ extensionDescription: "After installing the Chrome extension, link navigation in iframes will be intercepted: new tab links create new bubbles, page navigation updates the current bubble.",
18837
+ installSteps: "Installation steps:",
18838
+ step1: "1. Open Chrome and navigate to",
18839
+ step2: '2. Enable "Developer mode" in the top-right corner',
18840
+ step3: '3. Click "Load unpacked"',
18841
+ step4mac: "4. Press <kbd>Cmd+Shift+G</kbd> \u2192 paste the path below \u2192 Enter",
18842
+ copyExtensionPath: "Copy extension directory path",
18843
+ reloadExtension: "Reload extension",
18844
+ about: "About",
18845
+ language: "Language",
18846
+ languageAuto: "System",
18847
+ switchDark: "Switch to dark",
18848
+ switchLight: "Switch to light"
18849
+ },
18850
+ editor: {
18851
+ placeholder: "Write something... Type / for commands",
18852
+ noteTitle: "{{name}} - Notes",
18853
+ noteUntitled: "Notes",
18854
+ saving: "Saving...",
18855
+ conflictReloaded: "This note was changed elsewhere. Loaded the latest version; your recent unsaved edits were discarded.",
18856
+ linkPlaceholder: "Enter URL...",
18857
+ confirmLink: "Confirm",
18858
+ removeLink: "Remove link",
18859
+ heading1: "Heading 1",
18860
+ heading2: "Heading 2",
18861
+ heading3: "Heading 3",
18862
+ bold: "Bold",
18863
+ italic: "Italic",
18864
+ strikethrough: "Strikethrough",
18865
+ inlineCode: "Inline code",
18866
+ link: "Link",
18867
+ bulletList: "Bullet list",
18868
+ orderedList: "Ordered list",
18869
+ taskList: "Task list",
18870
+ blockquote: "Blockquote",
18871
+ codeBlock: "Code block",
18872
+ table: "Table",
18873
+ horizontalRule: "Horizontal rule",
18874
+ insertRowAbove: "Insert row above",
18875
+ insertRowBelow: "Insert row below",
18876
+ insertColumnLeft: "Insert column left",
18877
+ insertColumnRight: "Insert column right",
18878
+ deleteRow: "Delete row",
18879
+ deleteColumn: "Delete column",
18880
+ deleteTable: "Delete table",
18881
+ deleteCodeBlock: "Delete code block",
18882
+ toc: "TOC",
18883
+ expandToc: "Expand TOC",
18884
+ collapseToc: "Collapse TOC"
18885
+ },
18886
+ slashCommands: {
18887
+ heading1: "Heading 1",
18888
+ heading1Desc: "Large heading",
18889
+ heading2: "Heading 2",
18890
+ heading2Desc: "Medium heading",
18891
+ heading3: "Heading 3",
18892
+ heading3Desc: "Small heading",
18893
+ bulletList: "Bullet List",
18894
+ bulletListDesc: "Bulleted list",
18895
+ orderedList: "Ordered List",
18896
+ orderedListDesc: "Numbered list",
18897
+ taskList: "Task List",
18898
+ taskListDesc: "Checkable task list",
18899
+ blockquote: "Blockquote",
18900
+ blockquoteDesc: "Quote block",
18901
+ codeBlock: "Code Block",
18902
+ codeBlockDesc: "Code snippet",
18903
+ table: "Table",
18904
+ tableDesc: "Insert 3\xD73 table",
18905
+ horizontalRule: "Divider",
18906
+ horizontalRuleDesc: "Horizontal divider",
18907
+ link: "Link",
18908
+ linkDesc: "Insert hyperlink"
18909
+ },
18910
+ commands: {
18911
+ qa: "Enter requirements clarification mode",
18912
+ fx: "Enter bug evidence-chain analysis mode",
18913
+ ex: "Enter structured analysis & discussion mode",
18914
+ go: "Enter landing mode: MVP staged implementation",
18915
+ cg: "Enter CodeGraph exploration mode",
18916
+ plan: "Enable plan mode \xB7 /plan <task> to plan it \xB7 /plan off to disable"
18917
+ },
18918
+ review: {
18919
+ reviewManagement: "Review Management",
18920
+ allReviews: "All Reviews",
18921
+ noOpenReviews: "No open reviews",
18922
+ viewComments: "View comments",
18923
+ nComments: "{{count}} comments",
18924
+ nDocs: "{{count}} docs",
18925
+ nReviews: "{{count}} reviews",
18926
+ docList: "Document List",
18927
+ allReviewsList: "All Reviews",
18928
+ expandList: "Expand list",
18929
+ collapseList: "Collapse list",
18930
+ closeReview: "Close review",
18931
+ reopenReview: "Reopen",
18932
+ deleteReview: "Delete review",
18933
+ noOpenDocs: "No open documents",
18934
+ noReviews: "No reviews",
18935
+ sharing: "Sharing",
18936
+ notShared: "Not shared",
18937
+ closeSharing: "Disable sharing",
18938
+ enableSharing: "Enable sharing",
18939
+ view: "View",
18940
+ setNickname: "Set your nickname",
18941
+ nicknameHint: "Other reviewers will see this name",
18942
+ nicknamePlaceholder: "Enter nickname",
18943
+ skipForNow: "Skip for now",
18944
+ identitySettings: "Identity Settings",
18945
+ reviewNickname: "Review Nickname",
18946
+ random: "Random",
18947
+ selectTextToComment: "Select text to add comment",
18948
+ selectTextHint: "Select text on the left to add a comment",
18949
+ prevComment: "Previous",
18950
+ nextComment: "Next",
18951
+ commentsCount: "{{count}} comments",
18952
+ commentsNavCount: "{{current}}/{{total}} comments",
18953
+ allCommentsTitle: "All Comments",
18954
+ commentsCountBrief: "{{count}}",
18955
+ closedCount: "{{count}} closed",
18956
+ copyAllComments: "Copy all comments",
18957
+ noComments: "No comments yet",
18958
+ closedComments: "Closed ({{count}})",
18959
+ closedLabel: "Closed",
18960
+ moreReplies: "+{{count}} replies",
18961
+ copyComment: "Copy comment",
18962
+ reopen: "Reopen",
18963
+ closeComment: "Close comment",
18964
+ editComment: "Edit comment",
18965
+ deleteComment: "Delete comment",
18966
+ edited: "(edited)",
18967
+ editReply: "Edit reply",
18968
+ deleteReply: "Delete reply",
18969
+ reply: "Reply",
18970
+ replyPlaceholder: "Add a reply...",
18971
+ selectedText: "Selected text",
18972
+ addCommentPlaceholder: "Add a comment...",
18973
+ enterSubmitHint: "Enter to submit, Shift+Enter for new line",
18974
+ commentBtn: "Comment",
18975
+ reviewNotExist: "Review does not exist or has been deleted",
18976
+ loadFailed: "Load failed",
18977
+ networkError: "Network error",
18978
+ reviewNotFound: "Review not found",
18979
+ checkLink: "Please check the link",
18980
+ updatedAt: "Updated {{date}}",
18981
+ active: "Active",
18982
+ closed: "Closed",
18983
+ viewAllComments: "View all comments",
18984
+ viewCommentBtn: "View Comments",
18985
+ copyLink: "Copy Link",
18986
+ reviewSummary: "Review Comments Summary \u2014 {{title}}",
18987
+ totalNComments: "{{count}} comments total",
18988
+ quoteRef: 'Quote: "{{text}}"',
18989
+ commentAuthor: "Comment ({{author}}): {{content}}",
18990
+ replyAuthor: " \u21B3 {{author}}: {{content}}"
18991
+ },
18992
+ markdown: {
18993
+ copied: "\u2713 Copied",
18994
+ copy: "Copy"
18995
+ },
18996
+ imagePreview: {
18997
+ previewImage: "Preview image",
18998
+ deleteImage: "Delete image"
18999
+ },
19000
+ tokenStats: {
19001
+ title: "Claude Code Token Stats",
19002
+ activeHours: "Active Hours Distribution",
19003
+ hourSessions: "{{h}}:00 \u2014 {{count}} sessions",
19004
+ messages: "Messages",
19005
+ toolCalls: "Tool Calls",
19006
+ activityTrend: "Activity Trend",
19007
+ byModel: "By Model",
19008
+ tokenUsage: "Token Usage",
19009
+ equivalentCost: "Equivalent Cost",
19010
+ modelCostDetail: "Model Cost Details",
19011
+ model: "Model",
19012
+ share: "Share",
19013
+ total: "Total",
19014
+ totalSessions: "Total Sessions",
19015
+ totalMessages: "Total Messages",
19016
+ equivalentApiCost: "Equivalent API Cost",
19017
+ longestSession: "Longest Session",
19018
+ firstUse: "First Use",
19019
+ notFound: "~/.claude/stats-cache.json not found",
19020
+ day: "Day",
19021
+ week: "Week",
19022
+ month: "Month"
19023
+ },
19024
+ toolCall: {
19025
+ inputParams: "Input Parameters",
19026
+ resultLabel: "Result",
19027
+ inputParamsTitle: "View input parameters",
19028
+ resultTitle: "View result",
19029
+ input: "Input",
19030
+ result: "Result",
19031
+ foldedLines: "... ({{count}} lines)"
19032
+ },
19033
+ fileEditor: {
19034
+ unsavedConfirm: "You have unsaved changes. Close anyway?",
19035
+ discardChanges: "Discard changes",
19036
+ continueEditing: "Continue editing",
19037
+ externallyModified: "File was modified externally. Saving will overwrite external changes.",
19038
+ useDiskVersion: "Use disk version",
19039
+ forceOverwrite: "Force overwrite"
19040
+ },
19041
+ quickFileOpen: {
19042
+ placeholder: "Type file name to open...",
19043
+ noMatch: "No matching files",
19044
+ recent: "Recent",
19045
+ selectHint: "Select",
19046
+ openHint: "Open",
19047
+ closeHint: "Close"
19048
+ },
19049
+ envManager: {
19050
+ title: "Environment Variables",
19051
+ tabScope: "Current Tab Only",
19052
+ globalScope: "Global Environment Variables",
19053
+ varNamePlaceholder: "Variable name (e.g. NODE_ENV)",
19054
+ varValuePlaceholder: "Value (e.g. production)",
19055
+ valuePlaceholder: "Value",
19056
+ noVars: "No environment variables yet. Add one to get started."
19057
+ },
19058
+ aliasManager: {
19059
+ title: "Command Aliases",
19060
+ description: "Set shortcut aliases for common commands (global)",
19061
+ aliasPlaceholder: "Alias (e.g. ll)",
19062
+ commandPlaceholder: "Full command (e.g. ls -la)",
19063
+ fullCommandPlaceholder: "Full command",
19064
+ usage: "Usage tip:",
19065
+ usageDesc: "Type an alias to execute the corresponding full command",
19066
+ noAliases: "No command aliases yet. Add one to get started."
19067
+ },
19068
+ diffViewer: {
19069
+ fileChanges: "File Changes ({{count}})",
19070
+ toggleFileTree: "Toggle file tree",
19071
+ selectFileToView: "Select a file to view changes",
19072
+ sideBySide: "Side by side",
19073
+ unified: "Unified",
19074
+ viewSplit: "Split",
19075
+ viewUnified: "Unified",
19076
+ previewFile: "Preview file",
19077
+ copiedAll: "Full text copied",
19078
+ compact: "Compact",
19079
+ full: "Full",
19080
+ gap: {
19081
+ hidden: "{{count}} lines hidden",
19082
+ more: "\xB7\xB7\xB7 more +{{count}} \xB7\xB7\xB7",
19083
+ expandUp: "Expand {{count}} lines up",
19084
+ expandDown: "Expand {{count}} lines down"
19085
+ },
19086
+ loadingSnapshots: "Loading snapshots\u2026",
19087
+ noChanges: "No file changes detected in this turn",
19088
+ notViewable: "Binary or oversized file \u2014 diff not viewable",
19089
+ externalChange: "Concurrent change from another session/process",
19090
+ reconstructed: "reconstructed",
19091
+ reconstructedHint: "Rebuilt from tool-call parameters \u2014 not a disk snapshot",
19092
+ truncated: "Too many files \u2014 list truncated"
19093
+ },
19094
+ commitDetail: {
19095
+ title: "Commit Details",
19096
+ hash: "Hash:",
19097
+ author: "Author:",
19098
+ date: "Date:",
19099
+ files: "Files:",
19100
+ nChanges: "{{count}} changes",
19101
+ loadingFiles: "Loading files...",
19102
+ noFileChanges: "No file changes",
19103
+ loadingDiff: "Loading diff...",
19104
+ selectFileToView: "Select a file to view diff"
19105
+ },
19106
+ askQuestion: {
19107
+ title: "Questions",
19108
+ nQuestions: "{{count}} questions",
19109
+ checkedN: "{{count}} checked",
19110
+ copyChecked: "Copy {{count}} checked Q&A",
19111
+ copyAll: "Copy all Q&A",
19112
+ sendChecked: "Send {{count}} checked Q&A to AI",
19113
+ sendAll: "Send all Q&A to AI",
19114
+ sendNoChat: "No active chat session",
19115
+ checkToCopy: "Check to copy",
19116
+ custom: "Custom",
19117
+ customPlaceholder: "Enter custom answer...",
19118
+ notSelected: "(not selected)"
19119
+ },
19120
+ tabBar: {
19121
+ unpin: "Unpin",
19122
+ pin: "Pin to favorites",
19123
+ closeTab: "Close tab",
19124
+ closeAll: "Close all tabs",
19125
+ newTab: "New tab"
19126
+ },
19127
+ tabManagerTopBar: {
19128
+ copyPageUrl: "Copy page URL",
19129
+ copyDirPath: "Copy directory path",
19130
+ refreshProject: "Refresh project",
19131
+ openInVSCode: "Open in VS Code",
19132
+ openInCursor: "Open in Cursor",
19133
+ aliasesGlobal: "Command Aliases (Global)",
19134
+ tokenStats: "Token Stats",
19135
+ openSurething: "Open Surething"
19136
+ },
19137
+ hoverTooltip: {
19138
+ findReferences: "Find References",
19139
+ search: "Search"
19140
+ },
19141
+ todoViewer: {
19142
+ title: "Task List",
19143
+ progress: "{{completed}} / {{total}} done"
19144
+ },
19145
+ userMessages: {
19146
+ title: "User Messages",
19147
+ noMessages: "No user messages"
19148
+ },
19149
+ shortIdBadge: {
19150
+ clickToDisconnect: "Click to disconnect",
19151
+ clickToRegister: "Click to register and copy CLI command",
19152
+ setTitle: "Name this bubble (so /cc can find it later)",
19153
+ setTitlePlaceholder: "set title",
19154
+ editTitle: "Edit title",
19155
+ titleSet: "Title: {{title}}",
19156
+ dialogTitle: "Name this bubble",
19157
+ dialogPlaceholder: "e.g. alloydb proxy, staging admin"
19158
+ },
19159
+ api: {
19160
+ pathForbidden: "Operation not allowed on this path",
19161
+ deleteForbidden: "Delete not allowed on this path",
19162
+ notAFolder: "Target is not a folder",
19163
+ imageTooLarge: "Image too large to preview",
19164
+ cannotPreviewBinary: "Cannot preview binary file",
19165
+ fileTooLarge: "File too large to preview (over 10MB)",
19166
+ fileModifiedExternally: "File was modified externally",
19167
+ pickFolderPrompt: "Select project folder"
19168
+ },
19169
+ confirm: {
19170
+ title: "Notice",
19171
+ ok: "OK",
19172
+ cancel: "Cancel"
19173
+ },
19174
+ floatingToolbar: {
19175
+ addComment: "Add Comment",
19176
+ sendToAI: "Send to AI",
19177
+ search: "Search"
19178
+ },
19179
+ quickReply: {
19180
+ optionA: "A",
19181
+ optionB: "B",
19182
+ optionC: "C",
19183
+ optionD: "D",
19184
+ allRecommended: "All recommended",
19185
+ thisOne: "This one",
19186
+ notThis: "Not this",
19187
+ why: "Why?",
19188
+ elaborate: "Say more",
19189
+ example: "Give an example",
19190
+ start: "Do it",
19191
+ continue: "Continue",
19192
+ ok: "OK",
19193
+ done: "Done"
19194
+ },
19195
+ searchResults: {
19196
+ title: "Search Results",
19197
+ nMatches: "({{count}} matches)",
19198
+ searching: "Searching...",
19199
+ noResults: "No matches",
19200
+ scopeSelected: "Selected",
19201
+ scopeAll: "All"
19202
+ },
19203
+ references: {
19204
+ title: "References",
19205
+ searching: "Searching...",
19206
+ notFound: "No references found"
19207
+ },
19208
+ gitFileTree: {
19209
+ noFiles: "No files"
19210
+ },
19211
+ explain: {
19212
+ action: "Explain",
19213
+ fileMessage: "Explain {{path}}",
19214
+ symbolMessage: "Explain {{name}} ({{path}}:{{lines}})",
19215
+ selectionMessage: "Explain",
19216
+ commitFileMessage: "Explain what git commit {{hash}} changed in {{path}}",
19217
+ compareFileMessage: "Explain the git changes to {{path}} in {{base}}..HEAD",
19218
+ stagedFileMessage: "Explain the git staged changes to {{path}}",
19219
+ unstagedFileMessage: "Explain the git working tree changes to {{path}}"
19220
+ },
19221
+ reviewUtils: {
19222
+ adjectives: ["Happy", "Brave", "Quiet", "Bright", "Gentle", "Agile", "Free", "Clear", "Flying", "Relaxed", "Lively", "Wise", "Calm", "Alert", "Composed", "Steady", "Cheerful", "Warm", "Bold", "Poised"],
19223
+ nouns: ["Panda", "Dolphin", "Crane", "Snow Leopard", "Skylark", "Squirrel", "Flying Fish", "Deer", "Bluebird", "Silver Fox", "Owl", "Dragonfly", "Firefly", "Sea Turtle", "Butterfly", "Monkey", "Red-crowned Crane", "Antelope", "Swallow", "Penguin"]
19224
+ }
19225
+ };
19226
+
19227
+ // packages/shared/i18n/locales/zh.json
19228
+ var zh_default = {
19229
+ common: {
19230
+ save: "\u4FDD\u5B58",
19231
+ cancel: "\u53D6\u6D88",
19232
+ delete: "\u5220\u9664",
19233
+ close: "\u5173\u95ED",
19234
+ copy: "\u590D\u5236",
19235
+ edit: "\u7F16\u8F91",
19236
+ file: "\u6587\u4EF6",
19237
+ codeMap: "\u4EE3\u7801\u5730\u56FE",
19238
+ diff: "Diff",
19239
+ confirm: "\u786E\u8BA4",
19240
+ loading: "\u52A0\u8F7D\u4E2D...",
19241
+ search: "\u641C\u7D22",
19242
+ refresh: "\u5237\u65B0",
19243
+ retry: "\u91CD\u8BD5",
19244
+ submit: "\u63D0\u4EA4",
19245
+ copied: "\u5DF2\u590D\u5236",
19246
+ saved: "\u5DF2\u4FDD\u5B58",
19247
+ failed: "\u5931\u8D25",
19248
+ noMatch: "\u65E0\u5339\u914D",
19249
+ noData: "\u65E0\u6570\u636E",
19250
+ done: "\u5B8C\u6210",
19251
+ justNow: "\u521A\u521A",
19252
+ minutesAgo: "{{count}}\u5206\u949F\u524D",
19253
+ hoursAgo: "{{count}}\u5C0F\u65F6\u524D",
19254
+ daysAgo: "{{count}}\u5929\u524D",
19255
+ monthsAgo: "{{count}}\u4E2A\u6708\u524D",
19256
+ yearsAgo: "{{count}}\u5E74\u524D",
19257
+ saveFailed: "\u4FDD\u5B58\u5931\u8D25",
19258
+ copyFailed: "\u590D\u5236\u5931\u8D25",
19259
+ deleteFailed: "\u5220\u9664\u5931\u8D25",
19260
+ operationFailed: "\u64CD\u4F5C\u5931\u8D25",
19261
+ copiedPath: "\u5DF2\u590D\u5236\u8DEF\u5F84",
19262
+ copyPath: "\u590D\u5236\u8DEF\u5F84",
19263
+ openInConsole: "\u5728 Console \u6C14\u6CE1\u6253\u5F00",
19264
+ copyAbsPath: "\u590D\u5236\u7EDD\u5BF9\u8DEF\u5F84",
19265
+ loadMore: "\u52A0\u8F7D\u66F4\u591A",
19266
+ noResult: "\u65E0\u5339\u914D\u7ED3\u679C",
19267
+ selected: "\u5DF2\u9009\u62E9",
19268
+ selectAll: "\u5168\u9009",
19269
+ hint: "\u63D0\u793A",
19270
+ confirmBtn: "\u786E\u5B9A",
19271
+ cancelBtn: "\u53D6\u6D88",
19272
+ preview: "\u9884\u89C8",
19273
+ readable: "\u53EF\u8BFB",
19274
+ previous: "\u4E0A\u4E00\u4E2A",
19275
+ next: "\u4E0B\u4E00\u4E2A",
19276
+ all: "\u5168\u90E8",
19277
+ input: "\u8F93\u5165",
19278
+ result: "\u7ED3\u679C",
19279
+ line: "\u884C",
19280
+ lines: "\u884C",
19281
+ running: "\u8FD0\u884C\u4E2D",
19282
+ connecting: "\u8FDE\u63A5\u4E2D",
19283
+ connected: "\u5DF2\u8FDE\u63A5",
19284
+ connectionFailed: "\u8FDE\u63A5\u5931\u8D25",
19285
+ builtin: "\u5185\u7F6E",
19286
+ global: "\u5168\u5C40",
19287
+ project: "\u9879\u76EE",
19288
+ current: "\u5F53\u524D"
19289
+ },
19290
+ htmlApps: {
19291
+ addTooltip: "\u6DFB\u52A0\u5230 HTML \u9762\u677F",
19292
+ added: "\u5DF2\u6DFB\u52A0\u5230 HTML \u9762\u677F",
19293
+ alreadyAdded: "\u5DF2\u6DFB\u52A0\u8FC7",
19294
+ addFailed: "\u6DFB\u52A0\u5931\u8D25"
19295
+ },
19296
+ skills: {
19297
+ addTooltip: "\u6DFB\u52A0\u5230 Skills \u9762\u677F",
19298
+ added: "\u5DF2\u6DFB\u52A0\u5230 Skills \u9762\u677F",
19299
+ alreadyAdded: "\u5DF2\u6DFB\u52A0\u8FC7",
19300
+ addFailed: "\u6DFB\u52A0\u5931\u8D25",
19301
+ title: "Skills",
19302
+ searchPlaceholder: "\u641C\u7D22 skills...",
19303
+ clearSearch: "\u6E05\u9664",
19304
+ addSkill: "\u6DFB\u52A0 Skill",
19305
+ emptyNoSkills: "\u8FD8\u6CA1\u6709 skill\uFF0C\u70B9\u51FB\u300C\u6DFB\u52A0 Skill\u300D\u6DFB\u52A0\u4E00\u4E2A\u3002",
19306
+ emptyNoMatch: "\u6CA1\u6709\u5339\u914D\u7684 skill\u3002",
19307
+ pathLabel: "SKILL.md \u7684\u7EDD\u5BF9\u8DEF\u5F84",
19308
+ pathPlaceholder: "/Users/you/.../skills/foo/SKILL.md",
19309
+ add: "\u6DFB\u52A0",
19310
+ adding: "\u6DFB\u52A0\u4E2D...",
19311
+ invalid: "\u65E0\u6548",
19312
+ copyPath: "\u590D\u5236\u8DEF\u5F84",
19313
+ noDescription: "\u65E0\u63CF\u8FF0",
19314
+ previewTitle: "Skill \u9884\u89C8",
19315
+ source: "\u6E90\u7801",
19316
+ cannotRead: "\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6\u3002"
19317
+ },
19318
+ toast: {
19319
+ savedSuccess: "\u5DF2\u4FDD\u5B58",
19320
+ saveFailed: "\u4FDD\u5B58\u5931\u8D25",
19321
+ copiedName: "\u5DF2\u590D\u5236: {{name}}",
19322
+ copyFailed: "\u590D\u5236\u5931\u8D25",
19323
+ deleteFailed: "\u5220\u9664\u5931\u8D25",
19324
+ operationFailed: "\u64CD\u4F5C\u5931\u8D25",
19325
+ staged: "\u5DF2\u6682\u5B58",
19326
+ stageFailed: "\u6682\u5B58\u5931\u8D25",
19327
+ unstaged: "\u5DF2\u53D6\u6D88\u6682\u5B58",
19328
+ unstageFailed: "\u53D6\u6D88\u6682\u5B58\u5931\u8D25",
19329
+ stagedNFiles: "\u5DF2\u6682\u5B58 {{count}} \u4E2A\u6587\u4EF6",
19330
+ unstagedNFiles: "\u5DF2\u53D6\u6D88\u6682\u5B58 {{count}} \u4E2A\u6587\u4EF6",
19331
+ discardFailed: "\u653E\u5F03\u53D8\u66F4\u5931\u8D25",
19332
+ discardedNFiles: "\u5DF2\u653E\u5F03 {{count}} \u4E2A\u6587\u4EF6\u7684\u53D8\u66F4",
19333
+ stagedAllFiles: "\u5DF2\u6682\u5B58\u6240\u6709\u6587\u4EF6",
19334
+ deletedFile: "\u5DF2\u5220\u9664\u6587\u4EF6",
19335
+ discardedChanges: "\u5DF2\u653E\u5F03\u53D8\u66F4",
19336
+ pastedFile: "\u5DF2\u7C98\u8D34: {{name}}",
19337
+ pasteFailed: "\u7C98\u8D34\u5931\u8D25",
19338
+ noFileToPaste: "\u6CA1\u6709\u53EF\u7C98\u8D34\u7684\u6587\u4EF6",
19339
+ createdFile: "\u5DF2\u521B\u5EFA\u6587\u4EF6: {{name}}",
19340
+ createFailed: "\u521B\u5EFA\u5931\u8D25",
19341
+ movedToTrash: "\u5DF2\u79FB\u52A8\u5230\u56DE\u6536\u7AD9: {{name}}",
19342
+ copiedPageUrl: "\u5DF2\u590D\u5236\u9875\u9762\u5730\u5740",
19343
+ copiedDirPath: "\u5DF2\u590D\u5236\u76EE\u5F55\u8DEF\u5F84",
19344
+ switchedToBranch: "\u5DF2\u5207\u6362\u5230 {{branch}}",
19345
+ switchBranchFailed: "\u5207\u6362\u5206\u652F\u5931\u8D25",
19346
+ loadBranchFailed: "\u52A0\u8F7D\u5206\u652F\u5217\u8868\u5931\u8D25",
19347
+ copiedCommand: "\u5DF2\u590D\u5236: {{command}}",
19348
+ copiedMessage: "\u5DF2\u590D\u5236\u6D88\u606F",
19349
+ copiedUrl: "\u5DF2\u590D\u5236\u7F51\u5740",
19350
+ copiedOutput: "\u5DF2\u590D\u5236\u8F93\u51FA",
19351
+ copiedCmd: "\u5DF2\u590D\u5236\u547D\u4EE4",
19352
+ copiedComment: "\u5DF2\u590D\u5236\u8BC4\u8BBA",
19353
+ copiedAllComments: "\u5DF2\u590D\u5236\u5168\u90E8\u8BC4\u8BBA",
19354
+ copiedFileContent: "\u5DF2\u590D\u5236\u6587\u4EF6\u5185\u5BB9",
19355
+ copiedQA: "\u5DF2\u590D\u5236 {{count}} \u4E2A\u95EE\u7B54",
19356
+ copiedAllQA: "\u5DF2\u590D\u5236\u6240\u6709\u95EE\u7B54",
19357
+ sentQA: "\u5DF2\u53D1\u9001\u7ED9 AI",
19358
+ readFileFailed: "\u8BFB\u53D6\u6587\u4EF6\u5931\u8D25",
19359
+ reviewCreated: "\u8BC4\u5BA1\u5DF2\u521B\u5EFA\uFF0C\u94FE\u63A5\u5DF2\u590D\u5236",
19360
+ reviewUpdated: "\u8BC4\u5BA1\u5DF2\u66F4\u65B0\uFF0C\u94FE\u63A5\u5DF2\u590D\u5236",
19361
+ reviewCreateFailed: "\u521B\u5EFA\u8BC4\u5BA1\u5931\u8D25",
19362
+ sharingClosed: "\u5DF2\u5173\u95ED\u5206\u4EAB",
19363
+ sharingCloseFailed: "\u5173\u95ED\u5206\u4EAB\u5931\u8D25",
19364
+ linkCopied: "\u94FE\u63A5\u5DF2\u590D\u5236",
19365
+ addCommentFailed: "\u6DFB\u52A0\u8BC4\u8BBA\u5931\u8D25",
19366
+ deleteCommentFailed: "\u5220\u9664\u8BC4\u8BBA\u5931\u8D25",
19367
+ editCommentFailed: "\u7F16\u8F91\u8BC4\u8BBA\u5931\u8D25",
19368
+ addReplyFailed: "\u6DFB\u52A0\u56DE\u590D\u5931\u8D25",
19369
+ deleteReplyFailed: "\u5220\u9664\u56DE\u590D\u5931\u8D25",
19370
+ editReplyFailed: "\u7F16\u8F91\u56DE\u590D\u5931\u8D25",
19371
+ disconnected: "\u5DF2\u65AD\u5F00: {{id}}",
19372
+ pluginReloading: "\u63D2\u4EF6\u91CD\u8F7D\u4E2D...",
19373
+ worktreeCreateSuccess: "Worktree \u521B\u5EFA\u6210\u529F: {{name}}",
19374
+ worktreeCreateFailed: "\u521B\u5EFA worktree \u5931\u8D25",
19375
+ worktreeLoadFailed: "\u52A0\u8F7D worktree \u5217\u8868\u5931\u8D25",
19376
+ worktreeDeleted: "Worktree \u5DF2\u5220\u9664",
19377
+ worktreeDeleteFailed: "\u5220\u9664 worktree \u5931\u8D25",
19378
+ worktreeLocked: "\u5DF2\u9501\u5B9A",
19379
+ worktreeUnlocked: "\u5DF2\u89E3\u9501"
19380
+ },
19381
+ workspace: {
19382
+ selectProject: "\u9009\u62E9\u4E00\u4E2A\u9879\u76EE\u5F00\u59CB",
19383
+ searchProjectPath: "\u641C\u7D22\u9879\u76EE\u8DEF\u5F84...",
19384
+ loadingProjects: "\u52A0\u8F7D\u9879\u76EE\u4E2D...",
19385
+ projectNotFound: "\u672A\u627E\u5230\u9879\u76EE",
19386
+ sessions: "{{count}} \u4F1A\u8BDD",
19387
+ loadingSessions: "\u52A0\u8F7D\u4F1A\u8BDD...",
19388
+ noSessions: "\u65E0\u4F1A\u8BDD\u8BB0\u5F55",
19389
+ loadingText: "\u52A0\u8F7D\u4E2D...",
19390
+ openProject: "\u6253\u5F00\u9879\u76EE",
19391
+ expandSidebar: "\u5C55\u5F00\u4FA7\u8FB9\u680F",
19392
+ collapseSidebar: "\u6298\u53E0\u4FA7\u8FB9\u680F",
19393
+ notes: "\u7B14\u8BB0",
19394
+ skills: "\u6280\u80FD",
19395
+ settings: "\u8BBE\u7F6E",
19396
+ help: "\u5E2E\u52A9",
19397
+ updateAvailable: "\u65B0\u7248\u672C v{{version}} \u53EF\u7528",
19398
+ copyUpgradeCommand: "\u590D\u5236 cockpit update",
19399
+ viewChangelog: "\u67E5\u770B\u53D8\u66F4\u65E5\u5FD7",
19400
+ upgradeCommandCopied: "\u5DF2\u590D\u5236 `cockpit update`",
19401
+ projectNotes: "\u9879\u76EE\u7B14\u8BB0",
19402
+ closeProject: "\u5173\u95ED\u9879\u76EE"
19403
+ },
19404
+ mobile: {
19405
+ useDesktop: "\u684C\u9762\u7248",
19406
+ messagePlaceholder: "\u53D1\u6D88\u606F\u2026",
19407
+ send: "\u53D1\u9001",
19408
+ stop: "\u505C\u6B62",
19409
+ enableNotifications: "\u5F00\u542F\u901A\u77E5",
19410
+ disableNotifications: "\u5173\u95ED\u901A\u77E5",
19411
+ notifyError: "\u65E0\u6CD5\u5F00\u542F\u901A\u77E5"
19412
+ },
19413
+ sessions: {
19414
+ recentSessions: "\u6700\u8FD1\u4F1A\u8BDD",
19415
+ runningCount: "{{count}} \u8FD0\u884C\u4E2D",
19416
+ unreadCount: "{{count}} \u672A\u8BFB",
19417
+ noSessions: "\u6682\u65E0\u4F1A\u8BDD\u8BB0\u5F55",
19418
+ running: "\u8FD0\u884C\u4E2D",
19419
+ done: "\u5B8C\u6210",
19420
+ pinnedSessions: "\u5E38\u7528\u4F1A\u8BDD",
19421
+ noPinnedSessions: "\u6682\u65E0\u5E38\u7528\u4F1A\u8BDD\uFF0C\u5728 Tab \u680F\u70B9\u51FB\u56FE\u9489\u53EF\u6DFB\u52A0",
19422
+ editTitle: "\u7F16\u8F91\u6807\u9898",
19423
+ remove: "\u79FB\u9664",
19424
+ projectSessions: "\u9879\u76EE\u4F1A\u8BDD",
19425
+ browseAllSessions: "\u6D4F\u89C8\u6240\u6709\u4F1A\u8BDD",
19426
+ sessionList: "\u4F1A\u8BDD\u5217\u8868",
19427
+ searchSessions: "\u641C\u7D22\u4F1A\u8BDD...",
19428
+ searchRecentSessions: "\u641C\u7D22\u6700\u8FD1\u4F1A\u8BDD",
19429
+ loadSessionsFailed: "\u52A0\u8F7D\u4F1A\u8BDD\u5931\u8D25",
19430
+ loadingSessions: "\u52A0\u8F7D\u4F1A\u8BDD\u4E2D...",
19431
+ noMatchingSessions: "\u672A\u627E\u5230\u5339\u914D\u7684\u4F1A\u8BDD",
19432
+ noSessionsYet: "\u6682\u65E0\u4F1A\u8BDD",
19433
+ projectList: "\u9879\u76EE\u5217\u8868",
19434
+ openFolder: "\u6253\u5F00\u6587\u4EF6\u5939",
19435
+ selectingFolder: "\u9009\u62E9\u4E2D...",
19436
+ loadingHistory: "\u52A0\u8F7D\u5386\u53F2\u6D88\u606F..."
19437
+ },
19438
+ scheduledTasks: {
19439
+ title: "\u5B9A\u65F6\u4EFB\u52A1",
19440
+ aboutToTrigger: "\u5373\u5C06\u89E6\u53D1",
19441
+ secondsLater: "{{count}}\u79D2\u540E",
19442
+ minutesLater: "{{count}}\u5206\u949F\u540E",
19443
+ hoursMinutesLater: "{{h}}\u5C0F\u65F6{{m}}\u5206\u540E",
19444
+ hoursLater: "{{h}}\u5C0F\u65F6\u540E",
19445
+ onceType: "\u4E00\u6B21\u6027 ({{minutes}}\u5206\u949F)",
19446
+ everyNMinutes: "\u6BCF{{minutes}}\u5206\u949F",
19447
+ completed: "\u5DF2\u5B8C\u6210",
19448
+ paused: "\u5DF2\u6682\u505C",
19449
+ activeCount: "{{running}} \u4E2A\u6D3B\u8DC3",
19450
+ pausedCount: "{{paused}} \u4E2A\u6682\u505C",
19451
+ noScheduledTasks: "\u6682\u65E0\u5B9A\u65F6\u4EFB\u52A1\uFF0C\u5728\u804A\u5929\u8F93\u5165\u680F\u70B9\u51FB\u65F6\u949F\u6309\u94AE\u521B\u5EFA",
19452
+ lastResult: "\u4E0A\u6B21",
19453
+ runNow: "\u7ACB\u5373\u8FD0\u884C",
19454
+ resume: "\u6062\u590D",
19455
+ pause: "\u6682\u505C",
19456
+ completedCount: "\u5DF2\u5B8C\u6210 ({{count}})",
19457
+ success: "\u6210\u529F",
19458
+ failure: "\u5931\u8D25",
19459
+ createTask: "\u521B\u5EFA\u5B9A\u65F6\u4EFB\u52A1",
19460
+ editTask: "\u7F16\u8F91\u5B9A\u65F6\u4EFB\u52A1",
19461
+ sendMessage: "\u53D1\u9001\u6D88\u606F",
19462
+ messagePlaceholder: "\u8F93\u5165\u8981\u53D1\u9001\u7684\u6D88\u606F...",
19463
+ taskFile: "\u4EFB\u52A1\u6587\u4EF6",
19464
+ taskFilePlaceholder: "/Users/you/project/tasks/daily-report.md",
19465
+ taskFileHint: "\u586B\u5199\u7EDD\u5BF9\u8DEF\u5F84\u3002\u89E6\u53D1\u65F6\u4F1A\u8BA9 agent \u5148\u8BFB\u53D6\u8BE5\u6587\u4EF6\uFF0C\u518D\u6309\u5176\u4E2D\u63CF\u8FF0\u6267\u884C\u2014\u2014\u6587\u4EF6\u5185\u5BB9\u6539\u52A8\u4E0B\u6B21\u89E6\u53D1\u5373\u751F\u6548\u3002",
19466
+ taskFilePromptHeader: "\u8BF7\u5148\u8BFB\u53D6\u4EE5\u4E0B\u4EFB\u52A1\u6587\u4EF6\uFF0C\u518D\u636E\u6B64\u6267\u884C\uFF1A",
19467
+ type: "\u7C7B\u578B",
19468
+ once: "\u4E00\u6B21\u6027",
19469
+ interval: "\u5468\u671F",
19470
+ quickSelect: "\u5FEB\u6377\u9009\u62E9",
19471
+ customCron: "\u81EA\u5B9A\u4E49 Cron \u8868\u8FBE\u5F0F",
19472
+ customMinutes: "\u81EA\u5B9A\u4E49\u5206\u949F\u6570",
19473
+ cronPlaceholder: "\u4F8B: 0 9 * * 1-5 (\u5DE5\u4F5C\u65E59\u70B9)",
19474
+ cronFormat: "\u683C\u5F0F\uFF1A\u5206 \u65F6 \u65E5 \u6708 \u661F\u671F\uFF08\u5982 0 9 * * 1-5\uFF09",
19475
+ minutesPlaceholder: "\u5206\u949F\u6570",
19476
+ limitTimeRange: "\u9650\u5236\u6267\u884C\u65F6\u6BB5",
19477
+ to: "\u81F3",
19478
+ saveBtn: "\u4FDD\u5B58 ({{modKey}}\u21A9)",
19479
+ createBtn: "\u521B\u5EFA ({{modKey}}\u21A9)",
19480
+ "5minLater": "5 \u5206\u949F\u540E",
19481
+ "15minLater": "15 \u5206\u949F\u540E",
19482
+ "30minLater": "30 \u5206\u949F\u540E",
19483
+ "1hourLater": "1 \u5C0F\u65F6\u540E",
19484
+ every15min: "\u6BCF 15 \u5206\u949F",
19485
+ every30min: "\u6BCF 30 \u5206\u949F",
19486
+ every1hour: "\u6BCF 1 \u5C0F\u65F6",
19487
+ every2hours: "\u6BCF 2 \u5C0F\u65F6",
19488
+ daily9am: "\u6BCF\u5929 09:00",
19489
+ daily6pm: "\u6BCF\u5929 18:00",
19490
+ weeklyMon9am: "\u6BCF\u5468\u4E00 09:00",
19491
+ monthly1st9am: "\u6BCF\u6708 1 \u53F7 09:00"
19492
+ },
19493
+ cron: {
19494
+ everyNMinutes: "\u6BCF {{n}} \u5206\u949F",
19495
+ everyNHours: "\u6BCF {{n}} \u5C0F\u65F6\u6574\u70B9",
19496
+ everyMinute: "\u6BCF\u5206\u949F",
19497
+ everyHourAtMin: "\u6BCF\u5C0F\u65F6\u7B2C {{m}} \u5206",
19498
+ hourlyEveryMin: "{{h}} \u70B9\u6BCF\u5206\u949F",
19499
+ daily: "\u6BCF\u5929 {{time}}",
19500
+ weekdays: "\u5DE5\u4F5C\u65E5",
19501
+ weekends: "\u5468\u672B",
19502
+ dowSun: "\u65E5",
19503
+ dowMon: "\u4E00",
19504
+ dowTue: "\u4E8C",
19505
+ dowWed: "\u4E09",
19506
+ dowThu: "\u56DB",
19507
+ dowFri: "\u4E94",
19508
+ dowSat: "\u516D",
19509
+ monthPrefix: "\u6708",
19510
+ dayOfMonth: "\u53F7",
19511
+ dayRange: "{{a}}\u53F7\u5230{{b}}\u53F7",
19512
+ weekdayPrefix: "\u5468",
19513
+ weekdayRange: "\u5468{{a}}\u5230\u5468{{b}}"
19514
+ },
19515
+ blockViewer: {
19516
+ empty: {
19517
+ body: "\u5728\u5DE6\u4FA7\u6587\u4EF6\u6811\u9009\u62E9\u4E00\u4E2A\u6587\u4EF6\uFF0C\u67E5\u770B\u5B83\u7684\u4EE3\u7801\u5730\u56FE\u3002",
19518
+ hint: "\u6216\u6309 \u2318K \u641C\u7D22\u3002"
19519
+ },
19520
+ fileMode: {
19521
+ loading: "\u52A0\u8F7D\u4E2D\u2026",
19522
+ notFound: "\u8BE5\u6587\u4EF6\u672A\u7D22\u5F15\uFF08\u4E0D\u652F\u6301\u7684\u8BED\u8A00\u6216\u8D85\u51FA\u6587\u4EF6\u4E0A\u9650\uFF09\u3002"
19523
+ },
19524
+ search: {
19525
+ tooltip: "\u641C\u7D22 (\u2318K)",
19526
+ hint: "\u5F00\u59CB\u8F93\u5165\u4EE5\u641C\u7D22",
19527
+ noResults: "\u672A\u627E\u5230\u5339\u914D",
19528
+ files: "\u6587\u4EF6",
19529
+ symbols: "\u7B26\u53F7"
19530
+ },
19531
+ viewerToggle: {
19532
+ toBlock: "\u663E\u793A\u4EE3\u7801\u5730\u56FE",
19533
+ toCode: "\u8FD4\u56DE\u4EE3\u7801\u89C6\u56FE"
19534
+ },
19535
+ toc: {
19536
+ title: "\u672C\u6587\u4EF6",
19537
+ empty: "\u672A\u68C0\u6D4B\u5230\u51FD\u6570\u3002",
19538
+ notIndexed: "\u8BE5\u6587\u4EF6\u672A\u88AB\u9879\u76EE\u56FE\u6536\u5F55\uFF08\u6269\u5C55\u672A\u652F\u6301 / \u4E0D\u5728 git \u8DDF\u8E2A\u96C6 / \u8D85\u51FA\u6587\u4EF6\u4E0A\u9650\uFF09\u3002"
19539
+ },
19540
+ history: {
19541
+ title: "\u5386\u53F2",
19542
+ empty: "\u70B9\u51FB\u5DE6\u53F3\u4E24\u4FA7\u7684 pin \u5F00\u59CB\u8FFD\u8E2A\u8C03\u7528\u94FE\u3002",
19543
+ clear: "\u6E05\u7A7A\u5386\u53F2"
19544
+ },
19545
+ refresh: "\u91CD\u65B0\u6784\u5EFA\u9879\u76EE\u56FE",
19546
+ retry: "\u91CD\u8BD5"
19547
+ },
19548
+ blockDiffViewer: {
19549
+ loading: "\u6B63\u5728\u751F\u6210\u4EE3\u7801\u5730\u56FE\u2026",
19550
+ unsupported: "\u8BE5\u6587\u4EF6\u7C7B\u578B\u6682\u4E0D\u652F\u6301\u4EE3\u7801\u5730\u56FE diff",
19551
+ unsupportedHint: "\u5207\u56DE\u5E38\u89C4 diff \u89C6\u56FE\u67E5\u770B\u3002",
19552
+ error: "\u4EE3\u7801\u5730\u56FE diff \u5931\u8D25\uFF1A{{message}}",
19553
+ noBlockChanges: "\u4EE3\u7801\u5730\u56FE\u65E0\u53D8\u5316\uFF08\u4EC5\u683C\u5F0F\u6216\u7A7A\u767D\uFF09\u3002",
19554
+ noBefore: "\uFF08\u65B0\u589E\uFF09",
19555
+ noAfter: "\uFF08\u5DF2\u5220\u9664\uFF09",
19556
+ kind: {
19557
+ added: "\u65B0\u589E",
19558
+ deleted: "\u5220\u9664",
19559
+ modified: "\u4FEE\u6539"
19560
+ }
19561
+ },
19562
+ fileBrowser: {
19563
+ directoryTree: "\u76EE\u5F55\u6811",
19564
+ searchTab: "\u641C\u7D22",
19565
+ recentTab: "\u6700\u8FD1",
19566
+ changesTab: "\u53D8\u66F4",
19567
+ historyTab: "\u5386\u53F2",
19568
+ searchFiles: "\u641C\u7D22\u6587\u4EF6...",
19569
+ clear: "\u6E05\u9664",
19570
+ exactMatchOn: "\u5168\u8BCD\u5339\u914D\uFF08\u5DF2\u5F00\u542F\uFF09",
19571
+ exactMatchOff: "\u5168\u8BCD\u5339\u914D\uFF08\u5DF2\u5173\u95ED\uFF09",
19572
+ refreshTree: "\u5237\u65B0\u76EE\u5F55\u6811",
19573
+ collapseAll: "\u6298\u53E0\u6240\u6709\u76EE\u5F55",
19574
+ searchFileContent: "\u641C\u7D22\u6587\u4EF6\u5185\u5BB9...",
19575
+ caseSensitive: "\u533A\u5206\u5927\u5C0F\u5199",
19576
+ wholeWord: "\u5B8C\u6574\u8BCD",
19577
+ regex: "\u6B63\u5219",
19578
+ fileTypes: "\u6587\u4EF6\u7C7B\u578B (ts,tsx)",
19579
+ compareMode: "\u5BF9\u6BD4",
19580
+ compareModeOff: "\u5173\u95ED\u5206\u652F\u5BF9\u6BD4",
19581
+ compareModeOn: "\u4E0E\u9009\u5B9A\u5206\u652F\u5BF9\u6BD4",
19582
+ createFile: "\u65B0\u5EFA\u6587\u4EF6",
19583
+ createFileIn: "\u65B0\u5EFA\u6587\u4EF6 (\u5728 {{path}}/)",
19584
+ fileName: "\u6587\u4EF6\u540D...",
19585
+ noRecentFiles: "\u6682\u65E0\u6700\u8FD1\u6D4F\u89C8\u7684\u6587\u4EF6",
19586
+ stagingArea: "\u6682\u5B58\u533A ({{count}})",
19587
+ changesSummary_one: "{{count}} \u4E2A\u53D8\u66F4",
19588
+ changesSummary_other: "{{count}} \u4E2A\u53D8\u66F4",
19589
+ noChanges: "\u5DE5\u4F5C\u533A\u65E0\u53D8\u66F4",
19590
+ refreshChanges: "\u5237\u65B0\u53D8\u66F4\u5217\u8868",
19591
+ unstageAll: "\u5168\u90E8\u53D6\u6D88",
19592
+ noStagedFiles: "\u65E0\u6682\u5B58\u7684\u6587\u4EF6",
19593
+ unstageNFiles: "\u53D6\u6D88\u6682\u5B58 {{count}} \u4E2A\u6587\u4EF6",
19594
+ unstageFile: "\u53D6\u6D88\u6682\u5B58",
19595
+ workspace: "\u5DE5\u4F5C\u533A ({{count}})",
19596
+ discardAll: "\u653E\u5F03\u6240\u6709",
19597
+ stageAll: "\u5168\u90E8\u6682\u5B58",
19598
+ noUnstagedChanges: "\u65E0\u672A\u6682\u5B58\u7684\u53D8\u66F4",
19599
+ discardNFiles: "\u653E\u5F03 {{count}} \u4E2A\u6587\u4EF6\u7684\u53D8\u66F4",
19600
+ stageNFiles: "\u6682\u5B58 {{count}} \u4E2A\u6587\u4EF6",
19601
+ discardChanges: "\u653E\u5F03\u53D8\u66F4",
19602
+ stageFile: "\u6682\u5B58\u6587\u4EF6",
19603
+ loadingDiff: "\u52A0\u8F7D\u5BF9\u6BD4\u6587\u4EF6\u4E2D...",
19604
+ noDiffFiles: "\u65E0\u5DEE\u5F02\u6587\u4EF6",
19605
+ nFilesChanged: "{{count}} \u4E2A\u6587\u4EF6\u53D8\u66F4\uFF08vs {{branch}}\uFF09",
19606
+ loadingCommits: "\u52A0\u8F7D\u63D0\u4EA4\u8BB0\u5F55\u4E2D...",
19607
+ noCommits: "\u65E0\u63D0\u4EA4\u8BB0\u5F55",
19608
+ allLoaded: "\u5DF2\u52A0\u8F7D\u5168\u90E8 {{count}} \u6761\u8BB0\u5F55",
19609
+ locateInTree: "\u5728\u76EE\u5F55\u6811\u4E2D\u5B9A\u4F4D",
19610
+ unsaved: "\u672A\u4FDD\u5B58",
19611
+ saveBeforeSwitch: "\u5F53\u524D\u6587\u4EF6\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\uFF0C\u662F\u5426\u4FDD\u5B58\u540E\u5207\u6362\uFF1F",
19612
+ saveAndSwitch: "\u4FDD\u5B58\u5E76\u5207\u6362",
19613
+ closeEdit: "\u5173\u95ED\u7F16\u8F91 (ESC)",
19614
+ closeBtn: "\u5173\u95ED",
19615
+ copyFileContent: "\u590D\u5236\u6587\u4EF6\u5185\u5BB9",
19616
+ toggleJsonReadable: "\u5207\u6362 JSON \u53EF\u8BFB\u6A21\u5F0F",
19617
+ previewMarkdown: "\u9884\u89C8 Markdown \u6E32\u67D3\u6548\u679C",
19618
+ exitPreview: "\u9000\u51FA\u9884\u89C8",
19619
+ viewBlame: "\u67E5\u770B\u6BCF\u884C\u4EE3\u7801\u7684\u4FEE\u6539\u8BB0\u5F55",
19620
+ viewDiff: "\u67E5\u770B\u76F8\u5BF9 HEAD \u7684\u6539\u52A8",
19621
+ exitDiff: "\u9000\u51FA Diff",
19622
+ diffLoadFailed: "\u52A0\u8F7D\u5DEE\u5F02\u5931\u8D25",
19623
+ editFile: "\u7F16\u8F91\u6587\u4EF6",
19624
+ backToPreview: "\u8FD4\u56DE\u9884\u89C8",
19625
+ cannotPreview: "\u65E0\u6CD5\u9884\u89C8\u6B64\u6587\u4EF6",
19626
+ selectFileToPreview: "\u9009\u62E9\u6587\u4EF6\u4EE5\u9884\u89C8",
19627
+ staged: "\u5DF2\u6682\u5B58",
19628
+ unstaged: "\u672A\u6682\u5B58",
19629
+ selectFileToViewDiff: "\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02",
19630
+ loadingDiffContent: "\u52A0\u8F7D\u5DEE\u5F02\u4E2D...",
19631
+ clickCompareToLoad: "\u70B9\u51FB\u300C\u5BF9\u6BD4\u300D\u52A0\u8F7D\u5206\u652F\u5DEE\u5F02",
19632
+ selectCommitToView: "\u9009\u62E9\u63D0\u4EA4\u67E5\u770B\u8BE6\u60C5",
19633
+ confirmDelete: "\u786E\u8BA4\u5220\u9664",
19634
+ confirmDeleteMessage: "\u786E\u5B9A\u8981\u5C06 <file>{{name}}</file> \u79FB\u52A8\u5230\u56DE\u6536\u7AD9\u5417\uFF1F",
19635
+ nFilesNMatches: "{{files}} \u4E2A\u6587\u4EF6\uFF0C{{matches}} \u5904\u5339\u914D",
19636
+ resultsTruncated: "\u7ED3\u679C\u5DF2\u622A\u65AD",
19637
+ noContentSearchResults: "\u65E0\u5339\u914D\u7ED3\u679C",
19638
+ enterKeywordToSearch: "\u8F93\u5165\u5173\u952E\u8BCD\u641C\u7D22\u6587\u4EF6\u5185\u5BB9",
19639
+ searchMinChars: "\u641C\u7D22\u5185\u5BB9\u81F3\u5C11\u9700\u8981 2 \u4E2A\u5B57\u7B26"
19640
+ },
19641
+ codeViewer: {
19642
+ fileModifiedExternally: "\u6587\u4EF6\u5DF2\u88AB\u5916\u90E8\u4FEE\u6539\uFF0C\u4FDD\u5B58\u5C06\u8986\u76D6\u5916\u90E8\u66F4\u6539",
19643
+ useDiskVersion: "\u4F7F\u7528\u78C1\u76D8\u7248\u672C",
19644
+ forceOverwrite: "\u5F3A\u5236\u8986\u76D6",
19645
+ searchPlaceholder: "\u641C\u7D22...",
19646
+ caseSensitive: "\u533A\u5206\u5927\u5C0F\u5199",
19647
+ wholeWordMatch: "\u5168\u5B57\u5339\u914D",
19648
+ unsavedConfirm: "\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\uFF0C\u786E\u5B9A\u5173\u95ED\uFF1F",
19649
+ discardChanges: "\u653E\u5F03\u4FEE\u6539",
19650
+ continueEditing: "\u7EE7\u7EED\u7F16\u8F91",
19651
+ unsavedExitConfirm: "\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\uFF0C\u786E\u5B9A\u9000\u51FA\u7F16\u8F91\u6A21\u5F0F\uFF1F",
19652
+ clickToViewDetails: "\u70B9\u51FB\u67E5\u770B\u8BE6\u60C5",
19653
+ clickToViewCommit: "\u70B9\u51FB\u67E5\u770B commit \u8BE6\u60C5",
19654
+ nComments: "{{count}} \u6761\u8BC4\u8BBA",
19655
+ searchChat: "\u641C\u7D22\u804A\u5929\u5185\u5BB9...",
19656
+ prevShiftEnter: "\u4E0A\u4E00\u4E2A (Shift+Enter)",
19657
+ nextEnter: "\u4E0B\u4E00\u4E2A (Enter)",
19658
+ closeEsc: "\u5173\u95ED (Esc)"
19659
+ },
19660
+ chat: {
19661
+ startConversation: "\u5F00\u59CB\u5BF9\u8BDD\u5427",
19662
+ loadMoreHistory: "\u52A0\u8F7D\u66F4\u591A...",
19663
+ scrollUpForMore: "\u2191 \u5411\u4E0A\u6EDA\u52A8\u52A0\u8F7D\u66F4\u591A\u5386\u53F2",
19664
+ claudeThinking: "Claude \u6B63\u5728\u601D\u8003...",
19665
+ jumpToStart: "\u8DF3\u8F6C\u5230\u5F00\u59CB",
19666
+ jumpToLatest: "\u8DF3\u8F6C\u5230\u6700\u65B0",
19667
+ copyMessage: "\u590D\u5236\u6D88\u606F",
19668
+ forkSession: "\u4ECE\u6B64\u5904\u5206\u53C9\u4F1A\u8BDD",
19669
+ imageN: "\u56FE\u7247 {{index}}",
19670
+ imagePreview: "\u56FE\u7247\u9884\u89C8",
19671
+ toolCalls: "{{count}} \u4E2A\u5DE5\u5177\u8C03\u7528",
19672
+ collapse: "\u25B2 \u6536\u8D77",
19673
+ expand: "\u25BC \u5C55\u5F00",
19674
+ subagent: "\u5B50\u4EE3\u7406",
19675
+ subagentEmpty: "\u672A\u627E\u5230\u5B50\u4EE3\u7406\u6D88\u606F\u8BB0\u5F55",
19676
+ subagentViewTitle: "\u67E5\u770B\u5B50\u4EE3\u7406\u6267\u884C\u8FC7\u7A0B",
19677
+ workflowRun: "\u8FD0\u884C\u8BE6\u60C5",
19678
+ workflowViewTitle: "\u67E5\u770B\u5DE5\u4F5C\u6D41\u8FD0\u884C\u8BE6\u60C5",
19679
+ workflowEmpty: "\u672A\u627E\u5230\u5DE5\u4F5C\u6D41\u8FD0\u884C\u8BB0\u5F55",
19680
+ workflowAgents: "\u4E2A\u4EE3\u7406",
19681
+ workflowViewAgent: "\u67E5\u770B",
19682
+ workflowUngrouped: "\u672A\u5206\u7EC4",
19683
+ viewQuestions: "\u67E5\u770B\u63D0\u95EE",
19684
+ viewAllFileChanges: "\u67E5\u770B\u6240\u6709\u6587\u4EF6\u53D8\u66F4",
19685
+ requestFailed: "\u8BF7\u6C42\u5931\u8D25",
19686
+ cannotReadStream: "\u65E0\u6CD5\u8BFB\u53D6\u54CD\u5E94\u6D41",
19687
+ errorRetry: "\u53D1\u751F\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5",
19688
+ placeholder: "\u8F93\u5165\u6D88\u606F\uFF0CEnter \u53D1\u9001\uFF08Shift+Enter \u6362\u884C\uFF0C\u53EF\u7C98\u8D34\u56FE\u7247\uFF1B\u884C\u9996 /\uFF08\u4E3B\u4F1A\u8BDD\uFF09\u6216 @\uFF08\u5B50\u4EE3\u7406\uFF09\u5524\u8D77\u547D\u4EE4\uFF0C\u652F\u6301\u591A\u884C\u591A\u547D\u4EE4\uFF09",
19689
+ placeholderDisabled: "\u751F\u6210\u4E2D... \u53EF\u7EE7\u7EED\u8F93\u5165 (ESC \u53D6\u6D88;\u5361\u4F4F\u592A\u4E45\u53EF\u53D6\u6D88\u540E\u91CD\u53D1\u300C\u7EE7\u7EED\u300D)",
19690
+ imageSizeLimit: "\u56FE\u7247\u5927\u5C0F\u8D85\u8FC7\u9650\u5236\uFF08\u6700\u5927 5MB\uFF09\uFF0C\u5F53\u524D\u5927\u5C0F: {{size}}MB",
19691
+ stageAll: "\u6682\u5B58\u6240\u6709\u6587\u4EF6 (git add -A)",
19692
+ viewGitChanges: "\u67E5\u770B Git \u53D8\u66F4",
19693
+ viewAllComments: "\u67E5\u770B\u6240\u6709\u8BC4\u8BBA",
19694
+ userMessages: "\u7528\u6237\u6D88\u606F\u5217\u8868",
19695
+ projectNotes: "\u9879\u76EE\u7B14\u8BB0",
19696
+ scheduledTasks: "\u5B9A\u65F6\u4EFB\u52A1",
19697
+ quickPrompts: "\u5FEB\u6377 Prompt",
19698
+ globalPrompts: "\u5168\u5C40 Prompt",
19699
+ projectPrompts: "\u9879\u76EE Prompt",
19700
+ noQuickPrompts: "\u6682\u65E0\u5FEB\u6377 Prompt",
19701
+ addQuickPrompt: "\u65B0\u589E\u5FEB\u6377 Prompt",
19702
+ quickPromptPlaceholder: "\u8F93\u5165\u4E00\u53E5\u8BDD Prompt\uFF0CEnter \u4FDD\u5B58\uFF0CEsc \u53D6\u6D88",
19703
+ context: "\u4E0A\u4E0B\u6587",
19704
+ output: "\u8F93\u51FA",
19705
+ copiedCommandTooltip: "\u5DF2\u590D\u5236!",
19706
+ copyCommandTooltip: "\u590D\u5236\u547D\u4EE4: claude -r {{sessionId}}",
19707
+ executedCommand: "\u6267\u884C\u4E86 `{{command}}`{{exitInfo}}\uFF0C\u8F93\u51FA\uFF1A\n```\n{{output}}\n```",
19708
+ executedCommandFailed: "\u6267\u884C `{{command}}` \u5931\u8D25\uFF1A{{error}}",
19709
+ executionMode: "\u6267\u884C\u6A21\u5F0F",
19710
+ checkBalance: "\u67E5\u8BE2\u4F59\u989D",
19711
+ balanceFailed: "\u67E5\u8BE2\u5931\u8D25\uFF0C\u8BF7\u68C0\u67E5 API Key",
19712
+ balanceNeedsKey: "\u8BF7\u5148\u914D\u7F6E DeepSeek API Key",
19713
+ balanceUnavailable: "\u8D26\u6237\u5F53\u524D\u4E0D\u53EF\u7528",
19714
+ balanceEmpty: "\u63A5\u53E3\u672A\u8FD4\u56DE\u4F59\u989D",
19715
+ openUsagePage: "\u6253\u5F00 DeepSeek \u7528\u91CF\u63A7\u5236\u53F0",
19716
+ ptyModeHint: "\u8BA2\u9605\u8BA1\u8D39\u6A21\u5F0F\uFF1A\u7528\u4EA4\u4E92\u5F0F claude CLI \u9A71\u52A8",
19717
+ planMode: "\u8BA1\u5212\u6A21\u5F0F",
19718
+ planModeDesc: "\u53EA\u8BFB\xB7\u5148\u51FA\u8BA1\u5212\u4E0D\u6539\u4EE3\u7801",
19719
+ planModeOn: "\u5DF2\u5F00\u542F\u8BA1\u5212\u6A21\u5F0F\u2014\u2014\u53EA\u8BFB;\u53D1\u4E00\u4E2A\u4EFB\u52A1\u5373\u53EF\u62FF\u5230\u8BA1\u5212",
19720
+ planModeOff: "\u5DF2\u5173\u95ED\u8BA1\u5212\u6A21\u5F0F",
19721
+ planModeHint: "\u8BA1\u5212\u6A21\u5F0F\uFF1A\u53EA\u8BFB\u63A2\u7D22\u3001\u4EA7\u51FA\u8BA1\u5212\u4F46\u4E0D\u6539\u6587\u4EF6\u3002\u53D6\u6D88\u52FE\u9009\u540E\u91CD\u53D1\u624D\u4F1A\u5B9E\u73B0\u3002",
19722
+ noHistory: "\u72EC\u7ACB\u4EFB\u52A1",
19723
+ noHistoryDesc: "\u4E0D\u53D1\u9001\u5386\u53F2",
19724
+ noHistoryHint: "\u72EC\u7ACB\u4EFB\u52A1\uFF1A\u6BCF\u6761\u6D88\u606F\u5355\u72EC\u53D1\u7ED9\u6A21\u578B\uFF0C\u4E0D\u5E26\u4E4B\u524D\u7684\u5BF9\u8BDD\u3002\u4E0A\u65B9\u7684\u4F1A\u8BDD\u8BB0\u5F55\u7167\u5E38\u4FDD\u7559\u3002",
19725
+ planTitle: "\u8BA1\u5212\uFF08\u5F85\u4F60\u786E\u8BA4\uFF09",
19726
+ approvePlan: "\u6279\u51C6\u5E76\u6267\u884C",
19727
+ planApproveHint: "\u672C\u73AF\u5883\u65E0\u5BA1\u6279\u5F39\u7A97\uFF0C\u70B9\u6B64\u9000\u51FA\u8BA1\u5212\u6A21\u5F0F\u5E76\u6267\u884C",
19728
+ approvePlanPrompt: "\u5DF2\u6279\u51C6\uFF0C\u6309\u4E0A\u8FF0\u8BA1\u5212\u5F00\u59CB\u6267\u884C\u3002",
19729
+ ptyTerminal: "PTY \u7EC8\u7AEF",
19730
+ ptyRunning: "\u8FD0\u884C\u4E2D",
19731
+ ptyCollapse: "\u6536\u8D77",
19732
+ ptyExpand: "\u5C55\u5F00",
19733
+ ptyStuck: "PTY \u4F3C\u4E4E\u5361\u4F4F\uFF08\u53EF\u80FD\u5728\u7B49\u5F85\u5BF9\u8BDD\u6846\u8F93\u5165\uFF09\uFF0C\u8BF7\u5728 PTY \u7EC8\u7AEF\u624B\u52A8\u5904\u7406\u3002",
19734
+ ptyTimedOut: "PTY \u8D85\u65F6\u672A\u4EBA\u5DE5\u5904\u7406\uFF0C\u5DF2\u7ED3\u675F\u8BE5\u56DE\u5408\u3002",
19735
+ ptyCrash: "Claude CLI \u6E32\u67D3\u5D29\u6E83\uFF08\u4E0A\u6E38 bug\uFF09\uFF1A{{error}}\u3002\u8BE5\u4F1A\u8BDD\u5386\u53F2\u53EF\u80FD\u542B\u65E0\u6CD5\u6E32\u67D3\u7684\u7F16\u8F91\u8BB0\u5F55\u3002",
19736
+ ptyQuestionEsc: "AI \u7684\u4EA4\u4E92\u5F0F\u63D0\u95EE\u65E0\u6CD5\u5728\u672C\u6A21\u5F0F\u4E2D\u5E94\u7B54\uFF0C\u5DF2\u81EA\u52A8\u53D6\u6D88\u5E76\u7ED3\u675F\u672C\u8F6E\u3002\u95EE\u9898\u5185\u5BB9\u89C1\u804A\u5929\u533A\uFF0C\u4E0B\u4E00\u6761\u6D88\u606F\u76F4\u63A5\u56DE\u7B54\u5373\u53EF\u3002"
19737
+ },
19738
+ console: {
19739
+ enterCommandOrUrl: "\u8F93\u5165\u547D\u4EE4\u6216\u7F51\u5740\u5F00\u59CB\u4F7F\u7528",
19740
+ emptyIntro: "\u5728\u4E0B\u65B9\u8F93\u5165\u6846\u8F93\u5165\u4EE5\u4E0B\u5185\u5BB9\uFF0C\u5373\u53EF\u521B\u5EFA\u5BF9\u5E94\u6C14\u6CE1\uFF1A",
19741
+ bubbleCommand: "\u547D\u4EE4",
19742
+ bubbleInteractive: "\u4EA4\u4E92\u7EC8\u7AEF",
19743
+ bubbleBrowser: "\u6D4F\u89C8\u5668",
19744
+ bubbleBrowserNoteIframe: "\u90E8\u5206\u7F51\u7AD9\u4F1A\u62E6\u622A iframe \u5D4C\u5165\uFF0C\u8BF7\u5728\u300C\u8BBE\u7F6E \u2192 \u6D4F\u89C8\u5668\u63D2\u4EF6\u300D\u5B89\u88C5 Cockpit Bridge \u540E\u518D\u6253\u5F00\u3002",
19745
+ bubbleBrowserNoteCookie: "\u5DF2\u767B\u5F55\u7684\u7F51\u7AD9\u82E5\u9996\u6B21\u663E\u793A\u672A\u767B\u5F55\uFF0C\u591A\u5237\u65B0\u51E0\u6B21\u5373\u53EF\u6062\u590D\u3002",
19746
+ bubbleDatabase: "\u6570\u636E\u5E93",
19747
+ bubbleNotebook: "\u7B14\u8BB0\u672C",
19748
+ loadingMore: "\u52A0\u8F7D\u4E2D...",
19749
+ loadMoreHistory: "\u52A0\u8F7D\u66F4\u591A\u5386\u53F2",
19750
+ quickCommands: "\u5FEB\u6377\u547D\u4EE4",
19751
+ singleColumn: "\u5355\u5217\u5E03\u5C40",
19752
+ dualColumn: "\u53CC\u5217\u5E03\u5C40",
19753
+ envVars: "\u73AF\u5883\u53D8\u91CF",
19754
+ launchZsh: "\u542F\u52A8 zsh \u4EA4\u4E92\u7EC8\u7AEF",
19755
+ htmlApps: "HTML \u5E94\u7528",
19756
+ inputPlaceholder: "\u8F93\u5165\u547D\u4EE4\u6216\u7F51\u5740\u5E76\u6309 Enter... (\u2191\u2193 \u5386\u53F2, Tab \u8865\u5168)",
19757
+ scopeProject: "\u9879\u76EE",
19758
+ scopeGlobal: "\u5168\u5C40",
19759
+ tabSwitchEscClose: "Tab \u5207\u6362 \xB7 Esc \u5173\u95ED",
19760
+ copyOutput: "\u590D\u5236\u8F93\u51FA",
19761
+ copyCommand: "\u590D\u5236\u547D\u4EE4",
19762
+ rerun: "\u91CD\u65B0\u8FD0\u884C",
19763
+ deleteRecord: "\u5220\u9664\u8BB0\u5F55",
19764
+ searchPlaceholder: "\u641C\u7D22...",
19765
+ searchMode: "\u641C\u7D22",
19766
+ filterMode: "\u8FC7\u6EE4",
19767
+ prevShiftEnter: "\u4E0A\u4E00\u4E2A (Shift+Enter)",
19768
+ nextEnter: "\u4E0B\u4E00\u4E2A (Enter)",
19769
+ loadingTerminal: "\u52A0\u8F7D\u7EC8\u7AEF...",
19770
+ clickToInput: "\u70B9\u51FB\u7EC8\u7AEF\u533A\u57DF\u8F93\u5165",
19771
+ stdinPlaceholder: "stdin \u8F93\u5165...",
19772
+ runningText: "\u8FD0\u884C\u4E2D...",
19773
+ exitCode: "\u9000\u51FA\u4EE3\u7801: {{code}}",
19774
+ totalLines: "\u5171 {{count}} \u884C",
19775
+ globalCommands: "\u5168\u5C40\u547D\u4EE4",
19776
+ projectCommands: "\u9879\u76EE\u547D\u4EE4",
19777
+ noCustomCommands: "\u6682\u65E0\u81EA\u5B9A\u4E49\u547D\u4EE4",
19778
+ namePlaceholder: "\u540D\u79F0",
19779
+ commandPlaceholder: "\u547D\u4EE4",
19780
+ restoreTooltip: "\u8FD8\u539F ({{modKey}}M / ESC)",
19781
+ screenshotting: "\u622A\u56FE\u4E2D...",
19782
+ outputFileDeleted: "[\u8F93\u51FA\u6587\u4EF6\u5DF2\u5220\u9664]"
19783
+ },
19784
+ browser: {
19785
+ blankPage: "\u7A7A\u767D\u9875",
19786
+ copyUrl: "\u590D\u5236\u7F51\u5740",
19787
+ openInNewWindow: "\u5728\u65B0\u7A97\u53E3\u6253\u5F00",
19788
+ exitMaximize: "\u9000\u51FA\u6700\u5927\u5316 ({{modKey}}M)",
19789
+ maximize: "\u6700\u5927\u5316 ({{modKey}}M)",
19790
+ pageLoadFailed: "\u9875\u9762\u52A0\u8F7D\u5931\u8D25",
19791
+ clickToWake: "\u70B9\u51FB\u5524\u9192",
19792
+ sleeping: "\u5DF2\u4F11\u7720",
19793
+ loadingPage: "\u52A0\u8F7D\u4E2D...",
19794
+ loadFailed: "\u52A0\u8F7D\u5931\u8D25"
19795
+ },
19796
+ database: {
19797
+ connectionFailed: "\u8FDE\u63A5\u5931\u8D25",
19798
+ connected: "\u5DF2\u8FDE\u63A5",
19799
+ connecting: "\u8FDE\u63A5\u4E2D...",
19800
+ refreshTableList: "\u5237\u65B0\u8868\u5217\u8868",
19801
+ filterTable: "T \u8868",
19802
+ filterView: "V \u89C6\u56FE",
19803
+ noTables: "\u65E0\u8868",
19804
+ tabStructure: "\u7ED3\u6784",
19805
+ tabData: "\u6570\u636E",
19806
+ tabSql: "SQL",
19807
+ filterActive: "\u7B5B\u9009: {{count}}\u5217",
19808
+ clearAllFilters: "\u6E05\u9664\u6240\u6709\u7B5B\u9009",
19809
+ deleteNRows: "\u5220\u9664 {{count}} \u884C",
19810
+ confirmDeleteRows: "\u786E\u8BA4\u5220\u9664?",
19811
+ copyCsvSelected: "\u590D\u5236\u9009\u4E2D\u884C\u4E3A CSV",
19812
+ copyCsvAll: "\u5BFC\u51FA\u5168\u8868 CSV",
19813
+ copyJsonSelected: "\u590D\u5236\u9009\u4E2D\u884C\u4E3A JSON",
19814
+ copyJsonAll: "\u5BFC\u51FA\u5168\u8868 JSON",
19815
+ copyCSV: "\u590D\u5236 CSV",
19816
+ CSV: "CSV",
19817
+ copyJSON: "\u590D\u5236 JSON",
19818
+ JSON: "JSON",
19819
+ selectTable: "\u9009\u62E9\u5DE6\u4FA7\u8868\u683C",
19820
+ selectTableToView: "\u9009\u62E9\u8868\u4EE5\u67E5\u770B\u7ED3\u6784",
19821
+ selectTableForData: "\u9009\u62E9\u8868\u4EE5\u67E5\u770B\u6570\u636E",
19822
+ columns: "\u5217",
19823
+ colName: "\u540D\u79F0",
19824
+ colType: "\u7C7B\u578B",
19825
+ colNullable: "\u53EF\u7A7A",
19826
+ colDefault: "\u9ED8\u8BA4\u503C",
19827
+ primaryKey: "\u4E3B\u952E",
19828
+ foreignKeys: "\u5916\u952E",
19829
+ indexes: "\u7D22\u5F15",
19830
+ enable: "\u542F\u7528",
19831
+ commaValues: "\u9017\u53F7\u5206\u9694\u591A\u503C",
19832
+ likePattern: "%pattern%",
19833
+ valuePlaceholder: "\u503C",
19834
+ apply: "\u5E94\u7528",
19835
+ clearFilter: "\u6E05\u9664",
19836
+ addRow: "+ \u65B0\u589E\u884C",
19837
+ totalRows: "{{count}} \u884C",
19838
+ rowsAffected: "{{command}} \u2014 {{count}} \u884C\u53D7\u5F71\u54CD ({{duration}}ms)",
19839
+ queryRows: "{{count}} \u884C ({{duration}}ms)",
19840
+ resultTruncated: "[\u7ED3\u679C\u5DF2\u622A\u65AD\u81F31000\u884C]",
19841
+ sqlPlaceholder: "\u8F93\u5165 SQL... ({{modKey}}Enter \u6267\u884C)",
19842
+ executing: "\u6267\u884C\u4E2D...",
19843
+ execute: "\u25B6 \u6267\u884C",
19844
+ deleteRowsFailed: "{{count}} \u884C\u5220\u9664\u5931\u8D25",
19845
+ inputParams: "\u8F93\u5165\u53C2\u6570",
19846
+ resultLabel: "\u7ED3\u679C"
19847
+ },
19848
+ mysql: {
19849
+ connectionFailed: "\u8FDE\u63A5\u5931\u8D25",
19850
+ connected: "\u5DF2\u8FDE\u63A5",
19851
+ connecting: "\u8FDE\u63A5\u4E2D...",
19852
+ refreshTableList: "\u5237\u65B0\u8868\u5217\u8868",
19853
+ filterTable: "T \u8868",
19854
+ filterView: "V \u89C6\u56FE",
19855
+ noTables: "\u65E0\u8868",
19856
+ tabStructure: "\u7ED3\u6784",
19857
+ tabData: "\u6570\u636E",
19858
+ tabSql: "SQL",
19859
+ filterActive: "\u7B5B\u9009: {{count}}\u5217",
19860
+ clearAllFilters: "\u6E05\u9664\u6240\u6709\u7B5B\u9009",
19861
+ deleteNRows: "\u5220\u9664 {{count}} \u884C",
19862
+ confirmDeleteRows: "\u786E\u8BA4\u5220\u9664?",
19863
+ copyCsvSelected: "\u590D\u5236\u9009\u4E2D\u884C\u4E3A CSV",
19864
+ copyCsvAll: "\u5BFC\u51FA\u5168\u8868 CSV",
19865
+ copyJsonSelected: "\u590D\u5236\u9009\u4E2D\u884C\u4E3A JSON",
19866
+ copyJsonAll: "\u5BFC\u51FA\u5168\u8868 JSON",
19867
+ copyCSV: "\u590D\u5236 CSV",
19868
+ CSV: "CSV",
19869
+ copyJSON: "\u590D\u5236 JSON",
19870
+ JSON: "JSON",
19871
+ selectTable: "\u9009\u62E9\u5DE6\u4FA7\u8868\u683C",
19872
+ selectTableToView: "\u9009\u62E9\u8868\u4EE5\u67E5\u770B\u7ED3\u6784",
19873
+ selectTableForData: "\u9009\u62E9\u8868\u4EE5\u67E5\u770B\u6570\u636E",
19874
+ columns: "\u5217",
19875
+ colName: "\u540D\u79F0",
19876
+ colType: "\u7C7B\u578B",
19877
+ colNullable: "\u53EF\u7A7A",
19878
+ colDefault: "\u9ED8\u8BA4\u503C",
19879
+ primaryKey: "\u4E3B\u952E",
19880
+ foreignKeys: "\u5916\u952E",
19881
+ indexes: "\u7D22\u5F15",
19882
+ enable: "\u542F\u7528",
19883
+ commaValues: "\u9017\u53F7\u5206\u9694\u591A\u503C",
19884
+ likePattern: "%pattern%",
19885
+ valuePlaceholder: "\u503C",
19886
+ apply: "\u5E94\u7528",
19887
+ clearFilter: "\u6E05\u9664",
19888
+ addRow: "+ \u65B0\u589E\u884C",
19889
+ totalRows: "{{count}} \u884C",
19890
+ rowsAffected: "{{command}} \u2014 {{count}} \u884C\u53D7\u5F71\u54CD ({{duration}}ms)",
19891
+ queryRows: "{{count}} \u884C ({{duration}}ms)",
19892
+ resultTruncated: "[\u7ED3\u679C\u5DF2\u622A\u65AD\u81F31000\u884C]",
19893
+ sqlPlaceholder: "\u8F93\u5165 SQL... ({{modKey}}Enter \u6267\u884C)",
19894
+ executing: "\u6267\u884C\u4E2D...",
19895
+ execute: "\u25B6 \u6267\u884C",
19896
+ deleteRowsFailed: "{{count}} \u884C\u5220\u9664\u5931\u8D25"
19897
+ },
19898
+ redis: {
19899
+ neverExpires: "\u6C38\u4E0D\u8FC7\u671F",
19900
+ expired: "\u5DF2\u8FC7\u671F",
19901
+ loadFailed: "\u52A0\u8F7D\u5931\u8D25",
19902
+ deleteFailed: "\u5220\u9664\u5931\u8D25",
19903
+ saveFailed: "\u4FDD\u5B58\u5931\u8D25",
19904
+ scanPlaceholder: "SCAN \u6A21\u5F0F...",
19905
+ scanSearch: "\u641C\u7D22 (SCAN)",
19906
+ noKeys: "\u65E0 key",
19907
+ loadMore: "\u52A0\u8F7D\u66F4\u591A...",
19908
+ tabData: "\u6570\u636E",
19909
+ tabInfo: "\u4FE1\u606F",
19910
+ tabCli: "CLI",
19911
+ selectKey: "\u9009\u62E9\u5DE6\u4FA7 Key",
19912
+ keyNotExist: "Key \u4E0D\u5B58\u5728",
19913
+ unsupportedType: "\u4E0D\u652F\u6301\u7684\u7C7B\u578B: {{type}}",
19914
+ nItems: "{{total}} items",
19915
+ showingN: "\u663E\u793A {{count}}",
19916
+ nMembers: "{{total}} members",
19917
+ nEntries: "{{total}} entries",
19918
+ cliHint: "\u8F93\u5165 Redis \u547D\u4EE4\uFF0C\u5982 PING, GET key, KEYS *",
19919
+ cliPlaceholder: "\u8F93\u5165\u547D\u4EE4..."
19920
+ },
19921
+ git: {
19922
+ switchBranch: "\u5207\u6362\u5206\u652F",
19923
+ searchBranch: "\u641C\u7D22\u5206\u652F...",
19924
+ noBranches: "\u65E0\u53EF\u5207\u6362\u5206\u652F",
19925
+ noMatchingBranches: "\u65E0\u5339\u914D\u5206\u652F",
19926
+ localBranches: "\u672C\u5730\u5206\u652F",
19927
+ remoteBranches: "\u8FDC\u7A0B\u5206\u652F",
19928
+ branchNotFound: "\u672A\u627E\u5230\u5206\u652F",
19929
+ selectBranch: "\u9009\u62E9\u5206\u652F...",
19930
+ currentBranch: "\u5F53\u524D",
19931
+ notGitRepo: "\u5F53\u524D\u76EE\u5F55\u4E0D\u662F Git \u4ED3\u5E93",
19932
+ cannotGetBranches: "\u65E0\u6CD5\u83B7\u53D6\u5206\u652F\u4FE1\u606F",
19933
+ getBranchesFailed: "\u83B7\u53D6\u5206\u652F\u4FE1\u606F\u5931\u8D25",
19934
+ discardAllConfirm: "\u786E\u5B9A\u8981\u653E\u5F03\u5DE5\u4F5C\u533A\u7684 {{count}} \u4E2A\u6587\u4EF6\u7684\u53D8\u66F4\u5417\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002",
19935
+ worktree: {
19936
+ title: "Git Worktree",
19937
+ count: "{{count}} \u4E2A worktree",
19938
+ selectBranch: "\u9009\u62E9\u5206\u652F",
19939
+ addWorktree: "+ \u6DFB\u52A0 Worktree",
19940
+ confirmDelete: "\u786E\u8BA4\u5220\u9664",
19941
+ confirmDeleteMsg: "\u786E\u5B9A\u8981\u5220\u9664 worktree \u5417\uFF1F",
19942
+ path: "\u8DEF\u5F84\uFF1A",
19943
+ branch: "\u5206\u652F\uFF1A",
19944
+ locked: "\u5DF2\u9501\u5B9A",
19945
+ unlock: "\u89E3\u9501",
19946
+ lock: "\u9501\u5B9A",
19947
+ searchBranch: "\u641C\u7D22\u5206\u652F...",
19948
+ noBranches: "\u65E0\u53EF\u7528\u5206\u652F"
19949
+ }
19950
+ },
19951
+ comments: {
19952
+ addComment: "\u6DFB\u52A0\u8BC4\u8BBA",
19953
+ lineRange: "\u884C {{start}}-{{end}}",
19954
+ inputPlaceholder: "\u8F93\u5165\u8BC4\u8BBA...",
19955
+ newComment: "\u65B0\u8BC4\u8BBA {{range}}",
19956
+ commentPlaceholder: "\u8F93\u5165\u8BC4\u8BBA... ({{modKey}}Enter \u63D0\u4EA4, Esc \u53D6\u6D88)",
19957
+ nComments: "{{count}} \u6761\u8BC4\u8BBA",
19958
+ allComments: "\u6240\u6709\u8BC4\u8BBA",
19959
+ copyAllComments: "\u590D\u5236\u5168\u90E8\u8BC4\u8BBA",
19960
+ noComments: "\u6682\u65E0\u8BC4\u8BBA",
19961
+ clearAll: "\u6E05\u7A7A\u6240\u6709",
19962
+ totalComments: "\u5171 {{count}} \u6761\u8BC4\u8BBA",
19963
+ aiReply: "AI \u56DE\u590D",
19964
+ noContent: "\uFF08\u65E0\u5185\u5BB9\uFF09",
19965
+ linesCount: "({{count}} \u884C)",
19966
+ codeRef: "\u4EE5\u4E0B\u662F\u6211\u6807\u6CE8\u7684\u8BC4\u8BBA\u548C\u5F15\u7528:",
19967
+ note: "\u5907\u6CE8: {{content}}",
19968
+ submitting: "\u63D0\u4EA4\u4E2D...",
19969
+ enterSubmit: "Enter \u63D0\u4EA4 \xB7 Shift+Enter \u6362\u884C",
19970
+ submitComment: "\u63D0\u4EA4\u8BC4\u8BBA",
19971
+ askAI: "\u63D0\u95EE AI",
19972
+ inputQuestion: "\u8F93\u5165\u4F60\u7684\u95EE\u9898...",
19973
+ aiGenerating: "\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7A0D\u5019...",
19974
+ enterSend: "Enter \u53D1\u9001 \xB7 Shift+Enter \u6362\u884C",
19975
+ sendToAI: "\u53D1\u9001 AI",
19976
+ aiResponding: "AI \u6B63\u5728\u54CD\u5E94\u4E2D..."
19977
+ },
19978
+ fileContextMenu: {
19979
+ createFile: "\u65B0\u5EFA\u6587\u4EF6",
19980
+ copyFile: "\u590D\u5236\u6587\u4EF6",
19981
+ copyFolder: "\u590D\u5236\u6587\u4EF6\u5939",
19982
+ pasteHere: "\u7C98\u8D34\u5230\u6B64\u5904",
19983
+ deleteFile: "\u5220\u9664\u6587\u4EF6",
19984
+ deleteFolder: "\u5220\u9664\u6587\u4EF6\u5939",
19985
+ copyRelativePath: "\u590D\u5236\u76F8\u5BF9\u8DEF\u5F84",
19986
+ copyAbsolutePath: "\u590D\u5236\u7EDD\u5BF9\u8DEF\u5F84",
19987
+ copyRelativeDirPath: "\u590D\u5236\u76F8\u5BF9\u6587\u4EF6\u5939\u8DEF\u5F84",
19988
+ copyAbsoluteDirPath: "\u590D\u5236\u7EDD\u5BF9\u6587\u4EF6\u5939\u8DEF\u5F84",
19989
+ copyFileName: "\u590D\u5236\u6587\u4EF6\u540D",
19990
+ copyFolderName: "\u590D\u5236\u6587\u4EF6\u5939\u540D"
19991
+ },
19992
+ settings: {
19993
+ title: "\u8BBE\u7F6E",
19994
+ theme: "\u4E3B\u9898",
19995
+ themeLight: "\u6D45\u8272",
19996
+ themeDark: "\u6DF1\u8272",
19997
+ themeSystem: "\u8DDF\u968F\u7CFB\u7EDF",
19998
+ browserExtension: "\u6D4F\u89C8\u5668\u63D2\u4EF6",
19999
+ extensionInstalled: "Cockpit Bridge \u5DF2\u5B89\u88C5",
20000
+ extensionNotInstalled: "Cockpit Bridge \u672A\u5B89\u88C5",
20001
+ extensionDescription: "\u5B89\u88C5 Chrome \u63D2\u4EF6\u540E\uFF0Ciframe \u5185\u7684\u94FE\u63A5\u8DF3\u8F6C\u5C06\u88AB\u62E6\u622A\uFF1A\u65B0\u6807\u7B7E\u94FE\u63A5\u521B\u5EFA\u65B0\u6C14\u6CE1\uFF0C\u9875\u9762\u5185\u5BFC\u822A\u66F4\u65B0\u5F53\u524D\u6C14\u6CE1\u3002",
20002
+ installSteps: "\u5B89\u88C5\u6B65\u9AA4\uFF1A",
20003
+ step1: "1. \u6253\u5F00 Chrome \u5730\u5740\u680F\u8F93\u5165",
20004
+ step2: "2. \u5F00\u542F\u53F3\u4E0A\u89D2\u300C\u5F00\u53D1\u8005\u6A21\u5F0F\u300D",
20005
+ step3: "3. \u70B9\u51FB\u300C\u52A0\u8F7D\u5DF2\u89E3\u538B\u7684\u6269\u5C55\u7A0B\u5E8F\u300D",
20006
+ step4mac: "4. \u6309 <kbd>Cmd+Shift+G</kbd> \u2192 \u7C98\u8D34\u4E0B\u65B9\u8DEF\u5F84 \u2192 \u56DE\u8F66",
20007
+ copyExtensionPath: "\u590D\u5236\u63D2\u4EF6\u76EE\u5F55\u8DEF\u5F84",
20008
+ reloadExtension: "\u91CD\u8F7D\u63D2\u4EF6",
20009
+ about: "\u5173\u4E8E",
20010
+ language: "\u8BED\u8A00",
20011
+ languageAuto: "\u8DDF\u968F\u7CFB\u7EDF",
20012
+ switchDark: "\u5207\u6362\u6697\u8272",
20013
+ switchLight: "\u5207\u6362\u4EAE\u8272"
20014
+ },
20015
+ editor: {
20016
+ placeholder: "\u5199\u70B9\u4EC0\u4E48... \u8F93\u5165 / \u6253\u5F00\u5FEB\u6377\u547D\u4EE4",
20017
+ noteTitle: "{{name}} - \u7B14\u8BB0",
20018
+ noteUntitled: "\u7B14\u8BB0",
20019
+ saving: "\u4FDD\u5B58\u4E2D...",
20020
+ conflictReloaded: "\u7B14\u8BB0\u5DF2\u88AB\u5176\u4ED6\u5730\u65B9\u4FEE\u6539\uFF0C\u5DF2\u52A0\u8F7D\u6700\u65B0\u7248\u672C\uFF0C\u521A\u624D\u672A\u4FDD\u5B58\u7684\u7F16\u8F91\u5DF2\u4E22\u5F03",
20021
+ linkPlaceholder: "\u8F93\u5165\u94FE\u63A5\u5730\u5740...",
20022
+ confirmLink: "\u786E\u8BA4",
20023
+ removeLink: "\u79FB\u9664\u94FE\u63A5",
20024
+ heading1: "\u6807\u9898 1",
20025
+ heading2: "\u6807\u9898 2",
20026
+ heading3: "\u6807\u9898 3",
20027
+ bold: "\u7C97\u4F53",
20028
+ italic: "\u659C\u4F53",
20029
+ strikethrough: "\u5220\u9664\u7EBF",
20030
+ inlineCode: "\u884C\u5185\u4EE3\u7801",
20031
+ link: "\u94FE\u63A5",
20032
+ bulletList: "\u65E0\u5E8F\u5217\u8868",
20033
+ orderedList: "\u6709\u5E8F\u5217\u8868",
20034
+ taskList: "\u5F85\u529E\u5217\u8868",
20035
+ blockquote: "\u5F15\u7528",
20036
+ codeBlock: "\u4EE3\u7801\u5757",
20037
+ table: "\u8868\u683C",
20038
+ horizontalRule: "\u5206\u5272\u7EBF",
20039
+ insertRowAbove: "\u5728\u4E0A\u65B9\u63D2\u5165\u884C",
20040
+ insertRowBelow: "\u5728\u4E0B\u65B9\u63D2\u5165\u884C",
20041
+ insertColumnLeft: "\u5728\u5DE6\u4FA7\u63D2\u5165\u5217",
20042
+ insertColumnRight: "\u5728\u53F3\u4FA7\u63D2\u5165\u5217",
20043
+ deleteRow: "\u5220\u9664\u5F53\u524D\u884C",
20044
+ deleteColumn: "\u5220\u9664\u5F53\u524D\u5217",
20045
+ deleteTable: "\u5220\u9664\u8868\u683C",
20046
+ deleteCodeBlock: "\u5220\u9664\u4EE3\u7801\u5757",
20047
+ toc: "\u76EE\u5F55",
20048
+ expandToc: "\u5C55\u5F00\u76EE\u5F55",
20049
+ collapseToc: "\u6536\u8D77\u76EE\u5F55"
20050
+ },
20051
+ slashCommands: {
20052
+ heading1: "\u6807\u9898 1",
20053
+ heading1Desc: "\u5927\u6807\u9898",
20054
+ heading2: "\u6807\u9898 2",
20055
+ heading2Desc: "\u4E2D\u6807\u9898",
20056
+ heading3: "\u6807\u9898 3",
20057
+ heading3Desc: "\u5C0F\u6807\u9898",
20058
+ bulletList: "\u65E0\u5E8F\u5217\u8868",
20059
+ bulletListDesc: "\u9879\u76EE\u7B26\u53F7\u5217\u8868",
20060
+ orderedList: "\u6709\u5E8F\u5217\u8868",
20061
+ orderedListDesc: "\u7F16\u53F7\u5217\u8868",
20062
+ taskList: "\u5F85\u529E\u5217\u8868",
20063
+ taskListDesc: "\u53EF\u52FE\u9009\u7684\u4EFB\u52A1\u5217\u8868",
20064
+ blockquote: "\u5F15\u7528",
20065
+ blockquoteDesc: "\u5F15\u7528\u5757",
20066
+ codeBlock: "\u4EE3\u7801\u5757",
20067
+ codeBlockDesc: "\u4EE3\u7801\u7247\u6BB5",
20068
+ table: "\u8868\u683C",
20069
+ tableDesc: "\u63D2\u5165 3\xD73 \u8868\u683C",
20070
+ horizontalRule: "\u5206\u5272\u7EBF",
20071
+ horizontalRuleDesc: "\u6C34\u5E73\u5206\u5272\u7EBF",
20072
+ link: "\u94FE\u63A5",
20073
+ linkDesc: "\u63D2\u5165\u8D85\u94FE\u63A5"
20074
+ },
20075
+ commands: {
20076
+ qa: "\u8FDB\u5165\u9700\u6C42\u6F84\u6E05\u8BA8\u8BBA\u6A21\u5F0F",
20077
+ fx: "\u8FDB\u5165 bug \u8BC1\u636E\u94FE\u5206\u6790\u6A21\u5F0F",
20078
+ ex: "\u8FDB\u5165\u7ED3\u6784\u5316\u5206\u6790\u8BA8\u8BBA\u6A21\u5F0F",
20079
+ go: "\u8FDB\u5165\u8FDE\u7EED\u843D\u5730\uFF08MVP\uFF09\u6A21\u5F0F",
20080
+ cg: "\u8FDB\u5165 CodeGraph \u63A2\u7D22\u6A21\u5F0F",
20081
+ plan: "\u5F00\u542F\u8BA1\u5212\u6A21\u5F0F \xB7 /plan <\u4EFB\u52A1> \u76F4\u63A5\u89C4\u5212\u8BE5\u4EFB\u52A1 \xB7 /plan off \u5173\u95ED"
20082
+ },
20083
+ review: {
20084
+ reviewManagement: "\u8BC4\u5BA1\u7BA1\u7406",
20085
+ allReviews: "\u6240\u6709\u8BC4\u5BA1",
20086
+ noOpenReviews: "\u6682\u65E0\u5F00\u653E\u8BC4\u5BA1",
20087
+ viewComments: "\u67E5\u770B\u8BC4\u8BBA",
20088
+ nComments: "{{count}} \u6761\u8BC4\u8BBA",
20089
+ nDocs: "{{count}} \u6587\u6863",
20090
+ nReviews: "{{count}} \u8BC4\u5BA1",
20091
+ docList: "\u6587\u6863\u5217\u8868",
20092
+ allReviewsList: "\u6240\u6709\u8BC4\u5BA1",
20093
+ expandList: "\u5C55\u5F00\u5217\u8868",
20094
+ collapseList: "\u6298\u53E0\u5217\u8868",
20095
+ closeReview: "\u5173\u95ED\u8BC4\u5BA1",
20096
+ reopenReview: "\u91CD\u65B0\u5F00\u653E",
20097
+ deleteReview: "\u5220\u9664\u8BC4\u5BA1",
20098
+ noOpenDocs: "\u6682\u65E0\u5F00\u653E\u6587\u6863",
20099
+ noReviews: "\u6682\u65E0\u8BC4\u5BA1",
20100
+ sharing: "\u5206\u4EAB\u4E2D",
20101
+ notShared: "\u672A\u5206\u4EAB",
20102
+ closeSharing: "\u5173\u95ED\u5206\u4EAB",
20103
+ enableSharing: "\u5F00\u542F\u5206\u4EAB\u8BC4\u5BA1",
20104
+ view: "\u67E5\u770B",
20105
+ setNickname: "\u8BBE\u7F6E\u4F60\u7684\u6635\u79F0",
20106
+ nicknameHint: "\u5176\u4ED6\u8BC4\u5BA1\u4EBA\u5C06\u770B\u5230\u8FD9\u4E2A\u540D\u5B57",
20107
+ nicknamePlaceholder: "\u8F93\u5165\u6635\u79F0",
20108
+ skipForNow: "\u4E0B\u6B21\u518D\u8BF4",
20109
+ identitySettings: "\u8EAB\u4EFD\u8BBE\u7F6E",
20110
+ reviewNickname: "\u8BC4\u5BA1\u6635\u79F0",
20111
+ random: "\u968F\u673A",
20112
+ selectTextToComment: "\u9009\u4E2D\u5DE6\u4FA7\u6587\u672C\u6DFB\u52A0\u8BC4\u8BBA",
20113
+ selectTextHint: "\u9009\u4E2D\u5DE6\u4FA7\u6587\u672C\u5373\u53EF\u6DFB\u52A0\u8BC4\u8BBA",
20114
+ prevComment: "\u4E0A\u4E00\u6761",
20115
+ nextComment: "\u4E0B\u4E00\u6761",
20116
+ commentsCount: "{{count}} \u6761\u8BC4\u8BBA",
20117
+ commentsNavCount: "{{current}}/{{total}} \u6761\u8BC4\u8BBA",
20118
+ allCommentsTitle: "\u5168\u90E8\u8BC4\u8BBA",
20119
+ commentsCountBrief: "{{count}} \u6761",
20120
+ closedCount: "{{count}} \u6761\u5DF2\u5173\u95ED",
20121
+ copyAllComments: "\u590D\u5236\u5168\u90E8\u8BC4\u8BBA",
20122
+ noComments: "\u6682\u65E0\u8BC4\u8BBA",
20123
+ closedComments: "\u5DF2\u5173\u95ED ({{count}})",
20124
+ closedLabel: "\u5DF2\u5173\u95ED",
20125
+ moreReplies: "+{{count}} \u6761\u56DE\u590D",
20126
+ copyComment: "\u590D\u5236\u8BC4\u8BBA",
20127
+ reopen: "\u91CD\u5F00",
20128
+ closeComment: "\u5173\u95ED\u8BC4\u8BBA",
20129
+ editComment: "\u7F16\u8F91\u8BC4\u8BBA",
20130
+ deleteComment: "\u5220\u9664\u8BC4\u8BBA",
20131
+ edited: "(\u5DF2\u7F16\u8F91)",
20132
+ editReply: "\u7F16\u8F91\u56DE\u590D",
20133
+ deleteReply: "\u5220\u9664\u56DE\u590D",
20134
+ reply: "\u56DE\u590D",
20135
+ replyPlaceholder: "\u6DFB\u52A0\u56DE\u590D...",
20136
+ selectedText: "\u9009\u4E2D\u6587\u672C",
20137
+ addCommentPlaceholder: "\u6DFB\u52A0\u8BC4\u8BBA...",
20138
+ enterSubmitHint: "Enter \u63D0\u4EA4\uFF0CShift+Enter \u6362\u884C",
20139
+ commentBtn: "\u8BC4\u8BBA",
20140
+ reviewNotExist: "\u8BC4\u5BA1\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5220\u9664",
20141
+ loadFailed: "\u52A0\u8F7D\u5931\u8D25",
20142
+ networkError: "\u7F51\u7EDC\u9519\u8BEF",
20143
+ reviewNotFound: "\u8BC4\u5BA1\u4E0D\u5B58\u5728",
20144
+ checkLink: "\u8BF7\u68C0\u67E5\u94FE\u63A5\u662F\u5426\u6B63\u786E",
20145
+ updatedAt: "\u66F4\u65B0\u4E8E {{date}}",
20146
+ active: "\u5F00\u653E\u4E2D",
20147
+ closed: "\u5DF2\u5173\u95ED",
20148
+ viewAllComments: "\u67E5\u770B\u5168\u90E8\u8BC4\u8BBA",
20149
+ viewCommentBtn: "\u67E5\u770B\u8BC4\u8BBA",
20150
+ copyLink: "\u590D\u5236\u94FE\u63A5",
20151
+ reviewSummary: "\u8BC4\u5BA1\u8BC4\u8BBA\u6C47\u603B \u2014 {{title}}",
20152
+ totalNComments: "\u5171 {{count}} \u6761\u8BC4\u8BBA",
20153
+ quoteRef: '\u5F15\u7528: "{{text}}"',
20154
+ commentAuthor: "\u8BC4\u8BBA ({{author}}): {{content}}",
20155
+ replyAuthor: " \u21B3 {{author}}: {{content}}"
20156
+ },
20157
+ markdown: {
20158
+ copied: "\u2713 \u5DF2\u590D\u5236",
20159
+ copy: "\u590D\u5236"
20160
+ },
20161
+ imagePreview: {
20162
+ previewImage: "\u9884\u89C8\u56FE\u7247",
20163
+ deleteImage: "\u5220\u9664\u56FE\u7247"
20164
+ },
20165
+ tokenStats: {
20166
+ title: "Claude Code Token \u7EDF\u8BA1",
20167
+ activeHours: "\u6D3B\u8DC3\u65F6\u6BB5\u5206\u5E03",
20168
+ hourSessions: "{{h}}:00 \u2014 {{count}} \u6B21\u4F1A\u8BDD",
20169
+ messages: "\u6D88\u606F",
20170
+ toolCalls: "\u5DE5\u5177\u8C03\u7528",
20171
+ activityTrend: "\u6D3B\u52A8\u8D8B\u52BF",
20172
+ byModel: "\u6309\u6A21\u578B",
20173
+ tokenUsage: "Token \u7528\u91CF",
20174
+ equivalentCost: "\u7B49\u6548\u8D39\u7528",
20175
+ modelCostDetail: "\u6A21\u578B\u8D39\u7528\u660E\u7EC6",
20176
+ model: "\u6A21\u578B",
20177
+ share: "\u5360\u6BD4",
20178
+ total: "\u5408\u8BA1",
20179
+ totalSessions: "\u603B\u4F1A\u8BDD",
20180
+ totalMessages: "\u603B\u6D88\u606F",
20181
+ equivalentApiCost: "\u7B49\u6548 API \u8D39\u7528",
20182
+ longestSession: "\u6700\u957F\u4F1A\u8BDD",
20183
+ firstUse: "\u9996\u6B21\u4F7F\u7528",
20184
+ notFound: "\u672A\u627E\u5230 ~/.claude/stats-cache.json",
20185
+ day: "\u65E5",
20186
+ week: "\u5468",
20187
+ month: "\u6708"
20188
+ },
20189
+ toolCall: {
20190
+ inputParams: "\u8F93\u5165\u53C2\u6570",
20191
+ resultLabel: "\u7ED3\u679C",
20192
+ inputParamsTitle: "\u67E5\u770B\u8F93\u5165\u53C2\u6570",
20193
+ resultTitle: "\u67E5\u770B\u7ED3\u679C",
20194
+ input: "\u8F93\u5165",
20195
+ result: "\u7ED3\u679C",
20196
+ foldedLines: "... ({{count}} \u884C)"
20197
+ },
20198
+ fileEditor: {
20199
+ unsavedConfirm: "\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\uFF0C\u786E\u5B9A\u5173\u95ED\uFF1F",
20200
+ discardChanges: "\u653E\u5F03\u4FEE\u6539",
20201
+ continueEditing: "\u7EE7\u7EED\u7F16\u8F91",
20202
+ externallyModified: "\u6587\u4EF6\u5DF2\u88AB\u5916\u90E8\u4FEE\u6539\uFF0C\u4FDD\u5B58\u5C06\u8986\u76D6\u5916\u90E8\u66F4\u6539",
20203
+ useDiskVersion: "\u4F7F\u7528\u78C1\u76D8\u7248\u672C",
20204
+ forceOverwrite: "\u5F3A\u5236\u8986\u76D6"
20205
+ },
20206
+ quickFileOpen: {
20207
+ placeholder: "\u8F93\u5165\u6587\u4EF6\u540D\u5FEB\u901F\u6253\u5F00...",
20208
+ noMatch: "\u6CA1\u6709\u5339\u914D\u7684\u6587\u4EF6",
20209
+ recent: "\u6700\u8FD1",
20210
+ selectHint: "\u9009\u62E9",
20211
+ openHint: "\u6253\u5F00",
20212
+ closeHint: "\u5173\u95ED"
20213
+ },
20214
+ envManager: {
20215
+ title: "\u73AF\u5883\u53D8\u91CF\u7BA1\u7406",
20216
+ tabScope: "\u5F53\u524D Tab \u4E13\u7528",
20217
+ globalScope: "\u5168\u5C40\u73AF\u5883\u53D8\u91CF",
20218
+ varNamePlaceholder: "\u53D8\u91CF\u540D\uFF08\u5982 NODE_ENV\uFF09",
20219
+ varValuePlaceholder: "\u503C\uFF08\u5982 production\uFF09",
20220
+ valuePlaceholder: "\u503C",
20221
+ noVars: "\u8FD8\u6CA1\u6709\u73AF\u5883\u53D8\u91CF\uFF0C\u6DFB\u52A0\u4E00\u4E2A\u8BD5\u8BD5"
20222
+ },
20223
+ aliasManager: {
20224
+ title: "\u547D\u4EE4\u522B\u540D\u7BA1\u7406",
20225
+ description: "\u4E3A\u5E38\u7528\u547D\u4EE4\u8BBE\u7F6E\u5FEB\u6377\u522B\u540D\uFF08\u5168\u5C40\u751F\u6548\uFF09",
20226
+ aliasPlaceholder: "\u522B\u540D\uFF08\u5982 ll\uFF09",
20227
+ commandPlaceholder: "\u5B8C\u6574\u547D\u4EE4\uFF08\u5982 ls -la\uFF09",
20228
+ fullCommandPlaceholder: "\u5B8C\u6574\u547D\u4EE4",
20229
+ usage: "\u4F7F\u7528\u63D0\u793A\uFF1A",
20230
+ usageDesc: "\u8F93\u5165\u522B\u540D\u5373\u53EF\u6267\u884C\u5BF9\u5E94\u7684\u5B8C\u6574\u547D\u4EE4",
20231
+ noAliases: "\u8FD8\u6CA1\u6709\u547D\u4EE4\u522B\u540D\uFF0C\u6DFB\u52A0\u4E00\u4E2A\u8BD5\u8BD5"
20232
+ },
20233
+ diffViewer: {
20234
+ fileChanges: "\u6587\u4EF6\u53D8\u66F4 ({{count}})",
20235
+ toggleFileTree: "\u5207\u6362\u6587\u4EF6\u76EE\u5F55",
20236
+ selectFileToView: "\u9009\u62E9\u5DE6\u4FA7\u6587\u4EF6\u67E5\u770B\u53D8\u66F4",
20237
+ sideBySide: "\u5E76\u5217\u5BF9\u6BD4",
20238
+ unified: "\u7EDF\u4E00\u5BF9\u6BD4",
20239
+ viewSplit: "\u53CC\u680F",
20240
+ viewUnified: "\u5355\u680F",
20241
+ previewFile: "\u9884\u89C8\u6587\u4EF6",
20242
+ copiedAll: "\u5DF2\u590D\u5236\u5168\u6587",
20243
+ compact: "\u7CBE\u7B80",
20244
+ full: "\u5168\u6587",
20245
+ gap: {
20246
+ hidden: "\u5DF2\u9690\u85CF {{count}} \u884C",
20247
+ more: "\xB7\xB7\xB7 \u66F4\u591A +{{count}} \xB7\xB7\xB7",
20248
+ expandUp: "\u5411\u4E0A\u5C55\u5F00 {{count}} \u884C",
20249
+ expandDown: "\u5411\u4E0B\u5C55\u5F00 {{count}} \u884C"
20250
+ },
20251
+ loadingSnapshots: "\u6B63\u5728\u52A0\u8F7D\u5FEB\u7167\u2026",
20252
+ noChanges: "\u672C\u8F6E\u672A\u68C0\u6D4B\u5230\u6587\u4EF6\u53D8\u66F4",
20253
+ notViewable: "\u4E8C\u8FDB\u5236\u6216\u8D85\u5927\u6587\u4EF6\uFF0C\u65E0\u6CD5\u5C55\u793A diff",
20254
+ externalChange: "\u540C\u671F\u5176\u4ED6\u4F1A\u8BDD/\u5916\u90E8\u8FDB\u7A0B\u7684\u53D8\u66F4",
20255
+ reconstructed: "\u53C2\u6570\u91CD\u5EFA",
20256
+ reconstructedHint: "\u7531\u5DE5\u5177\u8C03\u7528\u53C2\u6570\u91CD\u5EFA\uFF0C\u975E\u78C1\u76D8\u5FEB\u7167",
20257
+ truncated: "\u6587\u4EF6\u8FC7\u591A\uFF0C\u4EC5\u663E\u793A\u90E8\u5206"
20258
+ },
20259
+ commitDetail: {
20260
+ title: "\u63D0\u4EA4\u8BE6\u60C5",
20261
+ hash: "\u54C8\u5E0C:",
20262
+ author: "\u4F5C\u8005:",
20263
+ date: "\u65E5\u671F:",
20264
+ files: "\u6587\u4EF6:",
20265
+ nChanges: "{{count}} \u4E2A\u53D8\u66F4",
20266
+ loadingFiles: "\u52A0\u8F7D\u6587\u4EF6\u4E2D...",
20267
+ noFileChanges: "\u65E0\u6587\u4EF6\u53D8\u66F4",
20268
+ loadingDiff: "\u52A0\u8F7D\u5DEE\u5F02\u4E2D...",
20269
+ selectFileToView: "\u9009\u62E9\u6587\u4EF6\u67E5\u770B\u5DEE\u5F02"
20270
+ },
20271
+ askQuestion: {
20272
+ title: "\u63D0\u95EE",
20273
+ nQuestions: "{{count}} \u4E2A\u95EE\u9898",
20274
+ checkedN: "\u5DF2\u52FE\u9009 {{count}}",
20275
+ copyChecked: "\u590D\u5236\u52FE\u9009\u7684 {{count}} \u4E2A\u95EE\u7B54",
20276
+ copyAll: "\u590D\u5236\u6240\u6709\u95EE\u7B54",
20277
+ sendChecked: "\u53D1\u9001\u52FE\u9009\u7684 {{count}} \u4E2A\u95EE\u7B54\u7ED9 AI",
20278
+ sendAll: "\u53D1\u9001\u6240\u6709\u95EE\u7B54\u7ED9 AI",
20279
+ sendNoChat: "\u6CA1\u6709\u53EF\u7528\u7684\u804A\u5929\u4F1A\u8BDD",
20280
+ checkToCopy: "\u52FE\u9009\u4EE5\u590D\u5236",
20281
+ custom: "\u81EA\u5B9A\u4E49",
20282
+ customPlaceholder: "\u8F93\u5165\u81EA\u5B9A\u4E49\u56DE\u7B54...",
20283
+ notSelected: "(\u672A\u9009\u62E9)"
20284
+ },
20285
+ tabBar: {
20286
+ unpin: "\u53D6\u6D88\u56FA\u5B9A",
20287
+ pin: "\u56FA\u5B9A\u5230\u5E38\u7528\u4F1A\u8BDD",
20288
+ closeTab: "\u5173\u95ED\u6807\u7B7E",
20289
+ closeAll: "\u5173\u95ED\u6240\u6709\u6807\u7B7E",
20290
+ newTab: "\u65B0\u5EFA\u6807\u7B7E"
20291
+ },
20292
+ tabManagerTopBar: {
20293
+ copyPageUrl: "\u590D\u5236\u9875\u9762\u5730\u5740",
20294
+ copyDirPath: "\u590D\u5236\u76EE\u5F55\u8DEF\u5F84",
20295
+ refreshProject: "\u5237\u65B0\u5F53\u524D\u9879\u76EE",
20296
+ openInVSCode: "\u5728 VS Code \u4E2D\u6253\u5F00",
20297
+ openInCursor: "\u5728 Cursor \u4E2D\u6253\u5F00",
20298
+ aliasesGlobal: "\u547D\u4EE4\u522B\u540D\uFF08\u5168\u5C40\uFF09",
20299
+ tokenStats: "Token \u7EDF\u8BA1",
20300
+ openSurething: "\u6253\u5F00 Surething"
20301
+ },
20302
+ hoverTooltip: {
20303
+ findReferences: "\u67E5\u627E\u5F15\u7528",
20304
+ search: "\u641C\u7D22"
20305
+ },
20306
+ todoViewer: {
20307
+ title: "\u4EFB\u52A1\u5217\u8868",
20308
+ progress: "{{completed}} / {{total}} \u5B8C\u6210"
20309
+ },
20310
+ userMessages: {
20311
+ title: "\u7528\u6237\u6D88\u606F\u5217\u8868",
20312
+ noMessages: "\u6682\u65E0\u7528\u6237\u6D88\u606F"
20313
+ },
20314
+ shortIdBadge: {
20315
+ clickToDisconnect: "\u70B9\u51FB\u65AD\u5F00\u8FDE\u63A5",
20316
+ clickToRegister: "\u70B9\u51FB\u6CE8\u518C\u5E76\u590D\u5236 CLI \u547D\u4EE4",
20317
+ setTitle: "\u7ED9\u8FD9\u4E2A\u6C14\u6CE1\u547D\u540D\uFF08\u4FBF\u4E8E /cc \u901A\u8FC7 connection list \u627E\u5230\u5B83\uFF09",
20318
+ setTitlePlaceholder: "\u8BBE\u7F6E\u6807\u9898",
20319
+ editTitle: "\u7F16\u8F91\u6807\u9898",
20320
+ titleSet: "\u6807\u9898\uFF1A{{title}}",
20321
+ dialogTitle: "\u7ED9\u6C14\u6CE1\u547D\u540D",
20322
+ dialogPlaceholder: "\u4F8B\u5982\uFF1Aalloydb \u4EE3\u7406\u3001\u9884\u53D1\u7BA1\u7406\u540E\u53F0"
20323
+ },
20324
+ api: {
20325
+ pathForbidden: "\u4E0D\u5141\u8BB8\u64CD\u4F5C\u6B64\u8DEF\u5F84",
20326
+ deleteForbidden: "\u4E0D\u5141\u8BB8\u5220\u9664\u6B64\u8DEF\u5F84",
20327
+ notAFolder: "\u76EE\u6807\u4E0D\u662F\u6587\u4EF6\u5939",
20328
+ imageTooLarge: "\u56FE\u7247\u6587\u4EF6\u8FC7\u5927\uFF0C\u65E0\u6CD5\u9884\u89C8",
20329
+ cannotPreviewBinary: "\u65E0\u6CD5\u9884\u89C8\u4E8C\u8FDB\u5236\u6587\u4EF6",
20330
+ fileTooLarge: "\u6587\u4EF6\u8FC7\u5927\uFF0C\u65E0\u6CD5\u9884\u89C8\uFF08\u8D85\u8FC7 10MB\uFF09",
20331
+ fileModifiedExternally: "\u6587\u4EF6\u5DF2\u88AB\u5916\u90E8\u4FEE\u6539",
20332
+ pickFolderPrompt: "\u9009\u62E9\u9879\u76EE\u6587\u4EF6\u5939"
20333
+ },
20334
+ confirm: {
20335
+ title: "\u63D0\u793A",
20336
+ ok: "\u786E\u5B9A",
20337
+ cancel: "\u53D6\u6D88"
20338
+ },
20339
+ floatingToolbar: {
20340
+ addComment: "\u6DFB\u52A0\u8BC4\u8BBA",
20341
+ sendToAI: "\u53D1\u9001 AI",
20342
+ search: "\u641C\u7D22"
20343
+ },
20344
+ quickReply: {
20345
+ optionA: "A",
20346
+ optionB: "B",
20347
+ optionC: "C",
20348
+ optionD: "D",
20349
+ allRecommended: "\u90FD\u6309\u63A8\u8350",
20350
+ thisOne: "\u5C31\u8FD9\u4E2A",
20351
+ notThis: "\u4E0D\u8981\u8FD9\u6837",
20352
+ why: "\u4E3A\u4EC0\u4E48",
20353
+ elaborate: "\u5C55\u5F00\u8BF4",
20354
+ example: "\u4E3E\u4E2A\u4F8B\u5B50",
20355
+ start: "\u5F00\u59CB\u505A",
20356
+ continue: "\u7EE7\u7EED",
20357
+ ok: "OK",
20358
+ done: "\u505A\u5B8C\u4E86"
20359
+ },
20360
+ searchResults: {
20361
+ title: "\u641C\u7D22\u7ED3\u679C",
20362
+ nMatches: "({{count}} \u5904\u5339\u914D)",
20363
+ searching: "\u641C\u7D22\u4E2D...",
20364
+ noResults: "\u65E0\u5339\u914D\u7ED3\u679C",
20365
+ scopeSelected: "\u9009\u4E2D",
20366
+ scopeAll: "\u5168\u90E8"
20367
+ },
20368
+ references: {
20369
+ title: "\u5F15\u7528",
20370
+ searching: "\u641C\u7D22\u4E2D...",
20371
+ notFound: "\u672A\u627E\u5230\u5F15\u7528"
20372
+ },
20373
+ gitFileTree: {
20374
+ noFiles: "\u65E0\u6587\u4EF6"
20375
+ },
20376
+ explain: {
20377
+ action: "\u89E3\u91CA\u4E00\u4E0B",
20378
+ fileMessage: "\u89E3\u91CA\u4E00\u4E0B {{path}}",
20379
+ symbolMessage: "\u89E3\u91CA\u4E00\u4E0B {{name}} ({{path}}:{{lines}})",
20380
+ selectionMessage: "\u89E3\u91CA\u4E00\u4E0B",
20381
+ commitFileMessage: "\u89E3\u91CA\u4E00\u4E0B git commit {{hash}} \u5BF9 {{path}} \u7684\u6539\u52A8",
20382
+ compareFileMessage: "\u89E3\u91CA\u4E00\u4E0B git {{base}}..HEAD \u4E2D {{path}} \u7684\u6539\u52A8",
20383
+ stagedFileMessage: "\u89E3\u91CA\u4E00\u4E0B git \u6682\u5B58\u533A\u4E2D {{path}} \u7684\u6539\u52A8",
20384
+ unstagedFileMessage: "\u89E3\u91CA\u4E00\u4E0B git \u5DE5\u4F5C\u533A\u4E2D {{path}} \u7684\u6539\u52A8"
20385
+ },
20386
+ reviewUtils: {
20387
+ adjectives: ["\u5FEB\u4E50", "\u52C7\u6562", "\u5B89\u9759", "\u660E\u4EAE", "\u6E29\u67D4", "\u7075\u5DE7", "\u81EA\u7531", "\u6E05\u6F88", "\u98DE\u7FD4", "\u60A0\u95F2", "\u6D3B\u6CFC", "\u806A\u6167", "\u6DE1\u5B9A", "\u673A\u654F", "\u4ECE\u5BB9", "\u575A\u5B9A", "\u723D\u6717", "\u548C\u7166", "\u5954\u653E", "\u6C89\u7A33"],
20388
+ nouns: ["\u718A\u732B", "\u6D77\u8C5A", "\u767D\u9E64", "\u96EA\u8C79", "\u4E91\u96C0", "\u677E\u9F20", "\u98DE\u9C7C", "\u6885\u82B1\u9E7F", "\u9752\u9E1F", "\u94F6\u72D0", "\u732B\u5934\u9E70", "\u873B\u8713", "\u8424\u706B\u866B", "\u6D77\u9F9F", "\u8774\u8776", "\u91D1\u4E1D\u7334", "\u4E39\u9876\u9E64", "\u7F9A\u7F8A", "\u71D5\u5B50", "\u4F01\u9E45"]
20389
+ }
20390
+ };
20391
+
20392
+ // packages/shared/i18n/src/index.ts
20393
+ if (!i18n.isInitialized) {
20394
+ i18n.init({
20395
+ resources: {
20396
+ en: { translation: en_default2 },
20397
+ zh: { translation: zh_default }
20398
+ },
20399
+ lng: "en",
20400
+ // Fixed initial language; client detects in app/I18nProvider
20401
+ fallbackLng: "en",
20402
+ interpolation: {
20403
+ escapeValue: false
20404
+ }
20405
+ });
20406
+ }
20407
+ var src_default = i18n;
20408
+
17978
20409
  // packages/feature/agent/src/server/scheduledTasks.ts
17979
20410
  var MAX_CONSECUTIVE_FAILURES = 3;
20411
+ function buildTaskPrompt(task) {
20412
+ if (!task.taskFile) return task.message;
20413
+ const header = src_default.t("scheduledTasks.taskFilePromptHeader", {
20414
+ lng: task.language || "en"
20415
+ });
20416
+ return `${header}
20417
+ - ${task.taskFile}`;
20418
+ }
17980
20419
  function parseCronField(field, min, max) {
17981
20420
  const values = [];
17982
20421
  for (const part of field.split(",")) {
@@ -18027,15 +20466,19 @@ var dispatchEngineMessageEff = (task, engine, startFresh) => Effect_exports.tryP
18027
20466
  if (!spec) {
18028
20467
  throw new Error(`no engine spec for ${engine}`);
18029
20468
  }
20469
+ const builtinLoop = isDeepseekBuiltinSession(engine, task);
20470
+ const noHistory = await readSessionNoHistory(task, engine, builtinLoop);
18030
20471
  const outcome = await dispatchChat(spec, {
18031
- prompt: task.message,
20472
+ prompt: buildTaskPrompt(task),
18032
20473
  // Omit sessionId to start a brand-new session when the resume target is gone;
18033
20474
  // the engine generates a fresh id (captured below via getRunSessionId).
18034
20475
  ...startFresh ? {} : { sessionId: task.sessionId },
18035
20476
  cwd: task.cwd,
18036
20477
  engine,
18037
20478
  // selects claude2's CLAUDE_CONFIG_DIR; no-op for the others
18038
- ...task.model && { model: task.model }
20479
+ ...task.model && { model: task.model },
20480
+ ...builtinLoop && { mode: "builtin" },
20481
+ ...noHistory && { noHistory: true }
18039
20482
  });
18040
20483
  if (!outcome.ok) {
18041
20484
  throw new Error(`${engine} dispatch rejected (${outcome.status}): ${outcome.error}`);
@@ -18069,9 +20512,18 @@ var dispatchEngineMessageEff = (task, engine, startFresh) => Effect_exports.tryP
18069
20512
  cause
18070
20513
  })
18071
20514
  });
20515
+ function isDeepseekBuiltinSession(engine, task) {
20516
+ return engine === "deepseek" && existsSync3(getDeepseekBuiltinSessionPath(task.cwd, task.sessionId));
20517
+ }
20518
+ async function readSessionNoHistory(task, engine, builtinLoop) {
20519
+ if (engine !== "ollama" && !builtinLoop) return false;
20520
+ const state = await readJsonFile(getSessionFilePath(task.cwd), {});
20521
+ return state.noHistories?.[task.sessionId] === true;
20522
+ }
18072
20523
  function sessionPathFor(engine, task) {
18073
20524
  if (engine === "claude2") return getClaude2SessionPath(task.cwd, task.sessionId);
18074
20525
  if (engine === "ollama") return getOllamaSessionPath(task.cwd, task.sessionId);
20526
+ if (isDeepseekBuiltinSession(engine, task)) return getDeepseekBuiltinSessionPath(task.cwd, task.sessionId);
18075
20527
  if (engine === "deepseek") return getDeepseekSessionPath(task.cwd, task.sessionId);
18076
20528
  if (engine === "codex") return findCodexSessionPath(task.sessionId);
18077
20529
  if (engine === "kimi") return findKimiSessionPath(task.sessionId);
@@ -18088,6 +20540,15 @@ var sendChatMessageEff = (task) => Effect_exports.gen(function* () {
18088
20540
  })
18089
20541
  );
18090
20542
  }
20543
+ if (task.taskFile && !existsSync3(task.taskFile)) {
20544
+ return yield* Effect_exports.fail(
20545
+ new AgentError({
20546
+ provider: engine === "claude2" ? "claude" : engine,
20547
+ kind: "unknown",
20548
+ cause: new Error(`task file not found: ${task.taskFile} (task ${task.id})`)
20549
+ })
20550
+ );
20551
+ }
18091
20552
  const sessionPath = sessionPathFor(engine, task);
18092
20553
  const startFresh = !sessionPath || !existsSync3(sessionPath);
18093
20554
  if (startFresh) {
@@ -18465,7 +20926,9 @@ var ScheduledTaskManager = class {
18465
20926
  var g2 = globalThis;
18466
20927
  var scheduledTaskManager = g2.__scheduledTaskManager ?? (g2.__scheduledTaskManager = new ScheduledTaskManager());
18467
20928
  export {
20929
+ buildTaskPrompt,
18468
20930
  getNextCronTime,
20931
+ readSessionNoHistory,
18469
20932
  scheduledTaskManager,
18470
20933
  sendChatMessageEff
18471
20934
  };