@surething/cockpit 1.0.259 → 1.0.261
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.
- package/.next-prod/BUILD_ID +1 -1
- package/.next-prod/app-path-routes-manifest.json +1 -1
- package/.next-prod/build-manifest.json +2 -2
- package/.next-prod/cockpit-build.json +1 -1
- package/.next-prod/prerender-manifest.json +4 -4
- package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
- package/.next-prod/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/_global-error.html +1 -1
- package/.next-prod/server/app/_global-error.rsc +1 -1
- package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found/page.js +1 -1
- package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
- package/.next-prod/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/_not-found.html +2 -2
- package/.next-prod/server/app/_not-found.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/codex/route.js +1 -1
- package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/deepseek/route.js +1 -1
- package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/glm/route.js +1 -1
- package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/kimi/route.js +1 -1
- package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/route.js +1 -1
- package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/stop/route.js +1 -1
- package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/glm/models/route.js +1 -1
- package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/glm/usage/route.js +1 -1
- package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
- package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/html-apps/route.js +1 -1
- package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/kimi/models/route.js +1 -1
- package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/kimi/usage/route.js +1 -1
- package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/project-state/route.js +1 -1
- package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/scheduled-tasks/route.js +2 -2
- package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
- package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/session-by-path/route.js +1 -1
- package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
- package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/sessions/projects/route.js +1 -1
- package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
- package/.next-prod/server/app/apps/[...path]/route.js +1 -1
- package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
- package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next-prod/server/app/m/page.js +1 -1
- package/.next-prod/server/app/m/page.js.nft.json +1 -1
- package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next-prod/server/app/page.js +1 -1
- package/.next-prod/server/app/page.js.nft.json +1 -1
- package/.next-prod/server/app/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/project/page.js +1 -1
- package/.next-prod/server/app/project/page.js.nft.json +1 -1
- package/.next-prod/server/app/project/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/review/[id]/page.js +1 -1
- package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
- package/.next-prod/server/app/review/[id]/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app-paths-manifest.json +1 -1
- package/.next-prod/server/chunks/3286.js +406 -270
- package/.next-prod/server/chunks/{9004.js → 3641.js} +2 -2
- package/.next-prod/server/chunks/516.js +1 -0
- package/.next-prod/server/chunks/5750.js +16 -10
- package/.next-prod/server/chunks/6495.js +1 -1
- package/.next-prod/server/chunks/6548.js +1 -1
- package/.next-prod/server/chunks/816.js +2 -0
- package/.next-prod/server/chunks/841.js +12 -10
- package/.next-prod/server/chunks/9352.js +4 -4
- package/.next-prod/server/chunks/9830.js +1 -1
- package/.next-prod/server/middleware-build-manifest.js +1 -1
- package/.next-prod/server/pages/404.html +2 -2
- package/.next-prod/server/pages/500.html +1 -1
- package/.next-prod/server/server-reference-manifest.json +1 -1
- package/.next-prod/static/chunks/1157-164bcf046a0a9b15.js +32 -0
- package/.next-prod/static/chunks/1372-d16d68b1b03a345a.js +15 -0
- package/.next-prod/static/chunks/{2653-3f8bfa49727caa72.js → 4333-9e6709e96d3ec973.js} +7 -7
- package/.next-prod/static/chunks/{225-75b2e22f496b56a1.js → 6160-958532439d324185.js} +2 -2
- package/.next-prod/static/chunks/6784-09dffdb0e8ca7fb3.js +381 -0
- package/.next-prod/static/chunks/app/{layout-fef0d44c94fcb415.js → layout-ab52fc1a83af968b.js} +1 -1
- package/.next-prod/static/chunks/app/m/page-7dcf56a65528216f.js +1 -0
- package/.next-prod/static/chunks/app/{page-824be00a023f34d7.js → page-5de8b6584e328a6f.js} +1 -1
- package/.next-prod/static/chunks/app/project/{page-824be00a023f34d7.js → page-5de8b6584e328a6f.js} +1 -1
- package/.next-prod/static/css/83c134c954630942.css +1 -0
- package/.next-prod/trace +14 -14
- package/.next-prod/trace-build +1 -1
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/apps/devkit/app.jsx +730 -0
- package/apps/devkit/index.html +178 -0
- package/apps/devkit/md5.js +98 -0
- package/dist/{chunk-L5TWVHYB.mjs → chunk-B5LXMESP.mjs} +19 -9
- package/dist/{chunk-YEZ3U3F2.mjs → chunk-CLPJYIFC.mjs} +1 -1
- package/dist/{chunk-RSRPFWNL.mjs → chunk-TU3GL2HK.mjs} +1 -27
- package/dist/httpApi.mjs +2 -2
- package/dist/scheduledTasks.mjs +685 -462
- package/dist/{server-UZPDELUK.mjs → server-2UJDVZ32.mjs} +2 -2
- package/dist/wsServer.mjs +5 -4
- package/package.json +1 -1
- package/public/agent-icons/claude.svg +1 -0
- package/public/agent-icons/codex.svg +1 -0
- package/public/agent-icons/deepseek.svg +1 -0
- package/public/agent-icons/glm.svg +1 -0
- package/public/agent-icons/kimi.svg +1 -0
- package/public/agent-icons/ollama.svg +1 -0
- package/.next-prod/server/chunks/151.js +0 -1
- package/.next-prod/static/chunks/1372-d94b8f9ed5cd2713.js +0 -15
- package/.next-prod/static/chunks/6784-ec12c61b77c64dc0.js +0 -381
- package/.next-prod/static/chunks/7482-3ffe7da02d3e7f45.js +0 -26
- package/.next-prod/static/chunks/app/m/page-aff83d3f5f4047c5.js +0 -1
- package/.next-prod/static/css/a82580b2376d7cae.css +0 -1
- /package/.next-prod/static/{F9dxCcbBY_bNPY4fxWaWe → pgteRwI6FQcp683smeSNO}/_buildManifest.js +0 -0
- /package/.next-prod/static/{F9dxCcbBY_bNPY4fxWaWe → pgteRwI6FQcp683smeSNO}/_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-
|
|
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
|
-
|
|
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";
|
|
@@ -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-
|
|
25
|
+
} from "./chunk-CLPJYIFC.mjs";
|
|
26
26
|
import {
|
|
27
27
|
getTerminalHistoryPath
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-TU3GL2HK.mjs";
|
|
29
29
|
import "./chunk-7P6ASYW6.mjs";
|
|
30
30
|
|
|
31
31
|
// src/lib/httpApi.ts
|