@surething/cockpit 1.0.258 → 1.0.260

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 (248) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +2 -2
  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/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
  8. package/.next-prod/server/app/_global-error.html +1 -1
  9. package/.next-prod/server/app/_global-error.rsc +1 -1
  10. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  11. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  12. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  13. package/.next-prod/server/app/_not-found/page.js +1 -1
  14. package/.next-prod/server/app/_not-found/page.js.nft.json +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 +3 -3
  18. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
  19. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
  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.nft.json +1 -1
  23. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  24. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  25. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  26. package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
  27. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  28. package/.next-prod/server/app/api/chat/glm/route.js +1 -1
  29. package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
  30. package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
  31. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  32. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  33. package/.next-prod/server/app/api/chat/route.js +1 -1
  34. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  35. package/.next-prod/server/app/api/chat/stop/route.js +1 -1
  36. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  37. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  39. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  41. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  43. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  45. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
  47. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
  49. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  51. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  53. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  55. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  57. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  59. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  61. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  63. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  65. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  66. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  67. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  68. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  69. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  70. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  71. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  72. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  73. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  74. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  75. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  76. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  77. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  78. package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
  79. package/.next-prod/server/app/api/glm/models/route.js +1 -1
  80. package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
  81. package/.next-prod/server/app/api/glm/usage/route.js +1 -1
  82. package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
  83. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  84. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  85. package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
  86. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  87. package/.next-prod/server/app/api/html-apps/route.js +1 -1
  88. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  89. package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
  90. package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
  91. package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
  92. package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
  93. package/.next-prod/server/app/api/kimi/models/route.js +1 -1
  94. package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
  95. package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
  96. package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
  97. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  98. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  99. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  100. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  101. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  102. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  103. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  105. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  107. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  109. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  111. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  113. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  115. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  117. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  119. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  121. package/.next-prod/server/app/api/project-state/route.js +1 -1
  122. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  123. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  125. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  127. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  129. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  130. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  131. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  132. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  133. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  134. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  135. package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  137. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  139. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  140. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  141. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  143. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  144. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  145. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  147. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  149. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  151. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  153. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
  155. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  157. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  159. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  161. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  162. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  163. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  164. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  165. package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
  166. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  167. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  169. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  170. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  171. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  172. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  173. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  174. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  175. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  176. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  177. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  178. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  179. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  180. package/.next-prod/server/app/apps/[...path]/route.js +1 -1
  181. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  182. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  183. package/.next-prod/server/app/m/page.js +1 -1
  184. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  185. package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
  186. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  187. package/.next-prod/server/app/page.js +1 -1
  188. package/.next-prod/server/app/page.js.nft.json +1 -1
  189. package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
  190. package/.next-prod/server/app/project/page.js +1 -1
  191. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  192. package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
  193. package/.next-prod/server/app/review/[id]/page.js +1 -1
  194. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  195. package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
  196. package/.next-prod/server/app-paths-manifest.json +2 -2
  197. package/.next-prod/server/chunks/151.js +1 -0
  198. package/.next-prod/server/chunks/3286.js +448 -294
  199. package/.next-prod/server/chunks/{8557.js → 3641.js} +5 -5
  200. package/.next-prod/server/chunks/5750.js +16 -9
  201. package/.next-prod/server/chunks/6495.js +1 -1
  202. package/.next-prod/server/chunks/6548.js +1 -1
  203. package/.next-prod/server/chunks/816.js +2 -0
  204. package/.next-prod/server/chunks/841.js +12 -10
  205. package/.next-prod/server/chunks/9352.js +4 -4
  206. package/.next-prod/server/chunks/9830.js +1 -1
  207. package/.next-prod/server/middleware-build-manifest.js +1 -1
  208. package/.next-prod/server/pages/404.html +2 -2
  209. package/.next-prod/server/pages/500.html +1 -1
  210. package/.next-prod/server/server-reference-manifest.json +1 -1
  211. package/.next-prod/static/chunks/1157-164bcf046a0a9b15.js +32 -0
  212. package/.next-prod/static/chunks/1372-d16d68b1b03a345a.js +15 -0
  213. package/.next-prod/static/chunks/{9592-a657fb9eb995b64d.js → 4333-9e6709e96d3ec973.js} +7 -7
  214. package/.next-prod/static/chunks/{225-75b2e22f496b56a1.js → 6160-958532439d324185.js} +2 -2
  215. package/.next-prod/static/chunks/6784-09dffdb0e8ca7fb3.js +381 -0
  216. package/.next-prod/static/chunks/app/{layout-bec1cf218bc88d81.js → layout-ab52fc1a83af968b.js} +1 -1
  217. package/.next-prod/static/chunks/app/m/page-7dcf56a65528216f.js +1 -0
  218. package/.next-prod/static/chunks/app/{page-5e6dbc9731415743.js → page-5de8b6584e328a6f.js} +1 -1
  219. package/.next-prod/static/chunks/app/project/{page-5e6dbc9731415743.js → page-5de8b6584e328a6f.js} +1 -1
  220. package/.next-prod/static/css/83c134c954630942.css +1 -0
  221. package/.next-prod/trace +14 -14
  222. package/.next-prod/trace-build +1 -1
  223. package/README.md +1 -1
  224. package/README.zh.md +1 -1
  225. package/apps/devkit/app.jsx +728 -0
  226. package/apps/devkit/index.html +178 -0
  227. package/apps/devkit/md5.js +98 -0
  228. package/dist/{chunk-L5TWVHYB.mjs → chunk-B5LXMESP.mjs} +19 -9
  229. package/dist/{chunk-YEZ3U3F2.mjs → chunk-CLPJYIFC.mjs} +1 -1
  230. package/dist/{chunk-RSRPFWNL.mjs → chunk-TU3GL2HK.mjs} +1 -27
  231. package/dist/httpApi.mjs +2 -2
  232. package/dist/scheduledTasks.mjs +692 -483
  233. package/dist/{server-UZPDELUK.mjs → server-2UJDVZ32.mjs} +2 -2
  234. package/dist/wsServer.mjs +5 -4
  235. package/package.json +1 -1
  236. package/public/agent-icons/claude.svg +1 -0
  237. package/public/agent-icons/codex.svg +1 -0
  238. package/public/agent-icons/deepseek.svg +1 -0
  239. package/public/agent-icons/glm.svg +1 -0
  240. package/public/agent-icons/kimi.svg +1 -0
  241. package/public/agent-icons/ollama.svg +1 -0
  242. package/.next-prod/static/chunks/1372-cc9afa045dc4eb5e.js +0 -15
  243. package/.next-prod/static/chunks/6784-500e233d3e8f6b41.js +0 -381
  244. package/.next-prod/static/chunks/7482-8478af06d5aa0972.js +0 -25
  245. package/.next-prod/static/chunks/app/m/page-aff83d3f5f4047c5.js +0 -1
  246. package/.next-prod/static/css/2334aed02a409f57.css +0 -1
  247. /package/.next-prod/static/{ZFNy0XuBWptMqEQGi7GTy → 4Jgc-wu2w_CC8iS5G1QZf}/_buildManifest.js +0 -0
  248. /package/.next-prod/static/{ZFNy0XuBWptMqEQGi7GTy → 4Jgc-wu2w_CC8iS5G1QZf}/_ssgManifest.js +0 -0
@@ -0,0 +1,178 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>DevKit</title>
7
+ <meta name="cockpit-name" content="devkit">
8
+ <meta name="description" content="Offline developer toolbox: Base64, URL, JSON, hashes, timestamps, UUIDs">
9
+ <meta name="cockpit-icon" content="🧰">
10
+ <!-- Opt into the SDK's theme handling: follows the Cockpit host, falls back to
11
+ the OS outside it, and mounts the draggable light/dark toggle. -->
12
+ <meta name="cockpit-theme" content="auto">
13
+ <link rel="stylesheet" href="/html-lib/theme.css">
14
+ <style>
15
+ html, body { height: 100%; }
16
+ body {
17
+ margin: 0;
18
+ background: var(--background); color: var(--foreground);
19
+ font-family: var(--font-sans); font-size: 13px;
20
+ }
21
+ #root { height: 100%; }
22
+ .app { display: flex; flex-direction: column; height: 100%; }
23
+
24
+ /* ---- Tab bar. right: 44px on the last tab is not needed -- the SDK theme
25
+ toggle floats and is draggable, so we do not reserve space for it. ---- */
26
+ .tabs {
27
+ display: flex; gap: 2px; flex-wrap: wrap;
28
+ padding: 8px 10px 0; border-bottom: 1px solid var(--border);
29
+ }
30
+ .tab {
31
+ padding: 6px 14px; border: none; border-radius: var(--radius) var(--radius) 0 0;
32
+ background: transparent; color: var(--muted-foreground);
33
+ font-family: inherit; font-size: 13px; cursor: pointer;
34
+ border-bottom: 2px solid transparent; margin-bottom: -1px;
35
+ }
36
+ .tab:hover { color: var(--foreground); }
37
+ .tab.active {
38
+ color: var(--brand); border-bottom-color: var(--brand); font-weight: 600;
39
+ }
40
+
41
+ /* ---- Panel scaffold ---- */
42
+ .panel {
43
+ flex: 1; display: flex; flex-direction: column; min-height: 0;
44
+ padding: 10px 12px 12px; gap: 10px;
45
+ }
46
+ .bar { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; min-height: 26px; }
47
+ .bar-note { color: var(--muted-foreground); font-size: 12px; }
48
+ .cols {
49
+ flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 10px; min-height: 0;
50
+ }
51
+ @media (max-width: 720px) { .cols { grid-template-columns: 1fr; } }
52
+
53
+ .box {
54
+ display: flex; flex-direction: column; min-height: 0; min-width: 0;
55
+ border: 1px solid var(--border); border-radius: var(--radius);
56
+ background: var(--card); overflow: hidden;
57
+ }
58
+ .box-hd {
59
+ display: flex; justify-content: space-between; align-items: center; gap: 8px;
60
+ padding: 5px 6px 5px 10px; border-bottom: 1px solid var(--border);
61
+ font-size: 11px; letter-spacing: .04em; text-transform: uppercase;
62
+ color: var(--muted-foreground); flex: none;
63
+ }
64
+ .box-body { flex: 1; min-height: 0; display: flex; flex-direction: column; }
65
+
66
+ textarea.io, pre.io {
67
+ flex: 1; min-height: 0; margin: 0; padding: 10px;
68
+ border: none; outline: none; resize: none;
69
+ background: transparent; color: var(--card-foreground);
70
+ font-family: var(--font-mono); font-size: 12.5px; line-height: 1.6;
71
+ white-space: pre-wrap; word-break: break-word; overflow: auto;
72
+ }
73
+ textarea.io::placeholder { color: var(--muted-foreground); opacity: .7; }
74
+ pre.io.error { color: var(--destructive); }
75
+ pre.io.muted { color: var(--muted-foreground); }
76
+
77
+ /* ---- Controls ---- */
78
+ .seg { display: inline-flex; border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; }
79
+ .seg-btn {
80
+ padding: 4px 12px; border: none; background: transparent;
81
+ color: var(--muted-foreground); font-family: inherit; font-size: 12px; cursor: pointer;
82
+ }
83
+ .seg-btn + .seg-btn { border-left: 1px solid var(--border); }
84
+ .seg-btn:hover { color: var(--foreground); }
85
+ /* Text on a brand fill uses --background, not --brand-foreground. The latter
86
+ is teal-11 — a brand *tint* meant for brand-coloured text on a normal
87
+ surface — so on a brand fill it lands at ~1.7:1 and is unreadable.
88
+ --background inverts with the theme exactly opposite to how --brand does
89
+ (light: near-white on dark teal; dark: near-black on lighter teal), so this
90
+ one declaration stays legible in both without a .dark override. */
91
+ .seg-btn.active { background: var(--brand); color: var(--background); }
92
+
93
+ .btn {
94
+ padding: 4px 12px; border: 1px solid var(--border); border-radius: var(--radius);
95
+ background: var(--card); color: var(--foreground);
96
+ font-family: inherit; font-size: 12px; cursor: pointer;
97
+ }
98
+ .btn:hover { border-color: var(--brand); color: var(--brand); }
99
+ .btn.mini { padding: 2px 8px; font-size: 11px; text-transform: none; letter-spacing: 0; }
100
+
101
+ .check { display: inline-flex; align-items: center; gap: 5px; color: var(--muted-foreground); font-size: 12px; cursor: pointer; }
102
+ .check input { accent-color: var(--brand); margin: 0; }
103
+
104
+ .num {
105
+ width: 58px; padding: 4px 6px; border: 1px solid var(--border);
106
+ border-radius: var(--radius); background: var(--background); color: var(--foreground);
107
+ font-family: var(--font-mono); font-size: 12px;
108
+ }
109
+ .text-in {
110
+ flex: 1; min-width: 140px; padding: 6px 9px;
111
+ border: 1px solid var(--border); border-radius: var(--radius);
112
+ background: var(--background); color: var(--foreground);
113
+ font-family: var(--font-mono); font-size: 12.5px; outline: none;
114
+ }
115
+ .text-in:focus { border-color: var(--brand); }
116
+
117
+ /* ---- Hash rows ---- */
118
+ .rows { flex: 1; min-height: 0; overflow: auto; padding: 4px; }
119
+ .row {
120
+ display: flex; align-items: center; gap: 8px;
121
+ padding: 7px 6px 7px 10px; border-radius: var(--radius);
122
+ }
123
+ .row + .row { border-top: 1px solid var(--border); }
124
+ .row-label {
125
+ flex: none; width: 74px; color: var(--muted-foreground);
126
+ font-size: 11px; letter-spacing: .04em;
127
+ }
128
+ .row-value {
129
+ flex: 1; min-width: 0; font-family: var(--font-mono); font-size: 12.5px;
130
+ word-break: break-all; color: var(--card-foreground);
131
+ }
132
+ .row-value.muted { color: var(--muted-foreground); }
133
+
134
+ /* ---- Stacked sections (timestamp, JWT) ---- */
135
+ .stack { flex: 1; min-height: 0; overflow: auto; }
136
+ .section { display: flex; flex-direction: column; gap: 8px; padding: 10px; }
137
+ .section + .section { border-top: 1px solid var(--border); }
138
+ .section-title { font-size: 11px; letter-spacing: .04em; text-transform: uppercase; color: var(--muted-foreground); }
139
+ .section-hd { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
140
+ .mono-block {
141
+ margin: 0; font-family: var(--font-mono); font-size: 12.5px; line-height: 1.6;
142
+ white-space: pre-wrap; word-break: break-word; color: var(--card-foreground);
143
+ }
144
+ .mono-block.error { color: var(--destructive); }
145
+ .mono-block.muted { color: var(--muted-foreground); }
146
+ .kv { display: flex; align-items: baseline; gap: 8px; padding: 2px 0; }
147
+ .kv-k { flex: none; width: 66px; color: var(--muted-foreground); font-size: 11px; }
148
+ .kv-v { flex: 1; min-width: 0; font-family: var(--font-mono); font-size: 12.5px; word-break: break-all; }
149
+ .kv-v.error { color: var(--destructive); }
150
+ .kv-v.muted { color: var(--muted-foreground); }
151
+
152
+ /* ---- Toast ---- */
153
+ .toast {
154
+ position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%);
155
+ padding: 7px 16px; border: 1px solid var(--border); border-radius: 999px;
156
+ background: var(--card); color: var(--foreground); font-size: 12px;
157
+ box-shadow: 0 4px 16px hsl(var(--slate-12) / .18); z-index: 50;
158
+ }
159
+ </style>
160
+ </head>
161
+ <body>
162
+ <div id="root"></div>
163
+ <script src="./md5.js"></script>
164
+ <script src="/html-lib/react.production.min.js"></script>
165
+ <script src="/html-lib/react-dom.production.min.js"></script>
166
+ <script src="/html-lib/babel.min.js"></script>
167
+ <script>
168
+ (async () => {
169
+ const src = await (await fetch('./app.jsx')).text();
170
+ // Must be the classic runtime: the default (automatic) injects an
171
+ // `import react/jsx-runtime`, which throws "Cannot use import statement
172
+ // outside a module" once this is appended as a plain script.
173
+ const { code } = Babel.transform(src, { presets: [['react', { runtime: 'classic' }]] });
174
+ const s = document.createElement('script'); s.textContent = code; document.body.appendChild(s);
175
+ })();
176
+ </script>
177
+ </body>
178
+ </html>
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Minimal MD5, RFC 1321. Exposes a global `md5`.
3
+ *
4
+ * Why this file exists: MD5 is the one digest `crypto.subtle` does not offer,
5
+ * and shelling out to `md5sum` / `md5 -q` / `openssl dgst` is a portability
6
+ * mess (GNU vs BSD flags, differing output formats, tools missing entirely on
7
+ * slim images) plus a ~50ms process spawn per keystroke. Fifty lines here keep
8
+ * the app pure-computation, offline, and instant.
9
+ *
10
+ * md5(input) -> lowercase hex string. Accepts a string (encoded as UTF-8) or a
11
+ * Uint8Array / ArrayBuffer of raw bytes.
12
+ */
13
+ (function (global) {
14
+ 'use strict';
15
+
16
+ // Per-round left-rotation amounts.
17
+ var S = [
18
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
19
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
20
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
21
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
22
+ ];
23
+
24
+ // K[i] = floor(abs(sin(i + 1)) * 2^32); Uint32Array truncates for us.
25
+ var K = new Uint32Array(64);
26
+ for (var k = 0; k < 64; k++) {
27
+ K[k] = Math.floor(Math.abs(Math.sin(k + 1)) * 4294967296);
28
+ }
29
+
30
+ function rotl(x, c) {
31
+ return ((x << c) | (x >>> (32 - c))) >>> 0;
32
+ }
33
+
34
+ // Little-endian hex of one 32-bit word.
35
+ function wordToHex(x) {
36
+ var s = '';
37
+ for (var i = 0; i < 4; i++) {
38
+ s += ((x >>> (i * 8)) & 0xff).toString(16).padStart(2, '0');
39
+ }
40
+ return s;
41
+ }
42
+
43
+ function digest(bytes) {
44
+ var n = bytes.length;
45
+ // Append 0x80, pad with zeros, then an 8-byte little-endian bit length,
46
+ // so the total is a multiple of 64.
47
+ var padded = (n + 1 + 8 + 63) & ~63;
48
+ var buf = new Uint8Array(padded);
49
+ buf.set(bytes);
50
+ buf[n] = 0x80;
51
+
52
+ var view = new DataView(buf.buffer);
53
+ // n * 8 stays exact well past any textarea; split across two 32-bit words.
54
+ view.setUint32(padded - 8, (n * 8) >>> 0, true);
55
+ view.setUint32(padded - 4, Math.floor(n / 536870912) >>> 0, true);
56
+
57
+ var a0 = 0x67452301, b0 = 0xefcdab89, c0 = 0x98badcfe, d0 = 0x10325476;
58
+
59
+ for (var off = 0; off < padded; off += 64) {
60
+ var A = a0, B = b0, C = c0, D = d0;
61
+
62
+ for (var i = 0; i < 64; i++) {
63
+ var F, g;
64
+ if (i < 16) {
65
+ F = (B & C) | (~B & D);
66
+ g = i;
67
+ } else if (i < 32) {
68
+ F = (D & B) | (~D & C);
69
+ g = (5 * i + 1) & 15;
70
+ } else if (i < 48) {
71
+ F = B ^ C ^ D;
72
+ g = (3 * i + 5) & 15;
73
+ } else {
74
+ F = C ^ (B | ~D);
75
+ g = (7 * i) & 15;
76
+ }
77
+ F = (F + A + K[i] + view.getUint32(off + g * 4, true)) >>> 0;
78
+ A = D;
79
+ D = C;
80
+ C = B;
81
+ B = (B + rotl(F, S[i])) >>> 0;
82
+ }
83
+
84
+ a0 = (a0 + A) >>> 0;
85
+ b0 = (b0 + B) >>> 0;
86
+ c0 = (c0 + C) >>> 0;
87
+ d0 = (d0 + D) >>> 0;
88
+ }
89
+
90
+ return wordToHex(a0) + wordToHex(b0) + wordToHex(c0) + wordToHex(d0);
91
+ }
92
+
93
+ global.md5 = function md5(input) {
94
+ if (typeof input === 'string') return digest(new TextEncoder().encode(input));
95
+ if (input instanceof ArrayBuffer) return digest(new Uint8Array(input));
96
+ return digest(input);
97
+ };
98
+ })(typeof globalThis !== 'undefined' ? globalThis : this);
@@ -7,17 +7,14 @@ import {
7
7
  findCodexSessionPath,
8
8
  getClaudeSessionPath,
9
9
  getDeepseekBuiltinSessionPath,
10
- getDeepseekSessionPath,
11
10
  getGlmBuiltinSessionPath,
12
- getGlmSessionPath,
13
11
  getKimiBuiltinSessionPath,
14
- getKimiSessionPath,
15
12
  getOllamaSessionPath,
16
13
  getSessionFilePath,
17
14
  readJsonFile,
18
15
  withFileLock,
19
16
  writeJsonFile
20
- } from "./chunk-RSRPFWNL.mjs";
17
+ } from "./chunk-TU3GL2HK.mjs";
21
18
 
22
19
  // packages/feature/agent/src/server/state/globalState.ts
23
20
  import { createReadStream, existsSync, statSync } from "fs";
@@ -149,11 +146,8 @@ function generateTitle(aiTitle, summary, userMessages) {
149
146
  var CLAUDE_STYLE_PATHS = [
150
147
  getClaudeSessionPath,
151
148
  getOllamaSessionPath,
152
- getDeepseekSessionPath,
153
149
  getDeepseekBuiltinSessionPath,
154
- getKimiSessionPath,
155
150
  getKimiBuiltinSessionPath,
156
- getGlmSessionPath,
157
151
  getGlmBuiltinSessionPath
158
152
  ];
159
153
  function findClaudeStylePath(cwd, sessionId) {
@@ -583,6 +577,16 @@ function fanout(state, ev) {
583
577
  }
584
578
  }
585
579
  }
580
+ function isTransientRunEvent(message) {
581
+ return typeof message === "object" && message !== null && message.type === "usage_update";
582
+ }
583
+ function getUsageUpdateOutputTokens(message) {
584
+ if (typeof message !== "object" || message === null || message.type !== "usage_update") {
585
+ return null;
586
+ }
587
+ const outputTokens = message.output_tokens;
588
+ return typeof outputTokens === "number" && Number.isFinite(outputTokens) ? Math.max(0, Math.round(outputTokens)) : null;
589
+ }
586
590
  function startRun(key, cwd, promptText, runId) {
587
591
  const prev = registry.get(key);
588
592
  if (prev?.status === "running") return false;
@@ -617,7 +621,13 @@ function appendRun(key, message) {
617
621
  if (!r) return;
618
622
  if (r.status !== "running") return;
619
623
  bumpSeq(r);
620
- r.events.push(message);
624
+ const outputTokens = getUsageUpdateOutputTokens(message);
625
+ if (outputTokens !== null) {
626
+ r.outputTokens = Math.max(r.outputTokens ?? 0, outputTokens);
627
+ }
628
+ if (!isTransientRunEvent(message)) {
629
+ r.events.push(message);
630
+ }
621
631
  r.updatedAt = Date.now();
622
632
  fanout(r, { seq: r.seq, message });
623
633
  }
@@ -652,7 +662,7 @@ function markRunIdle(key, status = "idle") {
652
662
  function getRunSnapshot(key) {
653
663
  const r = registry.get(key);
654
664
  if (!r) return null;
655
- return { status: r.status, seq: r.seq, events: r.events.slice(), startedAt: r.startedAt };
665
+ return { status: r.status, seq: r.seq, events: r.events.slice(), startedAt: r.startedAt, outputTokens: r.outputTokens };
656
666
  }
657
667
  function isRunActive(key) {
658
668
  return registry.get(key)?.status === "running";
@@ -14,7 +14,7 @@ import {
14
14
  readJsonFile,
15
15
  sanitizedSpawnEnv,
16
16
  writeJsonFile
17
- } from "./chunk-RSRPFWNL.mjs";
17
+ } from "./chunk-TU3GL2HK.mjs";
18
18
 
19
19
  // packages/feature/console/src/server/plugins/browser/BrowserBridge.ts
20
20
  import { WebSocket } from "ws";
@@ -28640,16 +28640,14 @@ var CODEX_SESSION_INDEX_FILE = join4(COCKPIT_DIR, "codex-session-index.json");
28640
28640
  var HTML_APPS_FILE = join4(COCKPIT_DIR, "html.json");
28641
28641
  var REVIEW_DIR = join4(COCKPIT_DIR, "review");
28642
28642
  var REVIEW_SIGNAL_FILE = join4(REVIEW_DIR, "_signal");
28643
+ var APPS_DIR = join4(process.env.COCKPIT_ROOT || process.cwd(), "apps");
28643
28644
  var CLAUDE_DIR = join4(HOME_DIR, ".claude");
28644
28645
  var CLAUDE_PROJECTS_DIR = join4(CLAUDE_DIR, "projects");
28645
28646
  var DEEPSEEK_DIR = join4(COCKPIT_DIR, "deepseek");
28646
- var DEEPSEEK_PROJECTS_DIR = join4(DEEPSEEK_DIR, "projects");
28647
28647
  var DEEPSEEK_CREDENTIALS_FILE = join4(DEEPSEEK_DIR, "credentials.json");
28648
28648
  var KIMI_DIR = join4(COCKPIT_DIR, "kimi");
28649
- var KIMI_PROJECTS_DIR = join4(KIMI_DIR, "projects");
28650
28649
  var KIMI_CREDENTIALS_FILE = join4(KIMI_DIR, "credentials.json");
28651
28650
  var GLM_DIR = join4(COCKPIT_DIR, "glm");
28652
- var GLM_PROJECTS_DIR = join4(GLM_DIR, "projects");
28653
28651
  var GLM_CREDENTIALS_FILE = join4(GLM_DIR, "credentials.json");
28654
28652
  var OLLAMA_DIR = join4(COCKPIT_DIR, "ollama");
28655
28653
  var OLLAMA_CONFIG_FILE = join4(OLLAMA_DIR, "config.json");
@@ -28677,24 +28675,6 @@ function getClaudeProjectDir(cwd) {
28677
28675
  function getClaudeSessionPath(cwd, sessionId) {
28678
28676
  return join4(getClaudeProjectDir(cwd), `${sessionId}.jsonl`);
28679
28677
  }
28680
- function getDeepseekProjectDir(cwd) {
28681
- return join4(DEEPSEEK_PROJECTS_DIR, encodePath(cwd));
28682
- }
28683
- function getDeepseekSessionPath(cwd, sessionId) {
28684
- return join4(getDeepseekProjectDir(cwd), `${sessionId}.jsonl`);
28685
- }
28686
- function getKimiProjectDir(cwd) {
28687
- return join4(KIMI_PROJECTS_DIR, encodePath(cwd));
28688
- }
28689
- function getKimiSessionPath(cwd, sessionId) {
28690
- return join4(getKimiProjectDir(cwd), `${sessionId}.jsonl`);
28691
- }
28692
- function getGlmProjectDir(cwd) {
28693
- return join4(GLM_PROJECTS_DIR, encodePath(cwd));
28694
- }
28695
- function getGlmSessionPath(cwd, sessionId) {
28696
- return join4(getGlmProjectDir(cwd), `${sessionId}.jsonl`);
28697
- }
28698
28678
  var BUILTIN_SESSION_DIRS = {
28699
28679
  ollama: "ollama-sessions",
28700
28680
  deepseek: "deepseek-sessions",
@@ -30786,11 +30766,8 @@ export {
30786
30766
  REVIEW_DIR,
30787
30767
  REVIEW_SIGNAL_FILE,
30788
30768
  CLAUDE_PROJECTS_DIR,
30789
- DEEPSEEK_DIR,
30790
30769
  DEEPSEEK_CREDENTIALS_FILE,
30791
- KIMI_DIR,
30792
30770
  KIMI_CREDENTIALS_FILE,
30793
- GLM_DIR,
30794
30771
  GLM_CREDENTIALS_FILE,
30795
30772
  encodePath,
30796
30773
  getSessionFilePath,
@@ -30798,9 +30775,6 @@ export {
30798
30775
  getTerminalOutputPath,
30799
30776
  getBubbleOrderPath,
30800
30777
  getClaudeSessionPath,
30801
- getDeepseekSessionPath,
30802
- getKimiSessionPath,
30803
- getGlmSessionPath,
30804
30778
  getBuiltinSessionsRoot,
30805
30779
  getOllamaSessionPath,
30806
30780
  getDeepseekBuiltinSessionPath,
package/dist/httpApi.mjs CHANGED
@@ -22,10 +22,10 @@ import {
22
22
  unregisterBrowser,
23
23
  unregisterTerminal,
24
24
  writeStdinToCommand
25
- } from "./chunk-YEZ3U3F2.mjs";
25
+ } from "./chunk-CLPJYIFC.mjs";
26
26
  import {
27
27
  getTerminalHistoryPath
28
- } from "./chunk-RSRPFWNL.mjs";
28
+ } from "./chunk-TU3GL2HK.mjs";
29
29
  import "./chunk-7P6ASYW6.mjs";
30
30
 
31
31
  // src/lib/httpApi.ts