@surething/cockpit 1.0.261 → 1.0.262

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 (525) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +7 -4
  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 +18 -0
  7. package/.next-prod/server/app/_global-error/page.js +2 -2
  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/_tree.segment.rsc +1 -1
  14. package/.next-prod/server/app/_not-found/page.js +1 -1
  15. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  16. package/.next-prod/server/app/_not-found.html +2 -2
  17. package/.next-prod/server/app/_not-found.rsc +4 -4
  18. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +4 -4
  19. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +12 -11
  20. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  21. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  22. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  23. package/.next-prod/server/app/api/bash/route.js +1 -1
  24. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  25. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  26. package/.next-prod/server/app/api/chat/glm/route.js +1 -1
  27. package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
  28. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  29. package/.next-prod/server/app/api/chat/route.js +1 -1
  30. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  31. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  32. package/.next-prod/server/app/api/commands/route.js +1 -1
  33. package/.next-prod/server/app/api/comments/route.js +1 -1
  34. package/.next-prod/server/app/api/db/columns/route.js +1 -1
  35. package/.next-prod/server/app/api/db/connect/route.js +1 -1
  36. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  37. package/.next-prod/server/app/api/db/export/route.js +1 -1
  38. package/.next-prod/server/app/api/db/query/route.js +1 -1
  39. package/.next-prod/server/app/api/db/schemas/route.js +2 -2
  40. package/.next-prod/server/app/api/deepseek/balance/route.js +1 -1
  41. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  42. package/.next-prod/server/app/api/deepseek/models/route.js +1 -1
  43. package/.next-prod/server/app/api/dev/spans/route.js +1 -1
  44. package/.next-prod/server/app/api/extension/version/route.js +1 -1
  45. package/.next-prod/server/app/api/file/route.js +1 -1
  46. package/.next-prod/server/app/api/files/blame/route.js +1 -1
  47. package/.next-prod/server/app/api/files/clipboard/route.js +1 -1
  48. package/.next-prod/server/app/api/files/copy/route.js +1 -1
  49. package/.next-prod/server/app/api/files/delete/route.js +1 -1
  50. package/.next-prod/server/app/api/files/expanded/route.js +1 -1
  51. package/.next-prod/server/app/api/files/index/route.js +1 -1
  52. package/.next-prod/server/app/api/files/init/route.js +1 -1
  53. package/.next-prod/server/app/api/files/paste/route.js +1 -1
  54. package/.next-prod/server/app/api/files/read/route.js +1 -1
  55. package/.next-prod/server/app/api/files/readdir/route.js +1 -1
  56. package/.next-prod/server/app/api/files/recent/route.js +1 -1
  57. package/.next-prod/server/app/api/files/save/route.js +1 -1
  58. package/.next-prod/server/app/api/files/search/route.js +1 -1
  59. package/.next-prod/server/app/api/files/stat/route.js +1 -1
  60. package/.next-prod/server/app/api/files/text/route.js +1 -1
  61. package/.next-prod/server/app/api/git/branch-diff/route.js +1 -1
  62. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  63. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  64. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  65. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  66. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  67. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  68. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  69. package/.next-prod/server/app/api/git/status/route.js +1 -1
  70. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  71. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  72. package/.next-prod/server/app/api/glm/credentials/route.js +1 -1
  73. package/.next-prod/server/app/api/glm/models/route.js +1 -1
  74. package/.next-prod/server/app/api/glm/usage/route.js +1 -1
  75. package/.next-prod/server/app/api/global-state/route.js +1 -1
  76. package/.next-prod/server/app/api/health/route.js +1 -1
  77. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  78. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  79. package/.next-prod/server/app/api/jupyter/load/route.js +1 -1
  80. package/.next-prod/server/app/api/jupyter/save/route.js +1 -1
  81. package/.next-prod/server/app/api/jupyter/shutdown/route.js +1 -1
  82. package/.next-prod/server/app/api/kimi/credentials/route.js +1 -1
  83. package/.next-prod/server/app/api/kimi/models/route.js +1 -1
  84. package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
  85. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  86. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  87. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  88. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  89. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  90. package/.next-prod/server/app/api/mysql/columns/route.js +2 -2
  91. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  92. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  93. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  94. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  95. package/.next-prod/server/app/api/mysql/schemas/route.js +1 -1
  96. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  97. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  98. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  99. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  100. package/.next-prod/server/app/api/note/route.js +1 -1
  101. package/.next-prod/server/app/api/ollama/config/route.js +1 -1
  102. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  103. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  104. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  105. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  106. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  107. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  108. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  109. package/.next-prod/server/app/api/project-state/route.js +2 -2
  110. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  111. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  112. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  113. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  114. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  115. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  116. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  117. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  118. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  119. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  120. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  121. package/.next-prod/server/app/api/projects/route.js +1 -1
  122. package/.next-prod/server/app/api/prompts/config/route.js +1 -1
  123. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  124. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  125. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  126. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  127. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  128. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  129. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  130. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  131. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  132. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  133. package/.next-prod/server/app/api/restart/route.js +1 -0
  134. package/.next-prod/server/app/api/restart/route.js.nft.json +1 -0
  135. package/.next-prod/server/app/api/restart/route_client-reference-manifest.js +1 -0
  136. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  137. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  138. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  139. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  140. package/.next-prod/server/app/api/review/order/route.js +1 -1
  141. package/.next-prod/server/app/api/review/route.js +1 -1
  142. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  143. package/.next-prod/server/app/api/review/users/route.js +1 -1
  144. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  145. package/.next-prod/server/app/api/services/config/route.js +1 -1
  146. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  147. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  148. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  149. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  150. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  151. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  152. package/.next-prod/server/app/api/sessions/route.js +1 -1
  153. package/.next-prod/server/app/api/settings/route.js +1 -1
  154. package/.next-prod/server/app/api/shutdown/route.js +1 -0
  155. package/.next-prod/server/app/api/shutdown/route.js.nft.json +1 -0
  156. package/.next-prod/server/app/api/shutdown/route_client-reference-manifest.js +1 -0
  157. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  158. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  159. package/.next-prod/server/app/api/skills/route.js +1 -1
  160. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  161. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  162. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  163. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  164. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  165. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  166. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  167. package/.next-prod/server/app/api/update/route.js +1 -0
  168. package/.next-prod/server/app/api/update/route.js.nft.json +1 -0
  169. package/.next-prod/server/app/api/update/route_client-reference-manifest.js +1 -0
  170. package/.next-prod/server/app/api/version/route.js +1 -1
  171. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  172. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  173. package/.next-prod/server/app/m/page.js +1 -1
  174. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  175. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  176. package/.next-prod/server/app/page.js +1 -1
  177. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  178. package/.next-prod/server/app/project/page.js +1 -1
  179. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  180. package/.next-prod/server/app/review/[id]/page.js +1 -1
  181. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  182. package/.next-prod/server/app-paths-manifest.json +7 -4
  183. package/.next-prod/server/chunks/5750.js +16 -13
  184. package/.next-prod/server/chunks/6495.js +1 -1
  185. package/.next-prod/server/chunks/6548.js +1 -1
  186. package/.next-prod/server/chunks/7184.js +1 -1
  187. package/.next-prod/server/chunks/841.js +1 -1
  188. package/.next-prod/server/functions-config-manifest.json +3 -0
  189. package/.next-prod/server/middleware-build-manifest.js +1 -1
  190. package/.next-prod/server/pages/404.html +2 -2
  191. package/.next-prod/server/pages/500.html +1 -1
  192. package/.next-prod/server/server-reference-manifest.json +1 -1
  193. package/.next-prod/static/chunks/{1372-d16d68b1b03a345a.js → 1372-a26fa30d21bd1ecc.js} +1 -1
  194. package/.next-prod/static/chunks/5400-bf3fe22440a73161.js +36 -0
  195. package/.next-prod/static/chunks/6784-d51b98432358f755.js +381 -0
  196. package/.next-prod/static/chunks/app/_global-error/page-7c7e4c414aa6453c.js +1 -0
  197. package/.next-prod/static/chunks/app/api/agent/test/route-7c7e4c414aa6453c.js +1 -0
  198. package/.next-prod/static/chunks/app/api/bash/route-7c7e4c414aa6453c.js +1 -0
  199. package/.next-prod/static/chunks/app/api/chat/codex/route-7c7e4c414aa6453c.js +1 -0
  200. package/.next-prod/static/chunks/app/api/chat/deepseek/route-7c7e4c414aa6453c.js +1 -0
  201. package/.next-prod/static/chunks/app/api/chat/glm/route-7c7e4c414aa6453c.js +1 -0
  202. package/.next-prod/static/chunks/app/api/chat/kimi/route-7c7e4c414aa6453c.js +1 -0
  203. package/.next-prod/static/chunks/app/api/chat/ollama/route-7c7e4c414aa6453c.js +1 -0
  204. package/.next-prod/static/chunks/app/api/chat/route-7c7e4c414aa6453c.js +1 -0
  205. package/.next-prod/static/chunks/app/api/chat/stop/route-7c7e4c414aa6453c.js +1 -0
  206. package/.next-prod/static/chunks/app/api/claude-stats/route-7c7e4c414aa6453c.js +1 -0
  207. package/.next-prod/static/chunks/app/api/commands/route-7c7e4c414aa6453c.js +1 -0
  208. package/.next-prod/static/chunks/app/api/comments/route-7c7e4c414aa6453c.js +1 -0
  209. package/.next-prod/static/chunks/app/api/db/columns/route-7c7e4c414aa6453c.js +1 -0
  210. package/.next-prod/static/chunks/app/api/db/connect/route-7c7e4c414aa6453c.js +1 -0
  211. package/.next-prod/static/chunks/app/api/db/disconnect/route-7c7e4c414aa6453c.js +1 -0
  212. package/.next-prod/static/chunks/app/api/db/export/route-7c7e4c414aa6453c.js +1 -0
  213. package/.next-prod/static/chunks/app/api/db/query/route-7c7e4c414aa6453c.js +1 -0
  214. package/.next-prod/static/chunks/app/api/db/schemas/route-7c7e4c414aa6453c.js +1 -0
  215. package/.next-prod/static/chunks/app/api/deepseek/balance/route-7c7e4c414aa6453c.js +1 -0
  216. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-7c7e4c414aa6453c.js +1 -0
  217. package/.next-prod/static/chunks/app/api/deepseek/models/route-7c7e4c414aa6453c.js +1 -0
  218. package/.next-prod/static/chunks/app/api/dev/spans/route-7c7e4c414aa6453c.js +1 -0
  219. package/.next-prod/static/chunks/app/api/extension/version/route-7c7e4c414aa6453c.js +1 -0
  220. package/.next-prod/static/chunks/app/api/file/route-7c7e4c414aa6453c.js +1 -0
  221. package/.next-prod/static/chunks/app/api/files/blame/route-7c7e4c414aa6453c.js +1 -0
  222. package/.next-prod/static/chunks/app/api/files/clipboard/route-7c7e4c414aa6453c.js +1 -0
  223. package/.next-prod/static/chunks/app/api/files/copy/route-7c7e4c414aa6453c.js +1 -0
  224. package/.next-prod/static/chunks/app/api/files/delete/route-7c7e4c414aa6453c.js +1 -0
  225. package/.next-prod/static/chunks/app/api/files/expanded/route-7c7e4c414aa6453c.js +1 -0
  226. package/.next-prod/static/chunks/app/api/files/index/route-7c7e4c414aa6453c.js +1 -0
  227. package/.next-prod/static/chunks/app/api/files/init/route-7c7e4c414aa6453c.js +1 -0
  228. package/.next-prod/static/chunks/app/api/files/paste/route-7c7e4c414aa6453c.js +1 -0
  229. package/.next-prod/static/chunks/app/api/files/read/route-7c7e4c414aa6453c.js +1 -0
  230. package/.next-prod/static/chunks/app/api/files/readdir/route-7c7e4c414aa6453c.js +1 -0
  231. package/.next-prod/static/chunks/app/api/files/recent/route-7c7e4c414aa6453c.js +1 -0
  232. package/.next-prod/static/chunks/app/api/files/save/route-7c7e4c414aa6453c.js +1 -0
  233. package/.next-prod/static/chunks/app/api/files/search/route-7c7e4c414aa6453c.js +1 -0
  234. package/.next-prod/static/chunks/app/api/files/stat/route-7c7e4c414aa6453c.js +1 -0
  235. package/.next-prod/static/chunks/app/api/files/text/route-7c7e4c414aa6453c.js +1 -0
  236. package/.next-prod/static/chunks/app/api/git/branch-diff/route-7c7e4c414aa6453c.js +1 -0
  237. package/.next-prod/static/chunks/app/api/git/branches/route-7c7e4c414aa6453c.js +1 -0
  238. package/.next-prod/static/chunks/app/api/git/commit-diff/route-7c7e4c414aa6453c.js +1 -0
  239. package/.next-prod/static/chunks/app/api/git/commits/route-7c7e4c414aa6453c.js +1 -0
  240. package/.next-prod/static/chunks/app/api/git/current-branch/route-7c7e4c414aa6453c.js +1 -0
  241. package/.next-prod/static/chunks/app/api/git/diff/route-7c7e4c414aa6453c.js +1 -0
  242. package/.next-prod/static/chunks/app/api/git/discard/route-7c7e4c414aa6453c.js +1 -0
  243. package/.next-prod/static/chunks/app/api/git/stage/route-7c7e4c414aa6453c.js +1 -0
  244. package/.next-prod/static/chunks/app/api/git/status/route-7c7e4c414aa6453c.js +1 -0
  245. package/.next-prod/static/chunks/app/api/git/unstage/route-7c7e4c414aa6453c.js +1 -0
  246. package/.next-prod/static/chunks/app/api/git/worktree/route-7c7e4c414aa6453c.js +1 -0
  247. package/.next-prod/static/chunks/app/api/glm/credentials/route-7c7e4c414aa6453c.js +1 -0
  248. package/.next-prod/static/chunks/app/api/glm/models/route-7c7e4c414aa6453c.js +1 -0
  249. package/.next-prod/static/chunks/app/api/glm/usage/route-7c7e4c414aa6453c.js +1 -0
  250. package/.next-prod/static/chunks/app/api/global-state/route-7c7e4c414aa6453c.js +1 -0
  251. package/.next-prod/static/chunks/app/api/health/route-7c7e4c414aa6453c.js +1 -0
  252. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-7c7e4c414aa6453c.js +1 -0
  253. package/.next-prod/static/chunks/app/api/html-apps/route-7c7e4c414aa6453c.js +1 -0
  254. package/.next-prod/static/chunks/app/api/jupyter/load/route-7c7e4c414aa6453c.js +1 -0
  255. package/.next-prod/static/chunks/app/api/jupyter/save/route-7c7e4c414aa6453c.js +1 -0
  256. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-7c7e4c414aa6453c.js +1 -0
  257. package/.next-prod/static/chunks/app/api/kimi/credentials/route-7c7e4c414aa6453c.js +1 -0
  258. package/.next-prod/static/chunks/app/api/kimi/models/route-7c7e4c414aa6453c.js +1 -0
  259. package/.next-prod/static/chunks/app/api/kimi/usage/route-7c7e4c414aa6453c.js +1 -0
  260. package/.next-prod/static/chunks/app/api/lsp/definition/route-7c7e4c414aa6453c.js +1 -0
  261. package/.next-prod/static/chunks/app/api/lsp/hover/route-7c7e4c414aa6453c.js +1 -0
  262. package/.next-prod/static/chunks/app/api/lsp/references/route-7c7e4c414aa6453c.js +1 -0
  263. package/.next-prod/static/chunks/app/api/lsp/status/route-7c7e4c414aa6453c.js +1 -0
  264. package/.next-prod/static/chunks/app/api/lsp/warmup/route-7c7e4c414aa6453c.js +1 -0
  265. package/.next-prod/static/chunks/app/api/mysql/columns/route-7c7e4c414aa6453c.js +1 -0
  266. package/.next-prod/static/chunks/app/api/mysql/connect/route-7c7e4c414aa6453c.js +1 -0
  267. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-7c7e4c414aa6453c.js +1 -0
  268. package/.next-prod/static/chunks/app/api/mysql/export/route-7c7e4c414aa6453c.js +1 -0
  269. package/.next-prod/static/chunks/app/api/mysql/query/route-7c7e4c414aa6453c.js +1 -0
  270. package/.next-prod/static/chunks/app/api/mysql/schemas/route-7c7e4c414aa6453c.js +1 -0
  271. package/.next-prod/static/chunks/app/api/neo4j/connect/route-7c7e4c414aa6453c.js +1 -0
  272. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-7c7e4c414aa6453c.js +1 -0
  273. package/.next-prod/static/chunks/app/api/neo4j/query/route-7c7e4c414aa6453c.js +1 -0
  274. package/.next-prod/static/chunks/app/api/neo4j/schema/route-7c7e4c414aa6453c.js +1 -0
  275. package/.next-prod/static/chunks/app/api/note/route-7c7e4c414aa6453c.js +1 -0
  276. package/.next-prod/static/chunks/app/api/ollama/config/route-7c7e4c414aa6453c.js +1 -0
  277. package/.next-prod/static/chunks/app/api/ollama/models/route-7c7e4c414aa6453c.js +1 -0
  278. package/.next-prod/static/chunks/app/api/ollama/start/route-7c7e4c414aa6453c.js +1 -0
  279. package/.next-prod/static/chunks/app/api/open-cursor/route-7c7e4c414aa6453c.js +1 -0
  280. package/.next-prod/static/chunks/app/api/open-vscode/route-7c7e4c414aa6453c.js +1 -0
  281. package/.next-prod/static/chunks/app/api/pick-folder/route-7c7e4c414aa6453c.js +1 -0
  282. package/.next-prod/static/chunks/app/api/pinned-sessions/route-7c7e4c414aa6453c.js +1 -0
  283. package/.next-prod/static/chunks/app/api/project-settings/route-7c7e4c414aa6453c.js +1 -0
  284. package/.next-prod/static/chunks/app/api/project-state/route-7c7e4c414aa6453c.js +1 -0
  285. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-7c7e4c414aa6453c.js +1 -0
  286. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-7c7e4c414aa6453c.js +1 -0
  287. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-7c7e4c414aa6453c.js +1 -0
  288. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-7c7e4c414aa6453c.js +1 -0
  289. package/.next-prod/static/chunks/app/api/projectGraph/context/route-7c7e4c414aa6453c.js +1 -0
  290. package/.next-prod/static/chunks/app/api/projectGraph/file/route-7c7e4c414aa6453c.js +1 -0
  291. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-7c7e4c414aa6453c.js +1 -0
  292. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-7c7e4c414aa6453c.js +1 -0
  293. package/.next-prod/static/chunks/app/api/projectGraph/related/route-7c7e4c414aa6453c.js +1 -0
  294. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-7c7e4c414aa6453c.js +1 -0
  295. package/.next-prod/static/chunks/app/api/projectGraph/search/route-7c7e4c414aa6453c.js +1 -0
  296. package/.next-prod/static/chunks/app/api/projects/route-7c7e4c414aa6453c.js +1 -0
  297. package/.next-prod/static/chunks/app/api/prompts/config/route-7c7e4c414aa6453c.js +1 -0
  298. package/.next-prod/static/chunks/app/api/push/public-key/route-7c7e4c414aa6453c.js +1 -0
  299. package/.next-prod/static/chunks/app/api/push/subscribe/route-7c7e4c414aa6453c.js +1 -0
  300. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-7c7e4c414aa6453c.js +1 -0
  301. package/.next-prod/static/chunks/app/api/redis/command/route-7c7e4c414aa6453c.js +1 -0
  302. package/.next-prod/static/chunks/app/api/redis/connect/route-7c7e4c414aa6453c.js +1 -0
  303. package/.next-prod/static/chunks/app/api/redis/delete/route-7c7e4c414aa6453c.js +1 -0
  304. package/.next-prod/static/chunks/app/api/redis/disconnect/route-7c7e4c414aa6453c.js +1 -0
  305. package/.next-prod/static/chunks/app/api/redis/get/route-7c7e4c414aa6453c.js +1 -0
  306. package/.next-prod/static/chunks/app/api/redis/keys/route-7c7e4c414aa6453c.js +1 -0
  307. package/.next-prod/static/chunks/app/api/redis/set/route-7c7e4c414aa6453c.js +1 -0
  308. package/.next-prod/static/chunks/app/api/restart/route-7c7e4c414aa6453c.js +1 -0
  309. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-7c7e4c414aa6453c.js +1 -0
  310. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-7c7e4c414aa6453c.js +1 -0
  311. package/.next-prod/static/chunks/app/api/review/[id]/route-7c7e4c414aa6453c.js +1 -0
  312. package/.next-prod/static/chunks/app/api/review/identify/route-7c7e4c414aa6453c.js +1 -0
  313. package/.next-prod/static/chunks/app/api/review/order/route-7c7e4c414aa6453c.js +1 -0
  314. package/.next-prod/static/chunks/app/api/review/route-7c7e4c414aa6453c.js +1 -0
  315. package/.next-prod/static/chunks/app/api/review/share-info/route-7c7e4c414aa6453c.js +1 -0
  316. package/.next-prod/static/chunks/app/api/review/users/route-7c7e4c414aa6453c.js +1 -0
  317. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-7c7e4c414aa6453c.js +1 -0
  318. package/.next-prod/static/chunks/app/api/services/config/route-7c7e4c414aa6453c.js +1 -0
  319. package/.next-prod/static/chunks/app/api/services/scripts/route-7c7e4c414aa6453c.js +1 -0
  320. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-7c7e4c414aa6453c.js +1 -0
  321. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-7c7e4c414aa6453c.js +1 -0
  322. package/.next-prod/static/chunks/app/api/session-by-path/route-7c7e4c414aa6453c.js +1 -0
  323. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-7c7e4c414aa6453c.js +1 -0
  324. package/.next-prod/static/chunks/app/api/sessions/projects/route-7c7e4c414aa6453c.js +1 -0
  325. package/.next-prod/static/chunks/app/api/sessions/route-7c7e4c414aa6453c.js +1 -0
  326. package/.next-prod/static/chunks/app/api/settings/route-7c7e4c414aa6453c.js +1 -0
  327. package/.next-prod/static/chunks/app/api/shutdown/route-7c7e4c414aa6453c.js +1 -0
  328. package/.next-prod/static/chunks/app/api/skills/[id]/route-7c7e4c414aa6453c.js +1 -0
  329. package/.next-prod/static/chunks/app/api/skills/content/route-7c7e4c414aa6453c.js +1 -0
  330. package/.next-prod/static/chunks/app/api/skills/route-7c7e4c414aa6453c.js +1 -0
  331. package/.next-prod/static/chunks/app/api/snapshots/diff/route-7c7e4c414aa6453c.js +1 -0
  332. package/.next-prod/static/chunks/app/api/snapshots/route-7c7e4c414aa6453c.js +1 -0
  333. package/.next-prod/static/chunks/app/api/terminal/aliases/route-7c7e4c414aa6453c.js +1 -0
  334. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-7c7e4c414aa6453c.js +1 -0
  335. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-7c7e4c414aa6453c.js +1 -0
  336. package/.next-prod/static/chunks/app/api/terminal/env/route-7c7e4c414aa6453c.js +1 -0
  337. package/.next-prod/static/chunks/app/api/terminal/history/route-7c7e4c414aa6453c.js +1 -0
  338. package/.next-prod/static/chunks/app/api/update/route-7c7e4c414aa6453c.js +1 -0
  339. package/.next-prod/static/chunks/app/api/version/route-7c7e4c414aa6453c.js +1 -0
  340. package/.next-prod/static/chunks/app/apps/[...path]/route-7c7e4c414aa6453c.js +1 -0
  341. package/.next-prod/static/chunks/app/{layout-ab52fc1a83af968b.js → layout-7b31e254e348e208.js} +1 -1
  342. package/.next-prod/static/chunks/app/manifest.webmanifest/route-7c7e4c414aa6453c.js +1 -0
  343. package/.next-prod/static/chunks/app/{page-5de8b6584e328a6f.js → page-cb0d12250512641d.js} +1 -1
  344. package/.next-prod/static/chunks/app/project/{page-5de8b6584e328a6f.js → page-cb0d12250512641d.js} +1 -1
  345. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-7c7e4c414aa6453c.js +1 -0
  346. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-7c7e4c414aa6453c.js +1 -0
  347. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-7c7e4c414aa6453c.js +1 -0
  348. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-7c7e4c414aa6453c.js +1 -0
  349. package/.next-prod/static/css/38ad6f470b64a40f.css +1 -0
  350. package/.next-prod/static/noNfrQRJFchmZSWx_yn1K/_buildManifest.js +1 -0
  351. package/.next-prod/trace +14 -14
  352. package/.next-prod/trace-build +1 -1
  353. package/.next-prod/types/app/api/restart/route.ts +353 -0
  354. package/.next-prod/types/app/api/shutdown/route.ts +353 -0
  355. package/.next-prod/types/app/api/update/route.ts +353 -0
  356. package/.next-prod/types/routes.d.ts +4 -1
  357. package/.next-prod/types/validator.ts +27 -0
  358. package/README.md +75 -0
  359. package/README.zh.md +64 -0
  360. package/bin/cock-service.mjs +498 -0
  361. package/bin/cock.mjs +35 -27
  362. package/bin/cockpitHome.mjs +33 -0
  363. package/bin/rotateLog.mjs +52 -0
  364. package/bin/updater.mjs +231 -0
  365. package/dist/{chunk-CLPJYIFC.mjs → chunk-AI7T3EXM.mjs} +4 -3
  366. package/dist/{chunk-B5LXMESP.mjs → chunk-LC4LAEWJ.mjs} +1 -1
  367. package/dist/{chunk-TU3GL2HK.mjs → chunk-ZCMAJV2M.mjs} +15 -4
  368. package/dist/httpApi.mjs +2 -2
  369. package/dist/scheduledTasks.mjs +24 -4
  370. package/dist/{server-2UJDVZ32.mjs → server-CQXVJT3F.mjs} +2 -2
  371. package/dist/wsServer.mjs +144 -112
  372. package/package.json +1 -1
  373. package/server.mjs +127 -11
  374. package/.next-prod/static/chunks/1157-164bcf046a0a9b15.js +0 -32
  375. package/.next-prod/static/chunks/6784-09dffdb0e8ca7fb3.js +0 -381
  376. package/.next-prod/static/chunks/app/_global-error/page-3c1c06e2de280418.js +0 -1
  377. package/.next-prod/static/chunks/app/api/agent/test/route-3c1c06e2de280418.js +0 -1
  378. package/.next-prod/static/chunks/app/api/bash/route-3c1c06e2de280418.js +0 -1
  379. package/.next-prod/static/chunks/app/api/chat/codex/route-3c1c06e2de280418.js +0 -1
  380. package/.next-prod/static/chunks/app/api/chat/deepseek/route-3c1c06e2de280418.js +0 -1
  381. package/.next-prod/static/chunks/app/api/chat/glm/route-3c1c06e2de280418.js +0 -1
  382. package/.next-prod/static/chunks/app/api/chat/kimi/route-3c1c06e2de280418.js +0 -1
  383. package/.next-prod/static/chunks/app/api/chat/ollama/route-3c1c06e2de280418.js +0 -1
  384. package/.next-prod/static/chunks/app/api/chat/route-3c1c06e2de280418.js +0 -1
  385. package/.next-prod/static/chunks/app/api/chat/stop/route-3c1c06e2de280418.js +0 -1
  386. package/.next-prod/static/chunks/app/api/claude-stats/route-3c1c06e2de280418.js +0 -1
  387. package/.next-prod/static/chunks/app/api/commands/route-3c1c06e2de280418.js +0 -1
  388. package/.next-prod/static/chunks/app/api/comments/route-3c1c06e2de280418.js +0 -1
  389. package/.next-prod/static/chunks/app/api/db/columns/route-3c1c06e2de280418.js +0 -1
  390. package/.next-prod/static/chunks/app/api/db/connect/route-3c1c06e2de280418.js +0 -1
  391. package/.next-prod/static/chunks/app/api/db/disconnect/route-3c1c06e2de280418.js +0 -1
  392. package/.next-prod/static/chunks/app/api/db/export/route-3c1c06e2de280418.js +0 -1
  393. package/.next-prod/static/chunks/app/api/db/query/route-3c1c06e2de280418.js +0 -1
  394. package/.next-prod/static/chunks/app/api/db/schemas/route-3c1c06e2de280418.js +0 -1
  395. package/.next-prod/static/chunks/app/api/deepseek/balance/route-3c1c06e2de280418.js +0 -1
  396. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-3c1c06e2de280418.js +0 -1
  397. package/.next-prod/static/chunks/app/api/deepseek/models/route-3c1c06e2de280418.js +0 -1
  398. package/.next-prod/static/chunks/app/api/dev/spans/route-3c1c06e2de280418.js +0 -1
  399. package/.next-prod/static/chunks/app/api/extension/version/route-3c1c06e2de280418.js +0 -1
  400. package/.next-prod/static/chunks/app/api/file/route-3c1c06e2de280418.js +0 -1
  401. package/.next-prod/static/chunks/app/api/files/blame/route-3c1c06e2de280418.js +0 -1
  402. package/.next-prod/static/chunks/app/api/files/clipboard/route-3c1c06e2de280418.js +0 -1
  403. package/.next-prod/static/chunks/app/api/files/copy/route-3c1c06e2de280418.js +0 -1
  404. package/.next-prod/static/chunks/app/api/files/delete/route-3c1c06e2de280418.js +0 -1
  405. package/.next-prod/static/chunks/app/api/files/expanded/route-3c1c06e2de280418.js +0 -1
  406. package/.next-prod/static/chunks/app/api/files/index/route-3c1c06e2de280418.js +0 -1
  407. package/.next-prod/static/chunks/app/api/files/init/route-3c1c06e2de280418.js +0 -1
  408. package/.next-prod/static/chunks/app/api/files/paste/route-3c1c06e2de280418.js +0 -1
  409. package/.next-prod/static/chunks/app/api/files/read/route-3c1c06e2de280418.js +0 -1
  410. package/.next-prod/static/chunks/app/api/files/readdir/route-3c1c06e2de280418.js +0 -1
  411. package/.next-prod/static/chunks/app/api/files/recent/route-3c1c06e2de280418.js +0 -1
  412. package/.next-prod/static/chunks/app/api/files/save/route-3c1c06e2de280418.js +0 -1
  413. package/.next-prod/static/chunks/app/api/files/search/route-3c1c06e2de280418.js +0 -1
  414. package/.next-prod/static/chunks/app/api/files/stat/route-3c1c06e2de280418.js +0 -1
  415. package/.next-prod/static/chunks/app/api/files/text/route-3c1c06e2de280418.js +0 -1
  416. package/.next-prod/static/chunks/app/api/git/branch-diff/route-3c1c06e2de280418.js +0 -1
  417. package/.next-prod/static/chunks/app/api/git/branches/route-3c1c06e2de280418.js +0 -1
  418. package/.next-prod/static/chunks/app/api/git/commit-diff/route-3c1c06e2de280418.js +0 -1
  419. package/.next-prod/static/chunks/app/api/git/commits/route-3c1c06e2de280418.js +0 -1
  420. package/.next-prod/static/chunks/app/api/git/current-branch/route-3c1c06e2de280418.js +0 -1
  421. package/.next-prod/static/chunks/app/api/git/diff/route-3c1c06e2de280418.js +0 -1
  422. package/.next-prod/static/chunks/app/api/git/discard/route-3c1c06e2de280418.js +0 -1
  423. package/.next-prod/static/chunks/app/api/git/stage/route-3c1c06e2de280418.js +0 -1
  424. package/.next-prod/static/chunks/app/api/git/status/route-3c1c06e2de280418.js +0 -1
  425. package/.next-prod/static/chunks/app/api/git/unstage/route-3c1c06e2de280418.js +0 -1
  426. package/.next-prod/static/chunks/app/api/git/worktree/route-3c1c06e2de280418.js +0 -1
  427. package/.next-prod/static/chunks/app/api/glm/credentials/route-3c1c06e2de280418.js +0 -1
  428. package/.next-prod/static/chunks/app/api/glm/models/route-3c1c06e2de280418.js +0 -1
  429. package/.next-prod/static/chunks/app/api/glm/usage/route-3c1c06e2de280418.js +0 -1
  430. package/.next-prod/static/chunks/app/api/global-state/route-3c1c06e2de280418.js +0 -1
  431. package/.next-prod/static/chunks/app/api/health/route-3c1c06e2de280418.js +0 -1
  432. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-3c1c06e2de280418.js +0 -1
  433. package/.next-prod/static/chunks/app/api/html-apps/route-3c1c06e2de280418.js +0 -1
  434. package/.next-prod/static/chunks/app/api/jupyter/load/route-3c1c06e2de280418.js +0 -1
  435. package/.next-prod/static/chunks/app/api/jupyter/save/route-3c1c06e2de280418.js +0 -1
  436. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-3c1c06e2de280418.js +0 -1
  437. package/.next-prod/static/chunks/app/api/kimi/credentials/route-3c1c06e2de280418.js +0 -1
  438. package/.next-prod/static/chunks/app/api/kimi/models/route-3c1c06e2de280418.js +0 -1
  439. package/.next-prod/static/chunks/app/api/kimi/usage/route-3c1c06e2de280418.js +0 -1
  440. package/.next-prod/static/chunks/app/api/lsp/definition/route-3c1c06e2de280418.js +0 -1
  441. package/.next-prod/static/chunks/app/api/lsp/hover/route-3c1c06e2de280418.js +0 -1
  442. package/.next-prod/static/chunks/app/api/lsp/references/route-3c1c06e2de280418.js +0 -1
  443. package/.next-prod/static/chunks/app/api/lsp/status/route-3c1c06e2de280418.js +0 -1
  444. package/.next-prod/static/chunks/app/api/lsp/warmup/route-3c1c06e2de280418.js +0 -1
  445. package/.next-prod/static/chunks/app/api/mysql/columns/route-3c1c06e2de280418.js +0 -1
  446. package/.next-prod/static/chunks/app/api/mysql/connect/route-3c1c06e2de280418.js +0 -1
  447. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-3c1c06e2de280418.js +0 -1
  448. package/.next-prod/static/chunks/app/api/mysql/export/route-3c1c06e2de280418.js +0 -1
  449. package/.next-prod/static/chunks/app/api/mysql/query/route-3c1c06e2de280418.js +0 -1
  450. package/.next-prod/static/chunks/app/api/mysql/schemas/route-3c1c06e2de280418.js +0 -1
  451. package/.next-prod/static/chunks/app/api/neo4j/connect/route-3c1c06e2de280418.js +0 -1
  452. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-3c1c06e2de280418.js +0 -1
  453. package/.next-prod/static/chunks/app/api/neo4j/query/route-3c1c06e2de280418.js +0 -1
  454. package/.next-prod/static/chunks/app/api/neo4j/schema/route-3c1c06e2de280418.js +0 -1
  455. package/.next-prod/static/chunks/app/api/note/route-3c1c06e2de280418.js +0 -1
  456. package/.next-prod/static/chunks/app/api/ollama/config/route-3c1c06e2de280418.js +0 -1
  457. package/.next-prod/static/chunks/app/api/ollama/models/route-3c1c06e2de280418.js +0 -1
  458. package/.next-prod/static/chunks/app/api/ollama/start/route-3c1c06e2de280418.js +0 -1
  459. package/.next-prod/static/chunks/app/api/open-cursor/route-3c1c06e2de280418.js +0 -1
  460. package/.next-prod/static/chunks/app/api/open-vscode/route-3c1c06e2de280418.js +0 -1
  461. package/.next-prod/static/chunks/app/api/pick-folder/route-3c1c06e2de280418.js +0 -1
  462. package/.next-prod/static/chunks/app/api/pinned-sessions/route-3c1c06e2de280418.js +0 -1
  463. package/.next-prod/static/chunks/app/api/project-settings/route-3c1c06e2de280418.js +0 -1
  464. package/.next-prod/static/chunks/app/api/project-state/route-3c1c06e2de280418.js +0 -1
  465. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-3c1c06e2de280418.js +0 -1
  466. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-3c1c06e2de280418.js +0 -1
  467. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-3c1c06e2de280418.js +0 -1
  468. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-3c1c06e2de280418.js +0 -1
  469. package/.next-prod/static/chunks/app/api/projectGraph/context/route-3c1c06e2de280418.js +0 -1
  470. package/.next-prod/static/chunks/app/api/projectGraph/file/route-3c1c06e2de280418.js +0 -1
  471. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-3c1c06e2de280418.js +0 -1
  472. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-3c1c06e2de280418.js +0 -1
  473. package/.next-prod/static/chunks/app/api/projectGraph/related/route-3c1c06e2de280418.js +0 -1
  474. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-3c1c06e2de280418.js +0 -1
  475. package/.next-prod/static/chunks/app/api/projectGraph/search/route-3c1c06e2de280418.js +0 -1
  476. package/.next-prod/static/chunks/app/api/projects/route-3c1c06e2de280418.js +0 -1
  477. package/.next-prod/static/chunks/app/api/prompts/config/route-3c1c06e2de280418.js +0 -1
  478. package/.next-prod/static/chunks/app/api/push/public-key/route-3c1c06e2de280418.js +0 -1
  479. package/.next-prod/static/chunks/app/api/push/subscribe/route-3c1c06e2de280418.js +0 -1
  480. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-3c1c06e2de280418.js +0 -1
  481. package/.next-prod/static/chunks/app/api/redis/command/route-3c1c06e2de280418.js +0 -1
  482. package/.next-prod/static/chunks/app/api/redis/connect/route-3c1c06e2de280418.js +0 -1
  483. package/.next-prod/static/chunks/app/api/redis/delete/route-3c1c06e2de280418.js +0 -1
  484. package/.next-prod/static/chunks/app/api/redis/disconnect/route-3c1c06e2de280418.js +0 -1
  485. package/.next-prod/static/chunks/app/api/redis/get/route-3c1c06e2de280418.js +0 -1
  486. package/.next-prod/static/chunks/app/api/redis/keys/route-3c1c06e2de280418.js +0 -1
  487. package/.next-prod/static/chunks/app/api/redis/set/route-3c1c06e2de280418.js +0 -1
  488. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-3c1c06e2de280418.js +0 -1
  489. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-3c1c06e2de280418.js +0 -1
  490. package/.next-prod/static/chunks/app/api/review/[id]/route-3c1c06e2de280418.js +0 -1
  491. package/.next-prod/static/chunks/app/api/review/identify/route-3c1c06e2de280418.js +0 -1
  492. package/.next-prod/static/chunks/app/api/review/order/route-3c1c06e2de280418.js +0 -1
  493. package/.next-prod/static/chunks/app/api/review/route-3c1c06e2de280418.js +0 -1
  494. package/.next-prod/static/chunks/app/api/review/share-info/route-3c1c06e2de280418.js +0 -1
  495. package/.next-prod/static/chunks/app/api/review/users/route-3c1c06e2de280418.js +0 -1
  496. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-3c1c06e2de280418.js +0 -1
  497. package/.next-prod/static/chunks/app/api/services/config/route-3c1c06e2de280418.js +0 -1
  498. package/.next-prod/static/chunks/app/api/services/scripts/route-3c1c06e2de280418.js +0 -1
  499. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-3c1c06e2de280418.js +0 -1
  500. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-3c1c06e2de280418.js +0 -1
  501. package/.next-prod/static/chunks/app/api/session-by-path/route-3c1c06e2de280418.js +0 -1
  502. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-3c1c06e2de280418.js +0 -1
  503. package/.next-prod/static/chunks/app/api/sessions/projects/route-3c1c06e2de280418.js +0 -1
  504. package/.next-prod/static/chunks/app/api/sessions/route-3c1c06e2de280418.js +0 -1
  505. package/.next-prod/static/chunks/app/api/settings/route-3c1c06e2de280418.js +0 -1
  506. package/.next-prod/static/chunks/app/api/skills/[id]/route-3c1c06e2de280418.js +0 -1
  507. package/.next-prod/static/chunks/app/api/skills/content/route-3c1c06e2de280418.js +0 -1
  508. package/.next-prod/static/chunks/app/api/skills/route-3c1c06e2de280418.js +0 -1
  509. package/.next-prod/static/chunks/app/api/snapshots/diff/route-3c1c06e2de280418.js +0 -1
  510. package/.next-prod/static/chunks/app/api/snapshots/route-3c1c06e2de280418.js +0 -1
  511. package/.next-prod/static/chunks/app/api/terminal/aliases/route-3c1c06e2de280418.js +0 -1
  512. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-3c1c06e2de280418.js +0 -1
  513. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-3c1c06e2de280418.js +0 -1
  514. package/.next-prod/static/chunks/app/api/terminal/env/route-3c1c06e2de280418.js +0 -1
  515. package/.next-prod/static/chunks/app/api/terminal/history/route-3c1c06e2de280418.js +0 -1
  516. package/.next-prod/static/chunks/app/api/version/route-3c1c06e2de280418.js +0 -1
  517. package/.next-prod/static/chunks/app/apps/[...path]/route-3c1c06e2de280418.js +0 -1
  518. package/.next-prod/static/chunks/app/manifest.webmanifest/route-3c1c06e2de280418.js +0 -1
  519. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-3c1c06e2de280418.js +0 -1
  520. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-3c1c06e2de280418.js +0 -1
  521. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-3c1c06e2de280418.js +0 -1
  522. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-3c1c06e2de280418.js +0 -1
  523. package/.next-prod/static/css/83c134c954630942.css +0 -1
  524. package/.next-prod/static/pgteRwI6FQcp683smeSNO/_buildManifest.js +0 -1
  525. /package/.next-prod/static/{pgteRwI6FQcp683smeSNO → noNfrQRJFchmZSWx_yn1K}/_ssgManifest.js +0 -0
package/dist/wsServer.mjs CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  getRunSnapshot,
5
5
  recoverStashedCodexRollouts,
6
6
  recoverStashedTranscripts
7
- } from "./chunk-B5LXMESP.mjs";
7
+ } from "./chunk-LC4LAEWJ.mjs";
8
8
  import {
9
9
  addExitListener,
10
10
  addOutputListener,
@@ -20,7 +20,7 @@ import {
20
20
  resolvePendingRequest,
21
21
  unregisterBrowser,
22
22
  writeStdinToCommand
23
- } from "./chunk-CLPJYIFC.mjs";
23
+ } from "./chunk-AI7T3EXM.mjs";
24
24
  import {
25
25
  AppError,
26
26
  Effect_exports,
@@ -36,7 +36,7 @@ import {
36
36
  ValidationError,
37
37
  WSError,
38
38
  sanitizedSpawnEnv
39
- } from "./chunk-TU3GL2HK.mjs";
39
+ } from "./chunk-ZCMAJV2M.mjs";
40
40
  import "./chunk-7P6ASYW6.mjs";
41
41
 
42
42
  // src/lib/wsServer.ts
@@ -717,7 +717,7 @@ var handleJupyter = (conn, bubbleId, cwd) => Effect_exports.gen(function* () {
717
717
  Effect_exports.annotateLogs("cwd", cwd)
718
718
  );
719
719
  const { kernelManager } = yield* Effect_exports.tryPromise({
720
- try: () => import("./server-2UJDVZ32.mjs"),
720
+ try: () => import("./server-CQXVJT3F.mjs"),
721
721
  catch: (cause) => new AppError({
722
722
  message: "failed to import kernel manager",
723
723
  cause
@@ -844,13 +844,85 @@ var runJupyterHandler = (ws, bubbleId, cwd) => {
844
844
  };
845
845
 
846
846
  // src/lib/effect/terminalHandler.ts
847
- import { spawn, execFileSync, execSync } from "child_process";
847
+ import { spawn as spawn2, execSync as execSync2 } from "child_process";
848
848
  import * as nodePty from "node-pty";
849
+
850
+ // src/lib/shell.ts
851
+ import { existsSync as existsSync3 } from "fs";
852
+ import { execSync, spawn } from "child_process";
853
+ var bashCache;
854
+ var gitBashCache;
855
+ var pwshCache;
856
+ function resolveGitBash() {
857
+ if (!isWindows) return null;
858
+ if (gitBashCache !== void 0) return gitBashCache;
859
+ const envShell = process.env.SHELL;
860
+ const candidates = [
861
+ ...envShell && /bash(\.exe)?$/i.test(envShell) ? [envShell] : [],
862
+ "C:\\Program Files\\Git\\bin\\bash.exe",
863
+ "C:\\Program Files (x86)\\Git\\bin\\bash.exe",
864
+ ...process.env.ProgramFiles ? [`${process.env.ProgramFiles}\\Git\\bin\\bash.exe`] : []
865
+ ];
866
+ for (const c of candidates) {
867
+ if (existsSync3(c)) return gitBashCache = c;
868
+ }
869
+ return null;
870
+ }
871
+ function resolveWindowsPowerShell() {
872
+ if (pwshCache !== void 0) return pwshCache;
873
+ try {
874
+ const found = execSync("where pwsh", { encoding: "utf-8", timeout: 3e3 }).trim().split(/\r?\n/)[0];
875
+ if (found && existsSync3(found)) return pwshCache = found;
876
+ } catch {
877
+ }
878
+ return pwshCache = "powershell.exe";
879
+ }
880
+ function resolveBashShell() {
881
+ if (!isWindows) return getDefaultShell();
882
+ if (bashCache !== void 0) return bashCache;
883
+ const gitBash = resolveGitBash();
884
+ if (gitBash) return bashCache = gitBash;
885
+ try {
886
+ const found = execSync("where bash", { encoding: "utf-8", timeout: 3e3 }).trim().split(/\r?\n/)[0];
887
+ if (found && existsSync3(found)) return bashCache = found;
888
+ } catch {
889
+ }
890
+ return null;
891
+ }
892
+ function killProcessTree(child) {
893
+ const pid = child.pid;
894
+ if (!pid) return;
895
+ if (isWindows) {
896
+ try {
897
+ spawn("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore" });
898
+ } catch {
899
+ }
900
+ return;
901
+ }
902
+ const signal = (sig) => {
903
+ try {
904
+ process.kill(-pid, sig);
905
+ } catch {
906
+ try {
907
+ process.kill(pid, sig);
908
+ } catch {
909
+ }
910
+ }
911
+ };
912
+ signal("SIGTERM");
913
+ const timer = setTimeout(() => {
914
+ if (child.exitCode === null && child.signalCode === null) signal("SIGKILL");
915
+ }, 1e3);
916
+ if (typeof timer.unref === "function") timer.unref();
917
+ child.once("exit", () => clearTimeout(timer));
918
+ }
919
+
920
+ // src/lib/effect/terminalHandler.ts
849
921
  var HEARTBEAT5 = Schedule_exports.spaced("30 seconds");
850
922
  var OPEN_PREFERRED_SHELL_COMMAND = "__cockpit_open_preferred_shell__";
851
923
  function commandPath(command) {
852
924
  try {
853
- const found = execSync(`command -v ${command}`, {
925
+ const found = execSync2(`command -v ${command}`, {
854
926
  encoding: "utf-8",
855
927
  timeout: 3e3
856
928
  }).trim().split(/\r?\n/)[0];
@@ -865,66 +937,83 @@ function loginShellArgs(shell) {
865
937
  }
866
938
  function resolvePreferredPtyShell(cwd) {
867
939
  if (isWindows) {
868
- try {
869
- const wslShell = execFileSync(
870
- "wsl.exe",
871
- [
872
- "sh",
873
- "-lc",
874
- "command -v zsh >/dev/null 2>&1 && printf zsh || { command -v bash >/dev/null 2>&1 && printf bash; }"
875
- ],
876
- { encoding: "utf-8", timeout: 3e3 }
877
- ).trim();
878
- if (wslShell === "zsh" || wslShell === "bash") {
879
- return {
880
- file: "wsl.exe",
881
- args: ["--cd", cwd, "--exec", wslShell, ...loginShellArgs(wslShell)],
882
- cwd: process.cwd(),
883
- name: wslShell
884
- };
885
- }
886
- } catch {
887
- }
888
- } else {
889
- for (const shell of ["zsh", "bash", "sh"]) {
890
- const file = commandPath(shell);
891
- if (file) return { file, args: loginShellArgs(shell), cwd, name: shell };
940
+ const gitBash = resolveGitBash();
941
+ if (gitBash) {
942
+ return { file: gitBash, args: ["--login", "-i"], cwd, name: "bash" };
892
943
  }
944
+ const pwsh = resolveWindowsPowerShell();
945
+ const pwshName = pwsh.split(/[\\/]/).pop()?.replace(/\.exe$/i, "") || "powershell";
946
+ return { file: pwsh, args: ["-NoLogo"], cwd, name: pwshName };
947
+ }
948
+ for (const shell of ["zsh", "bash", "sh"]) {
949
+ const file = commandPath(shell);
950
+ if (file) return { file, args: loginShellArgs(shell), cwd, name: shell };
893
951
  }
894
952
  const fallback = getDefaultShell();
895
953
  const fallbackName = fallback.split(/[\\/]/).pop() || fallback;
896
954
  return {
897
955
  file: fallback,
898
- args: isWindows ? [] : loginShellArgs(fallbackName),
956
+ args: loginShellArgs(fallbackName),
899
957
  cwd,
900
958
  name: fallbackName
901
959
  };
902
960
  }
961
+ function resolveCommandShell() {
962
+ if (!isWindows) return getDefaultShell();
963
+ const bash = resolveBashShell();
964
+ if (bash) return bash;
965
+ throw new Error(
966
+ "bash not found \u2014 install Git Bash or WSL on Windows to run commands"
967
+ );
968
+ }
969
+ function windowsChildPidMap() {
970
+ const out = execSync2(
971
+ 'powershell -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId | ConvertTo-Csv -NoTypeInformation"',
972
+ { encoding: "utf-8", timeout: 5e3 }
973
+ );
974
+ const byParent = /* @__PURE__ */ new Map();
975
+ for (const line of out.split(/\r?\n/).slice(1)) {
976
+ const m = line.match(/^"?(\d+)"?,"?(\d+)"?/);
977
+ if (!m) continue;
978
+ const child = Number(m[1]);
979
+ const parent = Number(m[2]);
980
+ const bucket = byParent.get(parent);
981
+ if (bucket) bucket.push(child);
982
+ else byParent.set(parent, [child]);
983
+ }
984
+ return byParent;
985
+ }
903
986
  function getDescendantPids(pid) {
904
987
  const descendants = [];
988
+ if (isWindows) {
989
+ let byParent;
990
+ try {
991
+ byParent = windowsChildPidMap();
992
+ } catch {
993
+ return descendants;
994
+ }
995
+ const seen = /* @__PURE__ */ new Set([pid]);
996
+ const walk = (parentPid) => {
997
+ for (const child of byParent.get(parentPid) ?? []) {
998
+ if (seen.has(child)) continue;
999
+ seen.add(child);
1000
+ walk(child);
1001
+ descendants.push(child);
1002
+ }
1003
+ };
1004
+ walk(pid);
1005
+ return descendants;
1006
+ }
905
1007
  function collect(parentPid) {
906
1008
  try {
907
- let result;
908
- if (isWindows) {
909
- result = execSync(
910
- `wmic process where (ParentProcessId=${parentPid}) get ProcessId /format:list`,
911
- { encoding: "utf-8", timeout: 3e3 }
912
- ).trim();
913
- const childPids = result.split("\n").map((l) => l.replace(/\r/, "").match(/ProcessId=(\d+)/)?.[1]).filter(Boolean).map(Number);
914
- for (const cp of childPids) {
915
- collect(cp);
916
- descendants.push(cp);
917
- }
918
- } else {
919
- result = execSync(`pgrep -P ${parentPid}`, {
920
- encoding: "utf-8",
921
- timeout: 3e3
922
- }).trim();
923
- const childPids = result.split("\n").filter(Boolean).map(Number);
924
- for (const cp of childPids) {
925
- collect(cp);
926
- descendants.push(cp);
927
- }
1009
+ const result = execSync2(`pgrep -P ${parentPid}`, {
1010
+ encoding: "utf-8",
1011
+ timeout: 3e3
1012
+ }).trim();
1013
+ const childPids = result.split("\n").filter(Boolean).map(Number);
1014
+ for (const cp of childPids) {
1015
+ collect(cp);
1016
+ descendants.push(cp);
928
1017
  }
929
1018
  } catch {
930
1019
  }
@@ -1062,13 +1151,12 @@ var dispatchMessage = (msg, projectCwd, registry, send) => Effect_exports.sync((
1062
1151
  ...env
1063
1152
  };
1064
1153
  try {
1065
- const userShell = getDefaultShell();
1066
1154
  if (usePty) {
1067
1155
  const ptyEnv = { PATH: getDefaultPath() };
1068
1156
  for (const [k, v] of Object.entries(childEnv)) {
1069
1157
  if (v !== void 0) ptyEnv[k] = v;
1070
1158
  }
1071
- const ptyTarget = command === OPEN_PREFERRED_SHELL_COMMAND ? resolvePreferredPtyShell(cwd) : { file: userShell, args: ["--login", "-c", command], cwd, name: command };
1159
+ const ptyTarget = command === OPEN_PREFERRED_SHELL_COMMAND ? resolvePreferredPtyShell(cwd) : { file: resolveCommandShell(), args: ["--login", "-c", command], cwd, name: command };
1072
1160
  const ptyProcess = nodePty.spawn(
1073
1161
  ptyTarget.file,
1074
1162
  ptyTarget.args,
@@ -1080,7 +1168,6 @@ var dispatchMessage = (msg, projectCwd, registry, send) => Effect_exports.sync((
1080
1168
  env: ptyEnv
1081
1169
  }
1082
1170
  );
1083
- const dummyChild = spawn("true", [], { stdio: "ignore" });
1084
1171
  registerCommand({
1085
1172
  commandId,
1086
1173
  command: ptyTarget.name,
@@ -1088,7 +1175,6 @@ var dispatchMessage = (msg, projectCwd, registry, send) => Effect_exports.sync((
1088
1175
  projectCwd,
1089
1176
  tabId,
1090
1177
  pid: ptyProcess.pid,
1091
- process: dummyChild,
1092
1178
  ptyProcess,
1093
1179
  usePty: true,
1094
1180
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
@@ -1099,7 +1185,7 @@ var dispatchMessage = (msg, projectCwd, registry, send) => Effect_exports.sync((
1099
1185
  attachPtyListeners(registry, send, commandId, ptyProcess)
1100
1186
  );
1101
1187
  } else {
1102
- const child = spawn(userShell, ["--login", "-c", command], {
1188
+ const child = spawn2(resolveCommandShell(), ["--login", "-c", command], {
1103
1189
  cwd,
1104
1190
  env: childEnv,
1105
1191
  stdio: ["pipe", "pipe", "pipe"],
@@ -1168,7 +1254,7 @@ var dispatchMessage = (msg, projectCwd, registry, send) => Effect_exports.sync((
1168
1254
  Effect_exports.runFork(
1169
1255
  attachPtyListeners(registry, send, commandId, cmd.ptyProcess)
1170
1256
  );
1171
- } else {
1257
+ } else if (cmd.process) {
1172
1258
  Effect_exports.runFork(
1173
1259
  attachPipeListeners(registry, send, commandId, cmd.process)
1174
1260
  );
@@ -1270,60 +1356,6 @@ var runTerminalHandler = (ws, projectCwd) => {
1270
1356
 
1271
1357
  // src/lib/effect/bashStreamHandler.ts
1272
1358
  import { spawn as spawn4 } from "child_process";
1273
-
1274
- // src/lib/shell.ts
1275
- import { existsSync as existsSync3 } from "fs";
1276
- import { execSync as execSync2, spawn as spawn3 } from "child_process";
1277
- var bashCache;
1278
- function resolveBashShell() {
1279
- if (!isWindows) return getDefaultShell();
1280
- if (bashCache !== void 0) return bashCache;
1281
- const envShell = process.env.SHELL;
1282
- const candidates = [
1283
- ...envShell && /bash(\.exe)?$/i.test(envShell) ? [envShell] : [],
1284
- "C:\\Program Files\\Git\\bin\\bash.exe",
1285
- "C:\\Program Files (x86)\\Git\\bin\\bash.exe",
1286
- ...process.env.ProgramFiles ? [`${process.env.ProgramFiles}\\Git\\bin\\bash.exe`] : []
1287
- ];
1288
- for (const c of candidates) {
1289
- if (existsSync3(c)) return bashCache = c;
1290
- }
1291
- try {
1292
- const found = execSync2("where bash", { encoding: "utf-8", timeout: 3e3 }).trim().split(/\r?\n/)[0];
1293
- if (found && existsSync3(found)) return bashCache = found;
1294
- } catch {
1295
- }
1296
- return null;
1297
- }
1298
- function killProcessTree(child) {
1299
- const pid = child.pid;
1300
- if (!pid) return;
1301
- if (isWindows) {
1302
- try {
1303
- spawn3("taskkill", ["/PID", String(pid), "/T", "/F"], { stdio: "ignore" });
1304
- } catch {
1305
- }
1306
- return;
1307
- }
1308
- const signal = (sig) => {
1309
- try {
1310
- process.kill(-pid, sig);
1311
- } catch {
1312
- try {
1313
- process.kill(pid, sig);
1314
- } catch {
1315
- }
1316
- }
1317
- };
1318
- signal("SIGTERM");
1319
- const timer = setTimeout(() => {
1320
- if (child.exitCode === null && child.signalCode === null) signal("SIGKILL");
1321
- }, 1e3);
1322
- if (typeof timer.unref === "function") timer.unref();
1323
- child.once("exit", () => clearTimeout(timer));
1324
- }
1325
-
1326
- // src/lib/effect/bashStreamHandler.ts
1327
1359
  var HEARTBEAT6 = Schedule_exports.spaced("30 seconds");
1328
1360
  function killChild(child) {
1329
1361
  killProcessTree(child);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@surething/cockpit",
3
- "version": "1.0.261",
3
+ "version": "1.0.262",
4
4
  "description": "The open-source Claude Code GUI — an IDE-like workbench for parallel AI coding. Drive Claude (default), Codex, DeepSeek, Kimi, or local Ollama in tabs. Terminal, browser & DB bubbles, code review. Self-host on a shared dev box — a seat for every teammate. Local-first, MIT.",
5
5
  "author": "Robert",
6
6
  "license": "MIT",
package/server.mjs CHANGED
@@ -2,10 +2,11 @@ import { createServer } from 'http';
2
2
  import { createGzip, constants as zlibConstants } from 'zlib';
3
3
  import { exec, execSync } from 'child_process';
4
4
  import { networkInterfaces, homedir } from 'os';
5
- import { writeFileSync, mkdirSync, readFileSync, realpathSync } from 'fs';
5
+ import { writeFileSync, mkdirSync, readFileSync, realpathSync, unlinkSync } from 'fs';
6
6
  import { join, dirname, resolve } from 'path';
7
7
  import { fileURLToPath } from 'url';
8
8
  import next from 'next';
9
+ import { rotateIfLarge } from './bin/rotateLog.mjs';
9
10
 
10
11
  const __dirname = dirname(fileURLToPath(import.meta.url));
11
12
  process.env.COCKPIT_ROOT = __dirname;
@@ -26,6 +27,34 @@ const cockpitHome = process.env.COCKPIT_HOME
26
27
  // path if it doesn't exist yet.
27
28
  const normHome = (p) => { try { return realpathSync(p); } catch { return p; } };
28
29
 
30
+ const SERVER_JSON = join(cockpitHome, 'server.json');
31
+
32
+ // Read once at boot. `version` backs `cockpit status` (process.env
33
+ // npm_package_version is only set when launched through an npm script, so it is
34
+ // null under `node server.mjs` / a service unit). `buildId` identifies the
35
+ // frontend assets this process serves — a browser tab left open across an
36
+ // upgrade still references the previous build's content-hashed chunks, which no
37
+ // longer exist on disk.
38
+ function readBuildInfo() {
39
+ let version = null;
40
+ try {
41
+ version = JSON.parse(readFileSync(join(__dirname, 'package.json'), 'utf8')).version;
42
+ } catch { /* unreadable package.json — report null rather than fail boot */ }
43
+ let buildId = null;
44
+ try {
45
+ buildId = readFileSync(join(__dirname, '.next-prod', 'BUILD_ID'), 'utf8').trim();
46
+ } catch { /* dev mode has no prebuilt BUILD_ID */ }
47
+ return { version, buildId };
48
+ }
49
+ const buildInfo = readBuildInfo();
50
+ // Expose to the app layer. /api/health used to report
51
+ // process.env.npm_package_version, which npm only sets when the process was
52
+ // launched through an npm script — under `node server.mjs`, a service unit, or
53
+ // the global bin it was always null, so the health probe's version field was
54
+ // dead weight.
55
+ if (buildInfo.version) process.env.COCKPIT_VERSION = buildInfo.version;
56
+ if (buildInfo.buildId) process.env.COCKPIT_BUILD_ID = buildInfo.buildId;
57
+
29
58
  // Single-instance-per-data-dir guard. Probe the recorded instance's /api/health: if a live
30
59
  // cockpit on THIS data dir answers (app === 'cockpit' && home === this data dir), refuse and
31
60
  // point the user at COCKPIT_HOME. Connection refused / timeout / wrong signature → stale → take
@@ -34,7 +63,7 @@ const normHome = (p) => { try { return realpathSync(p); } catch { return p; } };
34
63
  async function ensureSingleInstance() {
35
64
  if (process.env.COCKPIT_FORCE) return;
36
65
  let prev;
37
- try { prev = JSON.parse(readFileSync(join(cockpitHome, 'server.json'), 'utf8')); } catch { return; }
66
+ try { prev = JSON.parse(readFileSync(SERVER_JSON, 'utf8')); } catch { return; }
38
67
  if (!prev || !prev.port) return;
39
68
  try {
40
69
  const ac = new AbortController();
@@ -47,7 +76,7 @@ async function ensureSingleInstance() {
47
76
  console.error(` Data dir: ${cockpitHome}`);
48
77
  console.error(` To run a second instance, isolate it with COCKPIT_HOME, e.g.:`);
49
78
  console.error(` COCKPIT_HOME=~/.cockpit-alt cockpit`);
50
- console.error(` False alarm? Delete ${join(cockpitHome, 'server.json')} or set COCKPIT_FORCE=1.\n`);
79
+ console.error(` False alarm? Delete ${SERVER_JSON} or set COCKPIT_FORCE=1.\n`);
51
80
  process.exit(1);
52
81
  }
53
82
  } catch { /* connection refused / timeout / non-cockpit → stale, proceed */ }
@@ -77,23 +106,66 @@ async function ensureSingleInstance() {
77
106
  let flushRunningSync = null;
78
107
 
79
108
  let _cleanupRan = false;
109
+
110
+ /**
111
+ * A child that must OUTLIVE us, registered on globalThis by /api/update.
112
+ *
113
+ * The updater is spawned by this process and then has to keep running after we
114
+ * exit — it is what reinstalls the package and starts the replacement server.
115
+ * `detached: true` is not enough: it moves the child into its own session and
116
+ * process group but leaves the parent/child relationship intact, so the
117
+ * `pkill -P <us>` below still matches it. Without this exclusion the server
118
+ * kills the very process that was supposed to bring it back, and the update
119
+ * stops dead with the server down.
120
+ *
121
+ * Read through globalThis because the route lives in Next's module graph and
122
+ * cannot import this file.
123
+ */
124
+ function handedOffPid() {
125
+ const pid = globalThis.__cockpitHandedOffPid;
126
+ return typeof pid === 'number' && pid > 0 ? pid : null;
127
+ }
128
+
80
129
  function killChildren() {
81
130
  if (_cleanupRan) return;
82
131
  _cleanupRan = true;
132
+ const spare = handedOffPid();
83
133
  if (process.platform === 'win32') {
84
- // Windows: list child PIDs via wmic, then taskkill /F /T each one —
85
- // running /T on ourselves would take this process down too
134
+ // Windows: list child PIDs, then taskkill /F /T each one — running /T on
135
+ // ourselves would take this process down too.
136
+ //
137
+ // This used to shell out to `wmic`, which is deprecated and absent by
138
+ // default from Windows 11 24H2; the failure was swallowed by the catch, so
139
+ // orphaned next-server workers were left running. PowerShell's CIM cmdlet
140
+ // is the supported replacement.
86
141
  try {
87
- const out = execSync(`wmic process where (ParentProcessId=${process.pid}) get ProcessId /value`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
88
- const pids = (out.match(/ProcessId=(\d+)/g) || []).map(s => s.split('=')[1]).filter(Boolean);
142
+ const out = execSync(
143
+ `powershell -NoProfile -NonInteractive -Command "Get-CimInstance Win32_Process -Filter 'ParentProcessId=${process.pid}' | Select-Object -ExpandProperty ProcessId"`,
144
+ { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'], timeout: 5000 }
145
+ );
146
+ const pids = out.split(/\r?\n/).map(s => s.trim()).filter(s => /^\d+$/.test(s));
89
147
  for (const pid of pids) {
148
+ if (spare && Number(pid) === spare) continue;
90
149
  try { execSync(`taskkill /F /T /PID ${pid}`, { stdio: 'ignore' }); } catch {}
91
150
  }
92
151
  } catch {}
93
152
  return;
94
153
  }
95
- // POSIX: pkill -P kills direct children only, no recursion (next-server
96
- // and friends are all direct children — enough).
154
+ // POSIX: direct children only, no recursion (next-server and friends are all
155
+ // direct children — enough).
156
+ if (spare) {
157
+ // Enumerate and signal individually so the handed-off updater can be
158
+ // skipped; `pkill -P` has no exclusion form.
159
+ try {
160
+ const out = execSync(`pgrep -P ${process.pid}`, { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
161
+ for (const line of out.split('\n')) {
162
+ const pid = Number(line.trim());
163
+ if (!pid || pid === spare) continue;
164
+ try { process.kill(pid, 'SIGTERM'); } catch {}
165
+ }
166
+ } catch { /* pgrep exits 1 when there are no children */ }
167
+ return;
168
+ }
97
169
  // pkill exits 1 when nothing matches; not treated as an error.
98
170
  try { execSync(`pkill -TERM -P ${process.pid}`, { stdio: 'ignore' }); } catch {}
99
171
  }
@@ -103,8 +175,21 @@ function killChildren() {
103
175
  // through process.exit() → 'exit' fires → this single hook covers every
104
176
  // graceful shutdown. Flush live PTY scrollback to disk first, then kill the
105
177
  // children (the flush reads this process's own memory — independent of them).
178
+ // Best-effort: drop our server.json on the way out so `cockpit status` says
179
+ // "not running" straight away instead of probing a dead port. Guarded by pid so
180
+ // we never delete a record a newer instance has since written. A hard kill
181
+ // (SIGKILL) skips this entirely — which is why status probes /api/health rather
182
+ // than trusting the file's existence.
183
+ function removeServerJson() {
184
+ try {
185
+ const rec = JSON.parse(readFileSync(SERVER_JSON, 'utf8'));
186
+ if (rec && rec.pid === process.pid) unlinkSync(SERVER_JSON);
187
+ } catch { /* absent, unreadable, or not ours */ }
188
+ }
189
+
106
190
  process.on('exit', () => {
107
191
  try { flushRunningSync?.(); } catch {}
192
+ removeServerJson();
108
193
  killChildren();
109
194
  });
110
195
 
@@ -173,6 +258,17 @@ const handle = app.getRequestHandler();
173
258
 
174
259
  app.prepare().then(async () => {
175
260
  await ensureSingleInstance();
261
+
262
+ // Rotate the app log — AFTER the single-instance check, never before. A
263
+ // second `cockpit` on the same data dir is rejected above, and if it had
264
+ // rotated first it would have consumed a generation of a *running*
265
+ // instance's history just by failing to start.
266
+ //
267
+ // Safe to do here because the Effect logger appends per write (fs/promises
268
+ // appendFile) rather than holding an fd, so nothing has the file open and it
269
+ // recreates it on the next line. This is also what makes it work on Windows,
270
+ // where renaming a file that some process holds open fails outright.
271
+ rotateIfLarge(join(cockpitHome, 'logs', 'cockpit.log'));
176
272
  const upgradeHandler = app.getUpgradeHandler();
177
273
  // v2 P8: HTTP intercepts (handleTerminalApi / handleBrowserApi) moved to src/lib/httpApi.ts
178
274
  const { handleUpgrade, broadcastToGlobalState } = await import(dev ? './src/lib/wsServer.ts' : './dist/wsServer.mjs');
@@ -363,10 +459,30 @@ app.prepare().then(async () => {
363
459
  const url = `http://localhost:${port}`;
364
460
  console.log(`> Ready on ${url}`);
365
461
 
366
- // Write server.json so CLI subcommands can read the port
462
+ // Discoverability: `cockpit start` is the only way to survive closing the
463
+ // terminal (there is no service integration), but nothing else advertises
464
+ // it. Only worth saying when we ARE in the foreground — a backgrounded
465
+ // instance's operator already knows.
466
+ if ((process.env.COCKPIT_MANAGED || 'foreground') === 'foreground') {
467
+ console.log(' Tip: `cockpit start` runs it in the background — then this terminal can be closed.');
468
+ }
469
+
470
+ // Write server.json so CLI subcommands can read the port, and so
471
+ // `cockpit status` / `stop` can find and identify this instance.
367
472
  try {
368
473
  mkdirSync(cockpitHome, { recursive: true });
369
- writeFileSync(join(cockpitHome, 'server.json'), JSON.stringify({ pid: process.pid, port }, null, 2));
474
+ writeFileSync(SERVER_JSON, JSON.stringify({
475
+ pid: process.pid,
476
+ port,
477
+ version: buildInfo.version,
478
+ buildId: buildInfo.buildId,
479
+ startedAt: Date.now(),
480
+ // How this process is supervised, set by whoever launched it:
481
+ // 'foreground' (plain `cockpit`), 'bare' (`cockpit start`), or a
482
+ // service manager later on. `cockpit stop` uses it to decide whether
483
+ // stopping also means telling a supervisor not to restart us.
484
+ managed: process.env.COCKPIT_MANAGED || 'foreground',
485
+ }, null, 2));
370
486
  } catch {}
371
487
 
372
488
  // Auto-open the browser in prod mode (disable with --no-open)