@surething/cockpit 1.0.243 → 1.0.245

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 (638) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +5 -2
  3. package/.next-prod/build-manifest.json +2 -2
  4. package/.next-prod/prerender-manifest.json +3 -3
  5. package/.next-prod/routes-manifest.json +20 -0
  6. package/.next-prod/server/app/_global-error/page.js +2 -2
  7. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  8. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next-prod/server/app/_global-error.html +1 -1
  10. package/.next-prod/server/app/_global-error.rsc +1 -1
  11. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next-prod/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  14. package/.next-prod/server/app/_global-error.segments/_head.segment.rsc +1 -1
  15. package/.next-prod/server/app/_global-error.segments/_index.segment.rsc +1 -1
  16. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  17. package/.next-prod/server/app/_not-found/page.js +2 -2
  18. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  19. package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
  20. package/.next-prod/server/app/_not-found.html +2 -2
  21. package/.next-prod/server/app/_not-found.rsc +4 -4
  22. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +4 -4
  23. package/.next-prod/server/app/_not-found.segments/_head.segment.rsc +1 -1
  24. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  25. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  26. package/.next-prod/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  27. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  28. package/.next-prod/server/app/api/agent/test/route.js +1 -1
  29. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  30. package/.next-prod/server/app/api/bash/route.js +1 -1
  31. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  32. package/.next-prod/server/app/api/chat/codex/route.js +2 -2
  33. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  34. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  35. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  36. package/.next-prod/server/app/api/chat/kimi/route.js +2 -2
  37. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/chat/ollama/route.js +1 -1
  39. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/chat/pty-input/route.js +1 -1
  41. package/.next-prod/server/app/api/chat/pty-input/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/chat/route.js +1 -1
  43. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  45. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/claude-stats/route.js +1 -1
  47. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/commands/route.js +1 -1
  49. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/comments/route.js +1 -1
  51. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/db/columns/route.js +2 -2
  53. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/db/connect/route.js +2 -2
  55. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/db/disconnect/route.js +1 -1
  57. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/db/export/route.js +1 -1
  59. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/db/query/route.js +1 -1
  61. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/db/schemas/route.js +1 -1
  63. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
  65. package/.next-prod/server/app/api/deepseek/credentials/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/branch-diff/route.js +1 -1
  103. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/git/branches/route.js +1 -1
  105. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/git/commit-diff/route.js +1 -1
  107. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/git/commits/route.js +1 -1
  109. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/git/current-branch/route.js +1 -1
  111. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/git/diff/route.js +1 -1
  113. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/git/discard/route.js +1 -1
  115. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/git/stage/route.js +1 -1
  117. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/git/status/route.js +1 -1
  119. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/git/unstage/route.js +1 -1
  121. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  122. package/.next-prod/server/app/api/git/worktree/route.js +1 -1
  123. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/global-state/route.js +2 -2
  125. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/health/route.js +1 -1
  127. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -0
  129. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -0
  130. package/.next-prod/server/app/api/html-apps/[id]/route_client-reference-manifest.js +1 -0
  131. package/.next-prod/server/app/api/html-apps/route.js +1 -0
  132. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -0
  133. package/.next-prod/server/app/api/html-apps/route_client-reference-manifest.js +1 -0
  134. package/.next-prod/server/app/api/jupyter/load/route.js +1 -1
  135. package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/jupyter/save/route.js +1 -1
  137. package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/jupyter/shutdown/route.js +1 -1
  139. package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
  140. package/.next-prod/server/app/api/lsp/definition/route.js +1 -1
  141. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/lsp/hover/route.js +1 -1
  143. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  144. package/.next-prod/server/app/api/lsp/references/route.js +1 -1
  145. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/lsp/status/route.js +1 -1
  147. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/lsp/warmup/route.js +1 -1
  149. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/mysql/columns/route.js +1 -1
  151. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/mysql/connect/route.js +1 -1
  153. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/mysql/disconnect/route.js +1 -1
  155. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/mysql/export/route.js +1 -1
  157. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/mysql/query/route.js +1 -1
  159. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/mysql/schemas/route.js +2 -2
  161. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/neo4j/connect/route.js +1 -1
  163. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/api/neo4j/disconnect/route.js +1 -1
  165. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/api/neo4j/query/route.js +1 -1
  167. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/neo4j/schema/route.js +1 -1
  169. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/note/route.js +1 -1
  171. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/ollama/config/route.js +1 -0
  173. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -0
  174. package/.next-prod/server/app/api/ollama/config/route_client-reference-manifest.js +1 -0
  175. package/.next-prod/server/app/api/ollama/models/route.js +1 -1
  176. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  177. package/.next-prod/server/app/api/ollama/start/route.js +1 -1
  178. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  179. package/.next-prod/server/app/api/open-cursor/route.js +1 -1
  180. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  181. package/.next-prod/server/app/api/open-vscode/route.js +1 -1
  182. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  183. package/.next-prod/server/app/api/pick-folder/route.js +1 -1
  184. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  185. package/.next-prod/server/app/api/pinned-sessions/route.js +1 -1
  186. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  187. package/.next-prod/server/app/api/preview/[...path]/route.js +1 -1
  188. package/.next-prod/server/app/api/preview/[...path]/route.js.nft.json +1 -1
  189. package/.next-prod/server/app/api/project-settings/route.js +1 -1
  190. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  191. package/.next-prod/server/app/api/project-state/route.js +2 -2
  192. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  193. package/.next-prod/server/app/api/projectGraph/affected/route.js +1 -1
  194. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  195. package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
  196. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  197. package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
  198. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  199. package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
  200. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  201. package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
  202. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  203. package/.next-prod/server/app/api/projectGraph/file/route.js +1 -1
  204. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  205. package/.next-prod/server/app/api/projectGraph/file-functions/route.js +1 -1
  206. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  207. package/.next-prod/server/app/api/projectGraph/impact/route.js +1 -1
  208. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  209. package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
  210. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  211. package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
  212. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  213. package/.next-prod/server/app/api/projectGraph/search/route.js +1 -1
  214. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  215. package/.next-prod/server/app/api/projects/route.js +1 -1
  216. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  217. package/.next-prod/server/app/api/push/public-key/route.js +1 -1
  218. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  219. package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
  220. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  221. package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
  222. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  223. package/.next-prod/server/app/api/redis/command/route.js +1 -1
  224. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  225. package/.next-prod/server/app/api/redis/connect/route.js +1 -1
  226. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  227. package/.next-prod/server/app/api/redis/delete/route.js +1 -1
  228. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  229. package/.next-prod/server/app/api/redis/disconnect/route.js +1 -1
  230. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  231. package/.next-prod/server/app/api/redis/get/route.js +1 -1
  232. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  233. package/.next-prod/server/app/api/redis/keys/route.js +1 -1
  234. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  235. package/.next-prod/server/app/api/redis/set/route.js +1 -1
  236. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  237. package/.next-prod/server/app/api/review/[id]/comments/route.js +1 -1
  238. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  239. package/.next-prod/server/app/api/review/[id]/replies/route.js +1 -1
  240. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  241. package/.next-prod/server/app/api/review/[id]/route.js +1 -1
  242. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  243. package/.next-prod/server/app/api/review/identify/route.js +1 -1
  244. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  245. package/.next-prod/server/app/api/review/order/route.js +1 -1
  246. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  247. package/.next-prod/server/app/api/review/route.js +1 -1
  248. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  249. package/.next-prod/server/app/api/review/share-info/route.js +1 -1
  250. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  251. package/.next-prod/server/app/api/review/users/route.js +1 -1
  252. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  253. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  254. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  255. package/.next-prod/server/app/api/services/config/route.js +1 -1
  256. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  257. package/.next-prod/server/app/api/services/scripts/route.js +1 -1
  258. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  259. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  260. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  261. package/.next-prod/server/app/api/session/[sessionId]/history/route.js +1 -1
  262. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  263. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  264. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  265. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  266. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  267. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  268. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  269. package/.next-prod/server/app/api/sessions/route.js +1 -1
  270. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  271. package/.next-prod/server/app/api/settings/route.js +1 -1
  272. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  273. package/.next-prod/server/app/api/skills/[id]/route.js +1 -1
  274. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  275. package/.next-prod/server/app/api/skills/content/route.js +1 -1
  276. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  277. package/.next-prod/server/app/api/skills/route.js +1 -1
  278. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  279. package/.next-prod/server/app/api/snapshots/diff/route.js +1 -1
  280. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  281. package/.next-prod/server/app/api/snapshots/route.js +1 -1
  282. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  283. package/.next-prod/server/app/api/terminal/aliases/route.js +1 -1
  284. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  285. package/.next-prod/server/app/api/terminal/autocomplete/route.js +1 -1
  286. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  287. package/.next-prod/server/app/api/terminal/bubble-order/route.js +1 -1
  288. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  289. package/.next-prod/server/app/api/terminal/env/route.js +1 -1
  290. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  291. package/.next-prod/server/app/api/terminal/history/route.js +1 -1
  292. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  293. package/.next-prod/server/app/api/version/route.js +1 -1
  294. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  295. package/.next-prod/server/app/favicon.ico/route.js +1 -1
  296. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  297. package/.next-prod/server/app/favicon.ico.body +0 -0
  298. package/.next-prod/server/app/m/page.js +2 -2
  299. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  300. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  301. package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
  302. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  303. package/.next-prod/server/app/page.js +2 -2
  304. package/.next-prod/server/app/page.js.nft.json +1 -1
  305. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  306. package/.next-prod/server/app/project/page.js +2 -2
  307. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  308. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  309. package/.next-prod/server/app/review/[id]/page.js +2 -2
  310. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  311. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  312. package/.next-prod/server/app-paths-manifest.json +5 -2
  313. package/.next-prod/server/chunks/1813.js +1 -1
  314. package/.next-prod/server/chunks/2939.js +1 -1
  315. package/.next-prod/server/chunks/304.js +1 -1
  316. package/.next-prod/server/chunks/{5674.js → 3282.js} +5 -5
  317. package/.next-prod/server/chunks/4848.js +287 -3
  318. package/.next-prod/server/chunks/4916.js +177 -0
  319. package/.next-prod/server/chunks/6038.js +1 -0
  320. package/.next-prod/server/chunks/7338.js +4 -4
  321. package/.next-prod/server/chunks/9658.js +188 -12
  322. package/.next-prod/server/chunks/9830.js +1 -1
  323. package/.next-prod/server/middleware-build-manifest.js +1 -1
  324. package/.next-prod/server/pages/404.html +2 -2
  325. package/.next-prod/server/pages/500.html +1 -1
  326. package/.next-prod/server/server-reference-manifest.json +1 -1
  327. package/.next-prod/static/PlTlBBOBl0rKPGTdXqONe/_buildManifest.js +1 -0
  328. package/.next-prod/static/chunks/{1973-5ba02ae354968836.js → 2443-e80dab81d8fc10ab.js} +2 -2
  329. package/.next-prod/static/chunks/{7849-7c580c908fe21e9d.js → 4473-6877df387a4a05a5.js} +2 -2
  330. package/.next-prod/static/chunks/6784-0122b1622ba5c509.js +0 -0
  331. package/.next-prod/static/chunks/8010-2f5cec4469580ed9.js +25 -0
  332. package/.next-prod/static/chunks/9530-cb2a4490ee7128d8.js +191 -0
  333. package/.next-prod/static/chunks/app/_global-error/page-e255a9d1bcc8de59.js +1 -0
  334. package/.next-prod/static/chunks/app/api/agent/test/route-e255a9d1bcc8de59.js +1 -0
  335. package/.next-prod/static/chunks/app/api/bash/route-e255a9d1bcc8de59.js +1 -0
  336. package/.next-prod/static/chunks/app/api/chat/codex/route-e255a9d1bcc8de59.js +1 -0
  337. package/.next-prod/static/chunks/app/api/chat/deepseek/route-e255a9d1bcc8de59.js +1 -0
  338. package/.next-prod/static/chunks/app/api/chat/kimi/route-e255a9d1bcc8de59.js +1 -0
  339. package/.next-prod/static/chunks/app/api/chat/ollama/route-e255a9d1bcc8de59.js +1 -0
  340. package/.next-prod/static/chunks/app/api/chat/pty-input/route-e255a9d1bcc8de59.js +1 -0
  341. package/.next-prod/static/chunks/app/api/chat/route-e255a9d1bcc8de59.js +1 -0
  342. package/.next-prod/static/chunks/app/api/chat/stop/route-e255a9d1bcc8de59.js +1 -0
  343. package/.next-prod/static/chunks/app/api/claude-stats/route-e255a9d1bcc8de59.js +1 -0
  344. package/.next-prod/static/chunks/app/api/commands/route-e255a9d1bcc8de59.js +1 -0
  345. package/.next-prod/static/chunks/app/api/comments/route-e255a9d1bcc8de59.js +1 -0
  346. package/.next-prod/static/chunks/app/api/db/columns/route-e255a9d1bcc8de59.js +1 -0
  347. package/.next-prod/static/chunks/app/api/db/connect/route-e255a9d1bcc8de59.js +1 -0
  348. package/.next-prod/static/chunks/app/api/db/disconnect/route-e255a9d1bcc8de59.js +1 -0
  349. package/.next-prod/static/chunks/app/api/db/export/route-e255a9d1bcc8de59.js +1 -0
  350. package/.next-prod/static/chunks/app/api/db/query/route-e255a9d1bcc8de59.js +1 -0
  351. package/.next-prod/static/chunks/app/api/db/schemas/route-e255a9d1bcc8de59.js +1 -0
  352. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-e255a9d1bcc8de59.js +1 -0
  353. package/.next-prod/static/chunks/app/api/dev/spans/route-e255a9d1bcc8de59.js +1 -0
  354. package/.next-prod/static/chunks/app/api/extension/version/route-e255a9d1bcc8de59.js +1 -0
  355. package/.next-prod/static/chunks/app/api/file/route-e255a9d1bcc8de59.js +1 -0
  356. package/.next-prod/static/chunks/app/api/files/blame/route-e255a9d1bcc8de59.js +1 -0
  357. package/.next-prod/static/chunks/app/api/files/clipboard/route-e255a9d1bcc8de59.js +1 -0
  358. package/.next-prod/static/chunks/app/api/files/copy/route-e255a9d1bcc8de59.js +1 -0
  359. package/.next-prod/static/chunks/app/api/files/delete/route-e255a9d1bcc8de59.js +1 -0
  360. package/.next-prod/static/chunks/app/api/files/expanded/route-e255a9d1bcc8de59.js +1 -0
  361. package/.next-prod/static/chunks/app/api/files/index/route-e255a9d1bcc8de59.js +1 -0
  362. package/.next-prod/static/chunks/app/api/files/init/route-e255a9d1bcc8de59.js +1 -0
  363. package/.next-prod/static/chunks/app/api/files/paste/route-e255a9d1bcc8de59.js +1 -0
  364. package/.next-prod/static/chunks/app/api/files/read/route-e255a9d1bcc8de59.js +1 -0
  365. package/.next-prod/static/chunks/app/api/files/readdir/route-e255a9d1bcc8de59.js +1 -0
  366. package/.next-prod/static/chunks/app/api/files/recent/route-e255a9d1bcc8de59.js +1 -0
  367. package/.next-prod/static/chunks/app/api/files/save/route-e255a9d1bcc8de59.js +1 -0
  368. package/.next-prod/static/chunks/app/api/files/search/route-e255a9d1bcc8de59.js +1 -0
  369. package/.next-prod/static/chunks/app/api/files/stat/route-e255a9d1bcc8de59.js +1 -0
  370. package/.next-prod/static/chunks/app/api/files/text/route-e255a9d1bcc8de59.js +1 -0
  371. package/.next-prod/static/chunks/app/api/git/branch-diff/route-e255a9d1bcc8de59.js +1 -0
  372. package/.next-prod/static/chunks/app/api/git/branches/route-e255a9d1bcc8de59.js +1 -0
  373. package/.next-prod/static/chunks/app/api/git/commit-diff/route-e255a9d1bcc8de59.js +1 -0
  374. package/.next-prod/static/chunks/app/api/git/commits/route-e255a9d1bcc8de59.js +1 -0
  375. package/.next-prod/static/chunks/app/api/git/current-branch/route-e255a9d1bcc8de59.js +1 -0
  376. package/.next-prod/static/chunks/app/api/git/diff/route-e255a9d1bcc8de59.js +1 -0
  377. package/.next-prod/static/chunks/app/api/git/discard/route-e255a9d1bcc8de59.js +1 -0
  378. package/.next-prod/static/chunks/app/api/git/stage/route-e255a9d1bcc8de59.js +1 -0
  379. package/.next-prod/static/chunks/app/api/git/status/route-e255a9d1bcc8de59.js +1 -0
  380. package/.next-prod/static/chunks/app/api/git/unstage/route-e255a9d1bcc8de59.js +1 -0
  381. package/.next-prod/static/chunks/app/api/git/worktree/route-e255a9d1bcc8de59.js +1 -0
  382. package/.next-prod/static/chunks/app/api/global-state/route-e255a9d1bcc8de59.js +1 -0
  383. package/.next-prod/static/chunks/app/api/health/route-e255a9d1bcc8de59.js +1 -0
  384. package/.next-prod/static/chunks/app/api/html-apps/[id]/route-e255a9d1bcc8de59.js +1 -0
  385. package/.next-prod/static/chunks/app/api/html-apps/route-e255a9d1bcc8de59.js +1 -0
  386. package/.next-prod/static/chunks/app/api/jupyter/load/route-e255a9d1bcc8de59.js +1 -0
  387. package/.next-prod/static/chunks/app/api/jupyter/save/route-e255a9d1bcc8de59.js +1 -0
  388. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-e255a9d1bcc8de59.js +1 -0
  389. package/.next-prod/static/chunks/app/api/lsp/definition/route-e255a9d1bcc8de59.js +1 -0
  390. package/.next-prod/static/chunks/app/api/lsp/hover/route-e255a9d1bcc8de59.js +1 -0
  391. package/.next-prod/static/chunks/app/api/lsp/references/route-e255a9d1bcc8de59.js +1 -0
  392. package/.next-prod/static/chunks/app/api/lsp/status/route-e255a9d1bcc8de59.js +1 -0
  393. package/.next-prod/static/chunks/app/api/lsp/warmup/route-e255a9d1bcc8de59.js +1 -0
  394. package/.next-prod/static/chunks/app/api/mysql/columns/route-e255a9d1bcc8de59.js +1 -0
  395. package/.next-prod/static/chunks/app/api/mysql/connect/route-e255a9d1bcc8de59.js +1 -0
  396. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-e255a9d1bcc8de59.js +1 -0
  397. package/.next-prod/static/chunks/app/api/mysql/export/route-e255a9d1bcc8de59.js +1 -0
  398. package/.next-prod/static/chunks/app/api/mysql/query/route-e255a9d1bcc8de59.js +1 -0
  399. package/.next-prod/static/chunks/app/api/mysql/schemas/route-e255a9d1bcc8de59.js +1 -0
  400. package/.next-prod/static/chunks/app/api/neo4j/connect/route-e255a9d1bcc8de59.js +1 -0
  401. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-e255a9d1bcc8de59.js +1 -0
  402. package/.next-prod/static/chunks/app/api/neo4j/query/route-e255a9d1bcc8de59.js +1 -0
  403. package/.next-prod/static/chunks/app/api/neo4j/schema/route-e255a9d1bcc8de59.js +1 -0
  404. package/.next-prod/static/chunks/app/api/note/route-e255a9d1bcc8de59.js +1 -0
  405. package/.next-prod/static/chunks/app/api/ollama/config/route-e255a9d1bcc8de59.js +1 -0
  406. package/.next-prod/static/chunks/app/api/ollama/models/route-e255a9d1bcc8de59.js +1 -0
  407. package/.next-prod/static/chunks/app/api/ollama/start/route-e255a9d1bcc8de59.js +1 -0
  408. package/.next-prod/static/chunks/app/api/open-cursor/route-e255a9d1bcc8de59.js +1 -0
  409. package/.next-prod/static/chunks/app/api/open-vscode/route-e255a9d1bcc8de59.js +1 -0
  410. package/.next-prod/static/chunks/app/api/pick-folder/route-e255a9d1bcc8de59.js +1 -0
  411. package/.next-prod/static/chunks/app/api/pinned-sessions/route-e255a9d1bcc8de59.js +1 -0
  412. package/.next-prod/static/chunks/app/api/preview/[...path]/route-e255a9d1bcc8de59.js +1 -0
  413. package/.next-prod/static/chunks/app/api/project-settings/route-e255a9d1bcc8de59.js +1 -0
  414. package/.next-prod/static/chunks/app/api/project-state/route-e255a9d1bcc8de59.js +1 -0
  415. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-e255a9d1bcc8de59.js +1 -0
  416. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-e255a9d1bcc8de59.js +1 -0
  417. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-e255a9d1bcc8de59.js +1 -0
  418. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-e255a9d1bcc8de59.js +1 -0
  419. package/.next-prod/static/chunks/app/api/projectGraph/context/route-e255a9d1bcc8de59.js +1 -0
  420. package/.next-prod/static/chunks/app/api/projectGraph/file/route-e255a9d1bcc8de59.js +1 -0
  421. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-e255a9d1bcc8de59.js +1 -0
  422. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-e255a9d1bcc8de59.js +1 -0
  423. package/.next-prod/static/chunks/app/api/projectGraph/related/route-e255a9d1bcc8de59.js +1 -0
  424. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-e255a9d1bcc8de59.js +1 -0
  425. package/.next-prod/static/chunks/app/api/projectGraph/search/route-e255a9d1bcc8de59.js +1 -0
  426. package/.next-prod/static/chunks/app/api/projects/route-e255a9d1bcc8de59.js +1 -0
  427. package/.next-prod/static/chunks/app/api/push/public-key/route-e255a9d1bcc8de59.js +1 -0
  428. package/.next-prod/static/chunks/app/api/push/subscribe/route-e255a9d1bcc8de59.js +1 -0
  429. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-e255a9d1bcc8de59.js +1 -0
  430. package/.next-prod/static/chunks/app/api/redis/command/route-e255a9d1bcc8de59.js +1 -0
  431. package/.next-prod/static/chunks/app/api/redis/connect/route-e255a9d1bcc8de59.js +1 -0
  432. package/.next-prod/static/chunks/app/api/redis/delete/route-e255a9d1bcc8de59.js +1 -0
  433. package/.next-prod/static/chunks/app/api/redis/disconnect/route-e255a9d1bcc8de59.js +1 -0
  434. package/.next-prod/static/chunks/app/api/redis/get/route-e255a9d1bcc8de59.js +1 -0
  435. package/.next-prod/static/chunks/app/api/redis/keys/route-e255a9d1bcc8de59.js +1 -0
  436. package/.next-prod/static/chunks/app/api/redis/set/route-e255a9d1bcc8de59.js +1 -0
  437. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-e255a9d1bcc8de59.js +1 -0
  438. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-e255a9d1bcc8de59.js +1 -0
  439. package/.next-prod/static/chunks/app/api/review/[id]/route-e255a9d1bcc8de59.js +1 -0
  440. package/.next-prod/static/chunks/app/api/review/identify/route-e255a9d1bcc8de59.js +1 -0
  441. package/.next-prod/static/chunks/app/api/review/order/route-e255a9d1bcc8de59.js +1 -0
  442. package/.next-prod/static/chunks/app/api/review/route-e255a9d1bcc8de59.js +1 -0
  443. package/.next-prod/static/chunks/app/api/review/share-info/route-e255a9d1bcc8de59.js +1 -0
  444. package/.next-prod/static/chunks/app/api/review/users/route-e255a9d1bcc8de59.js +1 -0
  445. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-e255a9d1bcc8de59.js +1 -0
  446. package/.next-prod/static/chunks/app/api/services/config/route-e255a9d1bcc8de59.js +1 -0
  447. package/.next-prod/static/chunks/app/api/services/scripts/route-e255a9d1bcc8de59.js +1 -0
  448. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-e255a9d1bcc8de59.js +1 -0
  449. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-e255a9d1bcc8de59.js +1 -0
  450. package/.next-prod/static/chunks/app/api/session-by-path/route-e255a9d1bcc8de59.js +1 -0
  451. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-e255a9d1bcc8de59.js +1 -0
  452. package/.next-prod/static/chunks/app/api/sessions/projects/route-e255a9d1bcc8de59.js +1 -0
  453. package/.next-prod/static/chunks/app/api/sessions/route-e255a9d1bcc8de59.js +1 -0
  454. package/.next-prod/static/chunks/app/api/settings/route-e255a9d1bcc8de59.js +1 -0
  455. package/.next-prod/static/chunks/app/api/skills/[id]/route-e255a9d1bcc8de59.js +1 -0
  456. package/.next-prod/static/chunks/app/api/skills/content/route-e255a9d1bcc8de59.js +1 -0
  457. package/.next-prod/static/chunks/app/api/skills/route-e255a9d1bcc8de59.js +1 -0
  458. package/.next-prod/static/chunks/app/api/snapshots/diff/route-e255a9d1bcc8de59.js +1 -0
  459. package/.next-prod/static/chunks/app/api/snapshots/route-e255a9d1bcc8de59.js +1 -0
  460. package/.next-prod/static/chunks/app/api/terminal/aliases/route-e255a9d1bcc8de59.js +1 -0
  461. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-e255a9d1bcc8de59.js +1 -0
  462. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-e255a9d1bcc8de59.js +1 -0
  463. package/.next-prod/static/chunks/app/api/terminal/env/route-e255a9d1bcc8de59.js +1 -0
  464. package/.next-prod/static/chunks/app/api/terminal/history/route-e255a9d1bcc8de59.js +1 -0
  465. package/.next-prod/static/chunks/app/api/version/route-e255a9d1bcc8de59.js +1 -0
  466. package/.next-prod/static/chunks/app/{layout-392444ad665c7748.js → layout-f34cd2c3e09fc25f.js} +1 -1
  467. package/.next-prod/static/chunks/app/m/{page-54053828af79704f.js → page-4e8c9751c7ef8397.js} +1 -1
  468. package/.next-prod/static/chunks/app/manifest.webmanifest/route-e255a9d1bcc8de59.js +1 -0
  469. package/.next-prod/static/chunks/app/{page-a32d8344284e99cb.js → page-a9db2a83c07440f4.js} +1 -1
  470. package/.next-prod/static/chunks/app/project/{page-a32d8344284e99cb.js → page-a9db2a83c07440f4.js} +1 -1
  471. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-e255a9d1bcc8de59.js +1 -0
  472. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-e255a9d1bcc8de59.js +1 -0
  473. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-e255a9d1bcc8de59.js +1 -0
  474. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-e255a9d1bcc8de59.js +1 -0
  475. package/.next-prod/static/css/546386ec7f3b9978.css +1 -0
  476. package/.next-prod/trace +14 -13
  477. package/.next-prod/trace-build +1 -1
  478. package/.next-prod/types/app/api/html-apps/[id]/route.ts +351 -0
  479. package/.next-prod/types/app/api/html-apps/route.ts +351 -0
  480. package/.next-prod/types/app/api/ollama/config/route.ts +351 -0
  481. package/.next-prod/types/routes.d.ts +4 -1
  482. package/.next-prod/types/validator.ts +27 -0
  483. package/dist/{chunk-NW4I3U26.mjs → chunk-BRW4ZEIC.mjs} +159 -17
  484. package/dist/{chunk-V2ZASC2X.mjs → chunk-GOOVG5NZ.mjs} +1 -1
  485. package/dist/{chunk-4S76JXBU.mjs → chunk-RUNUGDPP.mjs} +1 -1
  486. package/dist/httpApi.mjs +2 -2
  487. package/dist/scheduledTasks.mjs +293 -3
  488. package/dist/{server-YK62AFE6.mjs → server-SVZ344NE.mjs} +2 -2
  489. package/dist/wsServer.mjs +200 -7
  490. package/package.json +1 -1
  491. package/public/html-lib/babel.min.js +2 -0
  492. package/public/html-lib/react-dom.production.min.js +267 -0
  493. package/public/html-lib/react.production.min.js +31 -0
  494. package/public/html-lib/theme.css +99 -0
  495. package/.next-prod/server/chunks/6955.js +0 -1
  496. package/.next-prod/server/chunks/8916.js +0 -1
  497. package/.next-prod/server/chunks/9989.js +0 -1
  498. package/.next-prod/static/chunks/1871-560f59face6cdf95.js +0 -25
  499. package/.next-prod/static/chunks/6784-a155388d7e43ef3d.js +0 -0
  500. package/.next-prod/static/chunks/9530-60801ba514d5c607.js +0 -15
  501. package/.next-prod/static/chunks/app/_global-error/page-382e54b2d4e69c9e.js +0 -1
  502. package/.next-prod/static/chunks/app/api/agent/test/route-382e54b2d4e69c9e.js +0 -1
  503. package/.next-prod/static/chunks/app/api/bash/route-382e54b2d4e69c9e.js +0 -1
  504. package/.next-prod/static/chunks/app/api/chat/codex/route-382e54b2d4e69c9e.js +0 -1
  505. package/.next-prod/static/chunks/app/api/chat/deepseek/route-382e54b2d4e69c9e.js +0 -1
  506. package/.next-prod/static/chunks/app/api/chat/kimi/route-382e54b2d4e69c9e.js +0 -1
  507. package/.next-prod/static/chunks/app/api/chat/ollama/route-382e54b2d4e69c9e.js +0 -1
  508. package/.next-prod/static/chunks/app/api/chat/pty-input/route-382e54b2d4e69c9e.js +0 -1
  509. package/.next-prod/static/chunks/app/api/chat/route-382e54b2d4e69c9e.js +0 -1
  510. package/.next-prod/static/chunks/app/api/chat/stop/route-382e54b2d4e69c9e.js +0 -1
  511. package/.next-prod/static/chunks/app/api/claude-stats/route-382e54b2d4e69c9e.js +0 -1
  512. package/.next-prod/static/chunks/app/api/commands/route-382e54b2d4e69c9e.js +0 -1
  513. package/.next-prod/static/chunks/app/api/comments/route-382e54b2d4e69c9e.js +0 -1
  514. package/.next-prod/static/chunks/app/api/db/columns/route-382e54b2d4e69c9e.js +0 -1
  515. package/.next-prod/static/chunks/app/api/db/connect/route-382e54b2d4e69c9e.js +0 -1
  516. package/.next-prod/static/chunks/app/api/db/disconnect/route-382e54b2d4e69c9e.js +0 -1
  517. package/.next-prod/static/chunks/app/api/db/export/route-382e54b2d4e69c9e.js +0 -1
  518. package/.next-prod/static/chunks/app/api/db/query/route-382e54b2d4e69c9e.js +0 -1
  519. package/.next-prod/static/chunks/app/api/db/schemas/route-382e54b2d4e69c9e.js +0 -1
  520. package/.next-prod/static/chunks/app/api/deepseek/credentials/route-382e54b2d4e69c9e.js +0 -1
  521. package/.next-prod/static/chunks/app/api/dev/spans/route-382e54b2d4e69c9e.js +0 -1
  522. package/.next-prod/static/chunks/app/api/extension/version/route-382e54b2d4e69c9e.js +0 -1
  523. package/.next-prod/static/chunks/app/api/file/route-382e54b2d4e69c9e.js +0 -1
  524. package/.next-prod/static/chunks/app/api/files/blame/route-382e54b2d4e69c9e.js +0 -1
  525. package/.next-prod/static/chunks/app/api/files/clipboard/route-382e54b2d4e69c9e.js +0 -1
  526. package/.next-prod/static/chunks/app/api/files/copy/route-382e54b2d4e69c9e.js +0 -1
  527. package/.next-prod/static/chunks/app/api/files/delete/route-382e54b2d4e69c9e.js +0 -1
  528. package/.next-prod/static/chunks/app/api/files/expanded/route-382e54b2d4e69c9e.js +0 -1
  529. package/.next-prod/static/chunks/app/api/files/index/route-382e54b2d4e69c9e.js +0 -1
  530. package/.next-prod/static/chunks/app/api/files/init/route-382e54b2d4e69c9e.js +0 -1
  531. package/.next-prod/static/chunks/app/api/files/paste/route-382e54b2d4e69c9e.js +0 -1
  532. package/.next-prod/static/chunks/app/api/files/read/route-382e54b2d4e69c9e.js +0 -1
  533. package/.next-prod/static/chunks/app/api/files/readdir/route-382e54b2d4e69c9e.js +0 -1
  534. package/.next-prod/static/chunks/app/api/files/recent/route-382e54b2d4e69c9e.js +0 -1
  535. package/.next-prod/static/chunks/app/api/files/save/route-382e54b2d4e69c9e.js +0 -1
  536. package/.next-prod/static/chunks/app/api/files/search/route-382e54b2d4e69c9e.js +0 -1
  537. package/.next-prod/static/chunks/app/api/files/stat/route-382e54b2d4e69c9e.js +0 -1
  538. package/.next-prod/static/chunks/app/api/files/text/route-382e54b2d4e69c9e.js +0 -1
  539. package/.next-prod/static/chunks/app/api/git/branch-diff/route-382e54b2d4e69c9e.js +0 -1
  540. package/.next-prod/static/chunks/app/api/git/branches/route-382e54b2d4e69c9e.js +0 -1
  541. package/.next-prod/static/chunks/app/api/git/commit-diff/route-382e54b2d4e69c9e.js +0 -1
  542. package/.next-prod/static/chunks/app/api/git/commits/route-382e54b2d4e69c9e.js +0 -1
  543. package/.next-prod/static/chunks/app/api/git/current-branch/route-382e54b2d4e69c9e.js +0 -1
  544. package/.next-prod/static/chunks/app/api/git/diff/route-382e54b2d4e69c9e.js +0 -1
  545. package/.next-prod/static/chunks/app/api/git/discard/route-382e54b2d4e69c9e.js +0 -1
  546. package/.next-prod/static/chunks/app/api/git/stage/route-382e54b2d4e69c9e.js +0 -1
  547. package/.next-prod/static/chunks/app/api/git/status/route-382e54b2d4e69c9e.js +0 -1
  548. package/.next-prod/static/chunks/app/api/git/unstage/route-382e54b2d4e69c9e.js +0 -1
  549. package/.next-prod/static/chunks/app/api/git/worktree/route-382e54b2d4e69c9e.js +0 -1
  550. package/.next-prod/static/chunks/app/api/global-state/route-382e54b2d4e69c9e.js +0 -1
  551. package/.next-prod/static/chunks/app/api/health/route-382e54b2d4e69c9e.js +0 -1
  552. package/.next-prod/static/chunks/app/api/jupyter/load/route-382e54b2d4e69c9e.js +0 -1
  553. package/.next-prod/static/chunks/app/api/jupyter/save/route-382e54b2d4e69c9e.js +0 -1
  554. package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-382e54b2d4e69c9e.js +0 -1
  555. package/.next-prod/static/chunks/app/api/lsp/definition/route-382e54b2d4e69c9e.js +0 -1
  556. package/.next-prod/static/chunks/app/api/lsp/hover/route-382e54b2d4e69c9e.js +0 -1
  557. package/.next-prod/static/chunks/app/api/lsp/references/route-382e54b2d4e69c9e.js +0 -1
  558. package/.next-prod/static/chunks/app/api/lsp/status/route-382e54b2d4e69c9e.js +0 -1
  559. package/.next-prod/static/chunks/app/api/lsp/warmup/route-382e54b2d4e69c9e.js +0 -1
  560. package/.next-prod/static/chunks/app/api/mysql/columns/route-382e54b2d4e69c9e.js +0 -1
  561. package/.next-prod/static/chunks/app/api/mysql/connect/route-382e54b2d4e69c9e.js +0 -1
  562. package/.next-prod/static/chunks/app/api/mysql/disconnect/route-382e54b2d4e69c9e.js +0 -1
  563. package/.next-prod/static/chunks/app/api/mysql/export/route-382e54b2d4e69c9e.js +0 -1
  564. package/.next-prod/static/chunks/app/api/mysql/query/route-382e54b2d4e69c9e.js +0 -1
  565. package/.next-prod/static/chunks/app/api/mysql/schemas/route-382e54b2d4e69c9e.js +0 -1
  566. package/.next-prod/static/chunks/app/api/neo4j/connect/route-382e54b2d4e69c9e.js +0 -1
  567. package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-382e54b2d4e69c9e.js +0 -1
  568. package/.next-prod/static/chunks/app/api/neo4j/query/route-382e54b2d4e69c9e.js +0 -1
  569. package/.next-prod/static/chunks/app/api/neo4j/schema/route-382e54b2d4e69c9e.js +0 -1
  570. package/.next-prod/static/chunks/app/api/note/route-382e54b2d4e69c9e.js +0 -1
  571. package/.next-prod/static/chunks/app/api/ollama/models/route-382e54b2d4e69c9e.js +0 -1
  572. package/.next-prod/static/chunks/app/api/ollama/start/route-382e54b2d4e69c9e.js +0 -1
  573. package/.next-prod/static/chunks/app/api/open-cursor/route-382e54b2d4e69c9e.js +0 -1
  574. package/.next-prod/static/chunks/app/api/open-vscode/route-382e54b2d4e69c9e.js +0 -1
  575. package/.next-prod/static/chunks/app/api/pick-folder/route-382e54b2d4e69c9e.js +0 -1
  576. package/.next-prod/static/chunks/app/api/pinned-sessions/route-382e54b2d4e69c9e.js +0 -1
  577. package/.next-prod/static/chunks/app/api/preview/[...path]/route-382e54b2d4e69c9e.js +0 -1
  578. package/.next-prod/static/chunks/app/api/project-settings/route-382e54b2d4e69c9e.js +0 -1
  579. package/.next-prod/static/chunks/app/api/project-state/route-382e54b2d4e69c9e.js +0 -1
  580. package/.next-prod/static/chunks/app/api/projectGraph/affected/route-382e54b2d4e69c9e.js +0 -1
  581. package/.next-prod/static/chunks/app/api/projectGraph/callees/route-382e54b2d4e69c9e.js +0 -1
  582. package/.next-prod/static/chunks/app/api/projectGraph/callers/route-382e54b2d4e69c9e.js +0 -1
  583. package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-382e54b2d4e69c9e.js +0 -1
  584. package/.next-prod/static/chunks/app/api/projectGraph/context/route-382e54b2d4e69c9e.js +0 -1
  585. package/.next-prod/static/chunks/app/api/projectGraph/file/route-382e54b2d4e69c9e.js +0 -1
  586. package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-382e54b2d4e69c9e.js +0 -1
  587. package/.next-prod/static/chunks/app/api/projectGraph/impact/route-382e54b2d4e69c9e.js +0 -1
  588. package/.next-prod/static/chunks/app/api/projectGraph/related/route-382e54b2d4e69c9e.js +0 -1
  589. package/.next-prod/static/chunks/app/api/projectGraph/risk/route-382e54b2d4e69c9e.js +0 -1
  590. package/.next-prod/static/chunks/app/api/projectGraph/search/route-382e54b2d4e69c9e.js +0 -1
  591. package/.next-prod/static/chunks/app/api/projects/route-382e54b2d4e69c9e.js +0 -1
  592. package/.next-prod/static/chunks/app/api/push/public-key/route-382e54b2d4e69c9e.js +0 -1
  593. package/.next-prod/static/chunks/app/api/push/subscribe/route-382e54b2d4e69c9e.js +0 -1
  594. package/.next-prod/static/chunks/app/api/push/unsubscribe/route-382e54b2d4e69c9e.js +0 -1
  595. package/.next-prod/static/chunks/app/api/redis/command/route-382e54b2d4e69c9e.js +0 -1
  596. package/.next-prod/static/chunks/app/api/redis/connect/route-382e54b2d4e69c9e.js +0 -1
  597. package/.next-prod/static/chunks/app/api/redis/delete/route-382e54b2d4e69c9e.js +0 -1
  598. package/.next-prod/static/chunks/app/api/redis/disconnect/route-382e54b2d4e69c9e.js +0 -1
  599. package/.next-prod/static/chunks/app/api/redis/get/route-382e54b2d4e69c9e.js +0 -1
  600. package/.next-prod/static/chunks/app/api/redis/keys/route-382e54b2d4e69c9e.js +0 -1
  601. package/.next-prod/static/chunks/app/api/redis/set/route-382e54b2d4e69c9e.js +0 -1
  602. package/.next-prod/static/chunks/app/api/review/[id]/comments/route-382e54b2d4e69c9e.js +0 -1
  603. package/.next-prod/static/chunks/app/api/review/[id]/replies/route-382e54b2d4e69c9e.js +0 -1
  604. package/.next-prod/static/chunks/app/api/review/[id]/route-382e54b2d4e69c9e.js +0 -1
  605. package/.next-prod/static/chunks/app/api/review/identify/route-382e54b2d4e69c9e.js +0 -1
  606. package/.next-prod/static/chunks/app/api/review/order/route-382e54b2d4e69c9e.js +0 -1
  607. package/.next-prod/static/chunks/app/api/review/route-382e54b2d4e69c9e.js +0 -1
  608. package/.next-prod/static/chunks/app/api/review/share-info/route-382e54b2d4e69c9e.js +0 -1
  609. package/.next-prod/static/chunks/app/api/review/users/route-382e54b2d4e69c9e.js +0 -1
  610. package/.next-prod/static/chunks/app/api/scheduled-tasks/route-382e54b2d4e69c9e.js +0 -1
  611. package/.next-prod/static/chunks/app/api/services/config/route-382e54b2d4e69c9e.js +0 -1
  612. package/.next-prod/static/chunks/app/api/services/scripts/route-382e54b2d4e69c9e.js +0 -1
  613. package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-382e54b2d4e69c9e.js +0 -1
  614. package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-382e54b2d4e69c9e.js +0 -1
  615. package/.next-prod/static/chunks/app/api/session-by-path/route-382e54b2d4e69c9e.js +0 -1
  616. package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-382e54b2d4e69c9e.js +0 -1
  617. package/.next-prod/static/chunks/app/api/sessions/projects/route-382e54b2d4e69c9e.js +0 -1
  618. package/.next-prod/static/chunks/app/api/sessions/route-382e54b2d4e69c9e.js +0 -1
  619. package/.next-prod/static/chunks/app/api/settings/route-382e54b2d4e69c9e.js +0 -1
  620. package/.next-prod/static/chunks/app/api/skills/[id]/route-382e54b2d4e69c9e.js +0 -1
  621. package/.next-prod/static/chunks/app/api/skills/content/route-382e54b2d4e69c9e.js +0 -1
  622. package/.next-prod/static/chunks/app/api/skills/route-382e54b2d4e69c9e.js +0 -1
  623. package/.next-prod/static/chunks/app/api/snapshots/diff/route-382e54b2d4e69c9e.js +0 -1
  624. package/.next-prod/static/chunks/app/api/snapshots/route-382e54b2d4e69c9e.js +0 -1
  625. package/.next-prod/static/chunks/app/api/terminal/aliases/route-382e54b2d4e69c9e.js +0 -1
  626. package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-382e54b2d4e69c9e.js +0 -1
  627. package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-382e54b2d4e69c9e.js +0 -1
  628. package/.next-prod/static/chunks/app/api/terminal/env/route-382e54b2d4e69c9e.js +0 -1
  629. package/.next-prod/static/chunks/app/api/terminal/history/route-382e54b2d4e69c9e.js +0 -1
  630. package/.next-prod/static/chunks/app/api/version/route-382e54b2d4e69c9e.js +0 -1
  631. package/.next-prod/static/chunks/app/manifest.webmanifest/route-382e54b2d4e69c9e.js +0 -1
  632. package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-382e54b2d4e69c9e.js +0 -1
  633. package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-382e54b2d4e69c9e.js +0 -1
  634. package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-382e54b2d4e69c9e.js +0 -1
  635. package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-382e54b2d4e69c9e.js +0 -1
  636. package/.next-prod/static/css/9f26a08be661160a.css +0 -1
  637. package/.next-prod/static/uVjxkHKsDvtbJB0cgsKxl/_buildManifest.js +0 -1
  638. /package/.next-prod/static/{uVjxkHKsDvtbJB0cgsKxl → PlTlBBOBl0rKPGTdXqONe}/_ssgManifest.js +0 -0
@@ -28636,6 +28636,7 @@ var NOTE_FILE = join4(COCKPIT_DIR, "note.md");
28636
28636
  var SCHEDULED_TASKS_FILE = join4(COCKPIT_DIR, "scheduled-tasks.json");
28637
28637
  var SETTINGS_FILE = join4(COCKPIT_DIR, "settings.json");
28638
28638
  var SKILLS_FILE = join4(COCKPIT_DIR, "skills.json");
28639
+ var HTML_APPS_FILE = join4(COCKPIT_DIR, "html.json");
28639
28640
  var REVIEW_DIR = join4(COCKPIT_DIR, "review");
28640
28641
  var REVIEW_SIGNAL_FILE = join4(REVIEW_DIR, "_signal");
28641
28642
  var CLAUDE_DIR = join4(HOME_DIR, ".claude");
@@ -28645,6 +28646,8 @@ var CLAUDE2_PROJECTS_DIR = join4(CLAUDE2_DIR, "projects");
28645
28646
  var DEEPSEEK_DIR = join4(COCKPIT_DIR, "deepseek");
28646
28647
  var DEEPSEEK_PROJECTS_DIR = join4(DEEPSEEK_DIR, "projects");
28647
28648
  var DEEPSEEK_CREDENTIALS_FILE = join4(DEEPSEEK_DIR, "credentials.json");
28649
+ var OLLAMA_DIR = join4(COCKPIT_DIR, "ollama");
28650
+ var OLLAMA_CONFIG_FILE = join4(OLLAMA_DIR, "config.json");
28648
28651
  function encodePath(path) {
28649
28652
  return path.replace(/[/.]/g, "-");
28650
28653
  }
@@ -29009,6 +29012,9 @@ var snapshotRepoTtlDaysConfig = Config_exports.integer(
29009
29012
  var snapshotMaxFileKbConfig = Config_exports.integer(
29010
29013
  "COCKPIT_SNAPSHOT_MAX_FILE_KB"
29011
29014
  ).pipe(Config_exports.withDefault(2048));
29015
+ var sessionKeepDaysConfig = Config_exports.integer("COCKPIT_SESSION_KEEP_DAYS").pipe(
29016
+ Config_exports.withDefault(30)
29017
+ );
29012
29018
  var CockpitConfig = Effect_exports.gen(
29013
29019
  function* () {
29014
29020
  const env = yield* envConfig;
@@ -29020,6 +29026,7 @@ var CockpitConfig = Effect_exports.gen(
29020
29026
  const snapshotKeepDays = yield* snapshotKeepDaysConfig;
29021
29027
  const snapshotRepoTtlDays = yield* snapshotRepoTtlDaysConfig;
29022
29028
  const snapshotMaxFileKb = yield* snapshotMaxFileKbConfig;
29029
+ const sessionKeepDays = yield* sessionKeepDaysConfig;
29023
29030
  const cockpitDir = yield* Effect_exports.sync(() => {
29024
29031
  const env2 = typeof process !== "undefined" ? process.env : void 0;
29025
29032
  const home = env2?.HOME || env2?.USERPROFILE || ".";
@@ -29040,7 +29047,8 @@ var CockpitConfig = Effect_exports.gen(
29040
29047
  logFile,
29041
29048
  snapshotKeepDays,
29042
29049
  snapshotRepoTtlDays,
29043
- snapshotMaxFileKb
29050
+ snapshotMaxFileKb,
29051
+ sessionKeepDays
29044
29052
  };
29045
29053
  }
29046
29054
  ).pipe(Effect_exports.orDie);
@@ -29750,12 +29758,20 @@ import { createOpenAI } from "@ai-sdk/openai";
29750
29758
 
29751
29759
  // packages/shared/utils/src/ollamaEnv.ts
29752
29760
  var DEFAULT_BASE = "http://127.0.0.1:11434";
29753
- function getOllamaBaseURL() {
29754
- const raw = process.env.OLLAMA_BASE_URL || DEFAULT_BASE;
29761
+ var DEFAULT_API_KEY = "ollama";
29762
+ function normalizeBase(raw) {
29755
29763
  return raw.replace(/\/v1\/?$/, "").replace(/\/+$/, "");
29756
29764
  }
29757
- function getOllamaOpenAIBaseURL() {
29758
- return `${getOllamaBaseURL()}/v1/`;
29765
+ async function readOllamaStoredConfig() {
29766
+ return readJsonFile(OLLAMA_CONFIG_FILE, {});
29767
+ }
29768
+ async function resolveOllamaConnection() {
29769
+ const cfg = await readOllamaStoredConfig();
29770
+ const baseUrl = normalizeBase(
29771
+ cfg.baseUrl?.trim() || process.env.OLLAMA_BASE_URL || DEFAULT_BASE
29772
+ );
29773
+ const apiKey = cfg.apiKey?.trim() || process.env.OLLAMA_API_KEY || DEFAULT_API_KEY;
29774
+ return { baseUrl, apiKey };
29759
29775
  }
29760
29776
 
29761
29777
  // packages/feature/agent/src/server/engines/ollama/model.ts
@@ -29778,13 +29794,11 @@ var ollamaFetch = async (input, init) => {
29778
29794
  }
29779
29795
  return fetch(input, init);
29780
29796
  };
29781
- function createOllamaModel(modelName) {
29797
+ async function createOllamaModel(modelName) {
29798
+ const { baseUrl, apiKey } = await resolveOllamaConnection();
29782
29799
  const provider = createOpenAI({
29783
- // EFFECT.md §0 exemption: third-party plugin API key in the same category as
29784
- // OPENAI_API_KEY / ANTHROPIC_API_KEY; not pulled into CockpitConfig (would over-couple
29785
- // cockpit configuration with third-party authentication).
29786
- apiKey: process.env.OLLAMA_API_KEY || "ollama",
29787
- baseURL: getOllamaOpenAIBaseURL(),
29800
+ apiKey,
29801
+ baseURL: `${baseUrl}/v1/`,
29788
29802
  fetch: ollamaFetch
29789
29803
  });
29790
29804
  return provider.chat(modelName);
@@ -29812,7 +29826,7 @@ var ollamaStream = (req) => Stream_exports.async((emit2) => {
29812
29826
  const abortController = new AbortController();
29813
29827
  void (async () => {
29814
29828
  try {
29815
- const ollamaModel = createOllamaModel(req.model);
29829
+ const ollamaModel = await createOllamaModel(req.model);
29816
29830
  const result = streamText({
29817
29831
  model: ollamaModel,
29818
29832
  messages: toModelMessages(req.messages),
@@ -30012,7 +30026,7 @@ var runGitOk = (repoDir, workTree, args2, input) => runGit(repoDir, workTree, ar
30012
30026
  );
30013
30027
  var SYMLINK_PATHSPEC_RE = /beyond a symbolic link/;
30014
30028
  var stageAdds = (repoDir, cwd, paths) => Effect_exports.gen(function* () {
30015
- const addArgs = ["add", "-A", "--pathspec-from-file=-", "--pathspec-file-nul"];
30029
+ const addArgs = ["add", "-A", "--force", "--pathspec-from-file=-", "--pathspec-file-nul"];
30016
30030
  const batch = yield* runGit(repoDir, cwd, addArgs, paths.map((p) => `:(literal)${p}`).join("\0"));
30017
30031
  if (batch.code === 0) return;
30018
30032
  if (!SYMLINK_PATHSPEC_RE.test(batch.stderr)) {
@@ -30173,6 +30187,10 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
30173
30187
  return skip;
30174
30188
  });
30175
30189
  const stageOnce = Effect_exports.gen(function* () {
30190
+ const headOk = yield* runGit(repoDir, cwd, ["rev-parse", "--quiet", "--verify", "HEAD"]);
30191
+ if (headOk.code === 0) {
30192
+ yield* runGitOk(repoDir, cwd, ["read-tree", "HEAD"]);
30193
+ }
30176
30194
  const status3 = yield* runGitOk(repoDir, cwd, [
30177
30195
  "status",
30178
30196
  "--porcelain",
@@ -30191,14 +30209,17 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
30191
30209
  for (const e of entries2) {
30192
30210
  const path = e.slice(3);
30193
30211
  if (!path) continue;
30194
- if (e[1] === "D") rmPaths.push(path);
30212
+ if (e[0] === "D" || e[1] === "D") rmPaths.push(path);
30195
30213
  else addPaths.push(path);
30196
30214
  }
30197
30215
  const sizes = yield* Effect_exports.all(
30198
30216
  addPaths.map(
30199
30217
  (p) => fsTry("stat", () => stat(join5(cwd, p)).then((s) => s.isFile() ? s.size : 0)).pipe(
30200
- // Untracked path vanishing between status and stat size 0.
30201
- Effect_exports.orElseSucceed(() => 0)
30218
+ // Path gone between status and stat (concurrent session/build) or
30219
+ // unreadable → -1, excluded below so a vanished path never reaches
30220
+ // `git add`, which would abort the whole batch with "pathspec did
30221
+ // not match any files".
30222
+ Effect_exports.orElseSucceed(() => -1)
30202
30223
  )
30203
30224
  ),
30204
30225
  { concurrency: 16 }
@@ -30206,6 +30227,7 @@ var snapshotOnce = (snapshotsRoot, maxFileBytes, trigger, kind) => Effect_export
30206
30227
  const includedAdds = [];
30207
30228
  let totalBytes = 0;
30208
30229
  for (let i = 0; i < addPaths.length; i++) {
30230
+ if (sizes[i] < 0) continue;
30209
30231
  if (sizes[i] > maxFileBytes) continue;
30210
30232
  includedAdds.push(addPaths[i]);
30211
30233
  totalBytes += sizes[i];
@@ -30503,6 +30525,124 @@ var SnapshotServiceLive = Layer_exports.scoped(
30503
30525
  })
30504
30526
  );
30505
30527
 
30528
+ // packages/feature/agent/src/effect/sessionCleanupLive.ts
30529
+ import { readdir as readdir2, readFile as readFile3, rm as rm2, rmdir, stat as stat2 } from "fs/promises";
30530
+ import { join as join6 } from "path";
30531
+ var DAY_MS = 24 * 3600 * 1e3;
30532
+ var fsTry2 = (op, fn2) => Effect_exports.tryPromise({
30533
+ try: fn2,
30534
+ catch: (cause3) => new AppError({ message: `session cleanup fs ${op} failed`, cause: cause3 })
30535
+ });
30536
+ var isDirectory = (p) => fsTry2("stat", () => stat2(p).then((s) => s.isDirectory())).pipe(
30537
+ Effect_exports.orElseSucceed(() => false)
30538
+ );
30539
+ var loadPinnedIds = (pinnedFile) => Effect_exports.tryPromise({
30540
+ try: async () => {
30541
+ let raw;
30542
+ try {
30543
+ raw = await readFile3(pinnedFile, "utf8");
30544
+ } catch (e) {
30545
+ if (e?.code === "ENOENT") {
30546
+ return { ok: true, ids: /* @__PURE__ */ new Set() };
30547
+ }
30548
+ throw e;
30549
+ }
30550
+ const parsed = JSON.parse(raw);
30551
+ const ids3 = /* @__PURE__ */ new Set();
30552
+ for (const p of Array.isArray(parsed) ? parsed : []) {
30553
+ if (p && typeof p.sessionId === "string") ids3.add(p.sessionId);
30554
+ }
30555
+ return { ok: true, ids: ids3 };
30556
+ },
30557
+ catch: () => null
30558
+ }).pipe(Effect_exports.orElseSucceed(() => ({ ok: false })));
30559
+ var cleanupSessions = (root, keepDays, pinnedFile) => Effect_exports.gen(function* () {
30560
+ const pins = yield* loadPinnedIds(pinnedFile);
30561
+ if (!pins.ok) {
30562
+ yield* Effect_exports.logWarning(
30563
+ "session cleanup: pinned-sessions.json is unreadable/corrupt -- skipping this pass (refusing to risk deleting protected sessions)"
30564
+ );
30565
+ return;
30566
+ }
30567
+ const cutoff = Date.now() - keepDays * DAY_MS;
30568
+ const cwdDirs = yield* fsTry2("readdir root", () => readdir2(root)).pipe(
30569
+ Effect_exports.orElseSucceed(() => [])
30570
+ );
30571
+ for (const cwdName of cwdDirs) {
30572
+ const cwdDir = join6(root, cwdName);
30573
+ if (!(yield* isDirectory(cwdDir))) continue;
30574
+ const entries2 = yield* fsTry2("readdir cwd", () => readdir2(cwdDir)).pipe(
30575
+ Effect_exports.orElseSucceed(() => [])
30576
+ );
30577
+ const sessions = /* @__PURE__ */ new Map();
30578
+ for (const name of entries2) {
30579
+ const full = join6(cwdDir, name);
30580
+ if (name.endsWith(".jsonl")) {
30581
+ const stem = name.slice(0, -".jsonl".length);
30582
+ const s = sessions.get(stem) ?? {};
30583
+ s.jsonl = full;
30584
+ sessions.set(stem, s);
30585
+ } else if (yield* isDirectory(full)) {
30586
+ const s = sessions.get(name) ?? {};
30587
+ s.subdir = full;
30588
+ sessions.set(name, s);
30589
+ }
30590
+ }
30591
+ for (const [stem, s] of sessions) {
30592
+ if (pins.ids.has(stem)) continue;
30593
+ const basis = s.jsonl ?? s.subdir;
30594
+ if (!basis) continue;
30595
+ const mtime = yield* fsTry2(
30596
+ "stat basis",
30597
+ () => stat2(basis).then((st) => st.mtimeMs)
30598
+ ).pipe(Effect_exports.orElseSucceed(() => Number.POSITIVE_INFINITY));
30599
+ if (mtime >= cutoff) continue;
30600
+ if (s.jsonl) {
30601
+ yield* fsTry2("rm jsonl", () => rm2(s.jsonl, { force: true })).pipe(
30602
+ Effect_exports.orElseSucceed(() => void 0)
30603
+ );
30604
+ }
30605
+ if (s.subdir) {
30606
+ yield* fsTry2(
30607
+ "rm subdir",
30608
+ () => rm2(s.subdir, { recursive: true, force: true })
30609
+ ).pipe(Effect_exports.orElseSucceed(() => void 0));
30610
+ }
30611
+ yield* Effect_exports.logInfo(
30612
+ `session cleanup: removed ollama session ${stem} under ${cwdName} (older than ${keepDays}d)`
30613
+ );
30614
+ }
30615
+ const rest = yield* fsTry2("readdir cwd (recount)", () => readdir2(cwdDir)).pipe(
30616
+ Effect_exports.orElseSucceed(() => ["keep"])
30617
+ );
30618
+ if (rest.length === 0) {
30619
+ yield* fsTry2("rmdir cwd", () => rmdir(cwdDir)).pipe(
30620
+ Effect_exports.orElseSucceed(() => void 0)
30621
+ );
30622
+ }
30623
+ }
30624
+ }).pipe(Effect_exports.withSpan("session.cleanup"));
30625
+ var SessionCleanupService = Context_exports.GenericTag(
30626
+ "@cockpit/SessionCleanupService"
30627
+ );
30628
+ var SessionCleanupLive = Layer_exports.scoped(
30629
+ SessionCleanupService,
30630
+ Effect_exports.gen(function* () {
30631
+ const cfg = yield* CockpitConfig;
30632
+ const root = join6(cfg.cockpitDir, "ollama-sessions");
30633
+ const pinnedFile = join6(cfg.cockpitDir, "pinned-sessions.json");
30634
+ const keepDays = Math.max(1, cfg.sessionKeepDays);
30635
+ const cleanup = cleanupSessions(root, keepDays, pinnedFile);
30636
+ yield* Effect_exports.forkScoped(
30637
+ cleanup.pipe(
30638
+ Effect_exports.catchAll((e) => Effect_exports.logWarning(`session cleanup failed: ${e.message}`)),
30639
+ Effect_exports.repeat(Schedule_exports.spaced("24 hours"))
30640
+ )
30641
+ );
30642
+ return SessionCleanupService.of({ cleanup });
30643
+ })
30644
+ );
30645
+
30506
30646
  // packages/shared/effect-runtime/src/server/runtime.ts
30507
30647
  var isDev = process.env.COCKPIT_ENV === "dev";
30508
30648
  var ServerBaseLayer = Layer_exports.unwrapEffect(
@@ -30526,7 +30666,9 @@ var AppLayer = Layer_exports.mergeAll(
30526
30666
  // Agent
30527
30667
  AgentServiceLive,
30528
30668
  // Tool-call snapshots (shadow git)
30529
- SnapshotServiceLive
30669
+ SnapshotServiceLive,
30670
+ // Ollama session transcript retention (daily sweep)
30671
+ SessionCleanupLive
30530
30672
  );
30531
30673
  var AppRuntime = ManagedRuntime_exports.make(AppLayer);
30532
30674
 
@@ -13,7 +13,7 @@ import {
13
13
  getTerminalOutputPath,
14
14
  readJsonFile,
15
15
  writeJsonFile
16
- } from "./chunk-NW4I3U26.mjs";
16
+ } from "./chunk-BRW4ZEIC.mjs";
17
17
 
18
18
  // packages/feature/console/src/server/plugins/browser/BrowserBridge.ts
19
19
  import { WebSocket } from "ws";
@@ -10,7 +10,7 @@ import {
10
10
  readJsonFile,
11
11
  withFileLock,
12
12
  writeJsonFile
13
- } from "./chunk-NW4I3U26.mjs";
13
+ } from "./chunk-BRW4ZEIC.mjs";
14
14
 
15
15
  // packages/feature/agent/src/server/state/globalState.ts
16
16
  import { createReadStream, existsSync, statSync } from "fs";
package/dist/httpApi.mjs CHANGED
@@ -22,10 +22,10 @@ import {
22
22
  unregisterBrowser,
23
23
  unregisterTerminal,
24
24
  writeStdinToCommand
25
- } from "./chunk-V2ZASC2X.mjs";
25
+ } from "./chunk-GOOVG5NZ.mjs";
26
26
  import {
27
27
  getTerminalHistoryPath
28
- } from "./chunk-NW4I3U26.mjs";
28
+ } from "./chunk-BRW4ZEIC.mjs";
29
29
  import "./chunk-7P6ASYW6.mjs";
30
30
 
31
31
  // src/lib/httpApi.ts
@@ -10,7 +10,7 @@ import {
10
10
  setRunAbort,
11
11
  startRun,
12
12
  updateGlobalState
13
- } from "./chunk-4S76JXBU.mjs";
13
+ } from "./chunk-RUNUGDPP.mjs";
14
14
  import {
15
15
  AgentError,
16
16
  AppRuntime,
@@ -37,7 +37,7 @@ import {
37
37
  settlePendingRecord,
38
38
  withFileLock,
39
39
  writeJsonFile
40
- } from "./chunk-NW4I3U26.mjs";
40
+ } from "./chunk-BRW4ZEIC.mjs";
41
41
  import {
42
42
  __export
43
43
  } from "./chunk-7P6ASYW6.mjs";
@@ -1152,6 +1152,294 @@ Finally emit [Overall recap: end-to-end interaction verification + total deliver
1152
1152
  - **Recap over interruption**: one final review > mid-flow breaks
1153
1153
  `;
1154
1154
 
1155
+ // packages/feature/agent/src/server/lib/htmlPrompt.ts
1156
+ var HTML_PROMPT_ZH = `---
1157
+ name: html
1158
+ description: "\u751F\u6210\u53EF\u4EA4\u4E92\u7684\u5C0F\u5E94\u7528\uFF1A\u5185\u7F6E cockpit bash SDK\uFF0C\u6267\u884C\u547D\u4EE4\u53D6/\u6539\u6570\u636E"
1159
+ argument-hint: "\u63CF\u8FF0\u4F60\u60F3\u8981\u7684\u5C0F\u5E94\u7528"
1160
+ ---
1161
+
1162
+ # \u751F\u6210 Cockpit \u5C0F\u5E94\u7528
1163
+
1164
+ \u4E00\u4E2A\u80FD\u53D6/\u6539\u6570\u636E\u7684\u5C0F\u5E94\u7528\uFF1A\u9884\u89C8\u65F6\u6CE8\u5165\u4E86\u5168\u5C40 \`window.cockpit\` SDK \u2014\u2014 \u672C\u8D28\u5C31\u662F Bash
1165
+ \u5DE5\u5177\u66B4\u9732\u7ED9\u9875\u9762\uFF0C\u9875\u9762\u6309\u94AE\u80FD \`curl\`\u3001\u8BFB\u5199\u6587\u4EF6\u3001\u8DD1\u811A\u672C\u3002\u7528 \`Write\` \u751F\u6210\u6587\u4EF6\u3002
1166
+
1167
+ **\u9ED8\u8BA4\u7528 React \u5199**\uFF08\u4E0B\u9762\u7684\u672C\u5730\u96F6\u6784\u5EFA\u6808\uFF0Cproductized\u3001AI \u6700\u719F\uFF0C\u9002\u5408\u6709\u72B6\u6001 / \u591A\u89C6\u56FE /
1168
+ \u8868\u5355\uFF09\uFF1B\u53EA\u6709**\u6781\u7B80\u5355\u7684\u5355\u89C6\u56FE\u3001\u6216\u7EAF\u9759\u6001\u4E00\u6B21\u6027\u9875**\u624D\u9000\u56DE\u5355\u6587\u4EF6\u5185\u8054 HTML\u3002\u4E24\u79CD\u6A21\u5F0F\u5171\u7528\u4E0B\u9762
1169
+ \u8FD9\u5957\u5951\u7EA6\u3002
1170
+
1171
+ ## \u5951\u7EA6\uFF1Awindow.cockpit\uFF08\u4E24\u6A21\u5F0F\u5171\u7528\uFF0C\u53EA\u6B64\u4E00\u5904\uFF09
1172
+
1173
+ \u9875\u9762\u52A0\u8F7D\u65F6 SDK \u5DF2\u5C31\u7EEA\uFF0C\u65E0\u9700\u5F15\u5165\u4EFB\u4F55\u5E93\uFF1A
1174
+
1175
+ - \`cockpit.cwd: string\` \u2014\u2014 \u5F53\u524D\u6587\u4EF6\u6240\u5728\u76EE\u5F55\uFF0C\u76F8\u5BF9\u8DEF\u5F84\u547D\u4EE4\u9ED8\u8BA4\u5728\u6B64\u6267\u884C\u3002
1176
+ - \`cockpit.bash(command, opts?)\` \u2014\u2014 \u6267\u884C\u4E00\u6761 bash \u547D\u4EE4\uFF08\`command\` \u662F\u6574\u6761 shell \u4E32\uFF09\uFF1A
1177
+ - **\u524D\u53F0**\uFF08\u9ED8\u8BA4\uFF0C\u77ED/\u79BB\u6563\u547D\u4EE4\uFF09\u2192 \`Promise<{ stdout, stderr, exitCode }>\`\uFF0C\`await\` \u540E\u4E00\u6B21\u6027\u62FF\u5168\u90E8\u8F93\u51FA\u3002
1178
+ - **\u540E\u53F0**\uFF08\`opts.background: true\`\uFF0C\u957F/\u5B9E\u65F6\u547D\u4EE4\uFF09\u2192 \`{ kill() }\`\uFF0C\u7ECF\u56DE\u8C03\u6D41\u5F0F\u8F93\u51FA\uFF1A
1179
+ \`opts = { background:true, cwd?, onOutput?, onStderr?, onExit?, onError? }\`\u3002\u5927/\u6301\u7EED\u8F93\u51FA\u5FC5\u987B\u7528\u540E\u53F0\uFF08\u524D\u53F0\u5168\u7F13\u5B58\u5728\u5185\u5B58\uFF09\u3002
1180
+
1181
+ \u5199\u8FD9\u7C7B\u9875\u9762\u5FC5\u987B\u5B88\u7684\u51E0\u6761\uFF1A
1182
+
1183
+ 1. **\u6570\u636E\u53EA\u8D70 \`cockpit.bash\`**\uFF08\`curl\` \u53D6\u3001\`curl -X POST\` \u6539\u3001\u6216\u8BFB\u5199\u6587\u4EF6\uFF09\uFF0C**\u7EDD\u4E0D\u7528
1184
+ \`fetch(\u5916\u90E8URL)\`** \u2014\u2014 \u540C\u6E90\u6C99\u7BB1\u4F1A CORS \u62E6\u622A\u3002
1185
+ 2. **\u4E24\u7C7B\u5931\u8D25\u90FD\u8981\u5904\u7406**\uFF08\u524D\u53F0\uFF09\uFF1A\`try/catch\` \u6293\u5230\u7684**\u629B\u5F02\u5E38 = spawn/\u57FA\u5EFA\u5931\u8D25**\uFF08\u574F\u8DEF\u5F84\u3001
1186
+ \u8FDE\u63A5\u65AD\uFF09\uFF1B\u6CA1\u629B\u4F46 **\`exitCode !== 0\` = \u547D\u4EE4\u8DD1\u4E86\u4F46\u5931\u8D25**\uFF0C\u5C55\u793A \`stderr\` \u6216 stdout \u91CC\u7684\u9519\u8BEF
1187
+ \u4F53\uFF0C\u522B\u53EA\u5199"\u5931\u8D25"\u3002\u540E\u53F0\u5BF9\u5E94 \`onError\`\uFF08\u57FA\u5EFA\uFF09+ \`onExit\` \u975E\u96F6 \`code\`\uFF08\u547D\u4EE4\uFF09\u3002
1188
+ 3. **\`command\` \u662F shell \u4E32**\uFF1A\u52A8\u6001\u503C/\u7528\u6237\u8F93\u5165\u62FC\u8FDB\u53BB\u524D\u5FC5\u987B\u6821\u9A8C\u6216\u8F6C\u4E49\uFF08shell \u5143\u5B57\u7B26\u4F1A\u6CE8\u5165\uFF09\uFF1B
1189
+ \u80FD\u7528\u56FA\u5B9A\u547D\u4EE4\u5C31\u522B\u88F8\u62FC\u3002
1190
+ 4. **\u8D44\u6E90\u5F15\u7528**\uFF1A\u540C\u7EA7\u76F8\u5BF9\uFF08\`./app.jsx\`\u3001\`./style.css\`\u3001\u56FE\u7247\uFF09\u548C CDN \u7EDD\u5BF9 URL \u90FD\u80FD\u52A0\u8F7D\uFF1B\u6839
1191
+ \u76F8\u5BF9\uFF08\`/assets/x.css\`\uFF09\u4F1A 404\u3002
1192
+
1193
+ meta \u5934\uFF08\u52A1\u5FC5\u5199\u4E0A\uFF0C\u4F9B HTML \u9762\u677F\u505A\u5361\u7247\u3001console \`/name\` \u6253\u5F00\uFF09\uFF1A
1194
+
1195
+ \`\`\`html
1196
+ <title>\u9875\u9762\u6807\u9898</title>
1197
+ <meta name="cockpit-name" content="short-name"> <!-- /name \u77ED\u540D\uFF0C\u552F\u4E00\u3001\u53EA\u7528\u5B57\u6BCD\u6570\u5B57-_ -->
1198
+ <meta name="description" content="\u4E00\u53E5\u8BDD\u8BF4\u660E">
1199
+ <meta name="cockpit-icon" content="\u{1F50D}"> <!-- emoji \u6216\u56FE\u6807 url\uFF0C\u53EF\u9009 -->
1200
+ <meta name="cockpit-theme" content="auto"> <!-- \u542F\u7528\u53F3\u4E0A\u89D2\u4EAE/\u6697\u5207\u6362\uFF1Bauto=\u9996\u6B21\u8DDF\u968F\u7CFB\u7EDF\uFF0C\u53EF\u586B light/dark -->
1201
+ \`\`\`
1202
+
1203
+ ## \u9ED8\u8BA4\uFF1AReact\uFF08\u672C\u5730\u96F6\u6784\u5EFA\u6808\uFF09
1204
+
1205
+ \u5916\u58F3\u56FA\u5B9A\u8FD9\u6837\u5199\uFF0C\u903B\u8F91\u62C6\u5230\u540C\u7EA7 \`./app.jsx\`\uFF1A
1206
+
1207
+ \`\`\`html
1208
+ <div id="root"></div>
1209
+ <script src="/html-lib/react.production.min.js"></script>
1210
+ <script src="/html-lib/react-dom.production.min.js"></script>
1211
+ <script src="/html-lib/babel.min.js"></script>
1212
+ <script>
1213
+ (async () => {
1214
+ const src = await (await fetch('./app.jsx')).text();
1215
+ // \u5FC5\u987B classic runtime\uFF1A\u9ED8\u8BA4 automatic \u4F1A\u6CE8\u5165 import react/jsx-runtime\uFF0C
1216
+ // \u4F5C\u4E3A\u666E\u901A\u811A\u672C\u6CE8\u5165\u4F1A\u62A5 "Cannot use import statement outside a module"
1217
+ const { code } = Babel.transform(src, { presets: [['react', { runtime: 'classic' }]] });
1218
+ const s = document.createElement('script'); s.textContent = code; document.body.appendChild(s);
1219
+ })();
1220
+ </script>
1221
+ \`\`\`
1222
+
1223
+ - \`/html-lib\` \u662F Cockpit \u672C\u5730\u6258\u7BA1\uFF08\u540C\u6E90\u3001\u79BB\u7EBF\u53EF\u7528\uFF0C\u65E0\u9700 CDN\uFF09\u3002
1224
+ - \`app.jsx\` \u7528\u5168\u5C40 \`React\`\uFF08\`const { useState } = React;\`\uFF09\uFF0C\u672B\u5C3E
1225
+ \`ReactDOM.createRoot(document.getElementById('root')).render(<App/>)\`\u3002
1226
+ - \u6837\u5F0F\u9ED8\u8BA4\u5957 **Cockpit \u4E3B\u9898**\uFF1A\`<link rel="stylesheet" href="/html-lib/theme.css">\`\uFF0C\u76F4\u63A5\u7528
1227
+ \u8BED\u4E49\u53D8\u91CF\uFF08\`var(--background)\` / \`--foreground\` / \`--card\` / \`--brand\` / \`--muted-foreground\` /
1228
+ \`--border\` / \`--destructive\`\uFF1B\u534A\u900F\u660E\u7528 \`hsl(var(--green-9) / .12)\`\uFF09\u3002**\u9ED8\u8BA4\u6D45\u8272**\uFF1B\u4E0A\u9762 meta \u5934\u91CC\u7684
1229
+ \`cockpit-theme\` \u8BA9\u9884\u89C8\u5E26\u4E0A\u53F3\u4E0A\u89D2\u4EAE/\u6697\u5207\u6362\u6309\u94AE\uFF0C**\u5E76\u6309 app \u8BB0\u4F4F\u9009\u62E9\uFF08\u8DE8\u5237\u65B0\uFF0C\u4E0D\u8DDF\u968F\u5916\u90E8\uFF09**\uFF0C\u4E5F\u53EF\u8C03
1230
+ \`cockpit.toggleTheme()\`\u3002**\u522B\u81EA\u62CD\u8C03\u8272\u677F\u3001\u522B\u4E0A Tailwind**\uFF1Bapp \u7279\u6709\u7EC6\u8282\u518D\u8865\u4E00\u5C0F\u6BB5 \`<style>\`\u3002
1231
+
1232
+ React \u91CC\u53D6\u6570\u540C\u6837\u8D70 \`cockpit.bash\`\uFF1A
1233
+
1234
+ \`\`\`jsx
1235
+ function App() {
1236
+ const [stars, setStars] = React.useState(null);
1237
+ const load = async () => {
1238
+ const { stdout, exitCode } = await cockpit.bash("curl -s https://api.github.com/repos/Surething-io/cockpit");
1239
+ setStars(exitCode === 0 ? JSON.parse(stdout).stargazers_count : '\u51FA\u9519');
1240
+ };
1241
+ return <button onClick={load}>\u2B50 {stars ?? '\u52A0\u8F7D'}</button>;
1242
+ }
1243
+ \`\`\`
1244
+
1245
+ ## \u540E\u7AEF\uFF1A\u590D\u6742\u903B\u8F91\u5199\u6210\u811A\u672C\uFF08CGI \u98CE\u683C\uFF0C\u4E24\u6A21\u5F0F\u901A\u7528\uFF09
1246
+
1247
+ \u547D\u4EE4\u5F88\u77ED\u5C31\u5185\u8054\u5728 \`cockpit.bash("...")\`\uFF1B\u903B\u8F91\u590D\u6742\uFF08\u591A\u6B65\u3001\u89E3\u6790\u3001\u5FAA\u73AF\u3001\u8981\u5E93\u3001\u5199\u5E93\uFF09\u65F6\uFF0C\u628A\u540E\u7AEF
1248
+ \u5199\u6210\u540C\u76EE\u5F55**\u811A\u672C\u6587\u4EF6**\uFF0C\`cockpit.bash\` \u8C03\u5B83\u2014\u2014HTML/JSX \u7BA1\u5C55\u793A\uFF0C\u811A\u672C\u5F53\u540E\u7AEF\u5904\u7406\u5668\u3002
1249
+
1250
+ - **\u663E\u5F0F\u89E3\u91CA\u5668**\uFF1A\`cockpit.bash("node ./api.mjs")\` / \`python3 ./api.py\` / \`bash ./api.sh\`
1251
+ \uFF08\u514D \`chmod +x\`\uFF09\uFF1B\`node\`/\`python3\` \u62FF\u4E0D\u51C6\u5C31\u5148 \`command -v\` \u63A2\u6D4B\uFF0C\u9000\u56DE shell\u3002
1252
+ - **\u4F20\u53C2\u9632\u6CE8\u5165**\uFF1A\u7ED3\u6784\u5316\u5165\u53C2\u7528 **base64** \u4F20\uFF08\u524D\u7AEF \`btoa(...)\`\u3001\u811A\u672C
1253
+ \`Buffer.from(arg,'base64')\`\uFF09\uFF0C\u522B\u62FC\u5B57\u7B26\u4E32\uFF1B\u5199\u5E93\u7528**\u53C2\u6570\u5316**\u8BED\u53E5\u3002
1254
+ - \u811A\u672C\u7528 stdout \u8FD4\u56DE JSON\uFF0C\u524D\u7AEF \`JSON.parse\`\u3002\u5148 \`Write\` \u51FA\u811A\u672C\uFF0C\u518D\u5728\u9875\u9762\u8C03\u5B83\u3002
1255
+
1256
+ ## \u9000\u56DE\uFF1A\u5355\u6587\u4EF6 HTML\uFF08\u6781\u7B80 / \u7EAF\u9759\u6001\u4E00\u6B21\u6027\u9875\uFF09
1257
+
1258
+ \u4E0D\u9700\u8981\u72B6\u6001\u5C31\u522B\u4E0A React\uFF0C\u76F4\u63A5\u5185\u8054\uFF1B\u53D6\u6570\u4E0E\u9519\u8BEF\u5904\u7406\u540C\u4E0A\u3002
1259
+
1260
+ \u524D\u53F0\uFF08\u70B9\u6309\u94AE\u62C9\u6570\u636E\uFF09\uFF1A
1261
+
1262
+ \`\`\`html
1263
+ <button id="load">\u52A0\u8F7D</button>
1264
+ <pre id="out"></pre>
1265
+ <script>
1266
+ document.getElementById('load').onclick = async () => {
1267
+ try {
1268
+ const { stdout, stderr, exitCode } = await cockpit.bash("curl -s https://api.github.com/repos/Surething-io/cockpit");
1269
+ if (exitCode !== 0) { out.textContent = '\u547D\u4EE4\u5931\u8D25: ' + stderr; return; }
1270
+ out.textContent = '\u2B50 ' + JSON.parse(stdout).stargazers_count;
1271
+ } catch (e) {
1272
+ out.textContent = '\u6267\u884C\u51FA\u9519: ' + e.message; // spawn / \u57FA\u5EFA\u5931\u8D25
1273
+ }
1274
+ };
1275
+ </script>
1276
+ \`\`\`
1277
+
1278
+ \u540E\u53F0\uFF08\u5B9E\u65F6\u65E5\u5FD7\uFF09\uFF1A
1279
+
1280
+ \`\`\`html
1281
+ <pre id="log"></pre>
1282
+ <script>
1283
+ const box = document.getElementById('log');
1284
+ const h = cockpit.bash("tail -f ./build.log", {
1285
+ background: true,
1286
+ onOutput: c => { box.textContent += c; },
1287
+ onExit: code => { box.textContent += '\\n[\u9000\u51FA ' + code + ']'; },
1288
+ onError: msg => { box.textContent += '\\n[\u9519\u8BEF ' + msg + ']'; },
1289
+ });
1290
+ // \u9700\u8981\u65F6 h.kill()
1291
+ </script>
1292
+ \`\`\`
1293
+
1294
+ \u751F\u6210\u540E\u7528 \`Write\` \u5199\u6210 \`.html\`\uFF0C\u7528\u6237\u70B9\u51FB\u5373\u53EF\u9884\u89C8\u5E76\u4EA4\u4E92\u3002`;
1295
+ var HTML_PROMPT_EN = `---
1296
+ name: html
1297
+ description: "Generate an interactive small app with the built-in cockpit bash SDK to fetch/update data"
1298
+ argument-hint: "describe the small app you want"
1299
+ ---
1300
+
1301
+ # Build a Cockpit small app
1302
+
1303
+ A small app that can fetch/update data: the preview injects a global
1304
+ \`window.cockpit\` SDK \u2014 essentially the Bash tool exposed to the page, so buttons can
1305
+ \`curl\`, read/write files, and run scripts. Use \`Write\` to create the file.
1306
+
1307
+ **Default to React** (the local zero-build stack below \u2014 productized, most AI-familiar,
1308
+ ideal for stateful / multi-view / form apps); fall back to single-file inline HTML only
1309
+ for a **trivial single view or a purely static one-off**. Both modes share the one
1310
+ contract below.
1311
+
1312
+ ## Contract: window.cockpit (shared by both modes, stated once)
1313
+
1314
+ The SDK is ready on load \u2014 no library to import:
1315
+
1316
+ - \`cockpit.cwd: string\` \u2014 directory of the current file; relative-path commands run here.
1317
+ - \`cockpit.bash(command, opts?)\` \u2014 run one bash command (\`command\` is a raw shell string):
1318
+ - **Foreground** (default, short/discrete) \u2192 \`Promise<{ stdout, stderr, exitCode }>\`; \`await\` for the full output at once.
1319
+ - **Background** (\`opts.background: true\`, long/live) \u2192 \`{ kill() }\`, streaming via callbacks:
1320
+ \`opts = { background:true, cwd?, onOutput?, onStderr?, onExit?, onError? }\`. Use background for large/continuous output (foreground buffers it all in memory).
1321
+
1322
+ Rules every such page must follow:
1323
+
1324
+ 1. **Data only through \`cockpit.bash\`** (\`curl\` to read, \`curl -X POST\` to write, or
1325
+ read/write files) \u2014 **never \`fetch(externalURL)\`**: the same-origin sandbox blocks it via CORS.
1326
+ 2. **Handle both failure modes** (foreground): a **throw** caught by \`try/catch\` = spawn/infra
1327
+ failure (bad path, dropped connection); no throw but **\`exitCode !== 0\` = the command ran
1328
+ and failed** \u2014 show \`stderr\` or the error body in stdout, don't just say "failed". Background:
1329
+ \`onError\` (infra) + a non-zero \`code\` in \`onExit\` (command).
1330
+ 3. **\`command\` is a shell string**: validate or escape any dynamic/user input before
1331
+ interpolating it (shell metacharacters inject); prefer a fixed command.
1332
+ 4. **Resource refs**: relative siblings (\`./app.jsx\`, \`./style.css\`, images) and absolute
1333
+ CDN URLs load; root-relative (\`/assets/x.css\`) 404s.
1334
+
1335
+ Meta head (always include \u2014 the HTML panel renders cards from it, the console opens it via \`/name\`):
1336
+
1337
+ \`\`\`html
1338
+ <title>Page title</title>
1339
+ <meta name="cockpit-name" content="short-name"> <!-- unique short name for /name; letters/digits/-_ only -->
1340
+ <meta name="description" content="one line about the page">
1341
+ <meta name="cockpit-icon" content="\u{1F50D}"> <!-- emoji or icon url, optional -->
1342
+ <meta name="cockpit-theme" content="auto"> <!-- enable the top-right light/dark toggle; auto = first load follows the OS, or light/dark -->
1343
+ \`\`\`
1344
+
1345
+ ## Default: React (local zero-build stack)
1346
+
1347
+ Use this fixed shell, with the logic in a sibling \`./app.jsx\`:
1348
+
1349
+ \`\`\`html
1350
+ <div id="root"></div>
1351
+ <script src="/html-lib/react.production.min.js"></script>
1352
+ <script src="/html-lib/react-dom.production.min.js"></script>
1353
+ <script src="/html-lib/babel.min.js"></script>
1354
+ <script>
1355
+ (async () => {
1356
+ const src = await (await fetch('./app.jsx')).text();
1357
+ // MUST use classic runtime: the default automatic runtime injects an import of
1358
+ // react/jsx-runtime, which \u2014 appended as a plain script \u2014 throws
1359
+ // "Cannot use import statement outside a module".
1360
+ const { code } = Babel.transform(src, { presets: [['react', { runtime: 'classic' }]] });
1361
+ const s = document.createElement('script'); s.textContent = code; document.body.appendChild(s);
1362
+ })();
1363
+ </script>
1364
+ \`\`\`
1365
+
1366
+ - \`/html-lib\` is hosted locally by Cockpit (same-origin, offline, no CDN).
1367
+ - \`app.jsx\` uses the global \`React\` (\`const { useState } = React;\`) and ends with
1368
+ \`ReactDOM.createRoot(document.getElementById('root')).render(<App/>)\`.
1369
+ - Style with the **Cockpit theme** by default: \`<link rel="stylesheet" href="/html-lib/theme.css">\`,
1370
+ then use the semantic vars (\`var(--background)\` / \`--foreground\` / \`--card\` / \`--brand\` /
1371
+ \`--muted-foreground\` / \`--border\` / \`--destructive\`; translucency via \`hsl(var(--green-9) / .12)\`).
1372
+ **Defaults to light**; the \`cockpit-theme\` meta above gives the preview a top-right light/dark toggle,
1373
+ **remembered per app across reloads** (does not follow the host), or call \`cockpit.toggleTheme()\`
1374
+ from your own UI. Don't invent a palette or add Tailwind; add a small \`<style>\` for app-specific bits.
1375
+
1376
+ Fetch data from React the same way, via \`cockpit.bash\`:
1377
+
1378
+ \`\`\`jsx
1379
+ function App() {
1380
+ const [stars, setStars] = React.useState(null);
1381
+ const load = async () => {
1382
+ const { stdout, exitCode } = await cockpit.bash("curl -s https://api.github.com/repos/Surething-io/cockpit");
1383
+ setStars(exitCode === 0 ? JSON.parse(stdout).stargazers_count : 'error');
1384
+ };
1385
+ return <button onClick={load}>\u2B50 {stars ?? 'load'}</button>;
1386
+ }
1387
+ \`\`\`
1388
+
1389
+ ## Backend: write complex logic as a script (CGI-style, both modes)
1390
+
1391
+ Inline short commands in \`cockpit.bash("...")\`. For complex logic (multi-step, parsing,
1392
+ loops, a library, DB writes), write the backend as a **script file** next to the page and
1393
+ call it \u2014 the HTML/JSX is the frontend, the script is the backend handler.
1394
+
1395
+ - **Explicit interpreter**: \`cockpit.bash("node ./api.mjs")\` / \`python3 ./api.py\` /
1396
+ \`bash ./api.sh\` (avoids \`chmod +x\`); probe \`node\`/\`python3\` with \`command -v\` if unsure,
1397
+ and fall back to shell.
1398
+ - **Pass args safely**: send structured input as **base64** (\`btoa(...)\` on the page,
1399
+ \`Buffer.from(arg,'base64')\` in the script) rather than string-building; use **parameterized**
1400
+ statements for DB writes.
1401
+ - The script returns JSON on stdout; the frontend does \`JSON.parse\`. \`Write\` the script first, then call it.
1402
+
1403
+ ## Fallback: single-file HTML (trivial / static one-off)
1404
+
1405
+ No state? Skip React and inline it. Same data/error handling as above.
1406
+
1407
+ Foreground (button fetches data):
1408
+
1409
+ \`\`\`html
1410
+ <button id="load">Load</button>
1411
+ <pre id="out"></pre>
1412
+ <script>
1413
+ document.getElementById('load').onclick = async () => {
1414
+ try {
1415
+ const { stdout, stderr, exitCode } = await cockpit.bash("curl -s https://api.github.com/repos/Surething-io/cockpit");
1416
+ if (exitCode !== 0) { out.textContent = 'command failed: ' + stderr; return; }
1417
+ out.textContent = '\u2B50 ' + JSON.parse(stdout).stargazers_count;
1418
+ } catch (e) {
1419
+ out.textContent = 'exec error: ' + e.message; // spawn / infra failure
1420
+ }
1421
+ };
1422
+ </script>
1423
+ \`\`\`
1424
+
1425
+ Background (live log):
1426
+
1427
+ \`\`\`html
1428
+ <pre id="log"></pre>
1429
+ <script>
1430
+ const box = document.getElementById('log');
1431
+ const h = cockpit.bash("tail -f ./build.log", {
1432
+ background: true,
1433
+ onOutput: c => { box.textContent += c; },
1434
+ onExit: code => { box.textContent += '\\n[exit ' + code + ']'; },
1435
+ onError: msg => { box.textContent += '\\n[error ' + msg + ']'; },
1436
+ });
1437
+ // h.kill() when done
1438
+ </script>
1439
+ \`\`\`
1440
+
1441
+ Write the result to a \`.html\` file with \`Write\`; the user clicks it to preview and interact.`;
1442
+
1155
1443
  // packages/feature/agent/src/server/lib/newBranchPrompt.ts
1156
1444
  var NEW_BRANCH_LABEL_ZH = "\u9700\u6C42\uFF1A";
1157
1445
  var NEW_BRANCH_LABEL_EN = "Intent: ";
@@ -1689,6 +1977,7 @@ var COMMAND_CONTENT = {
1689
1977
  fx: { zh: FX_PROMPT_ZH, en: FX_PROMPT_EN },
1690
1978
  ex: { zh: EX_PROMPT_ZH, en: EX_PROMPT_EN },
1691
1979
  go: { zh: GO_PROMPT_ZH, en: GO_PROMPT_EN },
1980
+ html: { zh: HTML_PROMPT_ZH, en: HTML_PROMPT_EN },
1692
1981
  cg: { zh: CG_PROMPT_ZH, en: CG_PROMPT_EN, labelZh: CG_LABEL_ZH, labelEn: CG_LABEL_EN },
1693
1982
  cc: { zh: CC_PROMPT_ZH, en: CC_PROMPT_EN, labelZh: CC_LABEL_ZH, labelEn: CC_LABEL_EN },
1694
1983
  cr: { zh: CR_PROMPT_ZH, en: CR_PROMPT_EN },
@@ -17159,8 +17448,9 @@ var ollamaSpec = {
17159
17448
 
17160
17449
  `);
17161
17450
  const context = { cwd, todos: [] };
17451
+ const languageModel = await createOllamaModel(model);
17162
17452
  const result = streamText({
17163
- model: createOllamaModel(model),
17453
+ model: languageModel,
17164
17454
  system: buildSystemPrompt(cwd),
17165
17455
  messages,
17166
17456
  tools: createTools(context),
@@ -45,12 +45,12 @@ import {
45
45
  unregisterTerminal,
46
46
  updateBrowserWs,
47
47
  writeStdinToCommand
48
- } from "./chunk-V2ZASC2X.mjs";
48
+ } from "./chunk-GOOVG5NZ.mjs";
49
49
  import {
50
50
  createNeo4jDriver,
51
51
  runCypherWithDriver,
52
52
  serializeValue
53
- } from "./chunk-NW4I3U26.mjs";
53
+ } from "./chunk-BRW4ZEIC.mjs";
54
54
  import "./chunk-7P6ASYW6.mjs";
55
55
  export {
56
56
  INTERRUPTED_EXIT_CODE,