@surething/cockpit 1.0.266 → 1.0.268

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 (691) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +4 -3
  3. package/.next-prod/build-manifest.json +2 -2
  4. package/.next-prod/cockpit-build.json +1 -1
  5. package/.next-prod/prerender-manifest.json +4 -4
  6. package/.next-prod/routes-manifest.json +6 -0
  7. package/.next-prod/server/app/_global-error/page.js +2 -2
  8. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  10. package/.next-prod/server/app/_global-error.html +1 -1
  11. package/.next-prod/server/app/_global-error.rsc +1 -1
  12. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  14. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  15. package/.next-prod/server/app/_not-found/page.js +1 -1
  16. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next-prod/server/app/_not-found.html +2 -2
  19. package/.next-prod/server/app/_not-found.rsc +3 -3
  20. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
  21. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  22. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  23. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  24. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  25. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  26. package/.next-prod/server/app/api/bash/route.js +1 -1
  27. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  28. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  29. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  30. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  31. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  32. package/.next-prod/server/app/api/chat/glm/route.js +1 -1
  33. package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
  34. package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
  35. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  36. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  37. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/chat/route.js +1 -1
  39. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  41. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  43. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/commands/route.js +1 -1
  45. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/comments/route.js +1 -1
  47. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/db/columns/route.js +1 -1
  49. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/db/connect/route.js +2 -2
  51. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  53. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/db/export/route.js +1 -1
  55. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/db/query/route.js +1 -1
  57. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/db/schemas/route.js +2 -2
  59. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/deepseek/balance/route.js +1 -1
  61. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  63. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/deepseek/models/route.js +1 -1
  65. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
  66. package/.next-prod/server/app/api/dev/spans/route.js +1 -1
  67. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  68. package/.next-prod/server/app/api/extension/version/route.js +1 -1
  69. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  70. package/.next-prod/server/app/api/file/route.js +1 -1
  71. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  72. package/.next-prod/server/app/api/files/blame/route.js +1 -1
  73. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  74. package/.next-prod/server/app/api/files/clipboard/route.js +1 -1
  75. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  76. package/.next-prod/server/app/api/files/copy/route.js +1 -1
  77. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  78. package/.next-prod/server/app/api/files/delete/route.js +1 -1
  79. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  80. package/.next-prod/server/app/api/files/expanded/route.js +1 -1
  81. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  82. package/.next-prod/server/app/api/files/index/route.js +1 -1
  83. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  84. package/.next-prod/server/app/api/files/init/route.js +1 -1
  85. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  86. package/.next-prod/server/app/api/files/paste/route.js +1 -1
  87. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  88. package/.next-prod/server/app/api/files/read/route.js +1 -1
  89. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  90. package/.next-prod/server/app/api/files/readdir/route.js +1 -1
  91. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  92. package/.next-prod/server/app/api/files/recent/route.js +1 -1
  93. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  94. package/.next-prod/server/app/api/files/save/route.js +1 -1
  95. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  96. package/.next-prod/server/app/api/files/search/route.js +1 -1
  97. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  98. package/.next-prod/server/app/api/files/stat/route.js +1 -1
  99. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  100. package/.next-prod/server/app/api/files/text/route.js +1 -1
  101. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  102. package/.next-prod/server/app/api/git/blob/route.js +1 -1
  103. package/.next-prod/server/app/api/git/blob/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/git/branch-diff/route.js +1 -1
  105. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  107. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  109. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  111. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  113. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  115. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  117. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  119. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/git/status/route.js +1 -1
  121. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  122. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  123. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  125. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/glm/credentials/route.js +1 -1
  127. package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/glm/models/route.js +1 -1
  129. package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
  130. package/.next-prod/server/app/api/glm/usage/route.js +1 -1
  131. package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
  132. package/.next-prod/server/app/api/global-state/route.js +1 -1
  133. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  134. package/.next-prod/server/app/api/health/route.js +1 -1
  135. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  137. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  139. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  140. package/.next-prod/server/app/api/jupyter/load/route.js +1 -1
  141. package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/jupyter/save/route.js +1 -1
  143. package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
  144. package/.next-prod/server/app/api/jupyter/shutdown/route.js +1 -1
  145. package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/kimi/credentials/route.js +1 -1
  147. package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/kimi/models/route.js +1 -1
  149. package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
  151. package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  153. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  155. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  157. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  159. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  161. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/mysql/columns/route.js +1 -1
  163. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  165. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  167. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  169. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  171. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/mysql/schemas/route.js +2 -2
  173. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  174. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  175. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  176. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  177. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  178. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  179. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  180. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  181. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  182. package/.next-prod/server/app/api/note/route.js +1 -1
  183. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  184. package/.next-prod/server/app/api/ollama/config/route.js +1 -1
  185. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  186. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  187. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  188. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  189. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  190. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  191. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  192. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  193. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  194. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  195. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  196. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  197. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  198. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  199. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  200. package/.next-prod/server/app/api/project-state/route.js +2 -2
  201. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  202. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  203. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  204. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  205. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  206. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  207. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  208. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  209. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  210. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  211. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  212. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  213. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  214. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  215. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  216. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  217. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  218. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  219. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  220. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  221. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  222. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  223. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  224. package/.next-prod/server/app/api/projects/route.js +1 -1
  225. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  226. package/.next-prod/server/app/api/prompts/config/route.js +1 -1
  227. package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -1
  228. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  229. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  230. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  231. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  232. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  233. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  234. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  235. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  236. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  237. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  238. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  239. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  240. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  241. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  242. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  243. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  244. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  245. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  246. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  247. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  248. package/.next-prod/server/app/api/restart/route.js +1 -1
  249. package/.next-prod/server/app/api/restart/route.js.nft.json +1 -1
  250. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  251. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  252. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  253. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  254. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  255. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  256. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  257. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  258. package/.next-prod/server/app/api/review/order/route.js +1 -1
  259. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  260. package/.next-prod/server/app/api/review/route.js +1 -1
  261. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  262. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  263. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  264. package/.next-prod/server/app/api/review/users/route.js +1 -1
  265. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  266. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  267. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  268. package/.next-prod/server/app/api/services/config/route.js +1 -1
  269. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  270. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  271. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  272. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  273. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  274. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  275. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  276. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  277. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  278. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  279. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  280. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  281. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  282. package/.next-prod/server/app/api/sessions/route.js +1 -1
  283. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  284. package/.next-prod/server/app/api/settings/route.js +1 -1
  285. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  286. package/.next-prod/server/app/api/shutdown/route.js +1 -1
  287. package/.next-prod/server/app/api/shutdown/route.js.nft.json +1 -1
  288. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  289. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  290. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  291. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  292. package/.next-prod/server/app/api/skills/route.js +1 -1
  293. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  294. package/.next-prod/server/app/api/snapshots/blob/route.js +1 -0
  295. package/.next-prod/server/app/api/snapshots/blob/route.js.nft.json +1 -0
  296. package/.next-prod/server/app/api/snapshots/blob/route_client-reference-manifest.js +1 -0
  297. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  298. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  299. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  300. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  301. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  302. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  303. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  304. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  305. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  306. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  307. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  308. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  309. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  310. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  311. package/.next-prod/server/app/api/update/route.js +1 -1
  312. package/.next-prod/server/app/api/update/route.js.nft.json +1 -1
  313. package/.next-prod/server/app/api/update-state/route.js +1 -1
  314. package/.next-prod/server/app/api/update-state/route.js.nft.json +1 -1
  315. package/.next-prod/server/app/api/version/route.js +1 -1
  316. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  317. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  318. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  319. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  320. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  321. package/.next-prod/server/app/m/page.js +1 -1
  322. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  323. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  324. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  325. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  326. package/.next-prod/server/app/page.js +1 -1
  327. package/.next-prod/server/app/page.js.nft.json +1 -1
  328. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  329. package/.next-prod/server/app/project/page.js +1 -1
  330. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  331. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  332. package/.next-prod/server/app/review/[id]/page.js +1 -1
  333. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  334. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  335. package/.next-prod/server/app-paths-manifest.json +4 -3
  336. package/.next-prod/server/chunks/2493.js +3 -3
  337. package/.next-prod/server/chunks/3286.js +3 -3
  338. package/.next-prod/server/chunks/{3641.js → 3583.js} +1 -1
  339. package/.next-prod/server/chunks/4949.js +1 -0
  340. package/.next-prod/server/chunks/516.js +1 -1
  341. package/.next-prod/server/chunks/5750.js +14 -14
  342. package/.next-prod/server/chunks/6548.js +1 -1
  343. package/.next-prod/server/chunks/7184.js +4 -4
  344. package/.next-prod/server/chunks/816.js +1 -1
  345. package/.next-prod/server/chunks/9312.js +1 -1
  346. package/.next-prod/server/chunks/9352.js +1 -1
  347. package/.next-prod/server/chunks/9830.js +1 -1
  348. package/.next-prod/server/middleware-build-manifest.js +1 -1
  349. package/.next-prod/server/pages/404.html +2 -2
  350. package/.next-prod/server/pages/500.html +1 -1
  351. package/.next-prod/server/server-reference-manifest.json +1 -1
  352. package/.next-prod/static/MM6vZhLQFwtUo_vz7BSfe/_buildManifest.js +1 -0
  353. package/.next-prod/static/chunks/33372-a2d65ba0d112fc24.js +35 -0
  354. package/.next-prod/static/chunks/46784-24ed72109d7c318b.js +716 -0
  355. package/.next-prod/static/chunks/{5504-583edbefcb22ed17.js → 87834-dfec736663e6aac2.js} +2 -2
  356. package/.next-prod/static/chunks/96911-08609dc685108dcc.js +15 -0
  357. package/.next-prod/static/chunks/app/_global-error/{page-c1a2c7e62ce669f7.js → page-db8b43ac5e6e9ac5.js} +1 -1
  358. package/.next-prod/static/chunks/app/api/agent/test/{route-c1a2c7e62ce669f7.js → route-db8b43ac5e6e9ac5.js} +1 -1
  359. package/.next-prod/static/chunks/app/api/bash/{route-c1a2c7e62ce669f7.js → route-db8b43ac5e6e9ac5.js} +1 -1
  360. package/.next-prod/static/chunks/app/api/chat/codex/{route-c1a2c7e62ce669f7.js → route-db8b43ac5e6e9ac5.js} +1 -1
  361. package/.next-prod/static/chunks/app/api/chat/deepseek/route-db8b43ac5e6e9ac5.js +1 -0
  362. package/.next-prod/static/chunks/app/api/chat/glm/route-db8b43ac5e6e9ac5.js +1 -0
  363. package/.next-prod/static/chunks/app/api/chat/kimi/route-db8b43ac5e6e9ac5.js +1 -0
  364. package/.next-prod/static/chunks/app/api/chat/ollama/route-db8b43ac5e6e9ac5.js +1 -0
  365. package/.next-prod/static/chunks/app/api/chat/route-db8b43ac5e6e9ac5.js +1 -0
  366. package/.next-prod/static/chunks/app/api/chat/stop/route-db8b43ac5e6e9ac5.js +1 -0
  367. package/.next-prod/static/chunks/app/api/claude-stats/route-db8b43ac5e6e9ac5.js +1 -0
  368. package/.next-prod/static/chunks/app/api/commands/route-db8b43ac5e6e9ac5.js +1 -0
  369. package/.next-prod/static/chunks/app/api/comments/route-db8b43ac5e6e9ac5.js +1 -0
  370. package/.next-prod/static/chunks/app/api/db/columns/route-db8b43ac5e6e9ac5.js +1 -0
  371. package/.next-prod/static/chunks/app/api/db/connect/route-db8b43ac5e6e9ac5.js +1 -0
  372. package/.next-prod/static/chunks/app/api/db/disconnect/route-db8b43ac5e6e9ac5.js +1 -0
  373. package/.next-prod/static/chunks/app/api/db/export/route-db8b43ac5e6e9ac5.js +1 -0
  374. package/.next-prod/static/chunks/app/api/db/query/route-db8b43ac5e6e9ac5.js +1 -0
  375. package/.next-prod/static/chunks/app/api/db/schemas/route-db8b43ac5e6e9ac5.js +1 -0
  376. package/.next-prod/static/chunks/app/api/deepseek/balance/route-db8b43ac5e6e9ac5.js +1 -0
  377. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-db8b43ac5e6e9ac5.js +1 -0
  378. package/.next-prod/static/chunks/app/api/deepseek/models/route-db8b43ac5e6e9ac5.js +1 -0
  379. package/.next-prod/static/chunks/app/api/dev/spans/route-db8b43ac5e6e9ac5.js +1 -0
  380. package/.next-prod/static/chunks/app/api/extension/version/route-db8b43ac5e6e9ac5.js +1 -0
  381. package/.next-prod/static/chunks/app/api/file/route-db8b43ac5e6e9ac5.js +1 -0
  382. package/.next-prod/static/chunks/app/api/files/blame/route-db8b43ac5e6e9ac5.js +1 -0
  383. package/.next-prod/static/chunks/app/api/files/clipboard/route-db8b43ac5e6e9ac5.js +1 -0
  384. package/.next-prod/static/chunks/app/api/files/copy/route-db8b43ac5e6e9ac5.js +1 -0
  385. package/.next-prod/static/chunks/app/api/files/delete/route-db8b43ac5e6e9ac5.js +1 -0
  386. package/.next-prod/static/chunks/app/api/files/expanded/route-db8b43ac5e6e9ac5.js +1 -0
  387. package/.next-prod/static/chunks/app/api/files/index/route-db8b43ac5e6e9ac5.js +1 -0
  388. package/.next-prod/static/chunks/app/api/files/init/route-db8b43ac5e6e9ac5.js +1 -0
  389. package/.next-prod/static/chunks/app/api/files/paste/route-db8b43ac5e6e9ac5.js +1 -0
  390. package/.next-prod/static/chunks/app/api/files/read/route-db8b43ac5e6e9ac5.js +1 -0
  391. package/.next-prod/static/chunks/app/api/files/readdir/route-db8b43ac5e6e9ac5.js +1 -0
  392. package/.next-prod/static/chunks/app/api/files/recent/route-db8b43ac5e6e9ac5.js +1 -0
  393. package/.next-prod/static/chunks/app/api/files/save/route-db8b43ac5e6e9ac5.js +1 -0
  394. package/.next-prod/static/chunks/app/api/files/search/route-db8b43ac5e6e9ac5.js +1 -0
  395. package/.next-prod/static/chunks/app/api/files/stat/route-db8b43ac5e6e9ac5.js +1 -0
  396. package/.next-prod/static/chunks/app/api/files/text/route-db8b43ac5e6e9ac5.js +1 -0
  397. package/.next-prod/static/chunks/app/api/git/blob/route-db8b43ac5e6e9ac5.js +1 -0
  398. package/.next-prod/static/chunks/app/api/git/branch-diff/route-db8b43ac5e6e9ac5.js +1 -0
  399. package/.next-prod/static/chunks/app/api/git/branches/route-db8b43ac5e6e9ac5.js +1 -0
  400. package/.next-prod/static/chunks/app/api/git/commit-diff/route-db8b43ac5e6e9ac5.js +1 -0
  401. package/.next-prod/static/chunks/app/api/git/commits/route-db8b43ac5e6e9ac5.js +1 -0
  402. package/.next-prod/static/chunks/app/api/git/current-branch/route-db8b43ac5e6e9ac5.js +1 -0
  403. package/.next-prod/static/chunks/app/api/git/diff/route-db8b43ac5e6e9ac5.js +1 -0
  404. package/.next-prod/static/chunks/app/api/git/discard/route-db8b43ac5e6e9ac5.js +1 -0
  405. package/.next-prod/static/chunks/app/api/git/stage/route-db8b43ac5e6e9ac5.js +1 -0
  406. package/.next-prod/static/chunks/app/api/git/status/route-db8b43ac5e6e9ac5.js +1 -0
  407. package/.next-prod/static/chunks/app/api/git/unstage/route-db8b43ac5e6e9ac5.js +1 -0
  408. package/.next-prod/static/chunks/app/api/git/worktree/route-db8b43ac5e6e9ac5.js +1 -0
  409. package/.next-prod/static/chunks/app/api/glm/credentials/route-db8b43ac5e6e9ac5.js +1 -0
  410. package/.next-prod/static/chunks/app/api/glm/models/route-db8b43ac5e6e9ac5.js +1 -0
  411. package/.next-prod/static/chunks/app/api/glm/usage/route-db8b43ac5e6e9ac5.js +1 -0
  412. package/.next-prod/static/chunks/app/api/global-state/route-db8b43ac5e6e9ac5.js +1 -0
  413. package/.next-prod/static/chunks/app/api/health/route-db8b43ac5e6e9ac5.js +1 -0
  414. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-db8b43ac5e6e9ac5.js +1 -0
  415. package/.next-prod/static/chunks/app/api/html-apps/route-db8b43ac5e6e9ac5.js +1 -0
  416. package/.next-prod/static/chunks/app/api/jupyter/load/route-db8b43ac5e6e9ac5.js +1 -0
  417. package/.next-prod/static/chunks/app/api/jupyter/save/route-db8b43ac5e6e9ac5.js +1 -0
  418. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-db8b43ac5e6e9ac5.js +1 -0
  419. package/.next-prod/static/chunks/app/api/kimi/credentials/route-db8b43ac5e6e9ac5.js +1 -0
  420. package/.next-prod/static/chunks/app/api/kimi/models/route-db8b43ac5e6e9ac5.js +1 -0
  421. package/.next-prod/static/chunks/app/api/kimi/usage/route-db8b43ac5e6e9ac5.js +1 -0
  422. package/.next-prod/static/chunks/app/api/lsp/definition/route-db8b43ac5e6e9ac5.js +1 -0
  423. package/.next-prod/static/chunks/app/api/lsp/hover/route-db8b43ac5e6e9ac5.js +1 -0
  424. package/.next-prod/static/chunks/app/api/lsp/references/route-db8b43ac5e6e9ac5.js +1 -0
  425. package/.next-prod/static/chunks/app/api/lsp/status/route-db8b43ac5e6e9ac5.js +1 -0
  426. package/.next-prod/static/chunks/app/api/lsp/warmup/route-db8b43ac5e6e9ac5.js +1 -0
  427. package/.next-prod/static/chunks/app/api/mysql/columns/route-db8b43ac5e6e9ac5.js +1 -0
  428. package/.next-prod/static/chunks/app/api/mysql/connect/route-db8b43ac5e6e9ac5.js +1 -0
  429. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-db8b43ac5e6e9ac5.js +1 -0
  430. package/.next-prod/static/chunks/app/api/mysql/export/route-db8b43ac5e6e9ac5.js +1 -0
  431. package/.next-prod/static/chunks/app/api/mysql/query/route-db8b43ac5e6e9ac5.js +1 -0
  432. package/.next-prod/static/chunks/app/api/mysql/schemas/route-db8b43ac5e6e9ac5.js +1 -0
  433. package/.next-prod/static/chunks/app/api/neo4j/connect/route-db8b43ac5e6e9ac5.js +1 -0
  434. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-db8b43ac5e6e9ac5.js +1 -0
  435. package/.next-prod/static/chunks/app/api/neo4j/query/route-db8b43ac5e6e9ac5.js +1 -0
  436. package/.next-prod/static/chunks/app/api/neo4j/schema/route-db8b43ac5e6e9ac5.js +1 -0
  437. package/.next-prod/static/chunks/app/api/note/route-db8b43ac5e6e9ac5.js +1 -0
  438. package/.next-prod/static/chunks/app/api/ollama/config/route-db8b43ac5e6e9ac5.js +1 -0
  439. package/.next-prod/static/chunks/app/api/ollama/models/route-db8b43ac5e6e9ac5.js +1 -0
  440. package/.next-prod/static/chunks/app/api/ollama/start/route-db8b43ac5e6e9ac5.js +1 -0
  441. package/.next-prod/static/chunks/app/api/open-cursor/route-db8b43ac5e6e9ac5.js +1 -0
  442. package/.next-prod/static/chunks/app/api/open-vscode/route-db8b43ac5e6e9ac5.js +1 -0
  443. package/.next-prod/static/chunks/app/api/pick-folder/route-db8b43ac5e6e9ac5.js +1 -0
  444. package/.next-prod/static/chunks/app/api/pinned-sessions/route-db8b43ac5e6e9ac5.js +1 -0
  445. package/.next-prod/static/chunks/app/api/project-settings/route-db8b43ac5e6e9ac5.js +1 -0
  446. package/.next-prod/static/chunks/app/api/project-state/route-db8b43ac5e6e9ac5.js +1 -0
  447. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-db8b43ac5e6e9ac5.js +1 -0
  448. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-db8b43ac5e6e9ac5.js +1 -0
  449. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-db8b43ac5e6e9ac5.js +1 -0
  450. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-db8b43ac5e6e9ac5.js +1 -0
  451. package/.next-prod/static/chunks/app/api/projectGraph/context/route-db8b43ac5e6e9ac5.js +1 -0
  452. package/.next-prod/static/chunks/app/api/projectGraph/file/route-db8b43ac5e6e9ac5.js +1 -0
  453. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-db8b43ac5e6e9ac5.js +1 -0
  454. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-db8b43ac5e6e9ac5.js +1 -0
  455. package/.next-prod/static/chunks/app/api/projectGraph/related/route-db8b43ac5e6e9ac5.js +1 -0
  456. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-db8b43ac5e6e9ac5.js +1 -0
  457. package/.next-prod/static/chunks/app/api/projectGraph/search/route-db8b43ac5e6e9ac5.js +1 -0
  458. package/.next-prod/static/chunks/app/api/projects/route-db8b43ac5e6e9ac5.js +1 -0
  459. package/.next-prod/static/chunks/app/api/prompts/config/route-db8b43ac5e6e9ac5.js +1 -0
  460. package/.next-prod/static/chunks/app/api/push/public-key/route-db8b43ac5e6e9ac5.js +1 -0
  461. package/.next-prod/static/chunks/app/api/push/subscribe/route-db8b43ac5e6e9ac5.js +1 -0
  462. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-db8b43ac5e6e9ac5.js +1 -0
  463. package/.next-prod/static/chunks/app/api/redis/command/route-db8b43ac5e6e9ac5.js +1 -0
  464. package/.next-prod/static/chunks/app/api/redis/connect/route-db8b43ac5e6e9ac5.js +1 -0
  465. package/.next-prod/static/chunks/app/api/redis/delete/route-db8b43ac5e6e9ac5.js +1 -0
  466. package/.next-prod/static/chunks/app/api/redis/disconnect/route-db8b43ac5e6e9ac5.js +1 -0
  467. package/.next-prod/static/chunks/app/api/redis/get/route-db8b43ac5e6e9ac5.js +1 -0
  468. package/.next-prod/static/chunks/app/api/redis/keys/route-db8b43ac5e6e9ac5.js +1 -0
  469. package/.next-prod/static/chunks/app/api/redis/set/route-db8b43ac5e6e9ac5.js +1 -0
  470. package/.next-prod/static/chunks/app/api/restart/route-db8b43ac5e6e9ac5.js +1 -0
  471. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-db8b43ac5e6e9ac5.js +1 -0
  472. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-db8b43ac5e6e9ac5.js +1 -0
  473. package/.next-prod/static/chunks/app/api/review/[id]/route-db8b43ac5e6e9ac5.js +1 -0
  474. package/.next-prod/static/chunks/app/api/review/identify/route-db8b43ac5e6e9ac5.js +1 -0
  475. package/.next-prod/static/chunks/app/api/review/order/route-db8b43ac5e6e9ac5.js +1 -0
  476. package/.next-prod/static/chunks/app/api/review/route-db8b43ac5e6e9ac5.js +1 -0
  477. package/.next-prod/static/chunks/app/api/review/share-info/route-db8b43ac5e6e9ac5.js +1 -0
  478. package/.next-prod/static/chunks/app/api/review/users/route-db8b43ac5e6e9ac5.js +1 -0
  479. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-db8b43ac5e6e9ac5.js +1 -0
  480. package/.next-prod/static/chunks/app/api/services/config/route-db8b43ac5e6e9ac5.js +1 -0
  481. package/.next-prod/static/chunks/app/api/services/scripts/route-db8b43ac5e6e9ac5.js +1 -0
  482. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-db8b43ac5e6e9ac5.js +1 -0
  483. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-db8b43ac5e6e9ac5.js +1 -0
  484. package/.next-prod/static/chunks/app/api/session-by-path/route-db8b43ac5e6e9ac5.js +1 -0
  485. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-db8b43ac5e6e9ac5.js +1 -0
  486. package/.next-prod/static/chunks/app/api/sessions/projects/route-db8b43ac5e6e9ac5.js +1 -0
  487. package/.next-prod/static/chunks/app/api/sessions/route-db8b43ac5e6e9ac5.js +1 -0
  488. package/.next-prod/static/chunks/app/api/settings/route-db8b43ac5e6e9ac5.js +1 -0
  489. package/.next-prod/static/chunks/app/api/shutdown/route-db8b43ac5e6e9ac5.js +1 -0
  490. package/.next-prod/static/chunks/app/api/skills/[id]/route-db8b43ac5e6e9ac5.js +1 -0
  491. package/.next-prod/static/chunks/app/api/skills/content/route-db8b43ac5e6e9ac5.js +1 -0
  492. package/.next-prod/static/chunks/app/api/skills/route-db8b43ac5e6e9ac5.js +1 -0
  493. package/.next-prod/static/chunks/app/api/snapshots/blob/route-db8b43ac5e6e9ac5.js +1 -0
  494. package/.next-prod/static/chunks/app/api/snapshots/diff/route-db8b43ac5e6e9ac5.js +1 -0
  495. package/.next-prod/static/chunks/app/api/snapshots/route-db8b43ac5e6e9ac5.js +1 -0
  496. package/.next-prod/static/chunks/app/api/terminal/aliases/route-db8b43ac5e6e9ac5.js +1 -0
  497. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-db8b43ac5e6e9ac5.js +1 -0
  498. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-db8b43ac5e6e9ac5.js +1 -0
  499. package/.next-prod/static/chunks/app/api/terminal/env/route-db8b43ac5e6e9ac5.js +1 -0
  500. package/.next-prod/static/chunks/app/api/terminal/history/route-db8b43ac5e6e9ac5.js +1 -0
  501. package/.next-prod/static/chunks/app/api/update/route-db8b43ac5e6e9ac5.js +1 -0
  502. package/.next-prod/static/chunks/app/api/update-state/route-db8b43ac5e6e9ac5.js +1 -0
  503. package/.next-prod/static/chunks/app/api/version/route-db8b43ac5e6e9ac5.js +1 -0
  504. package/.next-prod/static/chunks/app/apps/[...path]/route-db8b43ac5e6e9ac5.js +1 -0
  505. package/.next-prod/static/chunks/app/{layout-60f41d682cd860e9.js → layout-9585d7901d2a6c15.js} +1 -1
  506. package/.next-prod/static/chunks/app/m/{page-7eabf179a8b13f49.js → page-69cf611ceae66f33.js} +1 -1
  507. package/.next-prod/static/chunks/app/manifest.webmanifest/route-db8b43ac5e6e9ac5.js +1 -0
  508. package/.next-prod/static/chunks/app/page-340e8a5ca67a0dad.js +1 -0
  509. package/.next-prod/static/chunks/app/project/page-340e8a5ca67a0dad.js +1 -0
  510. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-db8b43ac5e6e9ac5.js +1 -0
  511. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-db8b43ac5e6e9ac5.js +1 -0
  512. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-db8b43ac5e6e9ac5.js +1 -0
  513. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-db8b43ac5e6e9ac5.js +1 -0
  514. package/.next-prod/static/css/303e8ac791ff3d31.css +1 -0
  515. package/.next-prod/trace +15 -14
  516. package/.next-prod/trace-build +1 -1
  517. package/.next-prod/types/app/api/snapshots/blob/route.ts +353 -0
  518. package/.next-prod/types/routes.d.ts +2 -1
  519. package/.next-prod/types/validator.ts +9 -0
  520. package/bin/cock-service.mjs +10 -8
  521. package/bin/cock.mjs +8 -6
  522. package/bin/postinstall.mjs +9 -8
  523. package/bin/updater.mjs +64 -26
  524. package/dist/{chunk-FBAFMLUC.mjs → chunk-6EMR3NZV.mjs} +9 -5
  525. package/dist/{chunk-ZE2JXL6E.mjs → chunk-ETYX2YQF.mjs} +141 -59
  526. package/dist/{chunk-H6AI4XJC.mjs → chunk-SGUW2QJI.mjs} +1 -1
  527. package/dist/httpApi.mjs +2 -2
  528. package/dist/scheduledTasks.mjs +187 -37
  529. package/dist/{server-HRP33LCV.mjs → server-C6LPAKPM.mjs} +2 -2
  530. package/dist/wsServer.mjs +8 -4
  531. package/package.json +6 -5
  532. package/public/html-lib/json-viewer.js +12 -12
  533. package/scripts/agentBinaries.mjs +86 -0
  534. package/.next-prod/server/chunks/9281.js +0 -1
  535. package/.next-prod/static/YOIsQRqVhYPuRyXlhwhoY/_buildManifest.js +0 -1
  536. package/.next-prod/static/chunks/33940-9631b513c48757f4.js +0 -35
  537. package/.next-prod/static/chunks/46784-031e2d50dc5f9fba.js +0 -716
  538. package/.next-prod/static/chunks/72353-f1aaa693ddc49568.js +0 -15
  539. package/.next-prod/static/chunks/app/api/chat/deepseek/route-c1a2c7e62ce669f7.js +0 -1
  540. package/.next-prod/static/chunks/app/api/chat/glm/route-c1a2c7e62ce669f7.js +0 -1
  541. package/.next-prod/static/chunks/app/api/chat/kimi/route-c1a2c7e62ce669f7.js +0 -1
  542. package/.next-prod/static/chunks/app/api/chat/ollama/route-c1a2c7e62ce669f7.js +0 -1
  543. package/.next-prod/static/chunks/app/api/chat/route-c1a2c7e62ce669f7.js +0 -1
  544. package/.next-prod/static/chunks/app/api/chat/stop/route-c1a2c7e62ce669f7.js +0 -1
  545. package/.next-prod/static/chunks/app/api/claude-stats/route-c1a2c7e62ce669f7.js +0 -1
  546. package/.next-prod/static/chunks/app/api/commands/route-c1a2c7e62ce669f7.js +0 -1
  547. package/.next-prod/static/chunks/app/api/comments/route-c1a2c7e62ce669f7.js +0 -1
  548. package/.next-prod/static/chunks/app/api/db/columns/route-c1a2c7e62ce669f7.js +0 -1
  549. package/.next-prod/static/chunks/app/api/db/connect/route-c1a2c7e62ce669f7.js +0 -1
  550. package/.next-prod/static/chunks/app/api/db/disconnect/route-c1a2c7e62ce669f7.js +0 -1
  551. package/.next-prod/static/chunks/app/api/db/export/route-c1a2c7e62ce669f7.js +0 -1
  552. package/.next-prod/static/chunks/app/api/db/query/route-c1a2c7e62ce669f7.js +0 -1
  553. package/.next-prod/static/chunks/app/api/db/schemas/route-c1a2c7e62ce669f7.js +0 -1
  554. package/.next-prod/static/chunks/app/api/deepseek/balance/route-c1a2c7e62ce669f7.js +0 -1
  555. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-c1a2c7e62ce669f7.js +0 -1
  556. package/.next-prod/static/chunks/app/api/deepseek/models/route-c1a2c7e62ce669f7.js +0 -1
  557. package/.next-prod/static/chunks/app/api/dev/spans/route-c1a2c7e62ce669f7.js +0 -1
  558. package/.next-prod/static/chunks/app/api/extension/version/route-c1a2c7e62ce669f7.js +0 -1
  559. package/.next-prod/static/chunks/app/api/file/route-c1a2c7e62ce669f7.js +0 -1
  560. package/.next-prod/static/chunks/app/api/files/blame/route-c1a2c7e62ce669f7.js +0 -1
  561. package/.next-prod/static/chunks/app/api/files/clipboard/route-c1a2c7e62ce669f7.js +0 -1
  562. package/.next-prod/static/chunks/app/api/files/copy/route-c1a2c7e62ce669f7.js +0 -1
  563. package/.next-prod/static/chunks/app/api/files/delete/route-c1a2c7e62ce669f7.js +0 -1
  564. package/.next-prod/static/chunks/app/api/files/expanded/route-c1a2c7e62ce669f7.js +0 -1
  565. package/.next-prod/static/chunks/app/api/files/index/route-c1a2c7e62ce669f7.js +0 -1
  566. package/.next-prod/static/chunks/app/api/files/init/route-c1a2c7e62ce669f7.js +0 -1
  567. package/.next-prod/static/chunks/app/api/files/paste/route-c1a2c7e62ce669f7.js +0 -1
  568. package/.next-prod/static/chunks/app/api/files/read/route-c1a2c7e62ce669f7.js +0 -1
  569. package/.next-prod/static/chunks/app/api/files/readdir/route-c1a2c7e62ce669f7.js +0 -1
  570. package/.next-prod/static/chunks/app/api/files/recent/route-c1a2c7e62ce669f7.js +0 -1
  571. package/.next-prod/static/chunks/app/api/files/save/route-c1a2c7e62ce669f7.js +0 -1
  572. package/.next-prod/static/chunks/app/api/files/search/route-c1a2c7e62ce669f7.js +0 -1
  573. package/.next-prod/static/chunks/app/api/files/stat/route-c1a2c7e62ce669f7.js +0 -1
  574. package/.next-prod/static/chunks/app/api/files/text/route-c1a2c7e62ce669f7.js +0 -1
  575. package/.next-prod/static/chunks/app/api/git/blob/route-c1a2c7e62ce669f7.js +0 -1
  576. package/.next-prod/static/chunks/app/api/git/branch-diff/route-c1a2c7e62ce669f7.js +0 -1
  577. package/.next-prod/static/chunks/app/api/git/branches/route-c1a2c7e62ce669f7.js +0 -1
  578. package/.next-prod/static/chunks/app/api/git/commit-diff/route-c1a2c7e62ce669f7.js +0 -1
  579. package/.next-prod/static/chunks/app/api/git/commits/route-c1a2c7e62ce669f7.js +0 -1
  580. package/.next-prod/static/chunks/app/api/git/current-branch/route-c1a2c7e62ce669f7.js +0 -1
  581. package/.next-prod/static/chunks/app/api/git/diff/route-c1a2c7e62ce669f7.js +0 -1
  582. package/.next-prod/static/chunks/app/api/git/discard/route-c1a2c7e62ce669f7.js +0 -1
  583. package/.next-prod/static/chunks/app/api/git/stage/route-c1a2c7e62ce669f7.js +0 -1
  584. package/.next-prod/static/chunks/app/api/git/status/route-c1a2c7e62ce669f7.js +0 -1
  585. package/.next-prod/static/chunks/app/api/git/unstage/route-c1a2c7e62ce669f7.js +0 -1
  586. package/.next-prod/static/chunks/app/api/git/worktree/route-c1a2c7e62ce669f7.js +0 -1
  587. package/.next-prod/static/chunks/app/api/glm/credentials/route-c1a2c7e62ce669f7.js +0 -1
  588. package/.next-prod/static/chunks/app/api/glm/models/route-c1a2c7e62ce669f7.js +0 -1
  589. package/.next-prod/static/chunks/app/api/glm/usage/route-c1a2c7e62ce669f7.js +0 -1
  590. package/.next-prod/static/chunks/app/api/global-state/route-c1a2c7e62ce669f7.js +0 -1
  591. package/.next-prod/static/chunks/app/api/health/route-c1a2c7e62ce669f7.js +0 -1
  592. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-c1a2c7e62ce669f7.js +0 -1
  593. package/.next-prod/static/chunks/app/api/html-apps/route-c1a2c7e62ce669f7.js +0 -1
  594. package/.next-prod/static/chunks/app/api/jupyter/load/route-c1a2c7e62ce669f7.js +0 -1
  595. package/.next-prod/static/chunks/app/api/jupyter/save/route-c1a2c7e62ce669f7.js +0 -1
  596. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-c1a2c7e62ce669f7.js +0 -1
  597. package/.next-prod/static/chunks/app/api/kimi/credentials/route-c1a2c7e62ce669f7.js +0 -1
  598. package/.next-prod/static/chunks/app/api/kimi/models/route-c1a2c7e62ce669f7.js +0 -1
  599. package/.next-prod/static/chunks/app/api/kimi/usage/route-c1a2c7e62ce669f7.js +0 -1
  600. package/.next-prod/static/chunks/app/api/lsp/definition/route-c1a2c7e62ce669f7.js +0 -1
  601. package/.next-prod/static/chunks/app/api/lsp/hover/route-c1a2c7e62ce669f7.js +0 -1
  602. package/.next-prod/static/chunks/app/api/lsp/references/route-c1a2c7e62ce669f7.js +0 -1
  603. package/.next-prod/static/chunks/app/api/lsp/status/route-c1a2c7e62ce669f7.js +0 -1
  604. package/.next-prod/static/chunks/app/api/lsp/warmup/route-c1a2c7e62ce669f7.js +0 -1
  605. package/.next-prod/static/chunks/app/api/mysql/columns/route-c1a2c7e62ce669f7.js +0 -1
  606. package/.next-prod/static/chunks/app/api/mysql/connect/route-c1a2c7e62ce669f7.js +0 -1
  607. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-c1a2c7e62ce669f7.js +0 -1
  608. package/.next-prod/static/chunks/app/api/mysql/export/route-c1a2c7e62ce669f7.js +0 -1
  609. package/.next-prod/static/chunks/app/api/mysql/query/route-c1a2c7e62ce669f7.js +0 -1
  610. package/.next-prod/static/chunks/app/api/mysql/schemas/route-c1a2c7e62ce669f7.js +0 -1
  611. package/.next-prod/static/chunks/app/api/neo4j/connect/route-c1a2c7e62ce669f7.js +0 -1
  612. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-c1a2c7e62ce669f7.js +0 -1
  613. package/.next-prod/static/chunks/app/api/neo4j/query/route-c1a2c7e62ce669f7.js +0 -1
  614. package/.next-prod/static/chunks/app/api/neo4j/schema/route-c1a2c7e62ce669f7.js +0 -1
  615. package/.next-prod/static/chunks/app/api/note/route-c1a2c7e62ce669f7.js +0 -1
  616. package/.next-prod/static/chunks/app/api/ollama/config/route-c1a2c7e62ce669f7.js +0 -1
  617. package/.next-prod/static/chunks/app/api/ollama/models/route-c1a2c7e62ce669f7.js +0 -1
  618. package/.next-prod/static/chunks/app/api/ollama/start/route-c1a2c7e62ce669f7.js +0 -1
  619. package/.next-prod/static/chunks/app/api/open-cursor/route-c1a2c7e62ce669f7.js +0 -1
  620. package/.next-prod/static/chunks/app/api/open-vscode/route-c1a2c7e62ce669f7.js +0 -1
  621. package/.next-prod/static/chunks/app/api/pick-folder/route-c1a2c7e62ce669f7.js +0 -1
  622. package/.next-prod/static/chunks/app/api/pinned-sessions/route-c1a2c7e62ce669f7.js +0 -1
  623. package/.next-prod/static/chunks/app/api/project-settings/route-c1a2c7e62ce669f7.js +0 -1
  624. package/.next-prod/static/chunks/app/api/project-state/route-c1a2c7e62ce669f7.js +0 -1
  625. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-c1a2c7e62ce669f7.js +0 -1
  626. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-c1a2c7e62ce669f7.js +0 -1
  627. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-c1a2c7e62ce669f7.js +0 -1
  628. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-c1a2c7e62ce669f7.js +0 -1
  629. package/.next-prod/static/chunks/app/api/projectGraph/context/route-c1a2c7e62ce669f7.js +0 -1
  630. package/.next-prod/static/chunks/app/api/projectGraph/file/route-c1a2c7e62ce669f7.js +0 -1
  631. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-c1a2c7e62ce669f7.js +0 -1
  632. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-c1a2c7e62ce669f7.js +0 -1
  633. package/.next-prod/static/chunks/app/api/projectGraph/related/route-c1a2c7e62ce669f7.js +0 -1
  634. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-c1a2c7e62ce669f7.js +0 -1
  635. package/.next-prod/static/chunks/app/api/projectGraph/search/route-c1a2c7e62ce669f7.js +0 -1
  636. package/.next-prod/static/chunks/app/api/projects/route-c1a2c7e62ce669f7.js +0 -1
  637. package/.next-prod/static/chunks/app/api/prompts/config/route-c1a2c7e62ce669f7.js +0 -1
  638. package/.next-prod/static/chunks/app/api/push/public-key/route-c1a2c7e62ce669f7.js +0 -1
  639. package/.next-prod/static/chunks/app/api/push/subscribe/route-c1a2c7e62ce669f7.js +0 -1
  640. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-c1a2c7e62ce669f7.js +0 -1
  641. package/.next-prod/static/chunks/app/api/redis/command/route-c1a2c7e62ce669f7.js +0 -1
  642. package/.next-prod/static/chunks/app/api/redis/connect/route-c1a2c7e62ce669f7.js +0 -1
  643. package/.next-prod/static/chunks/app/api/redis/delete/route-c1a2c7e62ce669f7.js +0 -1
  644. package/.next-prod/static/chunks/app/api/redis/disconnect/route-c1a2c7e62ce669f7.js +0 -1
  645. package/.next-prod/static/chunks/app/api/redis/get/route-c1a2c7e62ce669f7.js +0 -1
  646. package/.next-prod/static/chunks/app/api/redis/keys/route-c1a2c7e62ce669f7.js +0 -1
  647. package/.next-prod/static/chunks/app/api/redis/set/route-c1a2c7e62ce669f7.js +0 -1
  648. package/.next-prod/static/chunks/app/api/restart/route-c1a2c7e62ce669f7.js +0 -1
  649. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-c1a2c7e62ce669f7.js +0 -1
  650. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-c1a2c7e62ce669f7.js +0 -1
  651. package/.next-prod/static/chunks/app/api/review/[id]/route-c1a2c7e62ce669f7.js +0 -1
  652. package/.next-prod/static/chunks/app/api/review/identify/route-c1a2c7e62ce669f7.js +0 -1
  653. package/.next-prod/static/chunks/app/api/review/order/route-c1a2c7e62ce669f7.js +0 -1
  654. package/.next-prod/static/chunks/app/api/review/route-c1a2c7e62ce669f7.js +0 -1
  655. package/.next-prod/static/chunks/app/api/review/share-info/route-c1a2c7e62ce669f7.js +0 -1
  656. package/.next-prod/static/chunks/app/api/review/users/route-c1a2c7e62ce669f7.js +0 -1
  657. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-c1a2c7e62ce669f7.js +0 -1
  658. package/.next-prod/static/chunks/app/api/services/config/route-c1a2c7e62ce669f7.js +0 -1
  659. package/.next-prod/static/chunks/app/api/services/scripts/route-c1a2c7e62ce669f7.js +0 -1
  660. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-c1a2c7e62ce669f7.js +0 -1
  661. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-c1a2c7e62ce669f7.js +0 -1
  662. package/.next-prod/static/chunks/app/api/session-by-path/route-c1a2c7e62ce669f7.js +0 -1
  663. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-c1a2c7e62ce669f7.js +0 -1
  664. package/.next-prod/static/chunks/app/api/sessions/projects/route-c1a2c7e62ce669f7.js +0 -1
  665. package/.next-prod/static/chunks/app/api/sessions/route-c1a2c7e62ce669f7.js +0 -1
  666. package/.next-prod/static/chunks/app/api/settings/route-c1a2c7e62ce669f7.js +0 -1
  667. package/.next-prod/static/chunks/app/api/shutdown/route-c1a2c7e62ce669f7.js +0 -1
  668. package/.next-prod/static/chunks/app/api/skills/[id]/route-c1a2c7e62ce669f7.js +0 -1
  669. package/.next-prod/static/chunks/app/api/skills/content/route-c1a2c7e62ce669f7.js +0 -1
  670. package/.next-prod/static/chunks/app/api/skills/route-c1a2c7e62ce669f7.js +0 -1
  671. package/.next-prod/static/chunks/app/api/snapshots/diff/route-c1a2c7e62ce669f7.js +0 -1
  672. package/.next-prod/static/chunks/app/api/snapshots/route-c1a2c7e62ce669f7.js +0 -1
  673. package/.next-prod/static/chunks/app/api/terminal/aliases/route-c1a2c7e62ce669f7.js +0 -1
  674. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-c1a2c7e62ce669f7.js +0 -1
  675. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-c1a2c7e62ce669f7.js +0 -1
  676. package/.next-prod/static/chunks/app/api/terminal/env/route-c1a2c7e62ce669f7.js +0 -1
  677. package/.next-prod/static/chunks/app/api/terminal/history/route-c1a2c7e62ce669f7.js +0 -1
  678. package/.next-prod/static/chunks/app/api/update/route-c1a2c7e62ce669f7.js +0 -1
  679. package/.next-prod/static/chunks/app/api/update-state/route-c1a2c7e62ce669f7.js +0 -1
  680. package/.next-prod/static/chunks/app/api/version/route-c1a2c7e62ce669f7.js +0 -1
  681. package/.next-prod/static/chunks/app/apps/[...path]/route-c1a2c7e62ce669f7.js +0 -1
  682. package/.next-prod/static/chunks/app/manifest.webmanifest/route-c1a2c7e62ce669f7.js +0 -1
  683. package/.next-prod/static/chunks/app/page-e83cd7365efbf878.js +0 -1
  684. package/.next-prod/static/chunks/app/project/page-e83cd7365efbf878.js +0 -1
  685. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-c1a2c7e62ce669f7.js +0 -1
  686. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-c1a2c7e62ce669f7.js +0 -1
  687. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-c1a2c7e62ce669f7.js +0 -1
  688. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-c1a2c7e62ce669f7.js +0 -1
  689. package/.next-prod/static/css/45835d91c2519c62.css +0 -1
  690. package/scripts/claudeBinary.mjs +0 -38
  691. /package/.next-prod/static/{YOIsQRqVhYPuRyXlhwhoY → MM6vZhLQFwtUo_vz7BSfe}/_ssgManifest.js +0 -0
package/bin/updater.mjs CHANGED
@@ -18,7 +18,7 @@
18
18
  // losing the token would silently turn a tunnel-exposed instance into an open
19
19
  // one, so it must never be re-derived from defaults.
20
20
  import { spawn, spawnSync } from 'child_process';
21
- import { appendFileSync, existsSync, mkdirSync, openSync, readFileSync, writeFileSync } from 'fs';
21
+ import { appendFileSync, existsSync, mkdirSync, openSync, readdirSync, readFileSync, writeFileSync } from 'fs';
22
22
  import { createServer } from 'http';
23
23
  import { createRequire } from 'module';
24
24
  import { dirname, join } from 'path';
@@ -152,9 +152,9 @@ function pidAlive(pid) {
152
152
  }
153
153
 
154
154
  /**
155
- * Whether the Claude SDK's platform-specific native binary resolves.
155
+ * Which bundled agent CLIs are missing their platform-specific native binary.
156
156
  *
157
- * DUPLICATED from scripts/claudeBinary.mjs — change both together. This file
157
+ * DUPLICATED from scripts/agentBinaries.mjs — change both together. This file
158
158
  * cannot import it: it runs from <cockpitHome>/updater/ precisely because
159
159
  * `npm i -g` deletes the install directory mid-run (see the header).
160
160
  *
@@ -164,21 +164,50 @@ function pidAlive(pid) {
164
164
  * single time — which, given what the caller does about it, would mean
165
165
  * uninstalling and reinstalling cockpit on every update.
166
166
  */
167
- function hasClaudeBinary() {
167
+ function missingAgentBinaries() {
168
+ const missing = [];
169
+ let req;
168
170
  try {
169
- const req = createRequire(join(installRoot, 'package.json'));
170
- const base = `${process.platform}-${process.arch}`;
171
- // linux ships glibc and musl variants under distinct package names.
172
- const variants = process.platform === 'linux' ? [base, `${base}-musl`] : [base];
173
- for (const variant of variants) {
174
- try {
175
- const pkgJson = req.resolve(`@anthropic-ai/claude-agent-sdk-${variant}/package.json`);
176
- const bin = join(dirname(pkgJson), 'claude');
177
- if (existsSync(bin) || existsSync(`${bin}.exe`)) return true;
178
- } catch { /* this variant's sub-package isn't installed */ }
171
+ req = createRequire(join(installRoot, 'package.json'));
172
+ } catch {
173
+ // Install tree unreadable same answer as everything missing.
174
+ return ['Claude', 'Codex'];
175
+ }
176
+
177
+ const dirOf = (name) => {
178
+ try {
179
+ return dirname(req.resolve(`${name}/package.json`));
180
+ } catch {
181
+ return null;
179
182
  }
180
- } catch { /* install tree unreadable — same answer as missing */ }
181
- return false;
183
+ };
184
+
185
+ const base = `${process.platform}-${process.arch}`;
186
+ // linux ships glibc and musl variants of the Claude binary under distinct package names.
187
+ const claudeVariants = process.platform === 'linux' ? [base, `${base}-musl`] : [base];
188
+ const hasClaude = claudeVariants.some((variant) => {
189
+ const dir = dirOf(`@anthropic-ai/claude-agent-sdk-${variant}`);
190
+ if (!dir) return false;
191
+ const bin = join(dir, 'claude');
192
+ return existsSync(bin) || existsSync(`${bin}.exe`);
193
+ });
194
+ if (!hasClaude) missing.push('Claude');
195
+
196
+ // Codex nests its binary under a Rust target triple; scan vendor/ rather than
197
+ // reproducing codex-sdk's private platform->triple table. No musl split here.
198
+ let hasCodex = false;
199
+ const codexDir = dirOf(`@openai/codex-${base}`);
200
+ if (codexDir) {
201
+ try {
202
+ hasCodex = readdirSync(join(codexDir, 'vendor')).some((target) => {
203
+ const bin = join(codexDir, 'vendor', target, 'bin', 'codex');
204
+ return existsSync(bin) || existsSync(`${bin}.exe`);
205
+ });
206
+ } catch { /* no vendor dir — same answer as missing */ }
207
+ }
208
+ if (!hasCodex) missing.push('Codex');
209
+
210
+ return missing;
182
211
  }
183
212
 
184
213
  function readInstalledVersion() {
@@ -282,15 +311,19 @@ function startServer() {
282
311
  const MANUAL_FIX = `npm uninstall -g ${PKG} && npm install -g ${PKG}`;
283
312
 
284
313
  /**
285
- * Make sure the SDK's platform-specific native binary survived the install.
314
+ * Make sure the agents' platform-specific native binaries survived the install.
286
315
  *
287
- * It ships as an OPTIONAL dependency, and npm skips it often enough during an
316
+ * They ship as OPTIONAL dependencies, and npm skips them often enough during an
288
317
  * in-place `npm i -g` that cock-service.mjs guards the offline path the same
289
318
  * way. Nothing else notices: the install exits 0, the server comes back, and
290
319
  * chat dies at the first message with "Native CLI binary not found". This path
291
320
  * — the UI button — had no guard at all, so it reported "update complete" and
292
321
  * handed back a Cockpit that could not chat.
293
322
  *
323
+ * Codex fails more quietly than Claude: rather than throwing, its engine falls
324
+ * back to whatever `codex` is on PATH — an unpinned build the SDK was never
325
+ * paired with. That is why both are checked here, not just Claude.
326
+ *
294
327
  * Escalates deliberately. The clean uninstall is the only thing that reliably
295
328
  * makes npm refetch a skipped optional dep, but it DELETES a working install,
296
329
  * so it runs only after --force has failed. If the reinstall then fails we are
@@ -298,15 +331,16 @@ const MANUAL_FIX = `npm uninstall -g ${PKG} && npm install -g ${PKG}`;
298
331
  * resort — and why the status port matters here: with no server, that card is
299
332
  * the only channel left to tell the user what to run.
300
333
  */
301
- async function repairClaudeBinary() {
302
- if (hasClaudeBinary()) return { ok: true };
334
+ async function repairAgentBinaries() {
335
+ let missing = missingAgentBinaries();
336
+ if (!missing.length) return { ok: true };
303
337
 
304
- log('native claude binary missing after install — repairing');
338
+ log(`native ${missing.join(' and ')} binary missing after install — repairing`);
305
339
  writeState({ ...currentState, phase: 'repairing' });
306
340
 
307
341
  // Non-destructive first: --force re-reifies the tree without removing it.
308
342
  await runNpm(['install', '-g', `${PKG}@${target}`, '--include=optional', '--force']);
309
- if (hasClaudeBinary()) {
343
+ if (!missingAgentBinaries().length) {
310
344
  log('repaired with --force');
311
345
  return { ok: true };
312
346
  }
@@ -321,11 +355,15 @@ async function repairClaudeBinary() {
321
355
  }
322
356
  return { ok: false, reason: `reinstall failed: ${reinstall.reason}` };
323
357
  }
324
- if (hasClaudeBinary()) {
358
+ missing = missingAgentBinaries();
359
+ if (!missing.length) {
325
360
  log('repaired with uninstall + reinstall');
326
361
  return { ok: true };
327
362
  }
328
- return { ok: false, reason: 'the native Claude binary is still missing; chat will not work' };
363
+ return {
364
+ ok: false,
365
+ reason: `the native ${missing.join(' and ')} binary is still missing; ${missing.length > 1 ? 'those engines' : 'that engine'} will not work`,
366
+ };
329
367
  }
330
368
 
331
369
  async function main() {
@@ -403,8 +441,8 @@ async function main() {
403
441
  return;
404
442
  }
405
443
 
406
- // 3b. Installed — but not necessarily complete. See repairClaudeBinary.
407
- const repair = await repairClaudeBinary();
444
+ // 3b. Installed — but not necessarily complete. See repairAgentBinaries.
445
+ const repair = await repairAgentBinaries();
408
446
 
409
447
  const installed = readInstalledVersion();
410
448
  log(`installed version now: ${installed} (install took ${installMs}ms)`);
@@ -14,7 +14,7 @@ import {
14
14
  readJsonFile,
15
15
  withFileLock,
16
16
  writeJsonFile
17
- } from "./chunk-ZE2JXL6E.mjs";
17
+ } from "./chunk-ETYX2YQF.mjs";
18
18
 
19
19
  // packages/feature/agent/src/server/state/globalState.ts
20
20
  import { createReadStream, existsSync, statSync } from "fs";
@@ -166,7 +166,7 @@ function truncate(s) {
166
166
  const chars = [...s];
167
167
  return chars.length <= MAX_TEXT_LEN ? s : chars.slice(0, MAX_TEXT_LEN).join("") + "\u2026";
168
168
  }
169
- async function updateGlobalState(cwd, sessionId, status, title, lastUserMessage) {
169
+ async function updateGlobalState(cwd, sessionId, status, title, lastUserMessage, engine) {
170
170
  if (!existsSync(cwd)) {
171
171
  return;
172
172
  }
@@ -190,7 +190,10 @@ async function updateGlobalState(cwd, sessionId, status, title, lastUserMessage)
190
190
  lastActive: Date.now(),
191
191
  status,
192
192
  title: truncate(title || existing?.title),
193
- lastUserMessage: truncate(lastUserMessage || existing?.lastUserMessage)
193
+ lastUserMessage: truncate(lastUserMessage || existing?.lastUserMessage),
194
+ // Carried like title/lastUserMessage: status-only updates (the client's
195
+ // /api/global-state PATCH) pass no engine and must not erase it.
196
+ engine: engine || existing?.engine
194
197
  };
195
198
  if (existingIndex >= 0) {
196
199
  state.sessions[existingIndex] = newSession;
@@ -318,7 +321,7 @@ async function attachEngines(sessions) {
318
321
  };
319
322
  return Promise.all(
320
323
  sessions.map(async (session) => {
321
- const engine = (await enginesFor(session.cwd))[session.sessionId];
324
+ const engine = session.engine ?? (await enginesFor(session.cwd))[session.sessionId];
322
325
  return engine ? { ...session, engine } : session;
323
326
  })
324
327
  );
@@ -603,6 +606,7 @@ function startRun(key, cwd, promptText, runId) {
603
606
  seq: prevSeq,
604
607
  events: [],
605
608
  startedAt,
609
+ ...runId ? { runId } : {},
606
610
  updatedAt: startedAt
607
611
  });
608
612
  if (promptText) {
@@ -662,7 +666,7 @@ function markRunIdle(key, status = "idle") {
662
666
  function getRunSnapshot(key) {
663
667
  const r = registry.get(key);
664
668
  if (!r) return null;
665
- return { status: r.status, seq: r.seq, events: r.events.slice(), startedAt: r.startedAt, outputTokens: r.outputTokens };
669
+ return { status: r.status, seq: r.seq, events: r.events.slice(), startedAt: r.startedAt, runId: r.runId, outputTokens: r.outputTokens };
666
670
  }
667
671
  function isRunActive(key) {
668
672
  return registry.get(key)?.status === "running";
@@ -6812,67 +6812,67 @@ var Or = (self, that) => {
6812
6812
  });
6813
6813
  return error;
6814
6814
  };
6815
- var InvalidData = (path, message, options = {
6815
+ var InvalidData = (path2, message, options = {
6816
6816
  pathDelim: "."
6817
6817
  }) => {
6818
6818
  const error = Object.create(proto2);
6819
6819
  error._op = OP_INVALID_DATA;
6820
- error.path = path;
6820
+ error.path = path2;
6821
6821
  error.message = message;
6822
6822
  Object.defineProperty(error, "toString", {
6823
6823
  enumerable: false,
6824
6824
  value() {
6825
- const path2 = pipe(this.path, join(options.pathDelim));
6826
- return `(Invalid data at ${path2}: "${this.message}")`;
6825
+ const path3 = pipe(this.path, join(options.pathDelim));
6826
+ return `(Invalid data at ${path3}: "${this.message}")`;
6827
6827
  }
6828
6828
  });
6829
6829
  return error;
6830
6830
  };
6831
- var MissingData = (path, message, options = {
6831
+ var MissingData = (path2, message, options = {
6832
6832
  pathDelim: "."
6833
6833
  }) => {
6834
6834
  const error = Object.create(proto2);
6835
6835
  error._op = OP_MISSING_DATA;
6836
- error.path = path;
6836
+ error.path = path2;
6837
6837
  error.message = message;
6838
6838
  Object.defineProperty(error, "toString", {
6839
6839
  enumerable: false,
6840
6840
  value() {
6841
- const path2 = pipe(this.path, join(options.pathDelim));
6842
- return `(Missing data at ${path2}: "${this.message}")`;
6841
+ const path3 = pipe(this.path, join(options.pathDelim));
6842
+ return `(Missing data at ${path3}: "${this.message}")`;
6843
6843
  }
6844
6844
  });
6845
6845
  return error;
6846
6846
  };
6847
- var SourceUnavailable = (path, message, cause3, options = {
6847
+ var SourceUnavailable = (path2, message, cause3, options = {
6848
6848
  pathDelim: "."
6849
6849
  }) => {
6850
6850
  const error = Object.create(proto2);
6851
6851
  error._op = OP_SOURCE_UNAVAILABLE;
6852
- error.path = path;
6852
+ error.path = path2;
6853
6853
  error.message = message;
6854
6854
  error.cause = cause3;
6855
6855
  Object.defineProperty(error, "toString", {
6856
6856
  enumerable: false,
6857
6857
  value() {
6858
- const path2 = pipe(this.path, join(options.pathDelim));
6859
- return `(Source unavailable at ${path2}: "${this.message}")`;
6858
+ const path3 = pipe(this.path, join(options.pathDelim));
6859
+ return `(Source unavailable at ${path3}: "${this.message}")`;
6860
6860
  }
6861
6861
  });
6862
6862
  return error;
6863
6863
  };
6864
- var Unsupported = (path, message, options = {
6864
+ var Unsupported = (path2, message, options = {
6865
6865
  pathDelim: "."
6866
6866
  }) => {
6867
6867
  const error = Object.create(proto2);
6868
6868
  error._op = OP_UNSUPPORTED;
6869
- error.path = path;
6869
+ error.path = path2;
6870
6870
  error.message = message;
6871
6871
  Object.defineProperty(error, "toString", {
6872
6872
  enumerable: false,
6873
6873
  value() {
6874
- const path2 = pipe(this.path, join(options.pathDelim));
6875
- return `(Unsupported operation at ${path2}: "${this.message}")`;
6874
+ const path3 = pipe(this.path, join(options.pathDelim));
6875
+ return `(Unsupported operation at ${path3}: "${this.message}")`;
6876
6876
  }
6877
6877
  });
6878
6878
  return error;
@@ -6987,9 +6987,9 @@ var isMissingDataOnly = (self) => reduceWithContext2(self, void 0, IsMissingData
6987
6987
  var empty17 = {
6988
6988
  _tag: "Empty"
6989
6989
  };
6990
- var patch5 = /* @__PURE__ */ dual(2, (path, patch9) => {
6990
+ var patch5 = /* @__PURE__ */ dual(2, (path2, patch9) => {
6991
6991
  let input = of3(patch9);
6992
- let output = path;
6992
+ let output = path2;
6993
6993
  while (isCons(input)) {
6994
6994
  const patch10 = input.head;
6995
6995
  switch (patch10._tag) {
@@ -7056,7 +7056,7 @@ var make20 = (options) => ({
7056
7056
  var makeFlat = (options) => ({
7057
7057
  [FlatConfigProviderTypeId]: FlatConfigProviderTypeId,
7058
7058
  patch: options.patch,
7059
- load: (path, config2, split3 = true) => options.load(path, config2, split3),
7059
+ load: (path2, config2, split3 = true) => options.load(path2, config2, split3),
7060
7060
  enumerateChildren: options.enumerateChildren
7061
7061
  });
7062
7062
  var fromFlat = (flat) => make20({
@@ -7074,29 +7074,29 @@ var fromEnv = (options) => {
7074
7074
  pathDelim: "_",
7075
7075
  seqDelim: ","
7076
7076
  }, options);
7077
- const makePathString = (path) => pipe(path, join(pathDelim));
7077
+ const makePathString = (path2) => pipe(path2, join(pathDelim));
7078
7078
  const unmakePathString = (pathString) => pathString.split(pathDelim);
7079
7079
  const getEnv = () => typeof process !== "undefined" && "env" in process && typeof process.env === "object" ? process.env : {};
7080
- const load = (path, primitive3, split3 = true) => {
7081
- const pathString = makePathString(path);
7080
+ const load = (path2, primitive3, split3 = true) => {
7081
+ const pathString = makePathString(path2);
7082
7082
  const current2 = getEnv();
7083
7083
  const valueOpt = pathString in current2 ? some2(current2[pathString]) : none2();
7084
- return pipe(valueOpt, mapError(() => MissingData(path, `Expected ${pathString} to exist in the process context`)), flatMap8((value) => parsePrimitive(value, path, primitive3, seqDelim, split3)));
7084
+ return pipe(valueOpt, mapError(() => MissingData(path2, `Expected ${pathString} to exist in the process context`)), flatMap8((value) => parsePrimitive(value, path2, primitive3, seqDelim, split3)));
7085
7085
  };
7086
- const enumerateChildren = (path) => sync(() => {
7086
+ const enumerateChildren = (path2) => sync(() => {
7087
7087
  const current2 = getEnv();
7088
7088
  const keys5 = Object.keys(current2);
7089
7089
  const keyPaths = keys5.map((value) => unmakePathString(value.toUpperCase()));
7090
7090
  const filteredKeyPaths = keyPaths.filter((keyPath) => {
7091
- for (let i = 0; i < path.length; i++) {
7092
- const pathComponent = pipe(path, unsafeGet(i));
7091
+ for (let i = 0; i < path2.length; i++) {
7092
+ const pathComponent = pipe(path2, unsafeGet(i));
7093
7093
  const currentElement = keyPath[i];
7094
7094
  if (currentElement === void 0 || pathComponent !== currentElement) {
7095
7095
  return false;
7096
7096
  }
7097
7097
  }
7098
7098
  return true;
7099
- }).flatMap((keyPath) => keyPath.slice(path.length, path.length + 1));
7099
+ }).flatMap((keyPath) => keyPath.slice(path2.length, path2.length + 1));
7100
7100
  return fromIterable6(filteredKeyPaths);
7101
7101
  });
7102
7102
  return fromFlat(makeFlat({
@@ -7112,17 +7112,17 @@ var extend = (leftDef, rightDef, left3, right3) => {
7112
7112
  const rightExtension = concat(right3, rightPad);
7113
7113
  return [leftExtension, rightExtension];
7114
7114
  };
7115
- var appendConfigPath = (path, config2) => {
7115
+ var appendConfigPath = (path2, config2) => {
7116
7116
  let op = config2;
7117
7117
  if (op._tag === "Nested") {
7118
- const out = path.slice();
7118
+ const out = path2.slice();
7119
7119
  while (op._tag === "Nested") {
7120
7120
  out.push(op.name);
7121
7121
  op = op.config;
7122
7122
  }
7123
7123
  return out;
7124
7124
  }
7125
- return path;
7125
+ return path2;
7126
7126
  };
7127
7127
  var fromFlatLoop = (flat, prefix, config2, split3) => {
7128
7128
  const op = config2;
@@ -7198,8 +7198,8 @@ var fromFlatLoop = (flat, prefix, config2, split3) => {
7198
7198
  return fail2(right3.left);
7199
7199
  }
7200
7200
  if (isRight2(left3) && isRight2(right3)) {
7201
- const path = pipe(prefix, join("."));
7202
- const fail20 = fromFlatLoopFail(prefix, path);
7201
+ const path2 = pipe(prefix, join("."));
7202
+ const fail20 = fromFlatLoopFail(prefix, path2);
7203
7203
  const [lefts, rights] = extend(fail20, fail20, pipe(left3.right, map3(right2)), pipe(right3.right, map3(right2)));
7204
7204
  return pipe(lefts, zip(rights), forEachSequential(([left4, right4]) => pipe(zip2(left4, right4), map10(([left5, right5]) => op.zip(left5, right5)))));
7205
7205
  }
@@ -7208,19 +7208,19 @@ var fromFlatLoop = (flat, prefix, config2, split3) => {
7208
7208
  }
7209
7209
  }
7210
7210
  };
7211
- var fromFlatLoopFail = (prefix, path) => (index) => left2(MissingData(prefix, `The element at index ${index} in a sequence at path "${path}" was missing`));
7211
+ var fromFlatLoopFail = (prefix, path2) => (index) => left2(MissingData(prefix, `The element at index ${index} in a sequence at path "${path2}" was missing`));
7212
7212
  var splitPathString = (text, delim) => {
7213
7213
  const split3 = text.split(new RegExp(`\\s*${escape(delim)}\\s*`));
7214
7214
  return split3;
7215
7215
  };
7216
- var parsePrimitive = (text, path, primitive3, delimiter, split3) => {
7216
+ var parsePrimitive = (text, path2, primitive3, delimiter, split3) => {
7217
7217
  if (!split3) {
7218
7218
  return pipe(primitive3.parse(text), mapBoth({
7219
- onFailure: prefixed(path),
7219
+ onFailure: prefixed(path2),
7220
7220
  onSuccess: of
7221
7221
  }));
7222
7222
  }
7223
- return pipe(splitPathString(text, delimiter), forEachSequential((char) => primitive3.parse(char.trim())), mapError(prefixed(path)));
7223
+ return pipe(splitPathString(text, delimiter), forEachSequential((char) => primitive3.parse(char.trim())), mapError(prefixed(path2)));
7224
7224
  };
7225
7225
  var transpose = (array6) => {
7226
7226
  return Object.keys(array6[0]).map((column) => array6.map((row) => row[column]));
@@ -28601,10 +28601,10 @@ function serializeValue(val) {
28601
28601
  };
28602
28602
  }
28603
28603
  if (val && typeof val === "object" && "segments" in val) {
28604
- const path = val;
28604
+ const path2 = val;
28605
28605
  return {
28606
28606
  _type: "path",
28607
- segments: path.segments.map((s) => ({
28607
+ segments: path2.segments.map((s) => ({
28608
28608
  start: serializeValue(s.start),
28609
28609
  relationship: serializeValue(s.relationship),
28610
28610
  end: serializeValue(s.end)
@@ -28629,14 +28629,14 @@ import { execSync } from "child_process";
28629
28629
 
28630
28630
  // packages/shared/utils/src/encodePath.ts
28631
28631
  var CLAUDE_ENCODED_MAX_LEN = 200;
28632
- function claudePathHash(path) {
28632
+ function claudePathHash(path2) {
28633
28633
  let h = 0;
28634
- for (let i = 0; i < path.length; i++) h = (h << 5) - h + path.charCodeAt(i) | 0;
28634
+ for (let i = 0; i < path2.length; i++) h = (h << 5) - h + path2.charCodeAt(i) | 0;
28635
28635
  return Math.abs(h).toString(36);
28636
28636
  }
28637
- function encodePath(path) {
28638
- const encoded = path.replace(/[^a-zA-Z0-9]/g, "-");
28639
- return encoded.length <= CLAUDE_ENCODED_MAX_LEN ? encoded : `${encoded.slice(0, CLAUDE_ENCODED_MAX_LEN)}-${claudePathHash(path)}`;
28637
+ function encodePath(path2) {
28638
+ const encoded = path2.replace(/[^a-zA-Z0-9]/g, "-");
28639
+ return encoded.length <= CLAUDE_ENCODED_MAX_LEN ? encoded : `${encoded.slice(0, CLAUDE_ENCODED_MAX_LEN)}-${claudePathHash(path2)}`;
28640
28640
  }
28641
28641
 
28642
28642
  // packages/shared/utils/src/paths.ts
@@ -29976,6 +29976,28 @@ import { execFile } from "child_process";
29976
29976
  import { createHash } from "crypto";
29977
29977
  import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2, readdir, rm, stat, rename } from "fs/promises";
29978
29978
  import { basename, join as join5, isAbsolute, relative, sep } from "path";
29979
+
29980
+ // packages/feature/explorer/src/server/files/shared.ts
29981
+ import path from "path";
29982
+ var MAX_TEXT_SIZE = 10 * 1024 * 1024;
29983
+ var MAX_IMAGE_SIZE = 50 * 1024 * 1024;
29984
+ var MAX_PDF_SIZE = 100 * 1024 * 1024;
29985
+ var IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
29986
+ ".png",
29987
+ ".jpg",
29988
+ ".jpeg",
29989
+ ".gif",
29990
+ ".webp",
29991
+ ".svg",
29992
+ ".ico",
29993
+ ".bmp",
29994
+ ".avif"
29995
+ ]);
29996
+ function isImagePath(filePath) {
29997
+ return IMAGE_EXTENSIONS.has(path.extname(filePath).toLowerCase());
29998
+ }
29999
+
30000
+ // packages/feature/agent/src/effect/snapshotLive.ts
29979
30001
  var BUILTIN_EXCLUDES = [
29980
30002
  ".git/",
29981
30003
  "node_modules/",
@@ -30052,6 +30074,7 @@ var commitFromLogRecord = (record) => {
30052
30074
  timestamp: Number(ts) || 0,
30053
30075
  subject: body.split("\n")[0] ?? "",
30054
30076
  sessionKey: trailers["Session"] ?? null,
30077
+ runId: trailers["Run-Id"] ?? null,
30055
30078
  toolId: trailers["Tool-Id"] ?? null,
30056
30079
  toolName: trailers["Tool"] ?? null,
30057
30080
  toolFiles,
@@ -30227,12 +30250,17 @@ Cockpit-Kind: baseline`
30227
30250
  yield* runGitOk(repoDir, cwd, ["symbolic-ref", "HEAD", branch]);
30228
30251
  });
30229
30252
  var sanitizeSubject = (s) => s.replace(/[\u0000-\u001f\u007f]+/g, " ").replace(/\s+/g, " ").trim().slice(0, 80);
30253
+ var sanitizeTrailerValue = (s) => s.replace(/[\u0000-\u001f\u007f]+/g, " ").trim().slice(0, 128);
30230
30254
  var buildCommitMessage = (trigger, relFiles, kind) => {
30231
30255
  const detail = relFiles.length > 0 ? relFiles.length === 1 ? relFiles[0] : `${relFiles[0]} +${relFiles.length - 1}` : trigger.toolDetail ?? "";
30232
30256
  const subject = kind === "baseline" ? "baseline" : sanitizeSubject(`[${trigger.toolName ?? "tool"}] ${detail}`);
30233
30257
  const trailers = [
30234
30258
  `Cockpit-Kind: ${kind}`,
30235
30259
  `Cockpit-Session: ${trigger.sessionKey}`,
30260
+ // Scopes the tool id to ONE dispatch. Required because codex restarts its
30261
+ // live `item_N` counter every turn, so the tool id alone (and even
30262
+ // tool id + session) matches earlier turns of the same session.
30263
+ ...trigger.runId ? [`Cockpit-Run-Id: ${sanitizeTrailerValue(trigger.runId)}`] : [],
30236
30264
  `Cockpit-Provider: ${trigger.provider}`,
30237
30265
  ...trigger.toolId ? [`Cockpit-Tool-Id: ${trigger.toolId}`] : [],
30238
30266
  ...trigger.toolName ? [`Cockpit-Tool: ${trigger.toolName}`] : [],
@@ -30279,10 +30307,10 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
30279
30307
  const addPaths = [];
30280
30308
  const rmPaths = [];
30281
30309
  for (const e of entries2) {
30282
- const path = e.slice(3);
30283
- if (!path) continue;
30284
- if (e[0] === "D" || e[1] === "D") rmPaths.push(path);
30285
- else addPaths.push(path);
30310
+ const path2 = e.slice(3);
30311
+ if (!path2) continue;
30312
+ if (e[0] === "D" || e[1] === "D") rmPaths.push(path2);
30313
+ else addPaths.push(path2);
30286
30314
  }
30287
30315
  const sizes = yield* Effect_exports.all(
30288
30316
  addPaths.map(
@@ -30363,7 +30391,7 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
30363
30391
  attributes: { cwd: trigger.cwd, tool: trigger.toolName ?? kind }
30364
30392
  })
30365
30393
  );
30366
- var listByToolIdsImpl = (snapshotsRoot, cwd, toolIds, sessionKey) => Effect_exports.gen(function* () {
30394
+ var listByToolIdsImpl = (snapshotsRoot, cwd, toolIds, sessionKey, runId) => Effect_exports.gen(function* () {
30367
30395
  if (toolIds.length === 0) return [];
30368
30396
  const repoDir = yield* resolveRepoDir(snapshotsRoot, cwd);
30369
30397
  const headExists = yield* fsTry(
@@ -30381,13 +30409,57 @@ var listByToolIdsImpl = (snapshotsRoot, cwd, toolIds, sessionKey) => Effect_expo
30381
30409
  if (log3.code !== 0) return [];
30382
30410
  const wanted = new Set(toolIds);
30383
30411
  return log3.stdout.split("").filter(Boolean).map(commitFromLogRecord).filter(
30384
- (c) => !!c && !!c.toolId && wanted.has(c.toolId) && (!sessionKey || c.sessionKey === sessionKey)
30412
+ (c) => !!c && !!c.toolId && wanted.has(c.toolId) && (!sessionKey || c.sessionKey === sessionKey) && // Run-scoping EXCLUDES, it does not require: a commit with no
30413
+ // Cockpit-Run-Id predates run-scoping, and dropping it would make
30414
+ // existing history disappear from the diff viewer. Only a commit
30415
+ // that names a DIFFERENT run is a proven foreign match.
30416
+ (!runId || !c.runId || c.runId === runId)
30385
30417
  );
30386
30418
  }).pipe(Effect_exports.withSpan("snapshot.listByToolIds", { attributes: { cwd } }));
30387
- var showFile = (repoDir, cwd, rev, path) => runGit(repoDir, cwd, ["show", `${rev}:${path}`]).pipe(
30419
+ var showFile = (repoDir, cwd, rev, path2) => runGit(repoDir, cwd, ["show", `${rev}:${path2}`]).pipe(
30388
30420
  Effect_exports.map((r) => r.code === 0 ? r.stdout : null),
30389
30421
  Effect_exports.orElseSucceed(() => null)
30390
30422
  );
30423
+ var gitShowBytes = (repoDir, cwd, rev, path2) => Effect_exports.tryPromise({
30424
+ try: () => new Promise((resolve2, reject) => {
30425
+ execFile(
30426
+ "git",
30427
+ ["show", `${rev}:${path2}`],
30428
+ {
30429
+ env: {
30430
+ ...process.env,
30431
+ GIT_DIR: repoDir,
30432
+ GIT_WORK_TREE: cwd,
30433
+ GIT_TERMINAL_PROMPT: "0",
30434
+ LC_ALL: "C",
30435
+ GIT_INDEX_FILE: join5(repoDir, "index")
30436
+ },
30437
+ cwd,
30438
+ // Over-cap images fail the exec (maxBuffer) → 404 → the client's
30439
+ // per-side "image failed to load" state.
30440
+ maxBuffer: MAX_IMAGE_SIZE,
30441
+ encoding: "buffer"
30442
+ },
30443
+ (err, stdout) => err ? reject(err) : resolve2(stdout)
30444
+ );
30445
+ }),
30446
+ // A miss is ordinary: the path simply doesn't exist at that revision.
30447
+ catch: () => new NotFoundError({ resource: "snapshot-blob", id: `${rev}:${path2}` })
30448
+ });
30449
+ var blobImpl = (snapshotsRoot, cwd, rev, file) => Effect_exports.gen(function* () {
30450
+ if (!/^[0-9a-f]{6,40}$/i.test(rev)) {
30451
+ return yield* Effect_exports.fail(new ValidationError({ field: "rev", reason: "invalid commit hash" }));
30452
+ }
30453
+ if (!file || isAbsolute(file) || file.split("/").includes("..")) {
30454
+ return yield* Effect_exports.fail(new ValidationError({ field: "file", reason: "invalid path" }));
30455
+ }
30456
+ if (!isImagePath(file)) {
30457
+ return yield* Effect_exports.fail(new ValidationError({ field: "file", reason: "not an image" }));
30458
+ }
30459
+ const repoDir = yield* resolveRepoDir(snapshotsRoot, cwd);
30460
+ const bytes = yield* gitShowBytes(repoDir, cwd, rev, file);
30461
+ return new Uint8Array(bytes);
30462
+ }).pipe(Effect_exports.withSpan("snapshot.blob", { attributes: { cwd, rev } }));
30391
30463
  var diffImpl = (snapshotsRoot, cwd, commitHash) => Effect_exports.gen(function* () {
30392
30464
  if (!/^[0-9a-f]{6,40}$/i.test(commitHash)) {
30393
30465
  return yield* Effect_exports.fail(new ValidationError({ field: "commit", reason: "invalid commit hash" }));
@@ -30444,28 +30516,37 @@ var diffImpl = (snapshotsRoot, cwd, commitHash) => Effect_exports.gen(function*
30444
30516
  const files = [];
30445
30517
  for (let i = 0; i + 1 < tokens.length && files.length < MAX_DIFF_FILES; i += 2) {
30446
30518
  const st = tokens[i];
30447
- const path = tokens[i + 1];
30519
+ const path2 = tokens[i + 1];
30448
30520
  const status3 = st === "A" ? "added" : st === "D" ? "deleted" : "modified";
30449
- const binary = binarySet.has(path);
30521
+ const binary = binarySet.has(path2);
30450
30522
  let oldContent = null;
30451
30523
  let newContent = null;
30452
30524
  if (!binary) {
30453
- if (status3 !== "added") oldContent = yield* showFile(repoDir, cwd, base, path);
30454
- if (status3 !== "deleted") newContent = yield* showFile(repoDir, cwd, commit3.hash, path);
30525
+ if (status3 !== "added") oldContent = yield* showFile(repoDir, cwd, base, path2);
30526
+ if (status3 !== "deleted") newContent = yield* showFile(repoDir, cwd, commit3.hash, path2);
30455
30527
  if ((oldContent?.length ?? 0) > MAX_DIFF_CONTENT_BYTES || (newContent?.length ?? 0) > MAX_DIFF_CONTENT_BYTES) {
30456
30528
  oldContent = null;
30457
30529
  newContent = null;
30458
30530
  }
30459
30531
  }
30460
- const stats = lineStats.get(path);
30532
+ const stats = lineStats.get(path2);
30533
+ const isImage = binary && isImagePath(path2);
30461
30534
  files.push({
30462
- path,
30535
+ path: path2,
30463
30536
  status: status3,
30464
30537
  binary,
30465
30538
  additions: stats?.additions ?? 0,
30466
30539
  deletions: stats?.deletions ?? 0,
30467
30540
  oldContent,
30468
- newContent
30541
+ newContent,
30542
+ ...isImage ? {
30543
+ isImage: true,
30544
+ // A parentless day-root commit diffs against the empty tree, so
30545
+ // every path comes back "added" — `base` is never handed out as
30546
+ // a revision the client could ask for.
30547
+ oldRev: status3 === "added" ? null : base,
30548
+ newRev: status3 === "deleted" ? null : commit3.hash
30549
+ } : {}
30469
30550
  });
30470
30551
  }
30471
30552
  const truncated = tokens.length / 2 > files.length;
@@ -30591,9 +30672,10 @@ var SnapshotServiceLive = Layer_exports.scoped(
30591
30672
  );
30592
30673
  return SnapshotService.of({
30593
30674
  record: (trigger) => snapshotOnce(snapshotsRoot, maxFileBytes, trigger, "tool"),
30594
- baseline: (cwd, sessionKey, provider) => snapshotOnce(snapshotsRoot, maxFileBytes, { cwd, sessionKey, provider }, "baseline"),
30595
- listByToolIds: (cwd, toolIds, sessionKey) => listByToolIdsImpl(snapshotsRoot, cwd, toolIds, sessionKey),
30675
+ baseline: (cwd, sessionKey, provider, runId) => snapshotOnce(snapshotsRoot, maxFileBytes, { cwd, sessionKey, provider, runId }, "baseline"),
30676
+ listByToolIds: (cwd, toolIds, sessionKey, runId) => listByToolIdsImpl(snapshotsRoot, cwd, toolIds, sessionKey, runId),
30596
30677
  diff: (cwd, commitHash) => diffImpl(snapshotsRoot, cwd, commitHash),
30678
+ blob: (cwd, rev, file) => blobImpl(snapshotsRoot, cwd, rev, file),
30597
30679
  cleanup
30598
30680
  });
30599
30681
  })
@@ -14,7 +14,7 @@ import {
14
14
  readJsonFile,
15
15
  sanitizedSpawnEnv,
16
16
  writeJsonFile
17
- } from "./chunk-ZE2JXL6E.mjs";
17
+ } from "./chunk-ETYX2YQF.mjs";
18
18
 
19
19
  // packages/feature/console/src/server/plugins/browser/BrowserBridge.ts
20
20
  import { WebSocket } from "ws";
package/dist/httpApi.mjs CHANGED
@@ -22,10 +22,10 @@ import {
22
22
  unregisterBrowser,
23
23
  unregisterTerminal,
24
24
  writeStdinToCommand
25
- } from "./chunk-H6AI4XJC.mjs";
25
+ } from "./chunk-SGUW2QJI.mjs";
26
26
  import {
27
27
  getTerminalHistoryPath
28
- } from "./chunk-ZE2JXL6E.mjs";
28
+ } from "./chunk-ETYX2YQF.mjs";
29
29
  import "./chunk-7P6ASYW6.mjs";
30
30
 
31
31
  // src/lib/httpApi.ts