@surething/cockpit 1.0.252 → 1.0.254
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 +6 -3
- package/.next-prod/build-manifest.json +2 -2
- package/.next-prod/prerender-manifest.json +3 -3
- package/.next-prod/routes-manifest.json +18 -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 +2 -2
- package/.next-prod/server/app/_not-found.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next-prod/server/app/_not-found.segments/_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 +1 -1
- 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 +1 -1
- 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 -1
- package/.next-prod/server/app/api/chat/pty-input/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/route.js +1 -1
- package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/chat/stop/route.js +1 -1
- package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/claude-stats/route.js +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 +2 -2
- 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/deepseek/balance/route.js +1 -0
- package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/deepseek/balance/route_client-reference-manifest.js +1 -0
- package/.next-prod/server/app/api/deepseek/credentials/route.js +1 -1
- package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/deepseek/models/route.js +1 -0
- package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/deepseek/models/route_client-reference-manifest.js +1 -0
- 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/current-branch/route.js +1 -1
- package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/git/diff/route.js +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/health/route.js +1 -1
- package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/html-apps/[id]/route.js +1 -1
- package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/html-apps/route.js +1 -1
- package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/jupyter/load/route.js +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 +1 -1
- package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/mysql/connect/route.js +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/config/route.js +1 -1
- package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/ollama/models/route.js +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/prompts/config/route.js +1 -0
- package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -0
- package/.next-prod/server/app/api/prompts/config/route_client-reference-manifest.js +1 -0
- package/.next-prod/server/app/api/push/public-key/route.js +1 -1
- package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/push/subscribe/route.js +1 -1
- package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/push/unsubscribe/route.js +1 -1
- package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/redis/command/route.js +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 +3 -3
- 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/snapshots/diff/route.js +1 -1
- package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/snapshots/route.js +1 -1
- package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
- package/.next-prod/server/app/api/terminal/aliases/route.js +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/apps/[...path]/route.js +1 -1
- package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
- package/.next-prod/server/app/favicon.ico/route.js +1 -1
- package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
- package/.next-prod/server/app/m/page.js +2 -2
- package/.next-prod/server/app/m/page.js.nft.json +1 -1
- package/.next-prod/server/app/m/page_client-reference-manifest.js +1 -1
- package/.next-prod/server/app/manifest.webmanifest/route.js +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 +6 -3
- package/.next-prod/server/chunks/304.js +1 -1
- package/.next-prod/server/chunks/3863.js +2 -2
- package/.next-prod/server/chunks/{4848.js → 4338.js} +74 -13
- package/.next-prod/server/chunks/6038.js +1 -1
- package/.next-prod/server/chunks/{293.js → 7139.js} +4 -4
- package/.next-prod/server/chunks/9419.js +89 -0
- package/.next-prod/server/chunks/9658.js +12 -12
- package/.next-prod/server/chunks/9830.js +1 -1
- package/.next-prod/server/functions-config-manifest.json +1 -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/{4304-408f5bddd7583676.js → 2308-c6b5ed3c19252dce.js} +3 -3
- package/.next-prod/static/chunks/6260-f566ccfbd8e8809c.js +25 -0
- package/.next-prod/static/chunks/{6784-06048becad37f010.js → 6784-d35737ae5f04a2d2.js} +0 -0
- package/.next-prod/static/chunks/9530-870e97119b45f025.js +15 -0
- package/.next-prod/static/chunks/app/_global-error/{page-51252a3b116b8135.js → page-0ad1f48c09ff2c02.js} +1 -1
- package/.next-prod/static/chunks/app/api/agent/test/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
- package/.next-prod/static/chunks/app/api/bash/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
- package/.next-prod/static/chunks/app/api/chat/codex/{route-51252a3b116b8135.js → route-0ad1f48c09ff2c02.js} +1 -1
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/kimi/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/ollama/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/pty-input/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/chat/stop/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/claude-stats/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/commands/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/comments/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/columns/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/connect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/disconnect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/export/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/query/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/db/schemas/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/deepseek/balance/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/deepseek/credentials/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/deepseek/models/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/dev/spans/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/extension/version/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/file/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/blame/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/clipboard/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/copy/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/delete/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/expanded/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/index/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/init/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/paste/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/read/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/readdir/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/recent/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/save/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/search/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/stat/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/files/text/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/branches/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/commits/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/current-branch/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/diff/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/discard/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/stage/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/status/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/unstage/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/git/worktree/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/global-state/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/health/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/html-apps/[id]/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/html-apps/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/load/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/save/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/definition/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/hover/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/references/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/status/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/columns/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/connect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/export/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/query/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/query/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/note/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/config/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/models/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/ollama/start/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/open-cursor/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/open-vscode/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/pick-folder/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/project-settings/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/project-state/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/affected/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/callees/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/callers/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/context/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/impact/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/related/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/risk/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/projects/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/prompts/config/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/push/public-key/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/push/subscribe/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/push/unsubscribe/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/command/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/connect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/delete/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/get/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/keys/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/redis/set/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/[id]/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/identify/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/order/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/share-info/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/review/users/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/services/config/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/services/scripts/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/session-by-path/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/projects/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/sessions/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/settings/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/[id]/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/content/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/skills/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/snapshots/diff/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/snapshots/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/env/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/terminal/history/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/api/version/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/apps/[...path]/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/{layout-145570f39a827c0f.js → layout-d43dd702b3ee9d15.js} +1 -1
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/app/{page-487095ac01a4c1ef.js → page-8e7a3d723260097a.js} +1 -1
- package/.next-prod/static/chunks/app/project/{page-487095ac01a4c1ef.js → page-8e7a3d723260097a.js} +1 -1
- package/.next-prod/static/chunks/app/review/[id]/page-c0136423507b7547.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-0ad1f48c09ff2c02.js +1 -0
- package/.next-prod/static/css/05889d4d244bd7d5.css +1 -0
- package/.next-prod/static/xXMzxSYQCcHCrntVXcycC/_buildManifest.js +1 -0
- package/.next-prod/trace +14 -14
- package/.next-prod/trace-build +1 -1
- package/.next-prod/types/app/api/deepseek/balance/route.ts +351 -0
- package/.next-prod/types/app/api/deepseek/models/route.ts +351 -0
- package/.next-prod/types/app/api/prompts/config/route.ts +351 -0
- package/.next-prod/types/routes.d.ts +4 -1
- package/.next-prod/types/validator.ts +27 -0
- package/dist/{chunk-BRW4ZEIC.mjs → chunk-7G4OXJJ4.mjs} +52 -7
- package/dist/{chunk-RUNUGDPP.mjs → chunk-H3JSYJCZ.mjs} +25 -29
- package/dist/{chunk-7WPYQYA6.mjs → chunk-HIW2SGCF.mjs} +4 -4
- package/dist/httpApi.mjs +2 -2
- package/dist/scheduledTasks.mjs +398 -286
- package/dist/{server-MCN5AIEU.mjs → server-O434I7QD.mjs} +2 -2
- package/dist/wsServer.mjs +7 -6
- package/package.json +1 -1
- package/.next-prod/server/chunks/7338.js +0 -89
- package/.next-prod/static/c5kafUZf0iWY6C4N_N-5-/_buildManifest.js +0 -1
- package/.next-prod/static/chunks/2876-e1f46119599a536b.js +0 -25
- package/.next-prod/static/chunks/9530-8c647490a5290e9a.js +0 -15
- package/.next-prod/static/chunks/app/api/chat/deepseek/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/kimi/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/ollama/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/pty-input/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/chat/stop/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/claude-stats/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/commands/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/comments/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/columns/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/connect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/disconnect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/export/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/query/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/db/schemas/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/deepseek/credentials/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/dev/spans/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/extension/version/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/file/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/blame/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/clipboard/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/copy/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/delete/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/expanded/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/index/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/init/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/paste/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/read/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/readdir/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/recent/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/save/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/search/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/stat/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/files/text/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branch-diff/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/branches/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commit-diff/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/commits/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/current-branch/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/diff/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/discard/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/stage/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/status/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/unstage/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/git/worktree/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/global-state/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/health/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/html-apps/[id]/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/html-apps/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/load/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/save/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/jupyter/shutdown/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/definition/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/hover/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/references/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/status/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/lsp/warmup/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/columns/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/connect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/disconnect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/export/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/query/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/mysql/schemas/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/connect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/disconnect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/query/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/neo4j/schema/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/note/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/config/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/models/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/ollama/start/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/open-cursor/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/open-vscode/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/pick-folder/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/pinned-sessions/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/project-settings/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/project-state/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/affected/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/callees/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/callers/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/coedit/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/context/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/file-functions/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/impact/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/related/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/risk/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projectGraph/search/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/projects/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/push/public-key/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/push/subscribe/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/push/unsubscribe/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/command/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/connect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/delete/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/disconnect/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/get/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/keys/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/redis/set/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/comments/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/replies/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/[id]/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/identify/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/order/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/share-info/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/review/users/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/scheduled-tasks/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/services/config/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/services/scripts/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/fork/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/session/[sessionId]/history/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/session-by-path/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/[encodedPath]/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/projects/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/sessions/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/settings/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/[id]/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/content/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/skills/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/snapshots/diff/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/snapshots/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/aliases/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/autocomplete/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/bubble-order/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/env/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/terminal/history/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/api/version/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/apps/[...path]/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/manifest.webmanifest/route-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/app/review/[id]/page-c9716ea0049cc328.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/app-error-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/forbidden-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/not-found-51252a3b116b8135.js +0 -1
- package/.next-prod/static/chunks/next/dist/client/components/builtin/unauthorized-51252a3b116b8135.js +0 -1
- package/.next-prod/static/css/16fd09c7889dec84.css +0 -1
- /package/.next-prod/static/{c5kafUZf0iWY6C4N_N-5- → xXMzxSYQCcHCrntVXcycC}/_ssgManifest.js +0 -0
package/dist/scheduledTasks.mjs
CHANGED
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
setRunAbort,
|
|
11
11
|
startRun,
|
|
12
12
|
updateGlobalState
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-H3JSYJCZ.mjs";
|
|
14
14
|
import {
|
|
15
15
|
AgentError,
|
|
16
16
|
AppRuntime,
|
|
@@ -24,20 +24,24 @@ import {
|
|
|
24
24
|
SKILLS_FILE,
|
|
25
25
|
SnapshotService,
|
|
26
26
|
createOllamaModel,
|
|
27
|
+
createOpenAiCompatModel,
|
|
27
28
|
encodePath,
|
|
28
29
|
findCodexSessionPath,
|
|
29
30
|
findKimiSessionPath,
|
|
31
|
+
getBuiltinSessionsRoot,
|
|
30
32
|
getClaude2SessionPath,
|
|
31
33
|
getClaudeSessionPath,
|
|
34
|
+
getDeepseekBuiltinSessionPath,
|
|
32
35
|
getDeepseekSessionPath,
|
|
33
36
|
getOllamaSessionPath,
|
|
34
37
|
mutateJsonFile,
|
|
35
38
|
notePendingRecord,
|
|
36
39
|
readJsonFile,
|
|
40
|
+
sanitizedSpawnEnv,
|
|
37
41
|
settlePendingRecord,
|
|
38
42
|
withFileLock,
|
|
39
43
|
writeJsonFile
|
|
40
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-7G4OXJJ4.mjs";
|
|
41
45
|
import {
|
|
42
46
|
__export
|
|
43
47
|
} from "./chunk-7P6ASYW6.mjs";
|
|
@@ -1629,23 +1633,84 @@ Output confirmation: branch name, current HEAD commit, and sync status against o
|
|
|
1629
1633
|
// packages/feature/agent/src/server/lib/qaPrompt.ts
|
|
1630
1634
|
var QA_PROMPT_ZH = `---
|
|
1631
1635
|
name: qa
|
|
1632
|
-
description: "\u8FDB\u5165\u9700\u6C42\u6F84\u6E05\u8BA8\u8BBA\u6A21\u5F0F\uFF1A\
|
|
1636
|
+
description: "\u8FDB\u5165\u9700\u6C42\u6F84\u6E05\u8BA8\u8BBA\u6A21\u5F0F\uFF1A\u590D\u8FF0\u5BF9\u9700\u6C42\u7684\u7406\u89E3\uFF0C\u628A\u5F85\u786E\u8BA4\u70B9\u505A\u6210\u5E26\u63A8\u8350\u7B54\u6848\u7684\u9009\u62E9\u9898\u8868\u683C\uFF0C\u53EA\u8F93\u51FA\u7406\u89E3\u4E0D\u6539\u4EE3\u7801\uFF0C\u9075\u5FAA KISS\u3002"
|
|
1633
1637
|
---
|
|
1634
1638
|
|
|
1635
|
-
\u8FDB\u5165\u9700\u6C42\u6F84\u6E05\u8BA8\u8BBA\u6A21\u5F0F
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
+
\u8FDB\u5165\u9700\u6C42\u6F84\u6E05\u8BA8\u8BBA\u6A21\u5F0F\u3002\u76EE\u6807\u662F\u52A8\u4EE3\u7801\u524D\u5BF9\u9F50\u7406\u89E3\uFF0C\u907F\u514D\u56E0\u7406\u89E3\u4E0D\u4E00\u81F4\u5BFC\u81F4\u65E0\u6548\u7684\u4EE3\u7801\u4FEE\u6539\u3002
|
|
1640
|
+
|
|
1641
|
+
## \u6B65\u9AA4
|
|
1642
|
+
|
|
1643
|
+
1. \u590D\u8FF0\u7406\u89E3\uFF1A\u51E0\u53E5\u8BDD\u8BF4\u6E05\u6539\u54EA\u91CC\u3001\u6539\u4EC0\u4E48\u3001\u73B0\u72B6\u662F\u4EC0\u4E48\u3002\u5148\u8BFB\u4EE3\u7801\u786E\u8BA4\u73B0\u72B6\u518D\u590D\u8FF0\uFF0C\u4E0D\u8981\u51ED\u731C\u6D4B\u2014\u2014\u731C\u9519\u7684\u590D\u8FF0\u6BD4\u4E0D\u590D\u8FF0\u66F4\u6D6A\u8D39\u8F6E\u6B21\u3002
|
|
1644
|
+
2. \u5217\u5F85\u786E\u8BA4\u70B9\uFF1A\u505A\u6210\u9009\u62E9\u9898\u8868\u683C\uFF08\u683C\u5F0F\u89C1\u4E0B\uFF09\u3002
|
|
1645
|
+
3. \u505C\u4E0B\u7B49\u786E\u8BA4\uFF1A\u4E0D\u6539\u4EE3\u7801\uFF0C\u7B49\u7528\u6237\u56DE\u590D\u518D\u52A8\u624B\u3002
|
|
1646
|
+
|
|
1647
|
+
## \u5F85\u786E\u8BA4\u70B9\u8868\u683C
|
|
1648
|
+
|
|
1649
|
+
\u5FC5\u987B\u7528\u8868\u683C\uFF0C\u6BCF\u4E2A\u70B9\u5FC5\u987B\u7ED9\u51FA\u5177\u4F53\u9009\u9879\u548C\u63A8\u8350\u7B54\u6848\u3002\u8BA9\u7528\u6237\u56DE\u4E00\u4E2A\u5B57\u6BCD\u5C31\u80FD\u5B9A\u7A3F\uFF0C\u800C\u4E0D\u662F\u56DE\u7B54\u5F00\u653E\u5F0F\u95EE\u9898\u3002
|
|
1650
|
+
|
|
1651
|
+
| # | \u5F85\u786E\u8BA4\u70B9 | \u9009\u9879 | \u63A8\u8350 | \u7406\u7531 |
|
|
1652
|
+
|---|---|---|---|---|
|
|
1653
|
+
| 1 | <\u8981\u5B9A\u7684\u90A3\u4E2A\u51B3\u7B56> | A <\u505A\u6CD5\u4E00><br>B <\u505A\u6CD5\u4E8C><br>C <\u505A\u6CD5\u4E09> | **A** | <\u4E3A\u4EC0\u4E48\u4E0D\u9009 B / C\uFF0C\u4E00\u53E5\u8BDD\u53D6\u820D> |
|
|
1654
|
+
| 2 | <\u8981\u5B9A\u7684\u90A3\u4E2A\u51B3\u7B56> | A <\u505A\u6CD5\u4E00><br>B <\u505A\u6CD5\u4E8C> | **B** | <\u4E3A\u4EC0\u4E48\u4E0D\u9009 A\uFF0C\u4E00\u53E5\u8BDD\u53D6\u820D> |
|
|
1655
|
+
|
|
1656
|
+
\u8868\u683C\u540E\u9762\u8DDF\u4E00\u53E5\uFF1A\u300C\u76F4\u63A5\u56DE 1A 2B\uFF0C\u6216\u56DE\u300E\u90FD\u6309\u63A8\u8350\u300F\u300D\u3002
|
|
1657
|
+
|
|
1658
|
+
\u89C4\u5219\uFF1A
|
|
1659
|
+
- \u9009\u9879\u4E00\u884C\u4E00\u4E2A\uFF0C\u7528 <br> \u5206\u9694\uFF0C\u4E0D\u8981\u7528\u659C\u6760\u6324\u5728\u4E00\u884C\u2014\u2014\u9009\u9879\u8D8A\u957F\uFF0C\u6324\u6210\u4E00\u884C\u8D8A\u96BE\u6BD4\u5BF9\u3002
|
|
1660
|
+
- \u9009\u9879\u4E92\u65A5\u4E14\u7A77\u5C3D\uFF0C\u6700\u591A 3 \u4E2A\u3002\u60F3\u4E0D\u51FA\u7B2C\u4E8C\u4E2A\u9009\u9879\uFF0C\u8BF4\u660E\u5B83\u4E0D\u662F\u5F85\u786E\u8BA4\u70B9\u2014\u2014\u522B\u51D1\u6570\u3002
|
|
1661
|
+
- \u63A8\u8350\u5217\u5FC5\u987B\u586B\uFF0C\u4E0D\u80FD\u5199\u300C\u770B\u4F60\u300D\u300C\u90FD\u884C\u300D\u3002
|
|
1662
|
+
- \u7406\u7531\u4E00\u53E5\u8BDD\uFF0C\u8BB2\u53D6\u820D\uFF08\u4E3A\u4EC0\u4E48\u4E0D\u9009\u53E6\u4E00\u4E2A\uFF09\uFF0C\u4E0D\u8BB2\u529F\u80FD\u662F\u4EC0\u4E48\u3002
|
|
1663
|
+
- \u786C\u7EA6\u675F\u5355\u72EC\u5199\uFF1A\u5982\u679C\u67D0\u4E2A\u9009\u9879\u4F1A\u8FDE\u5E26\u8E29\u5751\uFF08\u6709\u5199\u6B7B\u7684\u5E38\u91CF\u4F9D\u8D56\u3001\u6539\u4E86\u8FD9\u91CC\u4F1A\u8BA9\u522B\u5904\u5931\u6548\uFF09\uFF0C\u5355\u5F00\u4E00\u4E2A\u5C0F\u8868\u6216\u6BB5\u843D\u8BB2\u6E05\u695A\uFF0C\u4E0D\u8981\u585E\u8FDB\u7406\u7531\u5217\u2014\u2014\u90A3\u662F\u51B3\u7B56\u4F9D\u636E\uFF0C\u4E0D\u662F\u7406\u7531\u3002
|
|
1664
|
+
|
|
1665
|
+
## \u8FB9\u754C
|
|
1666
|
+
|
|
1667
|
+
- \u53EA\u8F93\u51FA\u7406\u89E3\uFF0C\u4E0D\u6539\u4EE3\u7801\u3001\u4E0D\u5199\u6587\u4EF6\u3001\u4E0D\u8DD1\u6539\u52A8\u6027\u547D\u4EE4\u3002\u8BFB\u4EE3\u7801\u786E\u8BA4\u73B0\u72B6\u662F\u5141\u8BB8\u4E14\u9F13\u52B1\u7684\u3002
|
|
1668
|
+
- \u9075\u5FAA KISS \u539F\u5219\uFF1A\u53EA\u5217\u771F\u6B63\u5F71\u54CD\u5B9E\u73B0\u65B9\u5411\u7684\u70B9\u3002\u80FD\u81EA\u5DF1\u67E5\u6E05\u695A\u7684\u81EA\u5DF1\u67E5\uFF0C\u4E0D\u8981\u4E3A\u4E86\u663E\u5F97\u5468\u5168\u800C\u5806\u786E\u8BA4\u70B9\u3002
|
|
1669
|
+
- \u6CA1\u6709\u4E0D\u660E\u786E\u7684\u70B9\uFF0C\u76F4\u63A5\u8BF4\u300C\u7406\u89E3\u65E0\u6B67\u4E49\uFF0C\u53EF\u4EE5\u5F00\u59CB\u300D\uFF0C\u4E0D\u8981\u786C\u51D1\u8868\u683C\u3002
|
|
1670
|
+
|
|
1671
|
+
## \u9A8C\u8BC1
|
|
1672
|
+
|
|
1673
|
+
\u7528\u6237\u80FD\u53EA\u56DE\u5B57\u6BCD\u6216\u300C\u90FD\u6309\u63A8\u8350\u300D\u5C31\u8FDB\u5165\u5B9E\u73B0\uFF0C\u8BF4\u660E\u8FD9\u6B21\u6F84\u6E05\u662F\u5408\u683C\u7684\uFF1B\u5982\u679C\u7528\u6237\u8FD8\u5F97\u8865\u4E00\u6BB5\u6563\u6587\u89E3\u91CA\uFF0C\u8BF4\u660E\u9009\u9879\u6CA1\u7A77\u5C3D\u6216\u63A8\u8350\u6CA1\u7ED9\u5230\u4F4D\u3002`;
|
|
1639
1674
|
var QA_PROMPT_EN = `---
|
|
1640
1675
|
name: qa
|
|
1641
|
-
description: "Enter requirement clarification mode:
|
|
1676
|
+
description: "Enter requirement clarification mode: restate your understanding, turn open questions into a multiple-choice table with a recommended answer for each, output understanding only without modifying code, follow KISS."
|
|
1642
1677
|
---
|
|
1643
1678
|
|
|
1644
|
-
Enter requirement clarification mode.
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1679
|
+
Enter requirement clarification mode. The goal is to align on intent before touching code, so a misread requirement never turns into wasted changes.
|
|
1680
|
+
|
|
1681
|
+
## Steps
|
|
1682
|
+
|
|
1683
|
+
1. Restate your understanding: a few sentences on what changes, where, and what the current behaviour is. Read the code to confirm the current state first \u2014 a restatement built on a guess wastes more turns than no restatement at all.
|
|
1684
|
+
2. List the open questions as a multiple-choice table (format below).
|
|
1685
|
+
3. Stop and wait: do not modify code until the user answers.
|
|
1686
|
+
|
|
1687
|
+
## Open-questions table
|
|
1688
|
+
|
|
1689
|
+
Always use a table, and always give every question concrete options plus a recommendation. The user should be able to lock the design by replying with letters, not by answering open-ended prose questions.
|
|
1690
|
+
|
|
1691
|
+
| # | Question | Options | Recommend | Why |
|
|
1692
|
+
|---|---|---|---|---|
|
|
1693
|
+
| 1 | <the decision to settle> | A <option one><br>B <option two><br>C <option three> | **A** | <why not B / C \u2014 one line of trade-off> |
|
|
1694
|
+
| 2 | <the decision to settle> | A <option one><br>B <option two> | **B** | <why not A \u2014 one line of trade-off> |
|
|
1695
|
+
|
|
1696
|
+
Follow the table with: "Reply 1A 2B, or say 'all as recommended'".
|
|
1697
|
+
|
|
1698
|
+
Rules:
|
|
1699
|
+
- One option per line, separated by <br> \u2014 never slash-joined on a single line. The longer the options, the harder a single line is to compare.
|
|
1700
|
+
- Options must be mutually exclusive and exhaustive, at most 3. If you cannot name a second option, it was never an open question \u2014 do not pad the table.
|
|
1701
|
+
- The Recommend column must always be filled. Never "up to you" or "either works".
|
|
1702
|
+
- Keep Why to one line about the trade-off (why not the other option), not a description of the feature.
|
|
1703
|
+
- Put hard constraints in their own table or paragraph: if an option drags a hidden cost along (a hardcoded constant depends on it, changing this breaks that), spell it out separately. It is decision input, not a reason cell.
|
|
1704
|
+
|
|
1705
|
+
## Boundaries
|
|
1706
|
+
|
|
1707
|
+
- Output understanding only: do not modify code, write files, or run mutating commands. Reading code to confirm the current state is allowed and encouraged.
|
|
1708
|
+
- Follow the KISS principle: list only what genuinely changes the implementation direction. Anything you can settle by looking it up, look it up.
|
|
1709
|
+
- If nothing is ambiguous, just say so and offer to start \u2014 do not manufacture a table.
|
|
1710
|
+
|
|
1711
|
+
## Verification
|
|
1712
|
+
|
|
1713
|
+
If the user can reply with only letters or "all as recommended" and you can start implementing, the clarification was good. If they have to write a paragraph back, your options were not exhaustive or your recommendation was missing.`;
|
|
1649
1714
|
|
|
1650
1715
|
// packages/feature/agent/src/server/lib/skillifyPrompt.ts
|
|
1651
1716
|
var SKILLIFY_PROMPT_ZH = `---
|
|
@@ -2516,7 +2581,7 @@ ${tempImageFiles.map((f) => f.path).join("\n")}` : prompt;
|
|
|
2516
2581
|
cols,
|
|
2517
2582
|
rows,
|
|
2518
2583
|
cwd,
|
|
2519
|
-
env:
|
|
2584
|
+
env: sanitizedSpawnEnv()
|
|
2520
2585
|
});
|
|
2521
2586
|
} catch (e) {
|
|
2522
2587
|
cleanupImages();
|
|
@@ -2976,8 +3041,10 @@ function buildClaudeOptions(ctx) {
|
|
|
2976
3041
|
},
|
|
2977
3042
|
includePartialMessages: true,
|
|
2978
3043
|
abortController: abort,
|
|
2979
|
-
// claude2
|
|
2980
|
-
|
|
3044
|
+
// env is ALWAYS passed (not just for claude2): without it the SDK inherits
|
|
3045
|
+
// process.env verbatim, handing the agent this server's NODE_ENV=production.
|
|
3046
|
+
// See sanitizedSpawnEnv. claude2 additionally points at ~/.claude2.
|
|
3047
|
+
env: sanitizedSpawnEnv(engine === "claude2" ? { CLAUDE_CONFIG_DIR: CLAUDE2_DIR } : {})
|
|
2981
3048
|
});
|
|
2982
3049
|
}
|
|
2983
3050
|
var claudeSpec = {
|
|
@@ -3001,93 +3068,82 @@ async function readDeepseekApiKey() {
|
|
|
3001
3068
|
return creds.apiKey?.trim() ?? "";
|
|
3002
3069
|
}
|
|
3003
3070
|
|
|
3004
|
-
// packages/feature/agent/src/server/engines/
|
|
3005
|
-
var DEEPSEEK_BASE_URL = "https://api.deepseek.com/anthropic";
|
|
3006
|
-
var DEFAULT_MODEL = "deepseek-v4-pro";
|
|
3007
|
-
var SMALL_FAST_MODEL = "deepseek-v4-flash";
|
|
3008
|
-
var ALLOWED_MODELS = /* @__PURE__ */ new Set(["deepseek-v4-flash", "deepseek-v4-pro"]);
|
|
3009
|
-
async function readSettings() {
|
|
3010
|
-
return readJsonFile(SETTINGS_FILE, {});
|
|
3011
|
-
}
|
|
3012
|
-
function resolveModel(requested, saved) {
|
|
3013
|
-
if (typeof requested === "string" && ALLOWED_MODELS.has(requested)) return requested;
|
|
3014
|
-
if (saved && ALLOWED_MODELS.has(saved)) return saved;
|
|
3015
|
-
return DEFAULT_MODEL;
|
|
3016
|
-
}
|
|
3017
|
-
function buildDeepseekEnv(apiKey, model) {
|
|
3018
|
-
const { ANTHROPIC_AUTH_TOKEN: _t, ANTHROPIC_API_KEY: _k, ...inherited } = process.env;
|
|
3019
|
-
void _t;
|
|
3020
|
-
void _k;
|
|
3021
|
-
return {
|
|
3022
|
-
...inherited,
|
|
3023
|
-
ANTHROPIC_BASE_URL: DEEPSEEK_BASE_URL,
|
|
3024
|
-
ANTHROPIC_API_KEY: apiKey,
|
|
3025
|
-
// DeepSeek sends this as x-api-key (fully supported)
|
|
3026
|
-
ANTHROPIC_MODEL: model,
|
|
3027
|
-
ANTHROPIC_SMALL_FAST_MODEL: SMALL_FAST_MODEL,
|
|
3028
|
-
CLAUDE_CONFIG_DIR: DEEPSEEK_DIR,
|
|
3029
|
-
DISABLE_PROMPT_CACHING: "1",
|
|
3030
|
-
// DeepSeek runs its own server-side prefix KV cache
|
|
3031
|
-
CLAUDE_CODE_USE_BEDROCK: "0",
|
|
3032
|
-
CLAUDE_CODE_USE_VERTEX: "0",
|
|
3033
|
-
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
|
|
3034
|
-
};
|
|
3035
|
-
}
|
|
3036
|
-
function buildDeepseekOptions(ctx, env) {
|
|
3037
|
-
return (abort, resume) => ({
|
|
3038
|
-
...resume && { resume },
|
|
3039
|
-
...ctx.cwd && { cwd: ctx.cwd },
|
|
3040
|
-
settingSources: ["user", "project", "local"],
|
|
3041
|
-
permissionMode: "bypassPermissions",
|
|
3042
|
-
allowDangerouslySkipPermissions: true,
|
|
3043
|
-
includePartialMessages: true,
|
|
3044
|
-
abortController: abort,
|
|
3045
|
-
env
|
|
3046
|
-
});
|
|
3047
|
-
}
|
|
3048
|
-
var deepseekSpec = {
|
|
3049
|
-
name: "deepseek",
|
|
3050
|
-
// Pre-check BEFORE startRun: API key must exist; resolve model into params (no registry pollution).
|
|
3051
|
-
async preflight(params) {
|
|
3052
|
-
const settings = await readSettings();
|
|
3053
|
-
const apiKey = await readDeepseekApiKey();
|
|
3054
|
-
if (!apiKey) {
|
|
3055
|
-
return {
|
|
3056
|
-
ok: false,
|
|
3057
|
-
status: 400,
|
|
3058
|
-
error: "DeepSeek API key is not configured. Open the DeepSeek picker in the chat header to set one."
|
|
3059
|
-
};
|
|
3060
|
-
}
|
|
3061
|
-
params.model = resolveModel(typeof params.model === "string" ? params.model : void 0, settings.engines?.deepseek?.model);
|
|
3062
|
-
return { ok: true };
|
|
3063
|
-
},
|
|
3064
|
-
runner: {
|
|
3065
|
-
async run(ctx) {
|
|
3066
|
-
const apiKey = await readDeepseekApiKey();
|
|
3067
|
-
const model = typeof ctx.params.model === "string" ? ctx.params.model : DEFAULT_MODEL;
|
|
3068
|
-
const env = buildDeepseekEnv(apiKey, model);
|
|
3069
|
-
await runSdkLoop(ctx, buildDeepseekOptions(ctx, env));
|
|
3070
|
-
},
|
|
3071
|
-
resolveTitle: (cwd, sessionId) => getSessionTitle(cwd, sessionId)
|
|
3072
|
-
}
|
|
3073
|
-
};
|
|
3074
|
-
|
|
3075
|
-
// packages/feature/agent/src/server/engines/ollama/index.ts
|
|
3071
|
+
// packages/feature/agent/src/server/engines/builtinAgent/index.ts
|
|
3076
3072
|
import { streamText, stepCountIs } from "ai";
|
|
3077
3073
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
3078
3074
|
|
|
3079
|
-
// packages/feature/agent/src/server/engines/
|
|
3075
|
+
// packages/feature/agent/src/server/engines/builtinAgent/prompt.ts
|
|
3076
|
+
function buildSystemPrompt(cwd) {
|
|
3077
|
+
return `You are a coding agent. You help the user build and modify software using the provided tools.
|
|
3078
|
+
|
|
3079
|
+
CWD: ${cwd}
|
|
3080
|
+
|
|
3081
|
+
## Language
|
|
3082
|
+
|
|
3083
|
+
ALWAYS reply in the SAME language as the user's most recent message \u2014 whatever language they used (Chinese, English, Japanese, French, Spanish, \u2026), mirror it. Do NOT default to English just because this system prompt is written in English. If the user switches language mid-conversation, switch with them on the next reply.
|
|
3084
|
+
|
|
3085
|
+
Exceptions that stay as-is regardless of reply language:
|
|
3086
|
+
- Tool "thought" parameters: keep the "PREVIOUS / THIS / EXPECT" template in English.
|
|
3087
|
+
- Code, identifiers, file paths, shell commands, and error messages quoted from tool output: keep original.
|
|
3088
|
+
- Only your natural-language prose to the user follows the user's language.
|
|
3089
|
+
|
|
3090
|
+
## Workflow
|
|
3091
|
+
|
|
3092
|
+
1. Plan: call TodoWrite FIRST to break down the task into steps (all pending, first one in_progress).
|
|
3093
|
+
2. Act: execute steps one by one. After completing each step, call TodoWrite to update progress (mark completed, set next in_progress).
|
|
3094
|
+
3. Check: after each tool call, assess \u2014 did it succeed? Is the overall task done? If not, continue to the next step.
|
|
3095
|
+
4. Respond: you MUST always end with a text response to the user. Summarize what was done, what was found, or what remains.
|
|
3096
|
+
|
|
3097
|
+
IMPORTANT: never stop in the middle of a task silently. If you cannot continue (error, missing info, blocked), respond to the user explaining why and what is needed.
|
|
3098
|
+
|
|
3099
|
+
NEVER repeat a tool call with the same or similar arguments. When a search finds nothing, follow this escalation:
|
|
3100
|
+
1. Simplify the pattern (shorter keyword, remove qualifiers, use a single core term)
|
|
3101
|
+
2. Broaden the path (search parent directory, or omit path to search entire CWD)
|
|
3102
|
+
3. Switch tool (Grep \u2192 Glob for filenames, Grep \u2192 Bash with find, or Read a likely file directly)
|
|
3103
|
+
4. Give up after 3 failed attempts on the same topic \u2014 tell the user what you tried and ask for guidance.
|
|
3104
|
+
|
|
3105
|
+
## Tools
|
|
3106
|
+
|
|
3107
|
+
- Read: read a file by line range.
|
|
3108
|
+
- Edit: exact string replacement in an existing file (prefer over Write).
|
|
3109
|
+
- Write: create new files or full rewrites only.
|
|
3110
|
+
- Bash: run shell commands.
|
|
3111
|
+
- Grep: ripgrep search. ALWAYS use Grep (never rg/grep via Bash).
|
|
3112
|
+
- Glob: fast file listing by glob pattern.
|
|
3113
|
+
- TodoWrite: plan tasks and track progress. ALWAYS call this first.
|
|
3114
|
+
|
|
3115
|
+
Every tool has a "thought" parameter \u2014 ALWAYS fill it using this format:
|
|
3116
|
+
"PREVIOUS: [what the last tool returned and whether it achieved the goal] \u2192 THIS: [what I am doing now and why] \u2192 EXPECT: [what result I expect]"
|
|
3117
|
+
Example: "PREVIOUS: Grep found 3 matches in cache.go \u2192 THIS: Read cache.go to see full implementation \u2192 EXPECT: understand the caching logic"
|
|
3118
|
+
If this is the first tool call, write "PREVIOUS: n/a" for the first part.
|
|
3119
|
+
|
|
3120
|
+
## Rules
|
|
3121
|
+
|
|
3122
|
+
Tool usage:
|
|
3123
|
+
- Read before modify: do NOT edit a file you haven't Read.
|
|
3124
|
+
- Absolute paths only: resolve relative paths against CWD.
|
|
3125
|
+
|
|
3126
|
+
Accuracy:
|
|
3127
|
+
- Verify before retracting: when the user questions you, use tools to verify first, then respond based on evidence. Do NOT blindly agree you were wrong.
|
|
3128
|
+
- Honesty over confidence: only state what is backed by tool output. If unsure, say so and state what info is needed or propose a verification plan. Never fabricate data.
|
|
3129
|
+
|
|
3130
|
+
## Output
|
|
3131
|
+
|
|
3132
|
+
- Be concise. Lead with the action or answer.
|
|
3133
|
+
- Only elaborate on decisions, blockers, or milestones.`;
|
|
3134
|
+
}
|
|
3135
|
+
|
|
3136
|
+
// packages/feature/agent/src/server/engines/builtinAgent/session.ts
|
|
3080
3137
|
import { readFileSync as readFileSync3, existsSync, mkdirSync as mkdirSync2, appendFileSync } from "fs";
|
|
3081
3138
|
import { join as join3 } from "path";
|
|
3082
|
-
|
|
3083
|
-
|
|
3084
|
-
return join3(SESSIONS_ROOT, encodePath(cwd));
|
|
3139
|
+
function getSessionDir(root, cwd) {
|
|
3140
|
+
return join3(root, encodePath(cwd));
|
|
3085
3141
|
}
|
|
3086
|
-
function getSessionPath(cwd, sessionId) {
|
|
3087
|
-
return join3(getSessionDir(cwd), `${sessionId}.jsonl`);
|
|
3142
|
+
function getSessionPath(root, cwd, sessionId) {
|
|
3143
|
+
return join3(getSessionDir(root, cwd), `${sessionId}.jsonl`);
|
|
3088
3144
|
}
|
|
3089
|
-
function readSessionMessages(cwd, sessionId) {
|
|
3090
|
-
const path2 = getSessionPath(cwd, sessionId);
|
|
3145
|
+
function readSessionMessages(root, cwd, sessionId) {
|
|
3146
|
+
const path2 = getSessionPath(root, cwd, sessionId);
|
|
3091
3147
|
if (!existsSync(path2)) return [];
|
|
3092
3148
|
const lines = readFileSync3(path2, "utf-8").split("\n").filter(Boolean);
|
|
3093
3149
|
const transcriptEntries = [];
|
|
@@ -3179,14 +3235,14 @@ function readSessionMessages(cwd, sessionId) {
|
|
|
3179
3235
|
}
|
|
3180
3236
|
return messages;
|
|
3181
3237
|
}
|
|
3182
|
-
function appendSessionLine(cwd, sessionId, line) {
|
|
3183
|
-
const dir = getSessionDir(cwd);
|
|
3238
|
+
function appendSessionLine(root, cwd, sessionId, line) {
|
|
3239
|
+
const dir = getSessionDir(root, cwd);
|
|
3184
3240
|
mkdirSync2(dir, { recursive: true });
|
|
3185
|
-
const path2 = getSessionPath(cwd, sessionId);
|
|
3241
|
+
const path2 = getSessionPath(root, cwd, sessionId);
|
|
3186
3242
|
appendFileSync(path2, JSON.stringify(line) + "\n", "utf-8");
|
|
3187
3243
|
}
|
|
3188
|
-
function appendUserText(cwd, sessionId, text, opts) {
|
|
3189
|
-
appendSessionLine(cwd, sessionId, {
|
|
3244
|
+
function appendUserText(root, cwd, sessionId, text, opts) {
|
|
3245
|
+
appendSessionLine(root, cwd, sessionId, {
|
|
3190
3246
|
type: "user",
|
|
3191
3247
|
uuid: opts?.uuid,
|
|
3192
3248
|
sessionId,
|
|
@@ -3194,8 +3250,8 @@ function appendUserText(cwd, sessionId, text, opts) {
|
|
|
3194
3250
|
message: { role: "user", content: [{ type: "text", text }] }
|
|
3195
3251
|
});
|
|
3196
3252
|
}
|
|
3197
|
-
function appendAssistantMessage(cwd, sessionId, content, opts) {
|
|
3198
|
-
appendSessionLine(cwd, sessionId, {
|
|
3253
|
+
function appendAssistantMessage(root, cwd, sessionId, content, opts) {
|
|
3254
|
+
appendSessionLine(root, cwd, sessionId, {
|
|
3199
3255
|
type: "assistant",
|
|
3200
3256
|
uuid: opts?.uuid,
|
|
3201
3257
|
sessionId,
|
|
@@ -3203,8 +3259,8 @@ function appendAssistantMessage(cwd, sessionId, content, opts) {
|
|
|
3203
3259
|
message: { role: "assistant", content, ...opts?.usage ? { usage: opts.usage } : {} }
|
|
3204
3260
|
});
|
|
3205
3261
|
}
|
|
3206
|
-
function appendToolResult(cwd, sessionId, toolUseId, content, opts) {
|
|
3207
|
-
appendSessionLine(cwd, sessionId, {
|
|
3262
|
+
function appendToolResult(root, cwd, sessionId, toolUseId, content, opts) {
|
|
3263
|
+
appendSessionLine(root, cwd, sessionId, {
|
|
3208
3264
|
type: "user",
|
|
3209
3265
|
uuid: opts?.uuid,
|
|
3210
3266
|
sessionId,
|
|
@@ -3222,7 +3278,7 @@ function appendToolResult(cwd, sessionId, toolUseId, content, opts) {
|
|
|
3222
3278
|
});
|
|
3223
3279
|
}
|
|
3224
3280
|
|
|
3225
|
-
// packages/feature/agent/src/server/engines/
|
|
3281
|
+
// packages/feature/agent/src/server/engines/builtinAgent/tools.ts
|
|
3226
3282
|
import { tool, zodSchema } from "ai";
|
|
3227
3283
|
|
|
3228
3284
|
// node_modules/zod/v4/classic/external.js
|
|
@@ -16993,7 +17049,7 @@ function date4(params) {
|
|
|
16993
17049
|
// node_modules/zod/v4/classic/external.js
|
|
16994
17050
|
config(en_default());
|
|
16995
17051
|
|
|
16996
|
-
// packages/feature/agent/src/server/engines/
|
|
17052
|
+
// packages/feature/agent/src/server/engines/builtinAgent/tools.ts
|
|
16997
17053
|
import { readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
|
|
16998
17054
|
import { writeFile, mkdir, readdir, stat, unlink } from "fs/promises";
|
|
16999
17055
|
import { isAbsolute, join as join4 } from "path";
|
|
@@ -17172,7 +17228,7 @@ function createTools(context) {
|
|
|
17172
17228
|
encoding: "utf-8",
|
|
17173
17229
|
timeout: timeout ?? 6e4,
|
|
17174
17230
|
maxBuffer: 10 * 1024 * 1024,
|
|
17175
|
-
env: {
|
|
17231
|
+
env: sanitizedSpawnEnv({ FORCE_COLOR: "0", CI: "1" })
|
|
17176
17232
|
});
|
|
17177
17233
|
if (stdout.length === 0) {
|
|
17178
17234
|
if (stderr.length === 0) {
|
|
@@ -17271,7 +17327,7 @@ ${stderrCapped}`;
|
|
|
17271
17327
|
encoding: "utf-8",
|
|
17272
17328
|
timeout: 15e3,
|
|
17273
17329
|
maxBuffer: 10 * 1024 * 1024,
|
|
17274
|
-
env: {
|
|
17330
|
+
env: sanitizedSpawnEnv({ FORCE_COLOR: "0" })
|
|
17275
17331
|
});
|
|
17276
17332
|
const GREP_CAP = 32e3;
|
|
17277
17333
|
const spillPath = stdout.length > GREP_CAP ? await spillToFile(stdout, "grep") : void 0;
|
|
@@ -17311,7 +17367,7 @@ ${summary}`;
|
|
|
17311
17367
|
};
|
|
17312
17368
|
}
|
|
17313
17369
|
|
|
17314
|
-
// packages/feature/agent/src/server/engines/
|
|
17370
|
+
// packages/feature/agent/src/server/engines/builtinAgent/stream.ts
|
|
17315
17371
|
async function consumeStream(fullStream, safeEnqueue, _sessionId, opts) {
|
|
17316
17372
|
let text = "";
|
|
17317
17373
|
const toolCalls = [];
|
|
@@ -17405,194 +17461,242 @@ function emitResultMessage(promptTokens, completionTokens, safeEnqueue) {
|
|
|
17405
17461
|
);
|
|
17406
17462
|
}
|
|
17407
17463
|
|
|
17408
|
-
// packages/feature/agent/src/server/engines/
|
|
17409
|
-
|
|
17410
|
-
|
|
17411
|
-
return `You are a coding agent. You help the user build and modify software using the provided tools.
|
|
17412
|
-
|
|
17413
|
-
CWD: ${cwd}
|
|
17414
|
-
|
|
17415
|
-
## Language
|
|
17416
|
-
|
|
17417
|
-
ALWAYS reply in the SAME language as the user's most recent message \u2014 whatever language they used (Chinese, English, Japanese, French, Spanish, \u2026), mirror it. Do NOT default to English just because this system prompt is written in English. If the user switches language mid-conversation, switch with them on the next reply.
|
|
17418
|
-
|
|
17419
|
-
Exceptions that stay as-is regardless of reply language:
|
|
17420
|
-
- Tool "thought" parameters: keep the "PREVIOUS / THIS / EXPECT" template in English.
|
|
17421
|
-
- Code, identifiers, file paths, shell commands, and error messages quoted from tool output: keep original.
|
|
17422
|
-
- Only your natural-language prose to the user follows the user's language.
|
|
17423
|
-
|
|
17424
|
-
## Workflow
|
|
17425
|
-
|
|
17426
|
-
1. Plan: call TodoWrite FIRST to break down the task into steps (all pending, first one in_progress).
|
|
17427
|
-
2. Act: execute steps one by one. After completing each step, call TodoWrite to update progress (mark completed, set next in_progress).
|
|
17428
|
-
3. Check: after each tool call, assess \u2014 did it succeed? Is the overall task done? If not, continue to the next step.
|
|
17429
|
-
4. Respond: you MUST always end with a text response to the user. Summarize what was done, what was found, or what remains.
|
|
17430
|
-
|
|
17431
|
-
IMPORTANT: never stop in the middle of a task silently. If you cannot continue (error, missing info, blocked), respond to the user explaining why and what is needed.
|
|
17432
|
-
|
|
17433
|
-
NEVER repeat a tool call with the same or similar arguments. When a search finds nothing, follow this escalation:
|
|
17434
|
-
1. Simplify the pattern (shorter keyword, remove qualifiers, use a single core term)
|
|
17435
|
-
2. Broaden the path (search parent directory, or omit path to search entire CWD)
|
|
17436
|
-
3. Switch tool (Grep \u2192 Glob for filenames, Grep \u2192 Bash with find, or Read a likely file directly)
|
|
17437
|
-
4. Give up after 3 failed attempts on the same topic \u2014 tell the user what you tried and ask for guidance.
|
|
17438
|
-
|
|
17439
|
-
## Tools
|
|
17440
|
-
|
|
17441
|
-
- Read: read a file by line range.
|
|
17442
|
-
- Edit: exact string replacement in an existing file (prefer over Write).
|
|
17443
|
-
- Write: create new files or full rewrites only.
|
|
17444
|
-
- Bash: run shell commands.
|
|
17445
|
-
- Grep: ripgrep search. ALWAYS use Grep (never rg/grep via Bash).
|
|
17446
|
-
- Glob: fast file listing by glob pattern.
|
|
17447
|
-
- TodoWrite: plan tasks and track progress. ALWAYS call this first.
|
|
17448
|
-
|
|
17449
|
-
Every tool has a "thought" parameter \u2014 ALWAYS fill it using this format:
|
|
17450
|
-
"PREVIOUS: [what the last tool returned and whether it achieved the goal] \u2192 THIS: [what I am doing now and why] \u2192 EXPECT: [what result I expect]"
|
|
17451
|
-
Example: "PREVIOUS: Grep found 3 matches in cache.go \u2192 THIS: Read cache.go to see full implementation \u2192 EXPECT: understand the caching logic"
|
|
17452
|
-
If this is the first tool call, write "PREVIOUS: n/a" for the first part.
|
|
17453
|
-
|
|
17454
|
-
## Rules
|
|
17455
|
-
|
|
17456
|
-
Tool usage:
|
|
17457
|
-
- Read before modify: do NOT edit a file you haven't Read.
|
|
17458
|
-
- Absolute paths only: resolve relative paths against CWD.
|
|
17459
|
-
|
|
17460
|
-
Accuracy:
|
|
17461
|
-
- Verify before retracting: when the user questions you, use tools to verify first, then respond based on evidence. Do NOT blindly agree you were wrong.
|
|
17462
|
-
- Honesty over confidence: only state what is backed by tool output. If unsure, say so and state what info is needed or propose a verification plan. Never fabricate data.
|
|
17463
|
-
|
|
17464
|
-
## Output
|
|
17465
|
-
|
|
17466
|
-
- Be concise. Lead with the action or answer.
|
|
17467
|
-
- Only elaborate on decisions, blockers, or milestones.`;
|
|
17464
|
+
// packages/feature/agent/src/server/engines/builtinAgent/index.ts
|
|
17465
|
+
function requireTextPrompt(params) {
|
|
17466
|
+
return typeof params.prompt === "string" && params.prompt.trim() ? { ok: true } : { ok: false, status: 400, error: "The built-in agent requires a text prompt" };
|
|
17468
17467
|
}
|
|
17469
|
-
|
|
17470
|
-
|
|
17471
|
-
|
|
17472
|
-
|
|
17473
|
-
|
|
17474
|
-
|
|
17475
|
-
|
|
17476
|
-
|
|
17477
|
-
|
|
17478
|
-
|
|
17479
|
-
|
|
17480
|
-
|
|
17481
|
-
|
|
17482
|
-
|
|
17483
|
-
|
|
17484
|
-
|
|
17485
|
-
|
|
17486
|
-
|
|
17487
|
-
|
|
17488
|
-
} catch {
|
|
17489
|
-
}
|
|
17490
|
-
};
|
|
17491
|
-
const existing = readSessionMessages(cwd, sid);
|
|
17492
|
-
const messages = [...existing, { role: "user", content: prompt }];
|
|
17493
|
-
appendUserText(cwd, sid, prompt, { uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
17494
|
-
emit(`data: ${JSON.stringify({ type: "system", subtype: "init", session_id: sid })}
|
|
17468
|
+
async function runBuiltinAgent(ctx, config2) {
|
|
17469
|
+
const { sessionsRoot } = config2;
|
|
17470
|
+
const cwd = ctx.cwd || process.cwd();
|
|
17471
|
+
const sid = ctx.currentKey();
|
|
17472
|
+
ctx.rekey(sid);
|
|
17473
|
+
const model = typeof ctx.params.model === "string" && ctx.params.model || config2.defaultModel;
|
|
17474
|
+
const prompt = ctx.prompt;
|
|
17475
|
+
const emit = (data) => {
|
|
17476
|
+
if (data.startsWith("data: [DONE]")) return;
|
|
17477
|
+
try {
|
|
17478
|
+
ctx.emit(JSON.parse(data.slice(6)));
|
|
17479
|
+
} catch {
|
|
17480
|
+
}
|
|
17481
|
+
};
|
|
17482
|
+
const noHistory = ctx.params.noHistory === true;
|
|
17483
|
+
const existing = noHistory ? [] : readSessionMessages(sessionsRoot, cwd, sid);
|
|
17484
|
+
const messages = [...existing, { role: "user", content: prompt }];
|
|
17485
|
+
appendUserText(sessionsRoot, cwd, sid, prompt, { uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() });
|
|
17486
|
+
emit(`data: ${JSON.stringify({ type: "system", subtype: "init", session_id: sid })}
|
|
17495
17487
|
|
|
17496
17488
|
`);
|
|
17497
|
-
|
|
17498
|
-
|
|
17499
|
-
|
|
17500
|
-
|
|
17501
|
-
|
|
17502
|
-
|
|
17503
|
-
|
|
17504
|
-
|
|
17505
|
-
|
|
17506
|
-
|
|
17507
|
-
|
|
17508
|
-
|
|
17509
|
-
|
|
17510
|
-
|
|
17511
|
-
|
|
17489
|
+
const context = { cwd, todos: [] };
|
|
17490
|
+
const languageModel = await config2.createModel(model);
|
|
17491
|
+
const result = streamText({
|
|
17492
|
+
model: languageModel,
|
|
17493
|
+
system: buildSystemPrompt(cwd),
|
|
17494
|
+
messages,
|
|
17495
|
+
tools: createTools(context),
|
|
17496
|
+
stopWhen: stepCountIs(256),
|
|
17497
|
+
temperature: 0,
|
|
17498
|
+
abortSignal: ctx.signal
|
|
17499
|
+
});
|
|
17500
|
+
const pendingToolCalls = /* @__PURE__ */ new Map();
|
|
17501
|
+
const flushPendingToolCallsAsErrors = (reason) => {
|
|
17502
|
+
if (pendingToolCalls.size === 0) return;
|
|
17503
|
+
for (const [toolUseId] of pendingToolCalls) {
|
|
17504
|
+
try {
|
|
17505
|
+
appendToolResult(sessionsRoot, cwd, sid, toolUseId, reason, {
|
|
17506
|
+
uuid: randomUUID3(),
|
|
17507
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17508
|
+
is_error: true
|
|
17509
|
+
});
|
|
17510
|
+
} catch {
|
|
17511
|
+
}
|
|
17512
|
+
try {
|
|
17513
|
+
emit(
|
|
17514
|
+
`data: ${JSON.stringify({
|
|
17515
|
+
type: "user",
|
|
17516
|
+
message: { content: [{ type: "tool_result", tool_use_id: toolUseId, content: reason, is_error: true }] }
|
|
17517
|
+
})}
|
|
17518
|
+
|
|
17519
|
+
`
|
|
17520
|
+
);
|
|
17521
|
+
} catch {
|
|
17522
|
+
}
|
|
17523
|
+
}
|
|
17524
|
+
pendingToolCalls.clear();
|
|
17525
|
+
};
|
|
17526
|
+
try {
|
|
17527
|
+
const { text } = await consumeStream(
|
|
17528
|
+
result.fullStream,
|
|
17529
|
+
emit,
|
|
17530
|
+
sid,
|
|
17531
|
+
{
|
|
17532
|
+
onToolCall: (toolUseId, toolName, input) => {
|
|
17533
|
+
try {
|
|
17534
|
+
pendingToolCalls.set(toolUseId, { name: toolName, input });
|
|
17535
|
+
appendAssistantMessage(
|
|
17536
|
+
sessionsRoot,
|
|
17537
|
+
cwd,
|
|
17538
|
+
sid,
|
|
17539
|
+
[{ type: "tool_use", id: toolUseId, name: toolName, input }],
|
|
17540
|
+
{ uuid: randomUUID3(), timestamp: (/* @__PURE__ */ new Date()).toISOString() }
|
|
17541
|
+
);
|
|
17542
|
+
} catch {
|
|
17543
|
+
}
|
|
17544
|
+
},
|
|
17545
|
+
onToolResult: (toolUseId, content) => {
|
|
17512
17546
|
try {
|
|
17513
|
-
|
|
17547
|
+
pendingToolCalls.delete(toolUseId);
|
|
17548
|
+
appendToolResult(sessionsRoot, cwd, sid, toolUseId, content, {
|
|
17514
17549
|
uuid: randomUUID3(),
|
|
17515
17550
|
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17516
|
-
is_error:
|
|
17551
|
+
is_error: false
|
|
17517
17552
|
});
|
|
17518
17553
|
} catch {
|
|
17519
17554
|
}
|
|
17555
|
+
},
|
|
17556
|
+
onTextFlush: (flushedText) => {
|
|
17520
17557
|
try {
|
|
17521
|
-
|
|
17522
|
-
|
|
17523
|
-
|
|
17524
|
-
|
|
17525
|
-
})}
|
|
17526
|
-
|
|
17527
|
-
`
|
|
17528
|
-
);
|
|
17558
|
+
appendAssistantMessage(sessionsRoot, cwd, sid, [{ type: "text", text: flushedText }], {
|
|
17559
|
+
uuid: randomUUID3(),
|
|
17560
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
17561
|
+
});
|
|
17529
17562
|
} catch {
|
|
17530
17563
|
}
|
|
17531
17564
|
}
|
|
17532
|
-
pendingToolCalls.clear();
|
|
17533
|
-
};
|
|
17534
|
-
try {
|
|
17535
|
-
const { text } = await consumeStream(
|
|
17536
|
-
result.fullStream,
|
|
17537
|
-
emit,
|
|
17538
|
-
sid,
|
|
17539
|
-
{
|
|
17540
|
-
onToolCall: (toolUseId, toolName, input) => {
|
|
17541
|
-
try {
|
|
17542
|
-
pendingToolCalls.set(toolUseId, { name: toolName, input });
|
|
17543
|
-
appendAssistantMessage(cwd, sid, [{ type: "tool_use", id: toolUseId, name: toolName, input }], {
|
|
17544
|
-
uuid: randomUUID3(),
|
|
17545
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
17546
|
-
});
|
|
17547
|
-
} catch {
|
|
17548
|
-
}
|
|
17549
|
-
},
|
|
17550
|
-
onToolResult: (toolUseId, content) => {
|
|
17551
|
-
try {
|
|
17552
|
-
pendingToolCalls.delete(toolUseId);
|
|
17553
|
-
appendToolResult(cwd, sid, toolUseId, content, {
|
|
17554
|
-
uuid: randomUUID3(),
|
|
17555
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17556
|
-
is_error: false
|
|
17557
|
-
});
|
|
17558
|
-
} catch {
|
|
17559
|
-
}
|
|
17560
|
-
},
|
|
17561
|
-
onTextFlush: (flushedText) => {
|
|
17562
|
-
try {
|
|
17563
|
-
appendAssistantMessage(cwd, sid, [{ type: "text", text: flushedText }], {
|
|
17564
|
-
uuid: randomUUID3(),
|
|
17565
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
17566
|
-
});
|
|
17567
|
-
} catch {
|
|
17568
|
-
}
|
|
17569
|
-
}
|
|
17570
|
-
}
|
|
17571
|
-
);
|
|
17572
|
-
const usage = await result.usage;
|
|
17573
|
-
emitResultMessage(usage.inputTokens || 0, usage.outputTokens || 0, emit);
|
|
17574
|
-
if (!ctx.signal.aborted) {
|
|
17575
|
-
appendAssistantMessage(cwd, sid, text ? [{ type: "text", text }] : [], {
|
|
17576
|
-
uuid: randomUUID3(),
|
|
17577
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17578
|
-
usage: {
|
|
17579
|
-
input_tokens: usage.inputTokens || 0,
|
|
17580
|
-
output_tokens: usage.outputTokens || 0,
|
|
17581
|
-
cache_creation_input_tokens: 0,
|
|
17582
|
-
cache_read_input_tokens: 0
|
|
17583
|
-
}
|
|
17584
|
-
});
|
|
17585
|
-
}
|
|
17586
|
-
} catch (error48) {
|
|
17587
|
-
if (ctx.signal.aborted) {
|
|
17588
|
-
flushPendingToolCallsAsErrors("Tool call cancelled (request aborted).");
|
|
17589
|
-
return;
|
|
17590
|
-
}
|
|
17591
|
-
flushPendingToolCallsAsErrors("Tool call failed (stream error).");
|
|
17592
|
-
throw error48;
|
|
17593
17565
|
}
|
|
17566
|
+
);
|
|
17567
|
+
const usage = await result.usage;
|
|
17568
|
+
emitResultMessage(usage.inputTokens || 0, usage.outputTokens || 0, emit);
|
|
17569
|
+
if (!ctx.signal.aborted) {
|
|
17570
|
+
appendAssistantMessage(sessionsRoot, cwd, sid, text ? [{ type: "text", text }] : [], {
|
|
17571
|
+
uuid: randomUUID3(),
|
|
17572
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString(),
|
|
17573
|
+
usage: {
|
|
17574
|
+
input_tokens: usage.inputTokens || 0,
|
|
17575
|
+
output_tokens: usage.outputTokens || 0,
|
|
17576
|
+
cache_creation_input_tokens: 0,
|
|
17577
|
+
cache_read_input_tokens: 0
|
|
17578
|
+
}
|
|
17579
|
+
});
|
|
17580
|
+
}
|
|
17581
|
+
} catch (error48) {
|
|
17582
|
+
if (ctx.signal.aborted) {
|
|
17583
|
+
flushPendingToolCallsAsErrors("Tool call cancelled (request aborted).");
|
|
17584
|
+
return;
|
|
17585
|
+
}
|
|
17586
|
+
flushPendingToolCallsAsErrors("Tool call failed (stream error).");
|
|
17587
|
+
throw error48;
|
|
17588
|
+
}
|
|
17589
|
+
}
|
|
17590
|
+
|
|
17591
|
+
// packages/feature/agent/src/server/engines/deepseek.ts
|
|
17592
|
+
var DEEPSEEK_BASE_URL = "https://api.deepseek.com/anthropic";
|
|
17593
|
+
var DEFAULT_MODEL = "deepseek-v4-pro";
|
|
17594
|
+
var SMALL_FAST_MODEL = "deepseek-v4-flash";
|
|
17595
|
+
var ALLOWED_MODELS = /* @__PURE__ */ new Set(["deepseek-v4-flash", "deepseek-v4-pro"]);
|
|
17596
|
+
var DEEPSEEK_OPENAI_BASE_URL = "https://api.deepseek.com/v1";
|
|
17597
|
+
var BUILTIN_DEFAULT_MODEL = DEFAULT_MODEL;
|
|
17598
|
+
async function readSettings() {
|
|
17599
|
+
return readJsonFile(SETTINGS_FILE, {});
|
|
17600
|
+
}
|
|
17601
|
+
function resolveModel(requested, saved) {
|
|
17602
|
+
if (typeof requested === "string" && ALLOWED_MODELS.has(requested)) return requested;
|
|
17603
|
+
if (saved && ALLOWED_MODELS.has(saved)) return saved;
|
|
17604
|
+
return DEFAULT_MODEL;
|
|
17605
|
+
}
|
|
17606
|
+
function resolveBuiltinModel(requested, saved) {
|
|
17607
|
+
if (typeof requested === "string" && requested.trim()) return requested.trim();
|
|
17608
|
+
if (saved && saved.trim()) return saved.trim();
|
|
17609
|
+
return BUILTIN_DEFAULT_MODEL;
|
|
17610
|
+
}
|
|
17611
|
+
function buildBuiltinConfig(apiKey) {
|
|
17612
|
+
return {
|
|
17613
|
+
sessionsRoot: getBuiltinSessionsRoot("deepseek"),
|
|
17614
|
+
defaultModel: BUILTIN_DEFAULT_MODEL,
|
|
17615
|
+
createModel: async (modelName) => createOpenAiCompatModel({ baseURL: DEEPSEEK_OPENAI_BASE_URL, apiKey, modelName })
|
|
17616
|
+
};
|
|
17617
|
+
}
|
|
17618
|
+
function buildDeepseekEnv(apiKey, model) {
|
|
17619
|
+
return sanitizedSpawnEnv({
|
|
17620
|
+
ANTHROPIC_AUTH_TOKEN: void 0,
|
|
17621
|
+
ANTHROPIC_BASE_URL: DEEPSEEK_BASE_URL,
|
|
17622
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
17623
|
+
// DeepSeek sends this as x-api-key (fully supported)
|
|
17624
|
+
ANTHROPIC_MODEL: model,
|
|
17625
|
+
ANTHROPIC_SMALL_FAST_MODEL: SMALL_FAST_MODEL,
|
|
17626
|
+
CLAUDE_CONFIG_DIR: DEEPSEEK_DIR,
|
|
17627
|
+
DISABLE_PROMPT_CACHING: "1",
|
|
17628
|
+
// DeepSeek runs its own server-side prefix KV cache
|
|
17629
|
+
CLAUDE_CODE_USE_BEDROCK: "0",
|
|
17630
|
+
CLAUDE_CODE_USE_VERTEX: "0",
|
|
17631
|
+
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1"
|
|
17632
|
+
});
|
|
17633
|
+
}
|
|
17634
|
+
function buildDeepseekOptions(ctx, env) {
|
|
17635
|
+
return (abort, resume) => ({
|
|
17636
|
+
...resume && { resume },
|
|
17637
|
+
...ctx.cwd && { cwd: ctx.cwd },
|
|
17638
|
+
settingSources: ["user", "project", "local"],
|
|
17639
|
+
permissionMode: "bypassPermissions",
|
|
17640
|
+
allowDangerouslySkipPermissions: true,
|
|
17641
|
+
includePartialMessages: true,
|
|
17642
|
+
abortController: abort,
|
|
17643
|
+
env
|
|
17644
|
+
});
|
|
17645
|
+
}
|
|
17646
|
+
var isBuiltinMode = (params) => params.mode === "builtin";
|
|
17647
|
+
var deepseekSpec = {
|
|
17648
|
+
name: "deepseek",
|
|
17649
|
+
// Pre-check BEFORE startRun: API key must exist; resolve model into params (no registry pollution).
|
|
17650
|
+
async preflight(params) {
|
|
17651
|
+
const settings = await readSettings();
|
|
17652
|
+
const apiKey = await readDeepseekApiKey();
|
|
17653
|
+
if (!apiKey) {
|
|
17654
|
+
return {
|
|
17655
|
+
ok: false,
|
|
17656
|
+
status: 400,
|
|
17657
|
+
error: "DeepSeek API key is not configured. Open the DeepSeek picker in the chat header to set one."
|
|
17658
|
+
};
|
|
17594
17659
|
}
|
|
17595
|
-
|
|
17660
|
+
const requested = typeof params.model === "string" ? params.model : void 0;
|
|
17661
|
+
if (isBuiltinMode(params)) {
|
|
17662
|
+
const textCheck = requireTextPrompt(params);
|
|
17663
|
+
if (!textCheck.ok) return textCheck;
|
|
17664
|
+
params.model = resolveBuiltinModel(requested, settings.engines?.deepseek?.builtinModel);
|
|
17665
|
+
return { ok: true };
|
|
17666
|
+
}
|
|
17667
|
+
params.model = resolveModel(requested, settings.engines?.deepseek?.model);
|
|
17668
|
+
return { ok: true };
|
|
17669
|
+
},
|
|
17670
|
+
runner: {
|
|
17671
|
+
async run(ctx) {
|
|
17672
|
+
const apiKey = await readDeepseekApiKey();
|
|
17673
|
+
if (isBuiltinMode(ctx.params)) {
|
|
17674
|
+
await runBuiltinAgent(ctx, buildBuiltinConfig(apiKey));
|
|
17675
|
+
return;
|
|
17676
|
+
}
|
|
17677
|
+
const model = typeof ctx.params.model === "string" ? ctx.params.model : DEFAULT_MODEL;
|
|
17678
|
+
const env = buildDeepseekEnv(apiKey, model);
|
|
17679
|
+
await runSdkLoop(ctx, buildDeepseekOptions(ctx, env));
|
|
17680
|
+
},
|
|
17681
|
+
resolveTitle: (cwd, sessionId) => getSessionTitle(cwd, sessionId)
|
|
17682
|
+
}
|
|
17683
|
+
};
|
|
17684
|
+
|
|
17685
|
+
// packages/feature/agent/src/server/engines/ollama.ts
|
|
17686
|
+
var DEFAULT_MODEL2 = "qwen3.5:35b-a3b-coding-nvfp4";
|
|
17687
|
+
var OLLAMA_CONFIG = {
|
|
17688
|
+
sessionsRoot: getBuiltinSessionsRoot("ollama"),
|
|
17689
|
+
defaultModel: DEFAULT_MODEL2,
|
|
17690
|
+
createModel: (model) => createOllamaModel(model)
|
|
17691
|
+
};
|
|
17692
|
+
var ollamaSpec = {
|
|
17693
|
+
name: "ollama",
|
|
17694
|
+
async preflight(params) {
|
|
17695
|
+
return requireTextPrompt(params);
|
|
17696
|
+
},
|
|
17697
|
+
runner: {
|
|
17698
|
+
run: (ctx) => runBuiltinAgent(ctx, OLLAMA_CONFIG)
|
|
17699
|
+
// No resolveTitle → teardown uses 'unread' with undefined title.
|
|
17596
17700
|
}
|
|
17597
17701
|
};
|
|
17598
17702
|
|
|
@@ -17650,7 +17754,7 @@ var kimiSpec = {
|
|
|
17650
17754
|
const child = spawn2("kimi", args, {
|
|
17651
17755
|
stdio: ["ignore", "pipe", "pipe"],
|
|
17652
17756
|
cwd: cwd || void 0,
|
|
17653
|
-
env:
|
|
17757
|
+
env: sanitizedSpawnEnv()
|
|
17654
17758
|
});
|
|
17655
17759
|
ctx.signal.addEventListener("abort", () => child.kill("SIGTERM"), { once: true });
|
|
17656
17760
|
if (sessionId) {
|
|
@@ -17787,7 +17891,7 @@ var codexSpec = {
|
|
|
17787
17891
|
const child = spawn3("codex", args, {
|
|
17788
17892
|
stdio: ["ignore", "pipe", "pipe"],
|
|
17789
17893
|
cwd: cwd || void 0,
|
|
17790
|
-
env:
|
|
17894
|
+
env: sanitizedSpawnEnv()
|
|
17791
17895
|
});
|
|
17792
17896
|
ctx.signal.addEventListener("abort", () => child.kill("SIGTERM"), { once: true });
|
|
17793
17897
|
const pendingToolCalls = /* @__PURE__ */ new Map();
|
|
@@ -17974,7 +18078,11 @@ var dispatchEngineMessageEff = (task, engine, startFresh) => Effect_exports.tryP
|
|
|
17974
18078
|
cwd: task.cwd,
|
|
17975
18079
|
engine,
|
|
17976
18080
|
// selects claude2's CLAUDE_CONFIG_DIR; no-op for the others
|
|
17977
|
-
...task.model && { model: task.model }
|
|
18081
|
+
...task.model && { model: task.model },
|
|
18082
|
+
// Execution mode is NOT snapshotted on the task — it is derived from where the
|
|
18083
|
+
// session actually lives, so a task made from a Built-in Agent tab keeps running
|
|
18084
|
+
// the built-in loop instead of silently switching backends mid-schedule.
|
|
18085
|
+
...isDeepseekBuiltinSession(engine, task) && { mode: "builtin" }
|
|
17978
18086
|
});
|
|
17979
18087
|
if (!outcome.ok) {
|
|
17980
18088
|
throw new Error(`${engine} dispatch rejected (${outcome.status}): ${outcome.error}`);
|
|
@@ -18008,9 +18116,13 @@ var dispatchEngineMessageEff = (task, engine, startFresh) => Effect_exports.tryP
|
|
|
18008
18116
|
cause
|
|
18009
18117
|
})
|
|
18010
18118
|
});
|
|
18119
|
+
function isDeepseekBuiltinSession(engine, task) {
|
|
18120
|
+
return engine === "deepseek" && existsSync3(getDeepseekBuiltinSessionPath(task.cwd, task.sessionId));
|
|
18121
|
+
}
|
|
18011
18122
|
function sessionPathFor(engine, task) {
|
|
18012
18123
|
if (engine === "claude2") return getClaude2SessionPath(task.cwd, task.sessionId);
|
|
18013
18124
|
if (engine === "ollama") return getOllamaSessionPath(task.cwd, task.sessionId);
|
|
18125
|
+
if (isDeepseekBuiltinSession(engine, task)) return getDeepseekBuiltinSessionPath(task.cwd, task.sessionId);
|
|
18014
18126
|
if (engine === "deepseek") return getDeepseekSessionPath(task.cwd, task.sessionId);
|
|
18015
18127
|
if (engine === "codex") return findCodexSessionPath(task.sessionId);
|
|
18016
18128
|
if (engine === "kimi") return findKimiSessionPath(task.sessionId);
|