@surething/cockpit 1.0.208 → 1.0.209
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 +11 -9
- package/.next-prod/build-manifest.json +3 -3
- package/.next-prod/prerender-manifest.json +3 -3
- package/.next-prod/react-loadable-manifest.json +25 -1
- package/.next-prod/routes-manifest.json +12 -0
- package/.next-prod/server/app/_global-error/page.js +3 -3
- 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/_global-error.segment.rsc +1 -1
- package/.next-prod/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next-prod/server/app/_global-error.segments/_index.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 +2 -2
- 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 +1 -1
- package/.next-prod/server/app/_not-found.rsc +16 -17
- package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +16 -17
- package/.next-prod/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +5 -6
- package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found.segments/_not-found.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 +1 -0
- package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/agent/test/route_client-reference-manifest.js +1 -0
- package/.next-prod/server/app/api/bash/route.js +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 +18 -18
- package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/deepseek/route.js +4 -4
- package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/kimi/route.js +18 -18
- package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/ollama/route.js +20 -109
- package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/route.js +4 -4
- package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/claude-stats/route.js +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 +1 -1
- package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/comments/route.js +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 +15 -15
- package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/connect/route.js +3 -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 +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 +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 +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 +2 -2
- package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/dev/spans/route.js +1 -0
- package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/dev/spans/route_client-reference-manifest.js +1 -0
- package/.next-prod/server/app/api/extension/version/route.js +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/diff/route.js +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 +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 +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/global-state/route.js +1 -1
- package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/jupyter/load/route.js +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 +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 +1 -1
- package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/lsp/definition/route.js +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 +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 +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 +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 +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 +9 -9
- package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/connect/route.js +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 +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 +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 +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 +2 -2
- package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/neo4j/connect/route.js +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 +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/ollama/models/route.js +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 +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 +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 +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 +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 +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 +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/file/route.js +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 +1 -1
- package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/search/route.js +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 +1 -1
- package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/command/route.js +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/services/config/route.js +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/settings/route.js +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/aliases/route.js +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 +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 +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 +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 +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 +1 -1
- package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
- package/.next-prod/server/app/favicon.ico/route.js +1 -1
- package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next-prod/server/app/manifest.webmanifest/route.js +2 -2
- package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next-prod/server/app/manifest.webmanifest.body +1 -1
- package/.next-prod/server/app/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +11 -9
- package/.next-prod/server/chunks/2728.js +1 -0
- package/.next-prod/server/chunks/304.js +1 -0
- package/.next-prod/server/chunks/3718.js +1 -0
- package/.next-prod/server/chunks/3863.js +1 -0
- package/.next-prod/server/chunks/4034.js +114 -0
- package/.next-prod/server/chunks/5159.js +1 -0
- package/.next-prod/server/chunks/{6007.js → 5292.js} +2 -2
- package/.next-prod/server/chunks/5616.js +1 -0
- package/.next-prod/server/chunks/6955.js +1 -0
- package/.next-prod/server/chunks/7184.js +244 -0
- package/.next-prod/server/chunks/8916.js +1 -0
- package/.next-prod/server/chunks/9658.js +42 -0
- package/.next-prod/server/functions-config-manifest.json +2 -0
- package/.next-prod/server/middleware-build-manifest.js +1 -1
- package/.next-prod/server/middleware-react-loadable-manifest.js +1 -1
- package/.next-prod/server/pages/404.html +1 -1
- package/.next-prod/server/pages/500.html +1 -1
- package/.next-prod/server/server-reference-manifest.json +1 -1
- package/.next-prod/static/chunks/2580.69af80de5bcfcefe.js +1 -0
- package/.next-prod/static/chunks/2708.7263182a029113c8.js +1 -0
- package/.next-prod/static/chunks/327-9ffab8f0b2b0b4cd.js +13 -0
- package/.next-prod/static/chunks/{5204-c8293184aa55cdd5.js → 5204-babf0d0290febbec.js} +1 -1
- package/.next-prod/static/chunks/6345-3c06cdc8c89677b8.js +14 -0
- package/.next-prod/static/chunks/7562.8fdc3abdd45c77ab.js +1 -0
- package/.next-prod/static/chunks/8024-a869e23f4e8e5b38.js +29 -0
- package/.next-prod/static/chunks/9012.6ed079104670001d.js +1 -0
- package/.next-prod/static/chunks/9617.d038e8ea9fc93e24.js +1 -0
- package/.next-prod/static/chunks/96c8525a-f1e0653013503d49.js +2 -0
- package/.next-prod/static/chunks/app/_global-error/page-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/agent/test/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/bash/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/codex/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/kimi/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/ollama/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/claude-stats/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/commands/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/comments/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/columns/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/connect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/disconnect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/export/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/query/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/db/schemas/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/dev/spans/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/extension/version/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/file/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/blame/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/clipboard/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/copy/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/delete/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/expanded/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/index/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/init/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/paste/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/read/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/readdir/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/recent/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/save/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/search/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/stat/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/files/text/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branches/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commits/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/diff/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/discard/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/stage/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/status/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/unstage/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/git/worktree/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/global-state/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/load/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/save/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/definition/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/hover/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/references/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/status/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/columns/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/connect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/export/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/query/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/query/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/note/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/models/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/start/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/open-cursor/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/open-vscode/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/pick-folder/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/project-settings/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/project-state/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/projects/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/command/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/connect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/delete/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/get/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/keys/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/set/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/identify/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/order/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/share-info/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/review/users/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/services/config/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/services/scripts/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/session-by-path/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/settings/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/[id]/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/content/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/env/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/history/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/api/version/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/layout-e3b4c334b1eceb18.js +1 -0
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/app/{page-db32ebfdf1ac9174.js → page-3d87bb74a7b3d36e.js} +1 -1
- package/.next-prod/static/chunks/app/project/{page-db32ebfdf1ac9174.js → page-3d87bb74a7b3d36e.js} +1 -1
- package/.next-prod/static/chunks/app/review/[id]/page-7db3a48a13f1840c.js +1 -0
- package/.next-prod/static/chunks/bc21e3dd-a78364524623b9b0.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-826847d169541fa9.js +1 -0
- package/.next-prod/static/chunks/webpack-b618ac52d349e5ca.js +1 -0
- package/.next-prod/static/css/dcde719317bea028.css +1 -0
- package/.next-prod/static/zlybFiR-nH1wBW1--beGo/_buildManifest.js +1 -0
- package/.next-prod/trace +12 -12
- package/.next-prod/trace-build +1 -1
- package/.next-prod/types/app/api/agent/test/route.ts +351 -0
- package/.next-prod/types/app/api/dev/spans/route.ts +351 -0
- package/.next-prod/types/routes.d.ts +3 -1
- package/.next-prod/types/validator.ts +18 -0
- package/README.md +29 -8
- package/README.zh.md +30 -9
- package/dist/{chunk-VCZEGP64.mjs → chunk-FBR4KJI5.mjs} +24 -250
- package/dist/chunk-OWUW2O3D.mjs +28475 -0
- package/dist/{chunk-RSHKDWJM.mjs → chunk-TXBVUZVH.mjs} +94 -0
- package/dist/httpApi.mjs +239 -0
- package/dist/scheduledTasks.mjs +1239 -66
- package/dist/{server-K6XWP7DX.mjs → server-E7G55DY7.mjs} +9 -10
- package/dist/wsServer.mjs +867 -704
- package/package.json +15 -2
- package/server.mjs +3 -1
- package/.next-prod/server/chunks/240.js +0 -1
- package/.next-prod/server/chunks/3204.js +0 -42
- package/.next-prod/server/chunks/5466.js +0 -1
- package/.next-prod/server/chunks/7264.js +0 -5
- package/.next-prod/server/chunks/8750.js +0 -1
- package/.next-prod/server/chunks/900.js +0 -1
- package/.next-prod/server/chunks/9255.js +0 -1
- package/.next-prod/server/chunks/9755.js +0 -101
- package/.next-prod/server/chunks/987.js +0 -139
- package/.next-prod/static/WsSesL2O_jRoZztt2Y5r6/_buildManifest.js +0 -1
- package/.next-prod/static/chunks/327.8ecab0b86d52b597.js +0 -1
- package/.next-prod/static/chunks/5660-3d87dfb12f95e96d.js +0 -29
- package/.next-prod/static/chunks/6028-1d6ced1439a3f01f.js +0 -1
- package/.next-prod/static/chunks/6345-6b34b0528ff833a1.js +0 -14
- package/.next-prod/static/chunks/app/_global-error/page-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/bash/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/codex/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/kimi/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/ollama/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/claude-stats/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/commands/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/comments/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/columns/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/connect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/disconnect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/export/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/query/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/db/schemas/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/extension/version/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/file/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/blame/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/clipboard/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/copy/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/delete/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/expanded/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/index/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/init/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/paste/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/read/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/readdir/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/recent/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/save/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/search/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/stat/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/files/text/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branches/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commits/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/diff/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/discard/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/stage/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/status/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/unstage/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/git/worktree/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/global-state/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/load/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/save/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/definition/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/hover/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/references/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/status/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/columns/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/connect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/export/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/query/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/query/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/note/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/models/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/start/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/open-cursor/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/open-vscode/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/pick-folder/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/project-settings/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/project-state/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/projects/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/command/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/connect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/delete/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/get/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/keys/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/set/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/identify/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/order/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/share-info/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/review/users/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/services/config/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/services/scripts/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/session-by-path/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/settings/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/[id]/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/content/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/env/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/history/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/api/version/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/layout-92d5dcd25bad9196.js +0 -1
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/app/review/[id]/page-05cd4cb51babd64c.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-7975a2b8c7d0b214.js +0 -1
- package/.next-prod/static/chunks/webpack-bb0c02e3a9602d78.js +0 -1
- package/.next-prod/static/css/a7974d62fe853925.css +0 -1
- package/dist/chunk-HIRLDMCH.mjs +0 -314
- /package/.next-prod/static/{WsSesL2O_jRoZztt2Y5r6 → zlybFiR-nH1wBW1--beGo}/_ssgManifest.js +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Do not edit this file manually
|
|
3
3
|
|
|
4
4
|
type AppRoutes = "/" | "/project" | "/review/[id]"
|
|
5
|
-
type AppRouteHandlerRoutes = "/api/bash" | "/api/chat" | "/api/chat/codex" | "/api/chat/deepseek" | "/api/chat/kimi" | "/api/chat/ollama" | "/api/claude-stats" | "/api/commands" | "/api/comments" | "/api/db/columns" | "/api/db/connect" | "/api/db/disconnect" | "/api/db/export" | "/api/db/query" | "/api/db/schemas" | "/api/extension/version" | "/api/file" | "/api/files/blame" | "/api/files/clipboard" | "/api/files/copy" | "/api/files/delete" | "/api/files/expanded" | "/api/files/index" | "/api/files/init" | "/api/files/paste" | "/api/files/read" | "/api/files/readdir" | "/api/files/recent" | "/api/files/save" | "/api/files/search" | "/api/files/stat" | "/api/files/text" | "/api/git/branch-diff" | "/api/git/branches" | "/api/git/commit-diff" | "/api/git/commits" | "/api/git/diff" | "/api/git/discard" | "/api/git/stage" | "/api/git/status" | "/api/git/unstage" | "/api/git/worktree" | "/api/global-state" | "/api/jupyter/load" | "/api/jupyter/save" | "/api/jupyter/shutdown" | "/api/lsp/definition" | "/api/lsp/hover" | "/api/lsp/references" | "/api/lsp/status" | "/api/lsp/warmup" | "/api/mysql/columns" | "/api/mysql/connect" | "/api/mysql/disconnect" | "/api/mysql/export" | "/api/mysql/query" | "/api/mysql/schemas" | "/api/neo4j/connect" | "/api/neo4j/disconnect" | "/api/neo4j/query" | "/api/neo4j/schema" | "/api/note" | "/api/ollama/models" | "/api/ollama/start" | "/api/open-cursor" | "/api/open-vscode" | "/api/pick-folder" | "/api/pinned-sessions" | "/api/project-settings" | "/api/project-state" | "/api/projectGraph/file" | "/api/projectGraph/file-functions" | "/api/projectGraph/search" | "/api/projects" | "/api/redis/command" | "/api/redis/connect" | "/api/redis/delete" | "/api/redis/disconnect" | "/api/redis/get" | "/api/redis/keys" | "/api/redis/set" | "/api/review" | "/api/review/[id]" | "/api/review/[id]/comments" | "/api/review/[id]/replies" | "/api/review/identify" | "/api/review/order" | "/api/review/share-info" | "/api/review/users" | "/api/scheduled-tasks" | "/api/services/config" | "/api/services/scripts" | "/api/session-by-path" | "/api/session/[sessionId]/fork" | "/api/session/[sessionId]/history" | "/api/sessions" | "/api/sessions/projects" | "/api/sessions/projects/[encodedPath]" | "/api/settings" | "/api/skills" | "/api/skills/[id]" | "/api/skills/content" | "/api/terminal/aliases" | "/api/terminal/autocomplete" | "/api/terminal/bubble-order" | "/api/terminal/env" | "/api/terminal/history" | "/api/version"
|
|
5
|
+
type AppRouteHandlerRoutes = "/api/agent/test" | "/api/bash" | "/api/chat" | "/api/chat/codex" | "/api/chat/deepseek" | "/api/chat/kimi" | "/api/chat/ollama" | "/api/claude-stats" | "/api/commands" | "/api/comments" | "/api/db/columns" | "/api/db/connect" | "/api/db/disconnect" | "/api/db/export" | "/api/db/query" | "/api/db/schemas" | "/api/dev/spans" | "/api/extension/version" | "/api/file" | "/api/files/blame" | "/api/files/clipboard" | "/api/files/copy" | "/api/files/delete" | "/api/files/expanded" | "/api/files/index" | "/api/files/init" | "/api/files/paste" | "/api/files/read" | "/api/files/readdir" | "/api/files/recent" | "/api/files/save" | "/api/files/search" | "/api/files/stat" | "/api/files/text" | "/api/git/branch-diff" | "/api/git/branches" | "/api/git/commit-diff" | "/api/git/commits" | "/api/git/diff" | "/api/git/discard" | "/api/git/stage" | "/api/git/status" | "/api/git/unstage" | "/api/git/worktree" | "/api/global-state" | "/api/jupyter/load" | "/api/jupyter/save" | "/api/jupyter/shutdown" | "/api/lsp/definition" | "/api/lsp/hover" | "/api/lsp/references" | "/api/lsp/status" | "/api/lsp/warmup" | "/api/mysql/columns" | "/api/mysql/connect" | "/api/mysql/disconnect" | "/api/mysql/export" | "/api/mysql/query" | "/api/mysql/schemas" | "/api/neo4j/connect" | "/api/neo4j/disconnect" | "/api/neo4j/query" | "/api/neo4j/schema" | "/api/note" | "/api/ollama/models" | "/api/ollama/start" | "/api/open-cursor" | "/api/open-vscode" | "/api/pick-folder" | "/api/pinned-sessions" | "/api/project-settings" | "/api/project-state" | "/api/projectGraph/file" | "/api/projectGraph/file-functions" | "/api/projectGraph/search" | "/api/projects" | "/api/redis/command" | "/api/redis/connect" | "/api/redis/delete" | "/api/redis/disconnect" | "/api/redis/get" | "/api/redis/keys" | "/api/redis/set" | "/api/review" | "/api/review/[id]" | "/api/review/[id]/comments" | "/api/review/[id]/replies" | "/api/review/identify" | "/api/review/order" | "/api/review/share-info" | "/api/review/users" | "/api/scheduled-tasks" | "/api/services/config" | "/api/services/scripts" | "/api/session-by-path" | "/api/session/[sessionId]/fork" | "/api/session/[sessionId]/history" | "/api/sessions" | "/api/sessions/projects" | "/api/sessions/projects/[encodedPath]" | "/api/settings" | "/api/skills" | "/api/skills/[id]" | "/api/skills/content" | "/api/terminal/aliases" | "/api/terminal/autocomplete" | "/api/terminal/bubble-order" | "/api/terminal/env" | "/api/terminal/history" | "/api/version"
|
|
6
6
|
type PageRoutes = never
|
|
7
7
|
type LayoutRoutes = "/"
|
|
8
8
|
type RedirectRoutes = never
|
|
@@ -12,6 +12,7 @@ type Routes = AppRoutes | PageRoutes | LayoutRoutes | RedirectRoutes | RewriteRo
|
|
|
12
12
|
|
|
13
13
|
interface ParamMap {
|
|
14
14
|
"/": {}
|
|
15
|
+
"/api/agent/test": {}
|
|
15
16
|
"/api/bash": {}
|
|
16
17
|
"/api/chat": {}
|
|
17
18
|
"/api/chat/codex": {}
|
|
@@ -27,6 +28,7 @@ interface ParamMap {
|
|
|
27
28
|
"/api/db/export": {}
|
|
28
29
|
"/api/db/query": {}
|
|
29
30
|
"/api/db/schemas": {}
|
|
31
|
+
"/api/dev/spans": {}
|
|
30
32
|
"/api/extension/version": {}
|
|
31
33
|
"/api/file": {}
|
|
32
34
|
"/api/files/blame": {}
|
|
@@ -74,6 +74,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
74
74
|
type __Unused = __Check
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
+
// Validate ../../src/app/api/agent/test/route.ts
|
|
78
|
+
{
|
|
79
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/agent/test">> = Specific
|
|
80
|
+
const handler = {} as typeof import("../../src/app/api/agent/test/route.js")
|
|
81
|
+
type __Check = __IsExpected<typeof handler>
|
|
82
|
+
// @ts-ignore
|
|
83
|
+
type __Unused = __Check
|
|
84
|
+
}
|
|
85
|
+
|
|
77
86
|
// Validate ../../src/app/api/bash/route.ts
|
|
78
87
|
{
|
|
79
88
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/bash">> = Specific
|
|
@@ -209,6 +218,15 @@ type RouteHandlerConfig<Route extends AppRouteHandlerRoutes = AppRouteHandlerRou
|
|
|
209
218
|
type __Unused = __Check
|
|
210
219
|
}
|
|
211
220
|
|
|
221
|
+
// Validate ../../src/app/api/dev/spans/route.ts
|
|
222
|
+
{
|
|
223
|
+
type __IsExpected<Specific extends RouteHandlerConfig<"/api/dev/spans">> = Specific
|
|
224
|
+
const handler = {} as typeof import("../../src/app/api/dev/spans/route.js")
|
|
225
|
+
type __Check = __IsExpected<typeof handler>
|
|
226
|
+
// @ts-ignore
|
|
227
|
+
type __Unused = __Check
|
|
228
|
+
}
|
|
229
|
+
|
|
212
230
|
// Validate ../../src/app/api/extension/version/route.ts
|
|
213
231
|
{
|
|
214
232
|
type __IsExpected<Specific extends RouteHandlerConfig<"/api/extension/version">> = Specific
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
<h1 align="center">Cockpit — A Claude Code GUI for parallel AI coding</h1>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<strong>One seat.
|
|
10
|
+
<strong>One seat. Any AI. Everything under control.</strong><br/>
|
|
11
11
|
<sub><code>/ˈkɒkpɪt/</code> — like an aircraft cockpit</sub>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
> **Cockpit is
|
|
29
|
+
> **Cockpit is the open-source Claude Code GUI** — and a single canvas for whatever agent you bring next. Run multi-project Claude sessions out of the box; pop open a tab for **OpenAI Codex, DeepSeek, Kimi, or local Ollama** whenever you need. Built-in terminal, Chrome control, PostgreSQL / MySQL / Redis bubbles, code review, and slash modes — all local.
|
|
30
30
|
|
|
31
31
|
https://github.com/user-attachments/assets/18f1a5dc-64f3-4ff6-b9fc-9cd08181fbb8
|
|
32
32
|
|
|
@@ -42,6 +42,7 @@ Cockpit is the instrument panel. It does **not** replace Claude Code; it stands
|
|
|
42
42
|
|
|
43
43
|
| Pain with raw Claude Code | What Cockpit adds |
|
|
44
44
|
|---|---|
|
|
45
|
+
| Stuck on one model | **5 engines side by side** in tabs: Claude (default), OpenAI Codex, DeepSeek, Kimi, local Ollama — each its own session |
|
|
45
46
|
| One session at a time, terminal chaos at 3+ projects | **Multi-project tabs**, parallel agent sessions, red-dot inbox, desktop notifications |
|
|
46
47
|
| Image attachments are awkward | Drop / paste images straight into chat |
|
|
47
48
|
| "What was I debugging yesterday?" | Cmd+K cross-project session browser, pinning, forking |
|
|
@@ -50,13 +51,23 @@ Cockpit is the instrument panel. It does **not** replace Claude Code; it stands
|
|
|
50
51
|
| Reviewing AI output is friction | **LAN-shared review pages**, line-level comments, send any comment back as AI context |
|
|
51
52
|
| Same "do X but don't change code" prompt every day | **Slash modes** `/qa /fx /review /commit` + custom `~/.claude/commands/*.md` |
|
|
52
53
|
| No automation hooks | One-time / interval / cron-based **scheduled tasks** |
|
|
53
|
-
| "Cloud relay" trust concerns | **Fully local**. No telemetry.
|
|
54
|
+
| "Cloud relay" trust concerns | **Fully local**. No telemetry. Keys (Codex / DeepSeek / Kimi) stay in `~/.cockpit/settings.json` on your laptop. |
|
|
54
55
|
|
|
55
56
|
## Features
|
|
56
57
|
|
|
58
|
+
### Engines — Claude by default, bring any agent you want
|
|
59
|
+
|
|
60
|
+
- **Claude** *(default)* — full official Agent SDK; zero setup if `claude` CLI is already configured
|
|
61
|
+
- **OpenAI Codex** — reuses your `~/.codex` config; same chat, same shell + bubbles
|
|
62
|
+
- **DeepSeek** — Anthropic-compatible endpoint via the Claude SDK; paste a key, pick `v4-pro` or `v4-flash`
|
|
63
|
+
- **Kimi** *(Moonshot)* — tool calls render in chat just like Claude's
|
|
64
|
+
- **Ollama** — auto-starts the daemon; pick any pulled model from the chat header; fully offline
|
|
65
|
+
- Each engine lives in its own **tab with its own session history**; switch from the new-tab dropdown
|
|
66
|
+
- Keys stored locally in `~/.cockpit/settings.json`; **no cloud relay**
|
|
67
|
+
|
|
57
68
|
### Agent — AI chat that scales
|
|
58
69
|
|
|
59
|
-
-
|
|
70
|
+
- Default engine powered by the **official Claude Agent SDK** — zero extra setup
|
|
60
71
|
- **Multi-project concurrent sessions** with desktop notifications and red-dot badges
|
|
61
72
|
- Session **pinning, forking**, cross-project session browser (Cmd+K)
|
|
62
73
|
- `!command` prefix to run shell from chat — output piped back as context
|
|
@@ -113,8 +124,9 @@ Cockpit is the instrument panel. It does **not** replace Claude Code; it stands
|
|
|
113
124
|
- **Two-person team:** Senior reviews via LAN-shared review page, no GitHub PR round-trip needed for in-progress work.
|
|
114
125
|
- **Reviewing AI-generated PRs:** Switch the changed files into Code Map — changed functions are highlighted with their callers / callees still drawn around them, so blast-radius is one click away.
|
|
115
126
|
- **Full-stack chore mode:** `/fx` in one tab on a backend bug, `/review` in another on the frontend diff, `/commit` to wrap up — three slash modes, three different agent postures.
|
|
127
|
+
- **Cheap second opinion:** Same prompt in two tabs — Claude in one, **DeepSeek v4-pro** in the other — compare answers before you trust either.
|
|
116
128
|
- **AI-driven QA:** Browser Bubble + scheduled task = "every night at 2 AM, run this UI smoke flow and post a summary".
|
|
117
|
-
- **Privacy-sensitive code:** runs on your laptop
|
|
129
|
+
- **Privacy-sensitive code:** runs on your laptop. Pair with an **Ollama** tab for fully air-gapped sessions. No telemetry, no relay.
|
|
118
130
|
|
|
119
131
|
## Try online
|
|
120
132
|
|
|
@@ -125,10 +137,19 @@ No install, no AI chat (read-only sandbox, 5 min):
|
|
|
125
137
|
## Prerequisites
|
|
126
138
|
|
|
127
139
|
- **Node.js ≥ 20** — [nodejs.org](https://nodejs.org/)
|
|
128
|
-
- **Claude Code** — [docs.anthropic.com/en/docs/claude-code](https://docs.anthropic.com/en/docs/claude-code)
|
|
140
|
+
- **Claude Code** — [docs.anthropic.com/en/docs/claude-code](https://docs.anthropic.com/en/docs/claude-code) (default engine)
|
|
129
141
|
- **Git** — for git features (blame, diff, worktree, etc.)
|
|
130
142
|
- **Chrome** *(optional)* — for Browser Bubble; install the bundled extension from `~/.cockpit/chrome-extension`
|
|
131
143
|
|
|
144
|
+
### Optional, per non-Claude engine
|
|
145
|
+
|
|
146
|
+
- **OpenAI Codex** — log in once with `codex login` to populate `~/.codex`
|
|
147
|
+
- **DeepSeek** — get an API key at [api-docs.deepseek.com](https://api-docs.deepseek.com/); paste it into the engine picker
|
|
148
|
+
- **Kimi (Moonshot)** — get an API key at [platform.moonshot.cn](https://platform.moonshot.cn/); paste it into the engine picker
|
|
149
|
+
- **Ollama** — install [ollama.com](https://ollama.com/) and `ollama pull <model>`; Cockpit auto-starts the daemon
|
|
150
|
+
|
|
151
|
+
> All API keys are stored locally in `~/.cockpit/settings.json`. No cloud relay.
|
|
152
|
+
|
|
132
153
|
## Install
|
|
133
154
|
|
|
134
155
|
```bash
|
|
@@ -163,13 +184,13 @@ cockpit terminal <id> output # get terminal output
|
|
|
163
184
|
|
|
164
185
|
| | Raw Claude Code CLI | IDE plugin (Cursor, Continue) | Aider TUI | **Cockpit** |
|
|
165
186
|
|---|---|---|---|---|
|
|
187
|
+
| Multi-engine in app | Claude only | varies | yes, config-driven | **5 in-app: Claude, Codex, DeepSeek, Kimi, Ollama** |
|
|
166
188
|
| Multi-project parallel | tmux required | multi-window | one at a time | **first-class** |
|
|
167
189
|
| Cross-project search | grep | per-window | local | **Cmd+K** |
|
|
168
190
|
| Browser / DB control | ❌ | usually ❌ | ❌ | **✅ Bubbles** |
|
|
169
191
|
| Code review surface | git tools | PR provider | git | **LAN-shared** |
|
|
170
192
|
| Slash modes | manual | per-plugin | yes | **`/qa /fx /review /commit` + custom** |
|
|
171
193
|
| Local-only / no cloud relay | ✅ | varies | ✅ | **✅** |
|
|
172
|
-
| Day-1 SDK features | ✅ | wait | varies | **✅ official SDK** |
|
|
173
194
|
| Open source | ✅ | mostly ❌ | ✅ | **✅ MIT** |
|
|
174
195
|
|
|
175
196
|
Read the long version: [Claude Code GUI: CLI vs Cockpit vs IDE plugins](https://cocking.cc/en/blog/claude-code-gui-comparison/)
|
|
@@ -193,7 +214,7 @@ npm run lint # ESLint
|
|
|
193
214
|
|
|
194
215
|
## Tech stack
|
|
195
216
|
|
|
196
|
-
Next.js 16 · React 19 · TypeScript · TailwindCSS · xterm.js · Shiki · i18next · Claude Agent SDK
|
|
217
|
+
Next.js 16 · React 19 · TypeScript · TailwindCSS · xterm.js · node-pty · Shiki · tree-sitter (WASM) · i18next · Claude Agent SDK · Vercel AI SDK
|
|
197
218
|
|
|
198
219
|
## Contributing
|
|
199
220
|
|
package/README.zh.md
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
</a>
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
|
-
<h1 align="center">Cockpit ——
|
|
7
|
+
<h1 align="center">Cockpit —— Claude Code GUI,也接得住你想要的任何 Agent</h1>
|
|
8
8
|
|
|
9
9
|
<p align="center">
|
|
10
|
-
<strong>One seat.
|
|
10
|
+
<strong>One seat. Any AI. Everything under control.</strong><br/>
|
|
11
11
|
<sub><code>/ˈkɒkpɪt/</code> —— 像飞机驾驶舱</sub>
|
|
12
12
|
</p>
|
|
13
13
|
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
---
|
|
28
28
|
|
|
29
|
-
> **Cockpit 是开源的 Claude Code GUI
|
|
29
|
+
> **Cockpit 是开源的 Claude Code GUI** —— 也是你想接入的任何 Agent 的统一画布。多项目 Claude 会话开箱即用;想用 **OpenAI Codex、DeepSeek、Kimi 或本地 Ollama**?直接新开一个 tab。内置终端、Chrome 自动化、PostgreSQL / MySQL / Redis 气泡、代码评审与斜杠模式 —— 全部本地。
|
|
30
30
|
|
|
31
31
|
https://github.com/user-attachments/assets/18f1a5dc-64f3-4ff6-b9fc-9cd08181fbb8
|
|
32
32
|
|
|
@@ -42,6 +42,7 @@ Cockpit 就是那个仪表盘。它**不替代** Claude Code,而是站在官
|
|
|
42
42
|
|
|
43
43
|
| 裸用 Claude Code 的痛 | Cockpit 的解法 |
|
|
44
44
|
|---|---|
|
|
45
|
+
| 只能用一个模型 | **5 个引擎按 tab 并排**:Claude(默认)、OpenAI Codex、DeepSeek、Kimi、本地 Ollama —— 每个 tab 独立会话 |
|
|
45
46
|
| 一次只能开一个会话,3+ 项目就乱 | **多项目标签页**、并发 Agent 会话、红点收件箱、桌面通知 |
|
|
46
47
|
| 图片附件麻烦 | 拖拽 / 粘贴图片直接进对话 |
|
|
47
48
|
| "我昨天调的那个 bug 在哪?" | Cmd+K 跨项目会话浏览,会话固定 / 分叉 |
|
|
@@ -50,13 +51,23 @@ Cockpit 就是那个仪表盘。它**不替代** Claude Code,而是站在官
|
|
|
50
51
|
| AI 输出审阅低效 | **局域网共享评审页**、行级评论、任意评论可回喂给 AI |
|
|
51
52
|
| 每天写一遍"做 X 但不要动代码" | **斜杠模式** `/qa /fx /review /commit` + 自定义 `~/.claude/commands/*.md` |
|
|
52
53
|
| 没有自动化触发器 | 一次性 / 间隔 / **Cron** **定时任务** |
|
|
53
|
-
| 担心"云端中转" |
|
|
54
|
+
| 担心"云端中转" | **完全本地**。无遥测,Codex / DeepSeek / Kimi 的 Key 仅存在本机 `~/.cockpit/settings.json` |
|
|
54
55
|
|
|
55
56
|
## 功能特性
|
|
56
57
|
|
|
58
|
+
### 引擎 —— 默认 Claude,也接得住你想要的任何 Agent
|
|
59
|
+
|
|
60
|
+
- **Claude** *(默认)* —— 完整官方 Agent SDK;`claude` CLI 已配置即零额外设置
|
|
61
|
+
- **OpenAI Codex** —— 直接读 `~/.codex` 配置,聊天 / Shell / 气泡都一样
|
|
62
|
+
- **DeepSeek** —— 通过 Claude SDK 走 Anthropic 兼容端点;粘 Key,选 `v4-pro` 或 `v4-flash`
|
|
63
|
+
- **Kimi** *(Moonshot)* —— 函数调用在聊天里完整渲染,跟 Claude 一样
|
|
64
|
+
- **Ollama** —— 自动拉起守护进程;从聊天头部下拉任意已 pull 的模型;完全离线
|
|
65
|
+
- 每个引擎跑在**独立 tab,独立会话历史**;新建 tab 时下拉切换
|
|
66
|
+
- API Key 仅保存在本机 `~/.cockpit/settings.json`,**无云端中转**
|
|
67
|
+
|
|
57
68
|
### Agent —— 可扩展的 AI 对话
|
|
58
69
|
|
|
59
|
-
-
|
|
70
|
+
- 默认引擎走**官方 Claude Agent SDK** —— 零额外设置
|
|
60
71
|
- **多项目并发会话**,桌面通知 + 红点徽标
|
|
61
72
|
- 会话**固定 / 分叉**,跨项目会话浏览(Cmd+K)
|
|
62
73
|
- `!command` 前缀直接执行 shell —— 输出回流为对话上下文
|
|
@@ -113,8 +124,9 @@ Cockpit 就是那个仪表盘。它**不替代** Claude Code,而是站在官
|
|
|
113
124
|
- **二人小团队:** Senior 用局域网共享评审页 review,半成品代码不用绕 GitHub PR。
|
|
114
125
|
- **评审 AI 写的 PR:** 把改动文件切到 Code Map,**改动过的函数被高亮**,周围还画着它们的 caller / callee —— 一眼看清这次改动的爆炸半径。
|
|
115
126
|
- **全栈杂活模式:** 后端 bug 一个 tab 跑 `/fx`,前端 diff 另一个 tab 跑 `/review`,最后 `/commit` 收尾 —— 三种姿态、三种 Agent 模式。
|
|
127
|
+
- **便宜的二次意见:** 同一个 prompt 在两个 tab 跑 —— 一个 Claude、一个 **DeepSeek v4-pro**,对比答案后再决定相信谁。
|
|
116
128
|
- **AI 自动化 QA:** 浏览器气泡 + 定时任务 = "每晚 2 点跑一遍 UI 冒烟流程并发摘要"。
|
|
117
|
-
- **隐私敏感代码:**
|
|
129
|
+
- **隐私敏感代码:** 在你的笔记本上跑。配合 **Ollama** tab 即可完全断网工作。无遥测、无中转。
|
|
118
130
|
|
|
119
131
|
## 在线体验
|
|
120
132
|
|
|
@@ -125,10 +137,19 @@ Cockpit 就是那个仪表盘。它**不替代** Claude Code,而是站在官
|
|
|
125
137
|
## 前置依赖
|
|
126
138
|
|
|
127
139
|
- **Node.js ≥ 20** —— [nodejs.org](https://nodejs.org/)
|
|
128
|
-
- **Claude Code** —— [docs.anthropic.com/en/docs/claude-code](https://docs.anthropic.com/en/docs/claude-code)
|
|
140
|
+
- **Claude Code** —— [docs.anthropic.com/en/docs/claude-code](https://docs.anthropic.com/en/docs/claude-code)(默认引擎)
|
|
129
141
|
- **Git** —— 用于 Git 相关功能(blame、diff、worktree 等)
|
|
130
142
|
- **Chrome** *(可选)* —— 浏览器气泡需安装 `~/.cockpit/chrome-extension` 中的扩展
|
|
131
143
|
|
|
144
|
+
### 可选,按引擎
|
|
145
|
+
|
|
146
|
+
- **OpenAI Codex** —— 执行一次 `codex login` 即可生成 `~/.codex` 配置
|
|
147
|
+
- **DeepSeek** —— 到 [api-docs.deepseek.com](https://api-docs.deepseek.com/) 申请 API Key,在引擎选择器里粘贴
|
|
148
|
+
- **Kimi (Moonshot)** —— 到 [platform.moonshot.cn](https://platform.moonshot.cn/) 申请 API Key,在引擎选择器里粘贴
|
|
149
|
+
- **Ollama** —— 安装 [ollama.com](https://ollama.com/) 并 `ollama pull <model>`;Cockpit 会自动拉起守护进程
|
|
150
|
+
|
|
151
|
+
> 所有 API Key 仅保存在本机 `~/.cockpit/settings.json`。无云端中转。
|
|
152
|
+
|
|
132
153
|
## 安装
|
|
133
154
|
|
|
134
155
|
```bash
|
|
@@ -163,13 +184,13 @@ cockpit terminal <id> output # 获取终端输出
|
|
|
163
184
|
|
|
164
185
|
| | 裸 Claude Code CLI | IDE 插件(Cursor、Continue)| Aider TUI | **Cockpit** |
|
|
165
186
|
|---|---|---|---|---|
|
|
187
|
+
| 多引擎内置 | 仅 Claude | 不一定 | 配置驱动 | **内置 5 个:Claude、Codex、DeepSeek、Kimi、Ollama** |
|
|
166
188
|
| 多项目并行 | 需 tmux | 多窗口 | 一次一个 | **一等公民** |
|
|
167
189
|
| 跨项目搜索 | grep | 各窗口独立 | 本地 | **Cmd+K** |
|
|
168
190
|
| 浏览器 / DB 控制 | ❌ | 通常 ❌ | ❌ | **✅ Bubbles** |
|
|
169
191
|
| 代码评审面 | git 工具 | PR 平台 | git | **局域网共享** |
|
|
170
192
|
| 斜杠模式 | 手动 | 各插件 | 有 | **`/qa /fx /review /commit` + 自定义** |
|
|
171
193
|
| 纯本地 / 不上云 | ✅ | 不一定 | ✅ | **✅** |
|
|
172
|
-
| 新 SDK 能力第一天可用 | ✅ | 等 | 不一定 | **✅ 官方 SDK** |
|
|
173
194
|
| 开源 | ✅ | 多数 ❌ | ✅ | **✅ MIT** |
|
|
174
195
|
|
|
175
196
|
详细对比:[Claude Code GUI 全景对比:CLI、Cursor、Aider 还是 Cockpit?](https://cocking.cc/zh/blog/claude-code-gui-comparison/)
|
|
@@ -193,7 +214,7 @@ npm run lint # ESLint
|
|
|
193
214
|
|
|
194
215
|
## 技术栈
|
|
195
216
|
|
|
196
|
-
Next.js 16 · React 19 · TypeScript · TailwindCSS · xterm.js · Shiki · i18next · Claude Agent SDK
|
|
217
|
+
Next.js 16 · React 19 · TypeScript · TailwindCSS · xterm.js · node-pty · Shiki · tree-sitter (WASM) · i18next · Claude Agent SDK · Vercel AI SDK
|
|
197
218
|
|
|
198
219
|
## 贡献
|
|
199
220
|
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ensureParentDir,
|
|
3
3
|
getTerminalHistoryPath,
|
|
4
4
|
getTerminalOutputPath
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TXBVUZVH.mjs";
|
|
6
6
|
|
|
7
7
|
// packages/feature/console/src/server/plugins/browser/BrowserBridge.ts
|
|
8
8
|
import { WebSocket } from "ws";
|
|
@@ -105,45 +105,6 @@ function sendCommandToBrowser(shortId, reqId, action, params) {
|
|
|
105
105
|
return true;
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
// packages/feature/console/src/server/plugins/database/PgPoolManager.ts
|
|
109
|
-
import pg from "pg";
|
|
110
|
-
var { Pool } = pg;
|
|
111
|
-
var PgPoolManager = class {
|
|
112
|
-
constructor() {
|
|
113
|
-
this.pools = /* @__PURE__ */ new Map();
|
|
114
|
-
}
|
|
115
|
-
/** Get or create a pool for a given bubble id + connection string */
|
|
116
|
-
async getPool(id, connectionString) {
|
|
117
|
-
const managed = this.pools.get(id);
|
|
118
|
-
if (managed && managed.connectionString === connectionString) {
|
|
119
|
-
return managed.pool;
|
|
120
|
-
}
|
|
121
|
-
if (managed) {
|
|
122
|
-
await managed.pool.end().catch(() => {
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
const pool = new Pool({
|
|
126
|
-
connectionString,
|
|
127
|
-
max: 5,
|
|
128
|
-
idleTimeoutMillis: 6e4,
|
|
129
|
-
connectionTimeoutMillis: 1e4
|
|
130
|
-
});
|
|
131
|
-
this.pools.set(id, { pool, connectionString, createdAt: Date.now() });
|
|
132
|
-
return pool;
|
|
133
|
-
}
|
|
134
|
-
/** Disconnect and remove a pool */
|
|
135
|
-
async disconnect(id) {
|
|
136
|
-
const managed = this.pools.get(id);
|
|
137
|
-
if (managed) {
|
|
138
|
-
await managed.pool.end().catch(() => {
|
|
139
|
-
});
|
|
140
|
-
this.pools.delete(id);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
var g = globalThis;
|
|
145
|
-
var pgPoolManager = g.__pgPoolManager ?? (g.__pgPoolManager = new PgPoolManager());
|
|
146
|
-
|
|
147
108
|
// packages/feature/console/src/server/plugins/jupyter/JupyterKernelManager.ts
|
|
148
109
|
import { spawn } from "child_process";
|
|
149
110
|
import { join } from "path";
|
|
@@ -408,191 +369,8 @@ var JupyterKernelManager = class {
|
|
|
408
369
|
}
|
|
409
370
|
}
|
|
410
371
|
};
|
|
411
|
-
var
|
|
412
|
-
var kernelManager =
|
|
413
|
-
|
|
414
|
-
// packages/feature/console/src/server/plugins/mysql/MySQLPoolManager.ts
|
|
415
|
-
import mysql from "mysql2/promise";
|
|
416
|
-
var MySQLPoolManager = class {
|
|
417
|
-
constructor() {
|
|
418
|
-
this.pools = /* @__PURE__ */ new Map();
|
|
419
|
-
}
|
|
420
|
-
/** Get or create a pool for a given bubble id + connection string */
|
|
421
|
-
async getPool(id, connectionString) {
|
|
422
|
-
const managed = this.pools.get(id);
|
|
423
|
-
if (managed && managed.connectionString === connectionString) {
|
|
424
|
-
return managed.pool;
|
|
425
|
-
}
|
|
426
|
-
if (managed) {
|
|
427
|
-
await managed.pool.end().catch(() => {
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
const pool = mysql.createPool({
|
|
431
|
-
uri: connectionString,
|
|
432
|
-
connectionLimit: 5,
|
|
433
|
-
idleTimeout: 6e4,
|
|
434
|
-
connectTimeout: 1e4
|
|
435
|
-
});
|
|
436
|
-
this.pools.set(id, { pool, connectionString, createdAt: Date.now() });
|
|
437
|
-
return pool;
|
|
438
|
-
}
|
|
439
|
-
/** Disconnect and remove a pool */
|
|
440
|
-
async disconnect(id) {
|
|
441
|
-
const managed = this.pools.get(id);
|
|
442
|
-
if (managed) {
|
|
443
|
-
await managed.pool.end().catch(() => {
|
|
444
|
-
});
|
|
445
|
-
this.pools.delete(id);
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
};
|
|
449
|
-
var g3 = globalThis;
|
|
450
|
-
var mysqlPoolManager = g3.__mysqlPoolManager ?? (g3.__mysqlPoolManager = new MySQLPoolManager());
|
|
451
|
-
|
|
452
|
-
// packages/feature/console/src/server/plugins/neo4j/Neo4jManager.ts
|
|
453
|
-
import neo4j from "neo4j-driver";
|
|
454
|
-
var Neo4jManager = class {
|
|
455
|
-
constructor() {
|
|
456
|
-
this.drivers = /* @__PURE__ */ new Map();
|
|
457
|
-
}
|
|
458
|
-
async getDriver(id, connectionString) {
|
|
459
|
-
const existing = this.drivers.get(id);
|
|
460
|
-
if (existing) {
|
|
461
|
-
if (existing.connectionString === connectionString) return existing.driver;
|
|
462
|
-
await this.disconnect(id);
|
|
463
|
-
}
|
|
464
|
-
const url = new URL(connectionString);
|
|
465
|
-
const scheme = url.protocol.replace(":", "");
|
|
466
|
-
const host = url.hostname;
|
|
467
|
-
const port = url.port || "7687";
|
|
468
|
-
const user = decodeURIComponent(url.username || "neo4j");
|
|
469
|
-
const password = decodeURIComponent(url.password || "");
|
|
470
|
-
const uri = `${scheme}://${host}:${port}`;
|
|
471
|
-
const driver = neo4j.driver(uri, neo4j.auth.basic(user, password));
|
|
472
|
-
await driver.verifyConnectivity();
|
|
473
|
-
this.drivers.set(id, { driver, connectionString, createdAt: Date.now() });
|
|
474
|
-
return driver;
|
|
475
|
-
}
|
|
476
|
-
async disconnect(id) {
|
|
477
|
-
const managed = this.drivers.get(id);
|
|
478
|
-
if (managed) {
|
|
479
|
-
await managed.driver.close().catch(() => {
|
|
480
|
-
});
|
|
481
|
-
this.drivers.delete(id);
|
|
482
|
-
}
|
|
483
|
-
}
|
|
484
|
-
async runCypher(id, connectionString, cypher, params) {
|
|
485
|
-
const driver = await this.getDriver(id, connectionString);
|
|
486
|
-
const session = driver.session();
|
|
487
|
-
try {
|
|
488
|
-
const start = Date.now();
|
|
489
|
-
const result = await session.run(cypher, params || {});
|
|
490
|
-
const duration = Date.now() - start;
|
|
491
|
-
const records = result.records.map((record) => {
|
|
492
|
-
const obj = {};
|
|
493
|
-
for (const key of record.keys) {
|
|
494
|
-
obj[key] = this.serializeValue(record.get(key));
|
|
495
|
-
}
|
|
496
|
-
return obj;
|
|
497
|
-
});
|
|
498
|
-
return {
|
|
499
|
-
records,
|
|
500
|
-
keys: result.records.length > 0 ? result.records[0].keys : [],
|
|
501
|
-
duration,
|
|
502
|
-
counters: result.summary.counters.updates()
|
|
503
|
-
};
|
|
504
|
-
} finally {
|
|
505
|
-
await session.close();
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
serializeValue(val) {
|
|
509
|
-
if (val === null || val === void 0) return null;
|
|
510
|
-
if (neo4j.isInt(val)) return val.toNumber();
|
|
511
|
-
if (val && typeof val === "object" && "labels" in val && "properties" in val) {
|
|
512
|
-
const node = val;
|
|
513
|
-
return {
|
|
514
|
-
_type: "node",
|
|
515
|
-
_id: this.serializeValue(node.identity),
|
|
516
|
-
_labels: node.labels,
|
|
517
|
-
...Object.fromEntries(
|
|
518
|
-
Object.entries(node.properties).map(([k, v]) => [k, this.serializeValue(v)])
|
|
519
|
-
)
|
|
520
|
-
};
|
|
521
|
-
}
|
|
522
|
-
if (val && typeof val === "object" && "type" in val && "start" in val && "end" in val && "properties" in val) {
|
|
523
|
-
const rel = val;
|
|
524
|
-
return {
|
|
525
|
-
_type: "relationship",
|
|
526
|
-
_id: this.serializeValue(rel.identity),
|
|
527
|
-
_relType: rel.type,
|
|
528
|
-
_start: this.serializeValue(rel.start),
|
|
529
|
-
_end: this.serializeValue(rel.end),
|
|
530
|
-
...Object.fromEntries(
|
|
531
|
-
Object.entries(rel.properties).map(([k, v]) => [k, this.serializeValue(v)])
|
|
532
|
-
)
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
if (val && typeof val === "object" && "segments" in val) {
|
|
536
|
-
const path = val;
|
|
537
|
-
return {
|
|
538
|
-
_type: "path",
|
|
539
|
-
segments: path.segments.map((s) => ({
|
|
540
|
-
start: this.serializeValue(s.start),
|
|
541
|
-
relationship: this.serializeValue(s.relationship),
|
|
542
|
-
end: this.serializeValue(s.end)
|
|
543
|
-
}))
|
|
544
|
-
};
|
|
545
|
-
}
|
|
546
|
-
if (Array.isArray(val)) return val.map((v) => this.serializeValue(v));
|
|
547
|
-
if (val && typeof val === "object" && val.constructor === Object) {
|
|
548
|
-
return Object.fromEntries(
|
|
549
|
-
Object.entries(val).map(([k, v]) => [k, this.serializeValue(v)])
|
|
550
|
-
);
|
|
551
|
-
}
|
|
552
|
-
return val;
|
|
553
|
-
}
|
|
554
|
-
};
|
|
555
|
-
var g4 = globalThis;
|
|
556
|
-
var neo4jManager = g4.__neo4jManager ?? (g4.__neo4jManager = new Neo4jManager());
|
|
557
|
-
|
|
558
|
-
// packages/feature/console/src/server/plugins/redis/RedisManager.ts
|
|
559
|
-
import Redis from "ioredis";
|
|
560
|
-
var RedisManager = class {
|
|
561
|
-
constructor() {
|
|
562
|
-
this.clients = /* @__PURE__ */ new Map();
|
|
563
|
-
}
|
|
564
|
-
/** Get or create a Redis client for a given bubble id + connection string */
|
|
565
|
-
async getClient(id, connectionString) {
|
|
566
|
-
const managed = this.clients.get(id);
|
|
567
|
-
if (managed && managed.connectionString === connectionString) {
|
|
568
|
-
if (managed.client.status === "ready") return managed.client;
|
|
569
|
-
await managed.client.quit().catch(() => {
|
|
570
|
-
});
|
|
571
|
-
} else if (managed) {
|
|
572
|
-
await managed.client.quit().catch(() => {
|
|
573
|
-
});
|
|
574
|
-
}
|
|
575
|
-
const client = new Redis(connectionString, {
|
|
576
|
-
lazyConnect: true,
|
|
577
|
-
connectTimeout: 1e4,
|
|
578
|
-
maxRetriesPerRequest: 1
|
|
579
|
-
});
|
|
580
|
-
await client.connect();
|
|
581
|
-
this.clients.set(id, { client, connectionString, createdAt: Date.now() });
|
|
582
|
-
return client;
|
|
583
|
-
}
|
|
584
|
-
/** Disconnect and remove a client */
|
|
585
|
-
async disconnect(id) {
|
|
586
|
-
const managed = this.clients.get(id);
|
|
587
|
-
if (managed) {
|
|
588
|
-
await managed.client.quit().catch(() => {
|
|
589
|
-
});
|
|
590
|
-
this.clients.delete(id);
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
};
|
|
594
|
-
var g5 = globalThis;
|
|
595
|
-
var redisManager = g5.__redisManager ?? (g5.__redisManager = new RedisManager());
|
|
372
|
+
var g = globalThis;
|
|
373
|
+
var kernelManager = g[GLOBAL_KEY] ?? (g[GLOBAL_KEY] = new JupyterKernelManager());
|
|
596
374
|
|
|
597
375
|
// packages/feature/console/src/server/terminal/TerminalBridge.ts
|
|
598
376
|
var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("terminal_bridge_registry");
|
|
@@ -600,24 +378,24 @@ var REVERSE_KEY = /* @__PURE__ */ Symbol.for("terminal_bridge_reverse");
|
|
|
600
378
|
var OUTPUT_LISTENERS_KEY = /* @__PURE__ */ Symbol.for("terminal_bridge_output_listeners");
|
|
601
379
|
var EXIT_LISTENERS_KEY = /* @__PURE__ */ Symbol.for("terminal_bridge_exit_listeners");
|
|
602
380
|
function getRegistry() {
|
|
603
|
-
const
|
|
604
|
-
if (!
|
|
605
|
-
return
|
|
381
|
+
const g2 = globalThis;
|
|
382
|
+
if (!g2[REGISTRY_KEY]) g2[REGISTRY_KEY] = /* @__PURE__ */ new Map();
|
|
383
|
+
return g2[REGISTRY_KEY];
|
|
606
384
|
}
|
|
607
385
|
function getReverseIndex() {
|
|
608
|
-
const
|
|
609
|
-
if (!
|
|
610
|
-
return
|
|
386
|
+
const g2 = globalThis;
|
|
387
|
+
if (!g2[REVERSE_KEY]) g2[REVERSE_KEY] = /* @__PURE__ */ new Map();
|
|
388
|
+
return g2[REVERSE_KEY];
|
|
611
389
|
}
|
|
612
390
|
function getOutputListeners() {
|
|
613
|
-
const
|
|
614
|
-
if (!
|
|
615
|
-
return
|
|
391
|
+
const g2 = globalThis;
|
|
392
|
+
if (!g2[OUTPUT_LISTENERS_KEY]) g2[OUTPUT_LISTENERS_KEY] = /* @__PURE__ */ new Map();
|
|
393
|
+
return g2[OUTPUT_LISTENERS_KEY];
|
|
616
394
|
}
|
|
617
395
|
function getExitListeners() {
|
|
618
|
-
const
|
|
619
|
-
if (!
|
|
620
|
-
return
|
|
396
|
+
const g2 = globalThis;
|
|
397
|
+
if (!g2[EXIT_LISTENERS_KEY]) g2[EXIT_LISTENERS_KEY] = /* @__PURE__ */ new Map();
|
|
398
|
+
return g2[EXIT_LISTENERS_KEY];
|
|
621
399
|
}
|
|
622
400
|
function registerTerminal(tabId, commandId, command, projectCwd) {
|
|
623
401
|
const fullId = tabId + commandId;
|
|
@@ -742,20 +520,20 @@ function findSafeStart(s) {
|
|
|
742
520
|
var GLOBAL_KEY2 = /* @__PURE__ */ Symbol.for("terminal_running_commands");
|
|
743
521
|
var SERVER_ID_KEY = /* @__PURE__ */ Symbol.for("terminal_server_id");
|
|
744
522
|
function getServerId() {
|
|
745
|
-
const
|
|
746
|
-
if (!
|
|
747
|
-
|
|
748
|
-
console.log(`[registry] server started, id=${
|
|
523
|
+
const g2 = globalThis;
|
|
524
|
+
if (!g2[SERVER_ID_KEY]) {
|
|
525
|
+
g2[SERVER_ID_KEY] = `srv_${Date.now()}_${process.pid}`;
|
|
526
|
+
console.log(`[registry] server started, id=${g2[SERVER_ID_KEY]}, pid=${process.pid}`);
|
|
749
527
|
}
|
|
750
|
-
return
|
|
528
|
+
return g2[SERVER_ID_KEY];
|
|
751
529
|
}
|
|
752
530
|
getServerId();
|
|
753
531
|
function getRegistry2() {
|
|
754
|
-
const
|
|
755
|
-
if (!
|
|
756
|
-
|
|
532
|
+
const g2 = globalThis;
|
|
533
|
+
if (!g2[GLOBAL_KEY2]) {
|
|
534
|
+
g2[GLOBAL_KEY2] = /* @__PURE__ */ new Map();
|
|
757
535
|
}
|
|
758
|
-
return
|
|
536
|
+
return g2[GLOBAL_KEY2];
|
|
759
537
|
}
|
|
760
538
|
function registerCommand(cmd) {
|
|
761
539
|
console.log(`[registry] register: id=${cmd.commandId}, cmd="${cmd.command}", pid=${cmd.pid}, pty=${!!cmd.ptyProcess}, server=${getServerId()}`);
|
|
@@ -957,11 +735,7 @@ export {
|
|
|
957
735
|
createPendingRequest,
|
|
958
736
|
resolvePendingRequest,
|
|
959
737
|
sendCommandToBrowser,
|
|
960
|
-
pgPoolManager,
|
|
961
738
|
kernelManager,
|
|
962
|
-
mysqlPoolManager,
|
|
963
|
-
neo4jManager,
|
|
964
|
-
redisManager,
|
|
965
739
|
registerTerminal,
|
|
966
740
|
finalizeTerminal,
|
|
967
741
|
unregisterTerminal,
|