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