mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-19 10:02:04 +08:00
Merge branch 'main' into session/agent_f767ec1f-7980-4b5e-b27d-74befa652e5e
This commit is contained in:
@@ -4,3 +4,4 @@
|
||||
|
||||
# Visual regression baseline snapshots
|
||||
packages/kilo-ui/tests/**/*.png filter=lfs diff=lfs merge=lfs -text
|
||||
packages/kilo-vscode/tests/**/*.png filter=lfs diff=lfs merge=lfs -text
|
||||
|
||||
@@ -7,6 +7,9 @@ on:
|
||||
- "packages/ui/**"
|
||||
- "packages/util/**"
|
||||
- "packages/sdk/js/**"
|
||||
- "packages/kilo-vscode/webview-ui/**"
|
||||
- "packages/kilo-vscode/.storybook/**"
|
||||
- "packages/kilo-vscode/tests/visual-regression*"
|
||||
- ".github/workflows/visual-regression.yml"
|
||||
|
||||
jobs:
|
||||
@@ -101,3 +104,95 @@ jobs:
|
||||
name: visual-regression-results
|
||||
path: packages/kilo-ui/test-results/
|
||||
retention-days: 7
|
||||
|
||||
visual-regression-vscode:
|
||||
name: Visual Regression (kilo-vscode webview)
|
||||
runs-on: blacksmith-4vcpu-ubuntu-2404
|
||||
timeout-minutes: 15
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
lfs: true
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
ref: ${{ github.head_ref }}
|
||||
|
||||
- name: Setup Bun
|
||||
uses: oven-sh/setup-bun@v2
|
||||
with:
|
||||
bun-version: latest
|
||||
|
||||
- name: Cache Bun modules
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.bun/install/cache
|
||||
key: bun-${{ hashFiles('bun.lock') }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: bun install
|
||||
|
||||
- name: Cache Playwright browsers
|
||||
id: playwright-cache-vscode
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ~/.cache/ms-playwright
|
||||
key: playwright-vscode-${{ hashFiles('packages/kilo-vscode/package.json') }}
|
||||
|
||||
- name: Install Playwright browsers
|
||||
if: steps.playwright-cache-vscode.outputs.cache-hit != 'true'
|
||||
run: bunx playwright install chromium
|
||||
working-directory: packages/kilo-vscode
|
||||
|
||||
- name: Install Playwright system deps
|
||||
run: bunx playwright install-deps chromium
|
||||
working-directory: packages/kilo-vscode
|
||||
|
||||
- name: Cache Storybook build
|
||||
id: storybook-cache-vscode
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: packages/kilo-vscode/storybook-static
|
||||
key: storybook-vscode-${{ hashFiles('packages/kilo-vscode/webview-ui/src/**', 'packages/kilo-vscode/.storybook/**', 'packages/kilo-ui/src/**', 'packages/ui/src/**', 'packages/kilo-vscode/package.json') }}
|
||||
|
||||
- name: Build Storybook
|
||||
if: steps.storybook-cache-vscode.outputs.cache-hit != 'true'
|
||||
run: bun run build-storybook
|
||||
working-directory: packages/kilo-vscode
|
||||
|
||||
- name: Generate baselines for new/missing stories
|
||||
run: bun run test:visual:update
|
||||
working-directory: packages/kilo-vscode
|
||||
env:
|
||||
CI: true
|
||||
PLAYWRIGHT_WORKERS: "4"
|
||||
|
||||
- name: Commit and push new baselines (if any)
|
||||
id: commit-baselines-vscode
|
||||
run: |
|
||||
git config user.name "github-actions[bot]"
|
||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git add packages/kilo-vscode/tests/visual-regression.spec.ts-snapshots/
|
||||
if git diff --cached --quiet; then
|
||||
echo "No new baselines — nothing to commit."
|
||||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
git commit -m "chore: update kilo-vscode visual regression baselines"
|
||||
git lfs push --all origin
|
||||
git push
|
||||
echo "changed=true" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
- name: Fail if baselines changed
|
||||
if: steps.commit-baselines-vscode.outputs.changed == 'true'
|
||||
run: |
|
||||
echo "::error::Visual regression baselines changed. New baselines have been committed to the branch. Please pull and review."
|
||||
exit 1
|
||||
|
||||
- name: Upload test results on failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: visual-regression-vscode-results
|
||||
path: packages/kilo-vscode/test-results/
|
||||
retention-days: 7
|
||||
|
||||
@@ -55,6 +55,16 @@ npx @kilocode/cli
|
||||
|
||||
Then run `kilo` in any project directory to start.
|
||||
|
||||
<!-- kilocode_change start -->
|
||||
### npm Install Note: Hidden `.kilo` File
|
||||
|
||||
On some systems and npm versions, installing `@kilocode/cli` can create a hidden `.kilo` file near the installed `kilo` command (for example in a global npm bin directory). This file is an npm-generated launcher helper, not project data.
|
||||
|
||||
- Why it exists: npm may create helper artifacts while wiring CLI executables.
|
||||
- Size caveat: size can vary by platform, npm version, and install mode (symlink vs copied launcher), so a strict fixed size is not guaranteed.
|
||||
- Safety: it is safe to leave in place. Do not edit it manually. Use your package manager's uninstall (`npm uninstall -g @kilocode/cli`) to remove install artifacts cleanly.
|
||||
<!-- kilocode_change end -->
|
||||
|
||||
### Autonomous Mode (CI/CD)
|
||||
|
||||
Use the `--auto` flag with `kilo run` to enable fully autonomous operation without user interaction. This is ideal for CI/CD pipelines and automated workflows:
|
||||
@@ -70,6 +80,8 @@ kilo run --auto "run tests and fix any failures"
|
||||
We welcome contributions from developers, writers, and enthusiasts!
|
||||
To get started, please read our [Contributing Guide](/CONTRIBUTING.md). It includes details on setting up your environment, coding standards, types of contribution and how to submit pull requests.
|
||||
|
||||
See [RELEASING.md](RELEASING.md) for the release process.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
Our community is built on respect, inclusivity, and collaboration. Please review our [Code of Conduct](/CODE_OF_CONDUCT.md) to understand the expectations for all contributors and community members.
|
||||
|
||||
+118
@@ -0,0 +1,118 @@
|
||||
# Releasing Kilo Code
|
||||
|
||||
Kilo Code uses a fully automated CI pipeline triggered via GitHub Actions `workflow_dispatch`. A single workflow handles version bumping, building all artifacts, publishing to every distribution channel, and updating package registries.
|
||||
|
||||
## How to Trigger a Release
|
||||
|
||||
1. Go to the [`publish` workflow](https://github.com/Kilo-Org/kilocode/actions/workflows/publish.yml) in GitHub Actions.
|
||||
2. Click **"Run workflow"**.
|
||||
3. Select the branch (typically `main`).
|
||||
4. Fill in the inputs:
|
||||
- **`bump`** (choice): `patch`, `minor`, or `major`. Determines how the version number is incremented.
|
||||
- **`version`** (string, optional): Override the version explicitly instead of using `bump`. Leave empty to use the bump-based calculation.
|
||||
|
||||
> **⚠️ Do not fill in `version` unless you have a specific reason to.**
|
||||
> The default behavior — leaving `version` empty and selecting a `bump` level — is almost always what you want. The automated bump logic computes the correct next version from the current state of the repo. Only use the `version` override for exceptional cases like skipping versions or publishing a pre-release (e.g. `1.5.0-beta.1`).
|
||||
|
||||
5. Click **"Run workflow"** to start the release.
|
||||
|
||||
## What Happens During a Release
|
||||
|
||||
The `publish.yml` workflow runs four jobs sequentially:
|
||||
|
||||
### 1. Version (`version`)
|
||||
|
||||
- Checks out the repo with full history (`fetch-depth: 0`).
|
||||
- Runs `script/version.ts` to compute the next version based on the `bump` or `version` input.
|
||||
- Generates release notes from the commit history since the last release.
|
||||
- Creates a **draft** GitHub Release with the computed tag (e.g. `v1.2.3`) and release notes.
|
||||
- Outputs the `version`, `release` (database ID), and `tag` for downstream jobs.
|
||||
|
||||
### 2. Build CLI (`build-cli`)
|
||||
|
||||
- Runs `packages/opencode/script/build.ts` to compile the Kilo CLI binary.
|
||||
- Builds native binaries for **all supported platforms and architectures**:
|
||||
- Linux: x64, arm64 (glibc and musl), plus baseline (non-AVX2) variants
|
||||
- macOS: x64, arm64, plus baseline variants
|
||||
- Windows: x64, plus baseline variant
|
||||
- Patches ELF interpreters on Linux binaries for broad compatibility.
|
||||
- Creates platform archives (`.tar.gz` for Linux, `.zip` for macOS/Windows) and uploads them to the draft GitHub Release.
|
||||
- Uploads the `dist/` directory as a workflow artifact (`kilo-cli`) for subsequent jobs.
|
||||
|
||||
### 3. Build VS Code Extension (`build-vscode`)
|
||||
|
||||
- Downloads the CLI artifacts from the previous job.
|
||||
- Runs `packages/kilo-vscode/script/build.ts` to build VSIX packages for all target platforms:
|
||||
- `linux-x64`, `linux-arm64`, `alpine-x64`, `alpine-arm64`, `darwin-x64`, `darwin-arm64`, `win32-x64`
|
||||
- Each VSIX bundles the platform-specific CLI binary.
|
||||
- Uploads the VSIX files as a workflow artifact (`kilo-vscode`).
|
||||
|
||||
### 4. Publish (`publish`)
|
||||
|
||||
Downloads all build artifacts and publishes to every distribution channel:
|
||||
|
||||
#### Version Commit and Tagging
|
||||
|
||||
- Updates the `version` field in all `package.json` files across the monorepo.
|
||||
- Updates the Zed extension manifest (`extension.toml`) with the new version.
|
||||
- Rebuilds the TypeScript SDK (`packages/sdk/js`).
|
||||
- Commits the version bump, tags the commit, and pushes to the repo.
|
||||
- Promotes the draft GitHub Release to a published release.
|
||||
|
||||
#### CLI (`@kilocode/cli`)
|
||||
|
||||
- Publishes platform-specific binary packages to **npm** (e.g. `@kilocode/cli-linux-x64`, `@kilocode/cli-darwin-arm64`, etc.).
|
||||
- Publishes the main `@kilocode/cli` package to **npm** with optional dependencies on the binary packages.
|
||||
- Builds and pushes a multi-arch **Docker image** (`ghcr.io/kilo-org/kilo`) to GitHub Container Registry (linux/amd64 + linux/arm64).
|
||||
|
||||
#### SDK (`@kilocode/sdk`)
|
||||
|
||||
- Builds and publishes the TypeScript SDK to **npm**.
|
||||
|
||||
#### Plugin (`@kilocode/plugin`)
|
||||
|
||||
- Builds and publishes the plugin interface package to **npm**.
|
||||
|
||||
#### VS Code Extension
|
||||
|
||||
- Publishes platform-specific VSIX packages to the **VS Code Marketplace** via `vsce`.
|
||||
- Uploads all VSIX files to the **GitHub Release** as assets.
|
||||
|
||||
#### Package Registries (stable releases only)
|
||||
|
||||
- **AUR (Arch Linux)**: Clones `kilo-bin` from the AUR, updates the `PKGBUILD` with new version and SHA256 checksums, and pushes.
|
||||
- **Homebrew**: Clones `Kilo-Org/homebrew-tap`, updates the `kilo.rb` formula with new version, download URLs, and SHA256 checksums, and pushes.
|
||||
|
||||
## Prerequisites and Permissions
|
||||
|
||||
### Repository Access
|
||||
|
||||
- The workflow only runs in the `Kilo-Org/kilocode` repository (guarded by `if: github.repository == 'Kilo-Org/kilocode'`).
|
||||
- You must have **write access** to the repository to trigger a `workflow_dispatch` event.
|
||||
|
||||
### Workflow Permissions
|
||||
|
||||
The workflow requires these GitHub token permissions:
|
||||
|
||||
- `id-token: write` -- for npm provenance attestation
|
||||
- `contents: write` -- for creating releases, pushing tags, and uploading assets
|
||||
- `packages: write` -- for publishing Docker images to GHCR
|
||||
|
||||
### Required Secrets
|
||||
|
||||
The following secrets must be configured in the repository:
|
||||
|
||||
| Secret | Purpose |
|
||||
| ---------------------------- | ---------------------------------------------------------------- |
|
||||
| `KILO_API_KEY` | Kilo API key used during version computation |
|
||||
| `KILO_ORG_ID` | Kilo organization ID |
|
||||
| `KILO_MAINTAINER_APP_ID` | GitHub App ID for the kilo-maintainer bot (used for git commits) |
|
||||
| `KILO_MAINTAINER_APP_SECRET` | GitHub App secret for the kilo-maintainer bot |
|
||||
| `NPM_TOKEN` | npm authentication token for publishing packages |
|
||||
| `VSCE_TOKEN` | VS Code Marketplace personal access token |
|
||||
| `OVSX_TOKEN` | Open VSX Registry token (currently unused but configured) |
|
||||
| `AUR_KEY` | SSH private key for pushing to the AUR |
|
||||
|
||||
### Concurrency
|
||||
|
||||
The workflow uses concurrency control (`workflow-ref-bump/version`) to prevent parallel releases from conflicting.
|
||||
@@ -25,7 +25,7 @@
|
||||
},
|
||||
"packages/app": {
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@kilocode/kilo-i18n": "workspace:*",
|
||||
"@kilocode/kilo-ui": "workspace:*",
|
||||
@@ -77,7 +77,7 @@
|
||||
},
|
||||
"packages/desktop": {
|
||||
"name": "@opencode-ai/desktop",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@opencode-ai/app": "workspace:*",
|
||||
"@opencode-ai/ui": "workspace:*",
|
||||
@@ -110,7 +110,7 @@
|
||||
},
|
||||
"packages/kilo-docs": {
|
||||
"name": "@kilocode/kilo-docs",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@docsearch/css": "^4",
|
||||
"@docsearch/js": "^4",
|
||||
@@ -139,7 +139,7 @@
|
||||
},
|
||||
"packages/kilo-gateway": {
|
||||
"name": "@kilocode/kilo-gateway",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@clack/prompts": "1.0.0-alpha.1",
|
||||
"@kilocode/plugin": "workspace:*",
|
||||
@@ -171,7 +171,7 @@
|
||||
},
|
||||
"packages/kilo-i18n": {
|
||||
"name": "@kilocode/kilo-i18n",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"devDependencies": {
|
||||
"@tsconfig/node22": "catalog:",
|
||||
"@types/bun": "catalog:",
|
||||
@@ -181,7 +181,7 @@
|
||||
},
|
||||
"packages/kilo-telemetry": {
|
||||
"name": "@kilocode/kilo-telemetry",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@kilocode/kilo-gateway": "workspace:*",
|
||||
"@opentelemetry/api": "1.9.0",
|
||||
@@ -201,7 +201,7 @@
|
||||
},
|
||||
"packages/kilo-ui": {
|
||||
"name": "@kilocode/kilo-ui",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@kobalte/core": "0.13.11",
|
||||
"lucide-solid": "0.576.0",
|
||||
@@ -226,7 +226,7 @@
|
||||
},
|
||||
"packages/kilo-vscode": {
|
||||
"name": "kilo-code",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@anthropic-ai/sdk": "^0.39.0",
|
||||
"@kilocode/kilo-i18n": "workspace:*",
|
||||
@@ -249,6 +249,8 @@
|
||||
"zod": "^3.24.2",
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.58.2",
|
||||
"@storybook/addon-docs": "10.2.10",
|
||||
"@types/diff": "^6.0.0",
|
||||
"@types/mocha": "^10.0.10",
|
||||
"@types/node": "22.x",
|
||||
@@ -263,14 +265,18 @@
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"prettier": "^3.8.1",
|
||||
"qrcode": "^1.5.4",
|
||||
"storybook": "10.2.10",
|
||||
"storybook-solidjs-vite": "10.0.9",
|
||||
"ts-morph": "27.0.2",
|
||||
"typescript": "^5.9.3",
|
||||
"typescript-eslint": "^8.54.0",
|
||||
"vite": "7.3.1",
|
||||
"vite-plugin-solid": "2.11.10",
|
||||
},
|
||||
},
|
||||
"packages/opencode": {
|
||||
"name": "@kilocode/cli",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"bin": {
|
||||
"opencode": "./bin/opencode",
|
||||
},
|
||||
@@ -387,7 +393,7 @@
|
||||
},
|
||||
"packages/plugin": {
|
||||
"name": "@kilocode/plugin",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@kilocode/sdk": "workspace:*",
|
||||
"zod": "catalog:",
|
||||
@@ -401,14 +407,14 @@
|
||||
},
|
||||
"packages/script": {
|
||||
"name": "@opencode-ai/script",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"devDependencies": {
|
||||
"@types/bun": "catalog:",
|
||||
},
|
||||
},
|
||||
"packages/sdk/js": {
|
||||
"name": "@kilocode/sdk",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"devDependencies": {
|
||||
"@hey-api/openapi-ts": "0.90.10",
|
||||
"@tsconfig/node22": "catalog:",
|
||||
@@ -419,7 +425,7 @@
|
||||
},
|
||||
"packages/ui": {
|
||||
"name": "@opencode-ai/ui",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"@kilocode/sdk": "workspace:*",
|
||||
"@kobalte/core": "catalog:",
|
||||
@@ -461,7 +467,7 @@
|
||||
},
|
||||
"packages/util": {
|
||||
"name": "@opencode-ai/util",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {
|
||||
"zod": "catalog:",
|
||||
},
|
||||
|
||||
+4
-4
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"nodeModules": {
|
||||
"x86_64-linux": "sha256-NrbWpaXEMxKRZVMwSfn0Zt/iJ+/rAgdkeu8saQtPJWg=",
|
||||
"aarch64-linux": "sha256-qwV7BBySUF2NpgFpPrYUAyEcOKOEHu0Su9HiDIoGlYk=",
|
||||
"aarch64-darwin": "sha256-eHGuncX+swJvE3UNKCl6yy9AeWHMkpZK209oEsCOjnc=",
|
||||
"x86_64-darwin": "sha256-jMqI1kJ/QVzPaOO8cVmm5dh5MFYSJ7YMkyAifgBO9KA="
|
||||
"x86_64-linux": "sha256-7YoMJRkLfE+49GuItkoTLj1nk8CxLAHGIdRtH2L5n4w=",
|
||||
"aarch64-linux": "sha256-A+JUa7PI+ICd1+xCzQM11zZQMzsOWYFwULTo7sk4t5Q=",
|
||||
"aarch64-darwin": "sha256-Pbh4id/Crsy6s6J2s7QlbDnUwtsdUXGjt+K5qz7o1mU=",
|
||||
"x86_64-darwin": "sha256-hSdwk2LNlSr25p4YKb5Yh4K3L0CazFQ+SOXIfFY0jCY="
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -107,6 +107,6 @@
|
||||
"@openrouter/ai-sdk-provider@1.5.4": "patches/@openrouter%2Fai-sdk-provider@1.5.4.patch",
|
||||
"ghostty-web@0.3.0": "patches/ghostty-web@0.3.0.patch"
|
||||
},
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"peerDependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@opencode-ai/app",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"description": "",
|
||||
"type": "module",
|
||||
"exports": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@opencode-ai/desktop",
|
||||
"private": true,
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"scripts": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
id = "kilo"
|
||||
name = "Kilo"
|
||||
description = "The open source coding agent."
|
||||
version = "7.0.36"
|
||||
version = "7.0.37"
|
||||
schema_version = 1
|
||||
authors = ["Anomaly"]
|
||||
repository = "https://github.com/Kilo-Org/kilocode"
|
||||
@@ -11,26 +11,26 @@ name = "Kilo"
|
||||
icon = "./icons/opencode.svg"
|
||||
|
||||
[agent_servers.opencode.targets.darwin-aarch64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-darwin-arm64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-darwin-arm64.zip"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.darwin-x86_64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-darwin-x64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-darwin-x64.zip"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.linux-aarch64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-linux-arm64.tar.gz"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-linux-arm64.tar.gz"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.linux-x86_64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-linux-x64.tar.gz"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-linux-x64.tar.gz"
|
||||
cmd = "./opencode"
|
||||
args = ["acp"]
|
||||
|
||||
[agent_servers.opencode.targets.windows-x86_64]
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.36/opencode-windows-x64.zip"
|
||||
archive = "https://github.com/Kilo-Org/kilocode/releases/download/v7.0.37/opencode-windows-x64.zip"
|
||||
cmd = "./opencode.exe"
|
||||
args = ["acp"]
|
||||
|
||||
@@ -529,12 +529,12 @@ export function TopNav({ onMobileMenuToggle, isMobileMenuOpen = false, showMobil
|
||||
}
|
||||
|
||||
.announcement-banner {
|
||||
background: #1a1a18;
|
||||
color: #a3a3a2;
|
||||
background: var(--bg-secondary);
|
||||
color: var(--text-color);
|
||||
padding: 0.5rem 1rem;
|
||||
text-align: center;
|
||||
font-size: 0.875rem;
|
||||
border-bottom: 1px solid #3f3f3f;
|
||||
border-bottom: 1px solid var(--border-color);
|
||||
}
|
||||
|
||||
.announcement-banner p {
|
||||
@@ -542,13 +542,13 @@ export function TopNav({ onMobileMenuToggle, isMobileMenuOpen = false, showMobil
|
||||
}
|
||||
|
||||
.announcement-banner :global(a) {
|
||||
color: #f8f674;
|
||||
color: var(--accent-color);
|
||||
text-decoration: underline;
|
||||
text-underline-offset: 2px;
|
||||
}
|
||||
|
||||
.announcement-banner :global(a:hover) {
|
||||
color: #ffff8d;
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kilocode/kilo-docs",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "next dev --webpack --port 3002",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-gateway",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Unified Kilo Gateway package for OpenCode - authentication, provider, and API integration",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-i18n",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Kilo-specific i18n translations and overrides",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/kilo-telemetry",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"description": "Telemetry for Kilo CLI - PostHog analytics integration",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@kilocode/kilo-ui",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"exports": {
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
[data-slot="text-part-copy-wrapper"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
[data-slot="text-part-copy-wrapper"][data-is-turn-copy] {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
/* Prevent long title/path from hiding the collapsible expand arrow */
|
||||
|
||||
+2
-2
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3
|
||||
size 29215
|
||||
oid sha256:1de30d219cd299acf26c9fe473c00f18cf057297db2e9b1ae44fb3116b0392f0
|
||||
size 31305
|
||||
|
||||
+2
-2
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6c67c7cc21cd458c632228bdcee310615fae82c6d4c76e4d1170fa00224a9ac3
|
||||
size 29215
|
||||
oid sha256:1de30d219cd299acf26c9fe473c00f18cf057297db2e9b1ae44fb3116b0392f0
|
||||
size 31305
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
bin/
|
||||
out/
|
||||
.vscode-test/
|
||||
.vscode-test/
|
||||
storybook-static/
|
||||
test-results/
|
||||
@@ -0,0 +1,27 @@
|
||||
import type { StorybookConfig } from "storybook-solidjs-vite"
|
||||
import { mergeConfig } from "vite"
|
||||
import solidPlugin from "vite-plugin-solid"
|
||||
|
||||
const config: StorybookConfig = {
|
||||
framework: "storybook-solidjs-vite",
|
||||
stories: ["../webview-ui/src/stories/**/*.stories.@(ts|tsx)"],
|
||||
addons: ["@storybook/addon-docs"],
|
||||
refs: {},
|
||||
viteFinal: async (config) => {
|
||||
return mergeConfig(config, {
|
||||
plugins: [solidPlugin()],
|
||||
resolve: {
|
||||
conditions: ["browser", "solid", "module", "import"],
|
||||
},
|
||||
esbuild: {
|
||||
jsxImportSource: "solid-js",
|
||||
jsx: "automatic",
|
||||
},
|
||||
worker: {
|
||||
format: "es",
|
||||
},
|
||||
})
|
||||
},
|
||||
}
|
||||
|
||||
export default config
|
||||
@@ -0,0 +1,84 @@
|
||||
/** @jsxImportSource solid-js */
|
||||
import type { Preview, SolidRenderer } from "storybook-solidjs-vite"
|
||||
import type { DecoratorFunction } from "storybook/internal/types"
|
||||
// Reference kilo-ui stories helpers directly — not exported via package.json
|
||||
import { applyKiloTheme, applyVscodeTheme, clearVscodeTheme } from "../../kilo-ui/src/stories/theme-decorator"
|
||||
import "../../kilo-ui/.storybook/fonts.css"
|
||||
import "@kilocode/kilo-ui/styles"
|
||||
import "../webview-ui/src/styles/chat.css"
|
||||
|
||||
const themeDecorator: DecoratorFunction<SolidRenderer> = (Story, context) => {
|
||||
const themeId = (context.globals["theme"] as string) ?? "kilo-vscode"
|
||||
const vscodeThemeId = (context.globals["vscodeTheme"] as string) ?? "dark-modern"
|
||||
|
||||
const colorScheme = (() => {
|
||||
if (themeId === "kilo-vscode") return applyVscodeTheme(vscodeThemeId)
|
||||
clearVscodeTheme()
|
||||
return (context.globals["colorScheme"] as "light" | "dark") ?? "dark"
|
||||
})()
|
||||
|
||||
applyKiloTheme(themeId, colorScheme)
|
||||
document.body.style.background = "var(--background-base)"
|
||||
document.body.style.color = "var(--text-base)"
|
||||
return Story()
|
||||
}
|
||||
|
||||
const preview: Preview = {
|
||||
parameters: {
|
||||
controls: {
|
||||
matchers: {
|
||||
color: /(background|color)$/i,
|
||||
date: /Date$/i,
|
||||
},
|
||||
},
|
||||
layout: "fullscreen",
|
||||
},
|
||||
decorators: [themeDecorator],
|
||||
globalTypes: {
|
||||
theme: {
|
||||
description: "Theme",
|
||||
toolbar: {
|
||||
title: "Theme",
|
||||
icon: "paintbrush",
|
||||
items: [
|
||||
{ value: "kilo-vscode", title: "Kilo VSCode" },
|
||||
{ value: "kilo", title: "Kilo" },
|
||||
],
|
||||
dynamicTitle: true,
|
||||
},
|
||||
},
|
||||
colorScheme: {
|
||||
description: "Color Scheme",
|
||||
toolbar: {
|
||||
title: "Color Scheme",
|
||||
icon: "circlehollow",
|
||||
items: [
|
||||
{ value: "dark", title: "Dark", icon: "moon" },
|
||||
{ value: "light", title: "Light", icon: "sun" },
|
||||
],
|
||||
dynamicTitle: true,
|
||||
},
|
||||
},
|
||||
vscodeTheme: {
|
||||
description: "VSCode Theme",
|
||||
toolbar: {
|
||||
title: "VSCode Theme",
|
||||
icon: "browser",
|
||||
items: [
|
||||
{ value: "dark-modern", title: "Dark Modern (default)" },
|
||||
{ value: "dark-plus", title: "Dark+" },
|
||||
{ value: "light-modern", title: "Light Modern" },
|
||||
{ value: "hc-black", title: "High Contrast" },
|
||||
],
|
||||
dynamicTitle: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
initialGlobals: {
|
||||
theme: "kilo-vscode",
|
||||
colorScheme: "dark",
|
||||
vscodeTheme: "dark-modern",
|
||||
},
|
||||
}
|
||||
|
||||
export default preview
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"extends": "../webview-ui/tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"jsx": "preserve",
|
||||
"jsxImportSource": "solid-js"
|
||||
},
|
||||
"include": ["./**/*", "../webview-ui/src/**/*"]
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
"name": "kilo-code",
|
||||
"displayName": "Kilo Code: AI Coding Agent, Copilot, and Autocomplete",
|
||||
"description": "Open Source AI coding agent that generates code from natural language, automates tasks, and runs terminal commands. Features inline autocomplete, browser automation, automated refactoring, and custom modes for planning, coding, and debugging. Supports 500+ AI models including Claude (Anthropic), Gemini, Grok, GPT, Codex and GLM.",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"icon": "assets/icons/logo-outline-black.png",
|
||||
"galleryBanner": {
|
||||
"color": "#FFFFFF",
|
||||
@@ -110,6 +110,11 @@
|
||||
"dark": "assets/icons/kilo-dark.svg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"command": "kilo-code.new.openMigrationWizard",
|
||||
"title": "Migrate Settings from Legacy Version",
|
||||
"category": "Kilo Code"
|
||||
},
|
||||
{
|
||||
"command": "kilo-code.new.autocomplete.generateSuggestions",
|
||||
"title": "Generate Suggested Edits",
|
||||
@@ -672,9 +677,15 @@
|
||||
"lint": "eslint src",
|
||||
"test": "vscode-test",
|
||||
"test:unit": "bun test tests/unit/",
|
||||
"rebuild-sdk": "bun run --cwd ../sdk/js build"
|
||||
"rebuild-sdk": "bun run --cwd ../sdk/js build",
|
||||
"storybook": "storybook dev -p 6007",
|
||||
"build-storybook": "storybook build -o storybook-static",
|
||||
"test:visual": "playwright test",
|
||||
"test:visual:update": "playwright test --update-snapshots"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@playwright/test": "1.58.2",
|
||||
"@storybook/addon-docs": "10.2.10",
|
||||
"@types/diff": "^6.0.0",
|
||||
"@types/mocha": "^10.0.10",
|
||||
"@types/node": "22.x",
|
||||
@@ -688,9 +699,13 @@
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"prettier": "^3.8.1",
|
||||
"qrcode": "^1.5.4",
|
||||
"storybook": "10.2.10",
|
||||
"storybook-solidjs-vite": "10.0.9",
|
||||
"ts-morph": "27.0.2",
|
||||
"typescript": "^5.9.3",
|
||||
"typescript-eslint": "^8.54.0",
|
||||
"vite": "7.3.1",
|
||||
"vite-plugin-solid": "2.11.10",
|
||||
"@vscode/vsce": "^3.7.1"
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
import { defineConfig, devices } from "@playwright/test"
|
||||
|
||||
export default defineConfig({
|
||||
testDir: "./tests",
|
||||
testMatch: "**/*.spec.ts",
|
||||
fullyParallel: true,
|
||||
forbidOnly: !!process.env["CI"],
|
||||
retries: process.env["CI"] ? 1 : 0,
|
||||
workers: process.env["PLAYWRIGHT_WORKERS"]
|
||||
? Number.parseInt(process.env["PLAYWRIGHT_WORKERS"]!, 10) || undefined
|
||||
: undefined,
|
||||
reporter: [["html", { open: "never" }], ["list"]],
|
||||
use: {
|
||||
baseURL: "http://localhost:6007",
|
||||
// VS Code sidebar is typically 350-450px wide
|
||||
viewport: { width: 420, height: 720 },
|
||||
reducedMotion: "reduce",
|
||||
screenshot: "only-on-failure",
|
||||
},
|
||||
projects: [
|
||||
{
|
||||
name: "chromium",
|
||||
use: { ...devices["Desktop Chrome"], viewport: { width: 420, height: 720 } },
|
||||
},
|
||||
],
|
||||
webServer: {
|
||||
command:
|
||||
"bunx storybook build -o ./storybook-static && bunx http-server ./storybook-static -p 6007 --silent",
|
||||
url: "http://localhost:6007",
|
||||
reuseExistingServer: !process.env["CI"],
|
||||
timeout: 300_000,
|
||||
},
|
||||
timeout: 60_000,
|
||||
expect: {
|
||||
timeout: 10_000,
|
||||
toHaveScreenshot: {
|
||||
maxDiffPixelRatio: 0.01,
|
||||
},
|
||||
},
|
||||
})
|
||||
@@ -17,6 +17,9 @@ import { handleChatCompletionRequest } from "./services/autocomplete/chat-autoco
|
||||
import { handleChatCompletionAccepted } from "./services/autocomplete/chat-autocomplete/handleChatCompletionAccepted"
|
||||
import { buildWebviewHtml } from "./utils"
|
||||
import { TelemetryProxy, type TelemetryPropertiesProvider } from "./services/telemetry"
|
||||
// legacy-migration start
|
||||
import * as MigrationService from "./legacy-migration/migration-service"
|
||||
// legacy-migration end
|
||||
import {
|
||||
sessionToWebview,
|
||||
indexProvidersById,
|
||||
@@ -62,6 +65,10 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
|
||||
private pendingSessionRefresh = false
|
||||
private unsubscribeEvent: (() => void) | null = null
|
||||
private unsubscribeState: (() => void) | null = null
|
||||
/** Cached legacy migration data so migrate() doesn't re-read from disk/SecretStorage. */ // legacy-migration
|
||||
private cachedLegacyData: import("./legacy-migration/legacy-types").LegacyMigrationData | null = null // legacy-migration
|
||||
/** Guard to prevent checkAndShowMigrationWizard running concurrently. */ // legacy-migration
|
||||
private migrationCheckInFlight = false // legacy-migration
|
||||
private unsubscribeNotificationDismiss: (() => void) | null = null
|
||||
private webviewMessageDisposable: vscode.Disposable | null = null
|
||||
|
||||
@@ -157,6 +164,16 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
|
||||
data: profileData,
|
||||
})
|
||||
}
|
||||
|
||||
// legacy-migration start
|
||||
// Only show the migration wizard once the CLI connection is established so the
|
||||
// webview has finished loading providers/agents before we navigate to the wizard.
|
||||
if (reason === "webviewReady" && this.connectionState === "connected") {
|
||||
void this.checkAndShowMigrationWizard()
|
||||
} else if (reason === "sse-connected") {
|
||||
void this.checkAndShowMigrationWizard()
|
||||
}
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
public resolveWebviewView(
|
||||
@@ -515,6 +532,20 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
|
||||
this.postMessage({ type: "variantsLoaded", variants })
|
||||
break
|
||||
}
|
||||
// legacy-migration start
|
||||
case "requestLegacyMigrationData":
|
||||
void this.handleRequestLegacyMigrationData()
|
||||
break
|
||||
case "startLegacyMigration":
|
||||
void this.handleStartLegacyMigration(message.selections)
|
||||
break
|
||||
case "skipLegacyMigration":
|
||||
void this.handleSkipLegacyMigration()
|
||||
break
|
||||
case "clearLegacyData":
|
||||
void this.handleClearLegacyData()
|
||||
break
|
||||
// legacy-migration end
|
||||
case "enhancePrompt": {
|
||||
const sdkClient = this.client
|
||||
if (!sdkClient) {
|
||||
@@ -1783,6 +1814,13 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
|
||||
return
|
||||
}
|
||||
|
||||
// Refresh provider and agent lists when the server signals a state disposal
|
||||
if (event.type === "server.instance.disposed" || event.type === "global.disposed") {
|
||||
void this.fetchAndSendProviders()
|
||||
void this.fetchAndSendAgents()
|
||||
return
|
||||
}
|
||||
|
||||
// Forward relevant events to webview
|
||||
// Side effects that must happen before the webview message is sent
|
||||
if (event.type === "session.created" && !this.currentSession) {
|
||||
@@ -1962,6 +2000,113 @@ export class KiloProvider implements vscode.WebviewViewProvider, TelemetryProper
|
||||
})
|
||||
}
|
||||
|
||||
// legacy-migration start -------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Checks for legacy data on first run and auto-navigates to the migration wizard
|
||||
* if the user has not yet been prompted.
|
||||
*/
|
||||
private async checkAndShowMigrationWizard(): Promise<void> {
|
||||
if (!this.extensionContext) return
|
||||
if (this.migrationCheckInFlight) return
|
||||
const status = MigrationService.getMigrationStatus(this.extensionContext)
|
||||
if (status) return // already prompted (skipped or completed)
|
||||
|
||||
this.migrationCheckInFlight = true
|
||||
const data = await MigrationService.detectLegacyData(this.extensionContext)
|
||||
this.migrationCheckInFlight = false
|
||||
|
||||
if (!data.hasData) return
|
||||
|
||||
// Cache so migrate() doesn't re-read from SecretStorage/disk
|
||||
this.cachedLegacyData = data
|
||||
|
||||
console.log("[Kilo New] KiloProvider: 🔄 Legacy data detected, showing migration wizard")
|
||||
this.postMessage({ type: "navigate", view: "migration" })
|
||||
this.postMessage({
|
||||
type: "legacyMigrationData",
|
||||
data: {
|
||||
providers: data.providers,
|
||||
mcpServers: data.mcpServers,
|
||||
customModes: data.customModes,
|
||||
defaultModel: data.defaultModel,
|
||||
settings: data.settings,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/** Sends the detected legacy data to the webview on explicit request. */
|
||||
private async handleRequestLegacyMigrationData(): Promise<void> {
|
||||
if (!this.extensionContext) return
|
||||
const data = await MigrationService.detectLegacyData(this.extensionContext)
|
||||
// Cache so migrate() doesn't re-read from SecretStorage/disk
|
||||
this.cachedLegacyData = data
|
||||
this.postMessage({
|
||||
type: "legacyMigrationData",
|
||||
data: {
|
||||
providers: data.providers,
|
||||
mcpServers: data.mcpServers,
|
||||
customModes: data.customModes,
|
||||
defaultModel: data.defaultModel,
|
||||
settings: data.settings,
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
/** Runs the migration for the selected items. */
|
||||
private async handleStartLegacyMigration(
|
||||
selections: import("./legacy-migration/legacy-types").MigrationSelections,
|
||||
): Promise<void> {
|
||||
if (!this.extensionContext || !this.client) return
|
||||
try {
|
||||
const results = await MigrationService.migrate(
|
||||
this.extensionContext,
|
||||
this.client,
|
||||
selections,
|
||||
(item, status, message) => {
|
||||
this.postMessage({ type: "legacyMigrationProgress", item, status, message })
|
||||
},
|
||||
this.cachedLegacyData?.settings,
|
||||
)
|
||||
// Only mark as completed if at least one item succeeded — if everything failed
|
||||
// the user can still re-run migration via Settings → About.
|
||||
const anySuccess = results.some((r) => r.status === "success")
|
||||
if (anySuccess) {
|
||||
await MigrationService.setMigrationStatus(this.extensionContext, "completed")
|
||||
}
|
||||
// Refresh providers so webview immediately sees the newly-migrated API keys
|
||||
await this.fetchAndSendProviders()
|
||||
this.postMessage({ type: "legacyMigrationComplete", results })
|
||||
} catch (error) {
|
||||
console.error("[Kilo New] KiloProvider: ❌ Migration failed", error)
|
||||
this.postMessage({
|
||||
type: "legacyMigrationComplete",
|
||||
results: [
|
||||
{
|
||||
item: "Migration",
|
||||
category: "settings",
|
||||
status: "error",
|
||||
message: error instanceof Error ? error.message : String(error),
|
||||
},
|
||||
],
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/** Records that the user skipped migration. */
|
||||
private async handleSkipLegacyMigration(): Promise<void> {
|
||||
if (!this.extensionContext) return
|
||||
await MigrationService.setMigrationStatus(this.extensionContext, "skipped")
|
||||
}
|
||||
|
||||
/** Clears legacy data from SecretStorage and globalState after user opts in. */
|
||||
private async handleClearLegacyData(): Promise<void> {
|
||||
if (!this.extensionContext) return
|
||||
await MigrationService.clearLegacyData(this.extensionContext)
|
||||
}
|
||||
|
||||
// legacy-migration end ---------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Dispose of the provider and clean up subscriptions.
|
||||
* Does NOT kill the server — that's the connection service's job.
|
||||
|
||||
@@ -70,6 +70,11 @@ export function activate(context: vscode.ExtensionContext) {
|
||||
vscode.commands.registerCommand("kilo-code.new.settingsButtonClicked", () => {
|
||||
provider.postMessage({ type: "action", action: "settingsButtonClicked" })
|
||||
}),
|
||||
// legacy-migration start
|
||||
vscode.commands.registerCommand("kilo-code.new.openMigrationWizard", () => {
|
||||
provider.postMessage({ type: "navigate", view: "migration" })
|
||||
}),
|
||||
// legacy-migration end
|
||||
vscode.commands.registerCommand("kilo-code.new.openInTab", () => {
|
||||
return openKiloInNewTab(context, connectionService)
|
||||
}),
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* legacy-migration - Barrel export.
|
||||
* Delete this entire directory when dropping legacy migration support.
|
||||
*/
|
||||
export * from "./legacy-types"
|
||||
export * from "./provider-mapping"
|
||||
export * from "./migration-messages"
|
||||
export * from "./migration-service"
|
||||
@@ -0,0 +1,312 @@
|
||||
/**
|
||||
* legacy-migration - Types for legacy Kilo Code extension (v5.x) data structures.
|
||||
*
|
||||
* These types represent the shapes stored in VS Code SecretStorage and on disk
|
||||
* by the legacy extension (kilocode.kilo-code v5.x, a Roo Code fork).
|
||||
* They are intentionally loose (allowing [key: string]: unknown) to tolerate
|
||||
* schema drift between legacy versions.
|
||||
*/
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Provider profiles (stored in SecretStorage under "roo_cline_config_api_config")
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface LegacyProviderProfiles {
|
||||
currentApiConfigName: string
|
||||
apiConfigs: Record<string, LegacyProviderSettings>
|
||||
modeApiConfigs?: Record<string, string>
|
||||
}
|
||||
|
||||
/**
|
||||
* Flat union of every provider-specific field from the legacy extension.
|
||||
* Only the fields we actually need for migration are explicitly typed;
|
||||
* the rest are captured by the index signature.
|
||||
*/
|
||||
export interface LegacyProviderSettings {
|
||||
id?: string
|
||||
apiProvider?: string
|
||||
apiModelId?: string
|
||||
|
||||
// Anthropic
|
||||
apiKey?: string
|
||||
anthropicBaseUrl?: string
|
||||
|
||||
// OpenRouter
|
||||
openRouterApiKey?: string
|
||||
openRouterModelId?: string
|
||||
openRouterBaseUrl?: string
|
||||
|
||||
// OpenAI (custom/compatible)
|
||||
openAiApiKey?: string
|
||||
openAiModelId?: string
|
||||
openAiBaseUrl?: string
|
||||
|
||||
// OpenAI Native
|
||||
openAiNativeApiKey?: string
|
||||
openAiNativeBaseUrl?: string
|
||||
|
||||
// Gemini
|
||||
geminiApiKey?: string
|
||||
googleGeminiBaseUrl?: string
|
||||
|
||||
// Vertex AI
|
||||
vertexJsonCredentials?: string
|
||||
vertexProjectId?: string
|
||||
vertexRegion?: string
|
||||
|
||||
// AWS Bedrock
|
||||
awsAccessKey?: string
|
||||
awsSecretKey?: string
|
||||
awsSessionToken?: string
|
||||
awsRegion?: string
|
||||
awsApiKey?: string
|
||||
|
||||
// DeepSeek
|
||||
deepSeekApiKey?: string
|
||||
deepSeekBaseUrl?: string
|
||||
|
||||
// Mistral
|
||||
mistralApiKey?: string
|
||||
|
||||
// Groq
|
||||
groqApiKey?: string
|
||||
|
||||
// xAI
|
||||
xaiApiKey?: string
|
||||
|
||||
// Fireworks
|
||||
fireworksApiKey?: string
|
||||
|
||||
// Featherless
|
||||
featherlessApiKey?: string
|
||||
|
||||
// Cerebras
|
||||
cerebrasApiKey?: string
|
||||
|
||||
// SambaNova
|
||||
sambaNovaApiKey?: string
|
||||
|
||||
// Ollama
|
||||
ollamaApiKey?: string
|
||||
ollamaBaseUrl?: string
|
||||
ollamaModelId?: string
|
||||
|
||||
// LM Studio
|
||||
lmStudioBaseUrl?: string
|
||||
lmStudioModelId?: string
|
||||
|
||||
// Kilocode
|
||||
kilocodeToken?: string
|
||||
kilocodeModel?: string
|
||||
kilocodeOrganizationId?: string
|
||||
|
||||
// LiteLLM
|
||||
litellmApiKey?: string
|
||||
litellmBaseUrl?: string
|
||||
litellmModelId?: string
|
||||
|
||||
// DeepInfra
|
||||
deepInfraApiKey?: string
|
||||
deepInfraBaseUrl?: string
|
||||
deepInfraModelId?: string
|
||||
|
||||
// Chutes
|
||||
chutesApiKey?: string
|
||||
|
||||
// Baseten
|
||||
basetenApiKey?: string
|
||||
|
||||
// Corethink
|
||||
corethinkApiKey?: string
|
||||
|
||||
// Unbound
|
||||
unboundApiKey?: string
|
||||
unboundModelId?: string
|
||||
|
||||
// Requesty
|
||||
requestyApiKey?: string
|
||||
requestyBaseUrl?: string
|
||||
requestyModelId?: string
|
||||
|
||||
// Hugging Face
|
||||
huggingFaceApiKey?: string
|
||||
huggingFaceModelId?: string
|
||||
|
||||
// IO Intelligence
|
||||
ioIntelligenceApiKey?: string
|
||||
ioIntelligenceModelId?: string
|
||||
|
||||
// Vercel AI Gateway
|
||||
vercelAiGatewayApiKey?: string
|
||||
vercelAiGatewayModelId?: string
|
||||
|
||||
// Z.ai
|
||||
zaiApiKey?: string
|
||||
|
||||
// Moonshot
|
||||
moonshotApiKey?: string
|
||||
moonshotBaseUrl?: string
|
||||
|
||||
// Doubao
|
||||
doubaoApiKey?: string
|
||||
doubaoBaseUrl?: string
|
||||
|
||||
// MiniMax
|
||||
minimaxApiKey?: string
|
||||
minimaxBaseUrl?: string
|
||||
|
||||
// OVHcloud
|
||||
ovhCloudAiEndpointsApiKey?: string
|
||||
ovhCloudAiEndpointsBaseUrl?: string
|
||||
ovhCloudAiEndpointsModelId?: string
|
||||
|
||||
// Inception Labs
|
||||
inceptionLabsApiKey?: string
|
||||
inceptionLabsBaseUrl?: string
|
||||
inceptionLabsModelId?: string
|
||||
|
||||
// SAP AI Core
|
||||
sapAiCoreServiceKey?: string
|
||||
|
||||
// Synthetic
|
||||
syntheticApiKey?: string
|
||||
|
||||
// Allow dynamic property access for provider-mapping lookups
|
||||
[key: string]: unknown
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// MCP settings (stored on disk at <globalStorage>/settings/mcp_settings.json)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface LegacyMcpSettings {
|
||||
mcpServers: Record<string, LegacyMcpServer>
|
||||
}
|
||||
|
||||
export interface LegacyMcpServer {
|
||||
type?: "stdio" | "sse" | "streamable-http"
|
||||
command?: string
|
||||
args?: string[]
|
||||
cwd?: string
|
||||
url?: string
|
||||
env?: Record<string, string>
|
||||
headers?: Record<string, string>
|
||||
disabled?: boolean
|
||||
timeout?: number
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Autocomplete settings (stored in globalState under "ghostServiceSettings")
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface LegacyAutocompleteSettings {
|
||||
enableAutoTrigger?: boolean
|
||||
enableSmartInlineTaskKeybinding?: boolean
|
||||
enableChatAutocomplete?: boolean
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Settings (stored in VS Code globalState under "kilo-code.*" keys)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface LegacySettings {
|
||||
autoApprovalEnabled?: boolean
|
||||
allowedCommands?: string[]
|
||||
deniedCommands?: string[]
|
||||
// Fine-grained auto-approval (legacy globalState keys — no prefix)
|
||||
alwaysAllowReadOnly?: boolean
|
||||
alwaysAllowReadOnlyOutsideWorkspace?: boolean
|
||||
alwaysAllowWrite?: boolean
|
||||
alwaysAllowExecute?: boolean
|
||||
alwaysAllowMcp?: boolean
|
||||
alwaysAllowModeSwitch?: boolean
|
||||
alwaysAllowSubtasks?: boolean
|
||||
language?: string
|
||||
autocomplete?: LegacyAutocompleteSettings
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Custom modes (stored on disk at <globalStorage>/settings/custom_modes.yaml)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface LegacyCustomModesFile {
|
||||
customModes: LegacyCustomMode[]
|
||||
}
|
||||
|
||||
export interface LegacyCustomMode {
|
||||
slug: string
|
||||
name: string
|
||||
roleDefinition: string
|
||||
customInstructions?: string
|
||||
whenToUse?: string
|
||||
description?: string
|
||||
groups: Array<string | [string, Record<string, string>]>
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Migration data shapes
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface MigrationProviderInfo {
|
||||
profileName: string
|
||||
provider: string
|
||||
model?: string
|
||||
hasApiKey: boolean
|
||||
supported: boolean
|
||||
newProviderName?: string
|
||||
}
|
||||
|
||||
export interface MigrationMcpServerInfo {
|
||||
name: string
|
||||
type: string
|
||||
}
|
||||
|
||||
export interface MigrationCustomModeInfo {
|
||||
name: string
|
||||
slug: string
|
||||
}
|
||||
|
||||
export interface LegacyMigrationData {
|
||||
providers: MigrationProviderInfo[]
|
||||
mcpServers: MigrationMcpServerInfo[]
|
||||
customModes: MigrationCustomModeInfo[]
|
||||
defaultModel?: { provider: string; model: string }
|
||||
settings?: LegacySettings
|
||||
hasData: boolean
|
||||
}
|
||||
|
||||
export interface MigrationAutoApprovalSelections {
|
||||
/** Master toggle + command allowlist/denylist */
|
||||
commandRules: boolean
|
||||
/** Read permission (alwaysAllowReadOnly / alwaysAllowReadOnlyOutsideWorkspace) */
|
||||
readPermission: boolean
|
||||
/** Write permission (alwaysAllowWrite) */
|
||||
writePermission: boolean
|
||||
/** Execute permission (alwaysAllowExecute) */
|
||||
executePermission: boolean
|
||||
/** MCP tool permission (alwaysAllowMcp) */
|
||||
mcpPermission: boolean
|
||||
/** Task/subtask permission (alwaysAllowModeSwitch / alwaysAllowSubtasks) */
|
||||
taskPermission: boolean
|
||||
}
|
||||
|
||||
export interface MigrationSettingsSelections {
|
||||
autoApproval: MigrationAutoApprovalSelections
|
||||
language: boolean
|
||||
autocomplete: boolean
|
||||
}
|
||||
|
||||
export interface MigrationSelections {
|
||||
providers: string[]
|
||||
mcpServers: string[]
|
||||
customModes: string[]
|
||||
defaultModel: boolean
|
||||
settings: MigrationSettingsSelections
|
||||
}
|
||||
|
||||
export interface MigrationResultItem {
|
||||
item: string
|
||||
category: "provider" | "mcpServer" | "customMode" | "defaultModel" | "settings"
|
||||
status: "success" | "warning" | "error"
|
||||
message?: string
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
/**
|
||||
* legacy-migration - Message type definitions for migration wizard communication.
|
||||
*
|
||||
* These types extend the extension ↔ webview message contract specifically for
|
||||
* the legacy migration wizard. They are defined here to keep them isolated from
|
||||
* the main messages.ts file and easy to remove.
|
||||
*/
|
||||
|
||||
import type {
|
||||
MigrationProviderInfo,
|
||||
MigrationMcpServerInfo,
|
||||
MigrationCustomModeInfo,
|
||||
MigrationSelections,
|
||||
MigrationResultItem,
|
||||
LegacySettings,
|
||||
} from "./legacy-types"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Extension → Webview
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/** Sends detected legacy data to the wizard for display in the selection step. */
|
||||
export interface LegacyMigrationDataMessage {
|
||||
type: "legacyMigrationData"
|
||||
data: {
|
||||
providers: MigrationProviderInfo[]
|
||||
mcpServers: MigrationMcpServerInfo[]
|
||||
customModes: MigrationCustomModeInfo[]
|
||||
defaultModel?: { provider: string; model: string }
|
||||
settings?: LegacySettings
|
||||
}
|
||||
}
|
||||
|
||||
/** Real-time progress update for a single item being migrated. */
|
||||
export interface LegacyMigrationProgressMessage {
|
||||
type: "legacyMigrationProgress"
|
||||
item: string
|
||||
status: "migrating" | "success" | "warning" | "error"
|
||||
message?: string
|
||||
}
|
||||
|
||||
/** Final results once all selected items have been processed. */
|
||||
export interface LegacyMigrationCompleteMessage {
|
||||
type: "legacyMigrationComplete"
|
||||
results: MigrationResultItem[]
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Webview → Extension
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/** Webview requests the legacy data payload (e.g. on component mount). */
|
||||
export interface RequestLegacyMigrationDataMessage {
|
||||
type: "requestLegacyMigrationData"
|
||||
}
|
||||
|
||||
/** User has confirmed selections and wants to start migration. */
|
||||
export interface StartLegacyMigrationMessage {
|
||||
type: "startLegacyMigration"
|
||||
selections: MigrationSelections
|
||||
}
|
||||
|
||||
/** User chose to skip migration entirely. */
|
||||
export interface SkipLegacyMigrationMessage {
|
||||
type: "skipLegacyMigration"
|
||||
}
|
||||
|
||||
/** User opted to clear legacy data after successful migration. */
|
||||
export interface ClearLegacyDataMessage {
|
||||
type: "clearLegacyData"
|
||||
}
|
||||
@@ -0,0 +1,970 @@
|
||||
/**
|
||||
* legacy-migration - Core migration service.
|
||||
*
|
||||
* Reads legacy Kilo Code v5.x data from VS Code SecretStorage and the extension's
|
||||
* global storage directory, then writes it to the new CLI backend via the SDK.
|
||||
*/
|
||||
|
||||
import * as vscode from "vscode"
|
||||
import type { KiloClient } from "@kilocode/sdk/v2/client"
|
||||
import type {
|
||||
McpLocalConfig,
|
||||
McpRemoteConfig,
|
||||
AgentConfig,
|
||||
PermissionConfig,
|
||||
PermissionObjectConfig,
|
||||
} from "@kilocode/sdk/v2/client"
|
||||
import { PROVIDER_MAP, UNSUPPORTED_PROVIDERS, DEFAULT_MODE_SLUGS } from "./provider-mapping"
|
||||
import type {
|
||||
LegacyProviderProfiles,
|
||||
LegacyProviderSettings,
|
||||
LegacyMcpSettings,
|
||||
LegacyCustomMode,
|
||||
LegacyMcpServer,
|
||||
LegacySettings,
|
||||
LegacyAutocompleteSettings,
|
||||
LegacyMigrationData,
|
||||
MigrationSelections,
|
||||
MigrationAutoApprovalSelections,
|
||||
MigrationProviderInfo,
|
||||
MigrationMcpServerInfo,
|
||||
MigrationCustomModeInfo,
|
||||
MigrationResultItem,
|
||||
} from "./legacy-types"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Constants
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const SECRET_KEY = "roo_cline_config_api_config"
|
||||
const MIGRATION_STATUS_KEY = "kilo.legacyMigrationStatus"
|
||||
|
||||
type MigrationStatus = "completed" | "skipped"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Status helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export function getMigrationStatus(context: vscode.ExtensionContext): MigrationStatus | undefined {
|
||||
return context.globalState.get<MigrationStatus>(MIGRATION_STATUS_KEY)
|
||||
}
|
||||
|
||||
export async function setMigrationStatus(context: vscode.ExtensionContext, status: MigrationStatus): Promise<void> {
|
||||
await context.globalState.update(MIGRATION_STATUS_KEY, status)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Detection
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Reads legacy data from SecretStorage and global storage files.
|
||||
* Returns a structured summary for display in the migration wizard.
|
||||
*/
|
||||
export async function detectLegacyData(context: vscode.ExtensionContext): Promise<LegacyMigrationData> {
|
||||
const profiles = await readLegacyProviderProfiles(context)
|
||||
const mcpSettings = await readLegacyMcpSettings(context)
|
||||
const customModes = await readLegacyCustomModes(context)
|
||||
const settings = readLegacySettings(context)
|
||||
|
||||
const providers = buildProviderList(profiles)
|
||||
const mcpServers = buildMcpServerList(mcpSettings)
|
||||
const modes = buildCustomModeList(customModes)
|
||||
const defaultModel = resolveDefaultModel(profiles)
|
||||
|
||||
const hasSettings =
|
||||
settings.autoApprovalEnabled !== undefined ||
|
||||
(settings.allowedCommands?.length ?? 0) > 0 ||
|
||||
(settings.deniedCommands?.length ?? 0) > 0 ||
|
||||
settings.alwaysAllowReadOnly !== undefined ||
|
||||
settings.alwaysAllowReadOnlyOutsideWorkspace !== undefined ||
|
||||
settings.alwaysAllowWrite !== undefined ||
|
||||
settings.alwaysAllowExecute !== undefined ||
|
||||
settings.alwaysAllowMcp !== undefined ||
|
||||
settings.alwaysAllowModeSwitch !== undefined ||
|
||||
settings.alwaysAllowSubtasks !== undefined ||
|
||||
Boolean(settings.language) ||
|
||||
Boolean(settings.autocomplete)
|
||||
|
||||
const hasData = providers.length > 0 || mcpServers.length > 0 || modes.length > 0 || hasSettings
|
||||
|
||||
return {
|
||||
providers,
|
||||
mcpServers,
|
||||
customModes: modes,
|
||||
defaultModel,
|
||||
settings: hasSettings ? settings : undefined,
|
||||
hasData,
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Migration
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export type ProgressCallback = (
|
||||
item: string,
|
||||
status: "migrating" | "success" | "warning" | "error",
|
||||
message?: string,
|
||||
) => void
|
||||
|
||||
/**
|
||||
* Executes migration for the selected items.
|
||||
* Calls onProgress for each item with real-time status updates.
|
||||
* Pass `cachedSettings` (from a prior detectLegacyData call) to avoid re-reading
|
||||
* globalState. Provider profiles, MCP servers, and custom modes are always re-read
|
||||
* from SecretStorage/disk to ensure the data is current at migration time.
|
||||
*/
|
||||
export async function migrate(
|
||||
context: vscode.ExtensionContext,
|
||||
client: KiloClient,
|
||||
selections: MigrationSelections,
|
||||
onProgress: ProgressCallback,
|
||||
cachedSettings?: LegacySettings,
|
||||
): Promise<MigrationResultItem[]> {
|
||||
const profiles = await readLegacyProviderProfiles(context)
|
||||
const mcpSettings = await readLegacyMcpSettings(context)
|
||||
const customModes = await readLegacyCustomModes(context)
|
||||
const legacySettings = cachedSettings ?? readLegacySettings(context)
|
||||
|
||||
const results: MigrationResultItem[] = []
|
||||
|
||||
// Migrate provider API keys
|
||||
for (const profileName of selections.providers) {
|
||||
const settings = profiles?.apiConfigs[profileName]
|
||||
if (!settings) {
|
||||
results.push({ item: profileName, category: "provider", status: "error", message: "Profile not found" })
|
||||
continue
|
||||
}
|
||||
onProgress(profileName, "migrating")
|
||||
const result = await migrateProvider(profileName, settings, client)
|
||||
results.push(result)
|
||||
onProgress(profileName, result.status, result.message)
|
||||
}
|
||||
|
||||
// Migrate MCP servers
|
||||
if (selections.mcpServers.length > 0 && mcpSettings) {
|
||||
const mcpConfig: Record<string, McpLocalConfig | McpRemoteConfig> = {}
|
||||
for (const name of selections.mcpServers) {
|
||||
const server = mcpSettings.mcpServers[name]
|
||||
if (!server) {
|
||||
results.push({ item: name, category: "mcpServer", status: "error", message: "Server not found" })
|
||||
continue
|
||||
}
|
||||
onProgress(name, "migrating")
|
||||
const converted = convertMcpServer(server)
|
||||
if (converted) {
|
||||
mcpConfig[name] = converted
|
||||
results.push({ item: name, category: "mcpServer", status: "success" })
|
||||
onProgress(name, "success")
|
||||
} else {
|
||||
results.push({
|
||||
item: name,
|
||||
category: "mcpServer",
|
||||
status: "warning",
|
||||
message: "Could not convert server config",
|
||||
})
|
||||
onProgress(name, "warning", "Could not convert server config")
|
||||
}
|
||||
}
|
||||
if (Object.keys(mcpConfig).length > 0) {
|
||||
await client.global.config.update({ config: { mcp: mcpConfig } })
|
||||
}
|
||||
}
|
||||
|
||||
// Migrate custom modes as agents
|
||||
if (selections.customModes.length > 0 && customModes) {
|
||||
const agentConfig: Record<string, AgentConfig> = {}
|
||||
for (const slug of selections.customModes) {
|
||||
const mode = customModes.find((m) => m.slug === slug)
|
||||
if (!mode) {
|
||||
results.push({ item: slug, category: "customMode", status: "error", message: "Mode not found" })
|
||||
continue
|
||||
}
|
||||
onProgress(mode.name, "migrating")
|
||||
agentConfig[slug] = convertCustomMode(mode)
|
||||
results.push({ item: mode.name, category: "customMode", status: "success" })
|
||||
onProgress(mode.name, "success")
|
||||
}
|
||||
if (Object.keys(agentConfig).length > 0) {
|
||||
await client.global.config.update({ config: { agent: agentConfig } })
|
||||
}
|
||||
}
|
||||
|
||||
// Migrate default model
|
||||
if (selections.defaultModel && profiles) {
|
||||
const activeName = profiles.currentApiConfigName
|
||||
const active = profiles.apiConfigs[activeName]
|
||||
if (active) {
|
||||
onProgress("Default model", "migrating")
|
||||
const result = await migrateDefaultModel(active, client)
|
||||
results.push(result)
|
||||
onProgress("Default model", result.status, result.message)
|
||||
}
|
||||
}
|
||||
|
||||
// Migrate auto-approval settings (granular, each selected item is independent)
|
||||
const apSel = selections.settings.autoApproval
|
||||
if (
|
||||
apSel.commandRules ||
|
||||
apSel.readPermission ||
|
||||
apSel.writePermission ||
|
||||
apSel.executePermission ||
|
||||
apSel.mcpPermission ||
|
||||
apSel.taskPermission
|
||||
) {
|
||||
const apItems = await migrateAutoApproval(legacySettings, apSel, client, onProgress)
|
||||
results.push(...apItems)
|
||||
}
|
||||
|
||||
// Migrate language setting
|
||||
if (selections.settings.language && legacySettings.language) {
|
||||
onProgress("Language preference", "migrating")
|
||||
const result = await migrateLanguage(legacySettings.language)
|
||||
results.push(result)
|
||||
onProgress("Language preference", result.status, result.message)
|
||||
}
|
||||
|
||||
// Migrate autocomplete settings
|
||||
if (selections.settings.autocomplete && legacySettings.autocomplete) {
|
||||
onProgress("Autocomplete settings", "migrating")
|
||||
const result = await migrateAutocomplete(legacySettings.autocomplete)
|
||||
results.push(result)
|
||||
onProgress("Autocomplete settings", result.status, result.message)
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Cleanup
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Removes legacy data from SecretStorage, globalState, and VS Code settings.
|
||||
*/
|
||||
export async function clearLegacyData(context: vscode.ExtensionContext): Promise<void> {
|
||||
await context.secrets.delete(SECRET_KEY)
|
||||
|
||||
const legacyStateKeys = [
|
||||
"kilo-code.allowedCommands",
|
||||
"kilo-code.deniedCommands",
|
||||
"kilo-code.autoApprovalEnabled",
|
||||
"kilo-code.fuzzyMatchThreshold",
|
||||
"kilo-code.diffEnabled",
|
||||
"kilo-code.language",
|
||||
"kilo-code.customModes",
|
||||
"kilo-code.firstInstallCompleted",
|
||||
"kilo-code.telemetrySetting",
|
||||
"ghostServiceSettings",
|
||||
// Fine-grained auto-approval keys (no prefix in legacy globalState)
|
||||
"alwaysAllowReadOnly",
|
||||
"alwaysAllowReadOnlyOutsideWorkspace",
|
||||
"alwaysAllowWrite",
|
||||
"alwaysAllowWriteOutsideWorkspace",
|
||||
"alwaysAllowWriteProtected",
|
||||
"alwaysAllowDelete",
|
||||
"alwaysAllowExecute",
|
||||
"alwaysAllowBrowser",
|
||||
"alwaysAllowMcp",
|
||||
"alwaysAllowModeSwitch",
|
||||
"alwaysAllowSubtasks",
|
||||
"alwaysAllowFollowupQuestions",
|
||||
"followupAutoApproveTimeoutMs",
|
||||
]
|
||||
for (const key of legacyStateKeys) {
|
||||
await context.globalState.update(key, undefined)
|
||||
}
|
||||
|
||||
// Clear legacy VS Code settings registered under the "kilo-code" configuration scope.
|
||||
// These are set via the old extension's contributes.configuration and persist in the
|
||||
// user's settings.json even after the extension is uninstalled.
|
||||
const legacyVscodeSettings = [
|
||||
"allowedCommands",
|
||||
"deniedCommands",
|
||||
"commandExecutionTimeout",
|
||||
"commandTimeoutAllowlist",
|
||||
"preventCompletionWithOpenTodos",
|
||||
"vsCodeLmModelSelector",
|
||||
"customStoragePath",
|
||||
"enableCodeActions",
|
||||
"autoImportSettingsPath",
|
||||
"maximumIndexedFilesForFileSearch",
|
||||
"useAgentRules",
|
||||
"apiRequestTimeout",
|
||||
"newTaskRequireTodos",
|
||||
"enableSettingsSync",
|
||||
"toolProtocol",
|
||||
"debug",
|
||||
]
|
||||
const cfg = vscode.workspace.getConfiguration("kilo-code")
|
||||
for (const key of legacyVscodeSettings) {
|
||||
await cfg.update(key, undefined, vscode.ConfigurationTarget.Global)
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — provider migration
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async function migrateProvider(
|
||||
profileName: string,
|
||||
settings: LegacyProviderSettings,
|
||||
client: KiloClient,
|
||||
): Promise<MigrationResultItem> {
|
||||
const provider = settings.apiProvider
|
||||
if (!provider) {
|
||||
return { item: profileName, category: "provider", status: "error", message: "No provider type found" }
|
||||
}
|
||||
|
||||
if (UNSUPPORTED_PROVIDERS.has(provider)) {
|
||||
return {
|
||||
item: profileName,
|
||||
category: "provider",
|
||||
status: "warning",
|
||||
message: `Provider "${provider}" is not supported in the new version`,
|
||||
}
|
||||
}
|
||||
|
||||
const mapping = PROVIDER_MAP[provider]
|
||||
if (!mapping) {
|
||||
return {
|
||||
item: profileName,
|
||||
category: "provider",
|
||||
status: "warning",
|
||||
message: `Unknown provider "${provider}"`,
|
||||
}
|
||||
}
|
||||
|
||||
const apiKey = settings[mapping.key] as string | undefined
|
||||
if (!apiKey) {
|
||||
return { item: profileName, category: "provider", status: "warning", message: "No API key found in profile" }
|
||||
}
|
||||
|
||||
// For providers that support an organization ID (e.g. Kilo Gateway), migrate using OAuth
|
||||
// auth so the CLI can read accountId for org-scoped API requests.
|
||||
const organizationId = mapping.organizationIdField
|
||||
? (settings[mapping.organizationIdField] as string | undefined)
|
||||
: undefined
|
||||
|
||||
const auth = organizationId
|
||||
? { type: "oauth" as const, access: apiKey, refresh: "", expires: 0, accountId: organizationId }
|
||||
: { type: "api" as const, key: apiKey }
|
||||
|
||||
await client.auth.set({ providerID: mapping.id, auth })
|
||||
|
||||
// If a custom base URL is configured, also persist it to the backend config
|
||||
if (mapping.urlField) {
|
||||
const url = settings[mapping.urlField] as string | undefined
|
||||
if (url) {
|
||||
await client.global.config.update({
|
||||
config: { provider: { [mapping.id]: { options: { apiKey, baseURL: url } } } },
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return { item: profileName, category: "provider", status: "success" }
|
||||
}
|
||||
|
||||
async function migrateDefaultModel(settings: LegacyProviderSettings, client: KiloClient): Promise<MigrationResultItem> {
|
||||
const provider = settings.apiProvider
|
||||
if (!provider) {
|
||||
return { item: "Default model", category: "defaultModel", status: "error", message: "No provider type found" }
|
||||
}
|
||||
|
||||
const mapping = PROVIDER_MAP[provider]
|
||||
if (!mapping) {
|
||||
return {
|
||||
item: "Default model",
|
||||
category: "defaultModel",
|
||||
status: "warning",
|
||||
message: `Provider "${provider}" is not supported in the new version`,
|
||||
}
|
||||
}
|
||||
|
||||
const modelField = mapping.modelField ?? "apiModelId"
|
||||
const modelId = settings[modelField] as string | undefined
|
||||
if (!modelId) {
|
||||
return { item: "Default model", category: "defaultModel", status: "warning", message: "No model ID found" }
|
||||
}
|
||||
|
||||
await client.global.config.update({ config: { model: `${mapping.id}/${modelId}` } })
|
||||
return { item: "Default model", category: "defaultModel", status: "success" }
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — settings migration (auto-approval, language)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async function migrateAutoApproval(
|
||||
settings: LegacySettings,
|
||||
sel: MigrationAutoApprovalSelections,
|
||||
client: KiloClient,
|
||||
onProgress: ProgressCallback,
|
||||
): Promise<MigrationResultItem[]> {
|
||||
const {
|
||||
autoApprovalEnabled,
|
||||
allowedCommands,
|
||||
deniedCommands,
|
||||
alwaysAllowReadOnly,
|
||||
alwaysAllowReadOnlyOutsideWorkspace,
|
||||
alwaysAllowWrite,
|
||||
alwaysAllowExecute,
|
||||
alwaysAllowMcp,
|
||||
alwaysAllowModeSwitch,
|
||||
alwaysAllowSubtasks,
|
||||
} = settings
|
||||
|
||||
// The master toggle acts as a global fallback for unspecified tools.
|
||||
const fallback: "allow" | "ask" = autoApprovalEnabled === true ? "allow" : "ask"
|
||||
|
||||
const results: MigrationResultItem[] = []
|
||||
// We collect all permission updates and apply them in one call at the end.
|
||||
const permission: PermissionConfig = {}
|
||||
// Track if global "allow" was already written so we skip the per-tool object update
|
||||
// that would otherwise overwrite it with a narrower permission set.
|
||||
let globalAllowApplied = false
|
||||
|
||||
// Command rules: master toggle + allowedCommands + deniedCommands
|
||||
if (sel.commandRules) {
|
||||
const label = "Command rules"
|
||||
onProgress(label, "migrating")
|
||||
const hasCommandLists = Boolean(allowedCommands?.length || deniedCommands?.length)
|
||||
if (autoApprovalEnabled === true && !hasCommandLists) {
|
||||
// Global allow with no specific command rules — apply immediately using the scalar form.
|
||||
// PermissionConfig is "allow" | "ask" | "deny" | { read?: ..., ... }, so a global allow
|
||||
// must be the scalar string, not an object with a "*" key.
|
||||
await client.global.config.update({ config: { permission: "allow" } })
|
||||
globalAllowApplied = true
|
||||
} else if (hasCommandLists) {
|
||||
const bashRules: PermissionObjectConfig = {}
|
||||
// The legacy system matched commands as longest prefix (e.g. "npm run" matched "npm run dev").
|
||||
// The new CLI uses Wildcard.match with full command text anchored to ^ and $, so "npm run"
|
||||
// would only match the literal string "npm run". Appending " *" approximates prefix semantics:
|
||||
// Wildcard.match treats trailing " *" as "( .*)?", matching with or without arguments.
|
||||
for (const cmd of allowedCommands ?? []) {
|
||||
bashRules[cmd.trimEnd() + " *"] = "allow"
|
||||
}
|
||||
for (const cmd of deniedCommands ?? []) {
|
||||
bashRules[cmd.trimEnd() + " *"] = "deny"
|
||||
}
|
||||
// alwaysAllowExecute=false must override the master toggle
|
||||
bashRules["*"] = alwaysAllowExecute === true ? "allow" : alwaysAllowExecute === false ? "ask" : fallback
|
||||
permission.bash = bashRules
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
}
|
||||
|
||||
// Read permissions
|
||||
if (sel.readPermission) {
|
||||
const label = "Read permission"
|
||||
onProgress(label, "migrating")
|
||||
if (alwaysAllowReadOnly === true) {
|
||||
permission.read = "allow"
|
||||
permission.glob = "allow"
|
||||
permission.grep = "allow"
|
||||
permission.list = "allow"
|
||||
} else if (alwaysAllowReadOnly === false) {
|
||||
permission.read = "ask"
|
||||
}
|
||||
if (alwaysAllowReadOnlyOutsideWorkspace === true) {
|
||||
permission.external_directory = "allow"
|
||||
} else if (alwaysAllowReadOnlyOutsideWorkspace === false) {
|
||||
permission.external_directory = "ask"
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
}
|
||||
|
||||
// Write permissions
|
||||
if (sel.writePermission) {
|
||||
const label = "Write permission"
|
||||
onProgress(label, "migrating")
|
||||
if (alwaysAllowWrite === true) {
|
||||
permission.edit = "allow"
|
||||
} else if (alwaysAllowWrite === false) {
|
||||
permission.edit = "ask"
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
}
|
||||
|
||||
// Execute permissions (bash only — command lists handled above in commandRules)
|
||||
if (sel.executePermission && !sel.commandRules) {
|
||||
const label = "Execute permission"
|
||||
onProgress(label, "migrating")
|
||||
if (alwaysAllowExecute === true) {
|
||||
permission.bash = "allow"
|
||||
} else if (alwaysAllowExecute === false) {
|
||||
permission.bash = "ask"
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
} else if (sel.executePermission) {
|
||||
// executePermission selected together with commandRules — bash rules already built above,
|
||||
// just record the result item
|
||||
results.push({ item: "Execute permission", category: "settings", status: "success" })
|
||||
}
|
||||
|
||||
// MCP / skill permissions
|
||||
if (sel.mcpPermission) {
|
||||
const label = "MCP permission"
|
||||
onProgress(label, "migrating")
|
||||
if (alwaysAllowMcp === true) {
|
||||
permission.skill = "allow"
|
||||
} else if (alwaysAllowMcp === false) {
|
||||
permission.skill = "ask"
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
}
|
||||
|
||||
// Task / subtask permissions
|
||||
if (sel.taskPermission) {
|
||||
const label = "Task permission"
|
||||
onProgress(label, "migrating")
|
||||
if (alwaysAllowModeSwitch === true || alwaysAllowSubtasks === true) {
|
||||
permission.task = "allow"
|
||||
} else if (alwaysAllowModeSwitch === false && alwaysAllowSubtasks === false) {
|
||||
permission.task = "ask"
|
||||
}
|
||||
results.push({ item: label, category: "settings", status: "success" })
|
||||
onProgress(label, "success")
|
||||
}
|
||||
|
||||
// Only write the per-tool object form if global allow wasn't already applied —
|
||||
// writing an object after "allow" would narrow permissions to only the listed tools.
|
||||
if (!globalAllowApplied && Object.keys(permission).length > 0) {
|
||||
await client.global.config.update({ config: { permission } })
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
|
||||
async function migrateAutocomplete(settings: LegacyAutocompleteSettings): Promise<MigrationResultItem> {
|
||||
try {
|
||||
const config = vscode.workspace.getConfiguration("kilo-code.new.autocomplete")
|
||||
if (settings.enableAutoTrigger !== undefined) {
|
||||
await config.update("enableAutoTrigger", settings.enableAutoTrigger, vscode.ConfigurationTarget.Global)
|
||||
}
|
||||
if (settings.enableSmartInlineTaskKeybinding !== undefined) {
|
||||
await config.update(
|
||||
"enableSmartInlineTaskKeybinding",
|
||||
settings.enableSmartInlineTaskKeybinding,
|
||||
vscode.ConfigurationTarget.Global,
|
||||
)
|
||||
}
|
||||
if (settings.enableChatAutocomplete !== undefined) {
|
||||
await config.update("enableChatAutocomplete", settings.enableChatAutocomplete, vscode.ConfigurationTarget.Global)
|
||||
}
|
||||
return { item: "Autocomplete settings", category: "settings", status: "success" }
|
||||
} catch (err) {
|
||||
return {
|
||||
item: "Autocomplete settings",
|
||||
category: "settings",
|
||||
status: "error",
|
||||
message: err instanceof Error ? err.message : String(err),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Maps legacy locale codes to their new-extension equivalents.
|
||||
// Legacy used IETF BCP-47 tags (zh-CN, pt-BR) while the new extension uses short codes.
|
||||
// Entries absent from this map have no equivalent in the new extension.
|
||||
const LEGACY_LOCALE_MAP: Record<string, string> = {
|
||||
// Direct matches
|
||||
en: "en",
|
||||
de: "de",
|
||||
es: "es",
|
||||
fr: "fr",
|
||||
ja: "ja",
|
||||
ko: "ko",
|
||||
pl: "pl",
|
||||
ru: "ru",
|
||||
ar: "ar",
|
||||
th: "th",
|
||||
da: "da",
|
||||
no: "no",
|
||||
bs: "bs",
|
||||
// Format changes
|
||||
"zh-CN": "zh",
|
||||
"zh-TW": "zht",
|
||||
"pt-BR": "br",
|
||||
}
|
||||
|
||||
async function migrateLanguage(language: string): Promise<MigrationResultItem> {
|
||||
const mapped = LEGACY_LOCALE_MAP[language]
|
||||
if (!mapped) {
|
||||
return {
|
||||
item: "Language preference",
|
||||
category: "settings",
|
||||
status: "warning",
|
||||
message: `Language "${language}" is not supported in the new version`,
|
||||
}
|
||||
}
|
||||
try {
|
||||
const config = vscode.workspace.getConfiguration("kilo-code.new")
|
||||
await config.update("language", mapped, vscode.ConfigurationTarget.Global)
|
||||
return { item: "Language preference", category: "settings", status: "success" }
|
||||
} catch (err) {
|
||||
return {
|
||||
item: "Language preference",
|
||||
category: "settings",
|
||||
status: "error",
|
||||
message: err instanceof Error ? err.message : String(err),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — MCP conversion (legacy → McpServerConfig)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function convertMcpServer(server: LegacyMcpServer): McpLocalConfig | McpRemoteConfig | null {
|
||||
if (server.type === "sse" || server.type === "streamable-http") {
|
||||
if (!server.url) return null
|
||||
return { type: "remote", url: server.url, headers: server.headers }
|
||||
}
|
||||
// Default: stdio
|
||||
if (!server.command) return null
|
||||
const command = server.args ? [server.command, ...server.args] : [server.command]
|
||||
return {
|
||||
type: "local",
|
||||
command,
|
||||
environment: server.env,
|
||||
...(server.timeout !== undefined && { timeout: server.timeout }),
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — custom mode conversion (legacy → AgentConfig)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// Group name → CLI permission key (mirrors ModesMigrator.convertPermissions in the CLI)
|
||||
const GROUP_TO_PERMISSION: Record<string, string> = {
|
||||
read: "read",
|
||||
edit: "edit",
|
||||
browser: "bash",
|
||||
command: "bash",
|
||||
mcp: "skill",
|
||||
}
|
||||
const ALL_MODE_PERMISSIONS = ["read", "edit", "bash", "skill"]
|
||||
|
||||
function convertCustomModePermissions(groups: LegacyCustomMode["groups"]): PermissionConfig {
|
||||
const permission: Record<string, unknown> = {}
|
||||
const allowed = new Set<string>()
|
||||
|
||||
for (const group of groups) {
|
||||
const groupName = typeof group === "string" ? group : group[0]
|
||||
const groupConfig = typeof group === "string" ? undefined : group[1]
|
||||
const permKey = GROUP_TO_PERMISSION[groupName] ?? groupName
|
||||
allowed.add(permKey)
|
||||
|
||||
const newValue = groupConfig?.fileRegex ? { [groupConfig.fileRegex]: "allow", "*": "deny" } : "allow"
|
||||
|
||||
// Multiple legacy groups can map to the same permission key (browser + command → bash).
|
||||
// Merge rules so neither overwrites the other:
|
||||
// - if either side is "allow", the key is fully allowed
|
||||
// - if both sides are objects, merge their pattern maps
|
||||
const existing = permission[permKey]
|
||||
if (existing === undefined) {
|
||||
permission[permKey] = newValue
|
||||
} else if (existing === "allow" || newValue === "allow") {
|
||||
permission[permKey] = "allow"
|
||||
} else if (typeof existing === "object" && typeof newValue === "object") {
|
||||
permission[permKey] = { ...existing, ...newValue }
|
||||
} else {
|
||||
permission[permKey] = newValue
|
||||
}
|
||||
}
|
||||
|
||||
// Explicitly deny permissions not in the groups (CLI defaults to "ask" for missing ones)
|
||||
for (const perm of ALL_MODE_PERMISSIONS) {
|
||||
if (!allowed.has(perm)) {
|
||||
permission[perm] = "deny"
|
||||
}
|
||||
}
|
||||
|
||||
return permission as PermissionConfig
|
||||
}
|
||||
|
||||
function convertCustomMode(mode: LegacyCustomMode): AgentConfig {
|
||||
const prompt = [mode.roleDefinition, mode.customInstructions].filter(Boolean).join("\n\n")
|
||||
return {
|
||||
mode: "primary",
|
||||
description: mode.customInstructions ?? mode.roleDefinition?.slice(0, 120),
|
||||
prompt,
|
||||
permission: convertCustomModePermissions(mode.groups),
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — reading legacy data from storage
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async function readLegacyProviderProfiles(context: vscode.ExtensionContext): Promise<LegacyProviderProfiles | null> {
|
||||
const raw = await context.secrets.get(SECRET_KEY)
|
||||
if (!raw) return null
|
||||
try {
|
||||
const parsed = JSON.parse(raw) as Record<string, unknown>
|
||||
if (!parsed.apiConfigs || typeof parsed.apiConfigs !== "object") return null
|
||||
return parsed as unknown as LegacyProviderProfiles
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
async function readLegacyMcpSettings(context: vscode.ExtensionContext): Promise<LegacyMcpSettings | null> {
|
||||
const filePath = vscode.Uri.joinPath(context.globalStorageUri, "settings", "mcp_settings.json")
|
||||
const bytes = await vscode.workspace.fs.readFile(filePath).then(
|
||||
(b) => b,
|
||||
() => null,
|
||||
)
|
||||
if (!bytes) return null
|
||||
try {
|
||||
const parsed = JSON.parse(Buffer.from(bytes).toString("utf8")) as Record<string, unknown>
|
||||
if (!parsed.mcpServers || typeof parsed.mcpServers !== "object") return null
|
||||
return parsed as unknown as LegacyMcpSettings
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
async function readLegacyCustomModes(context: vscode.ExtensionContext): Promise<LegacyCustomMode[] | null> {
|
||||
const filePath = vscode.Uri.joinPath(context.globalStorageUri, "settings", "custom_modes.yaml")
|
||||
const bytes = await vscode.workspace.fs.readFile(filePath).then(
|
||||
(b) => b,
|
||||
() => null,
|
||||
)
|
||||
if (!bytes) return null
|
||||
const text = Buffer.from(bytes).toString("utf8")
|
||||
return parseCustomModesYaml(text)
|
||||
}
|
||||
|
||||
function readLegacySettings(context: vscode.ExtensionContext): LegacySettings {
|
||||
const raw = context.globalState.get<Record<string, unknown>>("ghostServiceSettings")
|
||||
const autocomplete: LegacyAutocompleteSettings | undefined =
|
||||
raw && typeof raw === "object"
|
||||
? {
|
||||
enableAutoTrigger: raw.enableAutoTrigger as boolean | undefined,
|
||||
enableSmartInlineTaskKeybinding: raw.enableSmartInlineTaskKeybinding as boolean | undefined,
|
||||
enableChatAutocomplete: raw.enableChatAutocomplete as boolean | undefined,
|
||||
}
|
||||
: undefined
|
||||
|
||||
return {
|
||||
autoApprovalEnabled: context.globalState.get<boolean>("kilo-code.autoApprovalEnabled"),
|
||||
allowedCommands: context.globalState.get<string[]>("kilo-code.allowedCommands"),
|
||||
deniedCommands: context.globalState.get<string[]>("kilo-code.deniedCommands"),
|
||||
// Fine-grained auto-approval — stored without prefix in legacy globalState
|
||||
alwaysAllowReadOnly: context.globalState.get<boolean>("alwaysAllowReadOnly"),
|
||||
alwaysAllowReadOnlyOutsideWorkspace: context.globalState.get<boolean>("alwaysAllowReadOnlyOutsideWorkspace"),
|
||||
alwaysAllowWrite: context.globalState.get<boolean>("alwaysAllowWrite"),
|
||||
alwaysAllowExecute: context.globalState.get<boolean>("alwaysAllowExecute"),
|
||||
alwaysAllowMcp: context.globalState.get<boolean>("alwaysAllowMcp"),
|
||||
alwaysAllowModeSwitch: context.globalState.get<boolean>("alwaysAllowModeSwitch"),
|
||||
alwaysAllowSubtasks: context.globalState.get<boolean>("alwaysAllowSubtasks"),
|
||||
language: context.globalState.get<string>("kilo-code.language"),
|
||||
autocomplete: hasAutocompleteData(autocomplete) ? autocomplete : undefined,
|
||||
}
|
||||
}
|
||||
|
||||
function hasAutocompleteData(s: LegacyAutocompleteSettings | undefined): s is LegacyAutocompleteSettings {
|
||||
if (!s) return false
|
||||
return (
|
||||
s.enableAutoTrigger !== undefined ||
|
||||
s.enableSmartInlineTaskKeybinding !== undefined ||
|
||||
s.enableChatAutocomplete !== undefined
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Minimal YAML parser for the custom_modes.yaml format.
|
||||
* Tries JSON first (some legacy versions stored JSON), then parses the simple
|
||||
* YAML structure manually to avoid a runtime dependency on a YAML library.
|
||||
*/
|
||||
// Strip surrounding single or double quotes from a YAML scalar value
|
||||
function stripYamlQuotes(value: string): string {
|
||||
return value.replace(/^(['"])(.*)\1$/, "$2")
|
||||
}
|
||||
|
||||
function parseCustomModesYaml(text: string): LegacyCustomMode[] | null {
|
||||
// Try JSON first
|
||||
const jsonResult = (() => {
|
||||
try {
|
||||
const parsed = JSON.parse(text) as { customModes?: LegacyCustomMode[] }
|
||||
return parsed.customModes ?? null
|
||||
} catch {
|
||||
return null
|
||||
}
|
||||
})()
|
||||
if (jsonResult) return jsonResult
|
||||
|
||||
// Parse the simple YAML shape:
|
||||
// customModes:
|
||||
// - slug: xxx
|
||||
// name: xxx
|
||||
// roleDefinition: |
|
||||
// ...
|
||||
// groups:
|
||||
// - read
|
||||
const modes: LegacyCustomMode[] = []
|
||||
const lines = text.split("\n")
|
||||
let inModes = false
|
||||
let current: Partial<LegacyCustomMode> | null = null
|
||||
// Track which block scalar field is currently being collected
|
||||
let blockField: "roleDefinition" | "customInstructions" | null = null
|
||||
let inGroups = false
|
||||
let blockLines: string[] = []
|
||||
|
||||
const flush = () => {
|
||||
if (current?.slug && current?.name) {
|
||||
if (blockField && blockLines.length > 0) {
|
||||
current[blockField] = blockLines.join("\n").trim()
|
||||
}
|
||||
modes.push({ groups: [], ...current } as LegacyCustomMode)
|
||||
}
|
||||
current = null
|
||||
blockField = null
|
||||
inGroups = false
|
||||
blockLines = []
|
||||
}
|
||||
|
||||
for (const rawLine of lines) {
|
||||
if (!inModes) {
|
||||
if (rawLine.trim() === "customModes:") inModes = true
|
||||
continue
|
||||
}
|
||||
|
||||
if (/^ - slug: /.test(rawLine)) {
|
||||
flush()
|
||||
current = { slug: stripYamlQuotes(rawLine.replace(/^ - slug: /, "").trim()), groups: [] }
|
||||
continue
|
||||
}
|
||||
|
||||
if (!current) continue
|
||||
|
||||
if (/^ name: /.test(rawLine)) {
|
||||
current.name = stripYamlQuotes(rawLine.replace(/^ name: /, "").trim())
|
||||
continue
|
||||
}
|
||||
|
||||
// Block scalar fields (roleDefinition, customInstructions) with | or >
|
||||
const blockMatch = rawLine.match(/^ (roleDefinition|customInstructions): [|>]/)
|
||||
if (blockMatch) {
|
||||
// Flush any previously open block
|
||||
if (blockField && blockLines.length > 0) {
|
||||
current[blockField] = blockLines.join("\n").trim()
|
||||
}
|
||||
blockField = blockMatch[1] as "roleDefinition" | "customInstructions"
|
||||
inGroups = false
|
||||
blockLines = []
|
||||
continue
|
||||
}
|
||||
|
||||
// Single-line scalar fields
|
||||
if (/^ roleDefinition: /.test(rawLine) && !blockField) {
|
||||
current.roleDefinition = stripYamlQuotes(rawLine.replace(/^ roleDefinition: /, "").trim())
|
||||
continue
|
||||
}
|
||||
|
||||
if (/^ customInstructions: /.test(rawLine) && !blockField) {
|
||||
current.customInstructions = stripYamlQuotes(rawLine.replace(/^ customInstructions: /, "").trim())
|
||||
continue
|
||||
}
|
||||
|
||||
if (/^ whenToUse: /.test(rawLine) && !blockField) {
|
||||
current.whenToUse = stripYamlQuotes(rawLine.replace(/^ whenToUse: /, "").trim())
|
||||
continue
|
||||
}
|
||||
|
||||
if (/^ description: /.test(rawLine) && !blockField) {
|
||||
current.description = stripYamlQuotes(rawLine.replace(/^ description: /, "").trim())
|
||||
continue
|
||||
}
|
||||
|
||||
// Continuation lines of an open block scalar
|
||||
if (blockField) {
|
||||
if (/^ /.test(rawLine)) {
|
||||
blockLines.push(rawLine.replace(/^ /, ""))
|
||||
continue
|
||||
}
|
||||
// Block ended — flush and fall through to process this line
|
||||
current[blockField] = blockLines.join("\n").trim()
|
||||
blockField = null
|
||||
blockLines = []
|
||||
}
|
||||
|
||||
if (/^ groups:/.test(rawLine)) {
|
||||
inGroups = true
|
||||
current.groups = []
|
||||
continue
|
||||
}
|
||||
|
||||
if (inGroups && /^ - /.test(rawLine)) {
|
||||
const group = stripYamlQuotes(rawLine.replace(/^ - /, "").trim())
|
||||
current.groups = [...(current.groups ?? []), group]
|
||||
continue
|
||||
}
|
||||
|
||||
if (inGroups && !/^ /.test(rawLine)) {
|
||||
inGroups = false
|
||||
}
|
||||
}
|
||||
|
||||
flush()
|
||||
return modes.length > 0 ? modes : null
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal — building display lists for the wizard
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function buildProviderList(profiles: LegacyProviderProfiles | null): MigrationProviderInfo[] {
|
||||
if (!profiles?.apiConfigs) return []
|
||||
|
||||
return Object.entries(profiles.apiConfigs).map(([profileName, settings]) => {
|
||||
const provider = settings.apiProvider ?? "unknown"
|
||||
const mapping = PROVIDER_MAP[provider]
|
||||
const unsupported = UNSUPPORTED_PROVIDERS.has(provider)
|
||||
|
||||
const modelField = mapping?.modelField ?? "apiModelId"
|
||||
const model = settings[modelField] as string | undefined
|
||||
|
||||
const hasApiKey = mapping ? Boolean(settings[mapping.key]) : false
|
||||
|
||||
return {
|
||||
profileName,
|
||||
provider,
|
||||
model,
|
||||
hasApiKey,
|
||||
supported: Boolean(mapping) && !unsupported,
|
||||
newProviderName: mapping?.name,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
function buildMcpServerList(settings: LegacyMcpSettings | null): MigrationMcpServerInfo[] {
|
||||
if (!settings?.mcpServers) return []
|
||||
return Object.entries(settings.mcpServers)
|
||||
.filter(([, server]) => !server.disabled)
|
||||
.map(([name, server]) => ({ name, type: server.type ?? "stdio" }))
|
||||
}
|
||||
|
||||
function buildCustomModeList(modes: LegacyCustomMode[] | null): MigrationCustomModeInfo[] {
|
||||
if (!modes) return []
|
||||
return modes.filter((m) => !DEFAULT_MODE_SLUGS.has(m.slug)).map((m) => ({ name: m.name, slug: m.slug }))
|
||||
}
|
||||
|
||||
function resolveDefaultModel(profiles: LegacyProviderProfiles | null): { provider: string; model: string } | undefined {
|
||||
if (!profiles?.currentApiConfigName) return undefined
|
||||
const active = profiles.apiConfigs[profiles.currentApiConfigName]
|
||||
if (!active?.apiProvider) return undefined
|
||||
const mapping = PROVIDER_MAP[active.apiProvider]
|
||||
if (!mapping) return undefined
|
||||
const modelField = mapping.modelField ?? "apiModelId"
|
||||
const model = active[modelField] as string | undefined
|
||||
if (!model) return undefined
|
||||
return { provider: mapping.name, model }
|
||||
}
|
||||
@@ -0,0 +1,264 @@
|
||||
/**
|
||||
* legacy-migration - Maps legacy apiProvider values to new provider IDs and key fields.
|
||||
*
|
||||
* The legacy extension used flat per-provider key names (e.g. apiKey, openRouterApiKey).
|
||||
* The new CLI backend uses a per-provider auth endpoint (PUT /auth/:providerId).
|
||||
*/
|
||||
|
||||
export interface ProviderMapping {
|
||||
/** New provider ID for the auth endpoint (PUT /auth/:id) */
|
||||
id: string
|
||||
/** Field name in LegacyProviderSettings holding the primary API key */
|
||||
key: string
|
||||
/** Display name for the provider in the wizard UI */
|
||||
name: string
|
||||
/** Field holding model ID (defaults to "apiModelId") */
|
||||
modelField?: string
|
||||
/** Field holding custom base URL (to also store in config) */
|
||||
urlField?: string
|
||||
/** Field holding an organization/account ID (used for OAuth-style auth) */
|
||||
organizationIdField?: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Maps legacy `apiProvider` values → new provider info.
|
||||
* Providers absent from this map are flagged as unsupported.
|
||||
*/
|
||||
export const PROVIDER_MAP: Record<string, ProviderMapping> = {
|
||||
anthropic: {
|
||||
id: "anthropic",
|
||||
key: "apiKey",
|
||||
name: "Anthropic",
|
||||
},
|
||||
openrouter: {
|
||||
id: "openrouter",
|
||||
key: "openRouterApiKey",
|
||||
name: "OpenRouter",
|
||||
modelField: "openRouterModelId",
|
||||
},
|
||||
openai: {
|
||||
id: "openai-compatible",
|
||||
key: "openAiApiKey",
|
||||
name: "OpenAI (Compatible)",
|
||||
modelField: "openAiModelId",
|
||||
urlField: "openAiBaseUrl",
|
||||
},
|
||||
"openai-native": {
|
||||
id: "openai",
|
||||
key: "openAiNativeApiKey",
|
||||
name: "OpenAI",
|
||||
urlField: "openAiNativeBaseUrl",
|
||||
},
|
||||
"openai-responses": {
|
||||
id: "openai",
|
||||
key: "openAiApiKey",
|
||||
name: "OpenAI",
|
||||
modelField: "openAiModelId",
|
||||
},
|
||||
gemini: {
|
||||
id: "google",
|
||||
key: "geminiApiKey",
|
||||
name: "Google Gemini",
|
||||
urlField: "googleGeminiBaseUrl",
|
||||
},
|
||||
vertex: {
|
||||
id: "google-vertex",
|
||||
key: "vertexJsonCredentials",
|
||||
name: "Google Vertex AI",
|
||||
},
|
||||
bedrock: {
|
||||
id: "amazon-bedrock",
|
||||
key: "awsAccessKey",
|
||||
name: "AWS Bedrock",
|
||||
},
|
||||
deepseek: {
|
||||
id: "deepseek",
|
||||
key: "deepSeekApiKey",
|
||||
name: "DeepSeek",
|
||||
urlField: "deepSeekBaseUrl",
|
||||
},
|
||||
mistral: {
|
||||
id: "mistral",
|
||||
key: "mistralApiKey",
|
||||
name: "Mistral",
|
||||
},
|
||||
groq: {
|
||||
id: "groq",
|
||||
key: "groqApiKey",
|
||||
name: "Groq",
|
||||
},
|
||||
xai: {
|
||||
id: "xai",
|
||||
key: "xaiApiKey",
|
||||
name: "xAI",
|
||||
},
|
||||
fireworks: {
|
||||
id: "fireworks",
|
||||
key: "fireworksApiKey",
|
||||
name: "Fireworks",
|
||||
},
|
||||
featherless: {
|
||||
id: "featherless",
|
||||
key: "featherlessApiKey",
|
||||
name: "Featherless",
|
||||
},
|
||||
cerebras: {
|
||||
id: "cerebras",
|
||||
key: "cerebrasApiKey",
|
||||
name: "Cerebras",
|
||||
},
|
||||
sambanova: {
|
||||
id: "sambanova",
|
||||
key: "sambaNovaApiKey",
|
||||
name: "SambaNova",
|
||||
},
|
||||
ollama: {
|
||||
id: "ollama",
|
||||
key: "ollamaApiKey",
|
||||
name: "Ollama",
|
||||
modelField: "ollamaModelId",
|
||||
urlField: "ollamaBaseUrl",
|
||||
},
|
||||
lmstudio: {
|
||||
id: "lmstudio",
|
||||
key: "lmStudioBaseUrl",
|
||||
name: "LM Studio",
|
||||
modelField: "lmStudioModelId",
|
||||
urlField: "lmStudioBaseUrl",
|
||||
},
|
||||
kilocode: {
|
||||
id: "kilo",
|
||||
key: "kilocodeToken",
|
||||
name: "Kilo (Gateway)",
|
||||
modelField: "kilocodeModel",
|
||||
organizationIdField: "kilocodeOrganizationId",
|
||||
},
|
||||
litellm: {
|
||||
id: "litellm",
|
||||
key: "litellmApiKey",
|
||||
name: "LiteLLM",
|
||||
modelField: "litellmModelId",
|
||||
urlField: "litellmBaseUrl",
|
||||
},
|
||||
deepinfra: {
|
||||
id: "deepinfra",
|
||||
key: "deepInfraApiKey",
|
||||
name: "DeepInfra",
|
||||
modelField: "deepInfraModelId",
|
||||
urlField: "deepInfraBaseUrl",
|
||||
},
|
||||
chutes: {
|
||||
id: "chutes",
|
||||
key: "chutesApiKey",
|
||||
name: "Chutes",
|
||||
},
|
||||
baseten: {
|
||||
id: "baseten",
|
||||
key: "basetenApiKey",
|
||||
name: "Baseten",
|
||||
},
|
||||
corethink: {
|
||||
id: "corethink",
|
||||
key: "corethinkApiKey",
|
||||
name: "Corethink",
|
||||
},
|
||||
unbound: {
|
||||
id: "unbound",
|
||||
key: "unboundApiKey",
|
||||
name: "Unbound",
|
||||
modelField: "unboundModelId",
|
||||
},
|
||||
requesty: {
|
||||
id: "requesty",
|
||||
key: "requestyApiKey",
|
||||
name: "Requesty",
|
||||
modelField: "requestyModelId",
|
||||
urlField: "requestyBaseUrl",
|
||||
},
|
||||
huggingface: {
|
||||
id: "huggingface",
|
||||
key: "huggingFaceApiKey",
|
||||
name: "Hugging Face",
|
||||
modelField: "huggingFaceModelId",
|
||||
},
|
||||
"io-intelligence": {
|
||||
id: "io-intelligence",
|
||||
key: "ioIntelligenceApiKey",
|
||||
name: "IO Intelligence",
|
||||
modelField: "ioIntelligenceModelId",
|
||||
},
|
||||
"vercel-ai-gateway": {
|
||||
id: "vercel-ai-gateway",
|
||||
key: "vercelAiGatewayApiKey",
|
||||
name: "Vercel AI Gateway",
|
||||
modelField: "vercelAiGatewayModelId",
|
||||
},
|
||||
zai: {
|
||||
id: "zai",
|
||||
key: "zaiApiKey",
|
||||
name: "Z.ai",
|
||||
},
|
||||
moonshot: {
|
||||
id: "moonshot",
|
||||
key: "moonshotApiKey",
|
||||
name: "Moonshot",
|
||||
urlField: "moonshotBaseUrl",
|
||||
},
|
||||
doubao: {
|
||||
id: "doubao",
|
||||
key: "doubaoApiKey",
|
||||
name: "Doubao",
|
||||
urlField: "doubaoBaseUrl",
|
||||
},
|
||||
minimax: {
|
||||
id: "minimax",
|
||||
key: "minimaxApiKey",
|
||||
name: "MiniMax",
|
||||
urlField: "minimaxBaseUrl",
|
||||
},
|
||||
ovhcloud: {
|
||||
id: "ovhcloud",
|
||||
key: "ovhCloudAiEndpointsApiKey",
|
||||
name: "OVHcloud AI Endpoints",
|
||||
modelField: "ovhCloudAiEndpointsModelId",
|
||||
urlField: "ovhCloudAiEndpointsBaseUrl",
|
||||
},
|
||||
inception: {
|
||||
id: "inception",
|
||||
key: "inceptionLabsApiKey",
|
||||
name: "Inception Labs",
|
||||
modelField: "inceptionLabsModelId",
|
||||
urlField: "inceptionLabsBaseUrl",
|
||||
},
|
||||
"sap-ai-core": {
|
||||
id: "sap-ai-core",
|
||||
key: "sapAiCoreServiceKey",
|
||||
name: "SAP AI Core",
|
||||
},
|
||||
synthetic: {
|
||||
id: "synthetic",
|
||||
key: "syntheticApiKey",
|
||||
name: "Synthetic",
|
||||
},
|
||||
}
|
||||
|
||||
/** Providers that have no equivalent in the new CLI backend */
|
||||
export const UNSUPPORTED_PROVIDERS = new Set([
|
||||
"fake-ai",
|
||||
"human-relay",
|
||||
"vscode-lm",
|
||||
"claude-code",
|
||||
"openai-codex",
|
||||
"qwen-code",
|
||||
"virtual-quota-fallback",
|
||||
"glama",
|
||||
"roo",
|
||||
"nano-gpt",
|
||||
"poe",
|
||||
"aihubmix",
|
||||
"apertis",
|
||||
"zenmux",
|
||||
])
|
||||
|
||||
/** Built-in default mode slugs that should not be migrated */
|
||||
export const DEFAULT_MODE_SLUGS = new Set(["code", "build", "architect", "ask", "debug", "orchestrator", "review"])
|
||||
@@ -27,7 +27,7 @@ export function buildCspString(cspSource: string, nonce: string, port?: number):
|
||||
`style-src 'unsafe-inline' ${cspSource}`,
|
||||
`script-src 'nonce-${nonce}' 'wasm-unsafe-eval'`,
|
||||
`font-src ${cspSource}`,
|
||||
`connect-src ${connectSrc}`,
|
||||
`connect-src ${cspSource} ${connectSrc}`,
|
||||
`img-src ${cspSource} data: https:`,
|
||||
]
|
||||
return joinCspDirectives(directives)
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
import { describe, it, expect } from "bun:test"
|
||||
import { dict as appEn } from "../../webview-ui/src/i18n/en"
|
||||
import { dict as appZh } from "../../webview-ui/src/i18n/zh"
|
||||
import { dict as appZht } from "../../webview-ui/src/i18n/zht"
|
||||
import { dict as appKo } from "../../webview-ui/src/i18n/ko"
|
||||
import { dict as appDe } from "../../webview-ui/src/i18n/de"
|
||||
import { dict as appEs } from "../../webview-ui/src/i18n/es"
|
||||
import { dict as appFr } from "../../webview-ui/src/i18n/fr"
|
||||
import { dict as appDa } from "../../webview-ui/src/i18n/da"
|
||||
import { dict as appJa } from "../../webview-ui/src/i18n/ja"
|
||||
import { dict as appPl } from "../../webview-ui/src/i18n/pl"
|
||||
import { dict as appRu } from "../../webview-ui/src/i18n/ru"
|
||||
import { dict as appAr } from "../../webview-ui/src/i18n/ar"
|
||||
import { dict as appNo } from "../../webview-ui/src/i18n/no"
|
||||
import { dict as appBr } from "../../webview-ui/src/i18n/br"
|
||||
import { dict as appTh } from "../../webview-ui/src/i18n/th"
|
||||
import { dict as appBs } from "../../webview-ui/src/i18n/bs"
|
||||
import { dict as amEn } from "../../webview-ui/agent-manager/i18n/en"
|
||||
import { dict as amZh } from "../../webview-ui/agent-manager/i18n/zh"
|
||||
import { dict as amZht } from "../../webview-ui/agent-manager/i18n/zht"
|
||||
import { dict as amKo } from "../../webview-ui/agent-manager/i18n/ko"
|
||||
import { dict as amDe } from "../../webview-ui/agent-manager/i18n/de"
|
||||
import { dict as amEs } from "../../webview-ui/agent-manager/i18n/es"
|
||||
import { dict as amFr } from "../../webview-ui/agent-manager/i18n/fr"
|
||||
import { dict as amDa } from "../../webview-ui/agent-manager/i18n/da"
|
||||
import { dict as amJa } from "../../webview-ui/agent-manager/i18n/ja"
|
||||
import { dict as amPl } from "../../webview-ui/agent-manager/i18n/pl"
|
||||
import { dict as amRu } from "../../webview-ui/agent-manager/i18n/ru"
|
||||
import { dict as amAr } from "../../webview-ui/agent-manager/i18n/ar"
|
||||
import { dict as amNo } from "../../webview-ui/agent-manager/i18n/no"
|
||||
import { dict as amBr } from "../../webview-ui/agent-manager/i18n/br"
|
||||
import { dict as amTh } from "../../webview-ui/agent-manager/i18n/th"
|
||||
import { dict as amBs } from "../../webview-ui/agent-manager/i18n/bs"
|
||||
|
||||
const PREFIX = "agentManager."
|
||||
|
||||
const locales = {
|
||||
en: amEn,
|
||||
zh: amZh,
|
||||
zht: amZht,
|
||||
ko: amKo,
|
||||
de: amDe,
|
||||
es: amEs,
|
||||
fr: amFr,
|
||||
da: amDa,
|
||||
ja: amJa,
|
||||
pl: amPl,
|
||||
ru: amRu,
|
||||
ar: amAr,
|
||||
no: amNo,
|
||||
br: amBr,
|
||||
th: amTh,
|
||||
bs: amBs,
|
||||
}
|
||||
|
||||
const appLocales = {
|
||||
en: appEn,
|
||||
zh: appZh,
|
||||
zht: appZht,
|
||||
ko: appKo,
|
||||
de: appDe,
|
||||
es: appEs,
|
||||
fr: appFr,
|
||||
da: appDa,
|
||||
ja: appJa,
|
||||
pl: appPl,
|
||||
ru: appRu,
|
||||
ar: appAr,
|
||||
no: appNo,
|
||||
br: appBr,
|
||||
th: appTh,
|
||||
bs: appBs,
|
||||
}
|
||||
|
||||
describe("Agent Manager i18n split", () => {
|
||||
it("keeps agent manager keys out of general locale dictionaries", () => {
|
||||
for (const [locale, dict] of Object.entries(appLocales)) {
|
||||
const keys = Object.keys(dict)
|
||||
expect(
|
||||
keys.some((key) => key.startsWith(PREFIX)),
|
||||
`locale ${locale} contains agent manager keys`,
|
||||
).toBeFalse()
|
||||
}
|
||||
})
|
||||
|
||||
it("keeps every agent manager locale dictionary scoped to agentManager.* keys", () => {
|
||||
for (const [locale, dict] of Object.entries(locales)) {
|
||||
const keys = Object.keys(dict)
|
||||
expect(keys.length, `locale ${locale} should have agent manager keys`).toBeGreaterThan(0)
|
||||
const invalid = keys.filter((key) => !key.startsWith(PREFIX))
|
||||
expect(invalid, `locale ${locale} has non-agent-manager keys`).toEqual([])
|
||||
}
|
||||
})
|
||||
|
||||
it("contains required core keys in every locale", () => {
|
||||
const required = [
|
||||
"agentManager.local",
|
||||
"agentManager.session.new",
|
||||
"agentManager.apply.error",
|
||||
"agentManager.import.failed",
|
||||
]
|
||||
|
||||
for (const [locale, dict] of Object.entries(locales)) {
|
||||
for (const key of required) {
|
||||
expect((dict as Record<string, string>)[key], `missing key ${key} in locale ${locale}`).toBeDefined()
|
||||
}
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -67,6 +67,11 @@ describe("buildCspString", () => {
|
||||
expect(result).not.toContain(":*")
|
||||
})
|
||||
|
||||
it("includes cspSource in connect-src for source map loading", () => {
|
||||
const result = buildCspString(cspSource, nonce)
|
||||
expect(result).toMatch(new RegExp(`connect-src\\s+${cspSource.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`))
|
||||
})
|
||||
|
||||
it("joins directives with semicolons", () => {
|
||||
const result = buildCspString(cspSource, nonce)
|
||||
const parts = result.split(";")
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
import { test, expect, type Page } from "@playwright/test"
|
||||
import { platform } from "node:os"
|
||||
|
||||
const IS_DARWIN = platform() === "darwin"
|
||||
|
||||
// Screenshot baselines are captured on Linux CI — font rendering and anti-aliasing
|
||||
// differ on macOS, which causes false-positive diffs. Skip the entire suite there.
|
||||
if (IS_DARWIN) {
|
||||
console.warn("Visual regression tests must be run on CI, skipping on local macOS.")
|
||||
test.skip()
|
||||
}
|
||||
|
||||
type Story = {
|
||||
id: string
|
||||
title: string
|
||||
name: string
|
||||
}
|
||||
|
||||
type StoriesIndex = {
|
||||
stories?: Record<string, Story>
|
||||
entries?: Record<string, Story>
|
||||
}
|
||||
|
||||
const STORYBOOK_URL = "http://localhost:6007"
|
||||
|
||||
// Fetched once per worker process — cheap HTTP call to the already-running Storybook
|
||||
async function fetchStories(): Promise<Story[]> {
|
||||
const res = await fetch(`${STORYBOOK_URL}/index.json`).catch(() => fetch(`${STORYBOOK_URL}/stories.json`))
|
||||
if (!res.ok) throw new Error(`Storybook index fetch failed: ${res.status} ${res.statusText}`)
|
||||
const data = (await res.json()) as StoriesIndex
|
||||
const map = data.entries ?? data.stories ?? {}
|
||||
return Object.values(map).filter((s) => s.id && !s.id.endsWith("--docs"))
|
||||
}
|
||||
|
||||
async function disableAnimations(page: Page) {
|
||||
await page.addStyleTag({
|
||||
content: `
|
||||
*, *::before, *::after {
|
||||
animation-duration: 0s !important;
|
||||
animation-delay: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
transition-delay: 0s !important;
|
||||
}
|
||||
`,
|
||||
})
|
||||
}
|
||||
|
||||
// Stories to skip from visual regression (add IDs here if needed)
|
||||
const SKIP = new Set<string>([])
|
||||
|
||||
// Use test.describe + beforeAll to avoid top-level await which breaks
|
||||
// on Node.js versions with strict ESM/CJS boundaries.
|
||||
test.describe("Visual Regression", () => {
|
||||
let stories: Story[] = []
|
||||
|
||||
test.beforeAll(async () => {
|
||||
if (IS_DARWIN) return
|
||||
stories = (await fetchStories()).filter((s) => !SKIP.has(s.id))
|
||||
})
|
||||
|
||||
test("all stories", async ({ page }) => {
|
||||
if (IS_DARWIN) return
|
||||
for (const story of stories) {
|
||||
// Use kilo-vscode theme by default (matched to the preview initialGlobals)
|
||||
await page.goto(
|
||||
`/iframe.html?id=${story.id}&viewMode=story&globals=colorScheme:dark;theme:kilo-vscode;vscodeTheme:dark-modern`,
|
||||
{ waitUntil: "load" },
|
||||
)
|
||||
await disableAnimations(page)
|
||||
await page.waitForSelector("#storybook-root *", { state: "attached" })
|
||||
|
||||
const [component, variant] = story.id.split("--")
|
||||
const root = page.locator("#storybook-root")
|
||||
await expect(root).toHaveScreenshot([component!, `${variant}.png`])
|
||||
}
|
||||
})
|
||||
})
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:04332222bf7bf3680954f967414f93e9e3d03747961fada79cd32d4a5e2a1431
|
||||
size 10279
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ee4898a628110edf572fa27433bbb905d260225be0dd2154ccdfd4e4a2ea4c1e
|
||||
size 4415
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4b6d383088e69f94aeed3e9291092d1278f8346b2d50889bd83ecc72db5d13b7
|
||||
size 2846
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b1c5266bca40764f48d0cdefa3398083708ed7deb354acf8a5a296f9f9e0b2a6
|
||||
size 9005
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e92994ecc3e78cc5dd1a465b93a049e877ca30cc00a285deb4628cff287eba7b
|
||||
size 28275
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cd8a53356f0aa0df5c07246296dc20273f5380a012cd579885b1974e3aeb99e1
|
||||
size 8496
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:fa7bddaa15cf80565ef5b639bfe2de8d2f373019da4b72210c8ea82aaf47913f
|
||||
size 10384
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:64ff66248b1c07209757eb6e27ccac4967650b144317ee21076ba82c129bc17b
|
||||
size 8846
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "محلي",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "الجلسات",
|
||||
"agentManager.notGitRepo": "ليس مستودع git",
|
||||
"agentManager.worktree.settings": "إعدادات Worktree",
|
||||
"agentManager.worktree.new": "Worktree جديد",
|
||||
"agentManager.worktree.setupScript": "سكربت إعداد Worktree",
|
||||
"agentManager.worktree.delete": "حذف Worktree",
|
||||
"agentManager.worktree.stale": "قديم",
|
||||
"agentManager.worktree.staleTooltip": "مفقود على القرص أو لم يعد git worktree يتتبعه",
|
||||
"agentManager.worktree.removeStale": "إزالة Worktree القديم",
|
||||
"agentManager.worktree.doubleClickRename": "انقر مرتين لإعادة التسمية",
|
||||
"agentManager.worktree.versions": "{{count}} نسخ",
|
||||
"agentManager.worktree.advancedOptions": "خيارات Worktree متقدمة",
|
||||
"agentManager.hoverCard.branch": "الفرع",
|
||||
"agentManager.hoverCard.base": "الأساس",
|
||||
"agentManager.hoverCard.sessions": "الجلسات",
|
||||
"agentManager.hoverCard.files": "الملفات",
|
||||
"agentManager.hoverCard.changes": "التغييرات",
|
||||
"agentManager.hoverCard.commits": "عمليات الالتزام",
|
||||
"agentManager.session.new": "جلسة جديدة",
|
||||
"agentManager.session.untitled": "بدون عنوان",
|
||||
"agentManager.session.newSession": "جلسة جديدة",
|
||||
"agentManager.session.openInWorktree": "فتح في Worktree",
|
||||
"agentManager.session.readonly": "جلسة للقراءة فقط",
|
||||
"agentManager.session.noSessions": "لا توجد جلسات مفتوحة",
|
||||
"agentManager.tab.close": "إغلاق",
|
||||
"agentManager.tab.closeTab": "إغلاق علامة التبويب",
|
||||
"agentManager.tab.terminal": "الطرفية",
|
||||
"agentManager.tab.openTerminal": "فتح الطرفية",
|
||||
"agentManager.setup.failed": "فشل إعداد مساحة العمل",
|
||||
"agentManager.setup.settingUp": "جارٍ إعداد مساحة العمل",
|
||||
"agentManager.shortcuts.title": "اختصارات لوحة المفاتيح",
|
||||
"agentManager.shortcuts.category.sidebar": "الشريط الجانبي",
|
||||
"agentManager.shortcuts.category.tabs": "علامات التبويب",
|
||||
"agentManager.shortcuts.category.terminal": "الطرفية",
|
||||
"agentManager.shortcuts.category.global": "عام",
|
||||
"agentManager.shortcuts.previousItem": "العنصر السابق",
|
||||
"agentManager.shortcuts.nextItem": "العنصر التالي",
|
||||
"agentManager.shortcuts.newWorktree": "Worktree جديد",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree متقدم",
|
||||
"agentManager.shortcuts.deleteWorktree": "حذف Worktree",
|
||||
"agentManager.shortcuts.previousTab": "علامة التبويب السابقة",
|
||||
"agentManager.shortcuts.nextTab": "علامة التبويب التالية",
|
||||
"agentManager.shortcuts.newTab": "علامة تبويب جديدة",
|
||||
"agentManager.shortcuts.closeTab": "إغلاق علامة التبويب",
|
||||
"agentManager.shortcuts.toggleTerminal": "تبديل الطرفية",
|
||||
"agentManager.shortcuts.focusPanel": "تركيز اللوحة",
|
||||
"agentManager.shortcuts.openAgentManager": "فتح Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "حذف Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "حذف Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "؟ سيؤدي هذا إلى إزالة Worktree من القرص وفصل جميع الجلسات.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "إلغاء",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "حذف",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "إزالة Worktree القديم",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "إزالة Worktree القديم ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"؟ سيؤدي هذا إلى إزالة الربط في Agent Manager فقط وترك الملفات على القرص دون تغيير.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "إلغاء",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "إزالة Worktree القديم",
|
||||
|
||||
"agentManager.dialog.openWorktree": "شجرة عمل جديدة",
|
||||
"agentManager.dialog.tab.new": "جديد",
|
||||
"agentManager.dialog.tab.import": "استيراد",
|
||||
"agentManager.dialog.namePlaceholder": "اسم Worktree (اختياري)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "اكتب رسالة (⌘Enter للإرسال)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "اكتب رسالة (Ctrl+Enter للإرسال)",
|
||||
"agentManager.dialog.advancedOptions": "خيارات متقدمة",
|
||||
"agentManager.dialog.branchName": "اسم الفرع",
|
||||
"agentManager.dialog.branchNamePlaceholder": "يتم إنشاؤه تلقائيًا",
|
||||
"agentManager.dialog.baseBranch": "الفرع الأساسي",
|
||||
"agentManager.dialog.searchBranches": "البحث في الفروع...",
|
||||
"agentManager.dialog.branchBadge.default": "افتراضي",
|
||||
"agentManager.dialog.branchBadge.remote": "بعيد",
|
||||
"agentManager.dialog.versions": "النسخ",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees ستعمل بالتوازي",
|
||||
"agentManager.dialog.compareModels": "مقارنة النماذج",
|
||||
"agentManager.dialog.compareModels.searchModels": "البحث عن النماذج...",
|
||||
"agentManager.dialog.creating": "جارٍ الإنشاء...",
|
||||
"agentManager.dialog.createWorkspace": "إنشاء شجرة العمل",
|
||||
"agentManager.dialog.removeImage": "إزالة الصورة",
|
||||
"agentManager.dialog.advanced": "متقدم...",
|
||||
|
||||
"agentManager.diff.toggle": "تبديل الفرق",
|
||||
"agentManager.diff.openFile": "فتح الملف",
|
||||
"agentManager.apply.button": "تطبيق محليًا",
|
||||
"agentManager.apply.globalButton": "تطبيق",
|
||||
"agentManager.apply.tooltip": "تطبيق تغييرات شجرة العمل المحددة على الفرع المحلي",
|
||||
"agentManager.apply.dialogTitle": "تطبيق التغييرات على الفرع المحلي",
|
||||
"agentManager.apply.confirm": "تطبيق الآن",
|
||||
"agentManager.apply.retry": "إعادة محاولة التطبيق",
|
||||
"agentManager.apply.previewTitle": "تطبيق هذه التغييرات على الفرع المحلي؟",
|
||||
"agentManager.apply.previewSummary": "{{files}} ملفات، +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} من {{total}} ملفات محددة",
|
||||
"agentManager.apply.selectAll": "تحديد الكل",
|
||||
"agentManager.apply.selectNone": "إلغاء تحديد الكل",
|
||||
"agentManager.apply.moreFiles": "+{{count}} المزيد",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} المزيد)",
|
||||
"agentManager.apply.checking": "جارٍ التحقق...",
|
||||
"agentManager.apply.applying": "جارٍ التطبيق...",
|
||||
"agentManager.apply.success": "تم تطبيق التغييرات",
|
||||
"agentManager.apply.conflict": "التطبيق يحتوي على تعارضات",
|
||||
"agentManager.apply.conflictToast": "{{count}} تعارضات في {{files}} ملفات. راجع التفاصيل في التطبيق.",
|
||||
"agentManager.apply.error": "فشل التطبيق",
|
||||
"agentManager.apply.conflictsTitle": "التعارضات",
|
||||
"agentManager.apply.unknownFile": "ملف غير محلول",
|
||||
"agentManager.apply.reason.index": "الملف المحلي يختلف عن النسخة المتوقعة",
|
||||
"agentManager.apply.reason.patch": "لا يمكن تطبيق التصحيح بشكل نظيف",
|
||||
"agentManager.apply.reason.contents": "لا يمكن قراءة محتويات الملف المحلي الحالي",
|
||||
"agentManager.apply.reason.unknown": "تم اكتشاف تعارض",
|
||||
"agentManager.apply.inline.success": "تم التطبيق",
|
||||
"agentManager.apply.inline.conflict": "تعارضات",
|
||||
"agentManager.apply.inline.error": "فشل",
|
||||
"agentManager.shortcuts.toggleDiff": "تبديل لوحة الفرق",
|
||||
"agentManager.shortcuts.category.quickSwitch": "التبديل السريع",
|
||||
"agentManager.shortcuts.jumpToItem": "الانتقال إلى العنصر 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "إرسال الكل إلى الدردشة",
|
||||
"agentManager.review.sendAllToChatWithCount": "إرسال الكل إلى الدردشة ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "تعليق على السطر {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "تعديل التعليق على السطر {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "اترك تعليقًا...",
|
||||
"agentManager.review.commentAction": "تعليق",
|
||||
"agentManager.review.sendToChat": "إرسال إلى الدردشة",
|
||||
"agentManager.review.collapsedOnly": "{{count}} مطوي",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} مطوي، {{large}} كبير",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "الصق رابط PR...",
|
||||
"agentManager.import.open": "فتح",
|
||||
"agentManager.import.branches": "الفروع",
|
||||
"agentManager.import.selectBranch": "اختر فرعًا...",
|
||||
"agentManager.import.loading": "جارٍ التحميل...",
|
||||
"agentManager.import.loadingBranches": "جارٍ تحميل الفروع...",
|
||||
"agentManager.import.noMatchingBranches": "لا توجد فروع مطابقة",
|
||||
"agentManager.import.noBranchesFound": "لم يتم العثور على فروع.",
|
||||
"agentManager.import.noBranchesHint": "الصق رابط PR أعلاه أو أنشئ Worktree جديدًا.",
|
||||
"agentManager.import.failed": "فشل الاستيراد",
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSÕES",
|
||||
"agentManager.notGitRepo": "Não é um repositório git",
|
||||
"agentManager.worktree.settings": "Configurações do Worktree",
|
||||
"agentManager.worktree.new": "Novo Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuração do Worktree",
|
||||
"agentManager.worktree.delete": "Excluir Worktree",
|
||||
"agentManager.worktree.stale": "Obsoleto",
|
||||
"agentManager.worktree.staleTooltip": "Ausente no disco ou não é mais rastreado pelo git worktree",
|
||||
"agentManager.worktree.removeStale": "Remover Worktree obsoleto",
|
||||
"agentManager.worktree.doubleClickRename": "Clique duplo para renomear",
|
||||
"agentManager.worktree.versions": "{{count}} versões",
|
||||
"agentManager.worktree.advancedOptions": "Opções avançadas de Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessões",
|
||||
"agentManager.hoverCard.files": "Arquivos",
|
||||
"agentManager.hoverCard.changes": "Alterações",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nova sessão",
|
||||
"agentManager.session.untitled": "Sem título",
|
||||
"agentManager.session.newSession": "Nova Sessão",
|
||||
"agentManager.session.openInWorktree": "Abrir no Worktree",
|
||||
"agentManager.session.readonly": "Sessão somente leitura",
|
||||
"agentManager.session.noSessions": "Nenhuma sessão aberta",
|
||||
"agentManager.tab.close": "Fechar",
|
||||
"agentManager.tab.closeTab": "Fechar aba",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Abrir Terminal",
|
||||
"agentManager.setup.failed": "Falha na configuração do workspace",
|
||||
"agentManager.setup.settingUp": "Configurando workspace",
|
||||
"agentManager.shortcuts.title": "Atalhos de Teclado",
|
||||
"agentManager.shortcuts.category.sidebar": "Barra lateral",
|
||||
"agentManager.shortcuts.category.tabs": "Abas",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Item anterior",
|
||||
"agentManager.shortcuts.nextItem": "Próximo item",
|
||||
"agentManager.shortcuts.newWorktree": "Novo Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avançado",
|
||||
"agentManager.shortcuts.deleteWorktree": "Excluir Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Aba anterior",
|
||||
"agentManager.shortcuts.nextTab": "Próxima aba",
|
||||
"agentManager.shortcuts.newTab": "Nova aba",
|
||||
"agentManager.shortcuts.closeTab": "Fechar aba",
|
||||
"agentManager.shortcuts.toggleTerminal": "Alternar terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focar painel",
|
||||
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Excluir Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Excluir Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Isso remove o Worktree do disco e desassocia todas as sessões.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Excluir",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Remover Worktree obsoleto",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Remover Worktree obsoleto ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Isso remove apenas o mapeamento no Agent Manager e não altera os arquivos no disco.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Remover Worktree obsoleto",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Novo Worktree",
|
||||
"agentManager.dialog.tab.new": "Novo",
|
||||
"agentManager.dialog.tab.import": "Importar",
|
||||
"agentManager.dialog.namePlaceholder": "Nome do Worktree (opcional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Digite uma mensagem (⌘Enter para enviar)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Digite uma mensagem (Ctrl+Enter para enviar)",
|
||||
"agentManager.dialog.advancedOptions": "Opções avançadas",
|
||||
"agentManager.dialog.branchName": "Nome do branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "gerado automaticamente",
|
||||
"agentManager.dialog.baseBranch": "Branch base",
|
||||
"agentManager.dialog.searchBranches": "Buscar branches...",
|
||||
"agentManager.dialog.branchBadge.default": "padrão",
|
||||
"agentManager.dialog.branchBadge.remote": "remoto",
|
||||
"agentManager.dialog.versions": "Versões",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees serão executados em paralelo",
|
||||
"agentManager.dialog.compareModels": "Comparar Modelos",
|
||||
"agentManager.dialog.compareModels.searchModels": "Pesquisar modelos...",
|
||||
"agentManager.dialog.creating": "Criando...",
|
||||
"agentManager.dialog.createWorkspace": "Criar Worktree",
|
||||
"agentManager.dialog.removeImage": "Remover imagem",
|
||||
"agentManager.dialog.advanced": "Avançado...",
|
||||
|
||||
"agentManager.diff.toggle": "Alternar diff",
|
||||
"agentManager.diff.openFile": "Abrir arquivo",
|
||||
"agentManager.apply.button": "Aplicar localmente",
|
||||
"agentManager.apply.globalButton": "Aplicar",
|
||||
"agentManager.apply.tooltip": "Aplicar alterações da worktree selecionada na branch local",
|
||||
"agentManager.apply.dialogTitle": "Aplicar alterações na branch local",
|
||||
"agentManager.apply.confirm": "Aplicar agora",
|
||||
"agentManager.apply.retry": "Tentar aplicar novamente",
|
||||
"agentManager.apply.previewTitle": "Aplicar essas alterações na branch local?",
|
||||
"agentManager.apply.previewSummary": "{{files}} arquivos, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} de {{total}} arquivos selecionados",
|
||||
"agentManager.apply.selectAll": "Selecionar todos",
|
||||
"agentManager.apply.selectNone": "Desmarcar todos",
|
||||
"agentManager.apply.moreFiles": "+{{count}} mais",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} mais)",
|
||||
"agentManager.apply.checking": "Verificando...",
|
||||
"agentManager.apply.applying": "Aplicando...",
|
||||
"agentManager.apply.success": "Alterações aplicadas",
|
||||
"agentManager.apply.conflict": "A aplicação tem conflitos",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflitos em {{files}} arquivos. Revise os detalhes em Aplicar.",
|
||||
"agentManager.apply.error": "A aplicação falhou",
|
||||
"agentManager.apply.conflictsTitle": "Conflitos",
|
||||
"agentManager.apply.unknownFile": "Arquivo não resolvido",
|
||||
"agentManager.apply.reason.index": "O arquivo local difere da versão esperada",
|
||||
"agentManager.apply.reason.patch": "O patch não pode ser aplicado de forma limpa",
|
||||
"agentManager.apply.reason.contents": "Não é possível ler o conteúdo do arquivo local atual",
|
||||
"agentManager.apply.reason.unknown": "Conflito detectado",
|
||||
"agentManager.apply.inline.success": "Aplicado",
|
||||
"agentManager.apply.inline.conflict": "Conflitos",
|
||||
"agentManager.apply.inline.error": "Falhou",
|
||||
"agentManager.shortcuts.toggleDiff": "Alternar painel de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Troca rápida",
|
||||
"agentManager.shortcuts.jumpToItem": "Ir para o item 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Enviar tudo para o chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Enviar tudo para o chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comentar na linha {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Editar comentário na linha {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Deixe um comentário...",
|
||||
"agentManager.review.commentAction": "Comentar",
|
||||
"agentManager.review.sendToChat": "Enviar para o chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} recolhidos",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} recolhidos, {{large}} grandes",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Cole a URL do PR...",
|
||||
"agentManager.import.open": "Abrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Selecionar branch...",
|
||||
"agentManager.import.loading": "Carregando...",
|
||||
"agentManager.import.loadingBranches": "Carregando branches...",
|
||||
"agentManager.import.noMatchingBranches": "Nenhum branch correspondente",
|
||||
"agentManager.import.noBranchesFound": "Nenhum branch encontrado.",
|
||||
"agentManager.import.noBranchesHint": "Cole uma URL de PR acima ou crie um novo Worktree.",
|
||||
"agentManager.import.failed": "Falha na importação",
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "lokalno",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESIJE",
|
||||
"agentManager.notGitRepo": "Nije git repozitorij",
|
||||
"agentManager.worktree.settings": "Postavke Worktree-a",
|
||||
"agentManager.worktree.new": "Novi Worktree",
|
||||
"agentManager.worktree.setupScript": "Skripta za postavljanje Worktree-a",
|
||||
"agentManager.worktree.delete": "Obriši Worktree",
|
||||
"agentManager.worktree.stale": "Zastario",
|
||||
"agentManager.worktree.staleTooltip": "Nedostaje na disku ili ga git worktree više ne prati",
|
||||
"agentManager.worktree.removeStale": "Ukloni zastarjeli Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dvostruki klik za preimenovanje",
|
||||
"agentManager.worktree.versions": "{{count}} verzija",
|
||||
"agentManager.worktree.advancedOptions": "Napredne opcije Worktree-a",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Baza",
|
||||
"agentManager.hoverCard.sessions": "Sesije",
|
||||
"agentManager.hoverCard.files": "Datoteke",
|
||||
"agentManager.hoverCard.changes": "Promjene",
|
||||
"agentManager.hoverCard.commits": "Commiti",
|
||||
"agentManager.session.new": "Nova sesija",
|
||||
"agentManager.session.untitled": "Bez naslova",
|
||||
"agentManager.session.newSession": "Nova sesija",
|
||||
"agentManager.session.openInWorktree": "Otvori u Worktree-u",
|
||||
"agentManager.session.readonly": "Sesija samo za čitanje",
|
||||
"agentManager.session.noSessions": "Nema otvorenih sesija",
|
||||
"agentManager.tab.close": "Zatvori",
|
||||
"agentManager.tab.closeTab": "Zatvori karticu",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Otvori Terminal",
|
||||
"agentManager.setup.failed": "Postavljanje radnog prostora neuspješno",
|
||||
"agentManager.setup.settingUp": "Postavljanje radnog prostora",
|
||||
"agentManager.shortcuts.title": "Prečice na tastaturi",
|
||||
"agentManager.shortcuts.category.sidebar": "Bočna traka",
|
||||
"agentManager.shortcuts.category.tabs": "Kartice",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Globalno",
|
||||
"agentManager.shortcuts.previousItem": "Prethodni element",
|
||||
"agentManager.shortcuts.nextItem": "Sljedeći element",
|
||||
"agentManager.shortcuts.newWorktree": "Novi Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Napredni Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Obriši Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Prethodna kartica",
|
||||
"agentManager.shortcuts.nextTab": "Sljedeća kartica",
|
||||
"agentManager.shortcuts.newTab": "Nova kartica",
|
||||
"agentManager.shortcuts.closeTab": "Zatvori karticu",
|
||||
"agentManager.shortcuts.toggleTerminal": "Prebaci terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokusiraj panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Otvori Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Obriši Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Obriši Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Ovo uklanja Worktree sa diska i odvezuje sve sesije.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Otkaži",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Obriši",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Ukloni zastarjeli Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Ukloni zastarjeli Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Ovo uklanja samo mapiranje u Agent Manageru i ne dira datoteke na disku.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Otkaži",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Ukloni zastarjeli Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Novi worktree",
|
||||
"agentManager.dialog.tab.new": "Novo",
|
||||
"agentManager.dialog.tab.import": "Uvezi",
|
||||
"agentManager.dialog.namePlaceholder": "Naziv Worktree-a (opcionalno)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Unesite poruku (⌘Enter za slanje)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Unesite poruku (Ctrl+Enter za slanje)",
|
||||
"agentManager.dialog.advancedOptions": "Napredne opcije",
|
||||
"agentManager.dialog.branchName": "Naziv brancha",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatski generirano",
|
||||
"agentManager.dialog.baseBranch": "Osnovni branch",
|
||||
"agentManager.dialog.searchBranches": "Pretraži brancheve...",
|
||||
"agentManager.dialog.branchBadge.default": "zadano",
|
||||
"agentManager.dialog.branchBadge.remote": "udaljeno",
|
||||
"agentManager.dialog.versions": "Verzije",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktree-ova će se pokrenuti paralelno",
|
||||
"agentManager.dialog.compareModels": "Uporedi modele",
|
||||
"agentManager.dialog.compareModels.searchModels": "Pretraži modele...",
|
||||
"agentManager.dialog.creating": "Kreiranje...",
|
||||
"agentManager.dialog.createWorkspace": "Kreiraj worktree",
|
||||
"agentManager.dialog.removeImage": "Ukloni sliku",
|
||||
"agentManager.dialog.advanced": "Napredno...",
|
||||
|
||||
"agentManager.diff.toggle": "Prebaci diff",
|
||||
"agentManager.diff.openFile": "Otvori datoteku",
|
||||
"agentManager.apply.button": "Primijeni lokalno",
|
||||
"agentManager.apply.globalButton": "Primijeni",
|
||||
"agentManager.apply.tooltip": "Primijeni promjene odabranog radnog stabla na lokalnu granu",
|
||||
"agentManager.apply.dialogTitle": "Primijeni promjene na lokalnu granu",
|
||||
"agentManager.apply.confirm": "Primijeni sada",
|
||||
"agentManager.apply.retry": "Ponovo pokušaj primjenu",
|
||||
"agentManager.apply.previewTitle": "Primijeniti ove promjene na lokalnu granu?",
|
||||
"agentManager.apply.previewSummary": "{{files}} datoteka, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} od {{total}} datoteka odabrano",
|
||||
"agentManager.apply.selectAll": "Odaberi sve",
|
||||
"agentManager.apply.selectNone": "Poništi odabir",
|
||||
"agentManager.apply.moreFiles": "+{{count}} više",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} više)",
|
||||
"agentManager.apply.checking": "Provjera...",
|
||||
"agentManager.apply.applying": "Primjenjivanje...",
|
||||
"agentManager.apply.success": "Promjene primijenjene",
|
||||
"agentManager.apply.conflict": "Primjena ima konflikte",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikata u {{files}} datoteka. Pregledajte detalje u Primijeni.",
|
||||
"agentManager.apply.error": "Primjena nije uspjela",
|
||||
"agentManager.apply.conflictsTitle": "Konflikti",
|
||||
"agentManager.apply.unknownFile": "Nerazriješena datoteka",
|
||||
"agentManager.apply.reason.index": "Lokalna datoteka se razlikuje od očekivane verzije",
|
||||
"agentManager.apply.reason.patch": "Zakrpa se ne može čisto primijeniti",
|
||||
"agentManager.apply.reason.contents": "Nije moguće pročitati sadržaj trenutne lokalne datoteke",
|
||||
"agentManager.apply.reason.unknown": "Otkriven konflikt",
|
||||
"agentManager.apply.inline.success": "Primijenjeno",
|
||||
"agentManager.apply.inline.conflict": "Konflikti",
|
||||
"agentManager.apply.inline.error": "Neuspjelo",
|
||||
"agentManager.shortcuts.toggleDiff": "Prebaci panel za diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Brzo prebacivanje",
|
||||
"agentManager.shortcuts.jumpToItem": "Idi na stavku 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Pošalji sve u chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Pošalji sve u chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Komentar na liniji {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Uredi komentar na liniji {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Ostavi komentar...",
|
||||
"agentManager.review.commentAction": "Komentariši",
|
||||
"agentManager.review.sendToChat": "Pošalji u chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} sažeto",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} sažeto, {{large}} velikih",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Zalijepite PR URL...",
|
||||
"agentManager.import.open": "Otvori",
|
||||
"agentManager.import.branches": "Branchevi",
|
||||
"agentManager.import.selectBranch": "Odaberite branch...",
|
||||
"agentManager.import.loading": "Učitavanje...",
|
||||
"agentManager.import.loadingBranches": "Učitavanje brancheva...",
|
||||
"agentManager.import.noMatchingBranches": "Nema odgovarajućih brancheva",
|
||||
"agentManager.import.noBranchesFound": "Nisu pronađeni branchevi.",
|
||||
"agentManager.import.noBranchesHint": "Zalijepite PR URL iznad ili kreirajte novi Worktree.",
|
||||
"agentManager.import.failed": "Uvoz neuspješan",
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONER",
|
||||
"agentManager.notGitRepo": "Ikke et git-repository",
|
||||
"agentManager.worktree.settings": "Worktree-indstillinger",
|
||||
"agentManager.worktree.new": "Nyt Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-opsætningsscript",
|
||||
"agentManager.worktree.delete": "Slet Worktree",
|
||||
"agentManager.worktree.stale": "Forældet",
|
||||
"agentManager.worktree.staleTooltip": "Mangler på disken eller spores ikke længere af git worktree",
|
||||
"agentManager.worktree.removeStale": "Fjern forældet Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dobbeltklik for at omdøbe",
|
||||
"agentManager.worktree.versions": "{{count}} versioner",
|
||||
"agentManager.worktree.advancedOptions": "Avancerede Worktree-indstillinger",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessioner",
|
||||
"agentManager.hoverCard.files": "Filer",
|
||||
"agentManager.hoverCard.changes": "Ændringer",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Ny session",
|
||||
"agentManager.session.untitled": "Uden titel",
|
||||
"agentManager.session.newSession": "Ny session",
|
||||
"agentManager.session.openInWorktree": "Åbn i Worktree",
|
||||
"agentManager.session.readonly": "Skrivebeskyttet session",
|
||||
"agentManager.session.noSessions": "Ingen åbne sessioner",
|
||||
"agentManager.tab.close": "Luk",
|
||||
"agentManager.tab.closeTab": "Luk fane",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Åbn Terminal",
|
||||
"agentManager.setup.failed": "Opsætning af workspace mislykkedes",
|
||||
"agentManager.setup.settingUp": "Opsætter workspace",
|
||||
"agentManager.shortcuts.title": "Tastaturgenveje",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidebjælke",
|
||||
"agentManager.shortcuts.category.tabs": "Faner",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Forrige element",
|
||||
"agentManager.shortcuts.nextItem": "Næste element",
|
||||
"agentManager.shortcuts.newWorktree": "Nyt Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Avanceret Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Slet Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Forrige fane",
|
||||
"agentManager.shortcuts.nextTab": "Næste fane",
|
||||
"agentManager.shortcuts.newTab": "Ny fane",
|
||||
"agentManager.shortcuts.closeTab": "Luk fane",
|
||||
"agentManager.shortcuts.toggleTerminal": "Skift terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokuser panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Åbn Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Slet Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Slet Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og afkobler alle sessioner.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Annuller",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Slet",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Fjern forældet Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Fjern forældet Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dette fjerner kun tilknytningen i Agent Manager og efterlader filer på disken urørt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Annuller",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Fjern forældet Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Ny Worktree",
|
||||
"agentManager.dialog.tab.new": "Ny",
|
||||
"agentManager.dialog.tab.import": "Importér",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfrit)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Skriv en besked (⌘Enter for at sende)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Skriv en besked (Ctrl+Enter for at sende)",
|
||||
"agentManager.dialog.advancedOptions": "Avancerede indstillinger",
|
||||
"agentManager.dialog.branchName": "Branch-navn",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisk genereret",
|
||||
"agentManager.dialog.baseBranch": "Base-branch",
|
||||
"agentManager.dialog.searchBranches": "Søg branches...",
|
||||
"agentManager.dialog.branchBadge.default": "standard",
|
||||
"agentManager.dialog.branchBadge.remote": "fjern",
|
||||
"agentManager.dialog.versions": "Versioner",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees vil køre parallelt",
|
||||
"agentManager.dialog.compareModels": "Sammenlign modeller",
|
||||
"agentManager.dialog.compareModels.searchModels": "Søg modeller...",
|
||||
"agentManager.dialog.creating": "Opretter...",
|
||||
"agentManager.dialog.createWorkspace": "Opret Worktree",
|
||||
"agentManager.dialog.removeImage": "Fjern billede",
|
||||
"agentManager.dialog.advanced": "Avanceret...",
|
||||
|
||||
"agentManager.diff.toggle": "Skift diff",
|
||||
"agentManager.diff.openFile": "Åbn fil",
|
||||
"agentManager.apply.button": "Anvend lokalt",
|
||||
"agentManager.apply.globalButton": "Anvend",
|
||||
"agentManager.apply.tooltip": "Anvend valgte worktree-ændringer på den lokale gren",
|
||||
"agentManager.apply.dialogTitle": "Anvend ændringer på den lokale gren",
|
||||
"agentManager.apply.confirm": "Anvend nu",
|
||||
"agentManager.apply.retry": "Prøv at anvende igen",
|
||||
"agentManager.apply.previewTitle": "Anvend disse ændringer på den lokale gren?",
|
||||
"agentManager.apply.previewSummary": "{{files}} filer, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} af {{total}} filer valgt",
|
||||
"agentManager.apply.selectAll": "Vælg alle",
|
||||
"agentManager.apply.selectNone": "Fravælg alle",
|
||||
"agentManager.apply.moreFiles": "+{{count}} flere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} flere)",
|
||||
"agentManager.apply.checking": "Kontrollerer...",
|
||||
"agentManager.apply.applying": "Anvender...",
|
||||
"agentManager.apply.success": "Ændringer anvendt",
|
||||
"agentManager.apply.conflict": "Anvendelse har konflikter",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikter i {{files}} filer. Gennemgå detaljer i Anvend.",
|
||||
"agentManager.apply.error": "Anvendelse mislykkedes",
|
||||
"agentManager.apply.conflictsTitle": "Konflikter",
|
||||
"agentManager.apply.unknownFile": "Uløst fil",
|
||||
"agentManager.apply.reason.index": "Lokal fil adskiller sig fra den forventede version",
|
||||
"agentManager.apply.reason.patch": "Patch kan ikke anvendes rent",
|
||||
"agentManager.apply.reason.contents": "Kan ikke læse det aktuelle lokale filindhold",
|
||||
"agentManager.apply.reason.unknown": "Konflikt opdaget",
|
||||
"agentManager.apply.inline.success": "Anvendt",
|
||||
"agentManager.apply.inline.conflict": "Konflikter",
|
||||
"agentManager.apply.inline.error": "Mislykkedes",
|
||||
"agentManager.shortcuts.toggleDiff": "Skift diff-panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Hurtigskift",
|
||||
"agentManager.shortcuts.jumpToItem": "Hop til element 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send alt til chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send alt til chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommenter på linje {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Rediger kommentar på linje {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Skriv en kommentar...",
|
||||
"agentManager.review.commentAction": "Kommenter",
|
||||
"agentManager.review.sendToChat": "Send til chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} foldet sammen",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} foldet sammen, {{large}} store",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Indsæt PR URL...",
|
||||
"agentManager.import.open": "Åbn",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Vælg branch...",
|
||||
"agentManager.import.loading": "Indlæser...",
|
||||
"agentManager.import.loadingBranches": "Indlæser branches...",
|
||||
"agentManager.import.noMatchingBranches": "Ingen matchende branches",
|
||||
"agentManager.import.noBranchesFound": "Ingen branches fundet.",
|
||||
"agentManager.import.noBranchesHint": "Indsæt en PR URL ovenfor eller opret et nyt Worktree.",
|
||||
"agentManager.import.failed": "Import mislykkedes",
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SITZUNGEN",
|
||||
"agentManager.notGitRepo": "Kein Git-Repository",
|
||||
"agentManager.worktree.settings": "Worktree-Einstellungen",
|
||||
"agentManager.worktree.new": "Neuer Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-Einrichtungsskript",
|
||||
"agentManager.worktree.delete": "Worktree löschen",
|
||||
"agentManager.worktree.stale": "Veraltet",
|
||||
"agentManager.worktree.staleTooltip": "Fehlt auf der Festplatte oder wird nicht mehr von git worktree verfolgt",
|
||||
"agentManager.worktree.removeStale": "Veralteten Worktree entfernen",
|
||||
"agentManager.worktree.doubleClickRename": "Doppelklick zum Umbenennen",
|
||||
"agentManager.worktree.versions": "{{count}} Versionen",
|
||||
"agentManager.worktree.advancedOptions": "Erweiterte Worktree-Optionen",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Basis",
|
||||
"agentManager.hoverCard.sessions": "Sitzungen",
|
||||
"agentManager.hoverCard.files": "Dateien",
|
||||
"agentManager.hoverCard.changes": "Änderungen",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Neue Sitzung",
|
||||
"agentManager.session.untitled": "Unbenannt",
|
||||
"agentManager.session.newSession": "Neue Sitzung",
|
||||
"agentManager.session.openInWorktree": "In Worktree öffnen",
|
||||
"agentManager.session.readonly": "Schreibgeschützte Sitzung",
|
||||
"agentManager.session.noSessions": "Keine Sitzungen geöffnet",
|
||||
"agentManager.tab.close": "Schließen",
|
||||
"agentManager.tab.closeTab": "Tab schließen",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Terminal öffnen",
|
||||
"agentManager.setup.failed": "Einrichtung des Arbeitsbereichs fehlgeschlagen",
|
||||
"agentManager.setup.settingUp": "Arbeitsbereich wird eingerichtet",
|
||||
"agentManager.shortcuts.title": "Tastenkombinationen",
|
||||
"agentManager.shortcuts.category.sidebar": "Seitenleiste",
|
||||
"agentManager.shortcuts.category.tabs": "Tabs",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Vorheriges Element",
|
||||
"agentManager.shortcuts.nextItem": "Nächstes Element",
|
||||
"agentManager.shortcuts.newWorktree": "Neuer Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Erweiterter Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktree löschen",
|
||||
"agentManager.shortcuts.previousTab": "Vorheriger Tab",
|
||||
"agentManager.shortcuts.nextTab": "Nächster Tab",
|
||||
"agentManager.shortcuts.newTab": "Neuer Tab",
|
||||
"agentManager.shortcuts.closeTab": "Tab schließen",
|
||||
"agentManager.shortcuts.toggleTerminal": "Terminal umschalten",
|
||||
"agentManager.shortcuts.focusPanel": "Panel fokussieren",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Manager öffnen",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktree löschen",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktree löschen ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Dies entfernt den Worktree von der Festplatte und trennt alle Sitzungen.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Abbrechen",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Löschen",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Veralteten Worktree entfernen",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Veralteten Worktree entfernen ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dies entfernt nur die Zuordnung im Agent Manager und lässt die Dateien auf der Festplatte unberührt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Abbrechen",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Veralteten Worktree entfernen",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Neuer Worktree",
|
||||
"agentManager.dialog.tab.new": "Neu",
|
||||
"agentManager.dialog.tab.import": "Importieren",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-Name (optional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Nachricht eingeben (⌘Enter zum Senden)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Nachricht eingeben (Strg+Enter zum Senden)",
|
||||
"agentManager.dialog.advancedOptions": "Erweiterte Optionen",
|
||||
"agentManager.dialog.branchName": "Branch-Name",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisch generiert",
|
||||
"agentManager.dialog.baseBranch": "Basis-Branch",
|
||||
"agentManager.dialog.searchBranches": "Branches suchen...",
|
||||
"agentManager.dialog.branchBadge.default": "Standard",
|
||||
"agentManager.dialog.branchBadge.remote": "Remote",
|
||||
"agentManager.dialog.versions": "Versionen",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees werden parallel ausgeführt",
|
||||
"agentManager.dialog.compareModels": "Modelle vergleichen",
|
||||
"agentManager.dialog.compareModels.searchModels": "Modelle suchen...",
|
||||
"agentManager.dialog.creating": "Wird erstellt...",
|
||||
"agentManager.dialog.createWorkspace": "Worktree erstellen",
|
||||
"agentManager.dialog.removeImage": "Bild entfernen",
|
||||
"agentManager.dialog.advanced": "Erweitert...",
|
||||
|
||||
"agentManager.diff.toggle": "Diff umschalten",
|
||||
"agentManager.diff.openFile": "Datei öffnen",
|
||||
"agentManager.apply.button": "Lokal anwenden",
|
||||
"agentManager.apply.globalButton": "Anwenden",
|
||||
"agentManager.apply.tooltip": "Ausgewählte Worktree-Änderungen auf den lokalen Branch anwenden",
|
||||
"agentManager.apply.dialogTitle": "Änderungen auf den lokalen Branch anwenden",
|
||||
"agentManager.apply.confirm": "Jetzt anwenden",
|
||||
"agentManager.apply.retry": "Anwenden erneut versuchen",
|
||||
"agentManager.apply.previewTitle": "Diese Änderungen auf den lokalen Branch anwenden?",
|
||||
"agentManager.apply.previewSummary": "{{files}} Dateien, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} von {{total}} Dateien ausgewählt",
|
||||
"agentManager.apply.selectAll": "Alle auswählen",
|
||||
"agentManager.apply.selectNone": "Keine auswählen",
|
||||
"agentManager.apply.moreFiles": "+{{count}} weitere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} weitere)",
|
||||
"agentManager.apply.checking": "Prüfe...",
|
||||
"agentManager.apply.applying": "Wird angewendet...",
|
||||
"agentManager.apply.success": "Änderungen angewendet",
|
||||
"agentManager.apply.conflict": "Anwenden hat Konflikte",
|
||||
"agentManager.apply.conflictToast": "{{count}} Konflikte in {{files}} Dateien. Details unter Anwenden prüfen.",
|
||||
"agentManager.apply.error": "Anwenden fehlgeschlagen",
|
||||
"agentManager.apply.conflictsTitle": "Konflikte",
|
||||
"agentManager.apply.unknownFile": "Ungelöste Datei",
|
||||
"agentManager.apply.reason.index": "Lokale Datei weicht von der erwarteten Version ab",
|
||||
"agentManager.apply.reason.patch": "Patch kann nicht sauber angewendet werden",
|
||||
"agentManager.apply.reason.contents": "Inhalt der aktuellen lokalen Datei kann nicht gelesen werden",
|
||||
"agentManager.apply.reason.unknown": "Konflikt erkannt",
|
||||
"agentManager.apply.inline.success": "Angewendet",
|
||||
"agentManager.apply.inline.conflict": "Konflikte",
|
||||
"agentManager.apply.inline.error": "Fehlgeschlagen",
|
||||
"agentManager.shortcuts.toggleDiff": "Diff-Panel umschalten",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Schnellwechsel",
|
||||
"agentManager.shortcuts.jumpToItem": "Zu Element 1\u20139 springen",
|
||||
"agentManager.review.sendAllToChat": "Alles an den Chat senden",
|
||||
"agentManager.review.sendAllToChatWithCount": "Alles an den Chat senden ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommentar zu Zeile {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Kommentar zu Zeile {{line}} bearbeiten",
|
||||
"agentManager.review.commentPlaceholder": "Kommentar hinterlassen...",
|
||||
"agentManager.review.commentAction": "Kommentieren",
|
||||
"agentManager.review.sendToChat": "An Chat senden",
|
||||
"agentManager.review.collapsedOnly": "{{count}} eingeklappt",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} eingeklappt, {{large}} groß",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR-URL einfügen...",
|
||||
"agentManager.import.open": "Öffnen",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Branch auswählen...",
|
||||
"agentManager.import.loading": "Laden...",
|
||||
"agentManager.import.loadingBranches": "Branches werden geladen...",
|
||||
"agentManager.import.noMatchingBranches": "Keine passenden Branches",
|
||||
"agentManager.import.noBranchesFound": "Keine Branches gefunden.",
|
||||
"agentManager.import.noBranchesHint": "Fügen Sie oben eine PR-URL ein oder erstellen Sie einen neuen Worktree.",
|
||||
"agentManager.import.failed": "Import fehlgeschlagen",
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONS",
|
||||
"agentManager.notGitRepo": "Not a git repository",
|
||||
|
||||
"agentManager.worktree.settings": "Worktree settings",
|
||||
"agentManager.worktree.new": "New Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree Setup Script",
|
||||
"agentManager.worktree.delete": "Delete worktree",
|
||||
"agentManager.worktree.stale": "Stale",
|
||||
"agentManager.worktree.staleTooltip": "Missing on disk or no longer tracked by git worktree",
|
||||
"agentManager.worktree.removeStale": "Remove stale worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Double-click to rename",
|
||||
"agentManager.worktree.versions": "{{count}} versions",
|
||||
"agentManager.worktree.advancedOptions": "Advanced worktree options",
|
||||
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessions",
|
||||
"agentManager.hoverCard.files": "Files",
|
||||
"agentManager.hoverCard.changes": "Changes",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
|
||||
"agentManager.session.new": "New session",
|
||||
"agentManager.session.untitled": "Untitled",
|
||||
"agentManager.session.newSession": "New Session",
|
||||
"agentManager.session.openInWorktree": "Open in worktree",
|
||||
"agentManager.session.readonly": "Read-only session",
|
||||
"agentManager.session.noSessions": "No sessions open",
|
||||
|
||||
"agentManager.tab.close": "Close",
|
||||
"agentManager.tab.closeTab": "Close tab",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Open Terminal",
|
||||
|
||||
"agentManager.setup.failed": "Workspace setup failed",
|
||||
"agentManager.setup.settingUp": "Setting up workspace",
|
||||
|
||||
"agentManager.shortcuts.title": "Keyboard Shortcuts",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidebar",
|
||||
"agentManager.shortcuts.category.tabs": "Tabs",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Previous item",
|
||||
"agentManager.shortcuts.nextItem": "Next item",
|
||||
"agentManager.shortcuts.newWorktree": "New worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Advanced worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Delete worktree",
|
||||
"agentManager.shortcuts.previousTab": "Previous tab",
|
||||
"agentManager.shortcuts.nextTab": "Next tab",
|
||||
"agentManager.shortcuts.newTab": "New tab",
|
||||
"agentManager.shortcuts.closeTab": "Close tab",
|
||||
"agentManager.shortcuts.toggleTerminal": "Toggle terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focus panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Open Agent Manager",
|
||||
|
||||
"agentManager.dialog.deleteWorktree.title": "Delete Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Delete worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? This removes the worktree from disk and dissociates all sessions.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancel",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Delete",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Remove Stale Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Remove stale worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? This only removes the Agent Manager mapping and leaves files on disk untouched.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancel",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Remove stale worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "New Worktree",
|
||||
"agentManager.dialog.tab.new": "New",
|
||||
"agentManager.dialog.tab.import": "Import",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree name (optional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Type a message (\u2318Enter to send)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Type a message (Ctrl+Enter to send)",
|
||||
"agentManager.dialog.advancedOptions": "Advanced options",
|
||||
"agentManager.dialog.branchName": "Branch name",
|
||||
"agentManager.dialog.branchNamePlaceholder": "auto-generated",
|
||||
"agentManager.dialog.baseBranch": "Base branch",
|
||||
"agentManager.dialog.searchBranches": "Search branches...",
|
||||
"agentManager.dialog.branchBadge.default": "default",
|
||||
"agentManager.dialog.branchBadge.remote": "remote",
|
||||
"agentManager.dialog.versions": "Versions",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees will run in parallel",
|
||||
"agentManager.dialog.compareModels": "Compare Models",
|
||||
"agentManager.dialog.compareModels.searchModels": "Search models...",
|
||||
"agentManager.dialog.creating": "Creating...",
|
||||
"agentManager.dialog.createWorkspace": "Create Worktree",
|
||||
"agentManager.dialog.removeImage": "Remove image",
|
||||
"agentManager.dialog.advanced": "Advanced...",
|
||||
|
||||
"agentManager.diff.toggle": "Toggle diff",
|
||||
"agentManager.diff.openFile": "Open file",
|
||||
"agentManager.apply.button": "Apply to local",
|
||||
"agentManager.apply.globalButton": "Apply",
|
||||
"agentManager.apply.tooltip": "Apply selected worktree changes to local branch",
|
||||
"agentManager.apply.dialogTitle": "Apply changes to local branch",
|
||||
"agentManager.apply.confirm": "Apply now",
|
||||
"agentManager.apply.retry": "Retry apply",
|
||||
"agentManager.apply.previewTitle": "Apply these changes to local branch?",
|
||||
"agentManager.apply.previewSummary": "{{files}} files, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} of {{total}} files selected",
|
||||
"agentManager.apply.selectAll": "Select all",
|
||||
"agentManager.apply.selectNone": "Select none",
|
||||
"agentManager.apply.moreFiles": "+{{count}} more",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} more)",
|
||||
"agentManager.apply.checking": "Checking...",
|
||||
"agentManager.apply.applying": "Applying...",
|
||||
"agentManager.apply.success": "Changes applied",
|
||||
"agentManager.apply.conflict": "Apply has conflicts",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflicts in {{files}} files. Review details in Apply.",
|
||||
"agentManager.apply.error": "Apply failed",
|
||||
"agentManager.apply.conflictsTitle": "Conflicts",
|
||||
"agentManager.apply.unknownFile": "Unresolved file",
|
||||
"agentManager.apply.reason.index": "Local file differs from expected version",
|
||||
"agentManager.apply.reason.patch": "Patch cannot be applied cleanly",
|
||||
"agentManager.apply.reason.contents": "Cannot read current local file contents",
|
||||
"agentManager.apply.reason.unknown": "Conflict detected",
|
||||
"agentManager.apply.inline.success": "Applied",
|
||||
"agentManager.apply.inline.conflict": "Conflicts",
|
||||
"agentManager.apply.inline.error": "Failed",
|
||||
"agentManager.shortcuts.toggleDiff": "Toggle diff panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Quick Switch",
|
||||
"agentManager.shortcuts.jumpToItem": "Jump to item 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send all to chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send all to chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comment on line {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Edit comment on line {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Leave a comment...",
|
||||
"agentManager.review.commentAction": "Comment",
|
||||
"agentManager.review.sendToChat": "Send to chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} collapsed",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} collapsed, {{large}} large",
|
||||
"agentManager.review.largeFileCollapsed": "Large file (collapsed)",
|
||||
"agentManager.review.endOfLongDiff": "You made it to the end!",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Paste PR URL...",
|
||||
"agentManager.import.open": "Open",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Select branch...",
|
||||
"agentManager.import.loading": "Loading...",
|
||||
"agentManager.import.loadingBranches": "Loading branches...",
|
||||
"agentManager.import.noMatchingBranches": "No matching branches",
|
||||
"agentManager.import.noBranchesFound": "No branches found.",
|
||||
"agentManager.import.noBranchesHint": "Paste a PR URL above or create a new worktree.",
|
||||
"agentManager.import.failed": "Import failed",
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESIONES",
|
||||
"agentManager.notGitRepo": "No es un repositorio git",
|
||||
"agentManager.worktree.settings": "Configuración de Worktree",
|
||||
"agentManager.worktree.new": "Nuevo Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuración de Worktree",
|
||||
"agentManager.worktree.delete": "Eliminar Worktree",
|
||||
"agentManager.worktree.stale": "Obsoleto",
|
||||
"agentManager.worktree.staleTooltip": "No está en disco o ya no está seguido por git worktree",
|
||||
"agentManager.worktree.removeStale": "Eliminar Worktree obsoleto",
|
||||
"agentManager.worktree.doubleClickRename": "Doble clic para renombrar",
|
||||
"agentManager.worktree.versions": "{{count}} versiones",
|
||||
"agentManager.worktree.advancedOptions": "Opciones avanzadas de Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sesiones",
|
||||
"agentManager.hoverCard.files": "Archivos",
|
||||
"agentManager.hoverCard.changes": "Cambios",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nueva sesión",
|
||||
"agentManager.session.untitled": "Sin título",
|
||||
"agentManager.session.newSession": "Nueva Sesión",
|
||||
"agentManager.session.openInWorktree": "Abrir en Worktree",
|
||||
"agentManager.session.readonly": "Sesión de solo lectura",
|
||||
"agentManager.session.noSessions": "No hay sesiones abiertas",
|
||||
"agentManager.tab.close": "Cerrar",
|
||||
"agentManager.tab.closeTab": "Cerrar pestaña",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Abrir Terminal",
|
||||
"agentManager.setup.failed": "Error en la configuración del workspace",
|
||||
"agentManager.setup.settingUp": "Configurando workspace",
|
||||
"agentManager.shortcuts.title": "Atajos de teclado",
|
||||
"agentManager.shortcuts.category.sidebar": "Barra lateral",
|
||||
"agentManager.shortcuts.category.tabs": "Pestañas",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Elemento anterior",
|
||||
"agentManager.shortcuts.nextItem": "Siguiente elemento",
|
||||
"agentManager.shortcuts.newWorktree": "Nuevo Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avanzado",
|
||||
"agentManager.shortcuts.deleteWorktree": "Eliminar Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Pestaña anterior",
|
||||
"agentManager.shortcuts.nextTab": "Siguiente pestaña",
|
||||
"agentManager.shortcuts.newTab": "Nueva pestaña",
|
||||
"agentManager.shortcuts.closeTab": "Cerrar pestaña",
|
||||
"agentManager.shortcuts.toggleTerminal": "Alternar terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Enfocar panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Eliminar Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "¿Eliminar Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Esto elimina el Worktree del disco y desasocia todas las sesiones.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Eliminar",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Eliminar Worktree obsoleto",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "¿Eliminar Worktree obsoleto ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Esto solo elimina la asociación en Agent Manager y no modifica los archivos en disco.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Eliminar Worktree obsoleto",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nuevo Worktree",
|
||||
"agentManager.dialog.tab.new": "Nuevo",
|
||||
"agentManager.dialog.tab.import": "Importar",
|
||||
"agentManager.dialog.namePlaceholder": "Nombre del Worktree (opcional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Escribe un mensaje (⌘Enter para enviar)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Escribe un mensaje (Ctrl+Enter para enviar)",
|
||||
"agentManager.dialog.advancedOptions": "Opciones avanzadas",
|
||||
"agentManager.dialog.branchName": "Nombre del branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "generado automáticamente",
|
||||
"agentManager.dialog.baseBranch": "Branch base",
|
||||
"agentManager.dialog.searchBranches": "Buscar branches...",
|
||||
"agentManager.dialog.branchBadge.default": "predeterminado",
|
||||
"agentManager.dialog.branchBadge.remote": "remoto",
|
||||
"agentManager.dialog.versions": "Versiones",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees se ejecutarán en paralelo",
|
||||
"agentManager.dialog.compareModels": "Comparar modelos",
|
||||
"agentManager.dialog.compareModels.searchModels": "Buscar modelos...",
|
||||
"agentManager.dialog.creating": "Creando...",
|
||||
"agentManager.dialog.createWorkspace": "Crear Worktree",
|
||||
"agentManager.dialog.removeImage": "Eliminar imagen",
|
||||
"agentManager.dialog.advanced": "Avanzado...",
|
||||
|
||||
"agentManager.diff.toggle": "Alternar diff",
|
||||
"agentManager.diff.openFile": "Abrir archivo",
|
||||
"agentManager.apply.button": "Aplicar en local",
|
||||
"agentManager.apply.globalButton": "Aplicar",
|
||||
"agentManager.apply.tooltip": "Aplicar los cambios del worktree seleccionado a la rama local",
|
||||
"agentManager.apply.dialogTitle": "Aplicar cambios a la rama local",
|
||||
"agentManager.apply.confirm": "Aplicar ahora",
|
||||
"agentManager.apply.retry": "Reintentar aplicación",
|
||||
"agentManager.apply.previewTitle": "¿Aplicar estos cambios a la rama local?",
|
||||
"agentManager.apply.previewSummary": "{{files}} archivos, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} de {{total}} archivos seleccionados",
|
||||
"agentManager.apply.selectAll": "Seleccionar todos",
|
||||
"agentManager.apply.selectNone": "Deseleccionar todos",
|
||||
"agentManager.apply.moreFiles": "+{{count}} más",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} más)",
|
||||
"agentManager.apply.checking": "Verificando...",
|
||||
"agentManager.apply.applying": "Aplicando...",
|
||||
"agentManager.apply.success": "Cambios aplicados",
|
||||
"agentManager.apply.conflict": "La aplicación tiene conflictos",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflictos en {{files}} archivos. Revise los detalles en Aplicar.",
|
||||
"agentManager.apply.error": "La aplicación falló",
|
||||
"agentManager.apply.conflictsTitle": "Conflictos",
|
||||
"agentManager.apply.unknownFile": "Archivo no resuelto",
|
||||
"agentManager.apply.reason.index": "El archivo local difiere de la versión esperada",
|
||||
"agentManager.apply.reason.patch": "El parche no se puede aplicar limpiamente",
|
||||
"agentManager.apply.reason.contents": "No se puede leer el contenido del archivo local actual",
|
||||
"agentManager.apply.reason.unknown": "Conflicto detectado",
|
||||
"agentManager.apply.inline.success": "Aplicado",
|
||||
"agentManager.apply.inline.conflict": "Conflictos",
|
||||
"agentManager.apply.inline.error": "Falló",
|
||||
"agentManager.shortcuts.toggleDiff": "Alternar panel de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Cambio rápido",
|
||||
"agentManager.shortcuts.jumpToItem": "Ir al elemento 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Enviar todo al chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Enviar todo al chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comentar en la línea {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Editar comentario en la línea {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Deja un comentario...",
|
||||
"agentManager.review.commentAction": "Comentar",
|
||||
"agentManager.review.sendToChat": "Enviar al chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} contraídos",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} contraídos, {{large}} grandes",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Pegar URL del PR...",
|
||||
"agentManager.import.open": "Abrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Seleccionar branch...",
|
||||
"agentManager.import.loading": "Cargando...",
|
||||
"agentManager.import.loadingBranches": "Cargando branches...",
|
||||
"agentManager.import.noMatchingBranches": "No hay branches coincidentes",
|
||||
"agentManager.import.noBranchesFound": "No se encontraron branches.",
|
||||
"agentManager.import.noBranchesHint": "Pega una URL de PR arriba o crea un nuevo Worktree.",
|
||||
"agentManager.import.failed": "Error en la importación",
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONS",
|
||||
"agentManager.notGitRepo": "Ce n'est pas un dépôt git",
|
||||
"agentManager.worktree.settings": "Paramètres du Worktree",
|
||||
"agentManager.worktree.new": "Nouveau Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuration du Worktree",
|
||||
"agentManager.worktree.delete": "Supprimer le Worktree",
|
||||
"agentManager.worktree.stale": "Obsolète",
|
||||
"agentManager.worktree.staleTooltip": "Absent du disque ou n'est plus suivi par git worktree",
|
||||
"agentManager.worktree.removeStale": "Supprimer le Worktree obsolète",
|
||||
"agentManager.worktree.doubleClickRename": "Double-cliquez pour renommer",
|
||||
"agentManager.worktree.versions": "{{count}} versions",
|
||||
"agentManager.worktree.advancedOptions": "Options avancées du Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCHE",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessions",
|
||||
"agentManager.hoverCard.files": "Fichiers",
|
||||
"agentManager.hoverCard.changes": "Modifications",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nouvelle session",
|
||||
"agentManager.session.untitled": "Sans titre",
|
||||
"agentManager.session.newSession": "Nouvelle session",
|
||||
"agentManager.session.openInWorktree": "Ouvrir dans le Worktree",
|
||||
"agentManager.session.readonly": "Session en lecture seule",
|
||||
"agentManager.session.noSessions": "Aucune session ouverte",
|
||||
"agentManager.tab.close": "Fermer",
|
||||
"agentManager.tab.closeTab": "Fermer l'onglet",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Ouvrir le Terminal",
|
||||
"agentManager.setup.failed": "Échec de la configuration de l'espace de travail",
|
||||
"agentManager.setup.settingUp": "Configuration de l'espace de travail",
|
||||
"agentManager.shortcuts.title": "Raccourcis clavier",
|
||||
"agentManager.shortcuts.category.sidebar": "Barre latérale",
|
||||
"agentManager.shortcuts.category.tabs": "Onglets",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Élément précédent",
|
||||
"agentManager.shortcuts.nextItem": "Élément suivant",
|
||||
"agentManager.shortcuts.newWorktree": "Nouveau Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avancé",
|
||||
"agentManager.shortcuts.deleteWorktree": "Supprimer le Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Onglet précédent",
|
||||
"agentManager.shortcuts.nextTab": "Onglet suivant",
|
||||
"agentManager.shortcuts.newTab": "Nouvel onglet",
|
||||
"agentManager.shortcuts.closeTab": "Fermer l'onglet",
|
||||
"agentManager.shortcuts.toggleTerminal": "Basculer le terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focaliser le panneau",
|
||||
"agentManager.shortcuts.openAgentManager": "Ouvrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Supprimer le Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Supprimer le Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
" ? Cela supprime le Worktree du disque et dissocie toutes les sessions.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Annuler",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Supprimer",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Supprimer le Worktree obsolète",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Supprimer le Worktree obsolète ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
" ? Cela supprime uniquement l'association dans Agent Manager et laisse les fichiers du disque inchangés.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Annuler",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Supprimer le Worktree obsolète",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nouveau worktree",
|
||||
"agentManager.dialog.tab.new": "Nouveau",
|
||||
"agentManager.dialog.tab.import": "Importer",
|
||||
"agentManager.dialog.namePlaceholder": "Nom du Worktree (optionnel)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Saisissez un message (⌘Entrée pour envoyer)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Saisissez un message (Ctrl+Entrée pour envoyer)",
|
||||
"agentManager.dialog.advancedOptions": "Options avancées",
|
||||
"agentManager.dialog.branchName": "Nom de la branche",
|
||||
"agentManager.dialog.branchNamePlaceholder": "généré automatiquement",
|
||||
"agentManager.dialog.baseBranch": "Branche de base",
|
||||
"agentManager.dialog.searchBranches": "Rechercher des branches...",
|
||||
"agentManager.dialog.branchBadge.default": "par défaut",
|
||||
"agentManager.dialog.branchBadge.remote": "distant",
|
||||
"agentManager.dialog.versions": "Versions",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees s'exécuteront en parallèle",
|
||||
"agentManager.dialog.compareModels": "Comparer les modèles",
|
||||
"agentManager.dialog.compareModels.searchModels": "Rechercher des modèles...",
|
||||
"agentManager.dialog.creating": "Création...",
|
||||
"agentManager.dialog.createWorkspace": "Créer un worktree",
|
||||
"agentManager.dialog.removeImage": "Supprimer l'image",
|
||||
"agentManager.dialog.advanced": "Avancé...",
|
||||
|
||||
"agentManager.diff.toggle": "Basculer le diff",
|
||||
"agentManager.diff.openFile": "Ouvrir le fichier",
|
||||
"agentManager.apply.button": "Appliquer en local",
|
||||
"agentManager.apply.globalButton": "Appliquer",
|
||||
"agentManager.apply.tooltip": "Appliquer les modifications du worktree sélectionné à la branche locale",
|
||||
"agentManager.apply.dialogTitle": "Appliquer les modifications à la branche locale",
|
||||
"agentManager.apply.confirm": "Appliquer maintenant",
|
||||
"agentManager.apply.retry": "Réessayer l'application",
|
||||
"agentManager.apply.previewTitle": "Appliquer ces modifications à la branche locale ?",
|
||||
"agentManager.apply.previewSummary": "{{files}} fichiers, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} sur {{total}} fichiers sélectionnés",
|
||||
"agentManager.apply.selectAll": "Tout sélectionner",
|
||||
"agentManager.apply.selectNone": "Tout désélectionner",
|
||||
"agentManager.apply.moreFiles": "+{{count}} de plus",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} de plus)",
|
||||
"agentManager.apply.checking": "Vérification...",
|
||||
"agentManager.apply.applying": "Application...",
|
||||
"agentManager.apply.success": "Modifications appliquées",
|
||||
"agentManager.apply.conflict": "L'application comporte des conflits",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{count}} conflits dans {{files}} fichiers. Consultez les détails dans Appliquer.",
|
||||
"agentManager.apply.error": "Échec de l'application",
|
||||
"agentManager.apply.conflictsTitle": "Conflits",
|
||||
"agentManager.apply.unknownFile": "Fichier non résolu",
|
||||
"agentManager.apply.reason.index": "Le fichier local diffère de la version attendue",
|
||||
"agentManager.apply.reason.patch": "Le patch ne peut pas être appliqué proprement",
|
||||
"agentManager.apply.reason.contents": "Impossible de lire le contenu du fichier local actuel",
|
||||
"agentManager.apply.reason.unknown": "Conflit détecté",
|
||||
"agentManager.apply.inline.success": "Appliqué",
|
||||
"agentManager.apply.inline.conflict": "Conflits",
|
||||
"agentManager.apply.inline.error": "Échoué",
|
||||
"agentManager.shortcuts.toggleDiff": "Basculer le panneau de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Changement rapide",
|
||||
"agentManager.shortcuts.jumpToItem": "Aller à l'élément 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Tout envoyer au chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Tout envoyer au chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Commenter la ligne {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Modifier le commentaire de la ligne {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Laisser un commentaire...",
|
||||
"agentManager.review.commentAction": "Commenter",
|
||||
"agentManager.review.sendToChat": "Envoyer au chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} repliés",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} repliés, {{large}} volumineux",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Coller l'URL du PR...",
|
||||
"agentManager.import.open": "Ouvrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Sélectionner une branche...",
|
||||
"agentManager.import.loading": "Chargement...",
|
||||
"agentManager.import.loadingBranches": "Chargement des branches...",
|
||||
"agentManager.import.noMatchingBranches": "Aucune branche correspondante",
|
||||
"agentManager.import.noBranchesFound": "Aucune branche trouvée.",
|
||||
"agentManager.import.noBranchesHint": "Collez une URL de PR ci-dessus ou créez un nouveau Worktree.",
|
||||
"agentManager.import.failed": "Échec de l'importation",
|
||||
}
|
||||
@@ -0,0 +1,144 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "ローカル",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "セッション",
|
||||
"agentManager.notGitRepo": "gitリポジトリではありません",
|
||||
"agentManager.worktree.settings": "Worktree設定",
|
||||
"agentManager.worktree.new": "新しいWorktree",
|
||||
"agentManager.worktree.setupScript": "Worktreeセットアップスクリプト",
|
||||
"agentManager.worktree.delete": "Worktreeを削除",
|
||||
"agentManager.worktree.stale": "無効",
|
||||
"agentManager.worktree.staleTooltip": "ディスク上に存在しないか、git worktree で追跡されていません",
|
||||
"agentManager.worktree.removeStale": "無効な Worktree を削除",
|
||||
"agentManager.worktree.doubleClickRename": "ダブルクリックで名前を変更",
|
||||
"agentManager.worktree.versions": "{{count}}バージョン",
|
||||
"agentManager.worktree.advancedOptions": "Worktreeの詳細オプション",
|
||||
"agentManager.hoverCard.branch": "ブランチ",
|
||||
"agentManager.hoverCard.base": "ベース",
|
||||
"agentManager.hoverCard.sessions": "セッション",
|
||||
"agentManager.hoverCard.files": "ファイル",
|
||||
"agentManager.hoverCard.changes": "変更",
|
||||
"agentManager.hoverCard.commits": "コミット",
|
||||
"agentManager.session.new": "新しいセッション",
|
||||
"agentManager.session.untitled": "無題",
|
||||
"agentManager.session.newSession": "新しいセッション",
|
||||
"agentManager.session.openInWorktree": "Worktreeで開く",
|
||||
"agentManager.session.readonly": "読み取り専用セッション",
|
||||
"agentManager.session.noSessions": "開いているセッションがありません",
|
||||
"agentManager.tab.close": "閉じる",
|
||||
"agentManager.tab.closeTab": "タブを閉じる",
|
||||
"agentManager.tab.terminal": "ターミナル",
|
||||
"agentManager.tab.openTerminal": "ターミナルを開く",
|
||||
"agentManager.setup.failed": "ワークスペースのセットアップに失敗しました",
|
||||
"agentManager.setup.settingUp": "ワークスペースをセットアップ中",
|
||||
"agentManager.shortcuts.title": "キーボードショートカット",
|
||||
"agentManager.shortcuts.category.sidebar": "サイドバー",
|
||||
"agentManager.shortcuts.category.tabs": "タブ",
|
||||
"agentManager.shortcuts.category.terminal": "ターミナル",
|
||||
"agentManager.shortcuts.category.global": "グローバル",
|
||||
"agentManager.shortcuts.previousItem": "前の項目",
|
||||
"agentManager.shortcuts.nextItem": "次の項目",
|
||||
"agentManager.shortcuts.newWorktree": "新しいWorktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "詳細Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktreeを削除",
|
||||
"agentManager.shortcuts.previousTab": "前のタブ",
|
||||
"agentManager.shortcuts.nextTab": "次のタブ",
|
||||
"agentManager.shortcuts.newTab": "新しいタブ",
|
||||
"agentManager.shortcuts.closeTab": "タブを閉じる",
|
||||
"agentManager.shortcuts.toggleTerminal": "ターミナルの切り替え",
|
||||
"agentManager.shortcuts.focusPanel": "パネルにフォーカス",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Managerを開く",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktreeを削除",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktreeを削除 ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? ディスクからWorktreeを削除し、すべてのセッションの関連付けを解除します。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "キャンセル",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "削除",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "無効な Worktree を削除",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "無効な Worktree を削除 ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? これは Agent Manager の関連付けのみを削除し、ディスク上のファイルは変更しません。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "キャンセル",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "無効な Worktree を削除",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新規ワークツリー",
|
||||
"agentManager.dialog.tab.new": "新規",
|
||||
"agentManager.dialog.tab.import": "インポート",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree名(任意)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "メッセージを入力(⌘Enterで送信)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "メッセージを入力(Ctrl+Enterで送信)",
|
||||
"agentManager.dialog.advancedOptions": "詳細オプション",
|
||||
"agentManager.dialog.branchName": "ブランチ名",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自動生成",
|
||||
"agentManager.dialog.baseBranch": "ベースブランチ",
|
||||
"agentManager.dialog.searchBranches": "ブランチを検索...",
|
||||
"agentManager.dialog.branchBadge.default": "デフォルト",
|
||||
"agentManager.dialog.branchBadge.remote": "リモート",
|
||||
"agentManager.dialog.versions": "バージョン",
|
||||
"agentManager.dialog.versionHint": "{{count}}個のWorktreeが並行して実行されます",
|
||||
"agentManager.dialog.compareModels": "モデルを比較",
|
||||
"agentManager.dialog.compareModels.searchModels": "モデルを検索...",
|
||||
"agentManager.dialog.creating": "作成中...",
|
||||
"agentManager.dialog.createWorkspace": "ワークツリーを作成",
|
||||
"agentManager.dialog.removeImage": "画像を削除",
|
||||
"agentManager.dialog.advanced": "詳細...",
|
||||
|
||||
"agentManager.diff.toggle": "差分を切り替え",
|
||||
"agentManager.diff.openFile": "ファイルを開く",
|
||||
"agentManager.apply.button": "ローカルに適用",
|
||||
"agentManager.apply.globalButton": "適用",
|
||||
"agentManager.apply.tooltip": "選択したワークツリーの変更をローカルブランチに適用",
|
||||
"agentManager.apply.dialogTitle": "ローカルブランチに変更を適用",
|
||||
"agentManager.apply.confirm": "今すぐ適用",
|
||||
"agentManager.apply.retry": "適用を再試行",
|
||||
"agentManager.apply.previewTitle": "これらの変更をローカルブランチに適用しますか?",
|
||||
"agentManager.apply.previewSummary": "{{files}} ファイル、+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{total}} ファイル中 {{selected}} 件選択",
|
||||
"agentManager.apply.selectAll": "すべて選択",
|
||||
"agentManager.apply.selectNone": "選択解除",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 件",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} 件)",
|
||||
"agentManager.apply.checking": "確認中...",
|
||||
"agentManager.apply.applying": "適用中...",
|
||||
"agentManager.apply.success": "変更が適用されました",
|
||||
"agentManager.apply.conflict": "適用に競合があります",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{files}} ファイルに {{count}} 件の競合があります。適用で詳細を確認してください。",
|
||||
"agentManager.apply.error": "適用に失敗しました",
|
||||
"agentManager.apply.conflictsTitle": "競合",
|
||||
"agentManager.apply.unknownFile": "未解決のファイル",
|
||||
"agentManager.apply.reason.index": "ローカルファイルが期待されるバージョンと異なります",
|
||||
"agentManager.apply.reason.patch": "パッチをクリーンに適用できません",
|
||||
"agentManager.apply.reason.contents": "現在のローカルファイルの内容を読み取れません",
|
||||
"agentManager.apply.reason.unknown": "競合が検出されました",
|
||||
"agentManager.apply.inline.success": "適用済み",
|
||||
"agentManager.apply.inline.conflict": "競合",
|
||||
"agentManager.apply.inline.error": "失敗",
|
||||
"agentManager.shortcuts.toggleDiff": "差分パネルを切り替え",
|
||||
"agentManager.shortcuts.category.quickSwitch": "クイック切り替え",
|
||||
"agentManager.shortcuts.jumpToItem": "項目 1\u20139 に移動",
|
||||
"agentManager.review.sendAllToChat": "すべてをチャットに送信",
|
||||
"agentManager.review.sendAllToChatWithCount": "すべてをチャットに送信 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "{{line}} 行目にコメント",
|
||||
"agentManager.review.editCommentOnLine": "{{line}} 行目のコメントを編集",
|
||||
"agentManager.review.commentPlaceholder": "コメントを入力...",
|
||||
"agentManager.review.commentAction": "コメント",
|
||||
"agentManager.review.sendToChat": "チャットに送信",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 件折りたたみ",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 件折りたたみ、{{large}} 件がサイズ大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR URLを貼り付け...",
|
||||
"agentManager.import.open": "開く",
|
||||
"agentManager.import.branches": "ブランチ",
|
||||
"agentManager.import.selectBranch": "ブランチを選択...",
|
||||
"agentManager.import.loading": "読み込み中...",
|
||||
"agentManager.import.loadingBranches": "ブランチを読み込み中...",
|
||||
"agentManager.import.noMatchingBranches": "一致するブランチがありません",
|
||||
"agentManager.import.noBranchesFound": "ブランチが見つかりません。",
|
||||
"agentManager.import.noBranchesHint": "上にPR URLを貼り付けるか、新しいWorktreeを作成してください。",
|
||||
"agentManager.import.failed": "インポートに失敗しました",
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "로컬",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "세션",
|
||||
"agentManager.notGitRepo": "git 저장소가 아닙니다",
|
||||
"agentManager.worktree.settings": "Worktree 설정",
|
||||
"agentManager.worktree.new": "새 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 설정 스크립트",
|
||||
"agentManager.worktree.delete": "Worktree 삭제",
|
||||
"agentManager.worktree.stale": "오래됨",
|
||||
"agentManager.worktree.staleTooltip": "디스크에 없거나 더 이상 git worktree에서 추적되지 않습니다",
|
||||
"agentManager.worktree.removeStale": "오래된 Worktree 제거",
|
||||
"agentManager.worktree.doubleClickRename": "더블 클릭하여 이름 변경",
|
||||
"agentManager.worktree.versions": "{{count}}개 버전",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 고급 옵션",
|
||||
"agentManager.hoverCard.branch": "브랜치",
|
||||
"agentManager.hoverCard.base": "베이스",
|
||||
"agentManager.hoverCard.sessions": "세션",
|
||||
"agentManager.hoverCard.files": "파일",
|
||||
"agentManager.hoverCard.changes": "변경 사항",
|
||||
"agentManager.hoverCard.commits": "커밋",
|
||||
"agentManager.session.new": "새 세션",
|
||||
"agentManager.session.untitled": "제목 없음",
|
||||
"agentManager.session.newSession": "새 세션",
|
||||
"agentManager.session.openInWorktree": "Worktree에서 열기",
|
||||
"agentManager.session.readonly": "읽기 전용 세션",
|
||||
"agentManager.session.noSessions": "열린 세션 없음",
|
||||
"agentManager.tab.close": "닫기",
|
||||
"agentManager.tab.closeTab": "탭 닫기",
|
||||
"agentManager.tab.terminal": "터미널",
|
||||
"agentManager.tab.openTerminal": "터미널 열기",
|
||||
"agentManager.setup.failed": "워크스페이스 설정 실패",
|
||||
"agentManager.setup.settingUp": "워크스페이스 설정 중",
|
||||
"agentManager.shortcuts.title": "키보드 단축키",
|
||||
"agentManager.shortcuts.category.sidebar": "사이드바",
|
||||
"agentManager.shortcuts.category.tabs": "탭",
|
||||
"agentManager.shortcuts.category.terminal": "터미널",
|
||||
"agentManager.shortcuts.category.global": "전역",
|
||||
"agentManager.shortcuts.previousItem": "이전 항목",
|
||||
"agentManager.shortcuts.nextItem": "다음 항목",
|
||||
"agentManager.shortcuts.newWorktree": "새 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "고급 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktree 삭제",
|
||||
"agentManager.shortcuts.previousTab": "이전 탭",
|
||||
"agentManager.shortcuts.nextTab": "다음 탭",
|
||||
"agentManager.shortcuts.newTab": "새 탭",
|
||||
"agentManager.shortcuts.closeTab": "탭 닫기",
|
||||
"agentManager.shortcuts.toggleTerminal": "터미널 전환",
|
||||
"agentManager.shortcuts.focusPanel": "패널 포커스",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Manager 열기",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktree 삭제",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktree 삭제 ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? 디스크에서 Worktree를 제거하고 모든 세션의 연결을 해제합니다.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "취소",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "삭제",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "오래된 Worktree 제거",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "오래된 Worktree 제거 ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? 이 작업은 Agent Manager 매핑만 제거하며 디스크의 파일은 변경하지 않습니다.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "취소",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "오래된 Worktree 제거",
|
||||
|
||||
"agentManager.dialog.openWorktree": "새 워크트리",
|
||||
"agentManager.dialog.tab.new": "새로 만들기",
|
||||
"agentManager.dialog.tab.import": "가져오기",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 이름 (선택사항)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "메시지를 입력하세요 (⌘Enter로 전송)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "메시지를 입력하세요 (Ctrl+Enter로 전송)",
|
||||
"agentManager.dialog.advancedOptions": "고급 옵션",
|
||||
"agentManager.dialog.branchName": "브랜치 이름",
|
||||
"agentManager.dialog.branchNamePlaceholder": "자동 생성",
|
||||
"agentManager.dialog.baseBranch": "베이스 브랜치",
|
||||
"agentManager.dialog.searchBranches": "브랜치 검색...",
|
||||
"agentManager.dialog.branchBadge.default": "기본",
|
||||
"agentManager.dialog.branchBadge.remote": "원격",
|
||||
"agentManager.dialog.versions": "버전",
|
||||
"agentManager.dialog.versionHint": "{{count}}개의 Worktree가 병렬로 실행됩니다",
|
||||
"agentManager.dialog.compareModels": "모델 비교",
|
||||
"agentManager.dialog.compareModels.searchModels": "모델 검색...",
|
||||
"agentManager.dialog.creating": "생성 중...",
|
||||
"agentManager.dialog.createWorkspace": "워크트리 생성",
|
||||
"agentManager.dialog.removeImage": "이미지 제거",
|
||||
"agentManager.dialog.advanced": "고급...",
|
||||
|
||||
"agentManager.diff.toggle": "차이점 전환",
|
||||
"agentManager.diff.openFile": "파일 열기",
|
||||
"agentManager.apply.button": "로컬에 적용",
|
||||
"agentManager.apply.globalButton": "적용",
|
||||
"agentManager.apply.tooltip": "선택한 워크트리 변경사항을 로컬 브랜치에 적용",
|
||||
"agentManager.apply.dialogTitle": "로컬 브랜치에 변경사항 적용",
|
||||
"agentManager.apply.confirm": "지금 적용",
|
||||
"agentManager.apply.retry": "적용 재시도",
|
||||
"agentManager.apply.previewTitle": "이 변경사항을 로컬 브랜치에 적용하시겠습니까?",
|
||||
"agentManager.apply.previewSummary": "{{files}}개 파일, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{total}}개 파일 중 {{selected}}개 선택됨",
|
||||
"agentManager.apply.selectAll": "모두 선택",
|
||||
"agentManager.apply.selectNone": "선택 해제",
|
||||
"agentManager.apply.moreFiles": "+{{count}}개 더",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}}개 더)",
|
||||
"agentManager.apply.checking": "확인 중...",
|
||||
"agentManager.apply.applying": "적용 중...",
|
||||
"agentManager.apply.success": "변경사항이 적용되었습니다",
|
||||
"agentManager.apply.conflict": "적용 시 충돌이 있습니다",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{files}}개 파일에서 {{count}}개 충돌이 발생했습니다. 적용에서 세부 정보를 확인하세요.",
|
||||
"agentManager.apply.error": "적용 실패",
|
||||
"agentManager.apply.conflictsTitle": "충돌",
|
||||
"agentManager.apply.unknownFile": "미해결 파일",
|
||||
"agentManager.apply.reason.index": "로컬 파일이 예상 버전과 다릅니다",
|
||||
"agentManager.apply.reason.patch": "패치를 깨끗하게 적용할 수 없습니다",
|
||||
"agentManager.apply.reason.contents": "현재 로컬 파일 내용을 읽을 수 없습니다",
|
||||
"agentManager.apply.reason.unknown": "충돌이 감지되었습니다",
|
||||
"agentManager.apply.inline.success": "적용됨",
|
||||
"agentManager.apply.inline.conflict": "충돌",
|
||||
"agentManager.apply.inline.error": "실패",
|
||||
"agentManager.shortcuts.toggleDiff": "차이점 패널 전환",
|
||||
"agentManager.shortcuts.category.quickSwitch": "빠른 전환",
|
||||
"agentManager.shortcuts.jumpToItem": "항목 1\u20139(으)로 이동",
|
||||
"agentManager.review.sendAllToChat": "모두 채팅으로 보내기",
|
||||
"agentManager.review.sendAllToChatWithCount": "모두 채팅으로 보내기 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "{{line}}줄에 댓글",
|
||||
"agentManager.review.editCommentOnLine": "{{line}}줄 댓글 편집",
|
||||
"agentManager.review.commentPlaceholder": "댓글을 남기세요...",
|
||||
"agentManager.review.commentAction": "댓글",
|
||||
"agentManager.review.sendToChat": "채팅으로 보내기",
|
||||
"agentManager.review.collapsedOnly": "{{count}}개 접힘",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}}개 접힘, {{large}}개 대용량",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR URL 붙여넣기...",
|
||||
"agentManager.import.open": "열기",
|
||||
"agentManager.import.branches": "브랜치",
|
||||
"agentManager.import.selectBranch": "브랜치 선택...",
|
||||
"agentManager.import.loading": "로딩 중...",
|
||||
"agentManager.import.loadingBranches": "브랜치 로딩 중...",
|
||||
"agentManager.import.noMatchingBranches": "일치하는 브랜치 없음",
|
||||
"agentManager.import.noBranchesFound": "브랜치를 찾을 수 없습니다.",
|
||||
"agentManager.import.noBranchesHint": "위에 PR URL을 붙여넣거나 새 Worktree를 만드세요.",
|
||||
"agentManager.import.failed": "가져오기 실패",
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "ØKTER",
|
||||
"agentManager.notGitRepo": "Ikke et git-repositorium",
|
||||
"agentManager.worktree.settings": "Worktree-innstillinger",
|
||||
"agentManager.worktree.new": "Nytt Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-oppsettskript",
|
||||
"agentManager.worktree.delete": "Slett Worktree",
|
||||
"agentManager.worktree.stale": "Utdatert",
|
||||
"agentManager.worktree.staleTooltip": "Mangler på disken eller spores ikke lenger av git worktree",
|
||||
"agentManager.worktree.removeStale": "Fjern utdatert Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dobbeltklikk for å gi nytt navn",
|
||||
"agentManager.worktree.versions": "{{count}} versjoner",
|
||||
"agentManager.worktree.advancedOptions": "Avanserte Worktree-alternativer",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Økter",
|
||||
"agentManager.hoverCard.files": "Filer",
|
||||
"agentManager.hoverCard.changes": "Endringer",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Ny økt",
|
||||
"agentManager.session.untitled": "Uten tittel",
|
||||
"agentManager.session.newSession": "Ny økt",
|
||||
"agentManager.session.openInWorktree": "Åpne i Worktree",
|
||||
"agentManager.session.readonly": "Skrivebeskyttet økt",
|
||||
"agentManager.session.noSessions": "Ingen åpne økter",
|
||||
"agentManager.tab.close": "Lukk",
|
||||
"agentManager.tab.closeTab": "Lukk fane",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Åpne Terminal",
|
||||
"agentManager.setup.failed": "Oppsett av arbeidsområde mislyktes",
|
||||
"agentManager.setup.settingUp": "Setter opp arbeidsområde",
|
||||
"agentManager.shortcuts.title": "Tastatursnarveier",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidepanel",
|
||||
"agentManager.shortcuts.category.tabs": "Faner",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Forrige element",
|
||||
"agentManager.shortcuts.nextItem": "Neste element",
|
||||
"agentManager.shortcuts.newWorktree": "Nytt Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Avansert Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Slett Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Forrige fane",
|
||||
"agentManager.shortcuts.nextTab": "Neste fane",
|
||||
"agentManager.shortcuts.newTab": "Ny fane",
|
||||
"agentManager.shortcuts.closeTab": "Lukk fane",
|
||||
"agentManager.shortcuts.toggleTerminal": "Veksle terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokuser panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Åpne Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Slett Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Slett Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og kobler fra alle økter.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Avbryt",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Slett",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Fjern utdatert Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Fjern utdatert Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dette fjerner bare koblingen i Agent Manager og lar filene på disken være urørt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Avbryt",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Fjern utdatert Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Ny worktree",
|
||||
"agentManager.dialog.tab.new": "Ny",
|
||||
"agentManager.dialog.tab.import": "Importer",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfritt)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Skriv en melding (⌘Enter for å sende)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Skriv en melding (Ctrl+Enter for å sende)",
|
||||
"agentManager.dialog.advancedOptions": "Avanserte alternativer",
|
||||
"agentManager.dialog.branchName": "Branch-navn",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisk generert",
|
||||
"agentManager.dialog.baseBranch": "Base-branch",
|
||||
"agentManager.dialog.searchBranches": "Søk branches...",
|
||||
"agentManager.dialog.branchBadge.default": "standard",
|
||||
"agentManager.dialog.branchBadge.remote": "fjern",
|
||||
"agentManager.dialog.versions": "Versjoner",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees vil kjøre parallelt",
|
||||
"agentManager.dialog.compareModels": "Sammenlign modeller",
|
||||
"agentManager.dialog.compareModels.searchModels": "Søk modeller...",
|
||||
"agentManager.dialog.creating": "Oppretter...",
|
||||
"agentManager.dialog.createWorkspace": "Opprett worktree",
|
||||
"agentManager.dialog.removeImage": "Fjern bilde",
|
||||
"agentManager.dialog.advanced": "Avansert...",
|
||||
|
||||
"agentManager.diff.toggle": "Veksle diff",
|
||||
"agentManager.diff.openFile": "Åpne fil",
|
||||
"agentManager.apply.button": "Bruk lokalt",
|
||||
"agentManager.apply.globalButton": "Bruk",
|
||||
"agentManager.apply.tooltip": "Bruk valgte worktree-endringer på den lokale grenen",
|
||||
"agentManager.apply.dialogTitle": "Bruk endringer på den lokale grenen",
|
||||
"agentManager.apply.confirm": "Bruk nå",
|
||||
"agentManager.apply.retry": "Prøv å bruke på nytt",
|
||||
"agentManager.apply.previewTitle": "Bruke disse endringene på den lokale grenen?",
|
||||
"agentManager.apply.previewSummary": "{{files}} filer, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} av {{total}} filer valgt",
|
||||
"agentManager.apply.selectAll": "Velg alle",
|
||||
"agentManager.apply.selectNone": "Velg ingen",
|
||||
"agentManager.apply.moreFiles": "+{{count}} flere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} flere)",
|
||||
"agentManager.apply.checking": "Sjekker...",
|
||||
"agentManager.apply.applying": "Bruker...",
|
||||
"agentManager.apply.success": "Endringer brukt",
|
||||
"agentManager.apply.conflict": "Bruk har konflikter",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikter i {{files}} filer. Se detaljer i Bruk.",
|
||||
"agentManager.apply.error": "Bruk mislyktes",
|
||||
"agentManager.apply.conflictsTitle": "Konflikter",
|
||||
"agentManager.apply.unknownFile": "Uløst fil",
|
||||
"agentManager.apply.reason.index": "Lokal fil skiller seg fra forventet versjon",
|
||||
"agentManager.apply.reason.patch": "Patch kan ikke brukes rent",
|
||||
"agentManager.apply.reason.contents": "Kan ikke lese innholdet i gjeldende lokal fil",
|
||||
"agentManager.apply.reason.unknown": "Konflikt oppdaget",
|
||||
"agentManager.apply.inline.success": "Brukt",
|
||||
"agentManager.apply.inline.conflict": "Konflikter",
|
||||
"agentManager.apply.inline.error": "Mislyktes",
|
||||
"agentManager.shortcuts.toggleDiff": "Veksle diff-panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Hurtigbytte",
|
||||
"agentManager.shortcuts.jumpToItem": "Hopp til element 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send alt til chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send alt til chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommenter på linje {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Rediger kommentar på linje {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Legg igjen en kommentar...",
|
||||
"agentManager.review.commentAction": "Kommenter",
|
||||
"agentManager.review.sendToChat": "Send til chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} kollapset",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} kollapset, {{large}} store",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Lim inn PR URL...",
|
||||
"agentManager.import.open": "Åpne",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Velg branch...",
|
||||
"agentManager.import.loading": "Laster...",
|
||||
"agentManager.import.loadingBranches": "Laster branches...",
|
||||
"agentManager.import.noMatchingBranches": "Ingen matchende branches",
|
||||
"agentManager.import.noBranchesFound": "Ingen branches funnet.",
|
||||
"agentManager.import.noBranchesHint": "Lim inn en PR URL ovenfor eller opprett et nytt Worktree.",
|
||||
"agentManager.import.failed": "Import mislyktes",
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "lokalne",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESJE",
|
||||
"agentManager.notGitRepo": "Nie jest repozytorium git",
|
||||
"agentManager.worktree.settings": "Ustawienia Worktree",
|
||||
"agentManager.worktree.new": "Nowy Worktree",
|
||||
"agentManager.worktree.setupScript": "Skrypt konfiguracji Worktree",
|
||||
"agentManager.worktree.delete": "Usuń Worktree",
|
||||
"agentManager.worktree.stale": "Nieaktualny",
|
||||
"agentManager.worktree.staleTooltip": "Brak na dysku lub nie jest już śledzony przez git worktree",
|
||||
"agentManager.worktree.removeStale": "Usuń nieaktualny Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Kliknij dwukrotnie, aby zmienić nazwę",
|
||||
"agentManager.worktree.versions": "{{count}} wersji",
|
||||
"agentManager.worktree.advancedOptions": "Zaawansowane opcje Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Baza",
|
||||
"agentManager.hoverCard.sessions": "Sesje",
|
||||
"agentManager.hoverCard.files": "Pliki",
|
||||
"agentManager.hoverCard.changes": "Zmiany",
|
||||
"agentManager.hoverCard.commits": "Commity",
|
||||
"agentManager.session.new": "Nowa sesja",
|
||||
"agentManager.session.untitled": "Bez tytułu",
|
||||
"agentManager.session.newSession": "Nowa sesja",
|
||||
"agentManager.session.openInWorktree": "Otwórz w Worktree",
|
||||
"agentManager.session.readonly": "Sesja tylko do odczytu",
|
||||
"agentManager.session.noSessions": "Brak otwartych sesji",
|
||||
"agentManager.tab.close": "Zamknij",
|
||||
"agentManager.tab.closeTab": "Zamknij kartę",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Otwórz Terminal",
|
||||
"agentManager.setup.failed": "Konfiguracja workspace nie powiodła się",
|
||||
"agentManager.setup.settingUp": "Konfigurowanie workspace",
|
||||
"agentManager.shortcuts.title": "Skróty klawiszowe",
|
||||
"agentManager.shortcuts.category.sidebar": "Pasek boczny",
|
||||
"agentManager.shortcuts.category.tabs": "Karty",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Globalne",
|
||||
"agentManager.shortcuts.previousItem": "Poprzedni element",
|
||||
"agentManager.shortcuts.nextItem": "Następny element",
|
||||
"agentManager.shortcuts.newWorktree": "Nowy Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Zaawansowany Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Usuń Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Poprzednia karta",
|
||||
"agentManager.shortcuts.nextTab": "Następna karta",
|
||||
"agentManager.shortcuts.newTab": "Nowa karta",
|
||||
"agentManager.shortcuts.closeTab": "Zamknij kartę",
|
||||
"agentManager.shortcuts.toggleTerminal": "Przełącz terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokus na panelu",
|
||||
"agentManager.shortcuts.openAgentManager": "Otwórz Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Usuń Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Usunąć Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Spowoduje to usunięcie Worktree z dysku i odłączenie wszystkich sesji.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Anuluj",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Usuń",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Usuń nieaktualny Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Usunąć nieaktualny Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? To usunie tylko mapowanie w Agent Manager i nie zmieni plików na dysku.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Anuluj",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Usuń nieaktualny Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nowy Worktree",
|
||||
"agentManager.dialog.tab.new": "Nowy",
|
||||
"agentManager.dialog.tab.import": "Importuj",
|
||||
"agentManager.dialog.namePlaceholder": "Nazwa Worktree (opcjonalnie)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Wpisz wiadomość (⌘Enter aby wysłać)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Wpisz wiadomość (Ctrl+Enter aby wysłać)",
|
||||
"agentManager.dialog.advancedOptions": "Opcje zaawansowane",
|
||||
"agentManager.dialog.branchName": "Nazwa brancha",
|
||||
"agentManager.dialog.branchNamePlaceholder": "generowana automatycznie",
|
||||
"agentManager.dialog.baseBranch": "Branch bazowy",
|
||||
"agentManager.dialog.searchBranches": "Szukaj branchy...",
|
||||
"agentManager.dialog.branchBadge.default": "domyślny",
|
||||
"agentManager.dialog.branchBadge.remote": "zdalny",
|
||||
"agentManager.dialog.versions": "Wersje",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktree będą działać równolegle",
|
||||
"agentManager.dialog.compareModels": "Porównaj modele",
|
||||
"agentManager.dialog.compareModels.searchModels": "Szukaj modeli...",
|
||||
"agentManager.dialog.creating": "Tworzenie...",
|
||||
"agentManager.dialog.createWorkspace": "Utwórz Worktree",
|
||||
"agentManager.dialog.removeImage": "Usuń obraz",
|
||||
"agentManager.dialog.advanced": "Zaawansowane...",
|
||||
|
||||
"agentManager.diff.toggle": "Przełącz diff",
|
||||
"agentManager.diff.openFile": "Otwórz plik",
|
||||
"agentManager.apply.button": "Zastosuj lokalnie",
|
||||
"agentManager.apply.globalButton": "Zastosuj",
|
||||
"agentManager.apply.tooltip": "Zastosuj wybrane zmiany worktree na lokalnej gałęzi",
|
||||
"agentManager.apply.dialogTitle": "Zastosuj zmiany na lokalnej gałęzi",
|
||||
"agentManager.apply.confirm": "Zastosuj teraz",
|
||||
"agentManager.apply.retry": "Ponów zastosowanie",
|
||||
"agentManager.apply.previewTitle": "Zastosować te zmiany na lokalnej gałęzi?",
|
||||
"agentManager.apply.previewSummary": "{{files}} plików, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} z {{total}} plików wybranych",
|
||||
"agentManager.apply.selectAll": "Zaznacz wszystkie",
|
||||
"agentManager.apply.selectNone": "Odznacz wszystkie",
|
||||
"agentManager.apply.moreFiles": "+{{count}} więcej",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} więcej)",
|
||||
"agentManager.apply.checking": "Sprawdzanie...",
|
||||
"agentManager.apply.applying": "Stosowanie...",
|
||||
"agentManager.apply.success": "Zmiany zastosowane",
|
||||
"agentManager.apply.conflict": "Zastosowanie zawiera konflikty",
|
||||
"agentManager.apply.conflictToast": "{{count}} konfliktów w {{files}} plikach. Sprawdź szczegóły w Zastosuj.",
|
||||
"agentManager.apply.error": "Zastosowanie nie powiodło się",
|
||||
"agentManager.apply.conflictsTitle": "Konflikty",
|
||||
"agentManager.apply.unknownFile": "Nierozwiązany plik",
|
||||
"agentManager.apply.reason.index": "Plik lokalny różni się od oczekiwanej wersji",
|
||||
"agentManager.apply.reason.patch": "Łatka nie może być zastosowana czysto",
|
||||
"agentManager.apply.reason.contents": "Nie można odczytać zawartości bieżącego pliku lokalnego",
|
||||
"agentManager.apply.reason.unknown": "Wykryto konflikt",
|
||||
"agentManager.apply.inline.success": "Zastosowano",
|
||||
"agentManager.apply.inline.conflict": "Konflikty",
|
||||
"agentManager.apply.inline.error": "Błąd",
|
||||
"agentManager.shortcuts.toggleDiff": "Przełącz panel diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Szybkie przełączanie",
|
||||
"agentManager.shortcuts.jumpToItem": "Przejdź do elementu 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Wyślij wszystko do czatu",
|
||||
"agentManager.review.sendAllToChatWithCount": "Wyślij wszystko do czatu ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Skomentuj linię {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Edytuj komentarz do linii {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Zostaw komentarz...",
|
||||
"agentManager.review.commentAction": "Komentuj",
|
||||
"agentManager.review.sendToChat": "Wyślij do czatu",
|
||||
"agentManager.review.collapsedOnly": "{{count}} zwiniętych",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} zwiniętych, {{large}} dużych",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Wklej URL PR...",
|
||||
"agentManager.import.open": "Otwórz",
|
||||
"agentManager.import.branches": "Branche",
|
||||
"agentManager.import.selectBranch": "Wybierz branch...",
|
||||
"agentManager.import.loading": "Ładowanie...",
|
||||
"agentManager.import.loadingBranches": "Ładowanie branchy...",
|
||||
"agentManager.import.noMatchingBranches": "Brak pasujących branchy",
|
||||
"agentManager.import.noBranchesFound": "Nie znaleziono branchy.",
|
||||
"agentManager.import.noBranchesHint": "Wklej URL PR powyżej lub utwórz nowy Worktree.",
|
||||
"agentManager.import.failed": "Import nie powiódł się",
|
||||
}
|
||||
@@ -0,0 +1,142 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "локальный",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "СЕССИИ",
|
||||
"agentManager.notGitRepo": "Не является git-репозиторием",
|
||||
"agentManager.worktree.settings": "Настройки Worktree",
|
||||
"agentManager.worktree.new": "Новый Worktree",
|
||||
"agentManager.worktree.setupScript": "Скрипт настройки Worktree",
|
||||
"agentManager.worktree.delete": "Удалить Worktree",
|
||||
"agentManager.worktree.stale": "Устаревший",
|
||||
"agentManager.worktree.staleTooltip": "Отсутствует на диске или больше не отслеживается git worktree",
|
||||
"agentManager.worktree.removeStale": "Удалить устаревший Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Двойной клик для переименования",
|
||||
"agentManager.worktree.versions": "{{count}} версий",
|
||||
"agentManager.worktree.advancedOptions": "Расширенные настройки Worktree",
|
||||
"agentManager.hoverCard.branch": "ВЕТКА",
|
||||
"agentManager.hoverCard.base": "Основа",
|
||||
"agentManager.hoverCard.sessions": "Сессии",
|
||||
"agentManager.hoverCard.files": "Файлы",
|
||||
"agentManager.hoverCard.changes": "Изменения",
|
||||
"agentManager.hoverCard.commits": "Коммиты",
|
||||
"agentManager.session.new": "Новая сессия",
|
||||
"agentManager.session.untitled": "Без названия",
|
||||
"agentManager.session.newSession": "Новая сессия",
|
||||
"agentManager.session.openInWorktree": "Открыть в Worktree",
|
||||
"agentManager.session.readonly": "Сессия только для чтения",
|
||||
"agentManager.session.noSessions": "Нет открытых сессий",
|
||||
"agentManager.tab.close": "Закрыть",
|
||||
"agentManager.tab.closeTab": "Закрыть вкладку",
|
||||
"agentManager.tab.terminal": "Терминал",
|
||||
"agentManager.tab.openTerminal": "Открыть терминал",
|
||||
"agentManager.setup.failed": "Не удалось настроить рабочее пространство",
|
||||
"agentManager.setup.settingUp": "Настройка рабочего пространства",
|
||||
"agentManager.shortcuts.title": "Сочетания клавиш",
|
||||
"agentManager.shortcuts.category.sidebar": "Боковая панель",
|
||||
"agentManager.shortcuts.category.tabs": "Вкладки",
|
||||
"agentManager.shortcuts.category.terminal": "Терминал",
|
||||
"agentManager.shortcuts.category.global": "Глобальные",
|
||||
"agentManager.shortcuts.previousItem": "Предыдущий элемент",
|
||||
"agentManager.shortcuts.nextItem": "Следующий элемент",
|
||||
"agentManager.shortcuts.newWorktree": "Новый Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Расширенный Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Удалить Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Предыдущая вкладка",
|
||||
"agentManager.shortcuts.nextTab": "Следующая вкладка",
|
||||
"agentManager.shortcuts.newTab": "Новая вкладка",
|
||||
"agentManager.shortcuts.closeTab": "Закрыть вкладку",
|
||||
"agentManager.shortcuts.toggleTerminal": "Переключить терминал",
|
||||
"agentManager.shortcuts.focusPanel": "Фокус на панели",
|
||||
"agentManager.shortcuts.openAgentManager": "Открыть Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Удалить Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Удалить Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Это удалит Worktree с диска и отключит все сессии.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Отмена",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Удалить",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Удалить устаревший Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Удалить устаревший Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Это удалит только привязку в Agent Manager и не затронет файлы на диске.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Отмена",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Удалить устаревший Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Новый worktree",
|
||||
"agentManager.dialog.tab.new": "Новый",
|
||||
"agentManager.dialog.tab.import": "Импорт",
|
||||
"agentManager.dialog.namePlaceholder": "Имя Worktree (необязательно)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Введите сообщение (⌘Enter для отправки)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Введите сообщение (Ctrl+Enter для отправки)",
|
||||
"agentManager.dialog.advancedOptions": "Расширенные параметры",
|
||||
"agentManager.dialog.branchName": "Имя ветки",
|
||||
"agentManager.dialog.branchNamePlaceholder": "генерируется автоматически",
|
||||
"agentManager.dialog.baseBranch": "Базовая ветка",
|
||||
"agentManager.dialog.searchBranches": "Поиск веток...",
|
||||
"agentManager.dialog.branchBadge.default": "по умолчанию",
|
||||
"agentManager.dialog.branchBadge.remote": "удалённая",
|
||||
"agentManager.dialog.versions": "Версии",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktree будут выполняться параллельно",
|
||||
"agentManager.dialog.compareModels": "Сравнить модели",
|
||||
"agentManager.dialog.compareModels.searchModels": "Поиск моделей...",
|
||||
"agentManager.dialog.creating": "Создание...",
|
||||
"agentManager.dialog.createWorkspace": "Создать worktree",
|
||||
"agentManager.dialog.removeImage": "Удалить изображение",
|
||||
"agentManager.dialog.advanced": "Дополнительно...",
|
||||
|
||||
"agentManager.diff.toggle": "Переключить diff",
|
||||
"agentManager.diff.openFile": "Открыть файл",
|
||||
"agentManager.apply.button": "Применить локально",
|
||||
"agentManager.apply.globalButton": "Применить",
|
||||
"agentManager.apply.tooltip": "Применить изменения выбранного рабочего дерева к локальной ветке",
|
||||
"agentManager.apply.dialogTitle": "Применить изменения к локальной ветке",
|
||||
"agentManager.apply.confirm": "Применить сейчас",
|
||||
"agentManager.apply.retry": "Повторить применение",
|
||||
"agentManager.apply.previewTitle": "Применить эти изменения к локальной ветке?",
|
||||
"agentManager.apply.previewSummary": "{{files}} файлов, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} из {{total}} файлов выбрано",
|
||||
"agentManager.apply.selectAll": "Выбрать все",
|
||||
"agentManager.apply.selectNone": "Снять выделение",
|
||||
"agentManager.apply.moreFiles": "+{{count}} ещё",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} ещё)",
|
||||
"agentManager.apply.checking": "Проверка...",
|
||||
"agentManager.apply.applying": "Применение...",
|
||||
"agentManager.apply.success": "Изменения применены",
|
||||
"agentManager.apply.conflict": "Применение содержит конфликты",
|
||||
"agentManager.apply.conflictToast": "{{count}} конфликтов в {{files}} файлах. Проверьте детали в Применить.",
|
||||
"agentManager.apply.error": "Применение не удалось",
|
||||
"agentManager.apply.conflictsTitle": "Конфликты",
|
||||
"agentManager.apply.unknownFile": "Неразрешённый файл",
|
||||
"agentManager.apply.reason.index": "Локальный файл отличается от ожидаемой версии",
|
||||
"agentManager.apply.reason.patch": "Патч не может быть применён чисто",
|
||||
"agentManager.apply.reason.contents": "Не удаётся прочитать содержимое текущего локального файла",
|
||||
"agentManager.apply.reason.unknown": "Обнаружен конфликт",
|
||||
"agentManager.apply.inline.success": "Применено",
|
||||
"agentManager.apply.inline.conflict": "Конфликты",
|
||||
"agentManager.apply.inline.error": "Ошибка",
|
||||
"agentManager.shortcuts.toggleDiff": "Переключить панель diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Быстрое переключение",
|
||||
"agentManager.shortcuts.jumpToItem": "Перейти к элементу 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Отправить всё в чат",
|
||||
"agentManager.review.sendAllToChatWithCount": "Отправить всё в чат ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Комментарий к строке {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Редактировать комментарий к строке {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Оставьте комментарий...",
|
||||
"agentManager.review.commentAction": "Комментировать",
|
||||
"agentManager.review.sendToChat": "Отправить в чат",
|
||||
"agentManager.review.collapsedOnly": "{{count}} свернуто",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} свернуто, {{large}} больших",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Вставьте URL PR...",
|
||||
"agentManager.import.open": "Открыть",
|
||||
"agentManager.import.branches": "Ветки",
|
||||
"agentManager.import.selectBranch": "Выберите ветку...",
|
||||
"agentManager.import.loading": "Загрузка...",
|
||||
"agentManager.import.loadingBranches": "Загрузка веток...",
|
||||
"agentManager.import.noMatchingBranches": "Нет подходящих веток",
|
||||
"agentManager.import.noBranchesFound": "Ветки не найдены.",
|
||||
"agentManager.import.noBranchesHint": "Вставьте URL PR выше или создайте новый Worktree.",
|
||||
"agentManager.import.failed": "Ошибка импорта",
|
||||
}
|
||||
@@ -0,0 +1,143 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "ในเครื่อง",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "เซสชัน",
|
||||
"agentManager.notGitRepo": "ไม่ใช่ git repository",
|
||||
"agentManager.worktree.settings": "ตั้งค่า Worktree",
|
||||
"agentManager.worktree.new": "Worktree ใหม่",
|
||||
"agentManager.worktree.setupScript": "สคริปต์ตั้งค่า Worktree",
|
||||
"agentManager.worktree.delete": "ลบ Worktree",
|
||||
"agentManager.worktree.stale": "ล้าสมัย",
|
||||
"agentManager.worktree.staleTooltip": "ไม่พบบนดิสก์หรือไม่ได้ถูกติดตามโดย git worktree อีกต่อไป",
|
||||
"agentManager.worktree.removeStale": "ลบ Worktree ที่ล้าสมัย",
|
||||
"agentManager.worktree.doubleClickRename": "ดับเบิลคลิกเพื่อเปลี่ยนชื่อ",
|
||||
"agentManager.worktree.versions": "{{count}} เวอร์ชัน",
|
||||
"agentManager.worktree.advancedOptions": "ตัวเลือก Worktree ขั้นสูง",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "ฐาน",
|
||||
"agentManager.hoverCard.sessions": "เซสชัน",
|
||||
"agentManager.hoverCard.files": "ไฟล์",
|
||||
"agentManager.hoverCard.changes": "การเปลี่ยนแปลง",
|
||||
"agentManager.hoverCard.commits": "คอมมิต",
|
||||
"agentManager.session.new": "เซสชันใหม่",
|
||||
"agentManager.session.untitled": "ไม่มีชื่อ",
|
||||
"agentManager.session.newSession": "เซสชันใหม่",
|
||||
"agentManager.session.openInWorktree": "เปิดใน Worktree",
|
||||
"agentManager.session.readonly": "เซสชันอ่านอย่างเดียว",
|
||||
"agentManager.session.noSessions": "ไม่มีเซสชันที่เปิดอยู่",
|
||||
"agentManager.tab.close": "ปิด",
|
||||
"agentManager.tab.closeTab": "ปิดแท็บ",
|
||||
"agentManager.tab.terminal": "เทอร์มินัล",
|
||||
"agentManager.tab.openTerminal": "เปิดเทอร์มินัล",
|
||||
"agentManager.setup.failed": "ตั้งค่า Workspace ล้มเหลว",
|
||||
"agentManager.setup.settingUp": "กำลังตั้งค่า Workspace",
|
||||
"agentManager.shortcuts.title": "ปุ่มลัดแป้นพิมพ์",
|
||||
"agentManager.shortcuts.category.sidebar": "แถบด้านข้าง",
|
||||
"agentManager.shortcuts.category.tabs": "แท็บ",
|
||||
"agentManager.shortcuts.category.terminal": "เทอร์มินัล",
|
||||
"agentManager.shortcuts.category.global": "ทั่วไป",
|
||||
"agentManager.shortcuts.previousItem": "รายการก่อนหน้า",
|
||||
"agentManager.shortcuts.nextItem": "รายการถัดไป",
|
||||
"agentManager.shortcuts.newWorktree": "Worktree ใหม่",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree ขั้นสูง",
|
||||
"agentManager.shortcuts.deleteWorktree": "ลบ Worktree",
|
||||
"agentManager.shortcuts.previousTab": "แท็บก่อนหน้า",
|
||||
"agentManager.shortcuts.nextTab": "แท็บถัดไป",
|
||||
"agentManager.shortcuts.newTab": "แท็บใหม่",
|
||||
"agentManager.shortcuts.closeTab": "ปิดแท็บ",
|
||||
"agentManager.shortcuts.toggleTerminal": "สลับเทอร์มินัล",
|
||||
"agentManager.shortcuts.focusPanel": "โฟกัสแผง",
|
||||
"agentManager.shortcuts.openAgentManager": "เปิด Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "ลบ Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "ลบ Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? การดำเนินการนี้จะลบ Worktree ออกจากดิสก์และยกเลิกการเชื่อมโยงเซสชันทั้งหมด",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "ยกเลิก",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "ลบ",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "ลบ Worktree ที่ล้าสมัย",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "ลบ Worktree ที่ล้าสมัย ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? การดำเนินการนี้จะลบเฉพาะการแมปใน Agent Manager และจะไม่แตะไฟล์บนดิสก์",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "ยกเลิก",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "ลบ Worktree ที่ล้าสมัย",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Worktree ใหม่",
|
||||
"agentManager.dialog.tab.new": "ใหม่",
|
||||
"agentManager.dialog.tab.import": "นำเข้า",
|
||||
"agentManager.dialog.namePlaceholder": "ชื่อ Worktree (ไม่บังคับ)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "พิมพ์ข้อความ (⌘Enter เพื่อส่ง)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "พิมพ์ข้อความ (Ctrl+Enter เพื่อส่ง)",
|
||||
"agentManager.dialog.advancedOptions": "ตัวเลือกขั้นสูง",
|
||||
"agentManager.dialog.branchName": "ชื่อ Branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "สร้างอัตโนมัติ",
|
||||
"agentManager.dialog.baseBranch": "Branch ฐาน",
|
||||
"agentManager.dialog.searchBranches": "ค้นหา Branch...",
|
||||
"agentManager.dialog.branchBadge.default": "ค่าเริ่มต้น",
|
||||
"agentManager.dialog.branchBadge.remote": "ระยะไกล",
|
||||
"agentManager.dialog.versions": "เวอร์ชัน",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees จะทำงานพร้อมกัน",
|
||||
"agentManager.dialog.compareModels": "เปรียบเทียบโมเดล",
|
||||
"agentManager.dialog.compareModels.searchModels": "ค้นหาโมเดล...",
|
||||
"agentManager.dialog.creating": "กำลังสร้าง...",
|
||||
"agentManager.dialog.createWorkspace": "สร้าง Worktree",
|
||||
"agentManager.dialog.removeImage": "ลบรูปภาพ",
|
||||
"agentManager.dialog.advanced": "ขั้นสูง...",
|
||||
|
||||
"agentManager.diff.toggle": "สลับ diff",
|
||||
"agentManager.diff.openFile": "เปิดไฟล์",
|
||||
"agentManager.apply.button": "นำไปใช้ในเครื่อง",
|
||||
"agentManager.apply.globalButton": "นำไปใช้",
|
||||
"agentManager.apply.tooltip": "นำการเปลี่ยนแปลงของ worktree ที่เลือกไปใช้กับสาขาในเครื่อง",
|
||||
"agentManager.apply.dialogTitle": "นำการเปลี่ยนแปลงไปใช้กับสาขาในเครื่อง",
|
||||
"agentManager.apply.confirm": "นำไปใช้ตอนนี้",
|
||||
"agentManager.apply.retry": "ลองนำไปใช้อีกครั้ง",
|
||||
"agentManager.apply.previewTitle": "นำการเปลี่ยนแปลงเหล่านี้ไปใช้กับสาขาในเครื่อง?",
|
||||
"agentManager.apply.previewSummary": "{{files}} ไฟล์, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "เลือก {{selected}} จาก {{total}} ไฟล์",
|
||||
"agentManager.apply.selectAll": "เลือกทั้งหมด",
|
||||
"agentManager.apply.selectNone": "ยกเลิกการเลือกทั้งหมด",
|
||||
"agentManager.apply.moreFiles": "+{{count}} เพิ่มเติม",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} เพิ่มเติม)",
|
||||
"agentManager.apply.checking": "กำลังตรวจสอบ...",
|
||||
"agentManager.apply.applying": "กำลังนำไปใช้...",
|
||||
"agentManager.apply.success": "นำการเปลี่ยนแปลงไปใช้แล้ว",
|
||||
"agentManager.apply.conflict": "การนำไปใช้มีข้อขัดแย้ง",
|
||||
"agentManager.apply.conflictToast": "{{count}} ข้อขัดแย้งใน {{files}} ไฟล์ ตรวจสอบรายละเอียดในนำไปใช้",
|
||||
"agentManager.apply.error": "การนำไปใช้ล้มเหลว",
|
||||
"agentManager.apply.conflictsTitle": "ข้อขัดแย้ง",
|
||||
"agentManager.apply.unknownFile": "ไฟล์ที่ยังไม่ได้แก้ไข",
|
||||
"agentManager.apply.reason.index": "ไฟล์ในเครื่องแตกต่างจากเวอร์ชันที่คาดไว้",
|
||||
"agentManager.apply.reason.patch": "ไม่สามารถนำ patch ไปใช้ได้อย่างสะอาด",
|
||||
"agentManager.apply.reason.contents": "ไม่สามารถอ่านเนื้อหาของไฟล์ในเครื่องปัจจุบัน",
|
||||
"agentManager.apply.reason.unknown": "ตรวจพบข้อขัดแย้ง",
|
||||
"agentManager.apply.inline.success": "นำไปใช้แล้ว",
|
||||
"agentManager.apply.inline.conflict": "ข้อขัดแย้ง",
|
||||
"agentManager.apply.inline.error": "ล้มเหลว",
|
||||
"agentManager.shortcuts.toggleDiff": "สลับแผง diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "สลับด่วน",
|
||||
"agentManager.shortcuts.jumpToItem": "ข้ามไปยังรายการ 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "ส่งทั้งหมดไปยังแชท",
|
||||
"agentManager.review.sendAllToChatWithCount": "ส่งทั้งหมดไปยังแชท ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "แสดงความคิดเห็นที่บรรทัด {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "แก้ไขความคิดเห็นที่บรรทัด {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "แสดงความคิดเห็น...",
|
||||
"agentManager.review.commentAction": "แสดงความคิดเห็น",
|
||||
"agentManager.review.sendToChat": "ส่งไปยังแชท",
|
||||
"agentManager.review.collapsedOnly": "ยุบ {{count}} รายการ",
|
||||
"agentManager.review.collapsedWithLarge": "ยุบ {{collapsed}} รายการ, ขนาดใหญ่ {{large}} รายการ",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "วาง URL ของ PR...",
|
||||
"agentManager.import.open": "เปิด",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "เลือก Branch...",
|
||||
"agentManager.import.loading": "กำลังโหลด...",
|
||||
"agentManager.import.loadingBranches": "กำลังโหลด Branches...",
|
||||
"agentManager.import.noMatchingBranches": "ไม่พบ Branch ที่ตรงกัน",
|
||||
"agentManager.import.noBranchesFound": "ไม่พบ Branch",
|
||||
"agentManager.import.noBranchesHint": "วาง URL ของ PR ด้านบนหรือสร้าง Worktree ใหม่",
|
||||
"agentManager.import.failed": "นำเข้าล้มเหลว",
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "本地",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "会话",
|
||||
"agentManager.notGitRepo": "不是 git 仓库",
|
||||
"agentManager.worktree.settings": "Worktree 设置",
|
||||
"agentManager.worktree.new": "新建 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 设置脚本",
|
||||
"agentManager.worktree.delete": "删除 Worktree",
|
||||
"agentManager.worktree.stale": "已失效",
|
||||
"agentManager.worktree.staleTooltip": "在磁盘上缺失,或不再由 git worktree 跟踪",
|
||||
"agentManager.worktree.removeStale": "移除失效 Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "双击重命名",
|
||||
"agentManager.worktree.versions": "{{count}} 个版本",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 高级选项",
|
||||
"agentManager.hoverCard.branch": "分支",
|
||||
"agentManager.hoverCard.base": "基础",
|
||||
"agentManager.hoverCard.sessions": "会话",
|
||||
"agentManager.hoverCard.files": "文件",
|
||||
"agentManager.hoverCard.changes": "更改",
|
||||
"agentManager.hoverCard.commits": "提交",
|
||||
"agentManager.session.new": "新建会话",
|
||||
"agentManager.session.untitled": "无标题",
|
||||
"agentManager.session.newSession": "新建会话",
|
||||
"agentManager.session.openInWorktree": "在 Worktree 中打开",
|
||||
"agentManager.session.readonly": "只读会话",
|
||||
"agentManager.session.noSessions": "没有打开的会话",
|
||||
"agentManager.tab.close": "关闭",
|
||||
"agentManager.tab.closeTab": "关闭标签页",
|
||||
"agentManager.tab.terminal": "终端",
|
||||
"agentManager.tab.openTerminal": "打开终端",
|
||||
"agentManager.setup.failed": "工作区设置失败",
|
||||
"agentManager.setup.settingUp": "正在设置工作区",
|
||||
"agentManager.shortcuts.title": "键盘快捷键",
|
||||
"agentManager.shortcuts.category.sidebar": "侧边栏",
|
||||
"agentManager.shortcuts.category.tabs": "标签页",
|
||||
"agentManager.shortcuts.category.terminal": "终端",
|
||||
"agentManager.shortcuts.category.global": "全局",
|
||||
"agentManager.shortcuts.previousItem": "上一项",
|
||||
"agentManager.shortcuts.nextItem": "下一项",
|
||||
"agentManager.shortcuts.newWorktree": "新建 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "高级 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "删除 Worktree",
|
||||
"agentManager.shortcuts.previousTab": "上一个标签页",
|
||||
"agentManager.shortcuts.nextTab": "下一个标签页",
|
||||
"agentManager.shortcuts.newTab": "新建标签页",
|
||||
"agentManager.shortcuts.closeTab": "关闭标签页",
|
||||
"agentManager.shortcuts.toggleTerminal": "切换终端",
|
||||
"agentManager.shortcuts.focusPanel": "聚焦面板",
|
||||
"agentManager.shortcuts.openAgentManager": "打开 Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "删除 Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "删除 Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "?这将从磁盘中移除 Worktree 并取消所有会话的关联。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "取消",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "删除",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "移除失效 Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "移除失效 Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost": "?这只会移除 Agent Manager 映射,不会触碰磁盘上的文件。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "取消",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新建工作树",
|
||||
"agentManager.dialog.tab.new": "新建",
|
||||
"agentManager.dialog.tab.import": "导入",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 名称(可选)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "输入消息(⌘Enter 发送)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "输入消息(Ctrl+Enter 发送)",
|
||||
"agentManager.dialog.advancedOptions": "高级选项",
|
||||
"agentManager.dialog.branchName": "分支名称",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自动生成",
|
||||
"agentManager.dialog.baseBranch": "基础分支",
|
||||
"agentManager.dialog.searchBranches": "搜索分支...",
|
||||
"agentManager.dialog.branchBadge.default": "默认",
|
||||
"agentManager.dialog.branchBadge.remote": "远程",
|
||||
"agentManager.dialog.versions": "版本",
|
||||
"agentManager.dialog.versionHint": "{{count}} 个 Worktree 将并行运行",
|
||||
"agentManager.dialog.compareModels": "比较模型",
|
||||
"agentManager.dialog.compareModels.searchModels": "搜索模型...",
|
||||
"agentManager.dialog.creating": "创建中...",
|
||||
"agentManager.dialog.createWorkspace": "创建工作树",
|
||||
"agentManager.dialog.removeImage": "移除图片",
|
||||
"agentManager.dialog.advanced": "高级...",
|
||||
|
||||
"agentManager.diff.toggle": "切换差异",
|
||||
"agentManager.diff.openFile": "打开文件",
|
||||
"agentManager.apply.button": "应用到本地",
|
||||
"agentManager.apply.globalButton": "应用",
|
||||
"agentManager.apply.tooltip": "将所选工作树的更改应用到本地分支",
|
||||
"agentManager.apply.dialogTitle": "将更改应用到本地分支",
|
||||
"agentManager.apply.confirm": "立即应用",
|
||||
"agentManager.apply.retry": "重试应用",
|
||||
"agentManager.apply.previewTitle": "将这些更改应用到本地分支?",
|
||||
"agentManager.apply.previewSummary": "{{files}} 个文件,+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "已选择 {{selected}}/{{total}} 个文件",
|
||||
"agentManager.apply.selectAll": "全选",
|
||||
"agentManager.apply.selectNone": "取消全选",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 更多",
|
||||
"agentManager.apply.moreReasons": "{{reason}}(+{{count}} 更多)",
|
||||
"agentManager.apply.checking": "检查中...",
|
||||
"agentManager.apply.applying": "应用中...",
|
||||
"agentManager.apply.success": "更改已应用",
|
||||
"agentManager.apply.conflict": "应用存在冲突",
|
||||
"agentManager.apply.conflictToast": "{{files}} 个文件中有 {{count}} 个冲突。在应用中查看详情。",
|
||||
"agentManager.apply.error": "应用失败",
|
||||
"agentManager.apply.conflictsTitle": "冲突",
|
||||
"agentManager.apply.unknownFile": "未解决的文件",
|
||||
"agentManager.apply.reason.index": "本地文件与预期版本不同",
|
||||
"agentManager.apply.reason.patch": "补丁无法干净地应用",
|
||||
"agentManager.apply.reason.contents": "无法读取当前本地文件内容",
|
||||
"agentManager.apply.reason.unknown": "检测到冲突",
|
||||
"agentManager.apply.inline.success": "已应用",
|
||||
"agentManager.apply.inline.conflict": "冲突",
|
||||
"agentManager.apply.inline.error": "失败",
|
||||
"agentManager.shortcuts.toggleDiff": "切换差异面板",
|
||||
"agentManager.shortcuts.category.quickSwitch": "快速切换",
|
||||
"agentManager.shortcuts.jumpToItem": "跳转到项目 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "全部发送到聊天",
|
||||
"agentManager.review.sendAllToChatWithCount": "全部发送到聊天 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "在第 {{line}} 行评论",
|
||||
"agentManager.review.editCommentOnLine": "编辑第 {{line}} 行评论",
|
||||
"agentManager.review.commentPlaceholder": "留下评论...",
|
||||
"agentManager.review.commentAction": "评论",
|
||||
"agentManager.review.sendToChat": "发送到聊天",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 个已折叠",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 个已折叠,{{large}} 个过大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "粘贴 PR URL...",
|
||||
"agentManager.import.open": "打开",
|
||||
"agentManager.import.branches": "分支",
|
||||
"agentManager.import.selectBranch": "选择分支...",
|
||||
"agentManager.import.loading": "加载中...",
|
||||
"agentManager.import.loadingBranches": "正在加载分支...",
|
||||
"agentManager.import.noMatchingBranches": "没有匹配的分支",
|
||||
"agentManager.import.noBranchesFound": "未找到分支。",
|
||||
"agentManager.import.noBranchesHint": "在上方粘贴 PR URL 或创建新的 Worktree。",
|
||||
"agentManager.import.failed": "导入失败",
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
export const dict = {
|
||||
"agentManager.local": "本機",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "工作階段",
|
||||
"agentManager.notGitRepo": "不是 git 儲存庫",
|
||||
"agentManager.worktree.settings": "Worktree 設定",
|
||||
"agentManager.worktree.new": "新建 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 設定指令碼",
|
||||
"agentManager.worktree.delete": "刪除 Worktree",
|
||||
"agentManager.worktree.stale": "已失效",
|
||||
"agentManager.worktree.staleTooltip": "磁碟上不存在,或不再由 git worktree 追蹤",
|
||||
"agentManager.worktree.removeStale": "移除失效 Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "按兩下以重新命名",
|
||||
"agentManager.worktree.versions": "{{count}} 個版本",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 進階選項",
|
||||
"agentManager.hoverCard.branch": "分支",
|
||||
"agentManager.hoverCard.base": "基底",
|
||||
"agentManager.hoverCard.sessions": "工作階段",
|
||||
"agentManager.hoverCard.files": "檔案",
|
||||
"agentManager.hoverCard.changes": "變更",
|
||||
"agentManager.hoverCard.commits": "提交",
|
||||
"agentManager.session.new": "新建工作階段",
|
||||
"agentManager.session.untitled": "未命名",
|
||||
"agentManager.session.newSession": "新建工作階段",
|
||||
"agentManager.session.openInWorktree": "在 Worktree 中開啟",
|
||||
"agentManager.session.readonly": "唯讀工作階段",
|
||||
"agentManager.session.noSessions": "沒有開啟的工作階段",
|
||||
"agentManager.tab.close": "關閉",
|
||||
"agentManager.tab.closeTab": "關閉分頁",
|
||||
"agentManager.tab.terminal": "終端機",
|
||||
"agentManager.tab.openTerminal": "開啟終端機",
|
||||
"agentManager.setup.failed": "工作區設定失敗",
|
||||
"agentManager.setup.settingUp": "正在設定工作區",
|
||||
"agentManager.shortcuts.title": "鍵盤快捷鍵",
|
||||
"agentManager.shortcuts.category.sidebar": "側邊欄",
|
||||
"agentManager.shortcuts.category.tabs": "分頁",
|
||||
"agentManager.shortcuts.category.terminal": "終端機",
|
||||
"agentManager.shortcuts.category.global": "全域",
|
||||
"agentManager.shortcuts.previousItem": "上一個項目",
|
||||
"agentManager.shortcuts.nextItem": "下一個項目",
|
||||
"agentManager.shortcuts.newWorktree": "新建 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "進階 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "刪除 Worktree",
|
||||
"agentManager.shortcuts.previousTab": "上一個分頁",
|
||||
"agentManager.shortcuts.nextTab": "下一個分頁",
|
||||
"agentManager.shortcuts.newTab": "新建分頁",
|
||||
"agentManager.shortcuts.closeTab": "關閉分頁",
|
||||
"agentManager.shortcuts.toggleTerminal": "切換終端機",
|
||||
"agentManager.shortcuts.focusPanel": "聚焦面板",
|
||||
"agentManager.shortcuts.openAgentManager": "開啟 Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "刪除 Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "刪除 Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "?這將從磁碟中移除 Worktree 並取消所有工作階段的關聯。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "取消",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "刪除",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "移除失效 Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "移除失效 Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost": "?這只會移除 Agent Manager 對應,不會變更磁碟上的檔案。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "取消",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新建工作樹",
|
||||
"agentManager.dialog.tab.new": "新建",
|
||||
"agentManager.dialog.tab.import": "匯入",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 名稱(選填)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "輸入訊息(⌘Enter 傳送)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "輸入訊息(Ctrl+Enter 傳送)",
|
||||
"agentManager.dialog.advancedOptions": "進階選項",
|
||||
"agentManager.dialog.branchName": "分支名稱",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自動產生",
|
||||
"agentManager.dialog.baseBranch": "基底分支",
|
||||
"agentManager.dialog.searchBranches": "搜尋分支...",
|
||||
"agentManager.dialog.branchBadge.default": "預設",
|
||||
"agentManager.dialog.branchBadge.remote": "遠端",
|
||||
"agentManager.dialog.versions": "版本",
|
||||
"agentManager.dialog.versionHint": "{{count}} 個 Worktree 將並行執行",
|
||||
"agentManager.dialog.compareModels": "比較模型",
|
||||
"agentManager.dialog.compareModels.searchModels": "搜尋模型...",
|
||||
"agentManager.dialog.creating": "建立中...",
|
||||
"agentManager.dialog.createWorkspace": "建立工作樹",
|
||||
"agentManager.dialog.removeImage": "移除圖片",
|
||||
"agentManager.dialog.advanced": "進階...",
|
||||
|
||||
"agentManager.diff.toggle": "切換差異",
|
||||
"agentManager.diff.openFile": "開啟檔案",
|
||||
"agentManager.apply.button": "套用到本地",
|
||||
"agentManager.apply.globalButton": "套用",
|
||||
"agentManager.apply.tooltip": "將所選工作樹的變更套用到本地分支",
|
||||
"agentManager.apply.dialogTitle": "將變更套用到本地分支",
|
||||
"agentManager.apply.confirm": "立即套用",
|
||||
"agentManager.apply.retry": "重試套用",
|
||||
"agentManager.apply.previewTitle": "將這些變更套用到本地分支?",
|
||||
"agentManager.apply.previewSummary": "{{files}} 個檔案,+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "已選取 {{selected}}/{{total}} 個檔案",
|
||||
"agentManager.apply.selectAll": "全選",
|
||||
"agentManager.apply.selectNone": "取消全選",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 更多",
|
||||
"agentManager.apply.moreReasons": "{{reason}}(+{{count}} 更多)",
|
||||
"agentManager.apply.checking": "檢查中...",
|
||||
"agentManager.apply.applying": "套用中...",
|
||||
"agentManager.apply.success": "變更已套用",
|
||||
"agentManager.apply.conflict": "套用存在衝突",
|
||||
"agentManager.apply.conflictToast": "{{files}} 個檔案中有 {{count}} 個衝突。在套用中查看詳情。",
|
||||
"agentManager.apply.error": "套用失敗",
|
||||
"agentManager.apply.conflictsTitle": "衝突",
|
||||
"agentManager.apply.unknownFile": "未解決的檔案",
|
||||
"agentManager.apply.reason.index": "本地檔案與預期版本不同",
|
||||
"agentManager.apply.reason.patch": "修補程式無法乾淨地套用",
|
||||
"agentManager.apply.reason.contents": "無法讀取目前本地檔案內容",
|
||||
"agentManager.apply.reason.unknown": "偵測到衝突",
|
||||
"agentManager.apply.inline.success": "已套用",
|
||||
"agentManager.apply.inline.conflict": "衝突",
|
||||
"agentManager.apply.inline.error": "失敗",
|
||||
"agentManager.shortcuts.toggleDiff": "切換差異面板",
|
||||
"agentManager.shortcuts.category.quickSwitch": "快速切換",
|
||||
"agentManager.shortcuts.jumpToItem": "跳至項目 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "全部傳送到聊天",
|
||||
"agentManager.review.sendAllToChatWithCount": "全部傳送到聊天 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "在第 {{line}} 行留言",
|
||||
"agentManager.review.editCommentOnLine": "編輯第 {{line}} 行留言",
|
||||
"agentManager.review.commentPlaceholder": "留下留言...",
|
||||
"agentManager.review.commentAction": "留言",
|
||||
"agentManager.review.sendToChat": "傳送到聊天",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 個已摺疊",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 個已摺疊,{{large}} 個過大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "貼上 PR URL...",
|
||||
"agentManager.import.open": "開啟",
|
||||
"agentManager.import.branches": "分支",
|
||||
"agentManager.import.selectBranch": "選擇分支...",
|
||||
"agentManager.import.loading": "載入中...",
|
||||
"agentManager.import.loadingBranches": "正在載入分支...",
|
||||
"agentManager.import.noMatchingBranches": "沒有符合的分支",
|
||||
"agentManager.import.noBranchesFound": "找不到分支。",
|
||||
"agentManager.import.noBranchesHint": "在上方貼上 PR URL 或建立新的 Worktree。",
|
||||
"agentManager.import.failed": "匯入失敗",
|
||||
}
|
||||
@@ -28,12 +28,21 @@ registerExpandedTaskTool()
|
||||
registerVscodeToolOverrides()
|
||||
import SessionList from "./components/history/SessionList"
|
||||
import CloudSessionList from "./components/history/CloudSessionList"
|
||||
import { MigrationWizard } from "./components/migration" // legacy-migration
|
||||
import { NotificationsProvider } from "./context/notifications"
|
||||
import type { Message as SDKMessage, Part as SDKPart } from "@kilocode/sdk/v2"
|
||||
import "./styles/chat.css"
|
||||
|
||||
type ViewType = "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings"
|
||||
const VALID_VIEWS = new Set<string>(["newTask", "marketplace", "history", "cloudHistory", "profile", "settings"])
|
||||
type ViewType = "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" | "migration" // legacy-migration
|
||||
const VALID_VIEWS = new Set<string>([
|
||||
"newTask",
|
||||
"marketplace",
|
||||
"history",
|
||||
"cloudHistory",
|
||||
"profile",
|
||||
"settings",
|
||||
"migration",
|
||||
]) // legacy-migration
|
||||
|
||||
const DummyView: Component<{ title: string }> = (props) => {
|
||||
return (
|
||||
@@ -240,8 +249,14 @@ const AppContent: Component = () => {
|
||||
/>
|
||||
</Match>
|
||||
<Match when={currentView() === "settings"}>
|
||||
<Settings onBack={() => setCurrentView("newTask")} />
|
||||
<Settings onBack={() => setCurrentView("newTask")} onMigrateClick={() => setCurrentView("migration")} />
|
||||
{/* legacy-migration */}
|
||||
</Match>
|
||||
{/* legacy-migration start */}
|
||||
<Match when={currentView() === "migration"}>
|
||||
<MigrationWizard onBack={() => setCurrentView("newTask")} onComplete={() => setCurrentView("newTask")} />
|
||||
</Match>
|
||||
{/* legacy-migration end */}
|
||||
</Switch>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -3,12 +3,19 @@
|
||||
* Renders all parts of an assistant message as a flat list — no context grouping.
|
||||
* Unlike the upstream AssistantParts, this renders each read/glob/grep/list tool
|
||||
* individually for maximum verbosity in the VS Code sidebar context.
|
||||
*
|
||||
* Permissions and questions with a tool context are rendered inline with their
|
||||
* tool call rather than in the bottom dock.
|
||||
*/
|
||||
|
||||
import { Component, For, Show, createMemo } from "solid-js"
|
||||
import { Component, For, Show, createMemo, createSignal } from "solid-js"
|
||||
import { Part, PART_MAPPING } from "@kilocode/kilo-ui/message-part"
|
||||
import { Button } from "@kilocode/kilo-ui/button"
|
||||
import type { AssistantMessage as SDKAssistantMessage, Part as SDKPart, Message as SDKMessage } from "@kilocode/sdk/v2"
|
||||
import { useData } from "@kilocode/kilo-ui/context/data"
|
||||
import { useSession } from "../../context/session"
|
||||
import { useLanguage } from "../../context/language"
|
||||
import { QuestionDock } from "./QuestionDock"
|
||||
|
||||
const HIDDEN_TOOLS = new Set(["todowrite", "todoread"])
|
||||
|
||||
@@ -33,6 +40,8 @@ interface AssistantMessageProps {
|
||||
|
||||
export const AssistantMessage: Component<AssistantMessageProps> = (props) => {
|
||||
const data = useData()
|
||||
const session = useSession()
|
||||
const language = useLanguage()
|
||||
|
||||
const parts = createMemo(() => {
|
||||
const stored = data.store.part?.[props.message.id]
|
||||
@@ -40,18 +49,76 @@ export const AssistantMessage: Component<AssistantMessageProps> = (props) => {
|
||||
return (stored as SDKPart[]).filter(isRenderable)
|
||||
})
|
||||
|
||||
const id = () => session.currentSessionID()
|
||||
const permissions = () => session.permissions().filter((p) => p.sessionID === id() && p.tool)
|
||||
const questions = () => session.questions().filter((q) => q.sessionID === id() && q.tool)
|
||||
|
||||
const permissionForPart = (part: SDKPart) => {
|
||||
if (part.type !== "tool") return undefined
|
||||
const callID = (part as SDKPart & { callID: string }).callID
|
||||
return permissions().find((p) => p.tool!.callID === callID && p.tool!.messageID === props.message.id)
|
||||
}
|
||||
|
||||
// Questions linked to this message (rendered after the last part)
|
||||
const questionForMessage = () =>
|
||||
questions().find((q) => q.tool!.messageID === props.message.id)
|
||||
|
||||
const [responding, setResponding] = createSignal(false)
|
||||
|
||||
const decide = (permissionId: string, response: "once" | "always" | "reject") => {
|
||||
if (responding()) return
|
||||
setResponding(true)
|
||||
session.respondToPermission(permissionId, response)
|
||||
setResponding(false)
|
||||
}
|
||||
|
||||
return (
|
||||
<For each={parts()}>
|
||||
{(part) => (
|
||||
<Show when={PART_MAPPING[part.type]}>
|
||||
<Part
|
||||
part={part}
|
||||
message={props.message as SDKMessage}
|
||||
showAssistantCopyPartID={props.showAssistantCopyPartID}
|
||||
turnDurationMs={props.turnDurationMs}
|
||||
/>
|
||||
</Show>
|
||||
)}
|
||||
</For>
|
||||
<>
|
||||
<For each={parts()}>
|
||||
{(part) => {
|
||||
const perm = () => permissionForPart(part)
|
||||
return (
|
||||
<Show when={PART_MAPPING[part.type]}>
|
||||
<div data-component="tool-part-wrapper" data-permission={!!perm()}>
|
||||
<Part
|
||||
part={part}
|
||||
message={props.message as SDKMessage}
|
||||
showAssistantCopyPartID={props.showAssistantCopyPartID}
|
||||
turnDurationMs={props.turnDurationMs}
|
||||
/>
|
||||
<Show when={perm()} keyed>
|
||||
{(p) => (
|
||||
<div data-component="permission-prompt">
|
||||
<Show when={p.patterns.length > 0}>
|
||||
<div class="permission-dock-patterns">
|
||||
<For each={p.patterns}>
|
||||
{(pattern) => <code class="permission-dock-pattern">{pattern}</code>}
|
||||
</For>
|
||||
</div>
|
||||
</Show>
|
||||
<div data-slot="permission-actions">
|
||||
<Button variant="ghost" size="small" onClick={() => decide(p.id, "reject")} disabled={responding()}>
|
||||
{language.t("ui.permission.deny")}
|
||||
</Button>
|
||||
<Button variant="secondary" size="small" onClick={() => decide(p.id, "always")} disabled={responding()}>
|
||||
{language.t("ui.permission.allowAlways")}
|
||||
</Button>
|
||||
<Button variant="primary" size="small" onClick={() => decide(p.id, "once")} disabled={responding()}>
|
||||
{language.t("ui.permission.allowOnce")}
|
||||
</Button>
|
||||
</div>
|
||||
<p data-slot="permission-hint">{language.t("ui.permission.sessionHint")}</p>
|
||||
</div>
|
||||
)}
|
||||
</Show>
|
||||
</div>
|
||||
</Show>
|
||||
)
|
||||
}}
|
||||
</For>
|
||||
<Show when={questionForMessage()} keyed>
|
||||
{(req) => <QuestionDock request={req} />}
|
||||
</Show>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ export const ChatView: Component<ChatViewProps> = (props) => {
|
||||
const sessionQuestions = () => session.questions().filter((q) => q.sessionID === id())
|
||||
const sessionPermissions = () => session.permissions().filter((p) => p.sessionID === id())
|
||||
|
||||
const questionRequest = () => sessionQuestions()[0]
|
||||
const questionRequest = () => sessionQuestions().find((q) => !q.tool)
|
||||
const permissionRequest = () => sessionPermissions().find((p) => !p.tool)
|
||||
const blocked = () => sessionPermissions().length > 0 || sessionQuestions().length > 0
|
||||
|
||||
|
||||
@@ -0,0 +1,856 @@
|
||||
/**
|
||||
* legacy-migration - Multi-step migration wizard UI component.
|
||||
*
|
||||
* Steps:
|
||||
* 1. Welcome — informs the user about what can / cannot be migrated
|
||||
* 2. Select — checkboxes for providers, MCP servers, custom modes, default model
|
||||
* 3. Progress — live progress indicators during migration
|
||||
* 4. Complete — summary + optional cleanup checkbox
|
||||
*/
|
||||
|
||||
import { Component, For, Show, Switch, Match, createSignal, onMount, onCleanup, JSX } from "solid-js"
|
||||
import { useVSCode } from "../../context/vscode"
|
||||
import { useLanguage } from "../../context/language"
|
||||
import type {
|
||||
MigrationProviderInfo,
|
||||
MigrationMcpServerInfo,
|
||||
MigrationCustomModeInfo,
|
||||
MigrationResultItem,
|
||||
MigrationAutoApprovalSelections,
|
||||
LegacySettings,
|
||||
LegacyMigrationDataMessage,
|
||||
LegacyMigrationProgressMessage,
|
||||
LegacyMigrationCompleteMessage,
|
||||
} from "../../types/messages"
|
||||
import "./migration.css"
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// KiloLogo — replicates the pattern from MessageList.tsx
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const KiloLogo = (): JSX.Element => {
|
||||
const iconsBaseUri = (window as { ICONS_BASE_URI?: string }).ICONS_BASE_URI || ""
|
||||
const isLight =
|
||||
document.body.classList.contains("vscode-light") || document.body.classList.contains("vscode-high-contrast-light")
|
||||
const icon = isLight ? "kilo-light.svg" : "kilo-dark.svg"
|
||||
return (
|
||||
<div class="migration-wizard__welcome-logo">
|
||||
<img src={`${iconsBaseUri}/${icon}`} alt="Kilo Code" />
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// CheckIcon — checkmark SVG for completed steps
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const CheckIcon = (): JSX.Element => (
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="2.5"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
>
|
||||
<path d="M20 6 9 17l-5-5" />
|
||||
</svg>
|
||||
)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Types
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
type Step = "welcome" | "select" | "progress" | "complete"
|
||||
type StepStatus = "upcoming" | "current" | "done"
|
||||
|
||||
interface ProgressEntry {
|
||||
item: string
|
||||
status: "pending" | "migrating" | "success" | "warning" | "error"
|
||||
message?: string
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Component
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export interface MigrationWizardProps {
|
||||
onBack: () => void
|
||||
onComplete: () => void
|
||||
}
|
||||
|
||||
const MigrationWizard: Component<MigrationWizardProps> = (props) => {
|
||||
const vscode = useVSCode()
|
||||
const language = useLanguage()
|
||||
|
||||
const [step, setStep] = createSignal<Step>("welcome")
|
||||
const [providers, setProviders] = createSignal<MigrationProviderInfo[]>([])
|
||||
const [mcpServers, setMcpServers] = createSignal<MigrationMcpServerInfo[]>([])
|
||||
const [customModes, setCustomModes] = createSignal<MigrationCustomModeInfo[]>([])
|
||||
const [defaultModel, setDefaultModel] = createSignal<{ provider: string; model: string } | undefined>(undefined)
|
||||
const [legacySettings, setLegacySettings] = createSignal<LegacySettings | undefined>(undefined)
|
||||
|
||||
// Selections (profile names / server names / mode slugs)
|
||||
const [selectedProviders, setSelectedProviders] = createSignal<Set<string>>(new Set())
|
||||
const [selectedMcpServers, setSelectedMcpServers] = createSignal<Set<string>>(new Set())
|
||||
const [selectedModes, setSelectedModes] = createSignal<Set<string>>(new Set())
|
||||
const [migrateDefaultModel, setMigrateDefaultModel] = createSignal(true)
|
||||
const ALL_AP_OFF: MigrationAutoApprovalSelections = {
|
||||
commandRules: false,
|
||||
readPermission: false,
|
||||
writePermission: false,
|
||||
executePermission: false,
|
||||
mcpPermission: false,
|
||||
taskPermission: false,
|
||||
}
|
||||
const [autoApprovalSel, setAutoApprovalSel] = createSignal<MigrationAutoApprovalSelections>({ ...ALL_AP_OFF })
|
||||
const [migrateLanguage, setMigrateLanguage] = createSignal(false)
|
||||
const [migrateAutocomplete, setMigrateAutocomplete] = createSignal(false)
|
||||
|
||||
// Progress tracking
|
||||
const [progressEntries, setProgressEntries] = createSignal<ProgressEntry[]>([])
|
||||
const [results, setResults] = createSignal<MigrationResultItem[]>([])
|
||||
const [migrationDone, setMigrationDone] = createSignal(false)
|
||||
|
||||
// Cleanup preference on the completion screen
|
||||
const [clearLegacyData, setClearLegacyData] = createSignal(false)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Message handling
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
onMount(() => {
|
||||
const handler = (event: MessageEvent) => {
|
||||
const msg = event.data
|
||||
if (msg?.type === "legacyMigrationData") {
|
||||
const data = (msg as LegacyMigrationDataMessage).data
|
||||
setProviders(data.providers)
|
||||
setMcpServers(data.mcpServers)
|
||||
setCustomModes(data.customModes)
|
||||
setDefaultModel(data.defaultModel)
|
||||
setLegacySettings(data.settings)
|
||||
|
||||
// Pre-select everything that is supported and has a key
|
||||
setSelectedProviders(
|
||||
new Set(data.providers.filter((p) => p.supported && p.hasApiKey).map((p) => p.profileName)),
|
||||
)
|
||||
setSelectedMcpServers(new Set(data.mcpServers.map((s) => s.name)))
|
||||
setSelectedModes(new Set(data.customModes.map((m) => m.slug)))
|
||||
setMigrateDefaultModel(Boolean(data.defaultModel))
|
||||
|
||||
// Pre-select settings migration if data exists
|
||||
const s = data.settings
|
||||
if (s) {
|
||||
setAutoApprovalSel({
|
||||
commandRules:
|
||||
s.autoApprovalEnabled !== undefined ||
|
||||
Boolean(s.allowedCommands?.length) ||
|
||||
Boolean(s.deniedCommands?.length),
|
||||
readPermission: s.alwaysAllowReadOnly !== undefined || s.alwaysAllowReadOnlyOutsideWorkspace !== undefined,
|
||||
writePermission: s.alwaysAllowWrite !== undefined,
|
||||
executePermission: s.alwaysAllowExecute !== undefined,
|
||||
mcpPermission: s.alwaysAllowMcp !== undefined,
|
||||
taskPermission: s.alwaysAllowModeSwitch !== undefined || s.alwaysAllowSubtasks !== undefined,
|
||||
})
|
||||
setMigrateLanguage(Boolean(s.language))
|
||||
setMigrateAutocomplete(Boolean(s.autocomplete))
|
||||
}
|
||||
}
|
||||
|
||||
if (msg?.type === "legacyMigrationProgress") {
|
||||
const update = msg as LegacyMigrationProgressMessage
|
||||
setProgressEntries((prev) => {
|
||||
const existing = prev.findIndex((e) => e.item === update.item)
|
||||
const entry: ProgressEntry = { item: update.item, status: update.status, message: update.message }
|
||||
return existing >= 0 ? prev.map((e, i) => (i === existing ? entry : e)) : [...prev, entry]
|
||||
})
|
||||
}
|
||||
|
||||
if (msg?.type === "legacyMigrationComplete") {
|
||||
const complete = msg as LegacyMigrationCompleteMessage
|
||||
setResults(complete.results)
|
||||
setMigrationDone(true)
|
||||
setStep("complete")
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener("message", handler)
|
||||
// Request data immediately when the wizard mounts
|
||||
vscode.postMessage({ type: "requestLegacyMigrationData" })
|
||||
onCleanup(() => window.removeEventListener("message", handler))
|
||||
})
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Actions
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const handleSkip = () => {
|
||||
vscode.postMessage({ type: "skipLegacyMigration" })
|
||||
props.onBack()
|
||||
}
|
||||
|
||||
const handleStartMigration = () => {
|
||||
const allItems: ProgressEntry[] = [
|
||||
...Array.from(selectedProviders()).map((name) => ({ item: name, status: "pending" as const })),
|
||||
...Array.from(selectedMcpServers()).map((name) => ({ item: name, status: "pending" as const })),
|
||||
...Array.from(selectedModes()).map((slug) => {
|
||||
const mode = customModes().find((m) => m.slug === slug)
|
||||
return { item: mode?.name ?? slug, status: "pending" as const }
|
||||
}),
|
||||
...(migrateDefaultModel() && defaultModel() ? [{ item: "Default model", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().commandRules ? [{ item: "Command rules", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().readPermission ? [{ item: "Read permission", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().writePermission ? [{ item: "Write permission", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().executePermission ? [{ item: "Execute permission", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().mcpPermission ? [{ item: "MCP permission", status: "pending" as const }] : []),
|
||||
...(autoApprovalSel().taskPermission ? [{ item: "Task permission", status: "pending" as const }] : []),
|
||||
...(migrateLanguage() && legacySettings()?.language
|
||||
? [{ item: "Language preference", status: "pending" as const }]
|
||||
: []),
|
||||
...(migrateAutocomplete() && legacySettings()?.autocomplete
|
||||
? [{ item: "Autocomplete settings", status: "pending" as const }]
|
||||
: []),
|
||||
]
|
||||
setProgressEntries(allItems)
|
||||
setStep("progress")
|
||||
vscode.postMessage({
|
||||
type: "startLegacyMigration",
|
||||
selections: {
|
||||
providers: Array.from(selectedProviders()),
|
||||
mcpServers: Array.from(selectedMcpServers()),
|
||||
customModes: Array.from(selectedModes()),
|
||||
defaultModel: migrateDefaultModel(),
|
||||
settings: {
|
||||
autoApproval: autoApprovalSel(),
|
||||
language: migrateLanguage(),
|
||||
autocomplete: migrateAutocomplete(),
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
|
||||
const handleDone = () => {
|
||||
if (clearLegacyData()) {
|
||||
vscode.postMessage({ type: "clearLegacyData" })
|
||||
}
|
||||
props.onComplete()
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Selection helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const toggleProvider = (name: string) => {
|
||||
setSelectedProviders((prev) => {
|
||||
const next = new Set(prev)
|
||||
next.has(name) ? next.delete(name) : next.add(name)
|
||||
return next
|
||||
})
|
||||
}
|
||||
|
||||
const toggleMcpServer = (name: string) => {
|
||||
setSelectedMcpServers((prev) => {
|
||||
const next = new Set(prev)
|
||||
next.has(name) ? next.delete(name) : next.add(name)
|
||||
return next
|
||||
})
|
||||
}
|
||||
|
||||
const toggleMode = (slug: string) => {
|
||||
setSelectedModes((prev) => {
|
||||
const next = new Set(prev)
|
||||
next.has(slug) ? next.delete(slug) : next.add(slug)
|
||||
return next
|
||||
})
|
||||
}
|
||||
|
||||
const anyAutoApprovalSelected = () => Object.values(autoApprovalSel()).some(Boolean)
|
||||
|
||||
const hasAnySelection = () =>
|
||||
selectedProviders().size > 0 ||
|
||||
selectedMcpServers().size > 0 ||
|
||||
selectedModes().size > 0 ||
|
||||
(migrateDefaultModel() && Boolean(defaultModel())) ||
|
||||
anyAutoApprovalSelected() ||
|
||||
(migrateLanguage() && Boolean(legacySettings()?.language)) ||
|
||||
(migrateAutocomplete() && Boolean(legacySettings()?.autocomplete))
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Settings data helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const hasCommandRulesData = () => {
|
||||
const s = legacySettings()
|
||||
return (
|
||||
s !== undefined &&
|
||||
(s.autoApprovalEnabled !== undefined || Boolean(s.allowedCommands?.length) || Boolean(s.deniedCommands?.length))
|
||||
)
|
||||
}
|
||||
const hasReadPermissionData = () => {
|
||||
const s = legacySettings()
|
||||
return (
|
||||
s !== undefined && (s.alwaysAllowReadOnly !== undefined || s.alwaysAllowReadOnlyOutsideWorkspace !== undefined)
|
||||
)
|
||||
}
|
||||
const hasWritePermissionData = () => legacySettings()?.alwaysAllowWrite !== undefined
|
||||
const hasExecutePermissionData = () => legacySettings()?.alwaysAllowExecute !== undefined
|
||||
const hasMcpPermissionData = () => legacySettings()?.alwaysAllowMcp !== undefined
|
||||
const hasTaskPermissionData = () => {
|
||||
const s = legacySettings()
|
||||
return s !== undefined && (s.alwaysAllowModeSwitch !== undefined || s.alwaysAllowSubtasks !== undefined)
|
||||
}
|
||||
|
||||
const hasAnyAutoApprovalData = () =>
|
||||
hasCommandRulesData() ||
|
||||
hasReadPermissionData() ||
|
||||
hasWritePermissionData() ||
|
||||
hasExecutePermissionData() ||
|
||||
hasMcpPermissionData() ||
|
||||
hasTaskPermissionData()
|
||||
|
||||
const hasLanguageData = () => Boolean(legacySettings()?.language)
|
||||
|
||||
const hasAutocompleteData = () => Boolean(legacySettings()?.autocomplete)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Result summary helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const successCount = () => results().filter((r) => r.status === "success").length
|
||||
const totalCount = () => results().length
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Step indicator helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
// The 3-step indicator maps to the non-welcome steps
|
||||
const WIZARD_STEPS: Step[] = ["select", "progress", "complete"]
|
||||
|
||||
const stepStatus = (s: Step): StepStatus => {
|
||||
const idx = WIZARD_STEPS.indexOf(s)
|
||||
const curr = WIZARD_STEPS.indexOf(step())
|
||||
if (curr < 0) return "upcoming" // welcome step — all upcoming
|
||||
if (curr > idx) return "done"
|
||||
if (curr === idx) return "current"
|
||||
return "upcoming"
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Progress item render helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const dotColor = (status: ProgressEntry["status"]) => {
|
||||
switch (status) {
|
||||
case "success":
|
||||
return "var(--vscode-testing-iconPassed, #89d185)"
|
||||
case "warning":
|
||||
return "var(--vscode-testing-iconQueued, #cca700)"
|
||||
case "error":
|
||||
return "var(--vscode-testing-iconFailed, #f14c4c)"
|
||||
case "migrating":
|
||||
return "var(--vscode-button-background)"
|
||||
default:
|
||||
return "var(--vscode-descriptionForeground)"
|
||||
}
|
||||
}
|
||||
|
||||
const statusLabel = (status: ProgressEntry["status"]) => {
|
||||
switch (status) {
|
||||
case "success":
|
||||
return "✓ Done"
|
||||
case "warning":
|
||||
return "⚠ Warning"
|
||||
case "error":
|
||||
return "✗ Failed"
|
||||
case "migrating":
|
||||
return "..."
|
||||
default:
|
||||
return ""
|
||||
}
|
||||
}
|
||||
|
||||
const statusLabelColor = (status: ProgressEntry["status"]) => {
|
||||
switch (status) {
|
||||
case "success":
|
||||
return "var(--vscode-testing-iconPassed, #89d185)"
|
||||
case "warning":
|
||||
return "var(--vscode-testing-iconQueued, #cca700)"
|
||||
case "error":
|
||||
return "var(--vscode-testing-iconFailed, #f14c4c)"
|
||||
default:
|
||||
return "var(--vscode-descriptionForeground)"
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// JSX
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
return (
|
||||
<div class="migration-wizard">
|
||||
{/* Header — only shown on steps 2-4 */}
|
||||
<Show when={step() !== "welcome"}>
|
||||
<div class="migration-wizard__header">
|
||||
<h2 class="migration-wizard__title">{language.t("migration.steps.title")}</h2>
|
||||
<p class="migration-wizard__header-subtitle">{language.t("migration.steps.subtitle")}</p>
|
||||
|
||||
{/* Step indicator */}
|
||||
<div class="migration-wizard__steps">
|
||||
<For each={WIZARD_STEPS}>
|
||||
{(s, i) => (
|
||||
<>
|
||||
<div class={`migration-wizard__step migration-wizard__step--${stepStatus(s)}`}>
|
||||
<Switch>
|
||||
<Match when={stepStatus(s) === "done"}>
|
||||
<CheckIcon />
|
||||
</Match>
|
||||
<Match when={true}>
|
||||
<span>{i() + 1}</span>
|
||||
</Match>
|
||||
</Switch>
|
||||
</div>
|
||||
<Show when={i() < WIZARD_STEPS.length - 1}>
|
||||
<span
|
||||
class={`migration-wizard__step-connector${stepStatus(s) === "done" ? " migration-wizard__step-connector--done" : ""}`}
|
||||
/>
|
||||
</Show>
|
||||
</>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<div class="migration-wizard__body">
|
||||
{/* ---- Step 1: Welcome ---- */}
|
||||
<Show when={step() === "welcome"}>
|
||||
<div class="migration-wizard__welcome">
|
||||
<KiloLogo />
|
||||
<h2 class="migration-wizard__welcome-title">{language.t("migration.welcome.title")}</h2>
|
||||
<p class="migration-wizard__welcome-subtitle">{language.t("migration.welcome.detected")}</p>
|
||||
|
||||
<div class="migration-wizard__welcome-cards">
|
||||
<div class="migration-wizard__info-card migration-wizard__info-card--warning">
|
||||
<strong>{language.t("migration.welcome.sessionsInfo")}</strong>
|
||||
</div>
|
||||
|
||||
<div class="migration-wizard__info-card">
|
||||
<p style={{ margin: 0 }}>{language.t("migration.welcome.canMigrate")}</p>
|
||||
<ul class="migration-wizard__list">
|
||||
<Show when={providers().length > 0}>
|
||||
<li>
|
||||
{language.t("migration.select.providers")} ({providers().filter((p) => p.supported).length})
|
||||
</li>
|
||||
</Show>
|
||||
<Show when={mcpServers().length > 0}>
|
||||
<li>
|
||||
{language.t("migration.select.mcpServers")} ({mcpServers().length})
|
||||
</li>
|
||||
</Show>
|
||||
<Show when={customModes().length > 0}>
|
||||
<li>
|
||||
{language.t("migration.select.customModes")} ({customModes().length})
|
||||
</li>
|
||||
</Show>
|
||||
<Show when={Boolean(defaultModel())}>
|
||||
<li>{language.t("migration.select.defaultModel")}</li>
|
||||
</Show>
|
||||
<Show when={hasAnyAutoApprovalData()}>
|
||||
<li>{language.t("migration.select.autoApproval")}</li>
|
||||
</Show>
|
||||
<Show when={hasLanguageData()}>
|
||||
<li>{language.t("migration.select.language")}</li>
|
||||
</Show>
|
||||
<Show when={hasAutocompleteData()}>
|
||||
<li>{language.t("migration.select.autocomplete")}</li>
|
||||
</Show>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="migration-wizard__footer">
|
||||
<button type="button" class="migration-wizard__btn migration-wizard__btn--ghost" onClick={handleSkip}>
|
||||
{language.t("migration.welcome.skip")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="migration-wizard__btn migration-wizard__btn--primary"
|
||||
onClick={() => setStep("select")}
|
||||
>
|
||||
{language.t("migration.welcome.start")}
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* ---- Step 2: Select ---- */}
|
||||
<Show when={step() === "select"}>
|
||||
<div class="migration-wizard__content">
|
||||
{/* Provider API Keys */}
|
||||
<Show when={providers().length > 0}>
|
||||
<div class="migration-wizard__section">
|
||||
<h4 class="migration-wizard__section-title">{language.t("migration.select.providers")}</h4>
|
||||
<For each={providers()}>
|
||||
{(provider) => (
|
||||
<label
|
||||
class={`migration-wizard__item${!provider.supported || !provider.hasApiKey ? " migration-wizard__item--disabled" : ""}`}
|
||||
>
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={selectedProviders().has(provider.profileName)}
|
||||
disabled={!provider.supported || !provider.hasApiKey}
|
||||
onChange={() => toggleProvider(provider.profileName)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{provider.profileName}</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{provider.newProviderName ?? provider.provider}
|
||||
{provider.model ? ` · ${provider.model}` : ""}
|
||||
</span>
|
||||
<Show when={!provider.supported}>
|
||||
<span class="migration-wizard__item-tag migration-wizard__item-tag--warn">
|
||||
{language.t("migration.select.unsupported")}
|
||||
</span>
|
||||
</Show>
|
||||
<Show when={provider.supported && !provider.hasApiKey}>
|
||||
<span class="migration-wizard__item-tag migration-wizard__item-tag--warn">No API key</span>
|
||||
</Show>
|
||||
</div>
|
||||
</label>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* MCP Servers */}
|
||||
<Show when={mcpServers().length > 0}>
|
||||
<div class="migration-wizard__section">
|
||||
<h4 class="migration-wizard__section-title">{language.t("migration.select.mcpServers")}</h4>
|
||||
<For each={mcpServers()}>
|
||||
{(server) => (
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={selectedMcpServers().has(server.name)}
|
||||
onChange={() => toggleMcpServer(server.name)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{server.name}</span>
|
||||
<span class="migration-wizard__item-meta">{server.type}</span>
|
||||
</div>
|
||||
</label>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* Custom Modes */}
|
||||
<Show when={customModes().length > 0}>
|
||||
<div class="migration-wizard__section">
|
||||
<h4 class="migration-wizard__section-title">{language.t("migration.select.customModes")}</h4>
|
||||
<For each={customModes()}>
|
||||
{(mode) => (
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={selectedModes().has(mode.slug)}
|
||||
onChange={() => toggleMode(mode.slug)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{mode.name}</span>
|
||||
<span class="migration-wizard__item-meta">{mode.slug}</span>
|
||||
</div>
|
||||
</label>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* Default Model */}
|
||||
<Show when={Boolean(defaultModel())}>
|
||||
<div class="migration-wizard__section">
|
||||
<h4 class="migration-wizard__section-title">{language.t("migration.select.defaultModel")}</h4>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={migrateDefaultModel()}
|
||||
onChange={(e) => setMigrateDefaultModel(e.currentTarget.checked)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{defaultModel()?.provider}</span>
|
||||
<span class="migration-wizard__item-meta">{defaultModel()?.model}</span>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* Settings (auto-approval, language, autocomplete) */}
|
||||
<Show when={hasAnyAutoApprovalData() || hasLanguageData() || hasAutocompleteData()}>
|
||||
<div class="migration-wizard__section">
|
||||
<h4 class="migration-wizard__section-title">{language.t("migration.select.settings")}</h4>
|
||||
|
||||
{/* Auto-Approval — one row per permission group */}
|
||||
<Show when={hasAnyAutoApprovalData()}>
|
||||
<p class="migration-wizard__section-subtitle">{language.t("migration.select.autoApproval")}</p>
|
||||
<Show when={hasCommandRulesData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().commandRules}
|
||||
onChange={(e) => setAutoApprovalSel((p) => ({ ...p, commandRules: e.currentTarget.checked }))}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.commandRules")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.commandRulesDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasReadPermissionData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().readPermission}
|
||||
onChange={(e) => setAutoApprovalSel((p) => ({ ...p, readPermission: e.currentTarget.checked }))}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.readPermission")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.readPermissionDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasWritePermissionData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().writePermission}
|
||||
onChange={(e) =>
|
||||
setAutoApprovalSel((p) => ({ ...p, writePermission: e.currentTarget.checked }))
|
||||
}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.writePermission")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.writePermissionDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasExecutePermissionData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().executePermission}
|
||||
onChange={(e) =>
|
||||
setAutoApprovalSel((p) => ({ ...p, executePermission: e.currentTarget.checked }))
|
||||
}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.executePermission")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.executePermissionDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasMcpPermissionData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().mcpPermission}
|
||||
onChange={(e) => setAutoApprovalSel((p) => ({ ...p, mcpPermission: e.currentTarget.checked }))}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.mcpPermission")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.mcpPermissionDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasTaskPermissionData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={autoApprovalSel().taskPermission}
|
||||
onChange={(e) => setAutoApprovalSel((p) => ({ ...p, taskPermission: e.currentTarget.checked }))}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">
|
||||
{language.t("migration.select.autoApproval.taskPermission")}
|
||||
</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.autoApproval.taskPermissionDesc")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
</Show>
|
||||
|
||||
<Show when={hasLanguageData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={migrateLanguage()}
|
||||
onChange={(e) => setMigrateLanguage(e.currentTarget.checked)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{language.t("migration.select.language")}</span>
|
||||
<span class="migration-wizard__item-meta">
|
||||
{language.t("migration.select.languageDesc")} ({legacySettings()?.language})
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
<Show when={hasAutocompleteData()}>
|
||||
<label class="migration-wizard__item">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={migrateAutocomplete()}
|
||||
onChange={(e) => setMigrateAutocomplete(e.currentTarget.checked)}
|
||||
/>
|
||||
<div class="migration-wizard__item-info">
|
||||
<span class="migration-wizard__item-name">{language.t("migration.select.autocomplete")}</span>
|
||||
<span class="migration-wizard__item-meta">{language.t("migration.select.autocompleteDesc")}</span>
|
||||
</div>
|
||||
</label>
|
||||
</Show>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
<Show
|
||||
when={
|
||||
providers().length === 0 &&
|
||||
mcpServers().length === 0 &&
|
||||
customModes().length === 0 &&
|
||||
!hasAnyAutoApprovalData() &&
|
||||
!hasLanguageData() &&
|
||||
!hasAutocompleteData()
|
||||
}
|
||||
>
|
||||
<p class="migration-wizard__empty">{language.t("migration.select.nothingToMigrate")}</p>
|
||||
</Show>
|
||||
</div>
|
||||
|
||||
<div class="migration-wizard__footer">
|
||||
<button
|
||||
type="button"
|
||||
class="migration-wizard__btn migration-wizard__btn--ghost"
|
||||
onClick={() => setStep("welcome")}
|
||||
>
|
||||
{language.t("migration.select.back")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="migration-wizard__btn migration-wizard__btn--primary"
|
||||
disabled={!hasAnySelection()}
|
||||
onClick={handleStartMigration}
|
||||
>
|
||||
{language.t("migration.select.continue")}
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* ---- Step 3: Progress ---- */}
|
||||
<Show when={step() === "progress"}>
|
||||
<div class="migration-wizard__content">
|
||||
<div class="migration-wizard__progress-card">
|
||||
<p class="migration-wizard__lead">{language.t("migration.progress.title")}</p>
|
||||
<div class="migration-wizard__progress-list">
|
||||
<For each={progressEntries()}>
|
||||
{(entry) => (
|
||||
<div class="migration-wizard__progress-item">
|
||||
<span class="migration-wizard__progress-dot" style={{ background: dotColor(entry.status) }} />
|
||||
<span class="migration-wizard__progress-name">{entry.item}</span>
|
||||
<Show when={entry.message}>
|
||||
<span class="migration-wizard__progress-msg">{entry.message}</span>
|
||||
</Show>
|
||||
<Show when={statusLabel(entry.status)}>
|
||||
<span
|
||||
class="migration-wizard__progress-label"
|
||||
style={{ color: statusLabelColor(entry.status) }}
|
||||
>
|
||||
{statusLabel(entry.status)}
|
||||
</span>
|
||||
</Show>
|
||||
</div>
|
||||
)}
|
||||
</For>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="migration-wizard__footer">
|
||||
<button
|
||||
type="button"
|
||||
class="migration-wizard__btn migration-wizard__btn--ghost"
|
||||
onClick={() => setStep("select")}
|
||||
>
|
||||
{language.t("migration.select.back")}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="migration-wizard__btn migration-wizard__btn--primary"
|
||||
disabled={!migrationDone()}
|
||||
onClick={() => setStep("complete")}
|
||||
>
|
||||
{language.t("migration.progress.done")}
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
|
||||
{/* ---- Step 4: Complete ---- */}
|
||||
<Show when={step() === "complete"}>
|
||||
<div class="migration-wizard__content">
|
||||
<div class="migration-wizard__info-card migration-wizard__info-card--success">
|
||||
<strong>
|
||||
{language.t("migration.complete.summary", {
|
||||
success: String(successCount()),
|
||||
total: String(totalCount()),
|
||||
})}
|
||||
</strong>
|
||||
</div>
|
||||
|
||||
<label class="migration-wizard__cleanup">
|
||||
<input
|
||||
type="checkbox"
|
||||
checked={clearLegacyData()}
|
||||
onChange={(e) => setClearLegacyData(e.currentTarget.checked)}
|
||||
/>
|
||||
<div>
|
||||
<span class="migration-wizard__cleanup-label">{language.t("migration.complete.cleanup")}</span>
|
||||
<span class="migration-wizard__cleanup-desc">
|
||||
{language.t("migration.complete.cleanupDescription")}
|
||||
</span>
|
||||
</div>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="migration-wizard__footer">
|
||||
<button type="button" class="migration-wizard__btn migration-wizard__btn--primary" onClick={handleDone}>
|
||||
{language.t("migration.complete.done")}
|
||||
</button>
|
||||
</div>
|
||||
</Show>
|
||||
</div>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default MigrationWizard
|
||||
@@ -0,0 +1,5 @@
|
||||
/**
|
||||
* legacy-migration - Barrel export for the migration wizard webview components.
|
||||
* Delete this entire directory when dropping legacy migration support.
|
||||
*/
|
||||
export { default as MigrationWizard } from "./MigrationWizard"
|
||||
@@ -0,0 +1,443 @@
|
||||
/* legacy-migration - Scoped styles for the migration wizard. */
|
||||
|
||||
.migration-wizard {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
font-size: 13px;
|
||||
color: var(--vscode-foreground);
|
||||
}
|
||||
|
||||
/* Header */
|
||||
.migration-wizard__header {
|
||||
padding: 16px 20px 14px;
|
||||
border-bottom: 1px solid var(--vscode-panel-border, var(--border-weak-base));
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__title {
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 4px;
|
||||
}
|
||||
|
||||
.migration-wizard__header-subtitle {
|
||||
font-size: 11px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
margin: 0 0 12px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Body */
|
||||
.migration-wizard__body {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
overflow: hidden;
|
||||
padding: 16px 20px;
|
||||
gap: 12px;
|
||||
}
|
||||
|
||||
/* Welcome screen — centered hero layout */
|
||||
.migration-wizard__welcome {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
overflow-y: auto;
|
||||
padding: 28px 8px 8px;
|
||||
gap: 0;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__welcome-logo {
|
||||
width: 52px;
|
||||
height: 52px;
|
||||
margin-bottom: 16px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__welcome-logo img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.migration-wizard__welcome-title {
|
||||
font-size: 18px;
|
||||
font-weight: 600;
|
||||
margin: 0 0 8px;
|
||||
color: var(--vscode-foreground);
|
||||
}
|
||||
|
||||
.migration-wizard__welcome-subtitle {
|
||||
margin: 0 0 20px;
|
||||
text-align: center;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.migration-wizard__welcome-cards {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
width: 100%;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
/* Step indicator */
|
||||
.migration-wizard__steps {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__step {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
border-radius: 50%;
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.2s ease;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
/* Connector line rendered as a sibling <span> element in the JSX */
|
||||
.migration-wizard__step-connector {
|
||||
width: 28px;
|
||||
height: 2px;
|
||||
background: var(--vscode-panel-border);
|
||||
flex-shrink: 0;
|
||||
margin: 0 2px;
|
||||
transition: background 0.2s ease;
|
||||
}
|
||||
|
||||
.migration-wizard__step-connector--done {
|
||||
background: var(--vscode-testing-iconPassed, #89d185);
|
||||
}
|
||||
|
||||
.migration-wizard__step--upcoming {
|
||||
background: var(--vscode-input-background);
|
||||
border: 1px solid var(--vscode-panel-border);
|
||||
color: var(--vscode-descriptionForeground);
|
||||
}
|
||||
|
||||
.migration-wizard__step--current {
|
||||
background: var(--vscode-button-background);
|
||||
color: var(--vscode-button-foreground);
|
||||
box-shadow:
|
||||
0 0 0 2px color-mix(in srgb, var(--vscode-button-background) 40%, transparent),
|
||||
0 0 0 4px var(--vscode-editor-background, var(--vscode-sideBar-background));
|
||||
}
|
||||
|
||||
.migration-wizard__step--done {
|
||||
background: var(--vscode-testing-iconPassed, #89d185);
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Scrollable content area */
|
||||
.migration-wizard__content {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
/* Lead paragraph */
|
||||
.migration-wizard__lead {
|
||||
margin: 0 0 8px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
/* Info cards */
|
||||
.migration-wizard__info-card {
|
||||
background: var(--vscode-editor-background);
|
||||
border: 1px solid var(--vscode-panel-border);
|
||||
border-radius: 4px;
|
||||
padding: 12px;
|
||||
font-size: 12px;
|
||||
line-height: 1.5;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
}
|
||||
|
||||
.migration-wizard__info-card--warning {
|
||||
border-color: var(--vscode-inputValidation-warningBorder, #cca700);
|
||||
background: var(--vscode-inputValidation-warningBackground, rgba(204, 167, 0, 0.1));
|
||||
color: var(--vscode-foreground);
|
||||
}
|
||||
|
||||
.migration-wizard__info-card--success {
|
||||
border-color: var(--vscode-testing-iconPassed, #89d185);
|
||||
background: rgba(137, 209, 133, 0.08);
|
||||
color: var(--vscode-foreground);
|
||||
}
|
||||
|
||||
.migration-wizard__list {
|
||||
margin: 8px 0 0 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
|
||||
.migration-wizard__list li {
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
/* Section groups */
|
||||
.migration-wizard__section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.migration-wizard__section-title {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
margin: 0 0 4px 0;
|
||||
padding-bottom: 6px;
|
||||
border-bottom: 1px solid var(--vscode-panel-border);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.06em;
|
||||
}
|
||||
|
||||
.migration-wizard__section-subtitle {
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
margin: 8px 0 2px 0;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
/* Checkbox items */
|
||||
.migration-wizard__item {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
padding: 6px 4px;
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.migration-wizard__item:hover {
|
||||
background: var(--vscode-list-hoverBackground);
|
||||
}
|
||||
|
||||
.migration-wizard__item--disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.migration-wizard__item input[type="checkbox"] {
|
||||
margin-top: 2px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__item-info {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__item-name {
|
||||
font-size: 12px;
|
||||
color: var(--vscode-foreground);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.migration-wizard__item-meta {
|
||||
font-size: 11px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.migration-wizard__item-tag {
|
||||
display: inline-block;
|
||||
font-size: 10px;
|
||||
padding: 1px 5px;
|
||||
border-radius: 10px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.migration-wizard__item-tag--warn {
|
||||
background: rgba(204, 167, 0, 0.15);
|
||||
color: var(--vscode-testing-iconQueued, #cca700);
|
||||
border: 1px solid var(--vscode-inputValidation-warningBorder, #cca700);
|
||||
}
|
||||
|
||||
.migration-wizard__empty {
|
||||
margin: 0;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
/* Approval settings info note */
|
||||
.migration-wizard__note {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 6px;
|
||||
padding: 0 2px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.migration-wizard__note-icon {
|
||||
flex-shrink: 0;
|
||||
margin-top: 1px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
}
|
||||
|
||||
.migration-wizard__note-text {
|
||||
margin: 0;
|
||||
font-size: 11px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Progress card wrapper */
|
||||
.migration-wizard__progress-card {
|
||||
background: var(--vscode-editor-background);
|
||||
border: 1px solid var(--vscode-panel-border);
|
||||
border-radius: 4px;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
/* Progress list */
|
||||
.migration-wizard__progress-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.migration-wizard__progress-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.migration-wizard__progress-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__progress-name {
|
||||
color: var(--vscode-foreground);
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.migration-wizard__progress-msg {
|
||||
color: var(--vscode-descriptionForeground);
|
||||
font-size: 11px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__progress-label {
|
||||
font-size: 11px;
|
||||
flex-shrink: 0;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
/* Cleanup checkbox on completion screen */
|
||||
.migration-wizard__cleanup {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
background: var(--vscode-editor-background);
|
||||
border: 1px solid var(--vscode-panel-border);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
transition: background 0.1s;
|
||||
}
|
||||
|
||||
.migration-wizard__cleanup:hover {
|
||||
background: var(--vscode-list-hoverBackground);
|
||||
}
|
||||
|
||||
.migration-wizard__cleanup input[type="checkbox"] {
|
||||
margin-top: 2px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.migration-wizard__cleanup-label {
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
color: var(--vscode-foreground);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.migration-wizard__cleanup-desc {
|
||||
display: block;
|
||||
font-size: 11px;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
margin-top: 2px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
/* Footer with action buttons */
|
||||
.migration-wizard__footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
flex-shrink: 0;
|
||||
padding-top: 8px;
|
||||
border-top: 1px solid var(--vscode-panel-border);
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
.migration-wizard__btn {
|
||||
padding: 6px 14px;
|
||||
font-size: 12px;
|
||||
border-radius: 4px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
font-family: var(--vscode-font-family);
|
||||
font-weight: 500;
|
||||
transition: opacity 0.1s;
|
||||
}
|
||||
|
||||
.migration-wizard__btn:disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.migration-wizard__btn--primary {
|
||||
background: var(--vscode-button-background);
|
||||
color: var(--vscode-button-foreground);
|
||||
}
|
||||
|
||||
.migration-wizard__btn--primary:not(:disabled):hover {
|
||||
background: var(--vscode-button-hoverBackground);
|
||||
}
|
||||
|
||||
.migration-wizard__btn--ghost {
|
||||
background: transparent;
|
||||
color: var(--vscode-descriptionForeground);
|
||||
}
|
||||
|
||||
.migration-wizard__btn--ghost:hover {
|
||||
background: var(--vscode-list-hoverBackground);
|
||||
color: var(--vscode-foreground);
|
||||
}
|
||||
@@ -7,6 +7,7 @@ export interface AboutKiloCodeTabProps {
|
||||
port: number | null
|
||||
connectionState: ConnectionState
|
||||
extensionVersion?: string
|
||||
onMigrateClick?: () => void // legacy-migration
|
||||
}
|
||||
|
||||
const AboutKiloCodeTab: Component<AboutKiloCodeTabProps> = (props) => {
|
||||
@@ -157,8 +158,39 @@ const AboutKiloCodeTab: Component<AboutKiloCodeTabProps> = (props) => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Reset Settings */}
|
||||
{/* legacy-migration start */}
|
||||
<div style={{ ...sectionStyle, "margin-bottom": "0" }}>
|
||||
<h4 style={headingStyle}>{language.t("settings.aboutKiloCode.legacyMigration.title")}</h4>
|
||||
<p
|
||||
style={{
|
||||
"font-size": "12px",
|
||||
color: "var(--vscode-descriptionForeground)",
|
||||
margin: "0 0 12px 0",
|
||||
"line-height": "1.5",
|
||||
}}
|
||||
>
|
||||
{language.t("settings.aboutKiloCode.legacyMigration.description")}
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => props.onMigrateClick?.()}
|
||||
style={{
|
||||
background: "var(--vscode-button-background)",
|
||||
color: "var(--vscode-button-foreground)",
|
||||
border: "none",
|
||||
padding: "6px 14px",
|
||||
"border-radius": "2px",
|
||||
cursor: "pointer",
|
||||
"font-size": "12px",
|
||||
}}
|
||||
>
|
||||
{language.t("settings.legacyMigration.link")}
|
||||
</button>
|
||||
</div>
|
||||
{/* legacy-migration end */}
|
||||
|
||||
{/* Reset Settings */}
|
||||
<div style={sectionStyle}>
|
||||
<h4 style={headingStyle}>{language.t("settings.aboutKiloCode.resetSettings.title")}</h4>
|
||||
<p
|
||||
style={{
|
||||
|
||||
@@ -22,6 +22,7 @@ import { useServer } from "../../context/server"
|
||||
|
||||
export interface SettingsProps {
|
||||
onBack?: () => void
|
||||
onMigrateClick?: () => void // legacy-migration
|
||||
}
|
||||
|
||||
const Settings: Component<SettingsProps> = (props) => {
|
||||
@@ -167,6 +168,7 @@ const Settings: Component<SettingsProps> = (props) => {
|
||||
port={server.serverInfo()?.port ?? null}
|
||||
connectionState={server.connectionState()}
|
||||
extensionVersion={server.extensionVersion()}
|
||||
onMigrateClick={props.onMigrateClick}
|
||||
/>
|
||||
</Tabs.Content>
|
||||
</Tabs>
|
||||
|
||||
@@ -41,6 +41,22 @@ import { dict as appNo } from "../i18n/no"
|
||||
import { dict as appBr } from "../i18n/br"
|
||||
import { dict as appTh } from "../i18n/th"
|
||||
import { dict as appBs } from "../i18n/bs"
|
||||
import { dict as amEn } from "../../agent-manager/i18n/en"
|
||||
import { dict as amZh } from "../../agent-manager/i18n/zh"
|
||||
import { dict as amZht } from "../../agent-manager/i18n/zht"
|
||||
import { dict as amKo } from "../../agent-manager/i18n/ko"
|
||||
import { dict as amDe } from "../../agent-manager/i18n/de"
|
||||
import { dict as amEs } from "../../agent-manager/i18n/es"
|
||||
import { dict as amFr } from "../../agent-manager/i18n/fr"
|
||||
import { dict as amDa } from "../../agent-manager/i18n/da"
|
||||
import { dict as amJa } from "../../agent-manager/i18n/ja"
|
||||
import { dict as amPl } from "../../agent-manager/i18n/pl"
|
||||
import { dict as amRu } from "../../agent-manager/i18n/ru"
|
||||
import { dict as amAr } from "../../agent-manager/i18n/ar"
|
||||
import { dict as amNo } from "../../agent-manager/i18n/no"
|
||||
import { dict as amBr } from "../../agent-manager/i18n/br"
|
||||
import { dict as amTh } from "../../agent-manager/i18n/th"
|
||||
import { dict as amBs } from "../../agent-manager/i18n/bs"
|
||||
import { dict as kiloEn } from "@kilocode/kilo-i18n/en"
|
||||
import { dict as kiloZh } from "@kilocode/kilo-i18n/zh"
|
||||
import { dict as kiloZht } from "@kilocode/kilo-i18n/zht"
|
||||
@@ -84,25 +100,25 @@ export const LOCALE_LABELS: Record<Locale, string> = {
|
||||
bs: "Bosanski",
|
||||
}
|
||||
|
||||
// Merge all 3 dict layers: app + ui + kilo (kilo overrides last, English base always present)
|
||||
// Merge 4 dict layers: app + ui + kilo + agent manager (kilo and agent manager override last)
|
||||
const base = { ...appEn, ...uiEn, ...kiloEn }
|
||||
const dicts: Record<Locale, Record<string, string>> = {
|
||||
en: base,
|
||||
zh: { ...base, ...appZh, ...uiZh, ...kiloZh },
|
||||
zht: { ...base, ...appZht, ...uiZht, ...kiloZht },
|
||||
ko: { ...base, ...appKo, ...uiKo, ...kiloKo },
|
||||
de: { ...base, ...appDe, ...uiDe, ...kiloDe },
|
||||
es: { ...base, ...appEs, ...uiEs, ...kiloEs },
|
||||
fr: { ...base, ...appFr, ...uiFr, ...kiloFr },
|
||||
da: { ...base, ...appDa, ...uiDa, ...kiloDa },
|
||||
ja: { ...base, ...appJa, ...uiJa, ...kiloJa },
|
||||
pl: { ...base, ...appPl, ...uiPl, ...kiloPl },
|
||||
ru: { ...base, ...appRu, ...uiRu, ...kiloRu },
|
||||
ar: { ...base, ...appAr, ...uiAr, ...kiloAr },
|
||||
no: { ...base, ...appNo, ...uiNo, ...kiloNo },
|
||||
br: { ...base, ...appBr, ...uiBr, ...kiloBr },
|
||||
th: { ...base, ...appTh, ...uiTh, ...kiloTh },
|
||||
bs: { ...base, ...appBs, ...uiBs, ...kiloBs },
|
||||
en: { ...base, ...amEn },
|
||||
zh: { ...base, ...appZh, ...uiZh, ...kiloZh, ...amEn, ...amZh },
|
||||
zht: { ...base, ...appZht, ...uiZht, ...kiloZht, ...amEn, ...amZht },
|
||||
ko: { ...base, ...appKo, ...uiKo, ...kiloKo, ...amEn, ...amKo },
|
||||
de: { ...base, ...appDe, ...uiDe, ...kiloDe, ...amEn, ...amDe },
|
||||
es: { ...base, ...appEs, ...uiEs, ...kiloEs, ...amEn, ...amEs },
|
||||
fr: { ...base, ...appFr, ...uiFr, ...kiloFr, ...amEn, ...amFr },
|
||||
da: { ...base, ...appDa, ...uiDa, ...kiloDa, ...amEn, ...amDa },
|
||||
ja: { ...base, ...appJa, ...uiJa, ...kiloJa, ...amEn, ...amJa },
|
||||
pl: { ...base, ...appPl, ...uiPl, ...kiloPl, ...amEn, ...amPl },
|
||||
ru: { ...base, ...appRu, ...uiRu, ...kiloRu, ...amEn, ...amRu },
|
||||
ar: { ...base, ...appAr, ...uiAr, ...kiloAr, ...amEn, ...amAr },
|
||||
no: { ...base, ...appNo, ...uiNo, ...kiloNo, ...amEn, ...amNo },
|
||||
br: { ...base, ...appBr, ...uiBr, ...kiloBr, ...amEn, ...amBr },
|
||||
th: { ...base, ...appTh, ...uiTh, ...kiloTh, ...amEn, ...amTh },
|
||||
bs: { ...base, ...appBs, ...uiBs, ...kiloBs, ...amEn, ...amBs },
|
||||
}
|
||||
|
||||
function normalizeLocale(lang: string): Locale {
|
||||
@@ -177,7 +193,7 @@ interface LanguageContextValue {
|
||||
t: (key: string, params?: UiI18nParams) => string
|
||||
}
|
||||
|
||||
const LanguageContext = createContext<LanguageContextValue>()
|
||||
export const LanguageContext = createContext<LanguageContextValue>()
|
||||
|
||||
export function useLanguage() {
|
||||
const ctx = useContext(LanguageContext)
|
||||
|
||||
@@ -138,7 +138,7 @@ interface SessionContextValue {
|
||||
selectCloudSession: (cloudSessionId: string) => void
|
||||
}
|
||||
|
||||
const SessionContext = createContext<SessionContextValue>()
|
||||
export const SessionContext = createContext<SessionContextValue>()
|
||||
|
||||
export const SessionProvider: ParentComponent = (props) => {
|
||||
const vscode = useVSCode()
|
||||
|
||||
@@ -941,147 +941,57 @@ export const dict = {
|
||||
"dialog.model.notSet": "غير محدد",
|
||||
"profile.personalAccount": "حساب شخصي",
|
||||
|
||||
"agentManager.local": "محلي",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "الجلسات",
|
||||
"agentManager.notGitRepo": "ليس مستودع git",
|
||||
"agentManager.worktree.settings": "إعدادات Worktree",
|
||||
"agentManager.worktree.new": "Worktree جديد",
|
||||
"agentManager.worktree.setupScript": "سكربت إعداد Worktree",
|
||||
"agentManager.worktree.delete": "حذف Worktree",
|
||||
"agentManager.worktree.stale": "قديم",
|
||||
"agentManager.worktree.staleTooltip": "مفقود على القرص أو لم يعد git worktree يتتبعه",
|
||||
"agentManager.worktree.removeStale": "إزالة Worktree القديم",
|
||||
"agentManager.worktree.doubleClickRename": "انقر مرتين لإعادة التسمية",
|
||||
"agentManager.worktree.versions": "{{count}} نسخ",
|
||||
"agentManager.worktree.advancedOptions": "خيارات Worktree متقدمة",
|
||||
"agentManager.hoverCard.branch": "الفرع",
|
||||
"agentManager.hoverCard.base": "الأساس",
|
||||
"agentManager.hoverCard.sessions": "الجلسات",
|
||||
"agentManager.hoverCard.files": "الملفات",
|
||||
"agentManager.hoverCard.changes": "التغييرات",
|
||||
"agentManager.hoverCard.commits": "عمليات الالتزام",
|
||||
"agentManager.session.new": "جلسة جديدة",
|
||||
"agentManager.session.untitled": "بدون عنوان",
|
||||
"agentManager.session.newSession": "جلسة جديدة",
|
||||
"agentManager.session.openInWorktree": "فتح في Worktree",
|
||||
"agentManager.session.readonly": "جلسة للقراءة فقط",
|
||||
"agentManager.session.noSessions": "لا توجد جلسات مفتوحة",
|
||||
"agentManager.tab.close": "إغلاق",
|
||||
"agentManager.tab.closeTab": "إغلاق علامة التبويب",
|
||||
"agentManager.tab.terminal": "الطرفية",
|
||||
"agentManager.tab.openTerminal": "فتح الطرفية",
|
||||
"agentManager.setup.failed": "فشل إعداد مساحة العمل",
|
||||
"agentManager.setup.settingUp": "جارٍ إعداد مساحة العمل",
|
||||
"agentManager.shortcuts.title": "اختصارات لوحة المفاتيح",
|
||||
"agentManager.shortcuts.category.sidebar": "الشريط الجانبي",
|
||||
"agentManager.shortcuts.category.tabs": "علامات التبويب",
|
||||
"agentManager.shortcuts.category.terminal": "الطرفية",
|
||||
"agentManager.shortcuts.category.global": "عام",
|
||||
"agentManager.shortcuts.previousItem": "العنصر السابق",
|
||||
"agentManager.shortcuts.nextItem": "العنصر التالي",
|
||||
"agentManager.shortcuts.newWorktree": "Worktree جديد",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree متقدم",
|
||||
"agentManager.shortcuts.deleteWorktree": "حذف Worktree",
|
||||
"agentManager.shortcuts.previousTab": "علامة التبويب السابقة",
|
||||
"agentManager.shortcuts.nextTab": "علامة التبويب التالية",
|
||||
"agentManager.shortcuts.newTab": "علامة تبويب جديدة",
|
||||
"agentManager.shortcuts.closeTab": "إغلاق علامة التبويب",
|
||||
"agentManager.shortcuts.toggleTerminal": "تبديل الطرفية",
|
||||
"agentManager.shortcuts.focusPanel": "تركيز اللوحة",
|
||||
"agentManager.shortcuts.openAgentManager": "فتح Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "حذف Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "حذف Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "؟ سيؤدي هذا إلى إزالة Worktree من القرص وفصل جميع الجلسات.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "إلغاء",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "حذف",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/ar.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "إزالة Worktree القديم",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "إزالة Worktree القديم ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"؟ سيؤدي هذا إلى إزالة الربط في Agent Manager فقط وترك الملفات على القرص دون تغيير.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "إلغاء",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "إزالة Worktree القديم",
|
||||
|
||||
"agentManager.dialog.openWorktree": "شجرة عمل جديدة",
|
||||
"agentManager.dialog.tab.new": "جديد",
|
||||
"agentManager.dialog.tab.import": "استيراد",
|
||||
"agentManager.dialog.namePlaceholder": "اسم Worktree (اختياري)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "اكتب رسالة (⌘Enter للإرسال)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "اكتب رسالة (Ctrl+Enter للإرسال)",
|
||||
"agentManager.dialog.advancedOptions": "خيارات متقدمة",
|
||||
"agentManager.dialog.branchName": "اسم الفرع",
|
||||
"agentManager.dialog.branchNamePlaceholder": "يتم إنشاؤه تلقائيًا",
|
||||
"agentManager.dialog.baseBranch": "الفرع الأساسي",
|
||||
"agentManager.dialog.searchBranches": "البحث في الفروع...",
|
||||
"agentManager.dialog.branchBadge.default": "افتراضي",
|
||||
"agentManager.dialog.branchBadge.remote": "بعيد",
|
||||
"agentManager.dialog.versions": "النسخ",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees ستعمل بالتوازي",
|
||||
"agentManager.dialog.compareModels": "مقارنة النماذج",
|
||||
"agentManager.dialog.compareModels.searchModels": "البحث عن النماذج...",
|
||||
"agentManager.dialog.creating": "جارٍ الإنشاء...",
|
||||
"agentManager.dialog.createWorkspace": "إنشاء شجرة العمل",
|
||||
"agentManager.dialog.removeImage": "إزالة الصورة",
|
||||
"agentManager.dialog.advanced": "متقدم...",
|
||||
|
||||
"agentManager.diff.toggle": "تبديل الفرق",
|
||||
"agentManager.diff.openFile": "فتح الملف",
|
||||
"agentManager.apply.button": "تطبيق محليًا",
|
||||
"agentManager.apply.globalButton": "تطبيق",
|
||||
"agentManager.apply.tooltip": "تطبيق تغييرات شجرة العمل المحددة على الفرع المحلي",
|
||||
"agentManager.apply.dialogTitle": "تطبيق التغييرات على الفرع المحلي",
|
||||
"agentManager.apply.confirm": "تطبيق الآن",
|
||||
"agentManager.apply.retry": "إعادة محاولة التطبيق",
|
||||
"agentManager.apply.previewTitle": "تطبيق هذه التغييرات على الفرع المحلي؟",
|
||||
"agentManager.apply.previewSummary": "{{files}} ملفات، +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} من {{total}} ملفات محددة",
|
||||
"agentManager.apply.selectAll": "تحديد الكل",
|
||||
"agentManager.apply.selectNone": "إلغاء تحديد الكل",
|
||||
"agentManager.apply.moreFiles": "+{{count}} المزيد",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} المزيد)",
|
||||
"agentManager.apply.checking": "جارٍ التحقق...",
|
||||
"agentManager.apply.applying": "جارٍ التطبيق...",
|
||||
"agentManager.apply.success": "تم تطبيق التغييرات",
|
||||
"agentManager.apply.conflict": "التطبيق يحتوي على تعارضات",
|
||||
"agentManager.apply.conflictToast": "{{count}} تعارضات في {{files}} ملفات. راجع التفاصيل في التطبيق.",
|
||||
"agentManager.apply.error": "فشل التطبيق",
|
||||
"agentManager.apply.conflictsTitle": "التعارضات",
|
||||
"agentManager.apply.unknownFile": "ملف غير محلول",
|
||||
"agentManager.apply.reason.index": "الملف المحلي يختلف عن النسخة المتوقعة",
|
||||
"agentManager.apply.reason.patch": "لا يمكن تطبيق التصحيح بشكل نظيف",
|
||||
"agentManager.apply.reason.contents": "لا يمكن قراءة محتويات الملف المحلي الحالي",
|
||||
"agentManager.apply.reason.unknown": "تم اكتشاف تعارض",
|
||||
"agentManager.apply.inline.success": "تم التطبيق",
|
||||
"agentManager.apply.inline.conflict": "تعارضات",
|
||||
"agentManager.apply.inline.error": "فشل",
|
||||
"agentManager.shortcuts.toggleDiff": "تبديل لوحة الفرق",
|
||||
"agentManager.shortcuts.category.quickSwitch": "التبديل السريع",
|
||||
"agentManager.shortcuts.jumpToItem": "الانتقال إلى العنصر 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "إرسال الكل إلى الدردشة",
|
||||
"agentManager.review.sendAllToChatWithCount": "إرسال الكل إلى الدردشة ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "تعليق على السطر {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "تعديل التعليق على السطر {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "اترك تعليقًا...",
|
||||
"agentManager.review.commentAction": "تعليق",
|
||||
"agentManager.review.sendToChat": "إرسال إلى الدردشة",
|
||||
"agentManager.review.collapsedOnly": "{{count}} مطوي",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} مطوي، {{large}} كبير",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "الصق رابط PR...",
|
||||
"agentManager.import.open": "فتح",
|
||||
"agentManager.import.branches": "الفروع",
|
||||
"agentManager.import.selectBranch": "اختر فرعًا...",
|
||||
"agentManager.import.loading": "جارٍ التحميل...",
|
||||
"agentManager.import.loadingBranches": "جارٍ تحميل الفروع...",
|
||||
"agentManager.import.noMatchingBranches": "لا توجد فروع مطابقة",
|
||||
"agentManager.import.noBranchesFound": "لم يتم العثور على فروع.",
|
||||
"agentManager.import.noBranchesHint": "الصق رابط PR أعلاه أو أنشئ Worktree جديدًا.",
|
||||
"agentManager.import.failed": "فشل الاستيراد",
|
||||
|
||||
"question.summary": "{{n}} من {{total}} أسئلة",
|
||||
"common.review": "مراجعة",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "الترحيل من الإصدار القديم",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "ترحيل الإصدار القديم",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"ترحيل الإعدادات من تثبيت سابق لـ Kilo Code، بما في ذلك مفاتيح API لمقدمي الخدمة والنموذج الافتراضي.",
|
||||
"migration.welcome.title": "مرحبًا بك في Kilo Code الجديد",
|
||||
"migration.welcome.detected": "لقد اكتشفنا إعدادات من تثبيت سابق لـ Kilo Code.",
|
||||
"migration.welcome.sessionsInfo": "لا يمكن ترحيل جلسات الدردشة والسجل — الإصدار الجديد يستخدم بنية مختلفة.",
|
||||
"migration.welcome.canMigrate": "يمكن ترحيل الإعدادات التالية إلى الإصدار الجديد:",
|
||||
"migration.welcome.start": "بدء الترحيل",
|
||||
"migration.welcome.skip": "تخطي الترحيل",
|
||||
"migration.steps.title": "ترحيل إعداداتك",
|
||||
"migration.steps.subtitle": "لقد وجدنا إعدادات من تثبيت Kilo Code السابق. اختر ما تريد نقله.",
|
||||
"migration.select.providers": "مفاتيح API لمقدمي الخدمة",
|
||||
"migration.select.mcpServers": "خوادم MCP",
|
||||
"migration.select.customModes": "الأوضاع المخصصة / الوكلاء",
|
||||
"migration.select.defaultModel": "النموذج الافتراضي",
|
||||
"migration.select.unsupported": "غير مدعوم في الإصدار الجديد",
|
||||
"migration.select.nothingToMigrate": "لم يتم العثور على أي شيء لترحيله في الإعدادات القديمة.",
|
||||
"migration.select.settings": "الإعدادات",
|
||||
"migration.select.autoApproval": "الموافقة التلقائية",
|
||||
"migration.select.autoApproval.commandRules": "قواعد الأوامر",
|
||||
"migration.select.autoApproval.commandRulesDesc": "مفتاح التبديل الرئيسي وقوائم الأوامر المسموح بها/المرفوضة",
|
||||
"migration.select.autoApproval.readPermission": "صلاحية القراءة",
|
||||
"migration.select.autoApproval.readPermissionDesc": "الوصول لقراءة الملفات داخل وخارج مساحة العمل",
|
||||
"migration.select.autoApproval.writePermission": "صلاحية الكتابة",
|
||||
"migration.select.autoApproval.writePermissionDesc": "الوصول لكتابة وتعديل الملفات",
|
||||
"migration.select.autoApproval.executePermission": "صلاحية التنفيذ",
|
||||
"migration.select.autoApproval.executePermissionDesc": "تنفيذ أوامر الوحدة الطرفية",
|
||||
"migration.select.autoApproval.mcpPermission": "صلاحية MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "استخدام أدوات MCP",
|
||||
"migration.select.autoApproval.taskPermission": "صلاحية المهام",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "تبديل الوضع وإنشاء المهام الفرعية",
|
||||
"migration.select.language": "لغة واجهة المستخدم",
|
||||
"migration.select.languageDesc": "سيتم تطبيق لغتك المفضلة على الإضافة الجديدة",
|
||||
"migration.select.autocomplete": "إعدادات الإكمال التلقائي",
|
||||
"migration.select.autocompleteDesc": "تفضيلات التشغيل التلقائي، واختصارات لوحة المفاتيح، والإكمال التلقائي للدردشة",
|
||||
"migration.select.continue": "متابعة",
|
||||
"migration.select.back": "رجوع",
|
||||
"migration.progress.title": "جاري ترحيل إعداداتك…",
|
||||
"migration.progress.done": "متابعة",
|
||||
"migration.complete.summary": "تم ترحيل {{success}} من {{total}} عناصر بنجاح.",
|
||||
"migration.complete.cleanup": "إزالة بيانات الإعدادات القديمة",
|
||||
"migration.complete.cleanupDescription":
|
||||
"هذا يزيل الإعدادات القديمة من مساحة تخزين VS Code. لن تتمكن من إعادة تشغيل هذا الترحيل.",
|
||||
"migration.complete.done": "تم",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -955,147 +955,59 @@ export const dict = {
|
||||
"dialog.model.notSet": "Não definido",
|
||||
"profile.personalAccount": "Conta pessoal",
|
||||
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSÕES",
|
||||
"agentManager.notGitRepo": "Não é um repositório git",
|
||||
"agentManager.worktree.settings": "Configurações do Worktree",
|
||||
"agentManager.worktree.new": "Novo Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuração do Worktree",
|
||||
"agentManager.worktree.delete": "Excluir Worktree",
|
||||
"agentManager.worktree.stale": "Obsoleto",
|
||||
"agentManager.worktree.staleTooltip": "Ausente no disco ou não é mais rastreado pelo git worktree",
|
||||
"agentManager.worktree.removeStale": "Remover Worktree obsoleto",
|
||||
"agentManager.worktree.doubleClickRename": "Clique duplo para renomear",
|
||||
"agentManager.worktree.versions": "{{count}} versões",
|
||||
"agentManager.worktree.advancedOptions": "Opções avançadas de Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessões",
|
||||
"agentManager.hoverCard.files": "Arquivos",
|
||||
"agentManager.hoverCard.changes": "Alterações",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nova sessão",
|
||||
"agentManager.session.untitled": "Sem título",
|
||||
"agentManager.session.newSession": "Nova Sessão",
|
||||
"agentManager.session.openInWorktree": "Abrir no Worktree",
|
||||
"agentManager.session.readonly": "Sessão somente leitura",
|
||||
"agentManager.session.noSessions": "Nenhuma sessão aberta",
|
||||
"agentManager.tab.close": "Fechar",
|
||||
"agentManager.tab.closeTab": "Fechar aba",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Abrir Terminal",
|
||||
"agentManager.setup.failed": "Falha na configuração do workspace",
|
||||
"agentManager.setup.settingUp": "Configurando workspace",
|
||||
"agentManager.shortcuts.title": "Atalhos de Teclado",
|
||||
"agentManager.shortcuts.category.sidebar": "Barra lateral",
|
||||
"agentManager.shortcuts.category.tabs": "Abas",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Item anterior",
|
||||
"agentManager.shortcuts.nextItem": "Próximo item",
|
||||
"agentManager.shortcuts.newWorktree": "Novo Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avançado",
|
||||
"agentManager.shortcuts.deleteWorktree": "Excluir Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Aba anterior",
|
||||
"agentManager.shortcuts.nextTab": "Próxima aba",
|
||||
"agentManager.shortcuts.newTab": "Nova aba",
|
||||
"agentManager.shortcuts.closeTab": "Fechar aba",
|
||||
"agentManager.shortcuts.toggleTerminal": "Alternar terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focar painel",
|
||||
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Excluir Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Excluir Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Isso remove o Worktree do disco e desassocia todas as sessões.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Excluir",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/br.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Remover Worktree obsoleto",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Remover Worktree obsoleto ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Isso remove apenas o mapeamento no Agent Manager e não altera os arquivos no disco.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Remover Worktree obsoleto",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Novo Worktree",
|
||||
"agentManager.dialog.tab.new": "Novo",
|
||||
"agentManager.dialog.tab.import": "Importar",
|
||||
"agentManager.dialog.namePlaceholder": "Nome do Worktree (opcional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Digite uma mensagem (⌘Enter para enviar)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Digite uma mensagem (Ctrl+Enter para enviar)",
|
||||
"agentManager.dialog.advancedOptions": "Opções avançadas",
|
||||
"agentManager.dialog.branchName": "Nome do branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "gerado automaticamente",
|
||||
"agentManager.dialog.baseBranch": "Branch base",
|
||||
"agentManager.dialog.searchBranches": "Buscar branches...",
|
||||
"agentManager.dialog.branchBadge.default": "padrão",
|
||||
"agentManager.dialog.branchBadge.remote": "remoto",
|
||||
"agentManager.dialog.versions": "Versões",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees serão executados em paralelo",
|
||||
"agentManager.dialog.compareModels": "Comparar Modelos",
|
||||
"agentManager.dialog.compareModels.searchModels": "Pesquisar modelos...",
|
||||
"agentManager.dialog.creating": "Criando...",
|
||||
"agentManager.dialog.createWorkspace": "Criar Worktree",
|
||||
"agentManager.dialog.removeImage": "Remover imagem",
|
||||
"agentManager.dialog.advanced": "Avançado...",
|
||||
|
||||
"agentManager.diff.toggle": "Alternar diff",
|
||||
"agentManager.diff.openFile": "Abrir arquivo",
|
||||
"agentManager.apply.button": "Aplicar localmente",
|
||||
"agentManager.apply.globalButton": "Aplicar",
|
||||
"agentManager.apply.tooltip": "Aplicar alterações da worktree selecionada na branch local",
|
||||
"agentManager.apply.dialogTitle": "Aplicar alterações na branch local",
|
||||
"agentManager.apply.confirm": "Aplicar agora",
|
||||
"agentManager.apply.retry": "Tentar aplicar novamente",
|
||||
"agentManager.apply.previewTitle": "Aplicar essas alterações na branch local?",
|
||||
"agentManager.apply.previewSummary": "{{files}} arquivos, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} de {{total}} arquivos selecionados",
|
||||
"agentManager.apply.selectAll": "Selecionar todos",
|
||||
"agentManager.apply.selectNone": "Desmarcar todos",
|
||||
"agentManager.apply.moreFiles": "+{{count}} mais",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} mais)",
|
||||
"agentManager.apply.checking": "Verificando...",
|
||||
"agentManager.apply.applying": "Aplicando...",
|
||||
"agentManager.apply.success": "Alterações aplicadas",
|
||||
"agentManager.apply.conflict": "A aplicação tem conflitos",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflitos em {{files}} arquivos. Revise os detalhes em Aplicar.",
|
||||
"agentManager.apply.error": "A aplicação falhou",
|
||||
"agentManager.apply.conflictsTitle": "Conflitos",
|
||||
"agentManager.apply.unknownFile": "Arquivo não resolvido",
|
||||
"agentManager.apply.reason.index": "O arquivo local difere da versão esperada",
|
||||
"agentManager.apply.reason.patch": "O patch não pode ser aplicado de forma limpa",
|
||||
"agentManager.apply.reason.contents": "Não é possível ler o conteúdo do arquivo local atual",
|
||||
"agentManager.apply.reason.unknown": "Conflito detectado",
|
||||
"agentManager.apply.inline.success": "Aplicado",
|
||||
"agentManager.apply.inline.conflict": "Conflitos",
|
||||
"agentManager.apply.inline.error": "Falhou",
|
||||
"agentManager.shortcuts.toggleDiff": "Alternar painel de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Troca rápida",
|
||||
"agentManager.shortcuts.jumpToItem": "Ir para o item 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Enviar tudo para o chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Enviar tudo para o chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comentar na linha {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Editar comentário na linha {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Deixe um comentário...",
|
||||
"agentManager.review.commentAction": "Comentar",
|
||||
"agentManager.review.sendToChat": "Enviar para o chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} recolhidos",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} recolhidos, {{large}} grandes",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Cole a URL do PR...",
|
||||
"agentManager.import.open": "Abrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Selecionar branch...",
|
||||
"agentManager.import.loading": "Carregando...",
|
||||
"agentManager.import.loadingBranches": "Carregando branches...",
|
||||
"agentManager.import.noMatchingBranches": "Nenhum branch correspondente",
|
||||
"agentManager.import.noBranchesFound": "Nenhum branch encontrado.",
|
||||
"agentManager.import.noBranchesHint": "Cole uma URL de PR acima ou crie um novo Worktree.",
|
||||
"agentManager.import.failed": "Falha na importação",
|
||||
|
||||
"question.summary": "{{n}} de {{total}} perguntas",
|
||||
"common.review": "Revisar",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrar da Versão Legada",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migração Legada",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migre as configurações de uma instalação anterior do Kilo Code, incluindo chaves de API de provedor e modelo padrão.",
|
||||
"migration.welcome.title": "Bem-vindo ao Novo Kilo Code",
|
||||
"migration.welcome.detected": "Detectamos configurações de uma instalação anterior do Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Sessões de chat e histórico não podem ser migrados — a nova versão usa uma arquitetura diferente.",
|
||||
"migration.welcome.canMigrate": "As seguintes configurações podem ser migradas para a nova versão:",
|
||||
"migration.welcome.start": "Iniciar Migração",
|
||||
"migration.welcome.skip": "Pular Migração",
|
||||
"migration.steps.title": "Migre suas configurações",
|
||||
"migration.steps.subtitle":
|
||||
"Encontramos configurações da sua instalação anterior do Kilo Code. Escolha o que trazer.",
|
||||
"migration.select.providers": "Chaves de API de Provedor",
|
||||
"migration.select.mcpServers": "Servidores MCP",
|
||||
"migration.select.customModes": "Modos Personalizados / Agentes",
|
||||
"migration.select.defaultModel": "Modelo Padrão",
|
||||
"migration.select.unsupported": "Não suportado na nova versão",
|
||||
"migration.select.nothingToMigrate": "Nada para migrar foi encontrado nas configurações legadas.",
|
||||
"migration.select.settings": "Configurações",
|
||||
"migration.select.autoApproval": "Aprovação Automática",
|
||||
"migration.select.autoApproval.commandRules": "Regras de Comando",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Alternador principal e listas de comandos permitidos/negados",
|
||||
"migration.select.autoApproval.readPermission": "Permissão de Leitura",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Acesso de leitura de arquivos dentro e fora do workspace",
|
||||
"migration.select.autoApproval.writePermission": "Permissão de Escrita",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Acesso de escrita e edição de arquivos",
|
||||
"migration.select.autoApproval.executePermission": "Permissão de Execução",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Execução de comandos de terminal",
|
||||
"migration.select.autoApproval.mcpPermission": "Permissão MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Uso de ferramentas MCP",
|
||||
"migration.select.autoApproval.taskPermission": "Permissão de Tarefa",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Troca de modo e criação de subtarefas",
|
||||
"migration.select.language": "Idioma da Interface",
|
||||
"migration.select.languageDesc": "Sua preferência de idioma será aplicada à nova extensão",
|
||||
"migration.select.autocomplete": "Configurações de Autocomplete",
|
||||
"migration.select.autocompleteDesc": "Preferências de gatilho automático, atalhos de teclado e autocomplete do chat",
|
||||
"migration.select.continue": "Continuar",
|
||||
"migration.select.back": "Voltar",
|
||||
"migration.progress.title": "Migrando suas configurações…",
|
||||
"migration.progress.done": "Continuar",
|
||||
"migration.complete.summary": "{{success}} de {{total}} itens migrados com sucesso.",
|
||||
"migration.complete.cleanup": "Remover dados de configurações legadas",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Isso remove as configurações antigas do armazenamento do VS Code. Você não poderá executar esta migração novamente.",
|
||||
"migration.complete.done": "Concluído",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -977,147 +977,60 @@ export const dict = {
|
||||
"dialog.model.notSet": "Nije postavljeno",
|
||||
"profile.personalAccount": "Osobni račun",
|
||||
|
||||
"agentManager.local": "lokalno",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESIJE",
|
||||
"agentManager.notGitRepo": "Nije git repozitorij",
|
||||
"agentManager.worktree.settings": "Postavke Worktree-a",
|
||||
"agentManager.worktree.new": "Novi Worktree",
|
||||
"agentManager.worktree.setupScript": "Skripta za postavljanje Worktree-a",
|
||||
"agentManager.worktree.delete": "Obriši Worktree",
|
||||
"agentManager.worktree.stale": "Zastario",
|
||||
"agentManager.worktree.staleTooltip": "Nedostaje na disku ili ga git worktree više ne prati",
|
||||
"agentManager.worktree.removeStale": "Ukloni zastarjeli Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dvostruki klik za preimenovanje",
|
||||
"agentManager.worktree.versions": "{{count}} verzija",
|
||||
"agentManager.worktree.advancedOptions": "Napredne opcije Worktree-a",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Baza",
|
||||
"agentManager.hoverCard.sessions": "Sesije",
|
||||
"agentManager.hoverCard.files": "Datoteke",
|
||||
"agentManager.hoverCard.changes": "Promjene",
|
||||
"agentManager.hoverCard.commits": "Commiti",
|
||||
"agentManager.session.new": "Nova sesija",
|
||||
"agentManager.session.untitled": "Bez naslova",
|
||||
"agentManager.session.newSession": "Nova sesija",
|
||||
"agentManager.session.openInWorktree": "Otvori u Worktree-u",
|
||||
"agentManager.session.readonly": "Sesija samo za čitanje",
|
||||
"agentManager.session.noSessions": "Nema otvorenih sesija",
|
||||
"agentManager.tab.close": "Zatvori",
|
||||
"agentManager.tab.closeTab": "Zatvori karticu",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Otvori Terminal",
|
||||
"agentManager.setup.failed": "Postavljanje radnog prostora neuspješno",
|
||||
"agentManager.setup.settingUp": "Postavljanje radnog prostora",
|
||||
"agentManager.shortcuts.title": "Prečice na tastaturi",
|
||||
"agentManager.shortcuts.category.sidebar": "Bočna traka",
|
||||
"agentManager.shortcuts.category.tabs": "Kartice",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Globalno",
|
||||
"agentManager.shortcuts.previousItem": "Prethodni element",
|
||||
"agentManager.shortcuts.nextItem": "Sljedeći element",
|
||||
"agentManager.shortcuts.newWorktree": "Novi Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Napredni Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Obriši Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Prethodna kartica",
|
||||
"agentManager.shortcuts.nextTab": "Sljedeća kartica",
|
||||
"agentManager.shortcuts.newTab": "Nova kartica",
|
||||
"agentManager.shortcuts.closeTab": "Zatvori karticu",
|
||||
"agentManager.shortcuts.toggleTerminal": "Prebaci terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokusiraj panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Otvori Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Obriši Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Obriši Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Ovo uklanja Worktree sa diska i odvezuje sve sesije.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Otkaži",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Obriši",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/bs.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Ukloni zastarjeli Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Ukloni zastarjeli Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Ovo uklanja samo mapiranje u Agent Manageru i ne dira datoteke na disku.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Otkaži",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Ukloni zastarjeli Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Novi worktree",
|
||||
"agentManager.dialog.tab.new": "Novo",
|
||||
"agentManager.dialog.tab.import": "Uvezi",
|
||||
"agentManager.dialog.namePlaceholder": "Naziv Worktree-a (opcionalno)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Unesite poruku (⌘Enter za slanje)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Unesite poruku (Ctrl+Enter za slanje)",
|
||||
"agentManager.dialog.advancedOptions": "Napredne opcije",
|
||||
"agentManager.dialog.branchName": "Naziv brancha",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatski generirano",
|
||||
"agentManager.dialog.baseBranch": "Osnovni branch",
|
||||
"agentManager.dialog.searchBranches": "Pretraži brancheve...",
|
||||
"agentManager.dialog.branchBadge.default": "zadano",
|
||||
"agentManager.dialog.branchBadge.remote": "udaljeno",
|
||||
"agentManager.dialog.versions": "Verzije",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktree-ova će se pokrenuti paralelno",
|
||||
"agentManager.dialog.compareModels": "Uporedi modele",
|
||||
"agentManager.dialog.compareModels.searchModels": "Pretraži modele...",
|
||||
"agentManager.dialog.creating": "Kreiranje...",
|
||||
"agentManager.dialog.createWorkspace": "Kreiraj worktree",
|
||||
"agentManager.dialog.removeImage": "Ukloni sliku",
|
||||
"agentManager.dialog.advanced": "Napredno...",
|
||||
|
||||
"agentManager.diff.toggle": "Prebaci diff",
|
||||
"agentManager.diff.openFile": "Otvori datoteku",
|
||||
"agentManager.apply.button": "Primijeni lokalno",
|
||||
"agentManager.apply.globalButton": "Primijeni",
|
||||
"agentManager.apply.tooltip": "Primijeni promjene odabranog radnog stabla na lokalnu granu",
|
||||
"agentManager.apply.dialogTitle": "Primijeni promjene na lokalnu granu",
|
||||
"agentManager.apply.confirm": "Primijeni sada",
|
||||
"agentManager.apply.retry": "Ponovo pokušaj primjenu",
|
||||
"agentManager.apply.previewTitle": "Primijeniti ove promjene na lokalnu granu?",
|
||||
"agentManager.apply.previewSummary": "{{files}} datoteka, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} od {{total}} datoteka odabrano",
|
||||
"agentManager.apply.selectAll": "Odaberi sve",
|
||||
"agentManager.apply.selectNone": "Poništi odabir",
|
||||
"agentManager.apply.moreFiles": "+{{count}} više",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} više)",
|
||||
"agentManager.apply.checking": "Provjera...",
|
||||
"agentManager.apply.applying": "Primjenjivanje...",
|
||||
"agentManager.apply.success": "Promjene primijenjene",
|
||||
"agentManager.apply.conflict": "Primjena ima konflikte",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikata u {{files}} datoteka. Pregledajte detalje u Primijeni.",
|
||||
"agentManager.apply.error": "Primjena nije uspjela",
|
||||
"agentManager.apply.conflictsTitle": "Konflikti",
|
||||
"agentManager.apply.unknownFile": "Nerazriješena datoteka",
|
||||
"agentManager.apply.reason.index": "Lokalna datoteka se razlikuje od očekivane verzije",
|
||||
"agentManager.apply.reason.patch": "Zakrpa se ne može čisto primijeniti",
|
||||
"agentManager.apply.reason.contents": "Nije moguće pročitati sadržaj trenutne lokalne datoteke",
|
||||
"agentManager.apply.reason.unknown": "Otkriven konflikt",
|
||||
"agentManager.apply.inline.success": "Primijenjeno",
|
||||
"agentManager.apply.inline.conflict": "Konflikti",
|
||||
"agentManager.apply.inline.error": "Neuspjelo",
|
||||
"agentManager.shortcuts.toggleDiff": "Prebaci panel za diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Brzo prebacivanje",
|
||||
"agentManager.shortcuts.jumpToItem": "Idi na stavku 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Pošalji sve u chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Pošalji sve u chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Komentar na liniji {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Uredi komentar na liniji {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Ostavi komentar...",
|
||||
"agentManager.review.commentAction": "Komentariši",
|
||||
"agentManager.review.sendToChat": "Pošalji u chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} sažeto",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} sažeto, {{large}} velikih",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Zalijepite PR URL...",
|
||||
"agentManager.import.open": "Otvori",
|
||||
"agentManager.import.branches": "Branchevi",
|
||||
"agentManager.import.selectBranch": "Odaberite branch...",
|
||||
"agentManager.import.loading": "Učitavanje...",
|
||||
"agentManager.import.loadingBranches": "Učitavanje brancheva...",
|
||||
"agentManager.import.noMatchingBranches": "Nema odgovarajućih brancheva",
|
||||
"agentManager.import.noBranchesFound": "Nisu pronađeni branchevi.",
|
||||
"agentManager.import.noBranchesHint": "Zalijepite PR URL iznad ili kreirajte novi Worktree.",
|
||||
"agentManager.import.failed": "Uvoz neuspješan",
|
||||
|
||||
"question.summary": "{{n}} od {{total}} pitanja",
|
||||
"common.review": "Pregled",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migriraj sa prethodne verzije",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migracija sa prethodne verzije",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrirajte postavke iz prethodne instalacije Kilo Code, uključujući API ključeve provajdera i podrazumijevani model.",
|
||||
"migration.welcome.title": "Dobrodošli u novi Kilo Code",
|
||||
"migration.welcome.detected": "Otkrili smo postavke iz prethodne instalacije Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Sesije razgovora i historija se ne mogu migrirati — nova verzija koristi drugačiju arhitekturu.",
|
||||
"migration.welcome.canMigrate": "Sljedeće postavke se mogu migrirati na novu verziju:",
|
||||
"migration.welcome.start": "Započni migraciju",
|
||||
"migration.welcome.skip": "Preskoči migraciju",
|
||||
"migration.steps.title": "Migrirajte svoje postavke",
|
||||
"migration.steps.subtitle":
|
||||
"Pronašli smo postavke iz vaše prethodne instalacije Kilo Code. Odaberite šta želite prenijeti.",
|
||||
"migration.select.providers": "API ključevi provajdera",
|
||||
"migration.select.mcpServers": "MCP serveri",
|
||||
"migration.select.customModes": "Prilagođeni režimi / Agenti",
|
||||
"migration.select.defaultModel": "Podrazumijevani model",
|
||||
"migration.select.unsupported": "Nije podržano u novoj verziji",
|
||||
"migration.select.nothingToMigrate": "U starim postavkama nije pronađeno ništa za migraciju.",
|
||||
"migration.select.settings": "Postavke",
|
||||
"migration.select.autoApproval": "Automatsko odobravanje",
|
||||
"migration.select.autoApproval.commandRules": "Pravila za komande",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Glavni prekidač i liste dozvoljenih/odbijenih komandi",
|
||||
"migration.select.autoApproval.readPermission": "Dozvola za čitanje",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Pristup čitanju datoteka unutar i izvan radnog prostora",
|
||||
"migration.select.autoApproval.writePermission": "Dozvola za pisanje",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Pristup za pisanje i uređivanje datoteka",
|
||||
"migration.select.autoApproval.executePermission": "Dozvola za izvršavanje",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Izvršavanje komandi u terminalu",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP dozvola",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Korištenje MCP alata",
|
||||
"migration.select.autoApproval.taskPermission": "Dozvola za zadatke",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Mijenjanje režima i kreiranje podzadataka",
|
||||
"migration.select.language": "Jezik korisničkog interfejsa",
|
||||
"migration.select.languageDesc": "Vaše željene postavke jezika će biti primijenjene na novu ekstenziju",
|
||||
"migration.select.autocomplete": "Postavke automatskog dovršavanja",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Postavke automatskog pokretanja, prečica na tastaturi i automatskog dovršavanja u chatu",
|
||||
"migration.select.continue": "Nastavi",
|
||||
"migration.select.back": "Nazad",
|
||||
"migration.progress.title": "Migriranje vaših postavki…",
|
||||
"migration.progress.done": "Nastavi",
|
||||
"migration.complete.summary": "Uspješno migrirano {{success}} od {{total}} stavki.",
|
||||
"migration.complete.cleanup": "Ukloni stare podatke postavki",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Ovo uklanja stare postavke iz VS Code pohrane. Nećete moći ponovo pokrenuti ovu migraciju.",
|
||||
"migration.complete.done": "Završeno",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -950,147 +950,59 @@ export const dict = {
|
||||
"dialog.model.notSet": "Ikke angivet",
|
||||
"profile.personalAccount": "Personlig konto",
|
||||
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONER",
|
||||
"agentManager.notGitRepo": "Ikke et git-repository",
|
||||
"agentManager.worktree.settings": "Worktree-indstillinger",
|
||||
"agentManager.worktree.new": "Nyt Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-opsætningsscript",
|
||||
"agentManager.worktree.delete": "Slet Worktree",
|
||||
"agentManager.worktree.stale": "Forældet",
|
||||
"agentManager.worktree.staleTooltip": "Mangler på disken eller spores ikke længere af git worktree",
|
||||
"agentManager.worktree.removeStale": "Fjern forældet Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dobbeltklik for at omdøbe",
|
||||
"agentManager.worktree.versions": "{{count}} versioner",
|
||||
"agentManager.worktree.advancedOptions": "Avancerede Worktree-indstillinger",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessioner",
|
||||
"agentManager.hoverCard.files": "Filer",
|
||||
"agentManager.hoverCard.changes": "Ændringer",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Ny session",
|
||||
"agentManager.session.untitled": "Uden titel",
|
||||
"agentManager.session.newSession": "Ny session",
|
||||
"agentManager.session.openInWorktree": "Åbn i Worktree",
|
||||
"agentManager.session.readonly": "Skrivebeskyttet session",
|
||||
"agentManager.session.noSessions": "Ingen åbne sessioner",
|
||||
"agentManager.tab.close": "Luk",
|
||||
"agentManager.tab.closeTab": "Luk fane",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Åbn Terminal",
|
||||
"agentManager.setup.failed": "Opsætning af workspace mislykkedes",
|
||||
"agentManager.setup.settingUp": "Opsætter workspace",
|
||||
"agentManager.shortcuts.title": "Tastaturgenveje",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidebjælke",
|
||||
"agentManager.shortcuts.category.tabs": "Faner",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Forrige element",
|
||||
"agentManager.shortcuts.nextItem": "Næste element",
|
||||
"agentManager.shortcuts.newWorktree": "Nyt Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Avanceret Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Slet Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Forrige fane",
|
||||
"agentManager.shortcuts.nextTab": "Næste fane",
|
||||
"agentManager.shortcuts.newTab": "Ny fane",
|
||||
"agentManager.shortcuts.closeTab": "Luk fane",
|
||||
"agentManager.shortcuts.toggleTerminal": "Skift terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokuser panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Åbn Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Slet Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Slet Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og afkobler alle sessioner.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Annuller",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Slet",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/da.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Fjern forældet Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Fjern forældet Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dette fjerner kun tilknytningen i Agent Manager og efterlader filer på disken urørt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Annuller",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Fjern forældet Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Ny Worktree",
|
||||
"agentManager.dialog.tab.new": "Ny",
|
||||
"agentManager.dialog.tab.import": "Importér",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfrit)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Skriv en besked (⌘Enter for at sende)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Skriv en besked (Ctrl+Enter for at sende)",
|
||||
"agentManager.dialog.advancedOptions": "Avancerede indstillinger",
|
||||
"agentManager.dialog.branchName": "Branch-navn",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisk genereret",
|
||||
"agentManager.dialog.baseBranch": "Base-branch",
|
||||
"agentManager.dialog.searchBranches": "Søg branches...",
|
||||
"agentManager.dialog.branchBadge.default": "standard",
|
||||
"agentManager.dialog.branchBadge.remote": "fjern",
|
||||
"agentManager.dialog.versions": "Versioner",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees vil køre parallelt",
|
||||
"agentManager.dialog.compareModels": "Sammenlign modeller",
|
||||
"agentManager.dialog.compareModels.searchModels": "Søg modeller...",
|
||||
"agentManager.dialog.creating": "Opretter...",
|
||||
"agentManager.dialog.createWorkspace": "Opret Worktree",
|
||||
"agentManager.dialog.removeImage": "Fjern billede",
|
||||
"agentManager.dialog.advanced": "Avanceret...",
|
||||
|
||||
"agentManager.diff.toggle": "Skift diff",
|
||||
"agentManager.diff.openFile": "Åbn fil",
|
||||
"agentManager.apply.button": "Anvend lokalt",
|
||||
"agentManager.apply.globalButton": "Anvend",
|
||||
"agentManager.apply.tooltip": "Anvend valgte worktree-ændringer på den lokale gren",
|
||||
"agentManager.apply.dialogTitle": "Anvend ændringer på den lokale gren",
|
||||
"agentManager.apply.confirm": "Anvend nu",
|
||||
"agentManager.apply.retry": "Prøv at anvende igen",
|
||||
"agentManager.apply.previewTitle": "Anvend disse ændringer på den lokale gren?",
|
||||
"agentManager.apply.previewSummary": "{{files}} filer, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} af {{total}} filer valgt",
|
||||
"agentManager.apply.selectAll": "Vælg alle",
|
||||
"agentManager.apply.selectNone": "Fravælg alle",
|
||||
"agentManager.apply.moreFiles": "+{{count}} flere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} flere)",
|
||||
"agentManager.apply.checking": "Kontrollerer...",
|
||||
"agentManager.apply.applying": "Anvender...",
|
||||
"agentManager.apply.success": "Ændringer anvendt",
|
||||
"agentManager.apply.conflict": "Anvendelse har konflikter",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikter i {{files}} filer. Gennemgå detaljer i Anvend.",
|
||||
"agentManager.apply.error": "Anvendelse mislykkedes",
|
||||
"agentManager.apply.conflictsTitle": "Konflikter",
|
||||
"agentManager.apply.unknownFile": "Uløst fil",
|
||||
"agentManager.apply.reason.index": "Lokal fil adskiller sig fra den forventede version",
|
||||
"agentManager.apply.reason.patch": "Patch kan ikke anvendes rent",
|
||||
"agentManager.apply.reason.contents": "Kan ikke læse det aktuelle lokale filindhold",
|
||||
"agentManager.apply.reason.unknown": "Konflikt opdaget",
|
||||
"agentManager.apply.inline.success": "Anvendt",
|
||||
"agentManager.apply.inline.conflict": "Konflikter",
|
||||
"agentManager.apply.inline.error": "Mislykkedes",
|
||||
"agentManager.shortcuts.toggleDiff": "Skift diff-panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Hurtigskift",
|
||||
"agentManager.shortcuts.jumpToItem": "Hop til element 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send alt til chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send alt til chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommenter på linje {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Rediger kommentar på linje {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Skriv en kommentar...",
|
||||
"agentManager.review.commentAction": "Kommenter",
|
||||
"agentManager.review.sendToChat": "Send til chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} foldet sammen",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} foldet sammen, {{large}} store",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Indsæt PR URL...",
|
||||
"agentManager.import.open": "Åbn",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Vælg branch...",
|
||||
"agentManager.import.loading": "Indlæser...",
|
||||
"agentManager.import.loadingBranches": "Indlæser branches...",
|
||||
"agentManager.import.noMatchingBranches": "Ingen matchende branches",
|
||||
"agentManager.import.noBranchesFound": "Ingen branches fundet.",
|
||||
"agentManager.import.noBranchesHint": "Indsæt en PR URL ovenfor eller opret et nyt Worktree.",
|
||||
"agentManager.import.failed": "Import mislykkedes",
|
||||
|
||||
"question.summary": "{{n}} af {{total}} spørgsmål",
|
||||
"common.review": "Gennemgå",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrer fra legacy-version",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Legacy-migrering",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrer indstillinger fra en tidligere installation af Kilo Code, herunder udbyder API-nøgler og standardmodel.",
|
||||
"migration.welcome.title": "Velkommen til det nye Kilo Code",
|
||||
"migration.welcome.detected": "Vi har fundet indstillinger fra en tidligere installation af Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Chatsessioner og historik kan ikke migreres — den nye version bruger en anden arkitektur.",
|
||||
"migration.welcome.canMigrate": "Følgende indstillinger kan migreres til den nye version:",
|
||||
"migration.welcome.start": "Start migrering",
|
||||
"migration.welcome.skip": "Spring migrering over",
|
||||
"migration.steps.title": "Migrer dine indstillinger",
|
||||
"migration.steps.subtitle":
|
||||
"Vi har fundet indstillinger fra din tidligere Kilo Code-installation. Vælg, hvad der skal overføres.",
|
||||
"migration.select.providers": "Udbyder API-nøgler",
|
||||
"migration.select.mcpServers": "MCP-servere",
|
||||
"migration.select.customModes": "Brugerdefinerede tilstande / Agenter",
|
||||
"migration.select.defaultModel": "Standardmodel",
|
||||
"migration.select.unsupported": "Understøttes ikke i den nye version",
|
||||
"migration.select.nothingToMigrate": "Der blev ikke fundet noget at migrere i legacy-indstillingerne.",
|
||||
"migration.select.settings": "Indstillinger",
|
||||
"migration.select.autoApproval": "Automatisk godkendelse",
|
||||
"migration.select.autoApproval.commandRules": "Kommandoregler",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Hovedafbryder og lister over tilladte/afviste kommandoer",
|
||||
"migration.select.autoApproval.readPermission": "Læsetilladelse",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Fillæseadgang inden for og uden for arbejdsområdet",
|
||||
"migration.select.autoApproval.writePermission": "Skrivetilladelse",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Filskrive- og redigeringsadgang",
|
||||
"migration.select.autoApproval.executePermission": "Udførelsestilladelse",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Udførelse af terminalkommandoer",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP-tilladelse",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Brug af MCP-værktøjer",
|
||||
"migration.select.autoApproval.taskPermission": "Opgavetilladelse",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Skift af tilstand og oprettelse af underopgaver",
|
||||
"migration.select.language": "UI-sprog",
|
||||
"migration.select.languageDesc": "Din sprogpræference vil blive anvendt på den nye udvidelse",
|
||||
"migration.select.autocomplete": "Indstillinger for autofuldførelse",
|
||||
"migration.select.autocompleteDesc": "Præferencer for automatisk udløsning, genvejstaster og chat-autofuldførelse",
|
||||
"migration.select.continue": "Fortsæt",
|
||||
"migration.select.back": "Tilbage",
|
||||
"migration.progress.title": "Migrerer dine indstillinger…",
|
||||
"migration.progress.done": "Fortsæt",
|
||||
"migration.complete.summary": "{{success}} af {{total}} elementer blev migreret med succes.",
|
||||
"migration.complete.cleanup": "Fjern legacy-indstillingsdata",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Dette fjerner de gamle indstillinger fra VS Code-lageret. Du vil ikke kunne køre denne migrering igen.",
|
||||
"migration.complete.done": "Færdig",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -963,148 +963,60 @@ export const dict = {
|
||||
"dialog.model.notSet": "Nicht festgelegt",
|
||||
"profile.personalAccount": "Persönliches Konto",
|
||||
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SITZUNGEN",
|
||||
"agentManager.notGitRepo": "Kein Git-Repository",
|
||||
"agentManager.worktree.settings": "Worktree-Einstellungen",
|
||||
"agentManager.worktree.new": "Neuer Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-Einrichtungsskript",
|
||||
"agentManager.worktree.delete": "Worktree löschen",
|
||||
"agentManager.worktree.stale": "Veraltet",
|
||||
"agentManager.worktree.staleTooltip": "Fehlt auf der Festplatte oder wird nicht mehr von git worktree verfolgt",
|
||||
"agentManager.worktree.removeStale": "Veralteten Worktree entfernen",
|
||||
"agentManager.worktree.doubleClickRename": "Doppelklick zum Umbenennen",
|
||||
"agentManager.worktree.versions": "{{count}} Versionen",
|
||||
"agentManager.worktree.advancedOptions": "Erweiterte Worktree-Optionen",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Basis",
|
||||
"agentManager.hoverCard.sessions": "Sitzungen",
|
||||
"agentManager.hoverCard.files": "Dateien",
|
||||
"agentManager.hoverCard.changes": "Änderungen",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Neue Sitzung",
|
||||
"agentManager.session.untitled": "Unbenannt",
|
||||
"agentManager.session.newSession": "Neue Sitzung",
|
||||
"agentManager.session.openInWorktree": "In Worktree öffnen",
|
||||
"agentManager.session.readonly": "Schreibgeschützte Sitzung",
|
||||
"agentManager.session.noSessions": "Keine Sitzungen geöffnet",
|
||||
"agentManager.tab.close": "Schließen",
|
||||
"agentManager.tab.closeTab": "Tab schließen",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Terminal öffnen",
|
||||
"agentManager.setup.failed": "Einrichtung des Arbeitsbereichs fehlgeschlagen",
|
||||
"agentManager.setup.settingUp": "Arbeitsbereich wird eingerichtet",
|
||||
"agentManager.shortcuts.title": "Tastenkombinationen",
|
||||
"agentManager.shortcuts.category.sidebar": "Seitenleiste",
|
||||
"agentManager.shortcuts.category.tabs": "Tabs",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Vorheriges Element",
|
||||
"agentManager.shortcuts.nextItem": "Nächstes Element",
|
||||
"agentManager.shortcuts.newWorktree": "Neuer Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Erweiterter Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktree löschen",
|
||||
"agentManager.shortcuts.previousTab": "Vorheriger Tab",
|
||||
"agentManager.shortcuts.nextTab": "Nächster Tab",
|
||||
"agentManager.shortcuts.newTab": "Neuer Tab",
|
||||
"agentManager.shortcuts.closeTab": "Tab schließen",
|
||||
"agentManager.shortcuts.toggleTerminal": "Terminal umschalten",
|
||||
"agentManager.shortcuts.focusPanel": "Panel fokussieren",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Manager öffnen",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktree löschen",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktree löschen ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Dies entfernt den Worktree von der Festplatte und trennt alle Sitzungen.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Abbrechen",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Löschen",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/de.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Veralteten Worktree entfernen",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Veralteten Worktree entfernen ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dies entfernt nur die Zuordnung im Agent Manager und lässt die Dateien auf der Festplatte unberührt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Abbrechen",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Veralteten Worktree entfernen",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Neuer Worktree",
|
||||
"agentManager.dialog.tab.new": "Neu",
|
||||
"agentManager.dialog.tab.import": "Importieren",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-Name (optional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Nachricht eingeben (⌘Enter zum Senden)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Nachricht eingeben (Strg+Enter zum Senden)",
|
||||
"agentManager.dialog.advancedOptions": "Erweiterte Optionen",
|
||||
"agentManager.dialog.branchName": "Branch-Name",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisch generiert",
|
||||
"agentManager.dialog.baseBranch": "Basis-Branch",
|
||||
"agentManager.dialog.searchBranches": "Branches suchen...",
|
||||
"agentManager.dialog.branchBadge.default": "Standard",
|
||||
"agentManager.dialog.branchBadge.remote": "Remote",
|
||||
"agentManager.dialog.versions": "Versionen",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees werden parallel ausgeführt",
|
||||
"agentManager.dialog.compareModels": "Modelle vergleichen",
|
||||
"agentManager.dialog.compareModels.searchModels": "Modelle suchen...",
|
||||
"agentManager.dialog.creating": "Wird erstellt...",
|
||||
"agentManager.dialog.createWorkspace": "Worktree erstellen",
|
||||
"agentManager.dialog.removeImage": "Bild entfernen",
|
||||
"agentManager.dialog.advanced": "Erweitert...",
|
||||
|
||||
"agentManager.diff.toggle": "Diff umschalten",
|
||||
"agentManager.diff.openFile": "Datei öffnen",
|
||||
"agentManager.apply.button": "Lokal anwenden",
|
||||
"agentManager.apply.globalButton": "Anwenden",
|
||||
"agentManager.apply.tooltip": "Ausgewählte Worktree-Änderungen auf den lokalen Branch anwenden",
|
||||
"agentManager.apply.dialogTitle": "Änderungen auf den lokalen Branch anwenden",
|
||||
"agentManager.apply.confirm": "Jetzt anwenden",
|
||||
"agentManager.apply.retry": "Anwenden erneut versuchen",
|
||||
"agentManager.apply.previewTitle": "Diese Änderungen auf den lokalen Branch anwenden?",
|
||||
"agentManager.apply.previewSummary": "{{files}} Dateien, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} von {{total}} Dateien ausgewählt",
|
||||
"agentManager.apply.selectAll": "Alle auswählen",
|
||||
"agentManager.apply.selectNone": "Keine auswählen",
|
||||
"agentManager.apply.moreFiles": "+{{count}} weitere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} weitere)",
|
||||
"agentManager.apply.checking": "Prüfe...",
|
||||
"agentManager.apply.applying": "Wird angewendet...",
|
||||
"agentManager.apply.success": "Änderungen angewendet",
|
||||
"agentManager.apply.conflict": "Anwenden hat Konflikte",
|
||||
"agentManager.apply.conflictToast": "{{count}} Konflikte in {{files}} Dateien. Details unter Anwenden prüfen.",
|
||||
"agentManager.apply.error": "Anwenden fehlgeschlagen",
|
||||
"agentManager.apply.conflictsTitle": "Konflikte",
|
||||
"agentManager.apply.unknownFile": "Ungelöste Datei",
|
||||
"agentManager.apply.reason.index": "Lokale Datei weicht von der erwarteten Version ab",
|
||||
"agentManager.apply.reason.patch": "Patch kann nicht sauber angewendet werden",
|
||||
"agentManager.apply.reason.contents": "Inhalt der aktuellen lokalen Datei kann nicht gelesen werden",
|
||||
"agentManager.apply.reason.unknown": "Konflikt erkannt",
|
||||
"agentManager.apply.inline.success": "Angewendet",
|
||||
"agentManager.apply.inline.conflict": "Konflikte",
|
||||
"agentManager.apply.inline.error": "Fehlgeschlagen",
|
||||
"agentManager.shortcuts.toggleDiff": "Diff-Panel umschalten",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Schnellwechsel",
|
||||
"agentManager.shortcuts.jumpToItem": "Zu Element 1\u20139 springen",
|
||||
"agentManager.review.sendAllToChat": "Alles an den Chat senden",
|
||||
"agentManager.review.sendAllToChatWithCount": "Alles an den Chat senden ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommentar zu Zeile {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Kommentar zu Zeile {{line}} bearbeiten",
|
||||
"agentManager.review.commentPlaceholder": "Kommentar hinterlassen...",
|
||||
"agentManager.review.commentAction": "Kommentieren",
|
||||
"agentManager.review.sendToChat": "An Chat senden",
|
||||
"agentManager.review.collapsedOnly": "{{count}} eingeklappt",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} eingeklappt, {{large}} groß",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR-URL einfügen...",
|
||||
"agentManager.import.open": "Öffnen",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Branch auswählen...",
|
||||
"agentManager.import.loading": "Laden...",
|
||||
"agentManager.import.loadingBranches": "Branches werden geladen...",
|
||||
"agentManager.import.noMatchingBranches": "Keine passenden Branches",
|
||||
"agentManager.import.noBranchesFound": "Keine Branches gefunden.",
|
||||
"agentManager.import.noBranchesHint": "Fügen Sie oben eine PR-URL ein oder erstellen Sie einen neuen Worktree.",
|
||||
"agentManager.import.failed": "Import fehlgeschlagen",
|
||||
|
||||
"question.summary": "{{n}} von {{total}} Fragen",
|
||||
"common.review": "Überprüfen",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Von der Legacy-Version migrieren",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Legacy-Migration",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrieren Sie Einstellungen von einer früheren Installation von Kilo Code, einschließlich Anbieter-API-Schlüsseln und dem Standardmodell.",
|
||||
"migration.welcome.title": "Willkommen beim neuen Kilo Code",
|
||||
"migration.welcome.detected": "Wir haben Einstellungen aus einer früheren Installation von Kilo Code erkannt.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Chat-Sitzungen und Verlauf können nicht migriert werden — die neue Version verwendet eine andere Architektur.",
|
||||
"migration.welcome.canMigrate": "Die folgenden Einstellungen können in die neue Version migriert werden:",
|
||||
"migration.welcome.start": "Migration starten",
|
||||
"migration.welcome.skip": "Migration überspringen",
|
||||
"migration.steps.title": "Ihre Einstellungen migrieren",
|
||||
"migration.steps.subtitle":
|
||||
"Wir haben Einstellungen aus Ihrer vorherigen Kilo Code-Installation gefunden. Wählen Sie aus, was übernommen werden soll.",
|
||||
"migration.select.providers": "Anbieter-API-Schlüssel",
|
||||
"migration.select.mcpServers": "MCP-Server",
|
||||
"migration.select.customModes": "Benutzerdefinierte Modi / Agenten",
|
||||
"migration.select.defaultModel": "Standardmodell",
|
||||
"migration.select.unsupported": "Wird in der neuen Version nicht unterstützt",
|
||||
"migration.select.nothingToMigrate": "In den Legacy-Einstellungen wurde nichts gefunden, was migriert werden könnte.",
|
||||
"migration.select.settings": "Einstellungen",
|
||||
"migration.select.autoApproval": "Automatische Genehmigung",
|
||||
"migration.select.autoApproval.commandRules": "Befehlsregeln",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Hauptschalter und Listen für erlaubte/verweigerte Befehle",
|
||||
"migration.select.autoApproval.readPermission": "Leseberechtigung",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Dateilesezugriff innerhalb und außerhalb des Arbeitsbereichs",
|
||||
"migration.select.autoApproval.writePermission": "Schreibberechtigung",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Dateischreib- und Bearbeitungszugriff",
|
||||
"migration.select.autoApproval.executePermission": "Ausführungsberechtigung",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Ausführung von Terminalbefehlen",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP-Berechtigung",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Nutzung von MCP-Tools",
|
||||
"migration.select.autoApproval.taskPermission": "Aufgabenberechtigung",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Wechsel des Modus und Erstellung von Teilaufgaben",
|
||||
"migration.select.language": "UI-Sprache",
|
||||
"migration.select.languageDesc": "Ihre Spracheinstellung wird auf die neue Erweiterung angewendet",
|
||||
"migration.select.autocomplete": "Einstellungen für Autovervollständigung",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Einstellungen für automatische Auslösung, Tastenkombinationen und Chat-Autovervollständigung",
|
||||
"migration.select.continue": "Weiter",
|
||||
"migration.select.back": "Zurück",
|
||||
"migration.progress.title": "Ihre Einstellungen werden migriert…",
|
||||
"migration.progress.done": "Weiter",
|
||||
"migration.complete.summary": "{{success}} von {{total}} Elementen erfolgreich migriert.",
|
||||
"migration.complete.cleanup": "Legacy-Einstellungsdaten entfernen",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Dadurch werden die alten Einstellungen aus dem VS Code-Speicher entfernt. Sie können diese Migration danach nicht erneut ausführen.",
|
||||
"migration.complete.done": "Fertig",
|
||||
// legacy-migration end
|
||||
} satisfies Partial<Record<Keys, string>>
|
||||
|
||||
@@ -996,158 +996,58 @@ export const dict = {
|
||||
|
||||
"profile.personalAccount": "Personal Account",
|
||||
|
||||
// Agent Manager
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONS",
|
||||
"agentManager.notGitRepo": "Not a git repository",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/en.ts
|
||||
|
||||
"agentManager.worktree.settings": "Worktree settings",
|
||||
"agentManager.worktree.new": "New Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree Setup Script",
|
||||
"agentManager.worktree.delete": "Delete worktree",
|
||||
"agentManager.worktree.stale": "Stale",
|
||||
"agentManager.worktree.staleTooltip": "Missing on disk or no longer tracked by git worktree",
|
||||
"agentManager.worktree.removeStale": "Remove stale worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Double-click to rename",
|
||||
"agentManager.worktree.versions": "{{count}} versions",
|
||||
"agentManager.worktree.advancedOptions": "Advanced worktree options",
|
||||
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessions",
|
||||
"agentManager.hoverCard.files": "Files",
|
||||
"agentManager.hoverCard.changes": "Changes",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
|
||||
"agentManager.session.new": "New session",
|
||||
"agentManager.session.untitled": "Untitled",
|
||||
"agentManager.session.newSession": "New Session",
|
||||
"agentManager.session.openInWorktree": "Open in worktree",
|
||||
"agentManager.session.readonly": "Read-only session",
|
||||
"agentManager.session.noSessions": "No sessions open",
|
||||
|
||||
"agentManager.tab.close": "Close",
|
||||
"agentManager.tab.closeTab": "Close tab",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Open Terminal",
|
||||
|
||||
"agentManager.setup.failed": "Workspace setup failed",
|
||||
"agentManager.setup.settingUp": "Setting up workspace",
|
||||
|
||||
"agentManager.shortcuts.title": "Keyboard Shortcuts",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidebar",
|
||||
"agentManager.shortcuts.category.tabs": "Tabs",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Previous item",
|
||||
"agentManager.shortcuts.nextItem": "Next item",
|
||||
"agentManager.shortcuts.newWorktree": "New worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Advanced worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Delete worktree",
|
||||
"agentManager.shortcuts.previousTab": "Previous tab",
|
||||
"agentManager.shortcuts.nextTab": "Next tab",
|
||||
"agentManager.shortcuts.newTab": "New tab",
|
||||
"agentManager.shortcuts.closeTab": "Close tab",
|
||||
"agentManager.shortcuts.toggleTerminal": "Toggle terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focus panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Open Agent Manager",
|
||||
|
||||
"agentManager.dialog.deleteWorktree.title": "Delete Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Delete worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? This removes the worktree from disk and dissociates all sessions.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancel",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Delete",
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Remove Stale Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Remove stale worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? This only removes the Agent Manager mapping and leaves files on disk untouched.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancel",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Remove stale worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "New Worktree",
|
||||
"agentManager.dialog.tab.new": "New",
|
||||
"agentManager.dialog.tab.import": "Import",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree name (optional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Type a message (\u2318Enter to send)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Type a message (Ctrl+Enter to send)",
|
||||
"agentManager.dialog.advancedOptions": "Advanced options",
|
||||
"agentManager.dialog.branchName": "Branch name",
|
||||
"agentManager.dialog.branchNamePlaceholder": "auto-generated",
|
||||
"agentManager.dialog.baseBranch": "Base branch",
|
||||
"agentManager.dialog.searchBranches": "Search branches...",
|
||||
"agentManager.dialog.branchBadge.default": "default",
|
||||
"agentManager.dialog.branchBadge.remote": "remote",
|
||||
"agentManager.dialog.versions": "Versions",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees will run in parallel",
|
||||
"agentManager.dialog.compareModels": "Compare Models",
|
||||
"agentManager.dialog.compareModels.searchModels": "Search models...",
|
||||
"agentManager.dialog.creating": "Creating...",
|
||||
"agentManager.dialog.createWorkspace": "Create Worktree",
|
||||
"agentManager.dialog.removeImage": "Remove image",
|
||||
"agentManager.dialog.advanced": "Advanced...",
|
||||
|
||||
"agentManager.diff.toggle": "Toggle diff",
|
||||
"agentManager.diff.openFile": "Open file",
|
||||
"agentManager.apply.button": "Apply to local",
|
||||
"agentManager.apply.globalButton": "Apply",
|
||||
"agentManager.apply.tooltip": "Apply selected worktree changes to local branch",
|
||||
"agentManager.apply.dialogTitle": "Apply changes to local branch",
|
||||
"agentManager.apply.confirm": "Apply now",
|
||||
"agentManager.apply.retry": "Retry apply",
|
||||
"agentManager.apply.previewTitle": "Apply these changes to local branch?",
|
||||
"agentManager.apply.previewSummary": "{{files}} files, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} of {{total}} files selected",
|
||||
"agentManager.apply.selectAll": "Select all",
|
||||
"agentManager.apply.selectNone": "Select none",
|
||||
"agentManager.apply.moreFiles": "+{{count}} more",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} more)",
|
||||
"agentManager.apply.checking": "Checking...",
|
||||
"agentManager.apply.applying": "Applying...",
|
||||
"agentManager.apply.success": "Changes applied",
|
||||
"agentManager.apply.conflict": "Apply has conflicts",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflicts in {{files}} files. Review details in Apply.",
|
||||
"agentManager.apply.error": "Apply failed",
|
||||
"agentManager.apply.conflictsTitle": "Conflicts",
|
||||
"agentManager.apply.unknownFile": "Unresolved file",
|
||||
"agentManager.apply.reason.index": "Local file differs from expected version",
|
||||
"agentManager.apply.reason.patch": "Patch cannot be applied cleanly",
|
||||
"agentManager.apply.reason.contents": "Cannot read current local file contents",
|
||||
"agentManager.apply.reason.unknown": "Conflict detected",
|
||||
"agentManager.apply.inline.success": "Applied",
|
||||
"agentManager.apply.inline.conflict": "Conflicts",
|
||||
"agentManager.apply.inline.error": "Failed",
|
||||
"agentManager.shortcuts.toggleDiff": "Toggle diff panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Quick Switch",
|
||||
"agentManager.shortcuts.jumpToItem": "Jump to item 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send all to chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send all to chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comment on line {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Edit comment on line {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Leave a comment...",
|
||||
"agentManager.review.commentAction": "Comment",
|
||||
"agentManager.review.sendToChat": "Send to chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} collapsed",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} collapsed, {{large}} large",
|
||||
"agentManager.review.largeFileCollapsed": "Large file (collapsed)",
|
||||
"agentManager.review.endOfLongDiff": "You made it to the end!",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Paste PR URL...",
|
||||
"agentManager.import.open": "Open",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Select branch...",
|
||||
"agentManager.import.loading": "Loading...",
|
||||
"agentManager.import.loadingBranches": "Loading branches...",
|
||||
"agentManager.import.noMatchingBranches": "No matching branches",
|
||||
"agentManager.import.noBranchesFound": "No branches found.",
|
||||
"agentManager.import.noBranchesHint": "Paste a PR URL above or create a new worktree.",
|
||||
"agentManager.import.failed": "Import failed",
|
||||
|
||||
"question.summary": "{{n}} of {{total}} questions",
|
||||
"common.review": "Review",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrate from Legacy Version",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Legacy Migration",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrate settings from a previous installation of Kilo Code, including provider API keys and default model.",
|
||||
"migration.welcome.title": "Welcome to the New Kilo Code",
|
||||
"migration.welcome.detected": "We detected settings from a previous installation of Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Chat sessions and history cannot be migrated — the new version uses a different architecture.",
|
||||
"migration.welcome.canMigrate": "The following settings can be migrated to the new version:",
|
||||
"migration.welcome.start": "Start Migration",
|
||||
"migration.welcome.skip": "Skip Migration",
|
||||
"migration.steps.title": "Migrate your settings",
|
||||
"migration.steps.subtitle": "We found settings from your previous Kilo Code installation. Choose what to bring over.",
|
||||
"migration.select.providers": "Provider API Keys",
|
||||
"migration.select.mcpServers": "MCP Servers",
|
||||
"migration.select.customModes": "Custom Modes / Agents",
|
||||
"migration.select.defaultModel": "Default Model",
|
||||
"migration.select.unsupported": "Not supported in new version",
|
||||
"migration.select.nothingToMigrate": "Nothing to migrate was found in the legacy settings.",
|
||||
"migration.select.settings": "Settings",
|
||||
"migration.select.autoApproval": "Auto-Approval",
|
||||
"migration.select.autoApproval.commandRules": "Command Rules",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Master toggle and allowed/denied command lists",
|
||||
"migration.select.autoApproval.readPermission": "Read Permission",
|
||||
"migration.select.autoApproval.readPermissionDesc": "File read access inside and outside workspace",
|
||||
"migration.select.autoApproval.writePermission": "Write Permission",
|
||||
"migration.select.autoApproval.writePermissionDesc": "File write and edit access",
|
||||
"migration.select.autoApproval.executePermission": "Execute Permission",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Terminal command execution",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP Permission",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "MCP tool usage",
|
||||
"migration.select.autoApproval.taskPermission": "Task Permission",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Mode switching and subtask creation",
|
||||
"migration.select.language": "UI Language",
|
||||
"migration.select.languageDesc": "Your language preference will be applied to the new extension",
|
||||
"migration.select.autocomplete": "Autocomplete Settings",
|
||||
"migration.select.autocompleteDesc": "Auto-trigger, keybinding, and chat autocomplete preferences",
|
||||
"migration.select.continue": "Continue",
|
||||
"migration.select.back": "Back",
|
||||
"migration.progress.title": "Migrating your settings…",
|
||||
"migration.progress.done": "Continue",
|
||||
"migration.complete.summary": "{{success}} of {{total}} items migrated successfully.",
|
||||
"migration.complete.cleanup": "Remove legacy settings data",
|
||||
"migration.complete.cleanupDescription":
|
||||
"This removes the old settings from VS Code storage. You will not be able to re-run this migration.",
|
||||
"migration.complete.done": "Done",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -957,148 +957,61 @@ export const dict = {
|
||||
"settings.providers.notSet": "No establecido (usar predeterminado del servidor)",
|
||||
"dialog.model.notSet": "No establecido",
|
||||
"profile.personalAccount": "Cuenta personal",
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESIONES",
|
||||
"agentManager.notGitRepo": "No es un repositorio git",
|
||||
"agentManager.worktree.settings": "Configuración de Worktree",
|
||||
"agentManager.worktree.new": "Nuevo Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuración de Worktree",
|
||||
"agentManager.worktree.delete": "Eliminar Worktree",
|
||||
"agentManager.worktree.stale": "Obsoleto",
|
||||
"agentManager.worktree.staleTooltip": "No está en disco o ya no está seguido por git worktree",
|
||||
"agentManager.worktree.removeStale": "Eliminar Worktree obsoleto",
|
||||
"agentManager.worktree.doubleClickRename": "Doble clic para renombrar",
|
||||
"agentManager.worktree.versions": "{{count}} versiones",
|
||||
"agentManager.worktree.advancedOptions": "Opciones avanzadas de Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sesiones",
|
||||
"agentManager.hoverCard.files": "Archivos",
|
||||
"agentManager.hoverCard.changes": "Cambios",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nueva sesión",
|
||||
"agentManager.session.untitled": "Sin título",
|
||||
"agentManager.session.newSession": "Nueva Sesión",
|
||||
"agentManager.session.openInWorktree": "Abrir en Worktree",
|
||||
"agentManager.session.readonly": "Sesión de solo lectura",
|
||||
"agentManager.session.noSessions": "No hay sesiones abiertas",
|
||||
"agentManager.tab.close": "Cerrar",
|
||||
"agentManager.tab.closeTab": "Cerrar pestaña",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Abrir Terminal",
|
||||
"agentManager.setup.failed": "Error en la configuración del workspace",
|
||||
"agentManager.setup.settingUp": "Configurando workspace",
|
||||
"agentManager.shortcuts.title": "Atajos de teclado",
|
||||
"agentManager.shortcuts.category.sidebar": "Barra lateral",
|
||||
"agentManager.shortcuts.category.tabs": "Pestañas",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Elemento anterior",
|
||||
"agentManager.shortcuts.nextItem": "Siguiente elemento",
|
||||
"agentManager.shortcuts.newWorktree": "Nuevo Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avanzado",
|
||||
"agentManager.shortcuts.deleteWorktree": "Eliminar Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Pestaña anterior",
|
||||
"agentManager.shortcuts.nextTab": "Siguiente pestaña",
|
||||
"agentManager.shortcuts.newTab": "Nueva pestaña",
|
||||
"agentManager.shortcuts.closeTab": "Cerrar pestaña",
|
||||
"agentManager.shortcuts.toggleTerminal": "Alternar terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Enfocar panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Abrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Eliminar Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "¿Eliminar Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Esto elimina el Worktree del disco y desasocia todas las sesiones.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Eliminar",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/es.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Eliminar Worktree obsoleto",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "¿Eliminar Worktree obsoleto ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Esto solo elimina la asociación en Agent Manager y no modifica los archivos en disco.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Cancelar",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Eliminar Worktree obsoleto",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nuevo Worktree",
|
||||
"agentManager.dialog.tab.new": "Nuevo",
|
||||
"agentManager.dialog.tab.import": "Importar",
|
||||
"agentManager.dialog.namePlaceholder": "Nombre del Worktree (opcional)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Escribe un mensaje (⌘Enter para enviar)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Escribe un mensaje (Ctrl+Enter para enviar)",
|
||||
"agentManager.dialog.advancedOptions": "Opciones avanzadas",
|
||||
"agentManager.dialog.branchName": "Nombre del branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "generado automáticamente",
|
||||
"agentManager.dialog.baseBranch": "Branch base",
|
||||
"agentManager.dialog.searchBranches": "Buscar branches...",
|
||||
"agentManager.dialog.branchBadge.default": "predeterminado",
|
||||
"agentManager.dialog.branchBadge.remote": "remoto",
|
||||
"agentManager.dialog.versions": "Versiones",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees se ejecutarán en paralelo",
|
||||
"agentManager.dialog.compareModels": "Comparar modelos",
|
||||
"agentManager.dialog.compareModels.searchModels": "Buscar modelos...",
|
||||
"agentManager.dialog.creating": "Creando...",
|
||||
"agentManager.dialog.createWorkspace": "Crear Worktree",
|
||||
"agentManager.dialog.removeImage": "Eliminar imagen",
|
||||
"agentManager.dialog.advanced": "Avanzado...",
|
||||
|
||||
"agentManager.diff.toggle": "Alternar diff",
|
||||
"agentManager.diff.openFile": "Abrir archivo",
|
||||
"agentManager.apply.button": "Aplicar en local",
|
||||
"agentManager.apply.globalButton": "Aplicar",
|
||||
"agentManager.apply.tooltip": "Aplicar los cambios del worktree seleccionado a la rama local",
|
||||
"agentManager.apply.dialogTitle": "Aplicar cambios a la rama local",
|
||||
"agentManager.apply.confirm": "Aplicar ahora",
|
||||
"agentManager.apply.retry": "Reintentar aplicación",
|
||||
"agentManager.apply.previewTitle": "¿Aplicar estos cambios a la rama local?",
|
||||
"agentManager.apply.previewSummary": "{{files}} archivos, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} de {{total}} archivos seleccionados",
|
||||
"agentManager.apply.selectAll": "Seleccionar todos",
|
||||
"agentManager.apply.selectNone": "Deseleccionar todos",
|
||||
"agentManager.apply.moreFiles": "+{{count}} más",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} más)",
|
||||
"agentManager.apply.checking": "Verificando...",
|
||||
"agentManager.apply.applying": "Aplicando...",
|
||||
"agentManager.apply.success": "Cambios aplicados",
|
||||
"agentManager.apply.conflict": "La aplicación tiene conflictos",
|
||||
"agentManager.apply.conflictToast": "{{count}} conflictos en {{files}} archivos. Revise los detalles en Aplicar.",
|
||||
"agentManager.apply.error": "La aplicación falló",
|
||||
"agentManager.apply.conflictsTitle": "Conflictos",
|
||||
"agentManager.apply.unknownFile": "Archivo no resuelto",
|
||||
"agentManager.apply.reason.index": "El archivo local difiere de la versión esperada",
|
||||
"agentManager.apply.reason.patch": "El parche no se puede aplicar limpiamente",
|
||||
"agentManager.apply.reason.contents": "No se puede leer el contenido del archivo local actual",
|
||||
"agentManager.apply.reason.unknown": "Conflicto detectado",
|
||||
"agentManager.apply.inline.success": "Aplicado",
|
||||
"agentManager.apply.inline.conflict": "Conflictos",
|
||||
"agentManager.apply.inline.error": "Falló",
|
||||
"agentManager.shortcuts.toggleDiff": "Alternar panel de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Cambio rápido",
|
||||
"agentManager.shortcuts.jumpToItem": "Ir al elemento 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Enviar todo al chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Enviar todo al chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Comentar en la línea {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Editar comentario en la línea {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Deja un comentario...",
|
||||
"agentManager.review.commentAction": "Comentar",
|
||||
"agentManager.review.sendToChat": "Enviar al chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} contraídos",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} contraídos, {{large}} grandes",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Pegar URL del PR...",
|
||||
"agentManager.import.open": "Abrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Seleccionar branch...",
|
||||
"agentManager.import.loading": "Cargando...",
|
||||
"agentManager.import.loadingBranches": "Cargando branches...",
|
||||
"agentManager.import.noMatchingBranches": "No hay branches coincidentes",
|
||||
"agentManager.import.noBranchesFound": "No se encontraron branches.",
|
||||
"agentManager.import.noBranchesHint": "Pega una URL de PR arriba o crea un nuevo Worktree.",
|
||||
"agentManager.import.failed": "Error en la importación",
|
||||
|
||||
"question.summary": "{{n}} de {{total}} preguntas",
|
||||
"common.review": "Revisar",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrar desde la versión heredada",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migración heredada",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migra la configuración de una instalación anterior de Kilo Code, incluyendo las claves API de proveedores y el modelo predeterminado.",
|
||||
"migration.welcome.title": "Bienvenido al nuevo Kilo Code",
|
||||
"migration.welcome.detected": "Hemos detectado una configuración de una instalación anterior de Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Las sesiones de chat y el historial no se pueden migrar — la nueva versión utiliza una arquitectura diferente.",
|
||||
"migration.welcome.canMigrate": "Las siguientes configuraciones se pueden migrar a la nueva versión:",
|
||||
"migration.welcome.start": "Iniciar migración",
|
||||
"migration.welcome.skip": "Omitir migración",
|
||||
"migration.steps.title": "Migra tu configuración",
|
||||
"migration.steps.subtitle":
|
||||
"Encontramos configuraciones de tu instalación anterior de Kilo Code. Elige qué deseas transferir.",
|
||||
"migration.select.providers": "Claves API de proveedores",
|
||||
"migration.select.mcpServers": "Servidores MCP",
|
||||
"migration.select.customModes": "Modos personalizados / Agentes",
|
||||
"migration.select.defaultModel": "Modelo predeterminado",
|
||||
"migration.select.unsupported": "No compatible con la nueva versión",
|
||||
"migration.select.nothingToMigrate": "No se encontró nada para migrar en la configuración heredada.",
|
||||
"migration.select.settings": "Configuración",
|
||||
"migration.select.autoApproval": "Aprobación automática",
|
||||
"migration.select.autoApproval.commandRules": "Reglas de comandos",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Interruptor principal y listas de comandos permitidos/denegados",
|
||||
"migration.select.autoApproval.readPermission": "Permiso de lectura",
|
||||
"migration.select.autoApproval.readPermissionDesc":
|
||||
"Acceso de lectura de archivos dentro y fuera del espacio de trabajo",
|
||||
"migration.select.autoApproval.writePermission": "Permiso de escritura",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Acceso de escritura y edición de archivos",
|
||||
"migration.select.autoApproval.executePermission": "Permiso de ejecución",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Ejecución de comandos en terminal",
|
||||
"migration.select.autoApproval.mcpPermission": "Permiso MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Uso de herramientas MCP",
|
||||
"migration.select.autoApproval.taskPermission": "Permiso de tareas",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Cambio de modos y creación de subtareas",
|
||||
"migration.select.language": "Idioma de la interfaz",
|
||||
"migration.select.languageDesc": "Tu preferencia de idioma se aplicará a la nueva extensión",
|
||||
"migration.select.autocomplete": "Configuración de autocompletado",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Preferencias de activación automática, atajos de teclado y autocompletado del chat",
|
||||
"migration.select.continue": "Continuar",
|
||||
"migration.select.back": "Atrás",
|
||||
"migration.progress.title": "Migrando tu configuración…",
|
||||
"migration.progress.done": "Continuar",
|
||||
"migration.complete.summary": "{{success}} de {{total}} elementos migrados con éxito.",
|
||||
"migration.complete.cleanup": "Eliminar datos de la configuración heredada",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Esto elimina la configuración antigua del almacenamiento de VS Code. No podrás volver a ejecutar esta migración.",
|
||||
"migration.complete.done": "Hecho",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -965,149 +965,61 @@ export const dict = {
|
||||
"settings.providers.notSet": "Non défini (utiliser la valeur par défaut du serveur)",
|
||||
"dialog.model.notSet": "Non défini",
|
||||
"profile.personalAccount": "Compte personnel",
|
||||
"agentManager.local": "local",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESSIONS",
|
||||
"agentManager.notGitRepo": "Ce n'est pas un dépôt git",
|
||||
"agentManager.worktree.settings": "Paramètres du Worktree",
|
||||
"agentManager.worktree.new": "Nouveau Worktree",
|
||||
"agentManager.worktree.setupScript": "Script de configuration du Worktree",
|
||||
"agentManager.worktree.delete": "Supprimer le Worktree",
|
||||
"agentManager.worktree.stale": "Obsolète",
|
||||
"agentManager.worktree.staleTooltip": "Absent du disque ou n'est plus suivi par git worktree",
|
||||
"agentManager.worktree.removeStale": "Supprimer le Worktree obsolète",
|
||||
"agentManager.worktree.doubleClickRename": "Double-cliquez pour renommer",
|
||||
"agentManager.worktree.versions": "{{count}} versions",
|
||||
"agentManager.worktree.advancedOptions": "Options avancées du Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCHE",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Sessions",
|
||||
"agentManager.hoverCard.files": "Fichiers",
|
||||
"agentManager.hoverCard.changes": "Modifications",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Nouvelle session",
|
||||
"agentManager.session.untitled": "Sans titre",
|
||||
"agentManager.session.newSession": "Nouvelle session",
|
||||
"agentManager.session.openInWorktree": "Ouvrir dans le Worktree",
|
||||
"agentManager.session.readonly": "Session en lecture seule",
|
||||
"agentManager.session.noSessions": "Aucune session ouverte",
|
||||
"agentManager.tab.close": "Fermer",
|
||||
"agentManager.tab.closeTab": "Fermer l'onglet",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Ouvrir le Terminal",
|
||||
"agentManager.setup.failed": "Échec de la configuration de l'espace de travail",
|
||||
"agentManager.setup.settingUp": "Configuration de l'espace de travail",
|
||||
"agentManager.shortcuts.title": "Raccourcis clavier",
|
||||
"agentManager.shortcuts.category.sidebar": "Barre latérale",
|
||||
"agentManager.shortcuts.category.tabs": "Onglets",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Élément précédent",
|
||||
"agentManager.shortcuts.nextItem": "Élément suivant",
|
||||
"agentManager.shortcuts.newWorktree": "Nouveau Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree avancé",
|
||||
"agentManager.shortcuts.deleteWorktree": "Supprimer le Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Onglet précédent",
|
||||
"agentManager.shortcuts.nextTab": "Onglet suivant",
|
||||
"agentManager.shortcuts.newTab": "Nouvel onglet",
|
||||
"agentManager.shortcuts.closeTab": "Fermer l'onglet",
|
||||
"agentManager.shortcuts.toggleTerminal": "Basculer le terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Focaliser le panneau",
|
||||
"agentManager.shortcuts.openAgentManager": "Ouvrir Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Supprimer le Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Supprimer le Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
" ? Cela supprime le Worktree du disque et dissocie toutes les sessions.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Annuler",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Supprimer",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/fr.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Supprimer le Worktree obsolète",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Supprimer le Worktree obsolète ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
" ? Cela supprime uniquement l'association dans Agent Manager et laisse les fichiers du disque inchangés.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Annuler",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Supprimer le Worktree obsolète",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nouveau worktree",
|
||||
"agentManager.dialog.tab.new": "Nouveau",
|
||||
"agentManager.dialog.tab.import": "Importer",
|
||||
"agentManager.dialog.namePlaceholder": "Nom du Worktree (optionnel)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Saisissez un message (⌘Entrée pour envoyer)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Saisissez un message (Ctrl+Entrée pour envoyer)",
|
||||
"agentManager.dialog.advancedOptions": "Options avancées",
|
||||
"agentManager.dialog.branchName": "Nom de la branche",
|
||||
"agentManager.dialog.branchNamePlaceholder": "généré automatiquement",
|
||||
"agentManager.dialog.baseBranch": "Branche de base",
|
||||
"agentManager.dialog.searchBranches": "Rechercher des branches...",
|
||||
"agentManager.dialog.branchBadge.default": "par défaut",
|
||||
"agentManager.dialog.branchBadge.remote": "distant",
|
||||
"agentManager.dialog.versions": "Versions",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees s'exécuteront en parallèle",
|
||||
"agentManager.dialog.compareModels": "Comparer les modèles",
|
||||
"agentManager.dialog.compareModels.searchModels": "Rechercher des modèles...",
|
||||
"agentManager.dialog.creating": "Création...",
|
||||
"agentManager.dialog.createWorkspace": "Créer un worktree",
|
||||
"agentManager.dialog.removeImage": "Supprimer l'image",
|
||||
"agentManager.dialog.advanced": "Avancé...",
|
||||
|
||||
"agentManager.diff.toggle": "Basculer le diff",
|
||||
"agentManager.diff.openFile": "Ouvrir le fichier",
|
||||
"agentManager.apply.button": "Appliquer en local",
|
||||
"agentManager.apply.globalButton": "Appliquer",
|
||||
"agentManager.apply.tooltip": "Appliquer les modifications du worktree sélectionné à la branche locale",
|
||||
"agentManager.apply.dialogTitle": "Appliquer les modifications à la branche locale",
|
||||
"agentManager.apply.confirm": "Appliquer maintenant",
|
||||
"agentManager.apply.retry": "Réessayer l'application",
|
||||
"agentManager.apply.previewTitle": "Appliquer ces modifications à la branche locale ?",
|
||||
"agentManager.apply.previewSummary": "{{files}} fichiers, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} sur {{total}} fichiers sélectionnés",
|
||||
"agentManager.apply.selectAll": "Tout sélectionner",
|
||||
"agentManager.apply.selectNone": "Tout désélectionner",
|
||||
"agentManager.apply.moreFiles": "+{{count}} de plus",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} de plus)",
|
||||
"agentManager.apply.checking": "Vérification...",
|
||||
"agentManager.apply.applying": "Application...",
|
||||
"agentManager.apply.success": "Modifications appliquées",
|
||||
"agentManager.apply.conflict": "L'application comporte des conflits",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{count}} conflits dans {{files}} fichiers. Consultez les détails dans Appliquer.",
|
||||
"agentManager.apply.error": "Échec de l'application",
|
||||
"agentManager.apply.conflictsTitle": "Conflits",
|
||||
"agentManager.apply.unknownFile": "Fichier non résolu",
|
||||
"agentManager.apply.reason.index": "Le fichier local diffère de la version attendue",
|
||||
"agentManager.apply.reason.patch": "Le patch ne peut pas être appliqué proprement",
|
||||
"agentManager.apply.reason.contents": "Impossible de lire le contenu du fichier local actuel",
|
||||
"agentManager.apply.reason.unknown": "Conflit détecté",
|
||||
"agentManager.apply.inline.success": "Appliqué",
|
||||
"agentManager.apply.inline.conflict": "Conflits",
|
||||
"agentManager.apply.inline.error": "Échoué",
|
||||
"agentManager.shortcuts.toggleDiff": "Basculer le panneau de diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Changement rapide",
|
||||
"agentManager.shortcuts.jumpToItem": "Aller à l'élément 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Tout envoyer au chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Tout envoyer au chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Commenter la ligne {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Modifier le commentaire de la ligne {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Laisser un commentaire...",
|
||||
"agentManager.review.commentAction": "Commenter",
|
||||
"agentManager.review.sendToChat": "Envoyer au chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} repliés",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} repliés, {{large}} volumineux",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Coller l'URL du PR...",
|
||||
"agentManager.import.open": "Ouvrir",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Sélectionner une branche...",
|
||||
"agentManager.import.loading": "Chargement...",
|
||||
"agentManager.import.loadingBranches": "Chargement des branches...",
|
||||
"agentManager.import.noMatchingBranches": "Aucune branche correspondante",
|
||||
"agentManager.import.noBranchesFound": "Aucune branche trouvée.",
|
||||
"agentManager.import.noBranchesHint": "Collez une URL de PR ci-dessus ou créez un nouveau Worktree.",
|
||||
"agentManager.import.failed": "Échec de l'importation",
|
||||
|
||||
"question.summary": "{{n}} sur {{total}} questions",
|
||||
"common.review": "Réviser",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrer depuis l'ancienne version",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migration de l'ancienne version",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrer les paramètres d'une précédente installation de Kilo Code, y compris les clés d'API des fournisseurs et le modèle par défaut.",
|
||||
"migration.welcome.title": "Bienvenue dans le nouveau Kilo Code",
|
||||
"migration.welcome.detected": "Nous avons détecté des paramètres d'une précédente installation de Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Les sessions de discussion et l'historique ne peuvent pas être migrés — la nouvelle version utilise une architecture différente.",
|
||||
"migration.welcome.canMigrate": "Les paramètres suivants peuvent être migrés vers la nouvelle version :",
|
||||
"migration.welcome.start": "Démarrer la migration",
|
||||
"migration.welcome.skip": "Ignorer la migration",
|
||||
"migration.steps.title": "Migrer vos paramètres",
|
||||
"migration.steps.subtitle":
|
||||
"Nous avons trouvé des paramètres de votre précédente installation de Kilo Code. Choisissez ce que vous souhaitez transférer.",
|
||||
"migration.select.providers": "Clés d'API des fournisseurs",
|
||||
"migration.select.mcpServers": "Serveurs MCP",
|
||||
"migration.select.customModes": "Modes personnalisés / Agents",
|
||||
"migration.select.defaultModel": "Modèle par défaut",
|
||||
"migration.select.unsupported": "Non pris en charge dans la nouvelle version",
|
||||
"migration.select.nothingToMigrate": "Rien à migrer n'a été trouvé dans les anciens paramètres.",
|
||||
"migration.select.settings": "Paramètres",
|
||||
"migration.select.autoApproval": "Approbation automatique",
|
||||
"migration.select.autoApproval.commandRules": "Règles de commande",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Bascule principale et listes de commandes autorisées/refusées",
|
||||
"migration.select.autoApproval.readPermission": "Autorisation de lecture",
|
||||
"migration.select.autoApproval.readPermissionDesc":
|
||||
"Accès en lecture aux fichiers à l'intérieur et à l'extérieur de l'espace de travail",
|
||||
"migration.select.autoApproval.writePermission": "Autorisation d'écriture",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Accès en écriture et modification de fichiers",
|
||||
"migration.select.autoApproval.executePermission": "Autorisation d'exécution",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Exécution de commandes dans le terminal",
|
||||
"migration.select.autoApproval.mcpPermission": "Autorisation MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Utilisation d'outils MCP",
|
||||
"migration.select.autoApproval.taskPermission": "Autorisation de tâche",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Changement de mode et création de sous-tâches",
|
||||
"migration.select.language": "Langue de l'interface",
|
||||
"migration.select.languageDesc": "Votre préférence de langue sera appliquée à la nouvelle extension",
|
||||
"migration.select.autocomplete": "Paramètres de saisie semi-automatique",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Préférences de déclenchement automatique, de raccourcis clavier et de saisie semi-automatique du chat",
|
||||
"migration.select.continue": "Continuer",
|
||||
"migration.select.back": "Retour",
|
||||
"migration.progress.title": "Migration de vos paramètres…",
|
||||
"migration.progress.done": "Continuer",
|
||||
"migration.complete.summary": "{{success}} éléments sur {{total}} migrés avec succès.",
|
||||
"migration.complete.cleanup": "Supprimer les données des anciens paramètres",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Cela supprime les anciens paramètres du stockage de VS Code. Vous ne pourrez pas réexécuter cette migration.",
|
||||
"migration.complete.done": "Terminé",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -945,149 +945,58 @@ export const dict = {
|
||||
"settings.providers.notSet": "未設定(サーバーのデフォルトを使用)",
|
||||
"dialog.model.notSet": "未設定",
|
||||
"profile.personalAccount": "個人アカウント",
|
||||
"agentManager.local": "ローカル",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "セッション",
|
||||
"agentManager.notGitRepo": "gitリポジトリではありません",
|
||||
"agentManager.worktree.settings": "Worktree設定",
|
||||
"agentManager.worktree.new": "新しいWorktree",
|
||||
"agentManager.worktree.setupScript": "Worktreeセットアップスクリプト",
|
||||
"agentManager.worktree.delete": "Worktreeを削除",
|
||||
"agentManager.worktree.stale": "無効",
|
||||
"agentManager.worktree.staleTooltip": "ディスク上に存在しないか、git worktree で追跡されていません",
|
||||
"agentManager.worktree.removeStale": "無効な Worktree を削除",
|
||||
"agentManager.worktree.doubleClickRename": "ダブルクリックで名前を変更",
|
||||
"agentManager.worktree.versions": "{{count}}バージョン",
|
||||
"agentManager.worktree.advancedOptions": "Worktreeの詳細オプション",
|
||||
"agentManager.hoverCard.branch": "ブランチ",
|
||||
"agentManager.hoverCard.base": "ベース",
|
||||
"agentManager.hoverCard.sessions": "セッション",
|
||||
"agentManager.hoverCard.files": "ファイル",
|
||||
"agentManager.hoverCard.changes": "変更",
|
||||
"agentManager.hoverCard.commits": "コミット",
|
||||
"agentManager.session.new": "新しいセッション",
|
||||
"agentManager.session.untitled": "無題",
|
||||
"agentManager.session.newSession": "新しいセッション",
|
||||
"agentManager.session.openInWorktree": "Worktreeで開く",
|
||||
"agentManager.session.readonly": "読み取り専用セッション",
|
||||
"agentManager.session.noSessions": "開いているセッションがありません",
|
||||
"agentManager.tab.close": "閉じる",
|
||||
"agentManager.tab.closeTab": "タブを閉じる",
|
||||
"agentManager.tab.terminal": "ターミナル",
|
||||
"agentManager.tab.openTerminal": "ターミナルを開く",
|
||||
"agentManager.setup.failed": "ワークスペースのセットアップに失敗しました",
|
||||
"agentManager.setup.settingUp": "ワークスペースをセットアップ中",
|
||||
"agentManager.shortcuts.title": "キーボードショートカット",
|
||||
"agentManager.shortcuts.category.sidebar": "サイドバー",
|
||||
"agentManager.shortcuts.category.tabs": "タブ",
|
||||
"agentManager.shortcuts.category.terminal": "ターミナル",
|
||||
"agentManager.shortcuts.category.global": "グローバル",
|
||||
"agentManager.shortcuts.previousItem": "前の項目",
|
||||
"agentManager.shortcuts.nextItem": "次の項目",
|
||||
"agentManager.shortcuts.newWorktree": "新しいWorktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "詳細Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktreeを削除",
|
||||
"agentManager.shortcuts.previousTab": "前のタブ",
|
||||
"agentManager.shortcuts.nextTab": "次のタブ",
|
||||
"agentManager.shortcuts.newTab": "新しいタブ",
|
||||
"agentManager.shortcuts.closeTab": "タブを閉じる",
|
||||
"agentManager.shortcuts.toggleTerminal": "ターミナルの切り替え",
|
||||
"agentManager.shortcuts.focusPanel": "パネルにフォーカス",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Managerを開く",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktreeを削除",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktreeを削除 ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? ディスクからWorktreeを削除し、すべてのセッションの関連付けを解除します。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "キャンセル",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "削除",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/ja.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "無効な Worktree を削除",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "無効な Worktree を削除 ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? これは Agent Manager の関連付けのみを削除し、ディスク上のファイルは変更しません。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "キャンセル",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "無効な Worktree を削除",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新規ワークツリー",
|
||||
"agentManager.dialog.tab.new": "新規",
|
||||
"agentManager.dialog.tab.import": "インポート",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree名(任意)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "メッセージを入力(⌘Enterで送信)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "メッセージを入力(Ctrl+Enterで送信)",
|
||||
"agentManager.dialog.advancedOptions": "詳細オプション",
|
||||
"agentManager.dialog.branchName": "ブランチ名",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自動生成",
|
||||
"agentManager.dialog.baseBranch": "ベースブランチ",
|
||||
"agentManager.dialog.searchBranches": "ブランチを検索...",
|
||||
"agentManager.dialog.branchBadge.default": "デフォルト",
|
||||
"agentManager.dialog.branchBadge.remote": "リモート",
|
||||
"agentManager.dialog.versions": "バージョン",
|
||||
"agentManager.dialog.versionHint": "{{count}}個のWorktreeが並行して実行されます",
|
||||
"agentManager.dialog.compareModels": "モデルを比較",
|
||||
"agentManager.dialog.compareModels.searchModels": "モデルを検索...",
|
||||
"agentManager.dialog.creating": "作成中...",
|
||||
"agentManager.dialog.createWorkspace": "ワークツリーを作成",
|
||||
"agentManager.dialog.removeImage": "画像を削除",
|
||||
"agentManager.dialog.advanced": "詳細...",
|
||||
|
||||
"agentManager.diff.toggle": "差分を切り替え",
|
||||
"agentManager.diff.openFile": "ファイルを開く",
|
||||
"agentManager.apply.button": "ローカルに適用",
|
||||
"agentManager.apply.globalButton": "適用",
|
||||
"agentManager.apply.tooltip": "選択したワークツリーの変更をローカルブランチに適用",
|
||||
"agentManager.apply.dialogTitle": "ローカルブランチに変更を適用",
|
||||
"agentManager.apply.confirm": "今すぐ適用",
|
||||
"agentManager.apply.retry": "適用を再試行",
|
||||
"agentManager.apply.previewTitle": "これらの変更をローカルブランチに適用しますか?",
|
||||
"agentManager.apply.previewSummary": "{{files}} ファイル、+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{total}} ファイル中 {{selected}} 件選択",
|
||||
"agentManager.apply.selectAll": "すべて選択",
|
||||
"agentManager.apply.selectNone": "選択解除",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 件",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} 件)",
|
||||
"agentManager.apply.checking": "確認中...",
|
||||
"agentManager.apply.applying": "適用中...",
|
||||
"agentManager.apply.success": "変更が適用されました",
|
||||
"agentManager.apply.conflict": "適用に競合があります",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{files}} ファイルに {{count}} 件の競合があります。適用で詳細を確認してください。",
|
||||
"agentManager.apply.error": "適用に失敗しました",
|
||||
"agentManager.apply.conflictsTitle": "競合",
|
||||
"agentManager.apply.unknownFile": "未解決のファイル",
|
||||
"agentManager.apply.reason.index": "ローカルファイルが期待されるバージョンと異なります",
|
||||
"agentManager.apply.reason.patch": "パッチをクリーンに適用できません",
|
||||
"agentManager.apply.reason.contents": "現在のローカルファイルの内容を読み取れません",
|
||||
"agentManager.apply.reason.unknown": "競合が検出されました",
|
||||
"agentManager.apply.inline.success": "適用済み",
|
||||
"agentManager.apply.inline.conflict": "競合",
|
||||
"agentManager.apply.inline.error": "失敗",
|
||||
"agentManager.shortcuts.toggleDiff": "差分パネルを切り替え",
|
||||
"agentManager.shortcuts.category.quickSwitch": "クイック切り替え",
|
||||
"agentManager.shortcuts.jumpToItem": "項目 1\u20139 に移動",
|
||||
"agentManager.review.sendAllToChat": "すべてをチャットに送信",
|
||||
"agentManager.review.sendAllToChatWithCount": "すべてをチャットに送信 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "{{line}} 行目にコメント",
|
||||
"agentManager.review.editCommentOnLine": "{{line}} 行目のコメントを編集",
|
||||
"agentManager.review.commentPlaceholder": "コメントを入力...",
|
||||
"agentManager.review.commentAction": "コメント",
|
||||
"agentManager.review.sendToChat": "チャットに送信",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 件折りたたみ",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 件折りたたみ、{{large}} 件がサイズ大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR URLを貼り付け...",
|
||||
"agentManager.import.open": "開く",
|
||||
"agentManager.import.branches": "ブランチ",
|
||||
"agentManager.import.selectBranch": "ブランチを選択...",
|
||||
"agentManager.import.loading": "読み込み中...",
|
||||
"agentManager.import.loadingBranches": "ブランチを読み込み中...",
|
||||
"agentManager.import.noMatchingBranches": "一致するブランチがありません",
|
||||
"agentManager.import.noBranchesFound": "ブランチが見つかりません。",
|
||||
"agentManager.import.noBranchesHint": "上にPR URLを貼り付けるか、新しいWorktreeを作成してください。",
|
||||
"agentManager.import.failed": "インポートに失敗しました",
|
||||
|
||||
"question.summary": "{{total}} 問中 {{n}} 問目",
|
||||
"common.review": "確認",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "レガシーバージョンからの移行",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "レガシー移行",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"プロバイダーのAPIキーやデフォルトモデルなど、以前にインストールしたKilo Codeから設定を移行します。",
|
||||
"migration.welcome.title": "新しいKilo Codeへようこそ",
|
||||
"migration.welcome.detected": "以前にインストールされたKilo Codeの設定を検出しました。",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"チャットセッションと履歴は移行できません — 新しいバージョンでは異なるアーキテクチャが使用されています。",
|
||||
"migration.welcome.canMigrate": "以下の設定を新しいバージョンに移行できます:",
|
||||
"migration.welcome.start": "移行を開始",
|
||||
"migration.welcome.skip": "移行をスキップ",
|
||||
"migration.steps.title": "設定の移行",
|
||||
"migration.steps.subtitle": "以前のKilo Codeインストールの設定が見つかりました。引き継ぐ項目を選択してください。",
|
||||
"migration.select.providers": "プロバイダーのAPIキー",
|
||||
"migration.select.mcpServers": "MCPサーバー",
|
||||
"migration.select.customModes": "カスタムモード / エージェント",
|
||||
"migration.select.defaultModel": "デフォルトモデル",
|
||||
"migration.select.unsupported": "新しいバージョンではサポートされていません",
|
||||
"migration.select.nothingToMigrate": "レガシー設定に移行する項目が見つかりませんでした。",
|
||||
"migration.select.settings": "設定",
|
||||
"migration.select.autoApproval": "自動承認",
|
||||
"migration.select.autoApproval.commandRules": "コマンドルール",
|
||||
"migration.select.autoApproval.commandRulesDesc": "マスタートグルと許可/拒否されたコマンドリスト",
|
||||
"migration.select.autoApproval.readPermission": "読み取り権限",
|
||||
"migration.select.autoApproval.readPermissionDesc": "ワークスペース内外のファイル読み取りアクセス",
|
||||
"migration.select.autoApproval.writePermission": "書き込み権限",
|
||||
"migration.select.autoApproval.writePermissionDesc": "ファイルの書き込みと編集アクセス",
|
||||
"migration.select.autoApproval.executePermission": "実行権限",
|
||||
"migration.select.autoApproval.executePermissionDesc": "ターミナルコマンドの実行",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP権限",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "MCPツールの使用",
|
||||
"migration.select.autoApproval.taskPermission": "タスク権限",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "モードの切り替えとサブタスクの作成",
|
||||
"migration.select.language": "UI言語",
|
||||
"migration.select.languageDesc": "言語設定は新しい拡張機能に適用されます",
|
||||
"migration.select.autocomplete": "オートコンプリート設定",
|
||||
"migration.select.autocompleteDesc": "自動トリガー、キーバインド、およびチャットのオートコンプリート設定",
|
||||
"migration.select.continue": "続行",
|
||||
"migration.select.back": "戻る",
|
||||
"migration.progress.title": "設定を移行しています…",
|
||||
"migration.progress.done": "続行",
|
||||
"migration.complete.summary": "{{total}}個中{{success}}個の項目が正常に移行されました。",
|
||||
"migration.complete.cleanup": "レガシー設定データを削除する",
|
||||
"migration.complete.cleanupDescription":
|
||||
"VS Codeのストレージから古い設定を削除します。この移行を再度実行することはできなくなります。",
|
||||
"migration.complete.done": "完了",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -946,148 +946,58 @@ export const dict = {
|
||||
"settings.providers.notSet": "설정되지 않음 (서버 기본값 사용)",
|
||||
"dialog.model.notSet": "설정되지 않음",
|
||||
"profile.personalAccount": "개인 계정",
|
||||
"agentManager.local": "로컬",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "세션",
|
||||
"agentManager.notGitRepo": "git 저장소가 아닙니다",
|
||||
"agentManager.worktree.settings": "Worktree 설정",
|
||||
"agentManager.worktree.new": "새 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 설정 스크립트",
|
||||
"agentManager.worktree.delete": "Worktree 삭제",
|
||||
"agentManager.worktree.stale": "오래됨",
|
||||
"agentManager.worktree.staleTooltip": "디스크에 없거나 더 이상 git worktree에서 추적되지 않습니다",
|
||||
"agentManager.worktree.removeStale": "오래된 Worktree 제거",
|
||||
"agentManager.worktree.doubleClickRename": "더블 클릭하여 이름 변경",
|
||||
"agentManager.worktree.versions": "{{count}}개 버전",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 고급 옵션",
|
||||
"agentManager.hoverCard.branch": "브랜치",
|
||||
"agentManager.hoverCard.base": "베이스",
|
||||
"agentManager.hoverCard.sessions": "세션",
|
||||
"agentManager.hoverCard.files": "파일",
|
||||
"agentManager.hoverCard.changes": "변경 사항",
|
||||
"agentManager.hoverCard.commits": "커밋",
|
||||
"agentManager.session.new": "새 세션",
|
||||
"agentManager.session.untitled": "제목 없음",
|
||||
"agentManager.session.newSession": "새 세션",
|
||||
"agentManager.session.openInWorktree": "Worktree에서 열기",
|
||||
"agentManager.session.readonly": "읽기 전용 세션",
|
||||
"agentManager.session.noSessions": "열린 세션 없음",
|
||||
"agentManager.tab.close": "닫기",
|
||||
"agentManager.tab.closeTab": "탭 닫기",
|
||||
"agentManager.tab.terminal": "터미널",
|
||||
"agentManager.tab.openTerminal": "터미널 열기",
|
||||
"agentManager.setup.failed": "워크스페이스 설정 실패",
|
||||
"agentManager.setup.settingUp": "워크스페이스 설정 중",
|
||||
"agentManager.shortcuts.title": "키보드 단축키",
|
||||
"agentManager.shortcuts.category.sidebar": "사이드바",
|
||||
"agentManager.shortcuts.category.tabs": "탭",
|
||||
"agentManager.shortcuts.category.terminal": "터미널",
|
||||
"agentManager.shortcuts.category.global": "전역",
|
||||
"agentManager.shortcuts.previousItem": "이전 항목",
|
||||
"agentManager.shortcuts.nextItem": "다음 항목",
|
||||
"agentManager.shortcuts.newWorktree": "새 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "고급 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Worktree 삭제",
|
||||
"agentManager.shortcuts.previousTab": "이전 탭",
|
||||
"agentManager.shortcuts.nextTab": "다음 탭",
|
||||
"agentManager.shortcuts.newTab": "새 탭",
|
||||
"agentManager.shortcuts.closeTab": "탭 닫기",
|
||||
"agentManager.shortcuts.toggleTerminal": "터미널 전환",
|
||||
"agentManager.shortcuts.focusPanel": "패널 포커스",
|
||||
"agentManager.shortcuts.openAgentManager": "Agent Manager 열기",
|
||||
"agentManager.dialog.deleteWorktree.title": "Worktree 삭제",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Worktree 삭제 ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? 디스크에서 Worktree를 제거하고 모든 세션의 연결을 해제합니다.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "취소",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "삭제",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/ko.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "오래된 Worktree 제거",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "오래된 Worktree 제거 ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? 이 작업은 Agent Manager 매핑만 제거하며 디스크의 파일은 변경하지 않습니다.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "취소",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "오래된 Worktree 제거",
|
||||
|
||||
"agentManager.dialog.openWorktree": "새 워크트리",
|
||||
"agentManager.dialog.tab.new": "새로 만들기",
|
||||
"agentManager.dialog.tab.import": "가져오기",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 이름 (선택사항)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "메시지를 입력하세요 (⌘Enter로 전송)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "메시지를 입력하세요 (Ctrl+Enter로 전송)",
|
||||
"agentManager.dialog.advancedOptions": "고급 옵션",
|
||||
"agentManager.dialog.branchName": "브랜치 이름",
|
||||
"agentManager.dialog.branchNamePlaceholder": "자동 생성",
|
||||
"agentManager.dialog.baseBranch": "베이스 브랜치",
|
||||
"agentManager.dialog.searchBranches": "브랜치 검색...",
|
||||
"agentManager.dialog.branchBadge.default": "기본",
|
||||
"agentManager.dialog.branchBadge.remote": "원격",
|
||||
"agentManager.dialog.versions": "버전",
|
||||
"agentManager.dialog.versionHint": "{{count}}개의 Worktree가 병렬로 실행됩니다",
|
||||
"agentManager.dialog.compareModels": "모델 비교",
|
||||
"agentManager.dialog.compareModels.searchModels": "모델 검색...",
|
||||
"agentManager.dialog.creating": "생성 중...",
|
||||
"agentManager.dialog.createWorkspace": "워크트리 생성",
|
||||
"agentManager.dialog.removeImage": "이미지 제거",
|
||||
"agentManager.dialog.advanced": "고급...",
|
||||
|
||||
"agentManager.diff.toggle": "차이점 전환",
|
||||
"agentManager.diff.openFile": "파일 열기",
|
||||
"agentManager.apply.button": "로컬에 적용",
|
||||
"agentManager.apply.globalButton": "적용",
|
||||
"agentManager.apply.tooltip": "선택한 워크트리 변경사항을 로컬 브랜치에 적용",
|
||||
"agentManager.apply.dialogTitle": "로컬 브랜치에 변경사항 적용",
|
||||
"agentManager.apply.confirm": "지금 적용",
|
||||
"agentManager.apply.retry": "적용 재시도",
|
||||
"agentManager.apply.previewTitle": "이 변경사항을 로컬 브랜치에 적용하시겠습니까?",
|
||||
"agentManager.apply.previewSummary": "{{files}}개 파일, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{total}}개 파일 중 {{selected}}개 선택됨",
|
||||
"agentManager.apply.selectAll": "모두 선택",
|
||||
"agentManager.apply.selectNone": "선택 해제",
|
||||
"agentManager.apply.moreFiles": "+{{count}}개 더",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}}개 더)",
|
||||
"agentManager.apply.checking": "확인 중...",
|
||||
"agentManager.apply.applying": "적용 중...",
|
||||
"agentManager.apply.success": "변경사항이 적용되었습니다",
|
||||
"agentManager.apply.conflict": "적용 시 충돌이 있습니다",
|
||||
"agentManager.apply.conflictToast":
|
||||
"{{files}}개 파일에서 {{count}}개 충돌이 발생했습니다. 적용에서 세부 정보를 확인하세요.",
|
||||
"agentManager.apply.error": "적용 실패",
|
||||
"agentManager.apply.conflictsTitle": "충돌",
|
||||
"agentManager.apply.unknownFile": "미해결 파일",
|
||||
"agentManager.apply.reason.index": "로컬 파일이 예상 버전과 다릅니다",
|
||||
"agentManager.apply.reason.patch": "패치를 깨끗하게 적용할 수 없습니다",
|
||||
"agentManager.apply.reason.contents": "현재 로컬 파일 내용을 읽을 수 없습니다",
|
||||
"agentManager.apply.reason.unknown": "충돌이 감지되었습니다",
|
||||
"agentManager.apply.inline.success": "적용됨",
|
||||
"agentManager.apply.inline.conflict": "충돌",
|
||||
"agentManager.apply.inline.error": "실패",
|
||||
"agentManager.shortcuts.toggleDiff": "차이점 패널 전환",
|
||||
"agentManager.shortcuts.category.quickSwitch": "빠른 전환",
|
||||
"agentManager.shortcuts.jumpToItem": "항목 1\u20139(으)로 이동",
|
||||
"agentManager.review.sendAllToChat": "모두 채팅으로 보내기",
|
||||
"agentManager.review.sendAllToChatWithCount": "모두 채팅으로 보내기 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "{{line}}줄에 댓글",
|
||||
"agentManager.review.editCommentOnLine": "{{line}}줄 댓글 편집",
|
||||
"agentManager.review.commentPlaceholder": "댓글을 남기세요...",
|
||||
"agentManager.review.commentAction": "댓글",
|
||||
"agentManager.review.sendToChat": "채팅으로 보내기",
|
||||
"agentManager.review.collapsedOnly": "{{count}}개 접힘",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}}개 접힘, {{large}}개 대용량",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "PR URL 붙여넣기...",
|
||||
"agentManager.import.open": "열기",
|
||||
"agentManager.import.branches": "브랜치",
|
||||
"agentManager.import.selectBranch": "브랜치 선택...",
|
||||
"agentManager.import.loading": "로딩 중...",
|
||||
"agentManager.import.loadingBranches": "브랜치 로딩 중...",
|
||||
"agentManager.import.noMatchingBranches": "일치하는 브랜치 없음",
|
||||
"agentManager.import.noBranchesFound": "브랜치를 찾을 수 없습니다.",
|
||||
"agentManager.import.noBranchesHint": "위에 PR URL을 붙여넣거나 새 Worktree를 만드세요.",
|
||||
"agentManager.import.failed": "가져오기 실패",
|
||||
|
||||
"question.summary": "{{total}}개 질문 중 {{n}}번째",
|
||||
"common.review": "검토",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "레거시 버전에서 마이그레이션",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "레거시 마이그레이션",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"공급자 API 키 및 기본 모델을 포함하여 이전 Kilo Code 설치에서 설정을 마이그레이션합니다.",
|
||||
"migration.welcome.title": "새로운 Kilo Code에 오신 것을 환영합니다",
|
||||
"migration.welcome.detected": "이전 Kilo Code 설치의 설정이 감지되었습니다.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"채팅 세션 및 기록은 마이그레이션할 수 없습니다 — 새 버전은 다른 아키텍처를 사용합니다.",
|
||||
"migration.welcome.canMigrate": "다음 설정은 새 버전으로 마이그레이션할 수 있습니다:",
|
||||
"migration.welcome.start": "마이그레이션 시작",
|
||||
"migration.welcome.skip": "마이그레이션 건너뛰기",
|
||||
"migration.steps.title": "설정 마이그레이션",
|
||||
"migration.steps.subtitle": "이전 Kilo Code 설치에서 설정을 찾았습니다. 가져올 항목을 선택하세요.",
|
||||
"migration.select.providers": "공급자 API 키",
|
||||
"migration.select.mcpServers": "MCP 서버",
|
||||
"migration.select.customModes": "사용자 지정 모드 / 에이전트",
|
||||
"migration.select.defaultModel": "기본 모델",
|
||||
"migration.select.unsupported": "새 버전에서는 지원되지 않음",
|
||||
"migration.select.nothingToMigrate": "레거시 설정에서 마이그레이션할 항목을 찾지 못했습니다.",
|
||||
"migration.select.settings": "설정",
|
||||
"migration.select.autoApproval": "자동 승인",
|
||||
"migration.select.autoApproval.commandRules": "명령 규칙",
|
||||
"migration.select.autoApproval.commandRulesDesc": "마스터 토글 및 허용/거부된 명령 목록",
|
||||
"migration.select.autoApproval.readPermission": "읽기 권한",
|
||||
"migration.select.autoApproval.readPermissionDesc": "작업 공간 내부 및 외부의 파일 읽기 액세스",
|
||||
"migration.select.autoApproval.writePermission": "쓰기 권한",
|
||||
"migration.select.autoApproval.writePermissionDesc": "파일 쓰기 및 편집 액세스",
|
||||
"migration.select.autoApproval.executePermission": "실행 권한",
|
||||
"migration.select.autoApproval.executePermissionDesc": "터미널 명령 실행",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP 권한",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "MCP 도구 사용",
|
||||
"migration.select.autoApproval.taskPermission": "작업 권한",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "모드 전환 및 하위 작업 생성",
|
||||
"migration.select.language": "UI 언어",
|
||||
"migration.select.languageDesc": "언어 기본 설정이 새 확장 프로그램에 적용됩니다",
|
||||
"migration.select.autocomplete": "자동 완성 설정",
|
||||
"migration.select.autocompleteDesc": "자동 트리거, 키 바인딩 및 채팅 자동 완성 기본 설정",
|
||||
"migration.select.continue": "계속",
|
||||
"migration.select.back": "뒤로",
|
||||
"migration.progress.title": "설정을 마이그레이션하는 중…",
|
||||
"migration.progress.done": "계속",
|
||||
"migration.complete.summary": "{{total}}개 중 {{success}}개 항목이 성공적으로 마이그레이션되었습니다.",
|
||||
"migration.complete.cleanup": "레거시 설정 데이터 제거",
|
||||
"migration.complete.cleanupDescription":
|
||||
"이 작업은 VS Code 저장소에서 이전 설정을 제거합니다. 이 마이그레이션을 다시 실행할 수 없게 됩니다.",
|
||||
"migration.complete.done": "완료",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -951,147 +951,59 @@ export const dict = {
|
||||
"settings.providers.notSet": "Ikke angitt (bruk serverstandard)",
|
||||
"dialog.model.notSet": "Ikke angitt",
|
||||
"profile.personalAccount": "Personlig konto",
|
||||
"agentManager.local": "lokal",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "ØKTER",
|
||||
"agentManager.notGitRepo": "Ikke et git-repositorium",
|
||||
"agentManager.worktree.settings": "Worktree-innstillinger",
|
||||
"agentManager.worktree.new": "Nytt Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree-oppsettskript",
|
||||
"agentManager.worktree.delete": "Slett Worktree",
|
||||
"agentManager.worktree.stale": "Utdatert",
|
||||
"agentManager.worktree.staleTooltip": "Mangler på disken eller spores ikke lenger av git worktree",
|
||||
"agentManager.worktree.removeStale": "Fjern utdatert Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Dobbeltklikk for å gi nytt navn",
|
||||
"agentManager.worktree.versions": "{{count}} versjoner",
|
||||
"agentManager.worktree.advancedOptions": "Avanserte Worktree-alternativer",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Base",
|
||||
"agentManager.hoverCard.sessions": "Økter",
|
||||
"agentManager.hoverCard.files": "Filer",
|
||||
"agentManager.hoverCard.changes": "Endringer",
|
||||
"agentManager.hoverCard.commits": "Commits",
|
||||
"agentManager.session.new": "Ny økt",
|
||||
"agentManager.session.untitled": "Uten tittel",
|
||||
"agentManager.session.newSession": "Ny økt",
|
||||
"agentManager.session.openInWorktree": "Åpne i Worktree",
|
||||
"agentManager.session.readonly": "Skrivebeskyttet økt",
|
||||
"agentManager.session.noSessions": "Ingen åpne økter",
|
||||
"agentManager.tab.close": "Lukk",
|
||||
"agentManager.tab.closeTab": "Lukk fane",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Åpne Terminal",
|
||||
"agentManager.setup.failed": "Oppsett av arbeidsområde mislyktes",
|
||||
"agentManager.setup.settingUp": "Setter opp arbeidsområde",
|
||||
"agentManager.shortcuts.title": "Tastatursnarveier",
|
||||
"agentManager.shortcuts.category.sidebar": "Sidepanel",
|
||||
"agentManager.shortcuts.category.tabs": "Faner",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Global",
|
||||
"agentManager.shortcuts.previousItem": "Forrige element",
|
||||
"agentManager.shortcuts.nextItem": "Neste element",
|
||||
"agentManager.shortcuts.newWorktree": "Nytt Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Avansert Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Slett Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Forrige fane",
|
||||
"agentManager.shortcuts.nextTab": "Neste fane",
|
||||
"agentManager.shortcuts.newTab": "Ny fane",
|
||||
"agentManager.shortcuts.closeTab": "Lukk fane",
|
||||
"agentManager.shortcuts.toggleTerminal": "Veksle terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokuser panel",
|
||||
"agentManager.shortcuts.openAgentManager": "Åpne Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Slett Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Slett Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Dette fjerner Worktree fra disken og kobler fra alle økter.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Avbryt",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Slett",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/no.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Fjern utdatert Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Fjern utdatert Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Dette fjerner bare koblingen i Agent Manager og lar filene på disken være urørt.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Avbryt",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Fjern utdatert Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Ny worktree",
|
||||
"agentManager.dialog.tab.new": "Ny",
|
||||
"agentManager.dialog.tab.import": "Importer",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree-navn (valgfritt)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Skriv en melding (⌘Enter for å sende)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Skriv en melding (Ctrl+Enter for å sende)",
|
||||
"agentManager.dialog.advancedOptions": "Avanserte alternativer",
|
||||
"agentManager.dialog.branchName": "Branch-navn",
|
||||
"agentManager.dialog.branchNamePlaceholder": "automatisk generert",
|
||||
"agentManager.dialog.baseBranch": "Base-branch",
|
||||
"agentManager.dialog.searchBranches": "Søk branches...",
|
||||
"agentManager.dialog.branchBadge.default": "standard",
|
||||
"agentManager.dialog.branchBadge.remote": "fjern",
|
||||
"agentManager.dialog.versions": "Versjoner",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktrees vil kjøre parallelt",
|
||||
"agentManager.dialog.compareModels": "Sammenlign modeller",
|
||||
"agentManager.dialog.compareModels.searchModels": "Søk modeller...",
|
||||
"agentManager.dialog.creating": "Oppretter...",
|
||||
"agentManager.dialog.createWorkspace": "Opprett worktree",
|
||||
"agentManager.dialog.removeImage": "Fjern bilde",
|
||||
"agentManager.dialog.advanced": "Avansert...",
|
||||
|
||||
"agentManager.diff.toggle": "Veksle diff",
|
||||
"agentManager.diff.openFile": "Åpne fil",
|
||||
"agentManager.apply.button": "Bruk lokalt",
|
||||
"agentManager.apply.globalButton": "Bruk",
|
||||
"agentManager.apply.tooltip": "Bruk valgte worktree-endringer på den lokale grenen",
|
||||
"agentManager.apply.dialogTitle": "Bruk endringer på den lokale grenen",
|
||||
"agentManager.apply.confirm": "Bruk nå",
|
||||
"agentManager.apply.retry": "Prøv å bruke på nytt",
|
||||
"agentManager.apply.previewTitle": "Bruke disse endringene på den lokale grenen?",
|
||||
"agentManager.apply.previewSummary": "{{files}} filer, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} av {{total}} filer valgt",
|
||||
"agentManager.apply.selectAll": "Velg alle",
|
||||
"agentManager.apply.selectNone": "Velg ingen",
|
||||
"agentManager.apply.moreFiles": "+{{count}} flere",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} flere)",
|
||||
"agentManager.apply.checking": "Sjekker...",
|
||||
"agentManager.apply.applying": "Bruker...",
|
||||
"agentManager.apply.success": "Endringer brukt",
|
||||
"agentManager.apply.conflict": "Bruk har konflikter",
|
||||
"agentManager.apply.conflictToast": "{{count}} konflikter i {{files}} filer. Se detaljer i Bruk.",
|
||||
"agentManager.apply.error": "Bruk mislyktes",
|
||||
"agentManager.apply.conflictsTitle": "Konflikter",
|
||||
"agentManager.apply.unknownFile": "Uløst fil",
|
||||
"agentManager.apply.reason.index": "Lokal fil skiller seg fra forventet versjon",
|
||||
"agentManager.apply.reason.patch": "Patch kan ikke brukes rent",
|
||||
"agentManager.apply.reason.contents": "Kan ikke lese innholdet i gjeldende lokal fil",
|
||||
"agentManager.apply.reason.unknown": "Konflikt oppdaget",
|
||||
"agentManager.apply.inline.success": "Brukt",
|
||||
"agentManager.apply.inline.conflict": "Konflikter",
|
||||
"agentManager.apply.inline.error": "Mislyktes",
|
||||
"agentManager.shortcuts.toggleDiff": "Veksle diff-panel",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Hurtigbytte",
|
||||
"agentManager.shortcuts.jumpToItem": "Hopp til element 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Send alt til chat",
|
||||
"agentManager.review.sendAllToChatWithCount": "Send alt til chat ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Kommenter på linje {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Rediger kommentar på linje {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Legg igjen en kommentar...",
|
||||
"agentManager.review.commentAction": "Kommenter",
|
||||
"agentManager.review.sendToChat": "Send til chat",
|
||||
"agentManager.review.collapsedOnly": "{{count}} kollapset",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} kollapset, {{large}} store",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Lim inn PR URL...",
|
||||
"agentManager.import.open": "Åpne",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "Velg branch...",
|
||||
"agentManager.import.loading": "Laster...",
|
||||
"agentManager.import.loadingBranches": "Laster branches...",
|
||||
"agentManager.import.noMatchingBranches": "Ingen matchende branches",
|
||||
"agentManager.import.noBranchesFound": "Ingen branches funnet.",
|
||||
"agentManager.import.noBranchesHint": "Lim inn en PR URL ovenfor eller opprett et nytt Worktree.",
|
||||
"agentManager.import.failed": "Import mislyktes",
|
||||
|
||||
"question.summary": "{{n}} av {{total}} spørsmål",
|
||||
"common.review": "Gjennomgå",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migrer fra eldre versjon",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migrering fra eldre versjon",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migrer innstillinger fra en tidligere installasjon av Kilo Code, inkludert API-nøkler for leverandører og standardmodell.",
|
||||
"migration.welcome.title": "Velkommen til nye Kilo Code",
|
||||
"migration.welcome.detected": "Vi oppdaget innstillinger fra en tidligere installasjon av Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Chatøkter og historikk kan ikke migreres — den nye versjonen bruker en annen arkitektur.",
|
||||
"migration.welcome.canMigrate": "Følgende innstillinger kan migreres til den nye versjonen:",
|
||||
"migration.welcome.start": "Start migrering",
|
||||
"migration.welcome.skip": "Hopp over migrering",
|
||||
"migration.steps.title": "Migrer innstillingene dine",
|
||||
"migration.steps.subtitle":
|
||||
"Vi fant innstillinger fra din tidligere Kilo Code-installasjon. Velg hva du vil ta med over.",
|
||||
"migration.select.providers": "API-nøkler for leverandører",
|
||||
"migration.select.mcpServers": "MCP-servere",
|
||||
"migration.select.customModes": "Egendefinerte moduser / Agenter",
|
||||
"migration.select.defaultModel": "Standardmodell",
|
||||
"migration.select.unsupported": "Støttes ikke i ny versjon",
|
||||
"migration.select.nothingToMigrate": "Ingenting å migrere ble funnet i de eldre innstillingene.",
|
||||
"migration.select.settings": "Innstillinger",
|
||||
"migration.select.autoApproval": "Automatisk godkjenning",
|
||||
"migration.select.autoApproval.commandRules": "Kommandoregler",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Hovedbryter og lister for tillatte/avviste kommandoer",
|
||||
"migration.select.autoApproval.readPermission": "Lesetillatelse",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Lesetilgang for filer i og utenfor arbeidsområdet",
|
||||
"migration.select.autoApproval.writePermission": "Skrivetillatelse",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Skrive- og redigeringstilgang for filer",
|
||||
"migration.select.autoApproval.executePermission": "Utførelsestillatelse",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Kjøring av terminalkommandoer",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP-tillatelse",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Bruk av MCP-verktøy",
|
||||
"migration.select.autoApproval.taskPermission": "Oppgavetillatelse",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Modusbytte og opprettelse av underoppgaver",
|
||||
"migration.select.language": "UI-språk",
|
||||
"migration.select.languageDesc": "Din språkpreferanse vil bli brukt i den nye utvidelsen",
|
||||
"migration.select.autocomplete": "Innstillinger for autofullføring",
|
||||
"migration.select.autocompleteDesc": "Preferanser for autoutløsing, hurtigtaster og autofullføring i chat",
|
||||
"migration.select.continue": "Fortsett",
|
||||
"migration.select.back": "Tilbake",
|
||||
"migration.progress.title": "Migrerer innstillingene dine…",
|
||||
"migration.progress.done": "Fortsett",
|
||||
"migration.complete.summary": "{{success}} av {{total}} elementer ble migrert.",
|
||||
"migration.complete.cleanup": "Fjern eldre innstillingsdata",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Dette fjerner de gamle innstillingene fra VS Code-lagringen. Du vil ikke kunne kjøre denne migreringen på nytt.",
|
||||
"migration.complete.done": "Ferdig",
|
||||
// legacy-migration end
|
||||
} satisfies Partial<Record<Keys, string>>
|
||||
|
||||
@@ -952,148 +952,61 @@ export const dict = {
|
||||
"settings.providers.notSet": "Nie ustawiono (użyj domyślnego serwera)",
|
||||
"dialog.model.notSet": "Nie ustawiono",
|
||||
"profile.personalAccount": "Konto osobiste",
|
||||
"agentManager.local": "lokalne",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "SESJE",
|
||||
"agentManager.notGitRepo": "Nie jest repozytorium git",
|
||||
"agentManager.worktree.settings": "Ustawienia Worktree",
|
||||
"agentManager.worktree.new": "Nowy Worktree",
|
||||
"agentManager.worktree.setupScript": "Skrypt konfiguracji Worktree",
|
||||
"agentManager.worktree.delete": "Usuń Worktree",
|
||||
"agentManager.worktree.stale": "Nieaktualny",
|
||||
"agentManager.worktree.staleTooltip": "Brak na dysku lub nie jest już śledzony przez git worktree",
|
||||
"agentManager.worktree.removeStale": "Usuń nieaktualny Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Kliknij dwukrotnie, aby zmienić nazwę",
|
||||
"agentManager.worktree.versions": "{{count}} wersji",
|
||||
"agentManager.worktree.advancedOptions": "Zaawansowane opcje Worktree",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "Baza",
|
||||
"agentManager.hoverCard.sessions": "Sesje",
|
||||
"agentManager.hoverCard.files": "Pliki",
|
||||
"agentManager.hoverCard.changes": "Zmiany",
|
||||
"agentManager.hoverCard.commits": "Commity",
|
||||
"agentManager.session.new": "Nowa sesja",
|
||||
"agentManager.session.untitled": "Bez tytułu",
|
||||
"agentManager.session.newSession": "Nowa sesja",
|
||||
"agentManager.session.openInWorktree": "Otwórz w Worktree",
|
||||
"agentManager.session.readonly": "Sesja tylko do odczytu",
|
||||
"agentManager.session.noSessions": "Brak otwartych sesji",
|
||||
"agentManager.tab.close": "Zamknij",
|
||||
"agentManager.tab.closeTab": "Zamknij kartę",
|
||||
"agentManager.tab.terminal": "Terminal",
|
||||
"agentManager.tab.openTerminal": "Otwórz Terminal",
|
||||
"agentManager.setup.failed": "Konfiguracja workspace nie powiodła się",
|
||||
"agentManager.setup.settingUp": "Konfigurowanie workspace",
|
||||
"agentManager.shortcuts.title": "Skróty klawiszowe",
|
||||
"agentManager.shortcuts.category.sidebar": "Pasek boczny",
|
||||
"agentManager.shortcuts.category.tabs": "Karty",
|
||||
"agentManager.shortcuts.category.terminal": "Terminal",
|
||||
"agentManager.shortcuts.category.global": "Globalne",
|
||||
"agentManager.shortcuts.previousItem": "Poprzedni element",
|
||||
"agentManager.shortcuts.nextItem": "Następny element",
|
||||
"agentManager.shortcuts.newWorktree": "Nowy Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Zaawansowany Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Usuń Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Poprzednia karta",
|
||||
"agentManager.shortcuts.nextTab": "Następna karta",
|
||||
"agentManager.shortcuts.newTab": "Nowa karta",
|
||||
"agentManager.shortcuts.closeTab": "Zamknij kartę",
|
||||
"agentManager.shortcuts.toggleTerminal": "Przełącz terminal",
|
||||
"agentManager.shortcuts.focusPanel": "Fokus na panelu",
|
||||
"agentManager.shortcuts.openAgentManager": "Otwórz Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Usuń Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Usunąć Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? Spowoduje to usunięcie Worktree z dysku i odłączenie wszystkich sesji.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Anuluj",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Usuń",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/pl.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Usuń nieaktualny Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Usunąć nieaktualny Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? To usunie tylko mapowanie w Agent Manager i nie zmieni plików na dysku.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Anuluj",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Usuń nieaktualny Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Nowy Worktree",
|
||||
"agentManager.dialog.tab.new": "Nowy",
|
||||
"agentManager.dialog.tab.import": "Importuj",
|
||||
"agentManager.dialog.namePlaceholder": "Nazwa Worktree (opcjonalnie)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Wpisz wiadomość (⌘Enter aby wysłać)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Wpisz wiadomość (Ctrl+Enter aby wysłać)",
|
||||
"agentManager.dialog.advancedOptions": "Opcje zaawansowane",
|
||||
"agentManager.dialog.branchName": "Nazwa brancha",
|
||||
"agentManager.dialog.branchNamePlaceholder": "generowana automatycznie",
|
||||
"agentManager.dialog.baseBranch": "Branch bazowy",
|
||||
"agentManager.dialog.searchBranches": "Szukaj branchy...",
|
||||
"agentManager.dialog.branchBadge.default": "domyślny",
|
||||
"agentManager.dialog.branchBadge.remote": "zdalny",
|
||||
"agentManager.dialog.versions": "Wersje",
|
||||
"agentManager.dialog.versionHint": "{{count}} worktree będą działać równolegle",
|
||||
"agentManager.dialog.compareModels": "Porównaj modele",
|
||||
"agentManager.dialog.compareModels.searchModels": "Szukaj modeli...",
|
||||
"agentManager.dialog.creating": "Tworzenie...",
|
||||
"agentManager.dialog.createWorkspace": "Utwórz Worktree",
|
||||
"agentManager.dialog.removeImage": "Usuń obraz",
|
||||
"agentManager.dialog.advanced": "Zaawansowane...",
|
||||
|
||||
"agentManager.diff.toggle": "Przełącz diff",
|
||||
"agentManager.diff.openFile": "Otwórz plik",
|
||||
"agentManager.apply.button": "Zastosuj lokalnie",
|
||||
"agentManager.apply.globalButton": "Zastosuj",
|
||||
"agentManager.apply.tooltip": "Zastosuj wybrane zmiany worktree na lokalnej gałęzi",
|
||||
"agentManager.apply.dialogTitle": "Zastosuj zmiany na lokalnej gałęzi",
|
||||
"agentManager.apply.confirm": "Zastosuj teraz",
|
||||
"agentManager.apply.retry": "Ponów zastosowanie",
|
||||
"agentManager.apply.previewTitle": "Zastosować te zmiany na lokalnej gałęzi?",
|
||||
"agentManager.apply.previewSummary": "{{files}} plików, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} z {{total}} plików wybranych",
|
||||
"agentManager.apply.selectAll": "Zaznacz wszystkie",
|
||||
"agentManager.apply.selectNone": "Odznacz wszystkie",
|
||||
"agentManager.apply.moreFiles": "+{{count}} więcej",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} więcej)",
|
||||
"agentManager.apply.checking": "Sprawdzanie...",
|
||||
"agentManager.apply.applying": "Stosowanie...",
|
||||
"agentManager.apply.success": "Zmiany zastosowane",
|
||||
"agentManager.apply.conflict": "Zastosowanie zawiera konflikty",
|
||||
"agentManager.apply.conflictToast": "{{count}} konfliktów w {{files}} plikach. Sprawdź szczegóły w Zastosuj.",
|
||||
"agentManager.apply.error": "Zastosowanie nie powiodło się",
|
||||
"agentManager.apply.conflictsTitle": "Konflikty",
|
||||
"agentManager.apply.unknownFile": "Nierozwiązany plik",
|
||||
"agentManager.apply.reason.index": "Plik lokalny różni się od oczekiwanej wersji",
|
||||
"agentManager.apply.reason.patch": "Łatka nie może być zastosowana czysto",
|
||||
"agentManager.apply.reason.contents": "Nie można odczytać zawartości bieżącego pliku lokalnego",
|
||||
"agentManager.apply.reason.unknown": "Wykryto konflikt",
|
||||
"agentManager.apply.inline.success": "Zastosowano",
|
||||
"agentManager.apply.inline.conflict": "Konflikty",
|
||||
"agentManager.apply.inline.error": "Błąd",
|
||||
"agentManager.shortcuts.toggleDiff": "Przełącz panel diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Szybkie przełączanie",
|
||||
"agentManager.shortcuts.jumpToItem": "Przejdź do elementu 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Wyślij wszystko do czatu",
|
||||
"agentManager.review.sendAllToChatWithCount": "Wyślij wszystko do czatu ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Skomentuj linię {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Edytuj komentarz do linii {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Zostaw komentarz...",
|
||||
"agentManager.review.commentAction": "Komentuj",
|
||||
"agentManager.review.sendToChat": "Wyślij do czatu",
|
||||
"agentManager.review.collapsedOnly": "{{count}} zwiniętych",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} zwiniętych, {{large}} dużych",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Wklej URL PR...",
|
||||
"agentManager.import.open": "Otwórz",
|
||||
"agentManager.import.branches": "Branche",
|
||||
"agentManager.import.selectBranch": "Wybierz branch...",
|
||||
"agentManager.import.loading": "Ładowanie...",
|
||||
"agentManager.import.loadingBranches": "Ładowanie branchy...",
|
||||
"agentManager.import.noMatchingBranches": "Brak pasujących branchy",
|
||||
"agentManager.import.noBranchesFound": "Nie znaleziono branchy.",
|
||||
"agentManager.import.noBranchesHint": "Wklej URL PR powyżej lub utwórz nowy Worktree.",
|
||||
"agentManager.import.failed": "Import nie powiódł się",
|
||||
|
||||
"question.summary": "{{n}} z {{total}} pytań",
|
||||
"common.review": "Przejrzyj",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Migracja ze starszej wersji",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Migracja starszej wersji",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Migruj ustawienia z poprzedniej instalacji Kilo Code, w tym klucze API dostawców i domyślny model.",
|
||||
"migration.welcome.title": "Witamy w nowym Kilo Code",
|
||||
"migration.welcome.detected": "Wykryliśmy ustawienia z poprzedniej instalacji Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Sesje czatu i historia nie mogą zostać zmigrowane — nowa wersja wykorzystuje inną architekturę.",
|
||||
"migration.welcome.canMigrate": "Następujące ustawienia mogą zostać zmigrowane do nowej wersji:",
|
||||
"migration.welcome.start": "Rozpocznij migrację",
|
||||
"migration.welcome.skip": "Pomiń migrację",
|
||||
"migration.steps.title": "Migruj swoje ustawienia",
|
||||
"migration.steps.subtitle":
|
||||
"Znaleźliśmy ustawienia z poprzedniej instalacji Kilo Code. Wybierz, co chcesz przenieść.",
|
||||
"migration.select.providers": "Klucze API dostawców",
|
||||
"migration.select.mcpServers": "Serwery MCP",
|
||||
"migration.select.customModes": "Niestandardowe tryby / Agenci",
|
||||
"migration.select.defaultModel": "Domyślny model",
|
||||
"migration.select.unsupported": "Nieobsługiwane w nowej wersji",
|
||||
"migration.select.nothingToMigrate": "W starszych ustawieniach nie znaleziono niczego do zmigrowania.",
|
||||
"migration.select.settings": "Ustawienia",
|
||||
"migration.select.autoApproval": "Automatyczne zatwierdzanie",
|
||||
"migration.select.autoApproval.commandRules": "Reguły poleceń",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Główny przełącznik oraz listy dozwolonych/zabronionych poleceń",
|
||||
"migration.select.autoApproval.readPermission": "Uprawnienia odczytu",
|
||||
"migration.select.autoApproval.readPermissionDesc":
|
||||
"Dostęp do odczytu plików wewnątrz i na zewnątrz obszaru roboczego",
|
||||
"migration.select.autoApproval.writePermission": "Uprawnienia zapisu",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Dostęp do zapisu i edycji plików",
|
||||
"migration.select.autoApproval.executePermission": "Uprawnienia wykonywania",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Wykonywanie poleceń terminala",
|
||||
"migration.select.autoApproval.mcpPermission": "Uprawnienia MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Korzystanie z narzędzi MCP",
|
||||
"migration.select.autoApproval.taskPermission": "Uprawnienia zadań",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Przełączanie trybów i tworzenie podzadań",
|
||||
"migration.select.language": "Język interfejsu",
|
||||
"migration.select.languageDesc": "Twoje preferencje językowe zostaną zastosowane w nowym rozszerzeniu",
|
||||
"migration.select.autocomplete": "Ustawienia autouzupełniania",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Preferencje automatycznego wyzwalania, skrótów klawiszowych i autouzupełniania na czacie",
|
||||
"migration.select.continue": "Kontynuuj",
|
||||
"migration.select.back": "Wstecz",
|
||||
"migration.progress.title": "Migrowanie Twoich ustawień…",
|
||||
"migration.progress.done": "Kontynuuj",
|
||||
"migration.complete.summary": "Pomyślnie zmigrowano {{success}} z {{total}} elementów.",
|
||||
"migration.complete.cleanup": "Usuń dane starszych ustawień",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Spowoduje to usunięcie starych ustawień z magazynu VS Code. Nie będzie można ponownie uruchomić tej migracji.",
|
||||
"migration.complete.done": "Gotowe",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -954,147 +954,60 @@ export const dict = {
|
||||
"settings.providers.notSet": "Не задано (использовать значение сервера по умолчанию)",
|
||||
"dialog.model.notSet": "Не задано",
|
||||
"profile.personalAccount": "Личный аккаунт",
|
||||
"agentManager.local": "локальный",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "СЕССИИ",
|
||||
"agentManager.notGitRepo": "Не является git-репозиторием",
|
||||
"agentManager.worktree.settings": "Настройки Worktree",
|
||||
"agentManager.worktree.new": "Новый Worktree",
|
||||
"agentManager.worktree.setupScript": "Скрипт настройки Worktree",
|
||||
"agentManager.worktree.delete": "Удалить Worktree",
|
||||
"agentManager.worktree.stale": "Устаревший",
|
||||
"agentManager.worktree.staleTooltip": "Отсутствует на диске или больше не отслеживается git worktree",
|
||||
"agentManager.worktree.removeStale": "Удалить устаревший Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "Двойной клик для переименования",
|
||||
"agentManager.worktree.versions": "{{count}} версий",
|
||||
"agentManager.worktree.advancedOptions": "Расширенные настройки Worktree",
|
||||
"agentManager.hoverCard.branch": "ВЕТКА",
|
||||
"agentManager.hoverCard.base": "Основа",
|
||||
"agentManager.hoverCard.sessions": "Сессии",
|
||||
"agentManager.hoverCard.files": "Файлы",
|
||||
"agentManager.hoverCard.changes": "Изменения",
|
||||
"agentManager.hoverCard.commits": "Коммиты",
|
||||
"agentManager.session.new": "Новая сессия",
|
||||
"agentManager.session.untitled": "Без названия",
|
||||
"agentManager.session.newSession": "Новая сессия",
|
||||
"agentManager.session.openInWorktree": "Открыть в Worktree",
|
||||
"agentManager.session.readonly": "Сессия только для чтения",
|
||||
"agentManager.session.noSessions": "Нет открытых сессий",
|
||||
"agentManager.tab.close": "Закрыть",
|
||||
"agentManager.tab.closeTab": "Закрыть вкладку",
|
||||
"agentManager.tab.terminal": "Терминал",
|
||||
"agentManager.tab.openTerminal": "Открыть терминал",
|
||||
"agentManager.setup.failed": "Не удалось настроить рабочее пространство",
|
||||
"agentManager.setup.settingUp": "Настройка рабочего пространства",
|
||||
"agentManager.shortcuts.title": "Сочетания клавиш",
|
||||
"agentManager.shortcuts.category.sidebar": "Боковая панель",
|
||||
"agentManager.shortcuts.category.tabs": "Вкладки",
|
||||
"agentManager.shortcuts.category.terminal": "Терминал",
|
||||
"agentManager.shortcuts.category.global": "Глобальные",
|
||||
"agentManager.shortcuts.previousItem": "Предыдущий элемент",
|
||||
"agentManager.shortcuts.nextItem": "Следующий элемент",
|
||||
"agentManager.shortcuts.newWorktree": "Новый Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "Расширенный Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "Удалить Worktree",
|
||||
"agentManager.shortcuts.previousTab": "Предыдущая вкладка",
|
||||
"agentManager.shortcuts.nextTab": "Следующая вкладка",
|
||||
"agentManager.shortcuts.newTab": "Новая вкладка",
|
||||
"agentManager.shortcuts.closeTab": "Закрыть вкладку",
|
||||
"agentManager.shortcuts.toggleTerminal": "Переключить терминал",
|
||||
"agentManager.shortcuts.focusPanel": "Фокус на панели",
|
||||
"agentManager.shortcuts.openAgentManager": "Открыть Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "Удалить Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "Удалить Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "? Это удалит Worktree с диска и отключит все сессии.",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "Отмена",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "Удалить",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/ru.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "Удалить устаревший Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "Удалить устаревший Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? Это удалит только привязку в Agent Manager и не затронет файлы на диске.",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "Отмена",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "Удалить устаревший Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Новый worktree",
|
||||
"agentManager.dialog.tab.new": "Новый",
|
||||
"agentManager.dialog.tab.import": "Импорт",
|
||||
"agentManager.dialog.namePlaceholder": "Имя Worktree (необязательно)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "Введите сообщение (⌘Enter для отправки)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "Введите сообщение (Ctrl+Enter для отправки)",
|
||||
"agentManager.dialog.advancedOptions": "Расширенные параметры",
|
||||
"agentManager.dialog.branchName": "Имя ветки",
|
||||
"agentManager.dialog.branchNamePlaceholder": "генерируется автоматически",
|
||||
"agentManager.dialog.baseBranch": "Базовая ветка",
|
||||
"agentManager.dialog.searchBranches": "Поиск веток...",
|
||||
"agentManager.dialog.branchBadge.default": "по умолчанию",
|
||||
"agentManager.dialog.branchBadge.remote": "удалённая",
|
||||
"agentManager.dialog.versions": "Версии",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktree будут выполняться параллельно",
|
||||
"agentManager.dialog.compareModels": "Сравнить модели",
|
||||
"agentManager.dialog.compareModels.searchModels": "Поиск моделей...",
|
||||
"agentManager.dialog.creating": "Создание...",
|
||||
"agentManager.dialog.createWorkspace": "Создать worktree",
|
||||
"agentManager.dialog.removeImage": "Удалить изображение",
|
||||
"agentManager.dialog.advanced": "Дополнительно...",
|
||||
|
||||
"agentManager.diff.toggle": "Переключить diff",
|
||||
"agentManager.diff.openFile": "Открыть файл",
|
||||
"agentManager.apply.button": "Применить локально",
|
||||
"agentManager.apply.globalButton": "Применить",
|
||||
"agentManager.apply.tooltip": "Применить изменения выбранного рабочего дерева к локальной ветке",
|
||||
"agentManager.apply.dialogTitle": "Применить изменения к локальной ветке",
|
||||
"agentManager.apply.confirm": "Применить сейчас",
|
||||
"agentManager.apply.retry": "Повторить применение",
|
||||
"agentManager.apply.previewTitle": "Применить эти изменения к локальной ветке?",
|
||||
"agentManager.apply.previewSummary": "{{files}} файлов, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "{{selected}} из {{total}} файлов выбрано",
|
||||
"agentManager.apply.selectAll": "Выбрать все",
|
||||
"agentManager.apply.selectNone": "Снять выделение",
|
||||
"agentManager.apply.moreFiles": "+{{count}} ещё",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} ещё)",
|
||||
"agentManager.apply.checking": "Проверка...",
|
||||
"agentManager.apply.applying": "Применение...",
|
||||
"agentManager.apply.success": "Изменения применены",
|
||||
"agentManager.apply.conflict": "Применение содержит конфликты",
|
||||
"agentManager.apply.conflictToast": "{{count}} конфликтов в {{files}} файлах. Проверьте детали в Применить.",
|
||||
"agentManager.apply.error": "Применение не удалось",
|
||||
"agentManager.apply.conflictsTitle": "Конфликты",
|
||||
"agentManager.apply.unknownFile": "Неразрешённый файл",
|
||||
"agentManager.apply.reason.index": "Локальный файл отличается от ожидаемой версии",
|
||||
"agentManager.apply.reason.patch": "Патч не может быть применён чисто",
|
||||
"agentManager.apply.reason.contents": "Не удаётся прочитать содержимое текущего локального файла",
|
||||
"agentManager.apply.reason.unknown": "Обнаружен конфликт",
|
||||
"agentManager.apply.inline.success": "Применено",
|
||||
"agentManager.apply.inline.conflict": "Конфликты",
|
||||
"agentManager.apply.inline.error": "Ошибка",
|
||||
"agentManager.shortcuts.toggleDiff": "Переключить панель diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "Быстрое переключение",
|
||||
"agentManager.shortcuts.jumpToItem": "Перейти к элементу 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "Отправить всё в чат",
|
||||
"agentManager.review.sendAllToChatWithCount": "Отправить всё в чат ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "Комментарий к строке {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "Редактировать комментарий к строке {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "Оставьте комментарий...",
|
||||
"agentManager.review.commentAction": "Комментировать",
|
||||
"agentManager.review.sendToChat": "Отправить в чат",
|
||||
"agentManager.review.collapsedOnly": "{{count}} свернуто",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} свернуто, {{large}} больших",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "Вставьте URL PR...",
|
||||
"agentManager.import.open": "Открыть",
|
||||
"agentManager.import.branches": "Ветки",
|
||||
"agentManager.import.selectBranch": "Выберите ветку...",
|
||||
"agentManager.import.loading": "Загрузка...",
|
||||
"agentManager.import.loadingBranches": "Загрузка веток...",
|
||||
"agentManager.import.noMatchingBranches": "Нет подходящих веток",
|
||||
"agentManager.import.noBranchesFound": "Ветки не найдены.",
|
||||
"agentManager.import.noBranchesHint": "Вставьте URL PR выше или создайте новый Worktree.",
|
||||
"agentManager.import.failed": "Ошибка импорта",
|
||||
|
||||
"question.summary": "{{n}} из {{total}} вопросов",
|
||||
"common.review": "Просмотр",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "Миграция с устаревшей версии",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "Миграция с устаревшей версии",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"Перенос настроек из предыдущей установки Kilo Code, включая API-ключи провайдеров и модель по умолчанию.",
|
||||
"migration.welcome.title": "Добро пожаловать в новый Kilo Code",
|
||||
"migration.welcome.detected": "Мы обнаружили настройки от предыдущей установки Kilo Code.",
|
||||
"migration.welcome.sessionsInfo":
|
||||
"Сессии чата и история не могут быть перенесены — новая версия использует другую архитектуру.",
|
||||
"migration.welcome.canMigrate": "В новую версию можно перенести следующие настройки:",
|
||||
"migration.welcome.start": "Начать миграцию",
|
||||
"migration.welcome.skip": "Пропустить миграцию",
|
||||
"migration.steps.title": "Перенос ваших настроек",
|
||||
"migration.steps.subtitle":
|
||||
"Мы нашли настройки от вашей предыдущей установки Kilo Code. Выберите, что нужно перенести.",
|
||||
"migration.select.providers": "API-ключи провайдеров",
|
||||
"migration.select.mcpServers": "Серверы MCP",
|
||||
"migration.select.customModes": "Пользовательские режимы / Агенты",
|
||||
"migration.select.defaultModel": "Модель по умолчанию",
|
||||
"migration.select.unsupported": "Не поддерживается в новой версии",
|
||||
"migration.select.nothingToMigrate": "В старых настройках не найдено данных для переноса.",
|
||||
"migration.select.settings": "Настройки",
|
||||
"migration.select.autoApproval": "Автоматическое подтверждение",
|
||||
"migration.select.autoApproval.commandRules": "Правила команд",
|
||||
"migration.select.autoApproval.commandRulesDesc": "Главный переключатель и списки разрешенных/запрещенных команд",
|
||||
"migration.select.autoApproval.readPermission": "Разрешение на чтение",
|
||||
"migration.select.autoApproval.readPermissionDesc": "Доступ к чтению файлов внутри и вне рабочей области",
|
||||
"migration.select.autoApproval.writePermission": "Разрешение на запись",
|
||||
"migration.select.autoApproval.writePermissionDesc": "Доступ к записи и редактированию файлов",
|
||||
"migration.select.autoApproval.executePermission": "Разрешение на выполнение",
|
||||
"migration.select.autoApproval.executePermissionDesc": "Выполнение команд в терминале",
|
||||
"migration.select.autoApproval.mcpPermission": "Разрешение MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "Использование инструментов MCP",
|
||||
"migration.select.autoApproval.taskPermission": "Разрешение на задачи",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "Переключение режимов и создание подзадач",
|
||||
"migration.select.language": "Язык интерфейса",
|
||||
"migration.select.languageDesc": "Ваши языковые настройки будут применены к новому расширению",
|
||||
"migration.select.autocomplete": "Настройки автодополнения",
|
||||
"migration.select.autocompleteDesc":
|
||||
"Параметры автоматического срабатывания, горячие клавиши и автодополнение в чате",
|
||||
"migration.select.continue": "Продолжить",
|
||||
"migration.select.back": "Назад",
|
||||
"migration.progress.title": "Перенос ваших настроек…",
|
||||
"migration.progress.done": "Продолжить",
|
||||
"migration.complete.summary": "Успешно перенесено: {{success}} из {{total}} элементов.",
|
||||
"migration.complete.cleanup": "Удалить данные старых настроек",
|
||||
"migration.complete.cleanupDescription":
|
||||
"Это удалит старые настройки из хранилища VS Code. Вы не сможете запустить эту миграцию повторно.",
|
||||
"migration.complete.done": "Готово",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -938,148 +938,58 @@ export const dict = {
|
||||
"settings.providers.notSet": "ไม่ได้ตั้งค่า (ใช้ค่าเริ่มต้นของเซิร์ฟเวอร์)",
|
||||
"dialog.model.notSet": "ไม่ได้ตั้งค่า",
|
||||
"profile.personalAccount": "บัญชีส่วนตัว",
|
||||
"agentManager.local": "ในเครื่อง",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "เซสชัน",
|
||||
"agentManager.notGitRepo": "ไม่ใช่ git repository",
|
||||
"agentManager.worktree.settings": "ตั้งค่า Worktree",
|
||||
"agentManager.worktree.new": "Worktree ใหม่",
|
||||
"agentManager.worktree.setupScript": "สคริปต์ตั้งค่า Worktree",
|
||||
"agentManager.worktree.delete": "ลบ Worktree",
|
||||
"agentManager.worktree.stale": "ล้าสมัย",
|
||||
"agentManager.worktree.staleTooltip": "ไม่พบบนดิสก์หรือไม่ได้ถูกติดตามโดย git worktree อีกต่อไป",
|
||||
"agentManager.worktree.removeStale": "ลบ Worktree ที่ล้าสมัย",
|
||||
"agentManager.worktree.doubleClickRename": "ดับเบิลคลิกเพื่อเปลี่ยนชื่อ",
|
||||
"agentManager.worktree.versions": "{{count}} เวอร์ชัน",
|
||||
"agentManager.worktree.advancedOptions": "ตัวเลือก Worktree ขั้นสูง",
|
||||
"agentManager.hoverCard.branch": "BRANCH",
|
||||
"agentManager.hoverCard.base": "ฐาน",
|
||||
"agentManager.hoverCard.sessions": "เซสชัน",
|
||||
"agentManager.hoverCard.files": "ไฟล์",
|
||||
"agentManager.hoverCard.changes": "การเปลี่ยนแปลง",
|
||||
"agentManager.hoverCard.commits": "คอมมิต",
|
||||
"agentManager.session.new": "เซสชันใหม่",
|
||||
"agentManager.session.untitled": "ไม่มีชื่อ",
|
||||
"agentManager.session.newSession": "เซสชันใหม่",
|
||||
"agentManager.session.openInWorktree": "เปิดใน Worktree",
|
||||
"agentManager.session.readonly": "เซสชันอ่านอย่างเดียว",
|
||||
"agentManager.session.noSessions": "ไม่มีเซสชันที่เปิดอยู่",
|
||||
"agentManager.tab.close": "ปิด",
|
||||
"agentManager.tab.closeTab": "ปิดแท็บ",
|
||||
"agentManager.tab.terminal": "เทอร์มินัล",
|
||||
"agentManager.tab.openTerminal": "เปิดเทอร์มินัล",
|
||||
"agentManager.setup.failed": "ตั้งค่า Workspace ล้มเหลว",
|
||||
"agentManager.setup.settingUp": "กำลังตั้งค่า Workspace",
|
||||
"agentManager.shortcuts.title": "ปุ่มลัดแป้นพิมพ์",
|
||||
"agentManager.shortcuts.category.sidebar": "แถบด้านข้าง",
|
||||
"agentManager.shortcuts.category.tabs": "แท็บ",
|
||||
"agentManager.shortcuts.category.terminal": "เทอร์มินัล",
|
||||
"agentManager.shortcuts.category.global": "ทั่วไป",
|
||||
"agentManager.shortcuts.previousItem": "รายการก่อนหน้า",
|
||||
"agentManager.shortcuts.nextItem": "รายการถัดไป",
|
||||
"agentManager.shortcuts.newWorktree": "Worktree ใหม่",
|
||||
"agentManager.shortcuts.advancedWorktree": "Worktree ขั้นสูง",
|
||||
"agentManager.shortcuts.deleteWorktree": "ลบ Worktree",
|
||||
"agentManager.shortcuts.previousTab": "แท็บก่อนหน้า",
|
||||
"agentManager.shortcuts.nextTab": "แท็บถัดไป",
|
||||
"agentManager.shortcuts.newTab": "แท็บใหม่",
|
||||
"agentManager.shortcuts.closeTab": "ปิดแท็บ",
|
||||
"agentManager.shortcuts.toggleTerminal": "สลับเทอร์มินัล",
|
||||
"agentManager.shortcuts.focusPanel": "โฟกัสแผง",
|
||||
"agentManager.shortcuts.openAgentManager": "เปิด Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "ลบ Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "ลบ Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost":
|
||||
"? การดำเนินการนี้จะลบ Worktree ออกจากดิสก์และยกเลิกการเชื่อมโยงเซสชันทั้งหมด",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "ยกเลิก",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "ลบ",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/th.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "ลบ Worktree ที่ล้าสมัย",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "ลบ Worktree ที่ล้าสมัย ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost":
|
||||
"? การดำเนินการนี้จะลบเฉพาะการแมปใน Agent Manager และจะไม่แตะไฟล์บนดิสก์",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "ยกเลิก",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "ลบ Worktree ที่ล้าสมัย",
|
||||
|
||||
"agentManager.dialog.openWorktree": "Worktree ใหม่",
|
||||
"agentManager.dialog.tab.new": "ใหม่",
|
||||
"agentManager.dialog.tab.import": "นำเข้า",
|
||||
"agentManager.dialog.namePlaceholder": "ชื่อ Worktree (ไม่บังคับ)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "พิมพ์ข้อความ (⌘Enter เพื่อส่ง)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "พิมพ์ข้อความ (Ctrl+Enter เพื่อส่ง)",
|
||||
"agentManager.dialog.advancedOptions": "ตัวเลือกขั้นสูง",
|
||||
"agentManager.dialog.branchName": "ชื่อ Branch",
|
||||
"agentManager.dialog.branchNamePlaceholder": "สร้างอัตโนมัติ",
|
||||
"agentManager.dialog.baseBranch": "Branch ฐาน",
|
||||
"agentManager.dialog.searchBranches": "ค้นหา Branch...",
|
||||
"agentManager.dialog.branchBadge.default": "ค่าเริ่มต้น",
|
||||
"agentManager.dialog.branchBadge.remote": "ระยะไกล",
|
||||
"agentManager.dialog.versions": "เวอร์ชัน",
|
||||
"agentManager.dialog.versionHint": "{{count}} Worktrees จะทำงานพร้อมกัน",
|
||||
"agentManager.dialog.compareModels": "เปรียบเทียบโมเดล",
|
||||
"agentManager.dialog.compareModels.searchModels": "ค้นหาโมเดล...",
|
||||
"agentManager.dialog.creating": "กำลังสร้าง...",
|
||||
"agentManager.dialog.createWorkspace": "สร้าง Worktree",
|
||||
"agentManager.dialog.removeImage": "ลบรูปภาพ",
|
||||
"agentManager.dialog.advanced": "ขั้นสูง...",
|
||||
|
||||
"agentManager.diff.toggle": "สลับ diff",
|
||||
"agentManager.diff.openFile": "เปิดไฟล์",
|
||||
"agentManager.apply.button": "นำไปใช้ในเครื่อง",
|
||||
"agentManager.apply.globalButton": "นำไปใช้",
|
||||
"agentManager.apply.tooltip": "นำการเปลี่ยนแปลงของ worktree ที่เลือกไปใช้กับสาขาในเครื่อง",
|
||||
"agentManager.apply.dialogTitle": "นำการเปลี่ยนแปลงไปใช้กับสาขาในเครื่อง",
|
||||
"agentManager.apply.confirm": "นำไปใช้ตอนนี้",
|
||||
"agentManager.apply.retry": "ลองนำไปใช้อีกครั้ง",
|
||||
"agentManager.apply.previewTitle": "นำการเปลี่ยนแปลงเหล่านี้ไปใช้กับสาขาในเครื่อง?",
|
||||
"agentManager.apply.previewSummary": "{{files}} ไฟล์, +{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "เลือก {{selected}} จาก {{total}} ไฟล์",
|
||||
"agentManager.apply.selectAll": "เลือกทั้งหมด",
|
||||
"agentManager.apply.selectNone": "ยกเลิกการเลือกทั้งหมด",
|
||||
"agentManager.apply.moreFiles": "+{{count}} เพิ่มเติม",
|
||||
"agentManager.apply.moreReasons": "{{reason}} (+{{count}} เพิ่มเติม)",
|
||||
"agentManager.apply.checking": "กำลังตรวจสอบ...",
|
||||
"agentManager.apply.applying": "กำลังนำไปใช้...",
|
||||
"agentManager.apply.success": "นำการเปลี่ยนแปลงไปใช้แล้ว",
|
||||
"agentManager.apply.conflict": "การนำไปใช้มีข้อขัดแย้ง",
|
||||
"agentManager.apply.conflictToast": "{{count}} ข้อขัดแย้งใน {{files}} ไฟล์ ตรวจสอบรายละเอียดในนำไปใช้",
|
||||
"agentManager.apply.error": "การนำไปใช้ล้มเหลว",
|
||||
"agentManager.apply.conflictsTitle": "ข้อขัดแย้ง",
|
||||
"agentManager.apply.unknownFile": "ไฟล์ที่ยังไม่ได้แก้ไข",
|
||||
"agentManager.apply.reason.index": "ไฟล์ในเครื่องแตกต่างจากเวอร์ชันที่คาดไว้",
|
||||
"agentManager.apply.reason.patch": "ไม่สามารถนำ patch ไปใช้ได้อย่างสะอาด",
|
||||
"agentManager.apply.reason.contents": "ไม่สามารถอ่านเนื้อหาของไฟล์ในเครื่องปัจจุบัน",
|
||||
"agentManager.apply.reason.unknown": "ตรวจพบข้อขัดแย้ง",
|
||||
"agentManager.apply.inline.success": "นำไปใช้แล้ว",
|
||||
"agentManager.apply.inline.conflict": "ข้อขัดแย้ง",
|
||||
"agentManager.apply.inline.error": "ล้มเหลว",
|
||||
"agentManager.shortcuts.toggleDiff": "สลับแผง diff",
|
||||
"agentManager.shortcuts.category.quickSwitch": "สลับด่วน",
|
||||
"agentManager.shortcuts.jumpToItem": "ข้ามไปยังรายการ 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "ส่งทั้งหมดไปยังแชท",
|
||||
"agentManager.review.sendAllToChatWithCount": "ส่งทั้งหมดไปยังแชท ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "แสดงความคิดเห็นที่บรรทัด {{line}}",
|
||||
"agentManager.review.editCommentOnLine": "แก้ไขความคิดเห็นที่บรรทัด {{line}}",
|
||||
"agentManager.review.commentPlaceholder": "แสดงความคิดเห็น...",
|
||||
"agentManager.review.commentAction": "แสดงความคิดเห็น",
|
||||
"agentManager.review.sendToChat": "ส่งไปยังแชท",
|
||||
"agentManager.review.collapsedOnly": "ยุบ {{count}} รายการ",
|
||||
"agentManager.review.collapsedWithLarge": "ยุบ {{collapsed}} รายการ, ขนาดใหญ่ {{large}} รายการ",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "วาง URL ของ PR...",
|
||||
"agentManager.import.open": "เปิด",
|
||||
"agentManager.import.branches": "Branches",
|
||||
"agentManager.import.selectBranch": "เลือก Branch...",
|
||||
"agentManager.import.loading": "กำลังโหลด...",
|
||||
"agentManager.import.loadingBranches": "กำลังโหลด Branches...",
|
||||
"agentManager.import.noMatchingBranches": "ไม่พบ Branch ที่ตรงกัน",
|
||||
"agentManager.import.noBranchesFound": "ไม่พบ Branch",
|
||||
"agentManager.import.noBranchesHint": "วาง URL ของ PR ด้านบนหรือสร้าง Worktree ใหม่",
|
||||
"agentManager.import.failed": "นำเข้าล้มเหลว",
|
||||
|
||||
"question.summary": "{{n}} จาก {{total}} คำถาม",
|
||||
"common.review": "ตรวจสอบ",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "ย้ายข้อมูลจากเวอร์ชันดั้งเดิม",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "การย้ายข้อมูลจากเวอร์ชันดั้งเดิม",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"ย้ายการตั้งค่าจากการติดตั้ง Kilo Code ก่อนหน้านี้ รวมถึงคีย์ API ของผู้ให้บริการและโมเดลเริ่มต้น",
|
||||
"migration.welcome.title": "ยินดีต้อนรับสู่ Kilo Code โฉมใหม่",
|
||||
"migration.welcome.detected": "เราตรวจพบการตั้งค่าจากการติดตั้ง Kilo Code ก่อนหน้านี้",
|
||||
"migration.welcome.sessionsInfo": "ไม่สามารถย้ายเซสชันการแชทและประวัติได้ — เวอร์ชันใหม่ใช้สถาปัตยกรรมที่แตกต่างกัน",
|
||||
"migration.welcome.canMigrate": "การตั้งค่าต่อไปนี้สามารถย้ายไปยังเวอร์ชันใหม่ได้:",
|
||||
"migration.welcome.start": "เริ่มการย้ายข้อมูล",
|
||||
"migration.welcome.skip": "ข้ามการย้ายข้อมูล",
|
||||
"migration.steps.title": "ย้ายการตั้งค่าของคุณ",
|
||||
"migration.steps.subtitle": "เราพบการตั้งค่าจากการติดตั้ง Kilo Code ก่อนหน้านี้ของคุณ เลือกสิ่งที่จะนำเข้ามาด้วย",
|
||||
"migration.select.providers": "คีย์ API ของผู้ให้บริการ",
|
||||
"migration.select.mcpServers": "เซิร์ฟเวอร์ MCP",
|
||||
"migration.select.customModes": "โหมดกำหนดเอง / Agents",
|
||||
"migration.select.defaultModel": "โมเดลเริ่มต้น",
|
||||
"migration.select.unsupported": "ไม่รองรับในเวอร์ชันใหม่",
|
||||
"migration.select.nothingToMigrate": "ไม่พบสิ่งที่จะย้ายในการตั้งค่าดั้งเดิม",
|
||||
"migration.select.settings": "การตั้งค่า",
|
||||
"migration.select.autoApproval": "การอนุมัติอัตโนมัติ",
|
||||
"migration.select.autoApproval.commandRules": "กฎคำสั่ง",
|
||||
"migration.select.autoApproval.commandRulesDesc": "สวิตช์หลักและรายการคำสั่งที่อนุญาต/ปฏิเสธ",
|
||||
"migration.select.autoApproval.readPermission": "สิทธิ์การอ่าน",
|
||||
"migration.select.autoApproval.readPermissionDesc": "การเข้าถึงการอ่านไฟล์ภายในและภายนอกเวิร์กสเปซ",
|
||||
"migration.select.autoApproval.writePermission": "สิทธิ์การเขียน",
|
||||
"migration.select.autoApproval.writePermissionDesc": "การเข้าถึงการเขียนและแก้ไขไฟล์",
|
||||
"migration.select.autoApproval.executePermission": "สิทธิ์การดำเนินการ",
|
||||
"migration.select.autoApproval.executePermissionDesc": "การเรียกใช้งานคำสั่ง Terminal",
|
||||
"migration.select.autoApproval.mcpPermission": "สิทธิ์ MCP",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "การใช้งานเครื่องมือ MCP",
|
||||
"migration.select.autoApproval.taskPermission": "สิทธิ์งาน",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "การสลับโหมดและการสร้างงานย่อย",
|
||||
"migration.select.language": "ภาษา UI",
|
||||
"migration.select.languageDesc": "การตั้งค่าภาษาของคุณจะถูกนำไปใช้กับส่วนขยายใหม่",
|
||||
"migration.select.autocomplete": "การตั้งค่าเติมข้อความอัตโนมัติ",
|
||||
"migration.select.autocompleteDesc":
|
||||
"การเรียกใช้อัตโนมัติ, การผูกแป้นพิมพ์ และการตั้งค่าการเติมข้อความอัตโนมัติในการแชท",
|
||||
"migration.select.continue": "ดำเนินการต่อ",
|
||||
"migration.select.back": "ย้อนกลับ",
|
||||
"migration.progress.title": "กำลังย้ายการตั้งค่าของคุณ…",
|
||||
"migration.progress.done": "ดำเนินการต่อ",
|
||||
"migration.complete.summary": "ย้ายรายการสำเร็จ {{success}} จาก {{total}} รายการ",
|
||||
"migration.complete.cleanup": "ลบข้อมูลการตั้งค่าดั้งเดิม",
|
||||
"migration.complete.cleanupDescription":
|
||||
"การดำเนินการนี้จะลบการตั้งค่าเก่าออกจากพื้นที่เก็บข้อมูลของ VS Code คุณจะไม่สามารถเรียกใช้การย้ายข้อมูลนี้ซ้ำได้อีก",
|
||||
"migration.complete.done": "เสร็จสิ้น",
|
||||
// legacy-migration end
|
||||
}
|
||||
|
||||
@@ -941,146 +941,56 @@ export const dict = {
|
||||
"settings.providers.notSet": "未设置(使用服务器默认值)",
|
||||
"dialog.model.notSet": "未设置",
|
||||
"profile.personalAccount": "个人账户",
|
||||
"agentManager.local": "本地",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "会话",
|
||||
"agentManager.notGitRepo": "不是 git 仓库",
|
||||
"agentManager.worktree.settings": "Worktree 设置",
|
||||
"agentManager.worktree.new": "新建 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 设置脚本",
|
||||
"agentManager.worktree.delete": "删除 Worktree",
|
||||
"agentManager.worktree.stale": "已失效",
|
||||
"agentManager.worktree.staleTooltip": "在磁盘上缺失,或不再由 git worktree 跟踪",
|
||||
"agentManager.worktree.removeStale": "移除失效 Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "双击重命名",
|
||||
"agentManager.worktree.versions": "{{count}} 个版本",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 高级选项",
|
||||
"agentManager.hoverCard.branch": "分支",
|
||||
"agentManager.hoverCard.base": "基础",
|
||||
"agentManager.hoverCard.sessions": "会话",
|
||||
"agentManager.hoverCard.files": "文件",
|
||||
"agentManager.hoverCard.changes": "更改",
|
||||
"agentManager.hoverCard.commits": "提交",
|
||||
"agentManager.session.new": "新建会话",
|
||||
"agentManager.session.untitled": "无标题",
|
||||
"agentManager.session.newSession": "新建会话",
|
||||
"agentManager.session.openInWorktree": "在 Worktree 中打开",
|
||||
"agentManager.session.readonly": "只读会话",
|
||||
"agentManager.session.noSessions": "没有打开的会话",
|
||||
"agentManager.tab.close": "关闭",
|
||||
"agentManager.tab.closeTab": "关闭标签页",
|
||||
"agentManager.tab.terminal": "终端",
|
||||
"agentManager.tab.openTerminal": "打开终端",
|
||||
"agentManager.setup.failed": "工作区设置失败",
|
||||
"agentManager.setup.settingUp": "正在设置工作区",
|
||||
"agentManager.shortcuts.title": "键盘快捷键",
|
||||
"agentManager.shortcuts.category.sidebar": "侧边栏",
|
||||
"agentManager.shortcuts.category.tabs": "标签页",
|
||||
"agentManager.shortcuts.category.terminal": "终端",
|
||||
"agentManager.shortcuts.category.global": "全局",
|
||||
"agentManager.shortcuts.previousItem": "上一项",
|
||||
"agentManager.shortcuts.nextItem": "下一项",
|
||||
"agentManager.shortcuts.newWorktree": "新建 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "高级 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "删除 Worktree",
|
||||
"agentManager.shortcuts.previousTab": "上一个标签页",
|
||||
"agentManager.shortcuts.nextTab": "下一个标签页",
|
||||
"agentManager.shortcuts.newTab": "新建标签页",
|
||||
"agentManager.shortcuts.closeTab": "关闭标签页",
|
||||
"agentManager.shortcuts.toggleTerminal": "切换终端",
|
||||
"agentManager.shortcuts.focusPanel": "聚焦面板",
|
||||
"agentManager.shortcuts.openAgentManager": "打开 Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "删除 Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "删除 Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "?这将从磁盘中移除 Worktree 并取消所有会话的关联。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "取消",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "删除",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/zh.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "移除失效 Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "移除失效 Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost": "?这只会移除 Agent Manager 映射,不会触碰磁盘上的文件。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "取消",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新建工作树",
|
||||
"agentManager.dialog.tab.new": "新建",
|
||||
"agentManager.dialog.tab.import": "导入",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 名称(可选)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "输入消息(⌘Enter 发送)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "输入消息(Ctrl+Enter 发送)",
|
||||
"agentManager.dialog.advancedOptions": "高级选项",
|
||||
"agentManager.dialog.branchName": "分支名称",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自动生成",
|
||||
"agentManager.dialog.baseBranch": "基础分支",
|
||||
"agentManager.dialog.searchBranches": "搜索分支...",
|
||||
"agentManager.dialog.branchBadge.default": "默认",
|
||||
"agentManager.dialog.branchBadge.remote": "远程",
|
||||
"agentManager.dialog.versions": "版本",
|
||||
"agentManager.dialog.versionHint": "{{count}} 个 Worktree 将并行运行",
|
||||
"agentManager.dialog.compareModels": "比较模型",
|
||||
"agentManager.dialog.compareModels.searchModels": "搜索模型...",
|
||||
"agentManager.dialog.creating": "创建中...",
|
||||
"agentManager.dialog.createWorkspace": "创建工作树",
|
||||
"agentManager.dialog.removeImage": "移除图片",
|
||||
"agentManager.dialog.advanced": "高级...",
|
||||
|
||||
"agentManager.diff.toggle": "切换差异",
|
||||
"agentManager.diff.openFile": "打开文件",
|
||||
"agentManager.apply.button": "应用到本地",
|
||||
"agentManager.apply.globalButton": "应用",
|
||||
"agentManager.apply.tooltip": "将所选工作树的更改应用到本地分支",
|
||||
"agentManager.apply.dialogTitle": "将更改应用到本地分支",
|
||||
"agentManager.apply.confirm": "立即应用",
|
||||
"agentManager.apply.retry": "重试应用",
|
||||
"agentManager.apply.previewTitle": "将这些更改应用到本地分支?",
|
||||
"agentManager.apply.previewSummary": "{{files}} 个文件,+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "已选择 {{selected}}/{{total}} 个文件",
|
||||
"agentManager.apply.selectAll": "全选",
|
||||
"agentManager.apply.selectNone": "取消全选",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 更多",
|
||||
"agentManager.apply.moreReasons": "{{reason}}(+{{count}} 更多)",
|
||||
"agentManager.apply.checking": "检查中...",
|
||||
"agentManager.apply.applying": "应用中...",
|
||||
"agentManager.apply.success": "更改已应用",
|
||||
"agentManager.apply.conflict": "应用存在冲突",
|
||||
"agentManager.apply.conflictToast": "{{files}} 个文件中有 {{count}} 个冲突。在应用中查看详情。",
|
||||
"agentManager.apply.error": "应用失败",
|
||||
"agentManager.apply.conflictsTitle": "冲突",
|
||||
"agentManager.apply.unknownFile": "未解决的文件",
|
||||
"agentManager.apply.reason.index": "本地文件与预期版本不同",
|
||||
"agentManager.apply.reason.patch": "补丁无法干净地应用",
|
||||
"agentManager.apply.reason.contents": "无法读取当前本地文件内容",
|
||||
"agentManager.apply.reason.unknown": "检测到冲突",
|
||||
"agentManager.apply.inline.success": "已应用",
|
||||
"agentManager.apply.inline.conflict": "冲突",
|
||||
"agentManager.apply.inline.error": "失败",
|
||||
"agentManager.shortcuts.toggleDiff": "切换差异面板",
|
||||
"agentManager.shortcuts.category.quickSwitch": "快速切换",
|
||||
"agentManager.shortcuts.jumpToItem": "跳转到项目 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "全部发送到聊天",
|
||||
"agentManager.review.sendAllToChatWithCount": "全部发送到聊天 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "在第 {{line}} 行评论",
|
||||
"agentManager.review.editCommentOnLine": "编辑第 {{line}} 行评论",
|
||||
"agentManager.review.commentPlaceholder": "留下评论...",
|
||||
"agentManager.review.commentAction": "评论",
|
||||
"agentManager.review.sendToChat": "发送到聊天",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 个已折叠",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 个已折叠,{{large}} 个过大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "粘贴 PR URL...",
|
||||
"agentManager.import.open": "打开",
|
||||
"agentManager.import.branches": "分支",
|
||||
"agentManager.import.selectBranch": "选择分支...",
|
||||
"agentManager.import.loading": "加载中...",
|
||||
"agentManager.import.loadingBranches": "正在加载分支...",
|
||||
"agentManager.import.noMatchingBranches": "没有匹配的分支",
|
||||
"agentManager.import.noBranchesFound": "未找到分支。",
|
||||
"agentManager.import.noBranchesHint": "在上方粘贴 PR URL 或创建新的 Worktree。",
|
||||
"agentManager.import.failed": "导入失败",
|
||||
|
||||
"question.summary": "第 {{n}} / {{total}} 个问题",
|
||||
"common.review": "审查",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "从旧版本迁移",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "旧版本迁移",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"从之前安装的 Kilo Code 迁移设置,包括提供商 API 密钥和默认模型。",
|
||||
"migration.welcome.title": "欢迎使用全新 Kilo Code",
|
||||
"migration.welcome.detected": "我们检测到了来自之前安装的 Kilo Code 的设置。",
|
||||
"migration.welcome.sessionsInfo": "聊天会话和历史记录无法迁移 — 新版本使用了不同的架构。",
|
||||
"migration.welcome.canMigrate": "以下设置可以迁移到新版本:",
|
||||
"migration.welcome.start": "开始迁移",
|
||||
"migration.welcome.skip": "跳过迁移",
|
||||
"migration.steps.title": "迁移您的设置",
|
||||
"migration.steps.subtitle": "我们发现了您之前 Kilo Code 安装的设置。请选择要引入的内容。",
|
||||
"migration.select.providers": "提供商 API 密钥",
|
||||
"migration.select.mcpServers": "MCP 服务器",
|
||||
"migration.select.customModes": "自定义模式 / 智能体",
|
||||
"migration.select.defaultModel": "默认模型",
|
||||
"migration.select.unsupported": "新版本不支持",
|
||||
"migration.select.nothingToMigrate": "在旧版设置中未找到要迁移的内容。",
|
||||
"migration.select.settings": "设置",
|
||||
"migration.select.autoApproval": "自动批准",
|
||||
"migration.select.autoApproval.commandRules": "命令规则",
|
||||
"migration.select.autoApproval.commandRulesDesc": "主开关以及允许/拒绝的命令列表",
|
||||
"migration.select.autoApproval.readPermission": "读取权限",
|
||||
"migration.select.autoApproval.readPermissionDesc": "工作区内外文件读取访问权限",
|
||||
"migration.select.autoApproval.writePermission": "写入权限",
|
||||
"migration.select.autoApproval.writePermissionDesc": "文件写入和编辑访问权限",
|
||||
"migration.select.autoApproval.executePermission": "执行权限",
|
||||
"migration.select.autoApproval.executePermissionDesc": "终端命令执行",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP 权限",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "MCP 工具使用",
|
||||
"migration.select.autoApproval.taskPermission": "任务权限",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "模式切换和子任务创建",
|
||||
"migration.select.language": "UI 语言",
|
||||
"migration.select.languageDesc": "您的语言偏好将应用于新的扩展",
|
||||
"migration.select.autocomplete": "自动补全设置",
|
||||
"migration.select.autocompleteDesc": "自动触发、键绑定和聊天自动补全偏好设置",
|
||||
"migration.select.continue": "继续",
|
||||
"migration.select.back": "返回",
|
||||
"migration.progress.title": "正在迁移您的设置…",
|
||||
"migration.progress.done": "继续",
|
||||
"migration.complete.summary": "{{total}} 项中的 {{success}} 项已成功迁移。",
|
||||
"migration.complete.cleanup": "移除旧版设置数据",
|
||||
"migration.complete.cleanupDescription": "这将从 VS Code 存储中移除旧设置。您将无法再次运行此迁移。",
|
||||
"migration.complete.done": "完成",
|
||||
// legacy-migration end
|
||||
} satisfies Partial<Record<Keys, string>>
|
||||
|
||||
@@ -966,146 +966,56 @@ export const dict = {
|
||||
"settings.providers.notSet": "未設定(使用伺服器預設值)",
|
||||
"dialog.model.notSet": "未設定",
|
||||
"profile.personalAccount": "個人帳戶",
|
||||
"agentManager.local": "本機",
|
||||
"agentManager.section.worktrees": "WORKTREES",
|
||||
"agentManager.section.sessions": "工作階段",
|
||||
"agentManager.notGitRepo": "不是 git 儲存庫",
|
||||
"agentManager.worktree.settings": "Worktree 設定",
|
||||
"agentManager.worktree.new": "新建 Worktree",
|
||||
"agentManager.worktree.setupScript": "Worktree 設定指令碼",
|
||||
"agentManager.worktree.delete": "刪除 Worktree",
|
||||
"agentManager.worktree.stale": "已失效",
|
||||
"agentManager.worktree.staleTooltip": "磁碟上不存在,或不再由 git worktree 追蹤",
|
||||
"agentManager.worktree.removeStale": "移除失效 Worktree",
|
||||
"agentManager.worktree.doubleClickRename": "按兩下以重新命名",
|
||||
"agentManager.worktree.versions": "{{count}} 個版本",
|
||||
"agentManager.worktree.advancedOptions": "Worktree 進階選項",
|
||||
"agentManager.hoverCard.branch": "分支",
|
||||
"agentManager.hoverCard.base": "基底",
|
||||
"agentManager.hoverCard.sessions": "工作階段",
|
||||
"agentManager.hoverCard.files": "檔案",
|
||||
"agentManager.hoverCard.changes": "變更",
|
||||
"agentManager.hoverCard.commits": "提交",
|
||||
"agentManager.session.new": "新建工作階段",
|
||||
"agentManager.session.untitled": "未命名",
|
||||
"agentManager.session.newSession": "新建工作階段",
|
||||
"agentManager.session.openInWorktree": "在 Worktree 中開啟",
|
||||
"agentManager.session.readonly": "唯讀工作階段",
|
||||
"agentManager.session.noSessions": "沒有開啟的工作階段",
|
||||
"agentManager.tab.close": "關閉",
|
||||
"agentManager.tab.closeTab": "關閉分頁",
|
||||
"agentManager.tab.terminal": "終端機",
|
||||
"agentManager.tab.openTerminal": "開啟終端機",
|
||||
"agentManager.setup.failed": "工作區設定失敗",
|
||||
"agentManager.setup.settingUp": "正在設定工作區",
|
||||
"agentManager.shortcuts.title": "鍵盤快捷鍵",
|
||||
"agentManager.shortcuts.category.sidebar": "側邊欄",
|
||||
"agentManager.shortcuts.category.tabs": "分頁",
|
||||
"agentManager.shortcuts.category.terminal": "終端機",
|
||||
"agentManager.shortcuts.category.global": "全域",
|
||||
"agentManager.shortcuts.previousItem": "上一個項目",
|
||||
"agentManager.shortcuts.nextItem": "下一個項目",
|
||||
"agentManager.shortcuts.newWorktree": "新建 Worktree",
|
||||
"agentManager.shortcuts.advancedWorktree": "進階 Worktree",
|
||||
"agentManager.shortcuts.deleteWorktree": "刪除 Worktree",
|
||||
"agentManager.shortcuts.previousTab": "上一個分頁",
|
||||
"agentManager.shortcuts.nextTab": "下一個分頁",
|
||||
"agentManager.shortcuts.newTab": "新建分頁",
|
||||
"agentManager.shortcuts.closeTab": "關閉分頁",
|
||||
"agentManager.shortcuts.toggleTerminal": "切換終端機",
|
||||
"agentManager.shortcuts.focusPanel": "聚焦面板",
|
||||
"agentManager.shortcuts.openAgentManager": "開啟 Agent Manager",
|
||||
"agentManager.dialog.deleteWorktree.title": "刪除 Worktree",
|
||||
"agentManager.dialog.deleteWorktree.messagePre": "刪除 Worktree ",
|
||||
"agentManager.dialog.deleteWorktree.messagePost": "?這將從磁碟中移除 Worktree 並取消所有工作階段的關聯。",
|
||||
"agentManager.dialog.deleteWorktree.cancel": "取消",
|
||||
"agentManager.dialog.deleteWorktree.confirm": "刪除",
|
||||
// Agent Manager strings live in webview-ui/agent-manager/i18n/zht.ts
|
||||
|
||||
"agentManager.dialog.removeStaleWorktree.title": "移除失效 Worktree",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePre": "移除失效 Worktree ",
|
||||
"agentManager.dialog.removeStaleWorktree.messagePost": "?這只會移除 Agent Manager 對應,不會變更磁碟上的檔案。",
|
||||
"agentManager.dialog.removeStaleWorktree.cancel": "取消",
|
||||
"agentManager.dialog.removeStaleWorktree.confirm": "移除失效 Worktree",
|
||||
|
||||
"agentManager.dialog.openWorktree": "新建工作樹",
|
||||
"agentManager.dialog.tab.new": "新建",
|
||||
"agentManager.dialog.tab.import": "匯入",
|
||||
"agentManager.dialog.namePlaceholder": "Worktree 名稱(選填)",
|
||||
"agentManager.dialog.promptPlaceholder.mac": "輸入訊息(⌘Enter 傳送)",
|
||||
"agentManager.dialog.promptPlaceholder.other": "輸入訊息(Ctrl+Enter 傳送)",
|
||||
"agentManager.dialog.advancedOptions": "進階選項",
|
||||
"agentManager.dialog.branchName": "分支名稱",
|
||||
"agentManager.dialog.branchNamePlaceholder": "自動產生",
|
||||
"agentManager.dialog.baseBranch": "基底分支",
|
||||
"agentManager.dialog.searchBranches": "搜尋分支...",
|
||||
"agentManager.dialog.branchBadge.default": "預設",
|
||||
"agentManager.dialog.branchBadge.remote": "遠端",
|
||||
"agentManager.dialog.versions": "版本",
|
||||
"agentManager.dialog.versionHint": "{{count}} 個 Worktree 將並行執行",
|
||||
"agentManager.dialog.compareModels": "比較模型",
|
||||
"agentManager.dialog.compareModels.searchModels": "搜尋模型...",
|
||||
"agentManager.dialog.creating": "建立中...",
|
||||
"agentManager.dialog.createWorkspace": "建立工作樹",
|
||||
"agentManager.dialog.removeImage": "移除圖片",
|
||||
"agentManager.dialog.advanced": "進階...",
|
||||
|
||||
"agentManager.diff.toggle": "切換差異",
|
||||
"agentManager.diff.openFile": "開啟檔案",
|
||||
"agentManager.apply.button": "套用到本地",
|
||||
"agentManager.apply.globalButton": "套用",
|
||||
"agentManager.apply.tooltip": "將所選工作樹的變更套用到本地分支",
|
||||
"agentManager.apply.dialogTitle": "將變更套用到本地分支",
|
||||
"agentManager.apply.confirm": "立即套用",
|
||||
"agentManager.apply.retry": "重試套用",
|
||||
"agentManager.apply.previewTitle": "將這些變更套用到本地分支?",
|
||||
"agentManager.apply.previewSummary": "{{files}} 個檔案,+{{additions}} -{{deletions}}",
|
||||
"agentManager.apply.selectionSummary": "已選取 {{selected}}/{{total}} 個檔案",
|
||||
"agentManager.apply.selectAll": "全選",
|
||||
"agentManager.apply.selectNone": "取消全選",
|
||||
"agentManager.apply.moreFiles": "+{{count}} 更多",
|
||||
"agentManager.apply.moreReasons": "{{reason}}(+{{count}} 更多)",
|
||||
"agentManager.apply.checking": "檢查中...",
|
||||
"agentManager.apply.applying": "套用中...",
|
||||
"agentManager.apply.success": "變更已套用",
|
||||
"agentManager.apply.conflict": "套用存在衝突",
|
||||
"agentManager.apply.conflictToast": "{{files}} 個檔案中有 {{count}} 個衝突。在套用中查看詳情。",
|
||||
"agentManager.apply.error": "套用失敗",
|
||||
"agentManager.apply.conflictsTitle": "衝突",
|
||||
"agentManager.apply.unknownFile": "未解決的檔案",
|
||||
"agentManager.apply.reason.index": "本地檔案與預期版本不同",
|
||||
"agentManager.apply.reason.patch": "修補程式無法乾淨地套用",
|
||||
"agentManager.apply.reason.contents": "無法讀取目前本地檔案內容",
|
||||
"agentManager.apply.reason.unknown": "偵測到衝突",
|
||||
"agentManager.apply.inline.success": "已套用",
|
||||
"agentManager.apply.inline.conflict": "衝突",
|
||||
"agentManager.apply.inline.error": "失敗",
|
||||
"agentManager.shortcuts.toggleDiff": "切換差異面板",
|
||||
"agentManager.shortcuts.category.quickSwitch": "快速切換",
|
||||
"agentManager.shortcuts.jumpToItem": "跳至項目 1\u20139",
|
||||
"agentManager.review.sendAllToChat": "全部傳送到聊天",
|
||||
"agentManager.review.sendAllToChatWithCount": "全部傳送到聊天 ({{count}})",
|
||||
"agentManager.review.sendAllShortcut.mac": "⌘Enter",
|
||||
"agentManager.review.sendAllShortcut.other": "Ctrl+Enter",
|
||||
"agentManager.review.commentOnLine": "在第 {{line}} 行留言",
|
||||
"agentManager.review.editCommentOnLine": "編輯第 {{line}} 行留言",
|
||||
"agentManager.review.commentPlaceholder": "留下留言...",
|
||||
"agentManager.review.commentAction": "留言",
|
||||
"agentManager.review.sendToChat": "傳送到聊天",
|
||||
"agentManager.review.collapsedOnly": "{{count}} 個已摺疊",
|
||||
"agentManager.review.collapsedWithLarge": "{{collapsed}} 個已摺疊,{{large}} 個過大",
|
||||
|
||||
"agentManager.import.pullRequest": "Pull Request",
|
||||
"agentManager.import.pastePrUrl": "貼上 PR URL...",
|
||||
"agentManager.import.open": "開啟",
|
||||
"agentManager.import.branches": "分支",
|
||||
"agentManager.import.selectBranch": "選擇分支...",
|
||||
"agentManager.import.loading": "載入中...",
|
||||
"agentManager.import.loadingBranches": "正在載入分支...",
|
||||
"agentManager.import.noMatchingBranches": "沒有符合的分支",
|
||||
"agentManager.import.noBranchesFound": "找不到分支。",
|
||||
"agentManager.import.noBranchesHint": "在上方貼上 PR URL 或建立新的 Worktree。",
|
||||
"agentManager.import.failed": "匯入失敗",
|
||||
|
||||
"question.summary": "第 {{n}} / {{total}} 個問題",
|
||||
"common.review": "審查",
|
||||
|
||||
// legacy-migration start
|
||||
"settings.legacyMigration.link": "從舊版轉移",
|
||||
"settings.aboutKiloCode.legacyMigration.title": "舊版轉移",
|
||||
"settings.aboutKiloCode.legacyMigration.description":
|
||||
"從先前安裝的 Kilo Code 轉移設定,包含供應商 API 金鑰與預設模型。",
|
||||
"migration.welcome.title": "歡迎使用全新的 Kilo Code",
|
||||
"migration.welcome.detected": "我們偵測到先前安裝的 Kilo Code 設定。",
|
||||
"migration.welcome.sessionsInfo": "聊天對話與歷史紀錄無法轉移 — 新版本使用了不同的架構。",
|
||||
"migration.welcome.canMigrate": "下列設定可以轉移至新版本:",
|
||||
"migration.welcome.start": "開始轉移",
|
||||
"migration.welcome.skip": "略過轉移",
|
||||
"migration.steps.title": "轉移您的設定",
|
||||
"migration.steps.subtitle": "我們找到了您先前 Kilo Code 安裝的設定。請選擇要保留的項目。",
|
||||
"migration.select.providers": "供應商 API 金鑰",
|
||||
"migration.select.mcpServers": "MCP 伺服器",
|
||||
"migration.select.customModes": "自訂模式 / 代理",
|
||||
"migration.select.defaultModel": "預設模型",
|
||||
"migration.select.unsupported": "新版本不支援",
|
||||
"migration.select.nothingToMigrate": "在舊版設定中找不到可轉移的項目。",
|
||||
"migration.select.settings": "設定",
|
||||
"migration.select.autoApproval": "自動核准",
|
||||
"migration.select.autoApproval.commandRules": "指令規則",
|
||||
"migration.select.autoApproval.commandRulesDesc": "主要開關與允許/拒絕的指令清單",
|
||||
"migration.select.autoApproval.readPermission": "讀取權限",
|
||||
"migration.select.autoApproval.readPermissionDesc": "工作區內外的檔案讀取存取權",
|
||||
"migration.select.autoApproval.writePermission": "寫入權限",
|
||||
"migration.select.autoApproval.writePermissionDesc": "檔案寫入與編輯存取權",
|
||||
"migration.select.autoApproval.executePermission": "執行權限",
|
||||
"migration.select.autoApproval.executePermissionDesc": "終端機指令執行",
|
||||
"migration.select.autoApproval.mcpPermission": "MCP 權限",
|
||||
"migration.select.autoApproval.mcpPermissionDesc": "MCP 工具使用",
|
||||
"migration.select.autoApproval.taskPermission": "任務權限",
|
||||
"migration.select.autoApproval.taskPermissionDesc": "模式切換與子任務建立",
|
||||
"migration.select.language": "介面語言",
|
||||
"migration.select.languageDesc": "您的語言偏好將會套用至新擴充功能",
|
||||
"migration.select.autocomplete": "自動完成設定",
|
||||
"migration.select.autocompleteDesc": "自動觸發、按鍵綁定與聊天自動完成偏好設定",
|
||||
"migration.select.continue": "繼續",
|
||||
"migration.select.back": "返回",
|
||||
"migration.progress.title": "正在轉移您的設定…",
|
||||
"migration.progress.done": "繼續",
|
||||
"migration.complete.summary": "已成功轉移 {{total}} 個項目中的 {{success}} 個。",
|
||||
"migration.complete.cleanup": "移除舊版設定資料",
|
||||
"migration.complete.cleanupDescription": "這將從 VS Code 儲存空間移除舊的設定。您將無法重新執行此轉移程序。",
|
||||
"migration.complete.done": "完成",
|
||||
// legacy-migration end
|
||||
} satisfies Partial<Record<Keys, string>>
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
/** @jsxImportSource solid-js */
|
||||
/**
|
||||
* StoryProviders — wraps composite stories with all required contexts.
|
||||
*
|
||||
* Instead of instantiating the full VSCodeProvider → ServerProvider → SessionProvider
|
||||
* chain (which requires a real extension host / SSE connection), we provide mock
|
||||
* context values directly.
|
||||
*/
|
||||
|
||||
import { createSignal, type ParentComponent } from "solid-js"
|
||||
import { DataProvider } from "@kilocode/kilo-ui/context/data"
|
||||
import { DiffComponentProvider } from "@kilocode/kilo-ui/context/diff"
|
||||
import { CodeComponentProvider } from "@kilocode/kilo-ui/context/code"
|
||||
import { DialogProvider } from "@kilocode/kilo-ui/context/dialog"
|
||||
import { MarkedProvider } from "@kilocode/kilo-ui/context/marked"
|
||||
import { I18nProvider } from "@kilocode/kilo-ui/context"
|
||||
import { Diff } from "@kilocode/kilo-ui/diff"
|
||||
import { Code } from "@kilocode/kilo-ui/code"
|
||||
import { SessionContext } from "../context/session"
|
||||
import { LanguageContext } from "../context/language"
|
||||
import { dict as uiEn } from "@kilocode/kilo-ui/i18n/en"
|
||||
import { dict as appEn } from "../i18n/en"
|
||||
import { dict as kiloEn } from "@kilocode/kilo-i18n/en"
|
||||
import type { PermissionRequest, QuestionRequest } from "../types/messages"
|
||||
|
||||
// Merged English dictionary (same merge order as the real LanguageProvider)
|
||||
const dict: Record<string, string> = { ...appEn, ...uiEn, ...kiloEn }
|
||||
|
||||
function t(key: string) {
|
||||
return dict[key] ?? key
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Default mock data (empty session)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const defaultMockData = {
|
||||
session: [],
|
||||
session_status: {},
|
||||
session_diff: {},
|
||||
message: {} as Record<string, any[]>,
|
||||
part: {} as Record<string, any[]>,
|
||||
permission: {} as Record<string, any[]>,
|
||||
question: {},
|
||||
provider: { all: [], connected: false, default: {} },
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Mock SessionContext value — only the subset used by components
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function noop() {}
|
||||
|
||||
export function mockSessionValue(overrides?: {
|
||||
id?: string
|
||||
permissions?: PermissionRequest[]
|
||||
questions?: QuestionRequest[]
|
||||
status?: string
|
||||
}) {
|
||||
const id = overrides?.id ?? "story-session-001"
|
||||
const permissions = overrides?.permissions ?? []
|
||||
const qs = overrides?.questions ?? []
|
||||
const status = (overrides?.status ?? "idle") as "idle" | "busy"
|
||||
|
||||
return {
|
||||
currentSessionID: () => id,
|
||||
currentSession: () => ({ id, title: "Story session", createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }),
|
||||
setCurrentSessionID: noop,
|
||||
sessions: () => [],
|
||||
status: () => status,
|
||||
statusInfo: () => ({ type: status }),
|
||||
statusText: () => (status === "idle" ? undefined : "Thinking…"),
|
||||
busySince: () => (status === "busy" ? Date.now() - 2000 : undefined),
|
||||
loading: () => false,
|
||||
messages: () => [],
|
||||
userMessages: () => [],
|
||||
allMessages: () => ({}),
|
||||
allParts: () => ({}),
|
||||
allStatusMap: () => ({}),
|
||||
getParts: () => [],
|
||||
todos: () => [],
|
||||
permissions: () => permissions,
|
||||
questions: () => qs,
|
||||
questionErrors: () => new Set<string>(),
|
||||
selected: () => ({ providerID: "anthropic", modelID: "claude-sonnet-4-20250514" }),
|
||||
selectModel: noop,
|
||||
totalCost: () => 0,
|
||||
contextUsage: () => undefined,
|
||||
agents: () => [{ name: "code", description: "Code mode", mode: "primary" as const }],
|
||||
selectedAgent: () => "code",
|
||||
selectAgent: noop,
|
||||
getSessionAgent: () => "code",
|
||||
getSessionModel: () => ({ providerID: "anthropic", modelID: "claude-sonnet-4-20250514" }),
|
||||
setSessionModel: noop,
|
||||
setSessionAgent: noop,
|
||||
variantList: () => [],
|
||||
currentVariant: () => undefined,
|
||||
selectVariant: noop,
|
||||
sendMessage: noop,
|
||||
abort: noop,
|
||||
compact: noop,
|
||||
respondToPermission: noop,
|
||||
replyToQuestion: noop,
|
||||
rejectQuestion: noop,
|
||||
createSession: noop,
|
||||
clearCurrentSession: noop,
|
||||
loadSessions: noop,
|
||||
selectSession: noop,
|
||||
deleteSession: noop,
|
||||
renameSession: noop,
|
||||
syncSession: noop,
|
||||
cloudPreviewId: () => null,
|
||||
selectCloudSession: noop,
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// StoryProviders component
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
interface StoryProvidersProps {
|
||||
data?: any
|
||||
permissions?: PermissionRequest[]
|
||||
questions?: QuestionRequest[]
|
||||
status?: string
|
||||
sessionID?: string
|
||||
}
|
||||
|
||||
export const StoryProviders: ParentComponent<StoryProvidersProps> = (props) => {
|
||||
const data = () => props.data ?? defaultMockData
|
||||
const session = mockSessionValue({
|
||||
id: props.sessionID,
|
||||
permissions: props.permissions,
|
||||
questions: props.questions,
|
||||
status: props.status,
|
||||
})
|
||||
const [locale] = createSignal<"en">("en")
|
||||
|
||||
return (
|
||||
<DialogProvider>
|
||||
<LanguageContext.Provider
|
||||
value={{
|
||||
locale,
|
||||
setLocale: noop,
|
||||
userOverride: () => "" as any,
|
||||
t,
|
||||
}}
|
||||
>
|
||||
<I18nProvider value={{ locale: () => "en", t }}>
|
||||
<SessionContext.Provider value={session as any}>
|
||||
<DataProvider data={data()} directory="/project/">
|
||||
<DiffComponentProvider component={Diff}>
|
||||
<CodeComponentProvider component={Code}>
|
||||
<MarkedProvider>
|
||||
<div style={{ padding: "12px" }}>{props.children}</div>
|
||||
</MarkedProvider>
|
||||
</CodeComponentProvider>
|
||||
</DiffComponentProvider>
|
||||
</DataProvider>
|
||||
</SessionContext.Provider>
|
||||
</I18nProvider>
|
||||
</LanguageContext.Provider>
|
||||
</DialogProvider>
|
||||
)
|
||||
}
|
||||
@@ -0,0 +1,463 @@
|
||||
/** @jsxImportSource solid-js */
|
||||
/**
|
||||
* Composite visual regression stories for the kilo-vscode webview.
|
||||
*
|
||||
* These test the *composed* UI — how kilo-ui components look together
|
||||
* in the extension webview context with extension-specific styling,
|
||||
* inline permission prompts, and tool card overrides.
|
||||
*/
|
||||
|
||||
import type { Meta, StoryObj } from "storybook-solidjs-vite"
|
||||
import { For, Show } from "solid-js"
|
||||
import { Part } from "@kilocode/kilo-ui/message-part"
|
||||
import { BasicTool } from "@kilocode/kilo-ui/basic-tool"
|
||||
import { Button } from "@kilocode/kilo-ui/button"
|
||||
import type {
|
||||
AssistantMessage as SDKAssistantMessage,
|
||||
TextPart,
|
||||
ToolPart,
|
||||
Message as SDKMessage,
|
||||
} from "@kilocode/sdk/v2"
|
||||
import { StoryProviders, defaultMockData, mockSessionValue } from "./StoryProviders"
|
||||
import { AssistantMessage } from "../components/chat/AssistantMessage"
|
||||
import { registerVscodeToolOverrides } from "../components/chat/VscodeToolOverrides"
|
||||
import { SessionContext } from "../context/session"
|
||||
import type { PermissionRequest, QuestionRequest } from "../types/messages"
|
||||
|
||||
// Register VS Code tool overrides (bash expanded by default, etc.)
|
||||
registerVscodeToolOverrides()
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Shared constants
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const SESSION_ID = "story-session-001"
|
||||
const ASST_MSG_ID = "asst-msg-001"
|
||||
const now = Date.now()
|
||||
|
||||
const baseAssistantMessage: SDKAssistantMessage = {
|
||||
id: ASST_MSG_ID,
|
||||
sessionID: SESSION_ID,
|
||||
role: "assistant",
|
||||
parentID: "user-msg-001",
|
||||
time: { created: now - 9000, completed: now - 5000 },
|
||||
modelID: "claude-sonnet-4-20250514",
|
||||
providerID: "anthropic",
|
||||
mode: "default",
|
||||
agent: "default",
|
||||
path: { cwd: "/project", root: "/project" },
|
||||
cost: 0.0023,
|
||||
tokens: { total: 512, input: 256, output: 256, reasoning: 0, cache: { read: 0, write: 0 } },
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Tool parts
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const globPending: ToolPart = {
|
||||
id: "part-glob-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-glob-001",
|
||||
tool: "glob",
|
||||
state: {
|
||||
status: "pending",
|
||||
input: { pattern: "**/*.md", path: "." },
|
||||
title: "Searching for files",
|
||||
metadata: {},
|
||||
time: { start: now - 3000 },
|
||||
},
|
||||
}
|
||||
|
||||
const readCompleted: ToolPart = {
|
||||
id: "part-read-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-read-001",
|
||||
tool: "read",
|
||||
state: {
|
||||
status: "completed",
|
||||
input: { filePath: "src/main.tsx" },
|
||||
output: 'import { render } from "solid-js/web"\nrender(() => <App />, document.getElementById("root")!)',
|
||||
title: "Read file",
|
||||
metadata: {},
|
||||
time: { start: now - 8000, end: now - 7500 },
|
||||
},
|
||||
}
|
||||
|
||||
const grepCompleted: ToolPart = {
|
||||
id: "part-grep-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-grep-001",
|
||||
tool: "grep",
|
||||
state: {
|
||||
status: "completed",
|
||||
input: { pattern: "TODO", path: "src/" },
|
||||
output: "src/main.tsx:12: // TODO: add error boundary\nsrc/utils.ts:5: // TODO: refactor",
|
||||
title: "Search",
|
||||
metadata: {},
|
||||
time: { start: now - 7000, end: now - 6500 },
|
||||
},
|
||||
}
|
||||
|
||||
const globCompleted: ToolPart = {
|
||||
id: "part-glob-002",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-glob-002",
|
||||
tool: "glob",
|
||||
state: {
|
||||
status: "completed",
|
||||
input: { pattern: "src/**/*.ts", path: "." },
|
||||
output: "src/main.ts\nsrc/utils.ts\nsrc/types.ts",
|
||||
title: "Found 3 files",
|
||||
metadata: {},
|
||||
time: { start: now - 6000, end: now - 5800 },
|
||||
},
|
||||
}
|
||||
|
||||
const lsCompleted: ToolPart = {
|
||||
id: "part-ls-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-ls-001",
|
||||
tool: "ls",
|
||||
state: {
|
||||
status: "completed",
|
||||
input: { path: "." },
|
||||
output: "src/\npackage.json\ntsconfig.json\nREADME.md",
|
||||
title: "List directory",
|
||||
metadata: {},
|
||||
time: { start: now - 5500, end: now - 5400 },
|
||||
},
|
||||
}
|
||||
|
||||
const bashPending: ToolPart = {
|
||||
id: "part-bash-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-bash-001",
|
||||
tool: "bash",
|
||||
state: {
|
||||
status: "pending",
|
||||
input: { description: "Run tests", command: "bun test" },
|
||||
title: "Execute command",
|
||||
metadata: {},
|
||||
time: { start: now - 2000 },
|
||||
},
|
||||
}
|
||||
|
||||
const textPart: TextPart = {
|
||||
id: "part-text-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "text",
|
||||
text: "I found the relevant files and will now update them.",
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Permission fixtures
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const globPermission: PermissionRequest = {
|
||||
id: "perm-glob-001",
|
||||
sessionID: SESSION_ID,
|
||||
toolName: "glob",
|
||||
patterns: ["**/*.md"],
|
||||
args: { pattern: "**/*.md" },
|
||||
tool: { messageID: ASST_MSG_ID, callID: "call-glob-001" },
|
||||
}
|
||||
|
||||
const bashPermission: PermissionRequest = {
|
||||
id: "perm-bash-001",
|
||||
sessionID: SESSION_ID,
|
||||
toolName: "bash",
|
||||
patterns: ["bun test"],
|
||||
args: { command: "bun test" },
|
||||
tool: { messageID: ASST_MSG_ID, callID: "call-bash-001" },
|
||||
}
|
||||
|
||||
const dockPermission: PermissionRequest = {
|
||||
id: "perm-dock-001",
|
||||
sessionID: SESSION_ID,
|
||||
toolName: "write",
|
||||
patterns: ["src/main.tsx", "src/utils.ts"],
|
||||
args: {},
|
||||
// No `tool` field — this is a non-tool (dock) permission
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Question fixtures
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const questionRequest: QuestionRequest = {
|
||||
id: "question-001",
|
||||
sessionID: SESSION_ID,
|
||||
questions: [
|
||||
{
|
||||
question: "Which testing framework should I use for this project?",
|
||||
header: "Choose a framework",
|
||||
options: [
|
||||
{ label: "Vitest", description: "Fast, Vite-native unit testing" },
|
||||
{ label: "Jest", description: "Widely adopted, rich ecosystem" },
|
||||
{ label: "Playwright", description: "End-to-end browser testing" },
|
||||
{ label: "Bun test", description: "Built-in, zero config" },
|
||||
],
|
||||
},
|
||||
],
|
||||
tool: { messageID: ASST_MSG_ID, callID: "call-question-001" },
|
||||
}
|
||||
|
||||
const questionToolPart: ToolPart = {
|
||||
id: "part-question-001",
|
||||
sessionID: SESSION_ID,
|
||||
messageID: ASST_MSG_ID,
|
||||
type: "tool",
|
||||
callID: "call-question-001",
|
||||
tool: "question",
|
||||
state: {
|
||||
status: "running",
|
||||
input: { question: "Which testing framework?", options: [] },
|
||||
title: "Asking question",
|
||||
metadata: {},
|
||||
time: { start: now - 1000 },
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Data helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
function dataWith(parts: any[], permissions?: PermissionRequest[]) {
|
||||
return {
|
||||
...defaultMockData,
|
||||
message: {
|
||||
[SESSION_ID]: [baseAssistantMessage],
|
||||
},
|
||||
part: {
|
||||
[ASST_MSG_ID]: parts,
|
||||
},
|
||||
permission: permissions
|
||||
? { [SESSION_ID]: permissions }
|
||||
: {},
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Meta
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
const meta: Meta = {
|
||||
title: "Composite/Webview",
|
||||
parameters: { layout: "padded" },
|
||||
}
|
||||
export default meta
|
||||
|
||||
type Story = StoryObj
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 1. Tool with inline permission (glob)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const GlobWithPermission: Story = {
|
||||
name: "Glob + Inline Permission",
|
||||
render: () => {
|
||||
const perms = [globPermission]
|
||||
const data = dataWith([globPending], perms)
|
||||
return (
|
||||
<StoryProviders data={data} permissions={perms} sessionID={SESSION_ID}>
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 2. Tool with inline permission (bash)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const BashWithPermission: Story = {
|
||||
name: "Bash + Inline Permission",
|
||||
render: () => {
|
||||
const perms = [bashPermission]
|
||||
const data = dataWith([bashPending], perms)
|
||||
return (
|
||||
<StoryProviders data={data} permissions={perms} sessionID={SESSION_ID}>
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 3. Permission dock (non-tool bottom prompt)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const PermissionDock: Story = {
|
||||
name: "Permission Dock",
|
||||
render: () => {
|
||||
const perm = dockPermission
|
||||
return (
|
||||
<StoryProviders sessionID={SESSION_ID}>
|
||||
<div data-component="tool-part-wrapper" data-permission="true">
|
||||
<BasicTool
|
||||
icon="checklist"
|
||||
locked
|
||||
defaultOpen
|
||||
trigger={{
|
||||
title: "Permission required",
|
||||
subtitle: perm.toolName,
|
||||
}}
|
||||
>
|
||||
<Show when={perm.patterns.length > 0}>
|
||||
<div class="permission-dock-patterns">
|
||||
<For each={perm.patterns}>
|
||||
{(pattern) => <code class="permission-dock-pattern">{pattern}</code>}
|
||||
</For>
|
||||
</div>
|
||||
</Show>
|
||||
</BasicTool>
|
||||
<div data-component="permission-prompt">
|
||||
<div data-slot="permission-actions">
|
||||
<Button variant="ghost" size="small">
|
||||
Deny
|
||||
</Button>
|
||||
<Button variant="secondary" size="small">
|
||||
Always Allow
|
||||
</Button>
|
||||
<Button variant="primary" size="small">
|
||||
Allow Once
|
||||
</Button>
|
||||
</div>
|
||||
<p data-slot="permission-hint">Approval applies only to the current session</p>
|
||||
</div>
|
||||
</div>
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 4. Tool cards — read, glob, grep, ls
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const ToolCards: Story = {
|
||||
name: "Tool Cards",
|
||||
render: () => {
|
||||
const data = dataWith([readCompleted, globCompleted, grepCompleted, lsCompleted])
|
||||
return (
|
||||
<StoryProviders data={data} sessionID={SESSION_ID}>
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 5. Chat idle — prompt input placeholder
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const ChatIdle: Story = {
|
||||
name: "Chat Idle",
|
||||
render: () => (
|
||||
<StoryProviders sessionID={SESSION_ID} status="idle">
|
||||
<div class="chat-view" style={{ width: "380px" }}>
|
||||
<div class="chat-input">
|
||||
<div
|
||||
style={{
|
||||
padding: "8px 12px",
|
||||
border: "1px solid var(--border-base)",
|
||||
"border-radius": "8px",
|
||||
color: "var(--text-dimmed)",
|
||||
"font-size": "13px",
|
||||
background: "var(--background-input)",
|
||||
}}
|
||||
>
|
||||
Ask anything… (⌘ Enter)
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</StoryProviders>
|
||||
),
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 6. Chat busy — working indicator, no prompt
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const ChatBusy: Story = {
|
||||
name: "Chat Busy",
|
||||
render: () => {
|
||||
const data = dataWith([textPart])
|
||||
return (
|
||||
<StoryProviders data={data} sessionID={SESSION_ID} status="busy">
|
||||
<div class="chat-view" style={{ width: "380px" }}>
|
||||
<div class="vscode-session-turn-assistant">
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</div>
|
||||
<div
|
||||
style={{
|
||||
padding: "8px 12px",
|
||||
display: "flex",
|
||||
"align-items": "center",
|
||||
gap: "8px",
|
||||
color: "var(--text-dimmed)",
|
||||
"font-size": "13px",
|
||||
}}
|
||||
>
|
||||
<span
|
||||
style={{
|
||||
width: "8px",
|
||||
height: "8px",
|
||||
"border-radius": "50%",
|
||||
background: "var(--accent-base)",
|
||||
animation: "pulse 1.5s infinite",
|
||||
}}
|
||||
/>
|
||||
Thinking…
|
||||
</div>
|
||||
</div>
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 7. Multiple tool calls in one assistant message
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const MultipleToolCalls: Story = {
|
||||
name: "Multiple Tool Calls",
|
||||
render: () => {
|
||||
const data = dataWith([readCompleted, globCompleted, textPart])
|
||||
return (
|
||||
<StoryProviders data={data} sessionID={SESSION_ID}>
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// 8. Inline question (tool-linked question rendered in message flow)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export const InlineQuestion: Story = {
|
||||
name: "Inline Question",
|
||||
render: () => {
|
||||
const qs = [questionRequest]
|
||||
const data = dataWith([textPart, questionToolPart])
|
||||
return (
|
||||
<StoryProviders data={data} questions={qs} sessionID={SESSION_ID}>
|
||||
<AssistantMessage message={baseAssistantMessage} />
|
||||
</StoryProviders>
|
||||
)
|
||||
},
|
||||
}
|
||||
@@ -345,6 +345,7 @@
|
||||
|
||||
.prompt-input-hint {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
@@ -355,6 +356,7 @@
|
||||
|
||||
.prompt-input-hint-selectors {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
|
||||
[data-component="button"] {
|
||||
@@ -694,6 +696,33 @@
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
/* Permission Prompt (inline with tool cards) */
|
||||
[data-component="tool-part-wrapper"][data-permission="true"] {
|
||||
/* When wrapping a Part + permission, the outer wrapper provides the card border.
|
||||
Remove the inner Part's tool-part-wrapper border so we don't get double borders. */
|
||||
> [data-component="tool-part-wrapper"] {
|
||||
border: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
}
|
||||
|
||||
[data-component="permission-prompt"] {
|
||||
border-top: 1px solid var(--border-weak-base, var(--vscode-panel-border));
|
||||
padding: 8px 12px;
|
||||
}
|
||||
|
||||
[data-component="permission-prompt"] [data-slot="permission-actions"] {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
[data-component="permission-prompt"] [data-slot="permission-hint"] {
|
||||
font-size: 11px;
|
||||
color: var(--text-weak, var(--vscode-descriptionForeground));
|
||||
margin: 4px 0 0;
|
||||
}
|
||||
|
||||
/* Dialog Confirmation */
|
||||
.dialog-confirm-body {
|
||||
display: flex;
|
||||
@@ -980,22 +1009,133 @@
|
||||
}
|
||||
|
||||
[data-slot="question-option"] {
|
||||
padding: 6px 8px;
|
||||
border-radius: var(--radius-lg);
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
padding: 6px 8px;
|
||||
background-color: var(--surface-raised-stronger-non-alpha);
|
||||
border: 1px solid var(--border-weak-base);
|
||||
border-radius: var(--radius-lg);
|
||||
box-shadow: none;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
transition:
|
||||
background-color 0.15s ease,
|
||||
border-color 0.15s ease,
|
||||
box-shadow 0.15s ease;
|
||||
|
||||
&:hover:not([data-picked="true"]) {
|
||||
background-color: var(--background-base);
|
||||
}
|
||||
|
||||
&[data-picked="true"] {
|
||||
background-color: var(--surface-interactive-weak);
|
||||
border-color: transparent;
|
||||
box-shadow: var(--shadow-xs-border-hover);
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
cursor: not-allowed;
|
||||
opacity: 0.6;
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="question-option-check"] {
|
||||
display: inline-flex;
|
||||
transform: translateY(2px);
|
||||
}
|
||||
|
||||
[data-slot="question-option-box"] {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
padding: 2px;
|
||||
border-radius: var(--radius-sm);
|
||||
border: 1px solid var(--border-weak-base);
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
background-color: transparent;
|
||||
transition:
|
||||
background-color 0.15s ease,
|
||||
border-color 0.15s ease;
|
||||
|
||||
[data-component="icon"] {
|
||||
opacity: 0;
|
||||
color: var(--icon-base);
|
||||
}
|
||||
|
||||
&[data-type="radio"] {
|
||||
border-radius: 999px;
|
||||
}
|
||||
|
||||
[data-slot="question-option-radio-dot"] {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 999px;
|
||||
background-color: var(--background-stronger);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
&[data-picked="true"] {
|
||||
border-color: var(--icon-interactive-base);
|
||||
|
||||
[data-component="icon"] {
|
||||
opacity: 1;
|
||||
color: var(--icon-invert-base);
|
||||
}
|
||||
|
||||
&[data-type="checkbox"] {
|
||||
background-color: var(--icon-interactive-base);
|
||||
}
|
||||
|
||||
&[data-type="radio"] {
|
||||
background-color: var(--icon-interactive-base);
|
||||
[data-slot="question-option-radio-dot"] {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="question-option-main"] {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
[data-slot="option-label"] {
|
||||
font-family: var(--font-family-sans);
|
||||
font-size: var(--font-size-base);
|
||||
font-weight: var(--font-weight-medium);
|
||||
line-height: var(--line-height-large);
|
||||
color: var(--text-strong);
|
||||
}
|
||||
|
||||
[data-slot="option-description"] {
|
||||
font-family: var(--font-family-sans);
|
||||
font-size: var(--font-size-small);
|
||||
font-weight: var(--font-weight-regular);
|
||||
line-height: var(--line-height-large);
|
||||
color: var(--text-base);
|
||||
min-width: 0;
|
||||
white-space: normal;
|
||||
overflow: visible;
|
||||
text-overflow: clip;
|
||||
}
|
||||
|
||||
[data-slot="question-option"][data-custom="true"] {
|
||||
[data-slot="option-description"] {
|
||||
overflow: visible;
|
||||
text-overflow: clip;
|
||||
white-space: normal;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
}
|
||||
|
||||
[data-slot="question-review"] {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@@ -500,7 +500,7 @@ export interface DeviceAuthCancelledMessage {
|
||||
|
||||
export interface NavigateMessage {
|
||||
type: "navigate"
|
||||
view: "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings"
|
||||
view: "newTask" | "marketplace" | "history" | "cloudHistory" | "profile" | "settings" | "migration" // legacy-migration
|
||||
}
|
||||
|
||||
export interface ProvidersLoadedMessage {
|
||||
@@ -793,6 +793,115 @@ export interface AgentManagerSendInitialMessage {
|
||||
files?: Array<{ mime: string; url: string }>
|
||||
}
|
||||
|
||||
// legacy-migration start
|
||||
export interface MigrationProviderInfo {
|
||||
profileName: string
|
||||
provider: string
|
||||
model?: string
|
||||
hasApiKey: boolean
|
||||
supported: boolean
|
||||
newProviderName?: string
|
||||
}
|
||||
|
||||
export interface MigrationMcpServerInfo {
|
||||
name: string
|
||||
type: string
|
||||
}
|
||||
|
||||
export interface MigrationCustomModeInfo {
|
||||
name: string
|
||||
slug: string
|
||||
}
|
||||
|
||||
export interface LegacyAutocompleteSettings {
|
||||
enableAutoTrigger?: boolean
|
||||
enableSmartInlineTaskKeybinding?: boolean
|
||||
enableChatAutocomplete?: boolean
|
||||
}
|
||||
|
||||
export interface LegacySettings {
|
||||
autoApprovalEnabled?: boolean
|
||||
allowedCommands?: string[]
|
||||
deniedCommands?: string[]
|
||||
// Fine-grained auto-approval (legacy globalState keys — no prefix)
|
||||
alwaysAllowReadOnly?: boolean
|
||||
alwaysAllowReadOnlyOutsideWorkspace?: boolean
|
||||
alwaysAllowWrite?: boolean
|
||||
alwaysAllowExecute?: boolean
|
||||
alwaysAllowMcp?: boolean
|
||||
alwaysAllowModeSwitch?: boolean
|
||||
alwaysAllowSubtasks?: boolean
|
||||
language?: string
|
||||
autocomplete?: LegacyAutocompleteSettings
|
||||
}
|
||||
|
||||
export interface MigrationResultItem {
|
||||
item: string
|
||||
category: "provider" | "mcpServer" | "customMode" | "defaultModel" | "settings"
|
||||
status: "success" | "warning" | "error"
|
||||
message?: string
|
||||
}
|
||||
|
||||
export interface LegacyMigrationDataMessage {
|
||||
type: "legacyMigrationData"
|
||||
data: {
|
||||
providers: MigrationProviderInfo[]
|
||||
mcpServers: MigrationMcpServerInfo[]
|
||||
customModes: MigrationCustomModeInfo[]
|
||||
defaultModel?: { provider: string; model: string }
|
||||
settings?: LegacySettings
|
||||
}
|
||||
}
|
||||
|
||||
export interface LegacyMigrationProgressMessage {
|
||||
type: "legacyMigrationProgress"
|
||||
item: string
|
||||
status: "migrating" | "success" | "warning" | "error"
|
||||
message?: string
|
||||
}
|
||||
|
||||
export interface LegacyMigrationCompleteMessage {
|
||||
type: "legacyMigrationComplete"
|
||||
results: MigrationResultItem[]
|
||||
}
|
||||
|
||||
export interface RequestLegacyMigrationDataMessage {
|
||||
type: "requestLegacyMigrationData"
|
||||
}
|
||||
|
||||
export interface MigrationAutoApprovalSelections {
|
||||
commandRules: boolean
|
||||
readPermission: boolean
|
||||
writePermission: boolean
|
||||
executePermission: boolean
|
||||
mcpPermission: boolean
|
||||
taskPermission: boolean
|
||||
}
|
||||
|
||||
export interface StartLegacyMigrationMessage {
|
||||
type: "startLegacyMigration"
|
||||
selections: {
|
||||
providers: string[]
|
||||
mcpServers: string[]
|
||||
customModes: string[]
|
||||
defaultModel: boolean
|
||||
settings: {
|
||||
autoApproval: MigrationAutoApprovalSelections
|
||||
language: boolean
|
||||
autocomplete: boolean
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export interface SkipLegacyMigrationMessage {
|
||||
type: "skipLegacyMigration"
|
||||
}
|
||||
|
||||
export interface ClearLegacyDataMessage {
|
||||
type: "clearLegacyData"
|
||||
}
|
||||
// legacy-migration end
|
||||
|
||||
// Enhance prompt result (extension → webview)
|
||||
export interface EnhancePromptResultMessage {
|
||||
type: "enhancePromptResult"
|
||||
@@ -867,6 +976,11 @@ export type ExtensionMessage =
|
||||
| AgentManagerApplyWorktreeDiffResultMessage
|
||||
| AgentManagerWorktreeStatsMessage
|
||||
| AgentManagerLocalStatsMessage
|
||||
// legacy-migration start
|
||||
| LegacyMigrationDataMessage
|
||||
| LegacyMigrationProgressMessage
|
||||
| LegacyMigrationCompleteMessage
|
||||
// legacy-migration end
|
||||
| EnhancePromptResultMessage
|
||||
| EnhancePromptErrorMessage
|
||||
|
||||
@@ -1372,6 +1486,12 @@ export type WebviewMessage =
|
||||
| RequestWorktreeDiffMessage
|
||||
| StartDiffWatchMessage
|
||||
| StopDiffWatchMessage
|
||||
// legacy-migration start
|
||||
| RequestLegacyMigrationDataMessage
|
||||
| StartLegacyMigrationMessage
|
||||
| SkipLegacyMigrationMessage
|
||||
| ClearLegacyDataMessage
|
||||
// legacy-migration end
|
||||
| ApplyWorktreeDiffMessage
|
||||
| EnhancePromptRequest
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"name": "@kilocode/cli",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -173,6 +173,7 @@ export namespace Agent {
|
||||
options: {},
|
||||
permission: PermissionNext.merge(
|
||||
defaults,
|
||||
user, // kilocode_change: user before ask-specific so ask's deny+allowlist wins
|
||||
PermissionNext.fromConfig({
|
||||
"*": "deny",
|
||||
read: {
|
||||
@@ -192,7 +193,6 @@ export namespace Agent {
|
||||
[Truncate.GLOB]: "allow",
|
||||
},
|
||||
}),
|
||||
user,
|
||||
),
|
||||
mode: "primary",
|
||||
native: true,
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
// kilocode_change - new file
|
||||
/**
|
||||
* Debounced Instance.disposeAll() helper.
|
||||
*
|
||||
* Bulk operations like legacy migration call client.auth.set() for each provider
|
||||
* in rapid succession. Calling Instance.disposeAll() immediately on every auth
|
||||
* change causes repeated disposal/recreation cycles. This module coalesces all
|
||||
* dispose requests within a 300ms window into a single disposal call.
|
||||
*/
|
||||
import { Instance } from "../project/instance"
|
||||
|
||||
let timer: ReturnType<typeof setTimeout> | undefined
|
||||
|
||||
export function scheduleDisposeAll() {
|
||||
if (timer) clearTimeout(timer)
|
||||
timer = setTimeout(() => {
|
||||
timer = undefined
|
||||
void Instance.disposeAll().catch(() => undefined)
|
||||
}, 300)
|
||||
}
|
||||
@@ -7,6 +7,8 @@ import type { AuthOuathResult, Hooks } from "@kilocode/plugin"
|
||||
import { NamedError } from "@opencode-ai/util/error"
|
||||
import { Auth } from "@/auth"
|
||||
import { Telemetry } from "@kilocode/kilo-telemetry" // kilocode_change
|
||||
import { ModelCache } from "./model-cache" // kilocode_change
|
||||
import { scheduleDisposeAll } from "../kilocode/dispose" // kilocode_change
|
||||
|
||||
export namespace ProviderAuth {
|
||||
const state = Instance.state(async () => {
|
||||
@@ -121,6 +123,11 @@ export namespace ProviderAuth {
|
||||
Telemetry.trackAuthSuccess(input.providerID)
|
||||
// kilocode_change end
|
||||
|
||||
// kilocode_change start - invalidate provider/model cache after auth change
|
||||
ModelCache.clear(input.providerID)
|
||||
scheduleDisposeAll()
|
||||
// kilocode_change end
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
@@ -138,6 +145,10 @@ export namespace ProviderAuth {
|
||||
type: "api",
|
||||
key: input.key,
|
||||
})
|
||||
// kilocode_change start - invalidate provider/model cache after auth change
|
||||
ModelCache.clear(input.providerID)
|
||||
scheduleDisposeAll()
|
||||
// kilocode_change end
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@ import { Vcs } from "../project/vcs"
|
||||
import { Agent } from "../agent/agent"
|
||||
import { Skill } from "../skill/skill"
|
||||
import { Auth } from "../auth"
|
||||
import { ModelCache } from "../provider/model-cache" // kilocode_change
|
||||
import { scheduleDisposeAll } from "../kilocode/dispose" // kilocode_change
|
||||
import { Flag } from "../flag/flag"
|
||||
import { Command } from "../command"
|
||||
import { Global } from "../global"
|
||||
@@ -167,6 +169,10 @@ export namespace Server {
|
||||
const providerID = c.req.valid("param").providerID
|
||||
const info = c.req.valid("json")
|
||||
await Auth.set(providerID, info)
|
||||
// kilocode_change start - invalidate provider/model cache after auth change
|
||||
ModelCache.clear(providerID)
|
||||
scheduleDisposeAll()
|
||||
// kilocode_change end
|
||||
return c.json(true)
|
||||
},
|
||||
)
|
||||
@@ -197,6 +203,10 @@ export namespace Server {
|
||||
async (c) => {
|
||||
const providerID = c.req.valid("param").providerID
|
||||
await Auth.remove(providerID)
|
||||
// kilocode_change start - invalidate provider/model cache after auth removal
|
||||
ModelCache.clear(providerID)
|
||||
scheduleDisposeAll()
|
||||
// kilocode_change end
|
||||
return c.json(true)
|
||||
},
|
||||
)
|
||||
|
||||
@@ -78,6 +78,35 @@ test("ask agent has correct default properties", async () => {
|
||||
},
|
||||
})
|
||||
})
|
||||
test("ask agent denies edit/write/bash even when user config adds a specific edit allow", async () => {
|
||||
await using tmp = await tmpdir({
|
||||
config: {
|
||||
permission: {
|
||||
edit: { "src/output.log": "allow" },
|
||||
},
|
||||
},
|
||||
})
|
||||
await Instance.provide({
|
||||
directory: tmp.path,
|
||||
fn: async () => {
|
||||
const ask = await Agent.get("ask")
|
||||
expect(ask).toBeDefined()
|
||||
// user config must not leak edit capability into ask mode — even for the
|
||||
// specific path the user allowed, ask mode must still deny it
|
||||
expect(PermissionNext.evaluate("edit", "src/output.log", ask!.permission).action).toBe("deny")
|
||||
expect(evalPerm(ask, "bash")).toBe("deny")
|
||||
expect(evalPerm(ask, "task")).toBe("deny")
|
||||
// safe tools still work
|
||||
expect(evalPerm(ask, "read")).toBe("allow")
|
||||
expect(evalPerm(ask, "grep")).toBe("allow")
|
||||
// disabled() must also reflect the deny (tools hidden from LLM)
|
||||
const disabled = PermissionNext.disabled(["edit", "write", "bash"], ask!.permission)
|
||||
expect(disabled.has("edit")).toBe(true)
|
||||
expect(disabled.has("write")).toBe(true)
|
||||
expect(disabled.has("bash")).toBe(true)
|
||||
},
|
||||
})
|
||||
})
|
||||
// kilocode_change end
|
||||
|
||||
test("plan agent denies edits except .opencode/plans/*", async () => {
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
// kilocode_change - new file
|
||||
import { describe, expect, test } from "bun:test"
|
||||
import { $ } from "bun"
|
||||
import fs from "fs/promises"
|
||||
import os from "os"
|
||||
import path from "path"
|
||||
|
||||
const root = path.join(import.meta.dir, "..", "..")
|
||||
const wrapper = path.join(root, "bin", "kilo")
|
||||
|
||||
describe("npm install artifact behavior", () => {
|
||||
test("keeps the CLI wrapper contract", async () => {
|
||||
const text = await fs.readFile(wrapper, "utf8")
|
||||
expect(text.startsWith("#!/usr/bin/env node")).toBe(true)
|
||||
expect(text).toContain("const envPath = process.env.KILO_BIN_PATH")
|
||||
expect(text).toContain("const base = \"@kilocode/cli-\" + platform + \"-\" + arch")
|
||||
expect(text).toContain("function findBinary(startDir)")
|
||||
})
|
||||
|
||||
test("links npm bin commands to the wrapper during local install", async () => {
|
||||
const npmPath = Bun.which("npm")
|
||||
if (!npmPath) {
|
||||
console.warn("Skipping install artifact test: npm is not available in PATH")
|
||||
return
|
||||
}
|
||||
|
||||
const tmp = await fs.mkdtemp(path.join(os.tmpdir(), "kilo-install-artifact-"))
|
||||
try {
|
||||
const pkg = path.join(tmp, "pkg")
|
||||
const bin = path.join(pkg, "bin")
|
||||
const prefix = path.join(tmp, "prefix")
|
||||
await fs.mkdir(bin, { recursive: true })
|
||||
await fs.mkdir(prefix, { recursive: true })
|
||||
await fs.copyFile(wrapper, path.join(bin, "kilo"))
|
||||
await Bun.write(
|
||||
path.join(pkg, "package.json"),
|
||||
JSON.stringify(
|
||||
{
|
||||
name: "kilo-install-artifact-repro",
|
||||
version: "1.0.0",
|
||||
bin: {
|
||||
kilo: "./bin/kilo",
|
||||
kilocode: "./bin/kilo",
|
||||
},
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
)
|
||||
|
||||
await $`npm install --prefix ${prefix} ${pkg} --no-package-lock --ignore-scripts --no-audit --no-fund`.quiet()
|
||||
|
||||
const commands = ["kilo", "kilocode"]
|
||||
for (const name of commands) {
|
||||
const link = path.join(prefix, "node_modules", ".bin", name)
|
||||
const stat = await fs.lstat(link)
|
||||
expect(stat.isSymbolicLink() || stat.isFile()).toBe(true)
|
||||
}
|
||||
|
||||
const hidden = path.join(prefix, "node_modules", ".bin", ".kilo")
|
||||
const exists = await fs
|
||||
.access(hidden)
|
||||
.then(() => true)
|
||||
.catch(() => false)
|
||||
if (!exists) return
|
||||
|
||||
const stat = await fs.lstat(hidden)
|
||||
expect(stat.isFile() || stat.isSymbolicLink()).toBe(true)
|
||||
if (!stat.isSymbolicLink()) expect(stat.size).toBeGreaterThan(0)
|
||||
} finally {
|
||||
await fs.rm(tmp, { recursive: true, force: true })
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/plugin",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
"exports": {
|
||||
".": "./src/index.ts"
|
||||
},
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"dependencies": {},
|
||||
"peerDependencies": {}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"$schema": "https://json.schemastore.org/package.json",
|
||||
"name": "@kilocode/sdk",
|
||||
"version": "7.0.36",
|
||||
"version": "7.0.37",
|
||||
"type": "module",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user