@surething/cockpit 1.0.217 → 1.0.219
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 +3 -2
- package/.next-prod/build-manifest.json +3 -3
- package/.next-prod/prerender-manifest.json +3 -3
- package/.next-prod/react-loadable-manifest.json +0 -1
- package/.next-prod/routes-manifest.json +6 -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 +3 -3
- package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next-prod/server/app/_not-found.segments/_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 -1
- package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
- 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 +2 -2
- package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/deepseek/route.js +2 -2
- package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/kimi/route.js +2 -2
- package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/ollama/route.js +2 -2
- package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/pty-input/route.js +1 -0
- package/.next-prod/server/app/api/chat/pty-input/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/chat/pty-input/route_client-reference-manifest.js +1 -0
- package/.next-prod/server/app/api/chat/route.js +19 -3
- 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 +1 -1
- package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/connect/route.js +1 -1
- package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/db/disconnect/route.js +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 +1 -1
- 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 -1
- package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/extension/version/route.js +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 +2 -2
- 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/affected/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/callees/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/callers/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/coedit/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/context/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/file/route.js +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/impact/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/related/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/risk/route.js +1 -1
- package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/projectGraph/search/route.js +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/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 +3 -2
- package/.next-prod/server/chunks/1921.js +131 -0
- package/.next-prod/server/chunks/2939.js +1 -1
- package/.next-prod/server/chunks/3792.js +9 -0
- package/.next-prod/server/chunks/3863.js +4 -1
- package/.next-prod/server/chunks/6244.js +1 -0
- package/.next-prod/server/chunks/8916.js +1 -1
- package/.next-prod/server/chunks/9658.js +9 -9
- 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/2xsVtkHy1Q-18e5b3DPua/_buildManifest.js +1 -0
- package/.next-prod/static/chunks/6321-a2227f1f162bd000.js +29 -0
- package/.next-prod/static/chunks/6345-d9033e1e3d07c277.js +14 -0
- package/.next-prod/static/chunks/app/_global-error/page-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/agent/test/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/bash/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/codex/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/kimi/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/ollama/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/pty-input/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/claude-stats/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/commands/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/comments/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/columns/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/connect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/disconnect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/export/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/query/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/db/schemas/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/dev/spans/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/extension/version/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/file/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/blame/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/clipboard/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/copy/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/delete/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/expanded/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/index/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/init/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/paste/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/read/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/readdir/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/recent/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/save/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/search/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/stat/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/files/text/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branches/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commits/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/diff/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/discard/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/stage/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/status/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/unstage/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/git/worktree/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/global-state/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/load/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/save/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/definition/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/hover/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/references/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/status/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/columns/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/connect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/export/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/query/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/query/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/note/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/models/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/start/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/open-cursor/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/open-vscode/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/pick-folder/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/project-settings/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/project-state/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/affected/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/callees/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/callers/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/context/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/impact/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/related/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/risk/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/projects/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/command/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/connect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/delete/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/get/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/keys/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/set/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/identify/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/order/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/share-info/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/review/users/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/services/config/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/services/scripts/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/session-by-path/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/settings/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/[id]/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/content/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/env/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/history/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/api/version/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/{layout-8e3a54b794cb35b6.js → layout-a21c32c2b18fbae2.js} +1 -1
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/app/{page-3ab0a0f28cbdc8e2.js → page-c5dc8ea6f9fc740b.js} +1 -1
- package/.next-prod/static/chunks/app/project/{page-3ab0a0f28cbdc8e2.js → page-c5dc8ea6f9fc740b.js} +1 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-ccd4c8b73711effa.js +1 -0
- package/.next-prod/static/chunks/webpack-cb3881d9a37f80b7.js +1 -0
- package/.next-prod/static/css/ad6271f3f61ab845.css +1 -0
- package/.next-prod/trace +13 -13
- package/.next-prod/trace-build +1 -1
- package/.next-prod/types/app/api/chat/pty-input/route.ts +351 -0
- package/.next-prod/types/routes.d.ts +2 -1
- package/.next-prod/types/validator.ts +9 -0
- package/README.md +5 -5
- package/README.zh.md +5 -5
- package/bin/cock-browser.messages.mjs +176 -0
- package/bin/cock-browser.mjs +290 -18
- package/chrome-extension/automation.js +684 -32
- package/chrome-extension/manifest.json +1 -1
- package/chrome-extension/messages.js +45 -0
- package/dist/{chunk-W6G6X3FP.mjs → chunk-WOM47O75.mjs} +49 -1
- package/dist/httpApi.mjs +66 -6
- package/dist/scheduledTasks.mjs +6 -1
- package/dist/{server-ZBUZ24TC.mjs → server-SNB4H35J.mjs} +5 -1
- package/dist/wsServer.mjs +5 -2
- package/package.json +3 -5
- package/.next-prod/server/chunks/4034.js +0 -114
- package/.next-prod/server/chunks/8764.js +0 -26
- package/.next-prod/static/7pu1LXbRRLfg05VN3u39s/_buildManifest.js +0 -1
- package/.next-prod/static/chunks/6345-d477b8d5c682b1fb.js +0 -14
- package/.next-prod/static/chunks/6917-0a22d7764ca45244.js +0 -29
- package/.next-prod/static/chunks/app/_global-error/page-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/agent/test/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/bash/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/codex/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/kimi/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/ollama/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/claude-stats/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/commands/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/comments/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/columns/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/connect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/disconnect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/export/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/query/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/db/schemas/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/dev/spans/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/extension/version/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/file/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/blame/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/clipboard/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/copy/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/delete/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/expanded/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/index/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/init/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/paste/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/read/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/readdir/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/recent/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/save/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/search/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/stat/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/files/text/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branches/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commits/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/diff/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/discard/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/stage/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/status/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/unstage/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/git/worktree/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/global-state/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/load/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/save/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/definition/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/hover/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/references/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/status/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/columns/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/connect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/export/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/query/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/query/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/note/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/models/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/start/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/open-cursor/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/open-vscode/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/pick-folder/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/project-settings/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/project-state/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/affected/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/callees/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/callers/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/context/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/impact/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/related/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/risk/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/projects/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/command/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/connect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/delete/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/get/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/keys/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/set/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/identify/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/order/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/share-info/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/review/users/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/services/config/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/services/scripts/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/session-by-path/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/settings/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/[id]/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/content/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/env/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/history/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/api/version/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-8ae56b9359db0996.js +0 -1
- package/.next-prod/static/chunks/webpack-b618ac52d349e5ca.js +0 -1
- package/.next-prod/static/css/fc2730c2dbe4866e.css +0 -1
- /package/.next-prod/static/{7pu1LXbRRLfg05VN3u39s → 2xsVtkHy1Q-18e5b3DPua}/_ssgManifest.js +0 -0
- /package/.next-prod/static/chunks/{e868780c.39804e9ab925f132.js → e868780c-39804e9ab925f132.js} +0 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized messages & generic example pool for the browser CLI.
|
|
3
|
+
*
|
|
4
|
+
* ALL user-facing text (help / errors / warnings) MUST source examples from
|
|
5
|
+
* EXAMPLES below. Never inline business-specific selectors or API paths.
|
|
6
|
+
*
|
|
7
|
+
* Single source of truth — PR review greps for case-specific leakage:
|
|
8
|
+
* grep -E '<known case keywords>' bin/cock-browser.* chrome-extension/messages.js
|
|
9
|
+
*
|
|
10
|
+
* The extension side has its own copy (chrome-extension/messages.js); the
|
|
11
|
+
* subset that the extension generates locally (e.g. STALE_REF_MSG) lives
|
|
12
|
+
* there. Templates here are CLI-side only.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// ─────────────────────────────────────────────────────────
|
|
16
|
+
// Generic example pool. DO NOT add case-specific values.
|
|
17
|
+
// ─────────────────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
export const EXAMPLES = Object.freeze({
|
|
20
|
+
selectorEmail: 'input[name="email"]',
|
|
21
|
+
selectorPassword: 'input[type="password"]',
|
|
22
|
+
selectorSubmit: 'button[type="submit"]',
|
|
23
|
+
selectorAriaSave: 'button[aria-label="Save"]',
|
|
24
|
+
selectorSearchBox: 'input[role="searchbox"]',
|
|
25
|
+
selectorStatus: '[role="status"]',
|
|
26
|
+
selectorContentEditable: '[contenteditable="true"]',
|
|
27
|
+
selectorLoginForm: 'form#login',
|
|
28
|
+
textSignIn: 'Sign in',
|
|
29
|
+
textSave: 'Save',
|
|
30
|
+
textSubmit: 'Submit',
|
|
31
|
+
apiUsersMe: '/api/users/me',
|
|
32
|
+
apiItems: '/api/items',
|
|
33
|
+
apiItemsId: '/api/items/123',
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// ─────────────────────────────────────────────────────────
|
|
37
|
+
// CLI-side error / warn templates
|
|
38
|
+
// (server-side errors come back as data.error and are printed verbatim;
|
|
39
|
+
// the templates below cover errors the CLI itself originates.)
|
|
40
|
+
// ─────────────────────────────────────────────────────────
|
|
41
|
+
|
|
42
|
+
export const TIMEOUT_MSG = (timeoutMs, id) =>
|
|
43
|
+
`Timeout: no response within ${timeoutMs}ms.
|
|
44
|
+
Likely cause: the page is busy (long render / streaming / network).
|
|
45
|
+
Diagnose:
|
|
46
|
+
cockpit browser ${id} health # is extension alive? (server-side, never blocks)
|
|
47
|
+
cockpit browser ${id} wait --extension-ready # wait until responsive
|
|
48
|
+
cockpit browser ${id} wait --network-idle # wait for the page to settle
|
|
49
|
+
If health returns alive but evaluate still hangs, the page itself is blocked.
|
|
50
|
+
Consider a service-level test if the page is driven by an async LLM/agent flow.`;
|
|
51
|
+
|
|
52
|
+
export const CONNECT_REFUSED_MSG = (baseUrl) =>
|
|
53
|
+
`Connection refused: Cockpit server not reachable at ${baseUrl}.
|
|
54
|
+
Recover:
|
|
55
|
+
1. Start the server: \`cockpit\` (prod, default port 3457) or \`cockpit-dev\` (dev, default 3456)
|
|
56
|
+
2. Or set COCKPIT_PORT env var if your server runs on a non-default port.`;
|
|
57
|
+
|
|
58
|
+
// Used by F1.7 post-verify when click / key / submit succeeded per CDP
|
|
59
|
+
// but no observable side-effect happened in the verify window.
|
|
60
|
+
export const CLICK_NO_OP_WARN = (action, id, observed) =>
|
|
61
|
+
`⚠ ${action} succeeded per CDP but no DOM mutation / URL change / network request in ${observed.windowMs}ms.
|
|
62
|
+
Likely a no-op (no real handler / portal-rendered / framework not listening).
|
|
63
|
+
Observed: url-changed=${observed.urlChanged} dom-changed=${observed.domChanged} new-requests=${observed.newRequests}
|
|
64
|
+
Try one of:
|
|
65
|
+
cockpit browser ${id} evaluate "(() => { const el = document.querySelector('${EXAMPLES.selectorAriaSave}'); el.click(); return el.outerHTML.slice(0,200); })()"
|
|
66
|
+
cockpit browser ${id} submit --form-selector '${EXAMPLES.selectorLoginForm}'
|
|
67
|
+
cockpit browser ${id} fetch ${EXAMPLES.apiItems} --method POST --body '{}'`;
|
|
68
|
+
|
|
69
|
+
// ─────────────────────────────────────────────────────────
|
|
70
|
+
// help fragments (composed in cock-browser.mjs printHelp)
|
|
71
|
+
// ─────────────────────────────────────────────────────────
|
|
72
|
+
|
|
73
|
+
export const HELP_WHEN_NOT_TO_USE =
|
|
74
|
+
`── When NOT to use this CLI ───────────────────────────
|
|
75
|
+
- Testing LLM-agent driven flows end-to-end: the agent's stochastic tool
|
|
76
|
+
choice and stop_reason make UI assertions flaky. Prefer a thin runtime
|
|
77
|
+
script that calls the same middleware / service directly with controlled
|
|
78
|
+
inputs.
|
|
79
|
+
|
|
80
|
+
- Pages that stream / re-render for >10s: evaluate calls queue behind page
|
|
81
|
+
work and time out (~15s default). Run \`wait --extension-ready\` between
|
|
82
|
+
acts and asserts; if it stays hung, pivot to a service-level test.
|
|
83
|
+
|
|
84
|
+
- Multi-tab / popup OAuth flows: each browser bubble tracks one tab. Open
|
|
85
|
+
the secondary tab in its own bubble or stub the OAuth handshake.`;
|
|
86
|
+
|
|
87
|
+
export const HELP_INTERACTION_BY_SELECTOR = (idForExamples) =>
|
|
88
|
+
`Interaction by selector (preferred — refs go stale on re-render):
|
|
89
|
+
click <ref|text> Click by ref (e5#v3), or fall back to:
|
|
90
|
+
click --text <substr> Click button/link by visible text or aria-label
|
|
91
|
+
e.g. click --text "${EXAMPLES.textSignIn}"
|
|
92
|
+
click --selector <css> Click first element matching CSS
|
|
93
|
+
e.g. click --selector '${EXAMPLES.selectorSubmit}'
|
|
94
|
+
fill <ref> <value> Fill via ref, or:
|
|
95
|
+
fill --selector <css> --value V Fill via native setter (works on React-controlled inputs)
|
|
96
|
+
e.g. fill --selector '${EXAMPLES.selectorEmail}' --value "user@example.com"
|
|
97
|
+
submit [--form-selector <css>] form.requestSubmit() — works where key Enter is ignored
|
|
98
|
+
e.g. submit --form-selector '${EXAMPLES.selectorLoginForm}'
|
|
99
|
+
|
|
100
|
+
Post-verify (click / key / submit / click-by-text/-selector):
|
|
101
|
+
--verify-ms <N> Window in ms to wait before re-probing page state
|
|
102
|
+
(default 1000). Lower = faster but more false positives
|
|
103
|
+
on slow-rendering React. Higher = more tolerant.
|
|
104
|
+
--skip-verify (or --no-verify) Disable post-verify for this command
|
|
105
|
+
(e.g. legit clicks that have no observable side-effect).`;
|
|
106
|
+
|
|
107
|
+
export const HELP_FETCH =
|
|
108
|
+
`Backend probing (inherits page auth):
|
|
109
|
+
fetch <url> GET, returns JSON or text
|
|
110
|
+
e.g. fetch ${EXAMPLES.apiUsersMe}
|
|
111
|
+
fetch <url> --method POST --body '{"name":"hello"}'
|
|
112
|
+
fetch <url> --json $.data.id Extract via simple JSONPath ($, .key, [N], [*])`;
|
|
113
|
+
|
|
114
|
+
export const HELP_HEALTH =
|
|
115
|
+
`Diagnostics:
|
|
116
|
+
health Server-side bridge state (never blocks page).
|
|
117
|
+
Returns: ws status, last command timestamp, pending count.
|
|
118
|
+
Use when evaluate times out to distinguish
|
|
119
|
+
"extension dead" vs "page busy".
|
|
120
|
+
health --deep Also probe the page itself (may block if page is busy).`;
|
|
121
|
+
|
|
122
|
+
export const HELP_WAIT =
|
|
123
|
+
`Wait (synchronisation between act and assert):
|
|
124
|
+
wait --text <substr> Wait for substring in body text
|
|
125
|
+
wait --selector <css> [--state visible|hidden|attached|detached]
|
|
126
|
+
Wait for element to reach state (default: visible)
|
|
127
|
+
e.g. wait --selector '${EXAMPLES.selectorStatus}' --state visible
|
|
128
|
+
wait --url <pat> Wait for URL match (substring or *-glob)
|
|
129
|
+
wait --network-idle [--quiet-ms 500] [--max-request-age-ms 30000]
|
|
130
|
+
Wait until 0 in-flight HTTP requests for quiet-ms.
|
|
131
|
+
Long-running (>max-request-age-ms) are ignored
|
|
132
|
+
so SSE / long-poll don't block.
|
|
133
|
+
e.g. wait --network-idle --quiet-ms 800
|
|
134
|
+
wait --dom-stable [--quiet-ms 300]
|
|
135
|
+
Wait until MutationObserver sees no changes
|
|
136
|
+
for quiet-ms (useful between act and snapshot).
|
|
137
|
+
wait --extension-ready [--quiet-ms 500]
|
|
138
|
+
CLI-side poll of \`health\` (never blocks on page).
|
|
139
|
+
Replaces manual \`until evaluate "1+1"\` loops.
|
|
140
|
+
wait --time <ms> Sleep <ms> (escape hatch — prefer above)
|
|
141
|
+
wait --ref <ref> Wait for ref to still be connected`;
|
|
142
|
+
|
|
143
|
+
export const HELP_LIFECYCLE =
|
|
144
|
+
`Lifecycle / fixtures:
|
|
145
|
+
status One-line summary: url, title, last console error,
|
|
146
|
+
last failed request, top visible buttons.
|
|
147
|
+
Run after a long gap before another act.
|
|
148
|
+
reset [--cookies] [--storage] [--cache] [--reload]
|
|
149
|
+
Atomic test-isolation. Combine flags as needed.
|
|
150
|
+
e.g. reset --cookies --storage --reload
|
|
151
|
+
set --type cookie --name K --value V [--domain D] [--path P] [--secure]
|
|
152
|
+
[--same-site Lax|Strict|None] [--expires <date>]
|
|
153
|
+
set --type local-storage --name K --value V
|
|
154
|
+
set --type session-storage --name K --value V
|
|
155
|
+
e.g. set --type cookie --name auth --value abc123 --secure
|
|
156
|
+
e.g. set --type local-storage --name theme --value '"dark"'`;
|
|
157
|
+
|
|
158
|
+
export const HELP_ASSERT =
|
|
159
|
+
`Assert (act + assert atoms; non-zero exit on failure):
|
|
160
|
+
assert --selector <css> [--text X | --visible <bool> | --attr "k=v"]
|
|
161
|
+
e.g. assert --selector '${EXAMPLES.selectorStatus}' --text "Saved"
|
|
162
|
+
e.g. assert --selector '${EXAMPLES.selectorSubmit}' --visible true
|
|
163
|
+
e.g. assert --selector '[role="dialog"]' --attr "aria-modal=true"
|
|
164
|
+
assert --ref <ref> --text/... Legacy ref-based form (refs go stale; prefer --selector)
|
|
165
|
+
assert --url <pat> URL substring or *-glob match
|
|
166
|
+
assert --title <substr>
|
|
167
|
+
assert --console-no-errors
|
|
168
|
+
assert --network --method M --url U --status S [--since <ms>]
|
|
169
|
+
Assert a matching request occurred in networkBuffer.
|
|
170
|
+
Status accepts ints or "2xx"/"4xx"/etc.
|
|
171
|
+
e.g. assert --network --method POST --url ${EXAMPLES.apiItems} --status 200
|
|
172
|
+
assert --fetch <url> [--fetch-method M] [--body B] [--fetch-status N]
|
|
173
|
+
[--jsonpath P --equals V | --contains V | --not-contains V]
|
|
174
|
+
Make a fetch and assert response. Inherits auth.
|
|
175
|
+
e.g. assert --fetch ${EXAMPLES.apiItems} --jsonpath '$.count' --equals 5
|
|
176
|
+
e.g. assert --fetch ${EXAMPLES.apiItems} --jsonpath '$[*].id' --contains 42`;
|
package/bin/cock-browser.mjs
CHANGED
|
@@ -19,6 +19,19 @@
|
|
|
19
19
|
* cockpit browser abcd list (list all connected browsers)
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
+
import {
|
|
23
|
+
TIMEOUT_MSG,
|
|
24
|
+
CONNECT_REFUSED_MSG,
|
|
25
|
+
CLICK_NO_OP_WARN,
|
|
26
|
+
HELP_WHEN_NOT_TO_USE,
|
|
27
|
+
HELP_INTERACTION_BY_SELECTOR,
|
|
28
|
+
HELP_FETCH,
|
|
29
|
+
HELP_HEALTH,
|
|
30
|
+
HELP_WAIT,
|
|
31
|
+
HELP_ASSERT,
|
|
32
|
+
HELP_LIFECYCLE,
|
|
33
|
+
} from './cock-browser.messages.mjs';
|
|
34
|
+
|
|
22
35
|
const args = process.argv.slice(2);
|
|
23
36
|
|
|
24
37
|
// Help text
|
|
@@ -55,14 +68,16 @@ Three templates that always work:
|
|
|
55
68
|
# 2) Set a React-controlled <input> via the native setter + input event:
|
|
56
69
|
evaluate "(() => { const el = document.querySelector('input[name=foo]'); const set = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set; set.call(el, 'hello'); el.dispatchEvent(new Event('input', { bubbles: true })); return el.value; })()"
|
|
57
70
|
|
|
58
|
-
# 3) Click a button by aria-label
|
|
59
|
-
|
|
71
|
+
# 3) Click a button by visible text or aria-label (refs go stale on re-render):
|
|
72
|
+
click --text "Sign in" # preferred shortcut
|
|
73
|
+
click --selector 'button[type="submit"]' # exact selector
|
|
74
|
+
evaluate "(() => document.querySelector('button[aria-label=\\"Save\\"]').click())()" # last resort
|
|
60
75
|
|
|
61
|
-
Refs
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
76
|
+
Refs returned by \`snapshot\` are \`e<N>#v<epoch>\` — valid only until
|
|
77
|
+
the next snapshot or re-render. The error message
|
|
78
|
+
\`Element ref "..." is stale (current snapshot v=N)\` tells you to
|
|
79
|
+
re-snapshot OR use \`click --text\` / \`click --selector\` /
|
|
80
|
+
\`fill --selector\` for re-render-resilient interaction.
|
|
66
81
|
|
|
67
82
|
──────────────────────────────────────────────────────
|
|
68
83
|
|
|
@@ -74,18 +89,29 @@ Navigation:
|
|
|
74
89
|
title Get page title
|
|
75
90
|
|
|
76
91
|
Inspection:
|
|
77
|
-
snapshot
|
|
78
|
-
|
|
92
|
+
snapshot a11y tree (refs like e5#v3; banner explains format)
|
|
93
|
+
--filter <regex> server-side grep
|
|
94
|
+
--include-hidden-text surface collapsed <summary>/container text
|
|
95
|
+
--max-depth N limit walk depth (default 12)
|
|
96
|
+
screenshot PNG saved to /tmp; path printed for Read tool
|
|
97
|
+
|
|
98
|
+
${HELP_INTERACTION_BY_SELECTOR(prefix)}
|
|
79
99
|
|
|
80
|
-
|
|
81
|
-
click <ref> Click element ⚠ React/SPA: may silently miss; use evaluate
|
|
82
|
-
type <ref> <text> Type text ⚠ React/SPA: may silently miss; use evaluate (template 1/2)
|
|
83
|
-
fill <ref> <value> Fill input value ⚠ Same — prefer template 2
|
|
100
|
+
type <ref> <text> Type into ref (CDP key events; React-controlled may silently miss → use fill --selector)
|
|
84
101
|
hover <ref> Hover element
|
|
85
102
|
focus <ref> Focus element
|
|
86
103
|
scroll --direction D Scroll page (up/down/left/right)
|
|
87
104
|
key <key> Press key (e.g. Enter, Ctrl+A)
|
|
88
|
-
|
|
105
|
+
|
|
106
|
+
${HELP_WAIT}
|
|
107
|
+
|
|
108
|
+
${HELP_ASSERT}
|
|
109
|
+
|
|
110
|
+
${HELP_LIFECYCLE}
|
|
111
|
+
|
|
112
|
+
${HELP_FETCH}
|
|
113
|
+
|
|
114
|
+
${HELP_HEALTH}
|
|
89
115
|
|
|
90
116
|
DOM:
|
|
91
117
|
computed <ref> Get computed styles
|
|
@@ -111,6 +137,8 @@ Console & Debug:
|
|
|
111
137
|
cookies Get cookies
|
|
112
138
|
storage [--type T] Get storage (local|session)
|
|
113
139
|
|
|
140
|
+
${HELP_WHEN_NOT_TO_USE}
|
|
141
|
+
|
|
114
142
|
── Next step ──────────────────────────────────────────
|
|
115
143
|
Run \`cockpit browser ${prefix} snapshot\` to inspect the page.
|
|
116
144
|
It returns an element tree with refs like [e5]. Use those
|
|
@@ -191,9 +219,32 @@ const params = parseFlags(args.slice(action === 'list' ? 1 : 2));
|
|
|
191
219
|
if (params._positional?.length) {
|
|
192
220
|
const pos = params._positional;
|
|
193
221
|
if (action === 'navigate' && !params.url) params.url = pos[0];
|
|
194
|
-
|
|
222
|
+
// click: positional is the ref (or text fallback for convenience if it does
|
|
223
|
+
// not look like a ref). Refs match e<N>#v<M>; anything else is treated as
|
|
224
|
+
// visible text so `click "Sign in"` Just Works.
|
|
225
|
+
if (action === 'click') {
|
|
226
|
+
if (!params.ref && !params.text && !params.selector) {
|
|
227
|
+
if (/^e\d+#v\d+$/.test(pos[0])) params.ref = pos[0];
|
|
228
|
+
else params.text = pos[0];
|
|
229
|
+
}
|
|
230
|
+
}
|
|
195
231
|
if (action === 'type' && !params.ref) { params.ref = pos[0]; if (pos[1] && !params.text) params.text = pos[1]; }
|
|
196
|
-
|
|
232
|
+
// fill: positional[0] is ref (when matches ref pattern) else --selector form.
|
|
233
|
+
// positional[1] is the value when ref-positional is used.
|
|
234
|
+
if (action === 'fill') {
|
|
235
|
+
if (!params.ref && !params.selector) {
|
|
236
|
+
if (/^e\d+#v\d+$/.test(pos[0])) {
|
|
237
|
+
params.ref = pos[0];
|
|
238
|
+
if (pos[1] && !params.value) params.value = pos[1];
|
|
239
|
+
} else {
|
|
240
|
+
// First positional taken as selector if it contains CSS-y chars.
|
|
241
|
+
params.selector = pos[0];
|
|
242
|
+
if (pos[1] && !params.value) params.value = pos[1];
|
|
243
|
+
}
|
|
244
|
+
} else if (params.selector && !params.value && pos[0]) {
|
|
245
|
+
params.value = pos[0];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
197
248
|
if (action === 'hover' && !params.ref) params.ref = pos[0];
|
|
198
249
|
if (action === 'focus' && !params.ref) params.ref = pos[0];
|
|
199
250
|
if (action === 'evaluate' && !params.js) params.js = pos[0];
|
|
@@ -206,9 +257,33 @@ if (params._positional?.length) {
|
|
|
206
257
|
if (action === 'events' && !params.ref) params.ref = pos[0];
|
|
207
258
|
if (action === 'network_detail' && !params.id) params.id = parseInt(pos[0]);
|
|
208
259
|
if (action === 'network_record' && !params.action) params.action = pos[0] || 'status';
|
|
260
|
+
if (action === 'fetch' && !params.url) params.url = pos[0];
|
|
261
|
+
if (action === 'health' && pos[0] === '--deep') params.deep = true;
|
|
209
262
|
delete params._positional;
|
|
210
263
|
}
|
|
211
264
|
|
|
265
|
+
// kebab → camel for new Phase 2 flags.
|
|
266
|
+
if (params['network-idle']) { params.networkIdle = true; delete params['network-idle']; }
|
|
267
|
+
if (params['dom-stable']) { params.domStable = true; delete params['dom-stable']; }
|
|
268
|
+
if (params['extension-ready']) { params.extensionReady = true; delete params['extension-ready']; }
|
|
269
|
+
if (params['quiet-ms'] != null) { params.quietMs = params['quiet-ms']; delete params['quiet-ms']; }
|
|
270
|
+
if (params['max-request-age-ms'] != null) { params.maxRequestAgeMs = params['max-request-age-ms']; delete params['max-request-age-ms']; }
|
|
271
|
+
if (params['fetch-status'] != null) { params.fetchStatus = params['fetch-status']; delete params['fetch-status']; }
|
|
272
|
+
if (params['fetch-method']) { params.fetchMethod = params['fetch-method']; delete params['fetch-method']; }
|
|
273
|
+
if (params['not-contains'] !== undefined) { params.notContains = params['not-contains']; delete params['not-contains']; }
|
|
274
|
+
if (params['no-cache']) { params.noCache = true; delete params['no-cache']; }
|
|
275
|
+
if (params['console-no-errors']) { params.consoleNoErrors = true; delete params['console-no-errors']; }
|
|
276
|
+
if (params['same-site']) { params.sameSite = params['same-site']; delete params['same-site']; }
|
|
277
|
+
if (params['http-only']) { params.httpOnly = true; delete params['http-only']; }
|
|
278
|
+
if (params['verify-ms'] != null) { params.verifyMs = Number(params['verify-ms']); delete params['verify-ms']; }
|
|
279
|
+
|
|
280
|
+
// kebab → camel for flags that the extension expects camel.
|
|
281
|
+
if (params['include-hidden-text']) { params.includeHiddenText = true; delete params['include-hidden-text']; }
|
|
282
|
+
if (params['max-depth'] != null) { params.maxDepth = params['max-depth']; delete params['max-depth']; }
|
|
283
|
+
if (params['form-selector']) { params.formSelector = params['form-selector']; delete params['form-selector']; }
|
|
284
|
+
if (params['skip-verify']) { params.skipVerify = true; delete params['skip-verify']; }
|
|
285
|
+
if (params['no-verify']) { params.skipVerify = true; delete params['no-verify']; }
|
|
286
|
+
|
|
212
287
|
// Port: env COCKPIT_PORT > ~/.cockpit/server.json > default 3457
|
|
213
288
|
let port = process.env.COCKPIT_PORT || 3457;
|
|
214
289
|
if (!process.env.COCKPIT_PORT) {
|
|
@@ -312,6 +387,43 @@ async function autoResolveChunked(baseUrl, id, data, cmdTimeout) {
|
|
|
312
387
|
}
|
|
313
388
|
|
|
314
389
|
// Send request
|
|
390
|
+
// F2.7 — wait --extension-ready: poll the cheap server-side health endpoint
|
|
391
|
+
// until the bridge reports quiet conditions for `quietMs` consecutive ms.
|
|
392
|
+
// Replaces the manual `until cockpit browser X evaluate "1+1"` loop that AI
|
|
393
|
+
// has historically used when an evaluate hangs on a busy page.
|
|
394
|
+
async function waitExtensionReady({ quietMs = 500, timeoutMs = 60000 }) {
|
|
395
|
+
const start = Date.now();
|
|
396
|
+
let quietSince = null;
|
|
397
|
+
while (Date.now() - start < timeoutMs) {
|
|
398
|
+
let h = null;
|
|
399
|
+
try {
|
|
400
|
+
const r = await fetch(`${baseUrl}/api/browser/health`, {
|
|
401
|
+
method: 'POST',
|
|
402
|
+
headers: { 'Content-Type': 'application/json' },
|
|
403
|
+
body: JSON.stringify({ id, params: {}, timeout: 1000 }),
|
|
404
|
+
signal: AbortSignal.timeout(2000),
|
|
405
|
+
});
|
|
406
|
+
const j = await r.json();
|
|
407
|
+
h = j.ok ? j.data : null;
|
|
408
|
+
} catch { /* network blip — treat as not-ready */ }
|
|
409
|
+
const ready = h && h.found && h.ws === 'open' && h.pendingCommands === 0;
|
|
410
|
+
if (ready) {
|
|
411
|
+
if (quietSince == null) quietSince = Date.now();
|
|
412
|
+
if (Date.now() - quietSince >= quietMs) {
|
|
413
|
+
return { waited: `extension-ready (quiet=${quietMs}ms)`, elapsedMs: Date.now() - start };
|
|
414
|
+
}
|
|
415
|
+
} else {
|
|
416
|
+
quietSince = null;
|
|
417
|
+
}
|
|
418
|
+
await new Promise(r => setTimeout(r, 100));
|
|
419
|
+
}
|
|
420
|
+
throw new Error(
|
|
421
|
+
`wait --extension-ready timed out after ${timeoutMs}ms.\n` +
|
|
422
|
+
` The bridge never reported quiet for ${quietMs}ms.\n` +
|
|
423
|
+
` Consider a service-level test if the page is driven by an async LLM/agent flow.`
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
315
427
|
async function run() {
|
|
316
428
|
// Only id provided without action → show help + status
|
|
317
429
|
if (action === '_status') {
|
|
@@ -340,6 +452,22 @@ async function run() {
|
|
|
340
452
|
return;
|
|
341
453
|
}
|
|
342
454
|
|
|
455
|
+
// F2.7 — wait --extension-ready runs entirely CLI-side: it polls the cheap
|
|
456
|
+
// server-side `health` endpoint, so it works even when the page is blocked.
|
|
457
|
+
if (action === 'wait' && params.extensionReady) {
|
|
458
|
+
try {
|
|
459
|
+
const r = await waitExtensionReady({
|
|
460
|
+
quietMs: params.quietMs ?? 500,
|
|
461
|
+
timeoutMs: timeout,
|
|
462
|
+
});
|
|
463
|
+
console.log(`waited: ${r.waited} (elapsed ${formatMs(r.elapsedMs)})`);
|
|
464
|
+
return;
|
|
465
|
+
} catch (err) {
|
|
466
|
+
console.error(err.message);
|
|
467
|
+
process.exit(1);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
343
471
|
const url = `${baseUrl}/api/browser/${action}`;
|
|
344
472
|
const body = { id, params, timeout };
|
|
345
473
|
|
|
@@ -427,13 +555,18 @@ async function run() {
|
|
|
427
555
|
}
|
|
428
556
|
}
|
|
429
557
|
|
|
558
|
+
// F1.7 — post-verify silent failures for click / key / submit.
|
|
559
|
+
if (POST_VERIFY_ACTIONS.has(action)) {
|
|
560
|
+
try { await postVerify(action, params, resolved); } catch { /* never fail the command */ }
|
|
561
|
+
}
|
|
562
|
+
|
|
430
563
|
// Format output
|
|
431
564
|
await formatOutput(action, resolved);
|
|
432
565
|
} catch (err) {
|
|
433
566
|
if (err.name === 'TimeoutError' || err.code === 'ABORT_ERR') {
|
|
434
|
-
console.error(
|
|
567
|
+
console.error(TIMEOUT_MSG(timeout, id));
|
|
435
568
|
} else if (err.cause?.code === 'ECONNREFUSED') {
|
|
436
|
-
console.error(
|
|
569
|
+
console.error(CONNECT_REFUSED_MSG(baseUrl));
|
|
437
570
|
} else {
|
|
438
571
|
console.error(`Error: ${err.message}`);
|
|
439
572
|
}
|
|
@@ -441,6 +574,57 @@ async function run() {
|
|
|
441
574
|
}
|
|
442
575
|
}
|
|
443
576
|
|
|
577
|
+
// F1.7 — Post-verify for click / key / submit. CDP reports "success" even when
|
|
578
|
+
// the framework didn't react. Diff a cheap state probe before and after; if
|
|
579
|
+
// nothing observable changed in the window, warn with actionable templates.
|
|
580
|
+
//
|
|
581
|
+
// Default window: 1000ms (BL-1, observation period). Was 200ms but dogfood
|
|
582
|
+
// showed false positives on React pages whose batched re-renders + XHR fire
|
|
583
|
+
// took >200ms to surface. Users can override per command with --verify-ms;
|
|
584
|
+
// --skip-verify (or --no-verify) opts out entirely.
|
|
585
|
+
const POST_VERIFY_ACTIONS = new Set(['click', 'key', 'submit']);
|
|
586
|
+
const POST_VERIFY_WINDOW_MS_DEFAULT = 1000;
|
|
587
|
+
|
|
588
|
+
async function probeState() {
|
|
589
|
+
const r = await fetch(`${baseUrl}/api/browser/probe_state`, {
|
|
590
|
+
method: 'POST',
|
|
591
|
+
headers: { 'Content-Type': 'application/json' },
|
|
592
|
+
body: JSON.stringify({ id, params: {}, timeout: 2000 }),
|
|
593
|
+
signal: AbortSignal.timeout(3000),
|
|
594
|
+
});
|
|
595
|
+
const j = await r.json();
|
|
596
|
+
return j.ok ? j.data : null;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
async function postVerify(action, params, originalResolved) {
|
|
600
|
+
if (params.skipVerify) return;
|
|
601
|
+
const windowMs = Number.isFinite(params.verifyMs) && params.verifyMs > 0
|
|
602
|
+
? params.verifyMs
|
|
603
|
+
: POST_VERIFY_WINDOW_MS_DEFAULT;
|
|
604
|
+
let before;
|
|
605
|
+
try { before = await probeState(); } catch { return; }
|
|
606
|
+
if (!before) return;
|
|
607
|
+
await new Promise(r => setTimeout(r, windowMs));
|
|
608
|
+
let after;
|
|
609
|
+
try { after = await probeState(); } catch { return; }
|
|
610
|
+
if (!after) return;
|
|
611
|
+
const urlChanged = before.url !== after.url;
|
|
612
|
+
const domChanged = before.domHash !== after.domHash || before.domLen !== after.domLen;
|
|
613
|
+
const newRequests = after.lastNetworkId > before.lastNetworkId;
|
|
614
|
+
if (!urlChanged && !domChanged && !newRequests) {
|
|
615
|
+
process.stderr.write(
|
|
616
|
+
'\n' +
|
|
617
|
+
CLICK_NO_OP_WARN(action, id, {
|
|
618
|
+
windowMs,
|
|
619
|
+
urlChanged,
|
|
620
|
+
domChanged,
|
|
621
|
+
newRequests,
|
|
622
|
+
}) +
|
|
623
|
+
'\n'
|
|
624
|
+
);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
|
|
444
628
|
async function formatOutput(action, data) {
|
|
445
629
|
if (data === undefined || data === null) {
|
|
446
630
|
// evaluate-family silently returning undefined/null is a major source of
|
|
@@ -486,6 +670,86 @@ async function formatOutput(action, data) {
|
|
|
486
670
|
console.log(data);
|
|
487
671
|
return;
|
|
488
672
|
|
|
673
|
+
case 'health':
|
|
674
|
+
// Server-side bridge health snapshot.
|
|
675
|
+
if (!data.found) {
|
|
676
|
+
console.log(`browser "${id}" not registered (no bubble open?)`);
|
|
677
|
+
process.exit(2);
|
|
678
|
+
}
|
|
679
|
+
console.log(
|
|
680
|
+
`extension: ${data.ws === 'open' ? 'alive (ws=open)' : 'unreachable (ws=' + data.ws + ')'}` +
|
|
681
|
+
` pending: ${data.pendingCommands}` +
|
|
682
|
+
(data.lastSuccessMs !== null
|
|
683
|
+
? ` last-success: ${formatMs(data.lastSuccessMs)} ago (${data.lastSuccessAction || '?'})`
|
|
684
|
+
: ' last-success: never')
|
|
685
|
+
);
|
|
686
|
+
return;
|
|
687
|
+
|
|
688
|
+
case 'fetch':
|
|
689
|
+
// Default: pretty JSON. If jsonpath was used, print the extracted value plainly.
|
|
690
|
+
if (data && typeof data === 'object' && 'jsonpath' in data) {
|
|
691
|
+
console.log(`[${data.status}] ${data.jsonpath} =`);
|
|
692
|
+
console.log(typeof data.value === 'object' ? JSON.stringify(data.value, null, 2) : data.value);
|
|
693
|
+
} else if (data && typeof data === 'object' && 'data' in data) {
|
|
694
|
+
console.log(`[${data.status}] (${data.contentType || 'unknown'})`);
|
|
695
|
+
console.log(typeof data.data === 'object' ? JSON.stringify(data.data, null, 2) : data.data);
|
|
696
|
+
} else {
|
|
697
|
+
console.log(JSON.stringify(data, null, 2));
|
|
698
|
+
}
|
|
699
|
+
return;
|
|
700
|
+
|
|
701
|
+
case 'submit':
|
|
702
|
+
console.log(`submitted: ${data.submitted}${data.action ? ` → ${data.action}` : ''}`);
|
|
703
|
+
return;
|
|
704
|
+
|
|
705
|
+
case 'wait':
|
|
706
|
+
// Extension returned a structured ack — print one line summary.
|
|
707
|
+
if (data && data.waited) {
|
|
708
|
+
console.log(`waited: ${data.waited}${data.elapsedMs != null ? ` (elapsed ${formatMs(data.elapsedMs)})` : ''}`);
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
break;
|
|
712
|
+
|
|
713
|
+
case 'reset':
|
|
714
|
+
if (data && Array.isArray(data.cleared)) {
|
|
715
|
+
console.log(`cleared: ${data.cleared.join(', ') || '(nothing)'}`);
|
|
716
|
+
if (data.errors?.length) {
|
|
717
|
+
for (const e of data.errors) process.stderr.write(` ⚠ ${e}\n`);
|
|
718
|
+
process.exit(1);
|
|
719
|
+
}
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
break;
|
|
723
|
+
|
|
724
|
+
case 'set':
|
|
725
|
+
if (data && data.set) {
|
|
726
|
+
const note = data.verified === false
|
|
727
|
+
? ' ⚠ cookie was not accepted (different domain / SameSite / Secure?)'
|
|
728
|
+
: data.length != null ? ` (${data.length} bytes)` : '';
|
|
729
|
+
console.log(`set ${data.set}: ${data.name}${note}`);
|
|
730
|
+
if (data.verified === false) process.exit(1);
|
|
731
|
+
return;
|
|
732
|
+
}
|
|
733
|
+
break;
|
|
734
|
+
|
|
735
|
+
case 'status':
|
|
736
|
+
if (data && data.url != null) {
|
|
737
|
+
console.log(`URL: ${data.url}`);
|
|
738
|
+
console.log(`Title: ${data.title} [${data.readyState}]`);
|
|
739
|
+
if (data.lastConsoleError) {
|
|
740
|
+
console.log(`Last console error: ${data.lastConsoleError.text} (${data.lastConsoleError.ageSec}s ago)`);
|
|
741
|
+
}
|
|
742
|
+
if (data.lastFailedRequest) {
|
|
743
|
+
const r = data.lastFailedRequest;
|
|
744
|
+
console.log(`Last failed request: ${r.method} ${r.url} [${r.status}] (${r.ageSec}s ago)`);
|
|
745
|
+
}
|
|
746
|
+
if (Array.isArray(data.topActions) && data.topActions.length) {
|
|
747
|
+
console.log(`Top actions: ${data.topActions.map(a => `"${a}"`).join(' ')}`);
|
|
748
|
+
}
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
break;
|
|
752
|
+
|
|
489
753
|
case 'screenshot':
|
|
490
754
|
if (data.image) {
|
|
491
755
|
// data URL → save as PNG file, output path (for Read tool to view)
|
|
@@ -611,5 +875,13 @@ async function formatOutput(action, data) {
|
|
|
611
875
|
}
|
|
612
876
|
}
|
|
613
877
|
|
|
878
|
+
function formatMs(ms) {
|
|
879
|
+
if (ms < 1000) return `${ms}ms`;
|
|
880
|
+
const s = Math.round(ms / 1000);
|
|
881
|
+
if (s < 60) return `${s}s`;
|
|
882
|
+
const m = Math.floor(s / 60);
|
|
883
|
+
return `${m}m${s % 60}s`;
|
|
884
|
+
}
|
|
885
|
+
|
|
614
886
|
// Export promise for external await
|
|
615
887
|
export const done = run();
|