diff --git a/.codev/command/commit.md b/.codev/command/commit.md index e88932a244..0bbca7d660 100644 --- a/.codev/command/commit.md +++ b/.codev/command/commit.md @@ -14,8 +14,6 @@ ci: ignore: wip: -For anything in the packages/web use the docs: prefix. - prefer to explain WHY something was done from an end user perspective instead of WHAT was done. diff --git a/AGENTS.md b/AGENTS.md index c21b7c7630..bc4a0bd409 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -2,7 +2,7 @@ - After changing the public Protocol or Server `HttpApi`, run `bun run generate` from `packages/client`. Do not edit `src/generated` or `src/generated-effect` directly. - Keep runtime dependencies directed from Schema to Core and Protocol, then from Core and Protocol to Server. Client runtime code may depend on Schema and Protocol but never Core or Server; `sdk-next` composes Client, Core, and Server. - The default branch in this repo is `main`; use `main` or `origin/main` for diffs. (Upstream opencode's default is `dev`; this fork does not have that branch.) -- This repo is a fork of upstream opencode. Every deliberate change to an upstream file must get a row in `DIVERGENCES.md` (file, change, why, on-conflict guidance) in the same PR — an unlisted divergence is a bug. Fork-only new files are not tracked there. If the change alters documented behavior (e.g. a keybind default), update the matching docs under `packages/web/src/content/docs/` (en + es) too. +- This repo is a fork of upstream opencode. Every deliberate change to an upstream file must get a row in `DIVERGENCES.md` (file, change, why, on-conflict guidance) in the same PR — an unlisted divergence is a bug. Fork-only new files are not tracked there. If the change alters documented behavior (e.g. a keybind default), record it in `CHANGELOG.md` — the user-facing docs live in the separate `codev-landing-page` repo (`content/docs/code`) and are synced from there. - Before adding a feature, read Divergence policy in `DIVERGENCES.md` and prefer the lowest tier that works: config/plugins/skills/agents first, new `packages/codev-*` workspace packages second, upstream-file edits last. When asked to sync with upstream, follow Syncing with upstream in `DIVERGENCES.md` — do not `git merge` upstream refs. ## Branch Names diff --git a/DIVERGENCES.md b/DIVERGENCES.md index 93234ec109..f5d9c23f71 100644 --- a/DIVERGENCES.md +++ b/DIVERGENCES.md @@ -39,8 +39,8 @@ FROM=v1.17.15 TO=v1.17.16 bun bump ${FROM#v} git add -A -# `git apply` is atomic: hunks against files the fork deleted (locales, docs -# translations — see the table below) hard-error and roll back the entire patch, +# `git apply` is atomic: hunks against files the fork deleted (locales, the +# docs packages — see the table below) hard-error and roll back the entire patch, # so filter them out first. A path is skipped only if it existed in FROM and is # deliberately absent from HEAD; files new in TO still come through. git diff --name-only $FROM $TO -- . ':(exclude)bun.lock' | @@ -105,13 +105,13 @@ from the squash message first, or use a plain merge. | `packages/tui/src/routes/session/permission.tsx`, `packages/opencode/src/cli/cmd/run/permission.shared.ts`, `packages/opencode/test/cli/run/permission.shared.test.ts`, `packages/tui/src/component/error-component.tsx`, `packages/opencode/src/cli/cmd/run/splash.ts` | Visible sentences/badges "OpenCode"/"opencode" → "CoDev Code"/"codev-code" (incl. the permission always-allow copy and its test expectations); permission.tsx also registers a local `app.exit.confirm` command mirroring its `app.exit` reject and gathers the confirm binding (double-press Ctrl+C — see the double-Ctrl+C row) | User-facing copy; keep Ctrl+C rejecting the permission prompt as before. | Keep our strings; keep permission.tsx's `app.exit.confirm` command + binding. | | `packages/opencode/src/cli/cmd/run/splash.ts` | The `--mini` entry and exit splashes badge with `badge` (the "c" of the codev wordmark) instead of `go.right.slice(1)` (the "o" of the `go` mark) — the import and both `const mark = …` lines; header comment "full opencode entry logo and a compact [O] exit badge" → "full codev entry logo and a compact [C] exit badge". The badge glyphs draw with `input.theme.mark` (brand secondary) via the local `mark_fg` binding, not the muted `left`/`leftShadow` that upstream uses for the whole banner, and with no shadow — `draw`'s `shadow` param is now optional and the badge calls omit it, so the flat brand-colored outline has no interior fill. | The splash badge is the brand mark users see entering and leaving `codev --mini`; an "o" is upstream's, and the muted grey read as chrome rather than branding. `go` itself is untouched — `packages/tui/src/component/bg-pulse-render.ts` still draws the full "go" wordmark from it. | Keep the `badge` import, both `mark` assignments, the `mark_fg` badge fg, and the optional-`shadow` `draw` signature; take upstream's surrounding splash changes. If upstream restructures the badge rendering, feed it `badge` in the brand `mark` color rather than reverting to `go`/`left`. | | `packages/opencode/src/cli/cmd/run/theme.ts`, `packages/opencode/test/cli/run/theme.test.ts` | `RunSplashTheme` gains a `mark` field (brand badge color for the mini splash — no shadow color, the badge is a flat outline). `splashTheme(theme, indexed, pick)` takes the resolved dark/light `pick` and sets `mark` to the fixed `BRAND_SECONDARY` constant (`#0891b2` dark / `#7b5bb6` light — the codev theme's `darkSecondary`/`lightSecondary`) as **truecolor, not quantized**. `RUN_THEME_FALLBACK.splash` seeds `mark` from `fallbackSplashMark = rgba("#0891b2")` (also truecolor). theme.test.ts asserts `mark` is exactly `[8,145,178]`. Deliberately NOT the run theme's own `secondary` (that is derived from the terminal palette — magenta — and quantizing it gives a dull, off-brand cell). | The mini badge must read as the exact home-screen banner teal (`logo.tsx` draws the wordmark in the same brand `#0891b2`/`#7b5bb6` truecolor); the rest of the splash stays palette-matched, but the brand mark is a deliberate truecolor exception. | Keep the `RunSplashTheme.mark` field, the `pick` param + `BRAND_SECONDARY` derivation, the fallback seed, and the test assertion; take upstream's surrounding theme changes. If upstream reworks `splashTheme`'s signature, re-thread `pick`. | -| `packages/tui/src/config/keybind.ts`, `packages/tui/src/routes/session/question.tsx`, `packages/tui/src/ui/toast.tsx`, `packages/tui/test/app-lifecycle.test.tsx`, `packages/web/src/content/docs/keybinds.mdx` (+ `es/`) | Double-press Ctrl+C to quit. keybind.ts: `app_exit` `ctrl+c,ctrl+d,q` → `ctrl+d,q`, added `app_exit_confirm: "ctrl+c"` definition + its `app.exit.confirm` CommandMap entry. question.tsx: a local `app.exit.confirm` command mirroring its `app.exit` reject, with the confirm binding gathered in both option branches (Ctrl+C still rejects the question — single press). toast.tsx: `ToastOptions.variant` union gains `"secondary"` (resolves to `theme.secondary`, the banner brand color, for the confirm toast). app-lifecycle.test.tsx: added the "app.exit.confirm requires two presses to exit" test. Docs (en + es `keybinds.mdx`): split the `app_exit` default and added `app_exit_confirm: "ctrl+c"`. See also the `app.tsx`, `dialog.tsx`, and `permission.tsx` rows for their `app.exit.confirm` handlers. | A stray Ctrl+C on an empty/unfocused prompt no longer quits instantly: the first press shows a "Press Ctrl+C again to exit" toast (1.5 s window), the second within that window quits. Ctrl+D, `q`, and the `/exit` slash commands stay immediate. | Keep our binding split, the `app_exit_confirm`/`app.exit.confirm` definition + mapping, the local confirm commands + gathered bindings, the toast `"secondary"` variant, the test, and the doc defaults; take upstream's surrounding changes. If upstream re-adds `ctrl+c` to `app_exit`, keep it removed. | -| `packages/tui/src/config/keybind.ts`, `packages/web/src/content/docs/keybinds.mdx` (+ `es/`), `packages/opencode/test/cli/run/footer.view.test.tsx` | `sidebar_toggle` default `"b"` → `"ctrl+b,b"` (ctrl+b first so single-binding displays — the prompt-footer sidebar hint, the sidebar tip — resolve to it); `ctrl+b`'s former jobs move to `ctrl+o`: `input_move_left` `"left,ctrl+b"` → `"left,ctrl+o"`, `session_background` `"ctrl+b"` → `"ctrl+o"`; docs defaults updated to match (docs don't list `session_background`); footer.view.test.tsx asserts the run-CLI footer background hint as `"ctrl+o background"` (was `"ctrl+b background"`) since it resolves the real `session_background` default | Single-chord sidebar toggle on `ctrl+b` (tmux/VS Code sidebar muscle memory); its displaced bindings land on `ctrl+o`, which was unbound in every scope and free of terminal-encoding collisions (unlike `ctrl+h`/`ctrl+i`/`ctrl+m`) and flow control (`ctrl+s`/`ctrl+q`). | Keep our defaults on all three keybinds, the doc lines, and the footer hint assertion; take upstream's surrounding changes. If upstream binds `ctrl+o` to something else, re-audit and pick a new free key. | -| `packages/tui/src/config/keybind.ts`, `packages/tui/src/component/prompt/index.tsx`, `packages/tui/src/app.tsx`, `packages/web/src/content/docs/keybinds.mdx` (+ `es/`) | Single-press Ctrl+C interrupt. keybind.ts: added `session_interrupt_now: "ctrl+c"` + its `session.interrupt.now` CommandMap entry (`session_interrupt` keeps `escape`; its description gains "(press twice)"). prompt/index.tsx: added the `session.interrupt.now` command — same guards as upstream's `session.interrupt` but it aborts on the first press, and its `enabled` requires a busy session AND an empty prompt so ctrl+c falls through to `prompt.clear` (draft present) or `app.exit.confirm` (idle) instead of racing them on layer order; gathered the command in the `prompt.palette` binding list; the busy footer hint reads `interruptShortcut()` (resolves `session.interrupt`, mapping `escape` → `esc` and falling back to the `session.interrupt.now` label when escape is unbound) instead of the hardcoded `esc`. app.tsx: split `app_exit_confirm` out of the shared exit `useBindings` into its own layer whose `enabled` also requires `sync.data.session_status[route.data.sessionID]` to be idle, so ctrl+c can't arm the quit confirm mid-turn (`app_exit` keeps the shared predicate). Docs (en + es): added the `session_interrupt_now` default. Covered by the fork-only `packages/tui/test/interrupt.view.test.tsx`. See also the double-Ctrl+C row above, whose scope this narrows. | Ctrl+C is what many users reach for to stop a running agent, so it interrupts too; `escape` stays the advertised one in the busy footer and the home tip. Gating on `enabled` rather than binding order keeps the ctrl+c precedence (clear draft → interrupt → exit confirm) deterministic, since same-priority layers resolve by registration order and `useBindings` re-registers on every reactive change. | Keep the `session_interrupt_now` definition + mapping, the `session.interrupt.now` command and its `enabled` predicate, the footer shortcut memos, the split exit layer, the doc lines, and the test; take upstream's surrounding changes. If upstream binds `ctrl+c` to something else in the prompt, re-audit the precedence chain end to end. | +| `packages/tui/src/config/keybind.ts`, `packages/tui/src/routes/session/question.tsx`, `packages/tui/src/ui/toast.tsx`, `packages/tui/test/app-lifecycle.test.tsx` | Double-press Ctrl+C to quit. keybind.ts: `app_exit` `ctrl+c,ctrl+d,q` → `ctrl+d,q`, added `app_exit_confirm: "ctrl+c"` definition + its `app.exit.confirm` CommandMap entry. question.tsx: a local `app.exit.confirm` command mirroring its `app.exit` reject, with the confirm binding gathered in both option branches (Ctrl+C still rejects the question — single press). toast.tsx: `ToastOptions.variant` union gains `"secondary"` (resolves to `theme.secondary`, the banner brand color, for the confirm toast). app-lifecycle.test.tsx: added the "app.exit.confirm requires two presses to exit" test. See also the `app.tsx`, `dialog.tsx`, and `permission.tsx` rows for their `app.exit.confirm` handlers. | A stray Ctrl+C on an empty/unfocused prompt no longer quits instantly: the first press shows a "Press Ctrl+C again to exit" toast (1.5 s window), the second within that window quits. Ctrl+D, `q`, and the `/exit` slash commands stay immediate. | Keep our binding split, the `app_exit_confirm`/`app.exit.confirm` definition + mapping, the local confirm commands + gathered bindings, the toast `"secondary"` variant, and the test; take upstream's surrounding changes. If upstream re-adds `ctrl+c` to `app_exit`, keep it removed. | +| `packages/tui/src/config/keybind.ts`, `packages/opencode/test/cli/run/footer.view.test.tsx` | `sidebar_toggle` default `"b"` → `"ctrl+b,b"` (ctrl+b first so single-binding displays — the prompt-footer sidebar hint, the sidebar tip — resolve to it); `ctrl+b`'s former jobs move to `ctrl+o`: `input_move_left` `"left,ctrl+b"` → `"left,ctrl+o"`, `session_background` `"ctrl+b"` → `"ctrl+o"`; footer.view.test.tsx asserts the run-CLI footer background hint as `"ctrl+o background"` (was `"ctrl+b background"`) since it resolves the real `session_background` default | Single-chord sidebar toggle on `ctrl+b` (tmux/VS Code sidebar muscle memory); its displaced bindings land on `ctrl+o`, which was unbound in every scope and free of terminal-encoding collisions (unlike `ctrl+h`/`ctrl+i`/`ctrl+m`) and flow control (`ctrl+s`/`ctrl+q`). | Keep our defaults on all three keybinds and the footer hint assertion; take upstream's surrounding changes. If upstream binds `ctrl+o` to something else, re-audit and pick a new free key. | +| `packages/tui/src/config/keybind.ts`, `packages/tui/src/component/prompt/index.tsx`, `packages/tui/src/app.tsx` | Single-press Ctrl+C interrupt. keybind.ts: added `session_interrupt_now: "ctrl+c"` + its `session.interrupt.now` CommandMap entry (`session_interrupt` keeps `escape`; its description gains "(press twice)"). prompt/index.tsx: added the `session.interrupt.now` command — same guards as upstream's `session.interrupt` but it aborts on the first press, and its `enabled` requires a busy session AND an empty prompt so ctrl+c falls through to `prompt.clear` (draft present) or `app.exit.confirm` (idle) instead of racing them on layer order; gathered the command in the `prompt.palette` binding list; the busy footer hint reads `interruptShortcut()` (resolves `session.interrupt`, mapping `escape` → `esc` and falling back to the `session.interrupt.now` label when escape is unbound) instead of the hardcoded `esc`. app.tsx: split `app_exit_confirm` out of the shared exit `useBindings` into its own layer whose `enabled` also requires `sync.data.session_status[route.data.sessionID]` to be idle, so ctrl+c can't arm the quit confirm mid-turn (`app_exit` keeps the shared predicate). Covered by the fork-only `packages/tui/test/interrupt.view.test.tsx`. See also the double-Ctrl+C row above, whose scope this narrows. | Ctrl+C is what many users reach for to stop a running agent, so it interrupts too; `escape` stays the advertised one in the busy footer and the home tip. Gating on `enabled` rather than binding order keeps the ctrl+c precedence (clear draft → interrupt → exit confirm) deterministic, since same-priority layers resolve by registration order and `useBindings` re-registers on every reactive change. | Keep the `session_interrupt_now` definition + mapping, the `session.interrupt.now` command and its `enabled` predicate, the footer shortcut memos, the split exit layer, and the test; take upstream's surrounding changes. If upstream binds `ctrl+c` to something else in the prompt, re-audit the precedence chain end to end. | | `packages/opencode/src/installation/index.ts` | Updater detects/queries/installs `codev-code` (npm-family); GitHub fallback → quickbeard/codev-code. `method()` drops upstream's `~/.local/bin` → `curl` check, keeping only `~/.opencode/bin`. The `curl` upgrade branch refuses instead of running upstream's install script: `upgradeCurl` + `upgradeScriptShell` + the `Stream` import are removed, and `case "curl"` returns `UpgradeFailedError` pointing at `npm i -g codev-code` | `codev-code upgrade` and the update notification target OUR npm package, never stock opencode. brew/choco/scoop probes never match (no such packages). A `curl`-detected binary (in `~/.opencode/bin`) is a stock opencode install; piping upstream's `opencode.ai/install` script would silently replace the fork with stock opencode. `~/.local/bin` is dropped because it's also a common npm/bun global-bin prefix, so a legitimate package-manager install there was misdetected as curl (now falls through to the manager probes). | Keep our package names, the `~/.local/bin` removal, and the curl refusal; keep `upgradeCurl`/`upgradeScriptShell`/`Stream` deleted (take upstream's changes elsewhere). | | `packages/opencode/src/cli/cmd/uninstall.ts` | npm-family uninstall commands (display + exec maps) `opencode-ai` → `codev-code` | `codev uninstall` must remove the fork's actual npm package; the old name was a silent no-op for every npm-installed fork user. NOT renamed: brew/choco/scoop package names (`opencode` — the fork publishes no such formula/package, and `method()` never resolves to those for a fork install) and the curl `.opencode/bin` + `# opencode` shell markers (they match upstream install-script artifacts, not the fork's). | Keep our `codev-code` names; take upstream's surrounding changes. | | `packages/opencode/src/config/config.ts` | `share` defaults to `"disabled"` when unset | Sharing publishes sessions to upstream's share service; internal users must opt in via config. | Keep our default block. | -| Config-file rename: `packages/opencode/src/config/{config,managed,tui-migrate}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/cli/cmd/{mcp,plug,providers,error}.ts`, user-facing strings (`packages/{tui,app}` dialogs/tips/i18n, skill descriptions in `packages/core/src/plugin/skill.ts` + `packages/opencode/src/skill/index.ts`), bundled prompts (`customize-opencode.md`, `initialize.txt`), tests seeding config fixtures, docs (`packages/web/src/content/docs` en + es), stragglers (`.gitignore` root ignore entry, `packages/tui/src/component/dialog-provider.tsx` credential-dialog strings, `packages/tui/src/util/error.ts` model-not-found hint, `packages/opencode/script/run-workspace-server` header comment, `specs/v2/config.md` discovery prose) | Config file `opencode.json(c)` → `codev.json(c)` everywhere (global, project walk-up, config dirs, managed); global `config.json` support and the legacy TOML `config` migration removed; managed config dir `/Library/Application Support/opencode`→`…/codev`, `/etc/opencode`→`/etc/codev`, `%ProgramData%\opencode`→`…\codev` | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: the `$schema` URL `https://opencode.ai/config.json`, `@opencode-ai/*` packages, theme asset files named `opencode.json`, brew/scoop manifest URLs. | Keep our file names; take upstream's surrounding logic. Rename any new upstream `opencode.json`/global-`config.json` reference to `codev.json` (watch the not-renamed list). | +| Config-file rename: `packages/opencode/src/config/{config,managed,tui-migrate}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/cli/cmd/{mcp,plug,providers,error}.ts`, user-facing strings (`packages/{tui,app}` dialogs/tips/i18n, skill descriptions in `packages/core/src/plugin/skill.ts` + `packages/opencode/src/skill/index.ts`), bundled prompts (`customize-opencode.md`, `initialize.txt`), tests seeding config fixtures, stragglers (`.gitignore` root ignore entry, `packages/tui/src/component/dialog-provider.tsx` credential-dialog strings, `packages/tui/src/util/error.ts` model-not-found hint, `packages/opencode/script/run-workspace-server` header comment, `specs/v2/config.md` discovery prose) | Config file `opencode.json(c)` → `codev.json(c)` everywhere (global, project walk-up, config dirs, managed); global `config.json` support and the legacy TOML `config` migration removed; managed config dir `/Library/Application Support/opencode`→`…/codev`, `/etc/opencode`→`/etc/codev`, `%ProgramData%\opencode`→`…\codev` | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: the `$schema` URL `https://opencode.ai/config.json`, `@opencode-ai/*` packages, theme asset files named `opencode.json`, brew/scoop manifest URLs. | Keep our file names; take upstream's surrounding logic. Rename any new upstream `opencode.json`/global-`config.json` reference to `codev.json` (watch the not-renamed list). | | `.opencode/` (repo root, whole directory) | Renamed to `.codev/`; inner `opencode.jsonc` → `codev.jsonc`; internal `.opencode/` path mentions in `glossary/README.md`, `skills/effect/SKILL.md`, `command/translate.md` updated; the `opencode-local` reference → `codev-local` pointing at `~/.local/share/codev` | This is the repo's own dogfooding config dir; after the config-dir rename row below, the agent only discovers `.codev/`. | Keep our directory; re-apply upstream's `.opencode/**` changes into `.codev/` (sync surfaces them as modify/delete or add conflicts). | | Config-dir rename: `packages/opencode/src/config/{paths,config,tui}.ts`, `packages/core/src/config.ts`, `packages/opencode/src/plugin/install.ts`, `packages/opencode/src/plugin/tui/runtime.ts`, `packages/tui/src/context/theme.tsx`, `packages/opencode/src/cli/cmd/{agent,mcp}.ts`, `packages/opencode/src/session/session.ts`, plan permission patterns (`packages/opencode/src/agent/agent.ts`, `packages/core/src/plugin/agent.ts`), TUI tips, skill descriptions, `customize-opencode.md`, `specs/tui-plugins.md`, tests creating `.opencode` fixtures, docs (en + es) | Config directory `.opencode` → `.codev` (project walk-up, `~/.codev`, plans dir, theme/plugin discovery) | The fork's config surface uses the fork's name; hard rename, no legacy fallback. NOT renamed: `~/.opencode/bin` install paths (binary location — see installation/uninstall rows), the `ai.opencode.managed` plist domain, identifiers like provider id `opencode` and theme asset keys. | Keep our dir name; take upstream's surrounding logic. Rename any new upstream `.opencode` dir reference to `.codev` (leave `~/.opencode/bin`). | | `packages/tui/src/component/dialog-provider.tsx`, `packages/tui/src/component/dialog-model.tsx`, `packages/opencode/src/cli/cmd/providers.ts` | Filter `opencode`/`opencode-go` out of provider pickers and the `/model` dialog (model list + Favorites/Recent; the model dialog's opencode-first sort became a plain name sort) | Upstream's hosted offerings (Zen/Go) are detours for gateway users. | Keep our filters. | @@ -135,15 +135,14 @@ from the squash message first, or use a plain merge. | `CONTRIBUTING.md`, `SECURITY.md` | Product-brand prose "OpenCode" → "CoDev Code"; built-CLI command examples `opencode …` → `codev …` | Docs people actually read should name the fork's product. Upstream issue/advisory links, `packages/opencode` paths, and build-output paths stay upstream; env-var mentions follow the env-var rename row. | Keep our strings; take upstream's structural changes. | | `CONTEXT.md` | Product-brand prose "OpenCode" → "CoDev Code" (title, intro, and defined terms such as "CoDev Code Client" / "Embedded CoDev Code") | The V2 design glossary should name the fork's product; the renamed terms appear only in this file, so nothing desyncs. `@opencode-ai/*` package names stay upstream; env-var mentions follow the env-var rename row. | Keep our brand strings; take upstream's design changes (this file evolves with the V2 session core — merge content, re-apply the brand rename). | | `STATS.md` | Deleted | Upstream's download-stats log; meaningless for the fork. | Keep deleted. | -| Web docs, repo-wide (~70 files under `packages/web/src/content/docs/` en + `es/`) | Product-brand prose "OpenCode" → "CoDev Code" and built-CLI examples `opencode ` → `codev ` (incl. bare `opencode` invocations); XDG data/cache/config path examples corrected to match `Global.Path` (`app = "codev"` in `packages/core/src/global.ts`): `~/.local/share/opencode`→`…/codev`, `~/.cache/opencode`→`…/codev`, `$XDG_CONFIG_HOME/opencode/themes`→`…/codev/themes`, and the `%USERPROFILE%\…` Windows forms. **Install docs rewritten to the fork's real distribution** (`index.mdx`, `windows-wsl.mdx`, `gitlab.mdx` CI, en + es): the fork ships only as the npm package `codev-code` (npm/bun/pnpm/yarn) with GitHub release binaries at `quickbeard/codev-code` — matches `packages/opencode/src/installation/index.ts`. Removed the channels the fork does not publish (upstream's `curl … opencode.ai/install` script, `brew install anomalyco/tap/opencode`, Arch pacman/AUR, Chocolatey, Scoop, Mise `github:anomalyco/opencode`, `docker … ghcr.io/anomalyco/opencode`) and the `anomalyco/opencode/releases` link. `ide.mdx` (en + es) Manual Install rewritten from "search **OpenCode** in the Extension Marketplace" to building the `.vsix` from a checkout (`cd sdks/vscode && bun install && bun run vsix`, then `code --install-extension`) — the fork's extension has no Marketplace listing. NOT renamed (load-bearing / not ours): "OpenCode Zen" and "OpenCode Go" (+ their team refs and `opencode.ai/zen/...` URLs / `opencode`,`opencode-go` provider+model ids), every `opencode.ai` URL incl. the `$schema` values (`config.json`/`tui.json`/`theme.json`), `@opencode-ai/*` SDK/plugin packages, GitLab integration (third-party `nagyv/gitlab-opencode` component, its `@opencode` trigger, `anomalyco/opencode` repo refs; the GitHub integration is rebranded — see the `github.mdx` row), runtime defaults that still match code (`opencode.local` mDNS, `.well-known/opencode`, theme id/sound-pack `opencode`, default basic-auth username `opencode`), and third-party project names (`opencode.nvim`, `opencode-helicone-session`, `awesome-opencode`, etc.) | The published docs should name the fork's product and its `codev` CLI, and copy-pasteable commands/paths must work against the fork (binary `codev`, npm package `codev-code`, XDG dir `codev`); documenting install channels the fork doesn't publish sends users to stock opencode. The kept items are external products, real URLs/packages/integration identifiers, or runtime values that must match unchanged code. | Keep our brand/CLI/path/install strings; take upstream's structural doc changes. Rebrand any new upstream `opencode `/"OpenCode" prose and stale `opencode` XDG path, leaving the NOT-renamed list. If upstream re-adds brew/curl/choco/scoop/mise/docker install methods, drop them unless the fork actually publishes to that channel. | | Test prose across `packages/*/test`, `packages/opencode/test/lib` | describe titles + comments naming the CLI command or product: `opencode `/"opencode CLI"/"OpenCode" → `codev …`/"CoDev Code" (incl. help-snapshot keys/labels — regenerate the `.snap`, see the scriptName row). Functional names stay: `@opencode-ai/*`, `~/.opencode/bin` install paths, provider id `opencode`, fixture APIs (`opencode.run`, `OpencodeCli`), auth method `opencode-login`, default username `opencode`, upstream issue refs, third-party names. Config-file and config-dir fixtures follow the rename rows (`codev.json`, `.codev/`). | Test names/comments are read by people; identifiers are load-bearing. | Keep our prose; take upstream's test-logic changes. | | `README.*.md` (21 translations) | Deleted | Upstream marketing translations, irrelevant to the fork. | Keep deleted (`git rm` the upstream side of modify/delete conflicts). | | `screenshot-uk.png` | Deleted | Orphaned README-translation asset; referenced by nothing. | Keep deleted. | | `artifacts/` (whole directory) | Deleted | Upstream's Remotion marketing-video project (`glm52-rise-video`) with rendered MP4/PNG binaries committed; irrelevant to the fork and bloats every clone. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); delete new upstream additions under `artifacts/` too. | +| `packages/web/` + `packages/docs/` (whole directories) | Deleted | The Astro/Starlight docs site — which also carried upstream's marketing lander and the `/s/` share viewer, neither deployed by the fork — and an untouched Mintlify starter kit that nothing referenced. The fork's user-facing docs live in the [codev-landing-page](https://github.com/quickbeard/codev-landing-page) repo (`content/docs/code`), which every in-app docs link already points at (see the browser-opened docs-links row). The `sst.cloudflare.x.Astro("Web")` block in `infra/app.ts` was removed with it. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); delete any new upstream files under these directories too. | | `github/action.yml`, `github/index.ts`, `github/README.md` | Action name/prose "opencode" → "CoDev Code"; the action installs `codev-code` from npm (version from the npm registry, `npm install --prefix ~/.codev-code`, cache key `codev-*`) and runs `codev github run`; `mentions` input defaults to `/codev` (index.ts trigger matcher likewise); `share` input defaults to `"false"`; `use_github_token` defaults to `"true"`; README setup targets `quickbeard/codev-code/github@main` with GITHUB_TOKEN auth; index.ts spawns `codev serve`, generates `codev/*` branches, and rebrands visible strings | The action must install and run the fork's published CLI, not stock opencode. The fork has no GitHub App and its share service defaults off (config.ts row), so token exchange and sharing default off here too. NOT renamed: the `@opencode-ai/sdk` import, `api.opencode.ai` exchange endpoints, the `opencode-github-action` OIDC audience, `opencode.ai` share URLs, the social-cards URL, and internal identifiers (`createOpencode`, `assertOpencodeConnected`). | Keep our install steps, input defaults, and strings; take upstream's surrounding logic changes. | | `packages/opencode/src/cli/cmd/github.handler.ts` | CLI side of the GitHub integration rebranded to match `github/` (row above). `githubRun`: `MENTIONS` default `/opencode,/oc` → `/codev`, generated branches `opencode/*` → `codev/*`, comment footer `[opencode session]` → `[codev session]`, visible log/prompt strings "opencode" → "codev". `githubInstall`: no longer installs upstream's GitHub App (browser flow + `api.opencode.ai` install poll removed; the fork's action defaults to GITHUB_TOKEN auth); scaffolds `.github/workflows/codev.yml` (was `opencode.yml`) triggering on `/codev` with `contents`/`issues`/`pull-requests: write` permissions, `uses: quickbeard/codev-code/github@main`, and `GITHUB_TOKEN` in `env`; next-steps text says `/codev summarize` and links the fork's `github/` README. | The trigger phrase, branches, footer, and scaffolded workflow are user-facing and must match the fork's action defaults (`github/action.yml` row); the fork has no GitHub App to install. NOT renamed: `AGENT_USERNAME` `opencode-agent[bot]` (upstream App bot identity, used for reaction cleanup in the app-token path), `api.opencode.ai` exchange endpoints, the `opencode-github-action` OIDC audience, `opencode.ai` share URLs, and the social-cards URL. | Keep our trigger/branch/footer strings and the app-less install flow; take upstream's surrounding logic changes. If upstream adds new user-facing "opencode" strings or workflow scaffold changes, rebrand them the same way. | -| `packages/web/src/content/docs/github.mdx` (en + es) | GitHub-integration docs rebrand: trigger `/opencode`/`/oc` → `/codev`, workflow examples `.github/workflows/opencode*.yml` → `codev*.yml` with `uses: quickbeard/codev-code/github@main` and `GITHUB_TOKEN` in `env`; the "Install the GitHub app" manual-setup step removed (GITHUB_TOKEN auth is the default; `use_github_token`/`mentions` documented, upstream App documented as the opt-out `use_github_token: false` path); `share` documented as defaulting to false; example permissions swap `id-token: write` for the `contents`/`issues`/`pull-requests: write` the token path needs. | Docs must match the rebranded CLI handler + action defaults (rows above); documenting upstream's `/opencode` trigger and GitHub App would mislead fork users. | Keep our triggers, action ref, auth model, and defaults; take upstream's structural doc changes. | -| Project-repo links: `packages/tui/src/component/error-component.tsx`, `SECURITY.md`, `packages/web/src/content/docs/{troubleshooting,agents}.mdx` (en + es) | "This project's repo" links `github.com/anomalyco/opencode` → `github.com/quickbeard/codev-code`: the TUI crash screen's report-bug URL (`issues/new?template=bug-report.yml` — the fork's template keeps upstream's field ids incl. `opencode-version`, so the prefill params still work) and its auto-generated "Reported automatically from the opencode crash screen" prose → "codev"; SECURITY.md's report-a-vulnerability advisories link; troubleshooting's report-issues link and agents' submit-a-PR link | Crash reports, vulnerability reports, and contributions belong on the fork's repo, not upstream's. NOT repointed (deliberate upstream references): README attribution + CHANGELOG/DIVERGENCES upstream citations, upstream issue links in code comments (`mcp/index.ts`), model-persona prompt files, test fixtures (`github-remote.test.ts`, `shared.test.ts`), tree-sitter wasm download URLs, the disabled AUR/Homebrew section of `script/publish.ts`, `packages/{cli,ui,http-recorder}` manifest metadata (unpublished by the fork), console/stats/enterprise routes (not deployed by the fork), and desktop `copy-metainfo.ts` (desktop unshipped — revisit with the desktop bucket). | Keep our URLs and crash-screen prose; take upstream's surrounding changes. Repoint any new "report/contribute here" link; leave the NOT-repointed list. | +| Project-repo links: `packages/tui/src/component/error-component.tsx`, `SECURITY.md` | "This project's repo" links `github.com/anomalyco/opencode` → `github.com/quickbeard/codev-code`: the TUI crash screen's report-bug URL (`issues/new?template=bug-report.yml` — the fork's template keeps upstream's field ids incl. `opencode-version`, so the prefill params still work) and its auto-generated "Reported automatically from the opencode crash screen" prose → "codev"; SECURITY.md's report-a-vulnerability advisories link | Crash reports, vulnerability reports, and contributions belong on the fork's repo, not upstream's. NOT repointed (deliberate upstream references): README attribution + CHANGELOG/DIVERGENCES upstream citations, upstream issue links in code comments (`mcp/index.ts`), model-persona prompt files, test fixtures (`github-remote.test.ts`, `shared.test.ts`), tree-sitter wasm download URLs, the disabled AUR/Homebrew section of `script/publish.ts`, `packages/{cli,ui,http-recorder}` manifest metadata (unpublished by the fork), console/stats/enterprise routes (not deployed by the fork), and desktop `copy-metainfo.ts` (desktop unshipped — revisit with the desktop bucket). | Keep our URLs and crash-screen prose; take upstream's surrounding changes. Repoint any new "report/contribute here" link; leave the NOT-repointed list. | | `.github/TEAM_MEMBERS` | Deleted | Upstream's team roster. The five workflows that read it (pr-standards, pr-management, triage, duplicate-issues, compliance-close) fetch it from a `dev` branch this fork doesn't have, so they are already inert here. | Keep deleted. | | `packages/script/src/index.ts` | Guard the `.github/TEAM_MEMBERS` read: fall back to an empty team list when the file is absent instead of throwing at module load | This module is imported by the publish path (`publish.ts`); the deleted `TEAM_MEMBERS` (row above) made `bun run release` crash with ENOENT. `Script.team` has no consumers in the fork. | Keep our `exists()` guard; take upstream's surrounding changes. | | `.github/workflows/` — 22 upstream workflows deleted (beta, close-issues, close-prs, compliance-close, containers, deploy, docs-locale-sync, docs-update, duplicate-issues, generate, nix-hashes, notify-discord, opencode, pr-management, pr-standards, publish, publish-github-action, publish-vscode, release-github-action, review, stats, triage) | Deleted | All inert or upstream-only here: gated on `anomalyco/opencode`, publish/deploy to upstream infra, need upstream secrets (`OPENCODE_APP_SECRET`, `OPENCODE_API_KEY`, marketplace/Discord/PostHog tokens), trigger only on a `dev` branch the fork lacks, or read the deleted `TEAM_MEMBERS`. | Keep deleted; delete new upstream workflows too unless they're generic self-contained CI. | @@ -155,9 +154,8 @@ from the squash message first, or use a plain merge. | `sdks/vscode/package.json`, `sdks/vscode/src/extension.ts`, `sdks/vscode/README.md` | `name` `opencode` → `codev-code` (the extension ID is `publisher.name`); `displayName` "opencode" → "CoDev Code"; `publisher` `sst-dev` → `CoDev` (PLACEHOLDER — no such Marketplace publisher is registered; the mixed-case `CoDev` also isn't a valid Marketplace publisher id, which must be lowercase — fine for the sideloaded `.vsix` the fork ships, but replace with the real fork-owned lowercase publisher id before any `vsce publish`, and keep it in sync with the CLI auto-install target); `description` "opencode for VS Code" → "CoDev Code for VS Code"; `icon` `images/icon.png` is a fork-local generated PNG of the CoDev "c" badge (brand teal `#0891B2` on `#0a0a0a`, matching the `codev --mini` splash), with `images/icon.svg` as its source of record — replacing the earlier symlink to the shared `packages/identity` bracket mark; the two per-theme command `icon` objects (`{light,dark}` → `images/button-{dark,light}.svg`) collapse to a single `"images/button.svg"` string and `extension.ts`'s terminal `iconPath` object collapses to a single `Uri`, both pointing at a fork-local transparent teal `#0891B2` "c" glyph that reads on light+dark themes (replacing the two `packages/identity` bracket-mark symlinks, now deleted); `repository.url` → `github.com/quickbeard/codev-code`; command IDs `opencode.*` → `codev.*` across `contributes.commands`/`menus`/`keybindings` and the `registerCommand` calls; command/keybinding titles "Open opencode…"/"Run opencode"/"opencode: Insert At-Mentioned" → "Open CoDev Code…"/"Run CoDev Code"/"CoDev Code: Insert At-Mentioned" (keys unchanged); `TERMINAL_NAME` `opencode` → `codev` and the terminal launches `codev --port `; scripts gain `"vsix"` (`vsce package --no-dependencies --skip-license -o dist/`) with `@vscode/vsce` added as a pinned devDependency; README body rebranded and trimmed to the details-panel essentials — CoDev Code intro linking the fork repo, `npm install -g codev-code` prerequisite, and feature prose only; upstream's Support and Development/Making-Changes sections are dropped (they're contributor-facing, not end-user extension description) | The fork ships this extension as an installable `.vsix`, so every user-visible surface — palette titles, command IDs, terminal name, launched binary, details-panel README — must say codev, and the launched binary must be the fork's `codev` CLI. Distinct `codev.*` IDs also avoid clashing with upstream's extension if both are installed. `--no-dependencies` because the bundle is self-contained (no runtime deps, bun-managed lockfile); `--skip-license` because `sdks/vscode` has no LICENSE file and vsce aborts without it. | Keep our name + displayName + publisher + repository + description, command IDs + titles, `TERMINAL_NAME`, the `codev --port` launch line, the `vsix` script + `@vscode/vsce` devDependency, and the trimmed README (branding + dropped Support/Development sections); take upstream's extension-logic and manifest-structure changes. | | `packages/opencode/src/ide/index.ts` | IDE auto-install target `sst-dev.opencode` → `CoDev.codev-code` (`publisher.name` from `sdks/vscode/package.json`) | The CLI must install the fork's extension ID (`publisher.name` from `sdks/vscode/package.json`), not upstream's Marketplace listing. `Ide.install` currently has no runtime caller (only its test imports the module), and the install only resolves once the extension is actually published — until then the local `.vsix` is the supported install path. | Keep our extension ID (and re-sync it if the registered publisher id changes); take upstream's install/detection logic changes. | | Env-var rename, repo-wide (~230 files): both flag registries (`packages/core/src/flag/flag.ts`, `packages/opencode/src/effect/runtime-flags.ts`), every `process.env`/`Bun.env` read+set site across `packages/*`, `sdks/vscode`, `infra/enterprise.ts`, `nix/opencode.nix`, `turbo.json`, `.github/workflows/test.yml`, test preloads/fixtures/snapshots, docs (en + es), `SECURITY.md`, specs | `OPENCODE_*` env vars → `CODEV_*` (hard cutover, no legacy fallback), including the bundler define identifiers (`CODEV_VERSION`, `CODEV_CHANNEL`, `CODEV_MODELS_DEV`, `CODEV_LIBC`, `CODEV_CLI_NAME`, `CODEV_WORKER_PATH`), `VITE_OPENCODE_*` → `VITE_CODEV_*`, `import.meta.env.OPENCODE_CHANNEL` → `CODEV_CHANNEL`, the VSCode extension's `OPENCODE_CALLER`/`_EXTENSION_OPENCODE_PORT`, and the bare `OPENCODE=1` marker → `CODEV=1` | The fork's env surface uses the fork's name (reverses the earlier "internal names stay upstream" decision for env vars). NOT renamed: `__OPENCODE_PHOTON_WASM_PATH` and `__OPENCODE__` globals (not env vars; the photon name is baked into `patches/@silvia-odwyer%2Fphoton-node@0.3.4.patch`), `patches/install-korean-ime-fix.sh` script-local shell vars, upstream secret names in workflow-deletion notes, lowercase identifiers (`@opencode-ai/*`, URLs, provider id) | Keep our names; rename any new upstream `OPENCODE_*` env var (or define/`VITE_` name) to `CODEV_*` when syncing. | -| Locale dicts in `packages/{ui,app}/src/i18n/`, `packages/desktop/src/renderer/i18n/`, `packages/console/app/src/i18n/`, `packages/stats/app/src/i18n/`, `packages/web/src/content/i18n/`; translated docs dirs in `packages/web/src/content/docs/` | Deleted every locale except `en`/`es` (incl. `packages/app/src/i18n/parity.test.ts`) | Fork ships English + Spanish only. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); also delete any locale files upstream adds. | -| `packages/app/src/context/language.tsx`, `packages/app/src/entry.tsx`, `packages/desktop/src/renderer/i18n/index.ts`, `packages/console/app/src/i18n/index.ts`, `packages/console/app/src/lib/language.ts`, `packages/console/app/src/component/footer.tsx`, `packages/stats/app/src/i18n.ts`, `packages/web/src/i18n/locales.ts`, `packages/web/astro.config.mjs`, `packages/enterprise/src/app.tsx`, `packages/app/e2e/regression/session-timeline-locale-projection.spec.ts` | Locale registries trimmed to `en` + `es`: `Locale` types, LOCALES/LABEL/TAG/DOCS maps, dict loaders, accept-language matchers, starlight `locales` config; enterprise/entry `zh` special cases now use `es`; console footer always links Discord (Feishu was zh-only); e2e locale-projection spec tests `es` ("Explorado") instead of de/ar | Fork ships English + Spanish only. | Keep our trimmed lists; take upstream's structural changes and re-trim any new locale entries. | -| `packages/web/config.mjs`, `packages/web/astro.config.mjs`, `packages/web/src/components/Lander.astro`, `packages/web/src/assets/logo-light.svg`, `packages/web/src/assets/logo-dark.svg` | Docs-site header rebrand. config.mjs: `github` → `https://github.com/quickbeard/codev-code`, `discord` key removed. astro.config.mjs: starlight `title` `"OpenCode"` → `"CoDev Code"` (the browser-tab title suffix), `social` keeps only GitHub (Discord entry dropped), `editLink.baseUrl` `/edit/dev/` → `/edit/main/` (fork's default branch), logo `alt: "CoDev Code"`. Lander.astro: removed the footer Discord column and its unguarded `discord.href` read (the guarded Footer.astro Discord link disappears on its own once the social entry is gone). Logo SVGs replaced with the pixel-grid lowercase `codev` wordmark generated from `packages/tui/src/logo.ts` — dark: secondary teal `#0891B2` + shadow `#0A2C34`; light: secondary purple `#7B5BB6` + shadow `#DED6ED` (both shadows are `tint(background, secondary, 0.25)` per the TUI banner). | The docs header must point at the fork's repo and brand; the fork has no Discord community. | Keep our github URL, discord removals, edit-link branch, alt, and both logo SVGs wholesale; take upstream's surrounding config/markup changes. | +| Locale dicts in `packages/{ui,app}/src/i18n/`, `packages/desktop/src/renderer/i18n/`, `packages/console/app/src/i18n/`, `packages/stats/app/src/i18n/` | Deleted every locale except `en`/`es` (incl. `packages/app/src/i18n/parity.test.ts`) | Fork ships English + Spanish only. | Keep deleted (`git rm` the upstream side of modify/delete conflicts); also delete any locale files upstream adds. | +| `packages/app/src/context/language.tsx`, `packages/app/src/entry.tsx`, `packages/desktop/src/renderer/i18n/index.ts`, `packages/console/app/src/i18n/index.ts`, `packages/console/app/src/lib/language.ts`, `packages/console/app/src/component/footer.tsx`, `packages/stats/app/src/i18n.ts`, `packages/enterprise/src/app.tsx`, `packages/app/e2e/regression/session-timeline-locale-projection.spec.ts` | Locale registries trimmed to `en` + `es`: `Locale` types, LOCALES/LABEL/TAG/DOCS maps, dict loaders, accept-language matchers; enterprise/entry `zh` special cases now use `es`; console footer always links Discord (Feishu was zh-only); e2e locale-projection spec tests `es` ("Explorado") instead of de/ar | Fork ships English + Spanish only. | Keep our trimmed lists; take upstream's structural changes and re-trim any new locale entries. | | `packages/tui/src/component/prompt/autocomplete.tsx`, `packages/app/src/components/prompt-input.tsx`, `packages/opencode/src/cli/cmd/run/footer.prompt.tsx`, `packages/core/src/filesystem/search.ts`, `packages/tui/test/fixture/tui-sdk.ts`, `packages/opencode/test/cli/run/footer.view.test.tsx`, `packages/core/test/filesystem/search.test.ts` | `@` mention autocomplete lists file/directory results before references/agents/MCP resources; TUI and run-CLI menus cap the leading files so up to 3 non-file matches stay in the first visible page; web app group rank reordered to recent → file → reference → agent → resource (extracted into fork-only `prompt-input/at-options.ts`). TUI and run-CLI file resources track menu visibility so opening on an empty query fetches (previously nothing refetched until the query changed); core's ripgrep-fallback `find` returns its first entries for an empty query to mirror fff. Tests: tui-sdk fixture's `FetchHandler` gains an optional `method` arg, `renderFooter` accepts `findFiles`/`agents` overrides + a mention-menu ordering test, core search tests cover the fallback's empty query (fork-only test files: `packages/tui/test/prompt-autocomplete.test.tsx`, `packages/app/test-browser/prompt-at-options.test.ts`, `packages/app/src/components/prompt-input/at-options{,.test}.ts`) | Files are the dominant `@` use case; they should rank first and appear on a bare `@`. | Keep our ordering/reserve logic, resource source tracking, empty-query branch, fixture/test additions; take upstream's surrounding changes. | | `packages/slack/.gitignore`, `sdks/vscode/.gitignore` | Added the missing trailing newline (content unchanged) | Upstream's copies end without a newline; POSIX text files should end with one, and tools that concatenate or append to these files misbehave without it. | Whitespace-only: keep the trailing newline; take upstream's entries. | diff --git a/bun.lock b/bun.lock index 94db664c8e..7206896163 100644 --- a/bun.lock +++ b/bun.lock @@ -1030,40 +1030,6 @@ "solid-js": "^1.9.0", }, }, - "packages/web": { - "name": "@opencode-ai/web", - "version": "1.18.3-2", - "dependencies": { - "@astrojs/cloudflare": "12.6.3", - "@astrojs/markdown-remark": "6.3.1", - "@astrojs/solid-js": "5.1.0", - "@astrojs/starlight": "0.34.3", - "@fontsource/ibm-plex-mono": "5.2.5", - "@shikijs/transformers": "3.20.0", - "@solid-primitives/resize-observer": "2.1.5", - "@types/luxon": "catalog:", - "ai": "catalog:", - "astro": "5.7.13", - "diff": "catalog:", - "js-base64": "3.7.7", - "lang-map": "0.4.0", - "luxon": "catalog:", - "marked": "catalog:", - "marked-shiki": "catalog:", - "rehype-autolink-headings": "7.1.0", - "remeda": "catalog:", - "shiki": "catalog:", - "solid-js": "catalog:", - "toolbeam-docs-theme": "0.4.8", - "vscode-languageserver-types": "3.17.5", - }, - "devDependencies": { - "@astrojs/check": "0.9.6", - "@types/node": "catalog:", - "opencode": "workspace:*", - "typescript": "catalog:", - }, - }, }, "trustedDependencies": [ "esbuild", @@ -1232,34 +1198,6 @@ "@anycable/core": ["@anycable/core@0.9.2", "", { "dependencies": { "nanoevents": "^7.0.1" } }, "sha512-x5ZXDcW/N4cxWl93CnbHs/u7qq4793jS2kNPWm+duPrXlrva+ml2ZGT7X9tuOBKzyIHf60zWCdIK7TUgMPAwXA=="], - "@astrojs/check": ["@astrojs/check@0.9.6", "", { "dependencies": { "@astrojs/language-server": "^2.16.1", "chokidar": "^4.0.1", "kleur": "^4.1.5", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": "^5.0.0" }, "bin": { "astro-check": "bin/astro-check.js" } }, "sha512-jlaEu5SxvSgmfGIFfNgcn5/f+29H61NJzEMfAZ82Xopr4XBchXB1GVlcJsE+elUlsYSbXlptZLX+JMG3b/wZEA=="], - - "@astrojs/cloudflare": ["@astrojs/cloudflare@12.6.3", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.1", "@astrojs/underscore-redirects": "1.0.0", "@cloudflare/workers-types": "^4.20250507.0", "tinyglobby": "^0.2.13", "vite": "^6.3.5", "wrangler": "^4.14.1" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-xhJptF5tU2k5eo70nIMyL1Udma0CqmUEnGSlGyFflLqSY82CRQI6nWZ/xZt0ZvmXuErUjIx0YYQNfZsz5CNjLQ=="], - - "@astrojs/compiler": ["@astrojs/compiler@2.13.1", "", {}, "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg=="], - - "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.1", "", {}, "sha512-7dwEVigz9vUWDw3nRwLQ/yH/xYovlUA0ZD86xoeKEBmkz9O6iELG1yri67PgAPW6VLL/xInA4t7H0CK6VmtkKQ=="], - - "@astrojs/language-server": ["@astrojs/language-server@2.16.10", "", { "dependencies": { "@astrojs/compiler": "^2.13.1", "@astrojs/yaml2ts": "^0.2.4", "@jridgewell/sourcemap-codec": "^1.5.5", "@volar/kit": "~2.4.28", "@volar/language-core": "~2.4.28", "@volar/language-server": "~2.4.28", "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.16", "volar-service-css": "0.0.70", "volar-service-emmet": "0.0.70", "volar-service-html": "0.0.70", "volar-service-prettier": "0.0.70", "volar-service-typescript": "0.0.70", "volar-service-typescript-twoslash-queries": "0.0.70", "volar-service-yaml": "0.0.70", "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "peerDependencies": { "prettier": "^3.0.0", "prettier-plugin-astro": ">=0.11.0" }, "optionalPeers": ["prettier", "prettier-plugin-astro"], "bin": { "astro-ls": "./bin/nodeServer.js" } }, "sha512-87VQ/5GSdHlRnUA+hGuerYyIGAj+9RbZmATyuKLEUePinUXhQ5YkRnRrHhOD9sSi5JOErLjrLkHnfZFEvGrV8w=="], - - "@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.1", "", { "dependencies": { "@astrojs/internal-helpers": "0.6.1", "@astrojs/prism": "3.2.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.1.0", "js-yaml": "^4.1.0", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.1", "remark-smartypants": "^3.0.2", "shiki": "^3.0.0", "smol-toml": "^1.3.1", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1", "vfile": "^6.0.3" } }, "sha512-c5F5gGrkczUaTVgmMW9g1YMJGzOtRvjjhw6IfGuxarM6ct09MpwysP10US729dy07gg8y+ofVifezvP3BNsWZg=="], - - "@astrojs/mdx": ["@astrojs/mdx@4.3.14", "", { "dependencies": { "@astrojs/markdown-remark": "6.3.11", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.15.0", "es-module-lexer": "^1.7.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.0.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^5.0.0" } }, "sha512-FBrqJQORVm+rkRa2TS5CjU9PBA6hkhrwLVBSS9A77gN2+iehvjq1w6yya/d0YKC7osiVorKkr3Qd9wNbl0ZkGA=="], - - "@astrojs/prism": ["@astrojs/prism@3.2.0", "", { "dependencies": { "prismjs": "^1.29.0" } }, "sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw=="], - - "@astrojs/sitemap": ["@astrojs/sitemap@3.7.3", "", { "dependencies": { "sitemap": "^9.0.0", "stream-replace-string": "^2.0.0", "zod": "^4.3.6" } }, "sha512-f8euLVsyeAmAkSm/1M2Kb8sL8byQmfgbvBNaHFItCheTj/IpiJYSEWVcqDHZ/yEHxiS7+w87mQkzwZaPHmk5GA=="], - - "@astrojs/solid-js": ["@astrojs/solid-js@5.1.0", "", { "dependencies": { "vite": "^6.3.5", "vite-plugin-solid": "^2.11.6" }, "peerDependencies": { "solid-devtools": "^0.30.1", "solid-js": "^1.8.5" }, "optionalPeers": ["solid-devtools"] }, "sha512-VmPHOU9k7m6HHCT2Y1mNzifilUnttlowBM36frGcfj5wERJE9Ci0QtWJbzdf6AlcoIirb7xVw+ByupU011Di9w=="], - - "@astrojs/starlight": ["@astrojs/starlight@0.34.3", "", { "dependencies": { "@astrojs/markdown-remark": "^6.3.1", "@astrojs/mdx": "^4.2.3", "@astrojs/sitemap": "^3.3.0", "@pagefind/default-ui": "^1.3.0", "@types/hast": "^3.0.4", "@types/js-yaml": "^4.0.9", "@types/mdast": "^4.0.4", "astro-expressive-code": "^0.41.1", "bcp-47": "^2.1.0", "hast-util-from-html": "^2.0.1", "hast-util-select": "^6.0.2", "hast-util-to-string": "^3.0.0", "hastscript": "^9.0.0", "i18next": "^23.11.5", "js-yaml": "^4.1.0", "klona": "^2.0.6", "mdast-util-directive": "^3.0.0", "mdast-util-to-markdown": "^2.1.0", "mdast-util-to-string": "^4.0.0", "pagefind": "^1.3.0", "rehype": "^13.0.1", "rehype-format": "^5.0.0", "remark-directive": "^3.0.0", "ultrahtml": "^1.6.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "vfile": "^6.0.2" }, "peerDependencies": { "astro": "^5.5.0" } }, "sha512-MAuD3NF+E+QXJJuVKofoR6xcPTP4BJmYWeOBd03udVdubNGVnPnSWVZAi+ZtnTofES4+mJdp8BNGf+ubUxkiiA=="], - - "@astrojs/telemetry": ["@astrojs/telemetry@3.2.1", "", { "dependencies": { "ci-info": "^4.2.0", "debug": "^4.4.0", "dlv": "^1.1.3", "dset": "^3.1.4", "is-docker": "^3.0.0", "is-wsl": "^3.1.0", "which-pm-runs": "^1.1.0" } }, "sha512-SSVM820Jqc6wjsn7qYfV9qfeQvePtVc1nSofhyap7l0/iakUKywj3hfy3UJAOV4sGV4Q/u450RD4AaCaFvNPlg=="], - - "@astrojs/underscore-redirects": ["@astrojs/underscore-redirects@1.0.0", "", {}, "sha512-qZxHwVnmb5FXuvRsaIGaqWgnftjCuMY+GSbaVZdBmE4j8AfgPqKPxYp8SUERyJcjpKCEmO4wD6ybuGH8A2kVRQ=="], - - "@astrojs/yaml2ts": ["@astrojs/yaml2ts@0.2.4", "", { "dependencies": { "yaml": "^2.8.3" } }, "sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A=="], - "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], "@aws-crypto/crc32c": ["@aws-crypto/crc32c@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag=="], @@ -1454,8 +1392,6 @@ "@bufbuild/protoplugin": ["@bufbuild/protoplugin@2.12.0", "", { "dependencies": { "@bufbuild/protobuf": "2.12.0", "@typescript/vfs": "^1.6.2", "typescript": "5.4.5" } }, "sha512-ORlDITp8AFUXzIhLRoMCG+ud+D3MPKWb5HQXBoskMMnjeyEjE1H1qLonVNPyOr8lkx3xSfYUo8a0dvOZJVAzow=="], - "@capsizecss/unpack": ["@capsizecss/unpack@2.4.0", "", { "dependencies": { "blob-to-buffer": "^1.2.8", "cross-fetch": "^3.0.4", "fontkit": "^2.0.2" } }, "sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q=="], - "@clack/core": ["@clack/core@1.0.0-alpha.1", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-rFbCU83JnN7l3W1nfgCqqme4ZZvTTgsiKQ6FM0l+r0P+o2eJpExcocBUWUIwnDzL76Aca9VhUdWmB2MbUv+Qyg=="], "@clack/prompts": ["@clack/prompts@1.0.0-alpha.1", "", { "dependencies": { "@clack/core": "1.0.0-alpha.1", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-07MNT0OsxjKOcyVfX8KhXBhJiyUbDP1vuIAcHc+nx5v93MJO23pX3X/k3bWz6T3rpM9dgWPq90i4Jq7gZAyMbw=="], @@ -1488,8 +1424,6 @@ "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - "@ctrl/tinycolor": ["@ctrl/tinycolor@4.2.0", "", {}, "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A=="], - "@develar/schema-utils": ["@develar/schema-utils@2.6.5", "", { "dependencies": { "ajv": "^6.12.0", "ajv-keywords": "^3.4.1" } }, "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig=="], "@dnd-kit/abstract": ["@dnd-kit/abstract@0.5.0", "", { "dependencies": { "@dnd-kit/geometry": "^0.5.0", "@dnd-kit/state": "^0.5.0", "tslib": "^2.6.2" } }, "sha512-hi13iMJgjPX/KDYVKg5VeDIhmYiV6buc9bAX+tCLYf4QdyYjPbsXjn2sPo6m7fQ6SGJBEFgHJ2PemeKDUbwBaA=="], @@ -1534,20 +1468,6 @@ "@electron/windows-sign": ["@electron/windows-sign@1.2.2", "", { "dependencies": { "cross-dirname": "^0.1.0", "debug": "^4.3.4", "fs-extra": "^11.1.1", "minimist": "^1.2.8", "postject": "^1.0.0-alpha.6" }, "bin": { "electron-windows-sign": "bin/electron-windows-sign.js" } }, "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ=="], - "@emmetio/abbreviation": ["@emmetio/abbreviation@2.3.3", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA=="], - - "@emmetio/css-abbreviation": ["@emmetio/css-abbreviation@2.1.8", "", { "dependencies": { "@emmetio/scanner": "^1.0.4" } }, "sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw=="], - - "@emmetio/css-parser": ["@emmetio/css-parser@0.4.1", "", { "dependencies": { "@emmetio/stream-reader": "^2.2.0", "@emmetio/stream-reader-utils": "^0.1.0" } }, "sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ=="], - - "@emmetio/html-matcher": ["@emmetio/html-matcher@1.3.0", "", { "dependencies": { "@emmetio/scanner": "^1.0.0" } }, "sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ=="], - - "@emmetio/scanner": ["@emmetio/scanner@1.0.4", "", {}, "sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA=="], - - "@emmetio/stream-reader": ["@emmetio/stream-reader@2.2.0", "", {}, "sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw=="], - - "@emmetio/stream-reader-utils": ["@emmetio/stream-reader-utils@0.1.0", "", {}, "sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A=="], - "@emnapi/core": ["@emnapi/core@1.9.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA=="], "@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], @@ -1610,14 +1530,6 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@expressive-code/core": ["@expressive-code/core@0.41.7", "", { "dependencies": { "@ctrl/tinycolor": "^4.0.4", "hast-util-select": "^6.0.2", "hast-util-to-html": "^9.0.1", "hast-util-to-text": "^4.0.1", "hastscript": "^9.0.0", "postcss": "^8.4.38", "postcss-nested": "^6.0.1", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.1" } }, "sha512-ck92uZYZ9Wba2zxkiZLsZGi9N54pMSAVdrI9uW3Oo9AtLglD5RmrdTwbYPCT2S/jC36JGB2i+pnQtBm/Ib2+dg=="], - - "@expressive-code/plugin-frames": ["@expressive-code/plugin-frames@0.41.7", "", { "dependencies": { "@expressive-code/core": "^0.41.7" } }, "sha512-diKtxjQw/979cTglRFaMCY/sR6hWF0kSMg8jsKLXaZBSfGS0I/Hoe7Qds3vVEgeoW+GHHQzMcwvgx/MOIXhrTA=="], - - "@expressive-code/plugin-shiki": ["@expressive-code/plugin-shiki@0.41.7", "", { "dependencies": { "@expressive-code/core": "^0.41.7", "shiki": "^3.2.2" } }, "sha512-DL605bLrUOgqTdZ0Ot5MlTaWzppRkzzqzeGEu7ODnHF39IkEBbFdsC7pbl3LbUQ1DFtnfx6rD54k/cdofbW6KQ=="], - - "@expressive-code/plugin-text-markers": ["@expressive-code/plugin-text-markers@0.41.7", "", { "dependencies": { "@expressive-code/core": "^0.41.7" } }, "sha512-Ewpwuc5t6eFdZmWlFyeuy3e1PTQC0jFvw2Q+2bpcWXbOZhPLsT7+h8lsSIJxb5mS7wZko7cKyQ2RLYDyK6Fpmw=="], - "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="], "@fastify/busboy": ["@fastify/busboy@2.1.1", "", {}, "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA=="], @@ -1660,8 +1572,6 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], - "@fontsource/ibm-plex-mono": ["@fontsource/ibm-plex-mono@5.2.5", "", {}, "sha512-G09N3GfuT9qj3Ax2FDZvKqZttzM3v+cco2l8uXamhKyXLdmlaUDH5o88/C3vtTHj2oT7yRKsvxz9F+BXbWKMYA=="], - "@fontsource/inter": ["@fontsource/inter@5.2.8", "", {}, "sha512-P6r5WnJoKiNVV+zvW2xM13gNdFhAEpQ9dQJHt3naLvfg+LkF2ldgSLiF4T41lf1SQCM9QmkqPTn4TH568IRagg=="], "@gar/promise-retry": ["@gar/promise-retry@1.0.3", "", {}, "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA=="], @@ -1830,8 +1740,6 @@ "@malept/flatpak-bundler": ["@malept/flatpak-bundler@0.4.0", "", { "dependencies": { "debug": "^4.1.1", "fs-extra": "^9.0.0", "lodash": "^4.17.15", "tmp-promise": "^3.0.2" } }, "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q=="], - "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], "@mixmark-io/domino": ["@mixmark-io/domino@2.2.0", "", {}, "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw=="], @@ -2018,8 +1926,6 @@ "@opencode-ai/ui": ["@opencode-ai/ui@workspace:packages/ui"], - "@opencode-ai/web": ["@opencode-ai/web@workspace:packages/web"], - "@openrouter/ai-sdk-provider": ["@openrouter/ai-sdk-provider@2.9.0", "", { "peerDependencies": { "ai": "^6.0.0", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Seva+NCa0WUQnJIUE5GzHsUv1WTIeyqwz0ELl2VtS6NP+eF+77yCXGFVOMbvoCM7QMjlnhv7931e89R+8pJdcQ=="], "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], @@ -2270,22 +2176,6 @@ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.60.0", "", { "os": "win32", "cpu": "x64" }, "sha512-JOro4ZcfBLamJCyfURQmOQByoorgOdx3ZjAkSqnb/CyG/i+lN3KoV5LAgk5ZAW6DPq7/Cx7n23f8DuTWXTWgyQ=="], - "@pagefind/darwin-arm64": ["@pagefind/darwin-arm64@1.5.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-MXpI+7HsAdPkvJ0gk9xj9g541BCqBZOBbdwj9g6lB5LCj6kSV6nqDSjzcAJwvOsfu0fjwvC8hQU+ecfhp+MpiQ=="], - - "@pagefind/darwin-x64": ["@pagefind/darwin-x64@1.5.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-IojxFWMEJe0RQ7PQ3KXQsPIImNsbpPYpoZ+QUDrL8fAl/O27IX+LVLs74/UzEZy5uA2LD8Nz1AiwKr72vrkZQw=="], - - "@pagefind/default-ui": ["@pagefind/default-ui@1.5.2", "", {}, "sha512-pm1LMnQg8N2B3n2TnjKlhaFihpz6zTiA4HiGQ6/slKO/+8K9CAU5kcjdSSPgpuk1PMuuN4hxLipUIifnrkl3Sg=="], - - "@pagefind/freebsd-x64": ["@pagefind/freebsd-x64@1.5.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-7EVzo9+0w+2cbe671BtMj10UlNo83I+HrLVLfRxO731svHRJKUfJ/mo05gU14pe9PCfpKNQT8FS3Xc/oDN6pOA=="], - - "@pagefind/linux-arm64": ["@pagefind/linux-arm64@1.5.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Ovt9+K35sqzn8H3ZMXGwls4TD/wMJuvRtShHIsmUQREmaxjrDEX7gHckRCrwYJ4XE1H1p6HkLz3wukrAnsfXQw=="], - - "@pagefind/linux-x64": ["@pagefind/linux-x64@1.5.2", "", { "os": "linux", "cpu": "x64" }, "sha512-V+tFqHKXhQKq/WqPBD67AFy7scn1/aZID00ws4fSDd+1daSi5UHR9VVlRrOUYKxn3VuFQYRD7lYXdZK1WED1YA=="], - - "@pagefind/windows-arm64": ["@pagefind/windows-arm64@1.5.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-hN9Nh90fNW61nNRCW9ZyQrAj/mD0eRvmJ8NlTUzkbuW8kIzGJUi3cxjFkEcMZ5h/8FsKWD/VcouZl4yo1F7B6g=="], - - "@pagefind/windows-x64": ["@pagefind/windows-x64@1.5.2", "", { "os": "win32", "cpu": "x64" }, "sha512-Fa2Iyw7kaDRzGMfNYNUXNW2zbL5FQVDgSOcbDHdzBrDEdpqOqg8TcZ68F22ol6NJ9IGzvUdmeyZypLW5dyhqsg=="], - "@parcel/watcher": ["@parcel/watcher@2.5.1", "", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], @@ -2440,8 +2330,6 @@ "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], - "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.60.4", "", { "os": "android", "cpu": "arm" }, "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ=="], "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.60.4", "", { "os": "android", "cpu": "arm64" }, "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw=="], @@ -2862,14 +2750,10 @@ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], - "@types/express": ["@types/express@4.17.25", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="], "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.8", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA=="], - "@types/fontkit": ["@types/fontkit@2.0.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-qNYerFky3muCmZPq+R+B3cUDRA5OONw/oh6aGGFxx2LOBz6yu8eamKusrhkHnC6rc2fm76+G9z9QoWSB2SaQaw=="], - "@types/fs-extra": ["@types/fs-extra@9.0.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA=="], "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], @@ -2882,8 +2766,6 @@ "@types/is-stream": ["@types/is-stream@1.1.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg=="], - "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="], - "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], "@types/jsonwebtoken": ["@types/jsonwebtoken@8.5.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg=="], @@ -2906,8 +2788,6 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], - "@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -2940,8 +2820,6 @@ "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], - "@types/sax": ["@types/sax@1.2.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A=="], - "@types/scheduler": ["@types/scheduler@0.26.0", "", {}, "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA=="], "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="], @@ -3026,22 +2904,6 @@ "@vitest/utils": ["@vitest/utils@4.1.7", "", { "dependencies": { "@vitest/pretty-format": "4.1.7", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-T532WBu791cBxJlCl6SO+J14l81DQx6uQHm1bQbmCDY7nqlEIgkza/UFnSBNaUtSf41unldDFjdOBYEQC4b5Hw=="], - "@volar/kit": ["@volar/kit@2.4.28", "", { "dependencies": { "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "typesafe-path": "^0.2.2", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "typescript": "*" } }, "sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg=="], - - "@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], - - "@volar/language-server": ["@volar/language-server@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "@volar/language-service": "2.4.28", "@volar/typescript": "2.4.28", "path-browserify": "^1.0.1", "request-light": "^0.7.0", "vscode-languageserver": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw=="], - - "@volar/language-service": ["@volar/language-service@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" } }, "sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw=="], - - "@volar/source-map": ["@volar/source-map@2.4.28", "", {}, "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ=="], - - "@volar/typescript": ["@volar/typescript@2.4.28", "", { "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw=="], - - "@vscode/emmet-helper": ["@vscode/emmet-helper@2.11.0", "", { "dependencies": { "emmet": "^2.4.3", "jsonc-parser": "^2.3.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.15.1", "vscode-uri": "^3.0.8" } }, "sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw=="], - - "@vscode/l10n": ["@vscode/l10n@0.0.18", "", {}, "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ=="], - "@webcontainer/env": ["@webcontainer/env@1.1.1", "", {}, "sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng=="], "@webgpu/types": ["@webgpu/types@0.1.54", "", {}, "sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg=="], @@ -3060,8 +2922,6 @@ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], @@ -3074,14 +2934,10 @@ "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], - "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], - "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], - "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="], - "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], @@ -3116,8 +2972,6 @@ "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="], - "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], - "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], "array.prototype.map": ["array.prototype.map@1.0.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-array-method-boxes-properly": "^1.0.0", "es-object-atoms": "^1.0.0", "is-string": "^1.1.1" } }, "sha512-YocPM7bYYu2hXGxWpb5vwZ8cMeudNHYtYBcUDY4Z1GWa53qcnQMWSl25jeBHNzitjl9HW2AWW4ro/S/nftUaOQ=="], @@ -3136,12 +2990,6 @@ "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], - "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], - - "astro": ["astro@5.7.13", "", { "dependencies": { "@astrojs/compiler": "^2.11.0", "@astrojs/internal-helpers": "0.6.1", "@astrojs/markdown-remark": "6.3.1", "@astrojs/telemetry": "3.2.1", "@capsizecss/unpack": "^2.4.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.1.4", "acorn": "^8.14.1", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "boxen": "8.0.1", "ci-info": "^4.2.0", "clsx": "^2.1.1", "common-ancestor-path": "^1.0.1", "cookie": "^1.0.2", "cssesc": "^3.0.0", "debug": "^4.4.0", "deterministic-object-hash": "^2.0.2", "devalue": "^5.1.1", "diff": "^5.2.0", "dlv": "^1.1.3", "dset": "^3.1.4", "es-module-lexer": "^1.6.0", "esbuild": "^0.25.0", "estree-walker": "^3.0.3", "flattie": "^1.1.1", "fontace": "~0.3.0", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.1.1", "js-yaml": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.17", "magicast": "^0.3.5", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "p-limit": "^6.2.0", "p-queue": "^8.1.0", "package-manager-detector": "^1.1.0", "picomatch": "^4.0.2", "prompts": "^2.4.2", "rehype": "^13.0.2", "semver": "^7.7.1", "shiki": "^3.2.1", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.12", "tsconfck": "^3.1.5", "ultrahtml": "^1.6.0", "unifont": "~0.5.0", "unist-util-visit": "^5.0.0", "unstorage": "^1.15.0", "vfile": "^6.0.3", "vite": "^6.3.4", "vitefu": "^1.0.6", "xxhash-wasm": "^1.1.0", "yargs-parser": "^21.1.1", "yocto-spinner": "^0.2.1", "zod": "^3.24.2", "zod-to-json-schema": "^3.24.5", "zod-to-ts": "^1.2.0" }, "optionalDependencies": { "sharp": "^0.33.3" }, "bin": { "astro": "astro.js" } }, "sha512-cRGq2llKOhV3XMcYwQpfBIUcssN6HEK5CRbcMxAfd9OcFhvWE7KUy50zLioAZVVl3AqgUTJoNTlmZfD2eG0G1w=="], - - "astro-expressive-code": ["astro-expressive-code@0.41.7", "", { "dependencies": { "rehype-expressive-code": "^0.41.7" }, "peerDependencies": { "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" } }, "sha512-hUpogGc6DdAd+I7pPXsctyYPRBJDK7Q7d06s4cyP0Vz3OcbziP3FNzN0jZci1BpCvLn9675DvS7B9ctKKX64JQ=="], - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], @@ -3172,8 +3020,6 @@ "axios": ["axios@1.16.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="], - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "b4a": ["b4a@1.8.1", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw=="], "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], @@ -3184,8 +3030,6 @@ "babel-preset-solid": ["babel-preset-solid@1.9.12", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.6" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.12" }, "optionalPeers": ["solid-js"] }, "sha512-LLqnuKVDlKpyBlMPcH6qEvs/wmS9a+NczppxJ3ryS/c0O5IiSFOIBQi9GzyiGDSbcJpx4Gr87jyFTos1MyEuWg=="], - "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], - "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "bare-events": ["bare-events@2.8.3", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-HdUm8EMQBLaJvGUdidNNbqpA1kYkwNcb+MYxkxCLAPJGQzlv9J0C24h8V65Z4c5GLd/JEALDvpFCQgpLJqc0zw=="], @@ -3200,16 +3044,10 @@ "bare-url": ["bare-url@2.4.3", "", { "dependencies": { "bare-path": "^3.0.0" } }, "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ=="], - "base-64": ["base-64@1.0.0", "", {}, "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg=="], - "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.10.33", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-bA6+tcSLpz2tIEdDXZPpPTIuxBcC4+w6SieaYyfigIa4h8GlFxbA17v22Vx3JUtuZQj9SgOsnbK+aTBzyDyEuw=="], - "bcp-47": ["bcp-47@2.1.0", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w=="], - - "bcp-47-match": ["bcp-47-match@2.0.3", "", {}, "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ=="], - "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="], "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], @@ -3222,8 +3060,6 @@ "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - "blob-to-buffer": ["blob-to-buffer@1.2.9", "", {}, "sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA=="], - "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], "body-parser": ["body-parser@1.20.5", "", { "dependencies": { "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "~1.2.0", "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" } }, "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA=="], @@ -3238,14 +3074,10 @@ "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], - "boxen": ["boxen@8.0.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^8.0.0", "chalk": "^5.3.0", "cli-boxes": "^3.0.0", "string-width": "^7.2.0", "type-fest": "^4.21.0", "widest-line": "^5.0.0", "wrap-ansi": "^9.0.0" } }, "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw=="], - "brace-expansion": ["brace-expansion@5.0.6", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "brotli": ["brotli@1.3.3", "", { "dependencies": { "base64-js": "^1.1.2" } }, "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg=="], - "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], @@ -3292,8 +3124,6 @@ "camel-case": ["camel-case@4.1.2", "", { "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" } }, "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw=="], - "camelcase": ["camelcase@8.0.0", "", {}, "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA=="], - "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], @@ -3306,14 +3136,10 @@ "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], - "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], - "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], - "chart.js": ["chart.js@4.5.1", "", { "dependencies": { "@kurkle/color": "^0.3.0" } }, "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw=="], "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], @@ -3336,8 +3162,6 @@ "clean-css": ["clean-css@5.3.3", "", { "dependencies": { "source-map": "~0.6.0" } }, "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg=="], - "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="], - "cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="], "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="], @@ -3346,20 +3170,14 @@ "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], - "clone": ["clone@2.1.2", "", {}, "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w=="], - "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], "cloudflare": ["cloudflare@5.2.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-dVzqDpPFYR9ApEC9e+JJshFJZXcw4HzM8W+3DHzO5oy9+8rLC53G7x6fEf9A7/gSuSCxuvndzui5qJKftfIM9A=="], - "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], - "cluster-key-slot": ["cluster-key-slot@1.1.1", "", {}, "sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw=="], "cmd-shim": ["cmd-shim@8.0.0", "", {}, "sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA=="], - "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], - "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -3400,7 +3218,7 @@ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "cookie-es": ["cookie-es@2.0.1", "", {}, "sha512-aVf4A4hI2w70LnF7GG+7xDQUkliwiXWXFvTjkip4+b64ygDQ2sJPRSKFDHbxn8o0xu9QzPkMuuiWIXyFSE2slA=="], @@ -3426,10 +3244,6 @@ "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], - "css-selector-parser": ["css-selector-parser@3.3.0", "", {}, "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g=="], - - "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], @@ -3470,8 +3284,6 @@ "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], - "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], - "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], @@ -3512,14 +3324,8 @@ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], - - "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="], - "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "dfa": ["dfa@1.2.0", "", {}, "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="], - "diacritics": ["diacritics@1.3.0", "", {}, "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA=="], "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], @@ -3530,8 +3336,6 @@ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - "direction": ["direction@2.0.1", "", { "bin": { "direction": "cli.js" } }, "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA=="], - "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], "dmg-builder": ["dmg-builder@26.15.2", "", { "dependencies": { "app-builder-lib": "26.15.2", "builder-util": "26.15.0", "fs-extra": "^10.1.0", "js-yaml": "^4.1.0" } }, "sha512-fMkjRqKyPtsz4Kzu/qGP0BGjqzMCIgp+/7kw/u6YH6lvn/8hvL3c0TXhoFayBoYdpPCnEinnCHztd4bW7/jetA=="], @@ -3564,8 +3368,6 @@ "drizzle-orm": ["drizzle-orm@1.0.0-rc.2", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@effect/sql-pg": ">=4.0.0-beta.58 || >=4.0.0", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@sinclair/typebox": ">=0.34.8", "@sqlitecloud/drivers": ">=1.0.653", "@tidbcloud/serverless": "*", "@tursodatabase/database": ">=0.2.1", "@tursodatabase/database-common": ">=0.2.1", "@tursodatabase/database-wasm": ">=0.2.1", "@types/better-sqlite3": "*", "@types/mssql": "^9.1.4", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "arktype": ">=2.0.0", "better-sqlite3": ">=9.3.0", "bun-types": "*", "effect": ">=4.0.0-beta.58 || >=4.0.0", "expo-sqlite": ">=14.0.0", "mssql": "^11.0.1", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5", "typebox": ">=1.0.0", "valibot": ">=1.0.0-beta.7", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@effect/sql-pg", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@sinclair/typebox", "@sqlitecloud/drivers", "@tidbcloud/serverless", "@tursodatabase/database", "@tursodatabase/database-common", "@tursodatabase/database-wasm", "@types/better-sqlite3", "@types/mssql", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "arktype", "better-sqlite3", "bun-types", "effect", "expo-sqlite", "mssql", "mysql2", "pg", "postgres", "sql.js", "sqlite3", "typebox", "valibot", "zod"] }, "sha512-UXYDkbplF5wX0hwxll+80QhEwUvAJLBu+tAK/d4fna18kLE6VuliAzufF/ieDEIJeSnLRYgtmsXD6x1Xuy1kIg=="], - "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "duplexer2": ["duplexer2@0.1.4", "", { "dependencies": { "readable-stream": "^2.0.2" } }, "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA=="], @@ -3610,8 +3412,6 @@ "electron-winstaller": ["electron-winstaller@5.4.0", "", { "dependencies": { "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.21", "temp": "^0.9.0" }, "optionalDependencies": { "@electron/windows-sign": "^1.1.2" } }, "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg=="], - "emmet": ["emmet@2.4.11", "", { "dependencies": { "@emmetio/abbreviation": "^2.3.3", "@emmetio/css-abbreviation": "^2.1.8" } }, "sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ=="], - "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], @@ -3658,10 +3458,6 @@ "es6-error": ["es6-error@4.1.1", "", {}, "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg=="], - "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], - - "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], - "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "esbuild-plugin-copy": ["esbuild-plugin-copy@2.1.1", "", { "dependencies": { "chalk": "^4.1.2", "chokidar": "^3.5.3", "fs-extra": "^10.0.1", "globby": "^11.0.3" }, "peerDependencies": { "esbuild": ">= 0.14.0" } }, "sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw=="], @@ -3676,18 +3472,6 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], - - "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], - - "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], - - "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], - - "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], - - "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], @@ -3716,8 +3500,6 @@ "express-rate-limit": ["express-rate-limit@8.5.2", "", { "dependencies": { "ip-address": "^10.2.0" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A=="], - "expressive-code": ["expressive-code@0.41.7", "", { "dependencies": { "@expressive-code/core": "^0.41.7", "@expressive-code/plugin-frames": "^0.41.7", "@expressive-code/plugin-shiki": "^0.41.7", "@expressive-code/plugin-text-markers": "^0.41.7" } }, "sha512-2wZjC8OQ3TaVEMcBtYY4Va3lo6J+Ai9jf3d4dbhURMJcU4Pbqe6EcHe424MIZI0VHUA1bR6xdpoHYi3yxokWqA=="], - "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], "ext-list": ["ext-list@2.2.2", "", { "dependencies": { "mime-db": "^1.28.0" } }, "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA=="], @@ -3782,14 +3564,8 @@ "finity": ["finity@0.5.4", "", {}, "sha512-3l+5/1tuw616Lgb0QBimxfdd2TqaDGpfCBpfX6EqtFmqUV3FtQnVEX4Aa62DagYEqnsTIjZcTfbq9msDbXYgyA=="], - "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], - "follow-redirects": ["follow-redirects@1.16.0", "", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], - "fontace": ["fontace@0.3.1", "", { "dependencies": { "@types/fontkit": "^2.0.8", "fontkit": "^2.0.4" } }, "sha512-9f5g4feWT1jWT8+SbL85aLIRLIXUaDygaM2xPXRmzPYxrOMNok79Lr3FGJoKVNKibE0WCunNiEVG2mwuE+2qEg=="], - - "fontkit": ["fontkit@2.0.4", "", { "dependencies": { "@swc/helpers": "^0.5.12", "brotli": "^1.3.2", "clone": "^2.1.2", "dfa": "^1.2.0", "fast-deep-equal": "^3.1.3", "restructure": "^3.0.0", "tiny-inflate": "^1.0.3", "unicode-properties": "^1.4.0", "unicode-trie": "^2.0.0" } }, "sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g=="], - "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], @@ -3858,8 +3634,6 @@ "giget": ["giget@2.0.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "defu": "^6.1.4", "node-fetch-native": "^1.6.6", "nypm": "^0.6.0", "pathe": "^2.0.3" }, "bin": { "giget": "dist/cli.mjs" } }, "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA=="], - "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "gitlab-ai-provider": ["gitlab-ai-provider@6.11.1", "", { "dependencies": { "@anthropic-ai/sdk": "^0.71.0", "@anycable/core": "^0.9.2", "graphql-request": "^6.1.0", "isomorphic-ws": "^5.0.0", "openai": "^6.16.0", "socket.io-client": "^4.8.1", "vscode-jsonrpc": "^8.2.1", "zod": "^3.25.76" }, "peerDependencies": { "@ai-sdk/provider": ">=3.0.0", "@ai-sdk/provider-utils": ">=4.0.0" } }, "sha512-SJ6f5qa7P8md6lPrserryER3zerLkrezlnqqYQ2AbvDPpHLbwtbyk0FYJ5kNRcmbI80i/VMcsMBP0YIRdc3ucQ=="], "glob": ["glob@13.0.5", "", { "dependencies": { "minimatch": "^10.2.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-BzXxZg24Ibra1pbQ/zE7Kys4Ua1ks7Bn6pKLkVPZ9FZe4JQS6/Q7ef3LG1H+k7lUf5l4T3PLSyYyYJVYUvfgTw=="], @@ -3910,48 +3684,10 @@ "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], - "hast-util-embedded": ["hast-util-embedded@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA=="], - - "hast-util-format": ["hast-util-format@1.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-minify-whitespace": "^1.0.0", "hast-util-phrasing": "^3.0.0", "hast-util-whitespace": "^3.0.0", "html-whitespace-sensitive-tag-names": "^3.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA=="], - - "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], - - "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], - - "hast-util-has-property": ["hast-util-has-property@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA=="], - - "hast-util-heading-rank": ["hast-util-heading-rank@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA=="], - - "hast-util-is-body-ok-link": ["hast-util-is-body-ok-link@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ=="], - - "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], - - "hast-util-minify-whitespace": ["hast-util-minify-whitespace@1.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-is-element": "^3.0.0", "hast-util-whitespace": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw=="], - - "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="], - - "hast-util-phrasing": ["hast-util-phrasing@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-embedded": "^3.0.0", "hast-util-has-property": "^3.0.0", "hast-util-is-body-ok-link": "^3.0.0", "hast-util-is-element": "^3.0.0" } }, "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ=="], - - "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], - - "hast-util-select": ["hast-util-select@6.0.4", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "bcp-47-match": "^2.0.0", "comma-separated-tokens": "^2.0.0", "css-selector-parser": "^3.0.0", "devlop": "^1.0.0", "direction": "^2.0.0", "hast-util-has-property": "^3.0.0", "hast-util-to-string": "^3.0.0", "hast-util-whitespace": "^3.0.0", "nth-check": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw=="], - - "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], - "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], - - "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], - - "hast-util-to-string": ["hast-util-to-string@3.0.1", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A=="], - - "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], - "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], - "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], - "he": ["he@1.2.0", "", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], "heap-snapshot-toolkit": ["heap-snapshot-toolkit@1.1.3", "", {}, "sha512-joThu2rEsDu8/l4arupRDI1qP4CZXNG+J6Wr348vnbLGSiBkwRdqZ6aOHl5BzEiC+Dc8OTbMlmWjD0lbXD5K2Q=="], @@ -3966,7 +3702,7 @@ "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], - "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], "html-minifier-terser": ["html-minifier-terser@7.2.0", "", { "dependencies": { "camel-case": "^4.1.2", "clean-css": "~5.3.2", "commander": "^10.0.0", "entities": "^4.4.0", "param-case": "^3.0.4", "relateurl": "^0.2.7", "terser": "^5.15.1" }, "bin": { "html-minifier-terser": "cli.js" } }, "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA=="], @@ -3976,8 +3712,6 @@ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], - "html-whitespace-sensitive-tag-names": ["html-whitespace-sensitive-tag-names@3.0.1", "", {}, "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA=="], - "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], @@ -3998,8 +3732,6 @@ "i18n-iso-countries": ["i18n-iso-countries@7.14.0", "", { "dependencies": { "diacritics": "1.3.0" } }, "sha512-nXHJZYtNrfsi1UQbyRqm3Gou431elgLjKl//CYlnBGt5aTWdRPH1PiS2T/p/n8Q8LnqYqzQJik3Q7mkwvLokeg=="], - "i18next": ["i18next@23.16.8", "", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg=="], - "iconv-corefoundation": ["iconv-corefoundation@1.1.7", "", { "dependencies": { "cli-truncate": "^2.1.0", "node-addon-api": "^1.6.3" }, "os": "darwin" }, "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ=="], "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="], @@ -4014,8 +3746,6 @@ "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="], - "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="], - "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], @@ -4036,12 +3766,6 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], - - "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], - - "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], - "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], @@ -4066,8 +3790,6 @@ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], - "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-electron": ["is-electron@2.2.2", "", {}, "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg=="], @@ -4084,8 +3806,6 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], - "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], @@ -4098,7 +3818,7 @@ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + "is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], @@ -4222,14 +3942,8 @@ "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - "klona": ["klona@2.0.6", "", {}, "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA=="], - "kubernetes-types": ["kubernetes-types@1.30.0", "", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="], - "lang-map": ["lang-map@0.4.0", "", { "dependencies": { "language-map": "^1.1.0" } }, "sha512-oiSqZIEUnWdFeDNsp4HId4tAxdFbx5iMBOwA3666Fn2L8Khj8NiD9xRvMsGmKXopPVkaDFtSv3CJOmXFUB0Hcg=="], - - "language-map": ["language-map@1.5.0", "", {}, "sha512-n7gFZpe+DwEAX9cXVTw43i3wiudWDDtSn28RmdnS/HCPr284dQI/SztsamWanRr75oSlKSaGbV2nmWCTzGCoVg=="], - "lazy-val": ["lazy-val@1.0.5", "", {}, "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="], "lazystream": ["lazystream@1.0.1", "", { "dependencies": { "readable-stream": "^2.0.5" } }, "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw=="], @@ -4290,8 +4004,6 @@ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], - "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], @@ -4312,16 +4024,12 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "magicast": ["magicast@0.3.5", "", { "dependencies": { "@babel/parser": "^7.25.4", "@babel/types": "^7.25.4", "source-map-js": "^1.2.0" } }, "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ=="], + "magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="], "make-fetch-happen": ["make-fetch-happen@15.0.6", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/agent": "^4.0.0", "@npmcli/redact": "^4.0.0", "cacache": "^20.0.1", "http-cache-semantics": "^4.1.1", "minipass": "^7.0.2", "minipass-fetch": "^5.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^1.0.0", "proc-log": "^6.0.0", "ssri": "^13.0.0" } }, "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw=="], - "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], - - "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], - "marked": ["marked@17.0.6", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-gB0gkNafnonOw0obSTEGZTT86IuhILt2Wfx0mWH/1Au83kybTayroZ/V6nS25mN7u8ASy+5fMhgB3XPNrOZdmA=="], "marked-katex-extension": ["marked-katex-extension@5.1.6", "", { "peerDependencies": { "katex": ">=0.16 <0.17", "marked": ">=4 <18" } }, "sha512-vYpLXwmlIDKILIhJtiRTgdyZRn5sEYdFBuTmbpjD7lbCIzg0/DWyK3HXIntN3Tp8zV6hvOUgpZNLWRCgWVc24A=="], @@ -4334,44 +4042,8 @@ "md-to-react-email": ["md-to-react-email@5.0.0", "", { "dependencies": { "marked": "7.0.4" }, "peerDependencies": { "react": "18.x" } }, "sha512-GdBrBUbAAJHypnuyofYGfVos8oUslxHx69hs3CW9P0L8mS1sT6GnJuMBTlz/Fw+2widiwdavcu9UwyLF/BzZ4w=="], - "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], - - "mdast-util-directive": ["mdast-util-directive@3.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q=="], - - "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], - - "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], - - "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], - - "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], - - "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], - - "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], - - "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], - - "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], - - "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], - - "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], - - "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], - - "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], - - "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], - "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], - "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], - - "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], - - "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="], "merge-anything": ["merge-anything@5.1.7", "", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-eRtbOb1N5iyH0tkQDAoQ4Ipsp/5qSR79Dzrz8hEPxRX10RWWR/iQXdoKmBSRCThY1Fh5EhISDtpSc93fpxUniQ=="], @@ -4384,74 +4056,12 @@ "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="], - "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], - - "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], - - "micromark-extension-directive": ["micromark-extension-directive@3.0.2", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "parse-entities": "^4.0.0" } }, "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA=="], - - "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], - - "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], - - "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], - - "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], - - "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], - - "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], - - "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], - - "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], - - "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], - - "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], - - "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], - - "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], - - "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], - - "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], - - "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], - - "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], - - "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], - - "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], - "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], - "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], - - "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], - - "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], - - "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], - - "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], - "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], - "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], - - "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], - - "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], - - "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], - "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], - "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], - "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], @@ -4502,16 +4112,12 @@ "motion-utils": ["motion-utils@12.29.2", "", {}, "sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A=="], - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], - "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "msgpackr": ["msgpackr@2.0.2", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ=="], "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], - "muggle-string": ["muggle-string@0.4.1", "", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], - "multicast-dns": ["multicast-dns@7.2.5", "", { "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" }, "bin": { "multicast-dns": "cli.js" } }, "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg=="], "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], @@ -4530,14 +4136,10 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], - "nf3": ["nf3@0.1.12", "", {}, "sha512-qbMXT7RTGh74MYWPeqTIED8nDW70NXOULVHpdWcdZ7IVHVnAsMV9fNugSNnvooipDc1FMOzpis7T9nXJEbJhvQ=="], "nitro": ["nitro@3.0.1-alpha.1", "", { "dependencies": { "consola": "^3.4.2", "crossws": "^0.4.1", "db0": "^0.3.4", "h3": "2.0.1-rc.5", "jiti": "^2.6.1", "nf3": "^0.1.10", "ofetch": "^2.0.0-alpha.3", "ohash": "^2.0.11", "oxc-minify": "^0.96.0", "oxc-transform": "^0.96.0", "srvx": "^0.9.5", "undici": "^7.16.0", "unenv": "^2.0.0-rc.24", "unstorage": "^2.0.0-alpha.4" }, "peerDependencies": { "rolldown": "*", "rollup": "^4", "vite": "^7", "xml2js": "^0.6.2" }, "optionalPeers": ["rolldown", "rollup", "vite", "xml2js"], "bin": { "nitro": "dist/cli/index.mjs" } }, "sha512-U4AxIsXxdkxzkFrK0XAw0e5Qbojk8jQ50MjjRBtBakC4HurTtQoiZvF+lSe382jhuQZCfAyywGWOFa9QzXLFaw=="], - "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], - "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], "node-abi": ["node-abi@4.31.0", "", { "dependencies": { "semver": "^7.6.3" } }, "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw=="], @@ -4562,8 +4164,6 @@ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="], - "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], - "node-releases": ["node-releases@2.0.46", "", {}, "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ=="], "nopt": ["nopt@9.0.0", "", { "dependencies": { "abbrev": "^4.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw=="], @@ -4658,38 +4258,28 @@ "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="], - "p-limit": ["p-limit@6.2.0", "", { "dependencies": { "yocto-queue": "^1.1.1" } }, "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA=="], + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], "p-map": ["p-map@7.0.4", "", {}, "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ=="], - "p-queue": ["p-queue@8.1.1", "", { "dependencies": { "eventemitter3": "^5.0.1", "p-timeout": "^6.1.2" } }, "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ=="], + "p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="], - "p-timeout": ["p-timeout@6.1.4", "", {}, "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg=="], + "p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], - "pacote": ["pacote@21.5.0", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@npmcli/git": "^7.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/promise-spawn": "^9.0.0", "@npmcli/run-script": "^10.0.0", "cacache": "^20.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^13.0.0", "npm-packlist": "^10.0.1", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "proc-log": "^6.0.0", "sigstore": "^4.0.0", "ssri": "^13.0.0", "tar": "^7.4.3" }, "bin": { "pacote": "bin/index.js" } }, "sha512-VtZ0SB8mb5Tzw3dXDfVAIjhyVKUHZkS/ZH9/5mpKenwC9sFOXNI0JI7kEF7IMkwOnsWMFrvAZHzx1T5fmrp9FQ=="], - "pagefind": ["pagefind@1.5.2", "", { "optionalDependencies": { "@pagefind/darwin-arm64": "1.5.2", "@pagefind/darwin-x64": "1.5.2", "@pagefind/freebsd-x64": "1.5.2", "@pagefind/linux-arm64": "1.5.2", "@pagefind/linux-x64": "1.5.2", "@pagefind/windows-arm64": "1.5.2", "@pagefind/windows-x64": "1.5.2" }, "bin": { "pagefind": "lib/runner/bin.cjs" } }, "sha512-XTUaK0hXMCu2jszWE584JGQT7y284TmMV9l/HX3rnG5uo3rHI/uHU56XTyyyPFjeWEBxECbAi0CaFDJOONtG0Q=="], - - "pako": ["pako@0.2.9", "", {}, "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA=="], - "param-case": ["param-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A=="], "parse-conflict-json": ["parse-conflict-json@5.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^5.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ=="], - "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - - "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], - "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], "parse5-htmlparser2-tree-adapter": ["parse5-htmlparser2-tree-adapter@7.1.0", "", { "dependencies": { "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g=="], @@ -4702,8 +4292,6 @@ "pascal-case": ["pascal-case@3.1.2", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g=="], - "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], - "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-expression-matcher": ["path-expression-matcher@1.5.0", "", {}, "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ=="], @@ -4732,8 +4320,6 @@ "perfect-debounce": ["perfect-debounce@2.1.0", "", {}, "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g=="], - "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], @@ -4800,8 +4386,6 @@ "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], - "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], - "proc-log": ["proc-log@6.1.0", "", {}, "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ=="], "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], @@ -4822,8 +4406,6 @@ "promise.allsettled": ["promise.allsettled@1.0.7", "", { "dependencies": { "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "iterate-value": "^1.0.2" } }, "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA=="], - "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], - "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "retry": "^0.12.0", "signal-exit": "^3.0.2" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="], "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], @@ -4902,14 +4484,6 @@ "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], - "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], - - "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], - - "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], - - "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], - "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], "redis-errors": ["redis-errors@1.2.0", "", {}, "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w=="], @@ -4926,44 +4500,12 @@ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], - - "rehype-autolink-headings": ["rehype-autolink-headings@7.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-heading-rank": "^3.0.0", "hast-util-is-element": "^3.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw=="], - - "rehype-expressive-code": ["rehype-expressive-code@0.41.7", "", { "dependencies": { "expressive-code": "^0.41.7" } }, "sha512-25f8ZMSF1d9CMscX7Cft0TSQIqdwjce2gDOvQ+d/w0FovsMwrSt3ODP4P3Z7wO1jsIJ4eYyaDRnIR/27bd/EMQ=="], - - "rehype-format": ["rehype-format@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-format": "^1.0.0" } }, "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ=="], - - "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], - - "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], - - "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], - - "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], - "relateurl": ["relateurl@0.2.7", "", {}, "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog=="], - "remark-directive": ["remark-directive@3.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-directive": "^3.0.0", "micromark-extension-directive": "^3.0.0", "unified": "^11.0.0" } }, "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A=="], - - "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], - - "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], - - "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], - - "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], - - "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], - - "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], - "remeda": ["remeda@2.26.0", "", { "dependencies": { "type-fest": "^4.41.0" } }, "sha512-lmNNwtaC6Co4m0WTTNoZ/JlpjEqAjPZO0+czC9YVRQUpkbS4x8Hmh+Mn9HPfJfiXqUQ5IXXgSXSOB2pBKAytdA=="], "remend": ["remend@1.3.0", "", {}, "sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw=="], - "request-light": ["request-light@0.7.0", "", {}, "sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q=="], - "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], @@ -4984,18 +4526,8 @@ "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], - "restructure": ["restructure@3.0.2", "", {}, "sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw=="], - "ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="], - "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], - - "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], - - "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], - - "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], - "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], @@ -5100,16 +4632,12 @@ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], - "sitemap": ["sitemap@9.0.1", "", { "dependencies": { "@types/node": "^24.9.2", "@types/sax": "^1.2.1", "arg": "^5.0.0", "sax": "^1.4.1" }, "bin": { "sitemap": "dist/esm/cli.js" } }, "sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ=="], - "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="], "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], - "socket.io-client": ["socket.io-client@4.8.3", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1", "engine.io-client": "~6.6.1", "socket.io-parser": "~4.2.4" } }, "sha512-uP0bpjWrjQmUt5DTHq9RuoCBdFJF10cdX9X+a368j/Ft0wmaVgxlrjvK3kjvgCODOMMOz9lcaRzxmso0bTWZ/g=="], "socket.io-parser": ["socket.io-parser@4.2.6", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.4.1" } }, "sha512-asJqbVBDsBCJx0pTqw3WfesSY0iRX+2xzWEWzrpcH7L6fLzrhyF8WPI8UaeM4YCuDfpwA/cgsdugMsmtz8EJeg=="], @@ -5206,8 +4734,6 @@ "storybook-solidjs-vite": ["storybook-solidjs-vite@10.1.1", "", { "dependencies": { "@joshwooding/vite-plugin-react-docgen-typescript": "^0.7.0", "@storybook/builder-vite": "^10.4.0", "@storybook/global": "^5.0.0", "semver": "7.8.1" }, "peerDependencies": { "@solidjs/web": "^2.0.0-0", "solid-js": "^1.8.0-0 || ^2.0.0-0", "storybook": "^0.0.0-0 || ^10.0.0", "typescript": "^4.0.0 || ^5.0.0 || ^6.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vite-plugin-solid": "^2.0.0-0 || ^3.0.0-0" }, "optionalPeers": ["@solidjs/web", "typescript"] }, "sha512-4acj1yxVPM3PieEGFPJukPeIXmpboJprewiX0KMrdYvtAZy8zbkZ7QBf8iENyKNJOayeXWzMm+z7hWBQDUirYg=="], - "stream-replace-string": ["stream-replace-string@2.0.0", "", {}, "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w=="], - "streamx": ["streamx@2.26.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-VvNG1K72Po/xwJzxZFnZ++Tbrv4lwSptsbkFuzXCJAYZvCK5nnxsvXU6ajqkv7chyiI1Y0YXq2Jh8Iy8Y7NF/A=="], "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], @@ -5242,8 +4768,6 @@ "stubborn-utils": ["stubborn-utils@1.0.2", "", {}, "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg=="], - "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], - "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="], @@ -5292,8 +4816,6 @@ "tiny-async-pool": ["tiny-async-pool@1.3.0", "", { "dependencies": { "semver": "^5.5.0" } }, "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA=="], - "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], "tiny-typed-emitter": ["tiny-typed-emitter@2.1.0", "", {}, "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="], @@ -5322,8 +4844,6 @@ "toml": ["toml@4.1.1", "", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="], - "toolbeam-docs-theme": ["toolbeam-docs-theme@0.4.8", "", { "peerDependencies": { "@astrojs/starlight": "^0.34.3", "astro": "^5.7.13" } }, "sha512-b+5ynEFp4Woe5a22hzNQm42lD23t13ZMihVxHbzjA50zdcM9aOSJTIjdJ0PDSd4/50HbBXcpHiQsz6rM4N88ww=="], - "topojson-client": ["topojson-client@3.1.0", "", { "dependencies": { "commander": "2" }, "bin": { "topo2geo": "bin/topo2geo", "topomerge": "bin/topomerge", "topoquantize": "bin/topoquantize" } }, "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw=="], "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], @@ -5338,8 +4858,6 @@ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], - "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], - "truncate-utf8-bytes": ["truncate-utf8-bytes@1.0.2", "", { "dependencies": { "utf8-byte-length": "^1.0.1" } }, "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ=="], "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="], @@ -5348,8 +4866,6 @@ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], - "tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "tsscmp": ["tsscmp@1.0.6", "", {}, "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA=="], @@ -5378,20 +4894,12 @@ "typed-array-length": ["typed-array-length@1.0.8", "", { "dependencies": { "call-bind": "^1.0.9", "for-each": "^0.3.5", "gopd": "^1.2.0", "is-typed-array": "^1.1.15", "possible-typed-array-names": "^1.1.0", "reflect.getprototypeof": "^1.0.10" } }, "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g=="], - "typesafe-path": ["typesafe-path@0.2.2", "", {}, "sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA=="], - "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "typescript-auto-import-cache": ["typescript-auto-import-cache@0.3.6", "", { "dependencies": { "semver": "^7.3.8" } }, "sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ=="], - - "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], - "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], "ulid": ["ulid@3.0.1", "", { "bin": { "ulid": "dist/cli.js" } }, "sha512-dPJyqPzx8preQhqq24bBG1YNkvigm87K8kVEHCD+ruZg24t6IFEFv00xMWfxcC4djmFtiTLdFuADn4+DOz6R7Q=="], - "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], - "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], @@ -5402,32 +4910,14 @@ "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], - "unicode-properties": ["unicode-properties@1.4.1", "", { "dependencies": { "base64-js": "^1.3.0", "unicode-trie": "^2.0.0" } }, "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg=="], - - "unicode-trie": ["unicode-trie@2.0.0", "", { "dependencies": { "pako": "^0.2.5", "tiny-inflate": "^1.0.0" } }, "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ=="], - - "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], - - "unifont": ["unifont@0.5.2", "", { "dependencies": { "css-tree": "^3.0.0", "ofetch": "^1.4.1", "ohash": "^2.0.0" } }, "sha512-LzR4WUqzH9ILFvjLAUU7dK3Lnou/qd5kD+IakBtBK4S15/+x2y9VX+DcWQv6s551R6W+vzwgVS6tFg3XggGBgg=="], - - "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], - "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], - "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], - "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], - - "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], - "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], - "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], - "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], "universal-github-app-jwt": ["universal-github-app-jwt@2.2.2", "", {}, "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="], @@ -5478,8 +4968,6 @@ "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], - "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="], - "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], "vite": ["vite@7.1.4", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw=="], @@ -5494,44 +4982,12 @@ "vitest": ["vitest@4.1.7", "", { "dependencies": { "@vitest/expect": "4.1.7", "@vitest/mocker": "4.1.7", "@vitest/pretty-format": "4.1.7", "@vitest/runner": "4.1.7", "@vitest/snapshot": "4.1.7", "@vitest/spy": "4.1.7", "@vitest/utils": "4.1.7", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.7", "@vitest/browser-preview": "4.1.7", "@vitest/browser-webdriverio": "4.1.7", "@vitest/coverage-istanbul": "4.1.7", "@vitest/coverage-v8": "4.1.7", "@vitest/ui": "4.1.7", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-flYyaFd2CgoCoU+0UKt3pxksgC+S02iTDN0n3LtqaMeXsI9SBcdNujc2k0DeFLzUn/0k538yNjOSdwgCqcrwJA=="], - "volar-service-css": ["volar-service-css@0.0.70", "", { "dependencies": { "vscode-css-languageservice": "^6.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw=="], - - "volar-service-emmet": ["volar-service-emmet@0.0.70", "", { "dependencies": { "@emmetio/css-parser": "^0.4.1", "@emmetio/html-matcher": "^1.3.0", "@vscode/emmet-helper": "^2.9.3", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg=="], - - "volar-service-html": ["volar-service-html@0.0.70", "", { "dependencies": { "vscode-html-languageservice": "^5.3.0", "vscode-languageserver-textdocument": "^1.0.11", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ=="], - - "volar-service-prettier": ["volar-service-prettier@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0", "prettier": "^2.2 || ^3.0" }, "optionalPeers": ["@volar/language-service", "prettier"] }, "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg=="], - - "volar-service-typescript": ["volar-service-typescript@0.0.70", "", { "dependencies": { "path-browserify": "^1.0.1", "semver": "^7.6.2", "typescript-auto-import-cache": "^0.3.5", "vscode-languageserver-textdocument": "^1.0.11", "vscode-nls": "^5.2.0", "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg=="], - - "volar-service-typescript-twoslash-queries": ["volar-service-typescript-twoslash-queries@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ=="], - - "volar-service-yaml": ["volar-service-yaml@0.0.70", "", { "dependencies": { "vscode-uri": "^3.0.8", "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" }, "optionalPeers": ["@volar/language-service"] }, "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ=="], - - "vscode-css-languageservice": ["vscode-css-languageservice@6.3.10", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA=="], - - "vscode-html-languageservice": ["vscode-html-languageservice@5.6.2", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "vscode-languageserver-textdocument": "^1.0.12", "vscode-languageserver-types": "^3.17.5", "vscode-uri": "^3.1.0" } }, "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg=="], - - "vscode-json-languageservice": ["vscode-json-languageservice@4.1.8", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-nls": "^5.0.0", "vscode-uri": "^3.0.2" } }, "sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg=="], - "vscode-jsonrpc": ["vscode-jsonrpc@8.2.1", "", {}, "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ=="], - "vscode-languageserver": ["vscode-languageserver@9.0.1", "", { "dependencies": { "vscode-languageserver-protocol": "3.17.5" }, "bin": { "installServerIntoExtension": "bin/installServerIntoExtension" } }, "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g=="], - - "vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.5", "", { "dependencies": { "vscode-jsonrpc": "8.2.0", "vscode-languageserver-types": "3.17.5" } }, "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg=="], - - "vscode-languageserver-textdocument": ["vscode-languageserver-textdocument@1.0.12", "", {}, "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA=="], - "vscode-languageserver-types": ["vscode-languageserver-types@3.17.5", "", {}, "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg=="], - "vscode-nls": ["vscode-nls@5.2.0", "", {}, "sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng=="], - - "vscode-uri": ["vscode-uri@3.1.0", "", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], - "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], - "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], - "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], "web-tree-sitter": ["web-tree-sitter@0.25.10", "", { "peerDependencies": { "@types/emscripten": "^1.40.0" }, "optionalPeers": ["@types/emscripten"] }, "sha512-Y09sF44/13XvgVKgO2cNDw5rGk6s26MgoZPXLESvMXeefBf7i6/73eFurre0IsTW6E14Y0ArIzhUMmjoc7xyzA=="], @@ -5558,14 +5014,10 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], - "which-typed-array": ["which-typed-array@1.1.21", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw=="], "why-is-node-running": ["why-is-node-running@3.2.2", "", { "bin": { "why-is-node-running": "cli.js" } }, "sha512-NKUzAelcoCXhXL4dJzKIwXeR8iEVqsA0Lq6Vnd0UXvgaKbzVo4ZTHROF2Jidrv+SgxOQ03fMinnNhzZATxOD3A=="], - "widest-line": ["widest-line@5.0.0", "", { "dependencies": { "string-width": "^7.0.0" } }, "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA=="], - "workerd": ["workerd@1.20251118.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251118.0", "@cloudflare/workerd-darwin-arm64": "1.20251118.0", "@cloudflare/workerd-linux-64": "1.20251118.0", "@cloudflare/workerd-linux-arm64": "1.20251118.0", "@cloudflare/workerd-windows-64": "1.20251118.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-Om5ns0Lyx/LKtYI04IV0bjIrkBgoFNg0p6urzr2asekJlfP18RqFzyqMFZKf0i9Gnjtz/JfAS/Ol6tjCe5JJsQ=="], "world-atlas": ["world-atlas@2.0.2", "", {}, "sha512-IXfV0qwlKXpckz1FhwXVwKRjiIhOnWttOskm5CtxMsjgE/MXAYRHWJqgXOpM8IkcPBoXnyTU5lFHcYa5ChG0LQ=="], @@ -5594,27 +5046,19 @@ "xmlhttprequest-ssl": ["xmlhttprequest-ssl@2.1.2", "", {}, "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ=="], - "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], - "yaml-language-server": ["yaml-language-server@1.20.0", "", { "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", "vscode-languageserver": "^9.0.0", "vscode-languageserver-textdocument": "^1.0.1", "vscode-languageserver-types": "^3.16.0", "vscode-uri": "^3.0.2", "yaml": "2.7.1" }, "bin": { "yaml-language-server": "bin/yaml-language-server" } }, "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA=="], - "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yauzl": ["yauzl@2.10.0", "", { "dependencies": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g=="], - "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], - - "yocto-spinner": ["yocto-spinner@0.2.3", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ=="], - - "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], @@ -5628,8 +5072,6 @@ "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], - "zod-to-ts": ["zod-to-ts@1.2.0", "", { "peerDependencies": { "typescript": "^4.9.4 || ^5.0.2", "zod": "^3" } }, "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA=="], - "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], "@actions/artifact/@actions/core": ["@actions/core@2.0.3", "", { "dependencies": { "@actions/exec": "^2.0.0", "@actions/http-client": "^3.0.2" } }, "sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA=="], @@ -5728,28 +5170,6 @@ "@ai-sdk/xai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.35", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg=="], - "@astrojs/check/yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - - "@astrojs/cloudflare/vite": ["vite@6.4.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="], - - "@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="], - - "@astrojs/markdown-remark/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - - "@astrojs/markdown-remark/shiki": ["shiki@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/engine-javascript": "3.20.0", "@shikijs/engine-oniguruma": "3.20.0", "@shikijs/langs": "3.20.0", "@shikijs/themes": "3.20.0", "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg=="], - - "@astrojs/mdx/@astrojs/markdown-remark": ["@astrojs/markdown-remark@6.3.11", "", { "dependencies": { "@astrojs/internal-helpers": "0.7.6", "@astrojs/prism": "3.3.0", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "import-meta-resolve": "^4.2.0", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "shiki": "^3.21.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-hcaxX/5aC6lQgHeGh1i+aauvSwIT6cfyFjKWvExYSxUhZZBBdvCliOtu06gbQyhbe0pGJNoNmqNlQZ5zYUuIyQ=="], - - "@astrojs/mdx/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - - "@astrojs/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - - "@astrojs/sitemap/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], - - "@astrojs/solid-js/vite": ["vite@6.4.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="], - - "@astrojs/starlight/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - "@aws-crypto/crc32/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="], "@aws-crypto/crc32c/@aws-sdk/types": ["@aws-sdk/types@3.973.9", "", { "dependencies": { "@smithy/types": "^4.14.2", "tslib": "^2.6.2" } }, "sha512-kuBfgQVdcz5Bmapc4A13YbpVw/pXkesfhetcFYwbntqas8sF41OHyd4o28+/TG2ZQdHBsv90Lsu5y6oitvYCdg=="], @@ -5928,8 +5348,6 @@ "@electron/windows-sign/fs-extra": ["fs-extra@11.3.5", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg=="], - "@expressive-code/plugin-shiki/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], - "@fastify/proxy-addr/ipaddr.js": ["ipaddr.js@2.4.0", "", {}, "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ=="], "@hey-api/json-schema-ref-parser/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], @@ -5954,10 +5372,6 @@ "@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], - "@mdx-js/mdx/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - - "@mdx-js/mdx/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "@modelcontextprotocol/sdk/express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], "@modelcontextprotocol/sdk/hono": ["hono@4.12.23", "", {}, "sha512-eIaZ9qDgu7XV0pxOCrg7/WhnQ6Ivm22UcxhXx/A3dcbqbbYgBEkc6e/J/s7j2tS96zoB0S9VBdLwQNCWwUo4LA=="], @@ -6056,8 +5470,6 @@ "@opencode-ai/ui/@solid-primitives/resize-observer": ["@solid-primitives/resize-observer@2.1.3", "", { "dependencies": { "@solid-primitives/event-listener": "^2.4.3", "@solid-primitives/rootless": "^1.5.2", "@solid-primitives/static-store": "^0.1.2", "@solid-primitives/utils": "^6.3.2" }, "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ=="], - "@opencode-ai/web/@shikijs/transformers": ["@shikijs/transformers@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/types": "3.20.0" } }, "sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g=="], - "@opentui/core/diff": ["diff@9.0.0", "", {}, "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw=="], "@opentui/core/marked": ["marked@17.0.1", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg=="], @@ -6078,8 +5490,6 @@ "@protobuf-ts/plugin/typescript": ["typescript@3.9.10", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q=="], - "@rollup/pluginutils/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], - "@sentry/bundler-plugin-core/glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="], "@sentry/bundler-plugin-core/magic-string": ["magic-string@0.30.8", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="], @@ -6118,8 +5528,6 @@ "@slack/web-api/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], - "@slack/web-api/p-queue": ["p-queue@6.6.2", "", { "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" } }, "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ=="], - "@solid-primitives/memo/@solid-primitives/utils": ["@solid-primitives/utils@6.4.1", "", { "peerDependencies": { "solid-js": "^1.6.12" } }, "sha512-ISSB5QX1qP2ynrheIpYwc4oKR5Ny4siNuUyf1qZniy+Il+p/PtDB0QK1Dnle8noiHpwRD3gpPdubOC3qI/Zamg=="], "@solidjs/start/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], @@ -6162,16 +5570,12 @@ "@vitest/coverage-v8/@vitest/utils": ["@vitest/utils@4.1.8", "", { "dependencies": { "@vitest/pretty-format": "4.1.8", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg=="], - "@vitest/coverage-v8/magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="], - "@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], "@vitest/expect/tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], "@vitest/mocker/@vitest/spy": ["@vitest/spy@4.1.7", "", {}, "sha512-kbkI5LMWakyuTIvs6fUJ5qdIVb1XVKsYJAT4OJ938cHMROYMSfmoQdZy0aaAnjbbc8F61vkoTqz/Az+/HiIu5Q=="], - "@vscode/emmet-helper/jsonc-parser": ["jsonc-parser@2.3.1", "", {}, "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg=="], - "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], @@ -6192,8 +5596,6 @@ "ajv-keywords/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], - "ansi-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "app-builder-lib/@electron/get": ["@electron/get@3.1.0", "", { "dependencies": { "debug": "^4.1.1", "env-paths": "^2.2.0", "fs-extra": "^8.1.0", "got": "^11.8.5", "progress": "^2.0.3", "semver": "^6.2.0", "sumchecker": "^3.0.1" }, "optionalDependencies": { "global-agent": "^3.0.0" } }, "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ=="], @@ -6214,24 +5616,6 @@ "ast-v8-to-istanbul/js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="], - "astro/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.6.1", "", {}, "sha512-l5Pqf6uZu31aG+3Lv8nl/3s4DbUzdlxTWDof4pEpto6GUJNhhCbelVi9dEyurOVyqaelwmS9oSyOWOENSfgo9A=="], - - "astro/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - - "astro/common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], - - "astro/diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="], - - "astro/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - - "astro/shiki": ["shiki@3.20.0", "", { "dependencies": { "@shikijs/core": "3.20.0", "@shikijs/engine-javascript": "3.20.0", "@shikijs/engine-oniguruma": "3.20.0", "@shikijs/langs": "3.20.0", "@shikijs/themes": "3.20.0", "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg=="], - - "astro/unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - - "astro/vite": ["vite@6.4.2", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ=="], - - "astro/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "axios/https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], @@ -6266,8 +5650,6 @@ "dir-compare/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], - "dir-compare/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - "dmg-builder/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], "dmg-license/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], @@ -6308,20 +5690,14 @@ "engine.io-client/ws": ["ws@8.20.1", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-It4dO0K5v//JtTXuPkfEOaI3uUN87iYPnqo/ZzqCoG3g8uhA66QUMs/SrM0YK7/NAu+r4LMh/9dq2A7k+rHs+w=="], - "esast-util-from-js/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - "esbuild-plugin-copy/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], "esbuild-plugin-copy/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], - "estree-util-to-js/source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], - "execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "execa/is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="], - "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "express/path-to-regexp": ["path-to-regexp@0.1.13", "", {}, "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA=="], @@ -6356,8 +5732,6 @@ "iconv-corefoundation/node-addon-api": ["node-addon-api@1.7.2", "", {}, "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg=="], - "istanbul-reports/html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "js-beautify/glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], "js-beautify/nopt": ["nopt@7.2.1", "", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="], @@ -6366,6 +5740,8 @@ "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "light-my-request/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "light-my-request/process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], @@ -6374,8 +5750,6 @@ "md-to-react-email/marked": ["marked@7.0.4", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ=="], - "micromark-extension-mdxjs/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], - "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "miniflare/acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], @@ -6426,12 +5800,10 @@ "openid-client/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="], - "p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + "p-queue/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], "p-retry/retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], - "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="], @@ -6456,8 +5828,6 @@ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - "proper-lockfile/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -6488,8 +5858,6 @@ "solid-transition-size/@corvu/utils": ["@corvu/utils@0.3.2", "", { "dependencies": { "@floating-ui/dom": "^1.6.7" }, "peerDependencies": { "solid-js": "^1.8" } }, "sha512-ZWlyWEE8qV9+CB9OAyo2bTrZGXQN9ZeM+JfYv89zoR+lRACKTDuoOZEdiyL8Uc7U5dUSH1uTqKhTTnaHWb+wZA=="], - "sort-keys/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="], - "sst/aws4fetch": ["aws4fetch@1.0.18", "", {}, "sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ=="], "sst/jose": ["jose@5.2.3", "", {}, "sha512-KUXdbctm1uHVL8BYhnyHkgp3zDX5KW8ZhAKVFEfUbU2P8Alpzjb+48hHvjOdQIyPshoblhzsuqOwEEAbtHVirA=="], @@ -6524,8 +5892,6 @@ "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "unifont/ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - "unplugin/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], "unplugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -6558,8 +5924,6 @@ "vitest/why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "vscode-languageserver-protocol/vscode-jsonrpc": ["vscode-jsonrpc@8.2.0", "", {}, "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA=="], - "wrangler/esbuild": ["esbuild@0.25.4", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.4", "@esbuild/android-arm": "0.25.4", "@esbuild/android-arm64": "0.25.4", "@esbuild/android-x64": "0.25.4", "@esbuild/darwin-arm64": "0.25.4", "@esbuild/darwin-x64": "0.25.4", "@esbuild/freebsd-arm64": "0.25.4", "@esbuild/freebsd-x64": "0.25.4", "@esbuild/linux-arm": "0.25.4", "@esbuild/linux-arm64": "0.25.4", "@esbuild/linux-ia32": "0.25.4", "@esbuild/linux-loong64": "0.25.4", "@esbuild/linux-mips64el": "0.25.4", "@esbuild/linux-ppc64": "0.25.4", "@esbuild/linux-riscv64": "0.25.4", "@esbuild/linux-s390x": "0.25.4", "@esbuild/linux-x64": "0.25.4", "@esbuild/netbsd-arm64": "0.25.4", "@esbuild/netbsd-x64": "0.25.4", "@esbuild/openbsd-arm64": "0.25.4", "@esbuild/openbsd-x64": "0.25.4", "@esbuild/sunos-x64": "0.25.4", "@esbuild/win32-arm64": "0.25.4", "@esbuild/win32-ia32": "0.25.4", "@esbuild/win32-x64": "0.25.4" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q=="], "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -6568,15 +5932,11 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "yaml-language-server/request-light": ["request-light@0.5.8", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="], - - "yaml-language-server/yaml": ["yaml@2.7.1", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], - "yargs/yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], - "zod-to-ts/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], "@actions/artifact/@actions/core/@actions/exec": ["@actions/exec@2.0.0", "", { "dependencies": { "@actions/io": "^2.0.0" } }, "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw=="], @@ -6626,34 +5986,6 @@ "@ai-sdk/xai/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@astrojs/check/yargs/cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - - "@astrojs/check/yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - - "@astrojs/markdown-remark/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "@astrojs/markdown-remark/shiki/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], - - "@astrojs/markdown-remark/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg=="], - - "@astrojs/markdown-remark/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ=="], - - "@astrojs/markdown-remark/shiki/@shikijs/langs": ["@shikijs/langs@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA=="], - - "@astrojs/markdown-remark/shiki/@shikijs/themes": ["@shikijs/themes@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ=="], - - "@astrojs/markdown-remark/shiki/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], - - "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.7.6", "", {}, "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q=="], - - "@astrojs/mdx/@astrojs/markdown-remark/@astrojs/prism": ["@astrojs/prism@3.3.0", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ=="], - - "@astrojs/mdx/@astrojs/markdown-remark/js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki": ["shiki@3.23.0", "", { "dependencies": { "@shikijs/core": "3.23.0", "@shikijs/engine-javascript": "3.23.0", "@shikijs/engine-oniguruma": "3.23.0", "@shikijs/langs": "3.23.0", "@shikijs/themes": "3.23.0", "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA=="], - - "@astrojs/starlight/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], @@ -6722,18 +6054,6 @@ "@electron/windows-sign/fs-extra/jsonfile": ["jsonfile@6.2.1", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q=="], - "@expressive-code/plugin-shiki/shiki/@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], - - "@expressive-code/plugin-shiki/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="], - - "@expressive-code/plugin-shiki/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], - - "@expressive-code/plugin-shiki/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], - - "@expressive-code/plugin-shiki/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], - - "@expressive-code/plugin-shiki/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], - "@hey-api/json-schema-ref-parser/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "@jsx-email/cli/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.19.12", "", { "os": "aix", "cpu": "ppc64" }, "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA=="], @@ -6804,8 +6124,6 @@ "@modelcontextprotocol/sdk/express/content-disposition": ["content-disposition@1.1.0", "", {}, "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g=="], - "@modelcontextprotocol/sdk/express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "@modelcontextprotocol/sdk/express/cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="], "@modelcontextprotocol/sdk/express/finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], @@ -6924,10 +6242,6 @@ "@opencode-ai/desktop/@actions/artifact/@actions/http-client": ["@actions/http-client@2.2.3", "", { "dependencies": { "tunnel": "^0.0.6", "undici": "^5.25.4" } }, "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA=="], - "@opencode-ai/web/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], - - "@opencode-ai/web/@shikijs/transformers/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], - "@opentui/solid/@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@pierre/diffs/@shikijs/transformers/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], @@ -6948,10 +6262,6 @@ "@slack/web-api/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - "@slack/web-api/p-queue/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], - - "@slack/web-api/p-queue/p-timeout": ["p-timeout@3.2.0", "", { "dependencies": { "p-finally": "^1.0.0" } }, "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg=="], - "@solidjs/start/shiki/@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], "@solidjs/start/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], @@ -7004,10 +6314,6 @@ "ajv-keywords/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "ansi-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "ansi-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "app-builder-lib/@electron/get/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], "app-builder-lib/@electron/get/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="], @@ -7026,26 +6332,6 @@ "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "astro/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "astro/shiki/@shikijs/core": ["@shikijs/core@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g=="], - - "astro/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg=="], - - "astro/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ=="], - - "astro/shiki/@shikijs/langs": ["@shikijs/langs@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA=="], - - "astro/shiki/@shikijs/themes": ["@shikijs/themes@3.20.0", "", { "dependencies": { "@shikijs/types": "3.20.0" } }, "sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ=="], - - "astro/shiki/@shikijs/types": ["@shikijs/types@3.20.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw=="], - - "astro/unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - - "astro/unstorage/h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - - "astro/unstorage/ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - "axios/https-proxy-agent/agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], "babel-plugin-module-resolver/glob/minimatch": ["minimatch@8.0.7", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg=="], @@ -7066,8 +6352,6 @@ "dir-compare/minimatch/brace-expansion": ["brace-expansion@1.1.15", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg=="], - "dir-compare/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "dmg-builder/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "dmg-license/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], @@ -7156,8 +6440,6 @@ "opencode/@ai-sdk/openai/@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.38", "", { "dependencies": { "@ai-sdk/provider": "3.0.14", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-/HHGmtKllqjg1OLc023v9w9kK3laW7Z6TzfZukYQWCsGBbzB9p60zTvvpXFVcs44NZBVXL3viOa1HRKUbeee8g=="], - "p-locate/p-limit/yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="], "pkg-up/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], @@ -7258,28 +6540,6 @@ "@actions/github/@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@20.0.0", "", {}, "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="], - "@astrojs/check/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@astrojs/check/yargs/cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - - "@astrojs/check/yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "@astrojs/check/yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - - "@astrojs/mdx/@astrojs/markdown-remark/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/core": ["@shikijs/core@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-javascript": ["@shikijs/engine-javascript@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/langs": ["@shikijs/langs@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/themes": ["@shikijs/themes@3.23.0", "", { "dependencies": { "@shikijs/types": "3.23.0" } }, "sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA=="], - - "@astrojs/mdx/@astrojs/markdown-remark/shiki/@shikijs/types": ["@shikijs/types@3.23.0", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ=="], - "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], @@ -7426,8 +6686,6 @@ "ai-gateway-provider/@ai-sdk/deepseek/@ai-sdk/provider-utils/@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "ansi-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "app-builder-lib/@electron/get/fs-extra/universalify": ["universalify@0.1.2", "", {}, "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="], "archiver-utils/glob/jackspeak/@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -7436,12 +6694,6 @@ "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], - "astro/unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - - "astro/unstorage/h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - - "astro/unstorage/h3/crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - "babel-plugin-module-resolver/glob/minimatch/brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], "babel-plugin-module-resolver/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -7514,10 +6766,6 @@ "unplugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "@astrojs/check/yargs/cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "@astrojs/check/yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "@aws-sdk/client-cognito-identity/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="], "@aws-sdk/client-lambda/@aws-sdk/core/@aws-sdk/xml-builder/fast-xml-parser/strnum": ["strnum@2.3.0", "", {}, "sha512-ums3KNd42PGyx5xaoVTO1mjU1bH3NpY4vsrVlnv9PNGqQj8wd7rJ6nEypLrJ7z5vxK5RP0yMLo6J/Gsm62DI5Q=="], diff --git a/infra/app.ts b/infra/app.ts index 7b532bcb23..7526708902 100644 --- a/infra/app.ts +++ b/infra/app.ts @@ -49,16 +49,6 @@ export const api = new sst.cloudflare.Worker("Api", { }, }) -new sst.cloudflare.x.Astro("Web", { - domain: "docs." + domain, - path: "packages/web", - environment: { - // For astro config - SST_STAGE: $app.stage, - VITE_API_URL: api.url.apply((url) => url!), - }, -}) - new sst.cloudflare.StaticSite("WebApp", { domain: "app." + domain, path: "packages/app", diff --git a/packages/docs/LICENSE b/packages/docs/LICENSE deleted file mode 100644 index 5411374274..0000000000 --- a/packages/docs/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Mintlify - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/packages/docs/README.md b/packages/docs/README.md deleted file mode 100644 index 17956df329..0000000000 --- a/packages/docs/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# Mintlify Starter Kit - -Use the starter kit to get your docs deployed and ready to customize. - -Click the green **Use this template** button at the top of this repo to copy the Mintlify starter kit. The starter kit contains examples with - -- Guide pages -- Navigation -- Customizations -- API reference pages -- Use of popular components - -**[Follow the full quickstart guide](https://starter.mintlify.com/quickstart)** - -## Development - -Install the [Mintlify CLI](https://www.npmjs.com/package/mint) to preview your documentation changes locally. To install, use the following command: - -``` -npm i -g mint -``` - -Run the following command at the root of your documentation, where your `docs.json` is located: - -``` -mint dev -``` - -View your local preview at `http://localhost:3000`. - -## Publishing changes - -Install our GitHub app from your [dashboard](https://dashboard.mintlify.com/settings/organization/github-app) to propagate changes from your repo to your deployment. Changes are deployed to production automatically after pushing to the default branch. - -## Need help? - -### Troubleshooting - -- If your dev environment isn't running: Run `mint update` to ensure you have the most recent version of the CLI. -- If a page loads as a 404: Make sure you are running in a folder with a valid `docs.json`. - -### Resources - -- [Mintlify documentation](https://mintlify.com/docs) diff --git a/packages/docs/ai-tools/claude-code.mdx b/packages/docs/ai-tools/claude-code.mdx deleted file mode 100644 index 4039c6e0ea..0000000000 --- a/packages/docs/ai-tools/claude-code.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: "Claude Code setup" -description: "Configure Claude Code for your documentation workflow" -icon: "asterisk" ---- - -Claude Code is Anthropic's official CLI tool. This guide will help you set up Claude Code to help you write and maintain your documentation. - -## Prerequisites - -- Active Claude subscription (Pro, Max, or API access) - -## Setup - -1. Install Claude Code globally: - -```bash -npm install -g @anthropic-ai/claude-code -``` - -2. Navigate to your docs directory. -3. (Optional) Add the `CLAUDE.md` file below to your project. -4. Run `claude` to start. - -## Create `CLAUDE.md` - -Create a `CLAUDE.md` file at the root of your documentation repository to train Claude Code on your specific documentation standards: - -```markdown -# Mintlify documentation - -## Working relationship - -- You can push back on ideas-this can lead to better documentation. Cite sources and explain your reasoning when you do so -- ALWAYS ask for clarification rather than making assumptions -- NEVER lie, guess, or make up information - -## Project context - -- Format: MDX files with YAML frontmatter -- Config: docs.json for navigation, theme, settings -- Components: Mintlify components - -## Content strategy - -- Document just enough for user success - not too much, not too little -- Prioritize accuracy and usability of information -- Make content evergreen when possible -- Search for existing information before adding new content. Avoid duplication unless it is done for a strategic reason -- Check existing patterns for consistency -- Start by making the smallest reasonable changes - -## Frontmatter requirements for pages - -- title: Clear, descriptive page title -- description: Concise summary for SEO/navigation - -## Writing standards - -- Second-person voice ("you") -- Prerequisites at start of procedural content -- Test all code examples before publishing -- Match style and formatting of existing pages -- Include both basic and advanced use cases -- Language tags on all code blocks -- Alt text on all images -- Relative paths for internal links - -## Git workflow - -- NEVER use --no-verify when committing -- Ask how to handle uncommitted changes before starting -- Create a new branch when no clear branch exists for changes -- Commit frequently throughout development -- NEVER skip or disable pre-commit hooks - -## Do not - -- Skip frontmatter on any MDX file -- Use absolute URLs for internal links -- Include untested code examples -- Make assumptions - always ask for clarification -``` diff --git a/packages/docs/ai-tools/cursor.mdx b/packages/docs/ai-tools/cursor.mdx deleted file mode 100644 index d05882919f..0000000000 --- a/packages/docs/ai-tools/cursor.mdx +++ /dev/null @@ -1,423 +0,0 @@ ---- -title: "Cursor setup" -description: "Configure Cursor for your documentation workflow" -icon: "arrow-pointer" ---- - -Use Cursor to help write and maintain your documentation. This guide shows how to configure Cursor for better results on technical writing tasks and using Mintlify components. - -## Prerequisites - -- Cursor editor installed -- Access to your documentation repository - -## Project rules - -Create project rules that all team members can use. In your documentation repository root: - -```bash -mkdir -p .cursor -``` - -Create `.cursor/rules.md`: - -````markdown -# Mintlify technical writing rule - -You are an AI writing assistant specialized in creating exceptional technical documentation using Mintlify components and following industry-leading technical writing practices. - -## Core writing principles - -### Language and style requirements - -- Use clear, direct language appropriate for technical audiences -- Write in second person ("you") for instructions and procedures -- Use active voice over passive voice -- Employ present tense for current states, future tense for outcomes -- Avoid jargon unless necessary and define terms when first used -- Maintain consistent terminology throughout all documentation -- Keep sentences concise while providing necessary context -- Use parallel structure in lists, headings, and procedures - -### Content organization standards - -- Lead with the most important information (inverted pyramid structure) -- Use progressive disclosure: basic concepts before advanced ones -- Break complex procedures into numbered steps -- Include prerequisites and context before instructions -- Provide expected outcomes for each major step -- Use descriptive, keyword-rich headings for navigation and SEO -- Group related information logically with clear section breaks - -### User-centered approach - -- Focus on user goals and outcomes rather than system features -- Anticipate common questions and address them proactively -- Include troubleshooting for likely failure points -- Write for scannability with clear headings, lists, and white space -- Include verification steps to confirm success - -## Mintlify component reference - -### Callout components - -#### Note - Additional helpful information - - -Supplementary information that supports the main content without interrupting flow - - -#### Tip - Best practices and pro tips - - -Expert advice, shortcuts, or best practices that enhance user success - - -#### Warning - Important cautions - - -Critical information about potential issues, breaking changes, or destructive actions - - -#### Info - Neutral contextual information - - -Background information, context, or neutral announcements - - -#### Check - Success confirmations - - -Positive confirmations, successful completions, or achievement indicators - - -### Code components - -#### Single code block - -Example of a single code block: - -```javascript config.js -const apiConfig = { - baseURL: "https://api.example.com", - timeout: 5000, - headers: { - Authorization: `Bearer ${process.env.API_TOKEN}`, - }, -} -``` - -#### Code group with multiple languages - -Example of a code group: - - -```javascript Node.js -const response = await fetch('/api/endpoint', { - headers: { Authorization: `Bearer ${apiKey}` } -}); -``` - -```python Python -import requests -response = requests.get('/api/endpoint', - headers={'Authorization': f'Bearer {api_key}'}) -``` - -```curl cURL -curl -X GET '/api/endpoint' \ - -H 'Authorization: Bearer YOUR_API_KEY' -``` - - - -#### Request/response examples - -Example of request/response documentation: - - -```bash cURL -curl -X POST 'https://api.example.com/users' \ - -H 'Content-Type: application/json' \ - -d '{"name": "John Doe", "email": "john@example.com"}' -``` - - - -```json Success -{ - "id": "user_123", - "name": "John Doe", - "email": "john@example.com", - "created_at": "2024-01-15T10:30:00Z" -} -``` - - -### Structural components - -#### Steps for procedures - -Example of step-by-step instructions: - - - - Run `npm install` to install required packages. - - - Verify installation by running `npm list`. - - - - - Create a `.env` file with your API credentials. - - ```bash - API_KEY=your_api_key_here - ``` - - - Never commit API keys to version control. - - - - -#### Tabs for alternative content - -Example of tabbed content: - - - - ```bash - brew install node - npm install -g package-name - ``` - - - - ```powershell - choco install nodejs - npm install -g package-name - ``` - - - - ```bash - sudo apt install nodejs npm - npm install -g package-name - ``` - - - -#### Accordions for collapsible content - -Example of accordion groups: - - - - - **Firewall blocking**: Ensure ports 80 and 443 are open - - **Proxy configuration**: Set HTTP_PROXY environment variable - - **DNS resolution**: Try using 8.8.8.8 as DNS server - - - - ```javascript - const config = { - performance: { cache: true, timeout: 30000 }, - security: { encryption: 'AES-256' } - }; - ``` - - - -### Cards and columns for emphasizing information - -Example of cards and card groups: - - -Complete walkthrough from installation to your first API call in under 10 minutes. - - - - - Learn how to authenticate requests using API keys or JWT tokens. - - - - Understand rate limits and best practices for high-volume usage. - - - -### API documentation components - -#### Parameter fields - -Example of parameter documentation: - - -Unique identifier for the user. Must be a valid UUID v4 format. - - - -User's email address. Must be valid and unique within the system. - - - -Maximum number of results to return. Range: 1-100. - - - -Bearer token for API authentication. Format: `Bearer YOUR_API_KEY` - - -#### Response fields - -Example of response field documentation: - - -Unique identifier assigned to the newly created user. - - - -ISO 8601 formatted timestamp of when the user was created. - - - -List of permission strings assigned to this user. - - -#### Expandable nested fields - -Example of nested field documentation: - - -Complete user object with all associated data. - - - - User profile information including personal details. - - - - User's first name as entered during registration. - - - - URL to user's profile picture. Returns null if no avatar is set. - - - - - - -### Media and advanced components - -#### Frames for images - -Wrap all images in frames: - - -Main dashboard showing analytics overview - - - -Analytics dashboard with charts - - -#### Videos - -Use the HTML video element for self-hosted video content: - - - -Embed YouTube videos using iframe elements: - - - -#### Tooltips - -Example of tooltip usage: - - -API - - -#### Updates - -Use updates for changelogs: - - -## New features -- Added bulk user import functionality -- Improved error messages with actionable suggestions - -## Bug fixes - -- Fixed pagination issue with large datasets -- Resolved authentication timeout problems - - -## Required page structure - -Every documentation page must begin with YAML frontmatter: - -```yaml ---- -title: "Clear, specific, keyword-rich title" -description: "Concise description explaining page purpose and value" ---- -``` - -## Content quality standards - -### Code examples requirements - -- Always include complete, runnable examples that users can copy and execute -- Show proper error handling and edge case management -- Use realistic data instead of placeholder values -- Include expected outputs and results for verification -- Test all code examples thoroughly before publishing -- Specify language and include filename when relevant -- Add explanatory comments for complex logic -- Never include real API keys or secrets in code examples - -### API documentation requirements - -- Document all parameters including optional ones with clear descriptions -- Show both success and error response examples with realistic data -- Include rate limiting information with specific limits -- Provide authentication examples showing proper format -- Explain all HTTP status codes and error handling -- Cover complete request/response cycles - -### Accessibility requirements - -- Include descriptive alt text for all images and diagrams -- Use specific, actionable link text instead of "click here" -- Ensure proper heading hierarchy starting with H2 -- Provide keyboard navigation considerations -- Use sufficient color contrast in examples and visuals -- Structure content for easy scanning with headers and lists - -## Component selection logic - -- Use **Steps** for procedures and sequential instructions -- Use **Tabs** for platform-specific content or alternative approaches -- Use **CodeGroup** when showing the same concept in multiple programming languages -- Use **Accordions** for progressive disclosure of information -- Use **RequestExample/ResponseExample** specifically for API endpoint documentation -- Use **ParamField** for API parameters, **ResponseField** for API responses -- Use **Expandable** for nested object properties or hierarchical information -```` diff --git a/packages/docs/ai-tools/windsurf.mdx b/packages/docs/ai-tools/windsurf.mdx deleted file mode 100644 index 310c81d5f7..0000000000 --- a/packages/docs/ai-tools/windsurf.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Windsurf setup" -description: "Configure Windsurf for your documentation workflow" -icon: "water" ---- - -Configure Windsurf's Cascade AI assistant to help you write and maintain documentation. This guide shows how to set up Windsurf specifically for your Mintlify documentation workflow. - -## Prerequisites - -- Windsurf editor installed -- Access to your documentation repository - -## Workspace rules - -Create workspace rules that provide Windsurf with context about your documentation project and standards. - -Create `.windsurf/rules.md` in your project root: - -````markdown -# Mintlify technical writing rule - -## Project context - -- This is a documentation project on the Mintlify platform -- We use MDX files with YAML frontmatter -- Navigation is configured in `docs.json` -- We follow technical writing best practices - -## Writing standards - -- Use second person ("you") for instructions -- Write in active voice and present tense -- Start procedures with prerequisites -- Include expected outcomes for major steps -- Use descriptive, keyword-rich headings -- Keep sentences concise but informative - -## Required page structure - -Every page must start with frontmatter: - -```yaml ---- -title: "Clear, specific title" -description: "Concise description for SEO and navigation" ---- -``` - -## Mintlify components - -### Callouts - -- `` for helpful supplementary information -- `` for important cautions and breaking changes -- `` for best practices and expert advice -- `` for neutral contextual information -- `` for success confirmations - -### Code examples - -- When appropriate, include complete, runnable examples -- Use `` for multiple language examples -- Specify language tags on all code blocks -- Include realistic data, not placeholders -- Use `` and `` for API docs - -### Procedures - -- Use `` component for sequential instructions -- Include verification steps with `` components when relevant -- Break complex procedures into smaller steps - -### Content organization - -- Use `` for platform-specific content -- Use `` for progressive disclosure -- Use `` and `` for highlighting content -- Wrap images in `` components with descriptive alt text - -## API documentation requirements - -- Document all parameters with `` -- Show response structure with `` -- Include both success and error examples -- Use `` for nested object properties -- Always include authentication examples - -## Quality standards - -- Test all code examples before publishing -- Use relative paths for internal links -- Include alt text for all images -- Ensure proper heading hierarchy (start with h2) -- Check existing patterns for consistency -```` diff --git a/packages/docs/development.mdx b/packages/docs/development.mdx deleted file mode 100644 index 432ef80e4f..0000000000 --- a/packages/docs/development.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: "Development" -description: "Preview changes locally to update your docs" ---- - -**Prerequisites**: - Node.js version 19 or higher - A docs repository with a `docs.json` file - -Follow these steps to install and run Mintlify on your operating system. - - - - -```bash -npm i -g mint -``` - - - - - -Navigate to your docs directory where your `docs.json` file is located, and run the following command: - -```bash -mint dev -``` - -A local preview of your documentation will be available at `http://localhost:3000`. - - - - -## Custom ports - -By default, Mintlify uses port 3000. You can customize the port Mintlify runs on by using the `--port` flag. For example, to run Mintlify on port 3333, use this command: - -```bash -mint dev --port 3333 -``` - -If you attempt to run Mintlify on a port that's already in use, it will use the next available port: - -```md -Port 3000 is already in use. Trying 3001 instead. -``` - -## Mintlify versions - -Please note that each CLI release is associated with a specific version of Mintlify. If your local preview does not align with the production version, please update the CLI: - -```bash -npm mint update -``` - -## Validating links - -The CLI can assist with validating links in your documentation. To identify any broken links, use the following command: - -```bash -mint broken-links -``` - -## Deployment - -If the deployment is successful, you should see the following: - - - Screenshot of a deployment confirmation message that says All checks have passed. - - -## Code formatting - -We suggest using extensions on your IDE to recognize and format MDX. If you're a VSCode user, consider the [MDX VSCode extension](https://marketplace.visualstudio.com/items?itemName=unifiedjs.vscode-mdx) for syntax highlighting, and [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) for code formatting. - -## Troubleshooting - - - - - This may be due to an outdated version of node. Try the following: - 1. Remove the currently-installed version of the CLI: `npm remove -g mint` - 2. Upgrade to Node v19 or higher. - 3. Reinstall the CLI: `npm i -g mint` - - - - - - Solution: Go to the root of your device and delete the `~/.mintlify` folder. Then run `mint dev` again. - - - -Curious about what changed in the latest CLI version? Check out the [CLI changelog](https://www.npmjs.com/package/mintlify?activeTab=versions). diff --git a/packages/docs/docs.json b/packages/docs/docs.json deleted file mode 100644 index 1bf8b3700b..0000000000 --- a/packages/docs/docs.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "$schema": "https://mintlify.com/docs.json", - "theme": "mint", - "name": "@opencode-ai/docs", - "colors": { - "primary": "#16A34A", - "light": "#07C983", - "dark": "#15803D" - }, - "favicon": "/favicon-v3.svg", - "navigation": { - "tabs": [ - { - "tab": "SDK", - "groups": [ - { - "group": "Getting started", - "pages": ["index", "quickstart", "development"], - "openapi": "https://opencode.ai/openapi.json" - } - ] - } - ], - "global": {} - }, - "logo": { - "light": "/logo/light.svg", - "dark": "/logo/dark.svg" - }, - "navbar": { - "links": [ - { - "label": "Support", - "href": "mailto:hi@mintlify.com" - } - ], - "primary": { - "type": "button", - "label": "Dashboard", - "href": "https://dashboard.mintlify.com" - } - }, - "contextual": { - "options": ["copy", "view", "chatgpt", "claude", "perplexity", "mcp", "cursor", "vscode"] - }, - "footer": { - "socials": { - "x": "https://x.com/mintlify", - "github": "https://github.com/mintlify", - "linkedin": "https://linkedin.com/company/mintlify" - } - } -} diff --git a/packages/docs/essentials/code.mdx b/packages/docs/essentials/code.mdx deleted file mode 100644 index 7a04654470..0000000000 --- a/packages/docs/essentials/code.mdx +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: "Code blocks" -description: "Display inline code and code blocks" -icon: "code" ---- - -## Inline code - -To denote a `word` or `phrase` as code, enclose it in backticks (`). - -``` -To denote a `word` or `phrase` as code, enclose it in backticks (`). -``` - -## Code blocks - -Use [fenced code blocks](https://www.markdownguide.org/extended-syntax/#fenced-code-blocks) by enclosing code in three backticks and follow the leading ticks with the programming language of your snippet to get syntax highlighting. Optionally, you can also write the name of your code after the programming language. - -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` - -````md -```java HelloWorld.java -class HelloWorld { - public static void main(String[] args) { - System.out.println("Hello, World!"); - } -} -``` -```` diff --git a/packages/docs/essentials/images.mdx b/packages/docs/essentials/images.mdx deleted file mode 100644 index f2a10d2538..0000000000 --- a/packages/docs/essentials/images.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Images and embeds" -description: "Add image, video, and other HTML elements" -icon: "image" ---- - - - -## Image - -### Using Markdown - -The [markdown syntax](https://www.markdownguide.org/basic-syntax/#images) lets you add images using the following code - -```md -![title](/path/image.jpg) -``` - -Note that the image file size must be less than 5MB. Otherwise, we recommend hosting on a service like [Cloudinary](https://cloudinary.com/) or [S3](https://aws.amazon.com/s3/). You can then use that URL and embed. - -### Using embeds - -To get more customizability with images, you can also use [embeds](/writing-content/embed) to add images - -```html - -``` - -## Embeds and HTML elements - - - -
- - - -Mintlify supports [HTML tags in Markdown](https://www.markdownguide.org/basic-syntax/#html). This is helpful if you prefer HTML tags to Markdown syntax, and lets you create documentation with infinite flexibility. - - - -### iFrames - -Loads another HTML page within the document. Most commonly used for embedding videos. - -```html - -``` diff --git a/packages/docs/essentials/markdown.mdx b/packages/docs/essentials/markdown.mdx deleted file mode 100644 index 0ca5b82509..0000000000 --- a/packages/docs/essentials/markdown.mdx +++ /dev/null @@ -1,88 +0,0 @@ ---- -title: "Markdown syntax" -description: "Text, title, and styling in standard markdown" -icon: "text-size" ---- - -## Titles - -Best used for section headers. - -```md -## Titles -``` - -### Subtitles - -Best used for subsection headers. - -```md -### Subtitles -``` - - - -Each **title** and **subtitle** creates an anchor and also shows up on the table of contents on the right. - - - -## Text formatting - -We support most markdown formatting. Simply add `**`, `_`, or `~` around text to format it. - -| Style | How to write it | Result | -| ------------- | ----------------- | --------------- | -| Bold | `**bold**` | **bold** | -| Italic | `_italic_` | _italic_ | -| Strikethrough | `~strikethrough~` | ~strikethrough~ | - -You can combine these. For example, write `**_bold and italic_**` to get **_bold and italic_** text. - -You need to use HTML to write superscript and subscript text. That is, add `` or `` around your text. - -| Text Size | How to write it | Result | -| ----------- | ------------------------ | ---------------------- | -| Superscript | `superscript` | superscript | -| Subscript | `subscript` | subscript | - -## Linking to pages - -You can add a link by wrapping text in `[]()`. You would write `[link to google](https://google.com)` to [link to google](https://google.com). - -Links to pages in your docs need to be root-relative. Basically, you should include the entire folder path. For example, `[link to text](/writing-content/text)` links to the page "Text" in our components section. - -Relative links like `[link to text](../text)` will open slower because we cannot optimize them as easily. - -## Blockquotes - -### Singleline - -To create a blockquote, add a `>` in front of a paragraph. - -> Dorothy followed her through many of the beautiful rooms in her castle. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -``` - -### Multiline - -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. - -```md -> Dorothy followed her through many of the beautiful rooms in her castle. -> -> The Witch bade her clean the pots and kettles and sweep the floor and keep the fire fed with wood. -``` - -### LaTeX - -Mintlify supports [LaTeX](https://www.latex-project.org) through the Latex component. - -8 x (vk x H1 - H2) = (0,1) - -```md -8 x (vk x H1 - H2) = (0,1) -``` diff --git a/packages/docs/essentials/navigation.mdx b/packages/docs/essentials/navigation.mdx deleted file mode 100644 index a6a3090046..0000000000 --- a/packages/docs/essentials/navigation.mdx +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Navigation" -description: "The navigation field in docs.json defines the pages that go in the navigation menu" -icon: "map" ---- - -The navigation menu is the list of links on every website. - -You will likely update `docs.json` every time you add a new page. Pages do not show up automatically. - -## Navigation syntax - -Our navigation syntax is recursive which means you can make nested navigation groups. You don't need to include `.mdx` in page names. - - - -```json Regular Navigation -"navigation": { - "tabs": [ - { - "tab": "Docs", - "groups": [ - { - "group": "Getting Started", - "pages": ["quickstart"] - } - ] - } - ] -} -``` - -```json Nested Navigation -"navigation": { - "tabs": [ - { - "tab": "Docs", - "groups": [ - { - "group": "Getting Started", - "pages": [ - "quickstart", - { - "group": "Nested Reference Pages", - "pages": ["nested-reference-page"] - } - ] - } - ] - } - ] -} -``` - - - -## Folders - -Simply put your MDX files in folders and update the paths in `docs.json`. - -For example, to have a page at `https://yoursite.com/your-folder/your-page` you would make a folder called `your-folder` containing an MDX file called `your-page.mdx`. - - - -You cannot use `api` for the name of a folder unless you nest it inside another folder. Mintlify uses Next.js which reserves the top-level `api` folder for internal server calls. A folder name such as `api-reference` would be accepted. - - - -```json Navigation With Folder -"navigation": { - "tabs": [ - { - "tab": "Docs", - "groups": [ - { - "group": "Group Name", - "pages": ["your-folder/your-page"] - } - ] - } - ] -} -``` - -## Hidden pages - -MDX files not included in `docs.json` will not show up in the sidebar but are accessible through the search bar and by linking directly to them. diff --git a/packages/docs/essentials/reusable-snippets.mdx b/packages/docs/essentials/reusable-snippets.mdx deleted file mode 100644 index a26ab89a35..0000000000 --- a/packages/docs/essentials/reusable-snippets.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "Reusable snippets" -description: "Reusable, custom snippets to keep content in sync" -icon: "recycle" ---- - -import SnippetIntro from "/snippets/snippet-intro.mdx" - - - -## Creating a custom snippet - -**Pre-condition**: You must create your snippet file in the `snippets` directory. - - - Any page in the `snippets` directory will be treated as a snippet and will not be rendered into a standalone page. If - you want to create a standalone page from the snippet, import the snippet into another file and call it as a - component. - - -### Default export - -1. Add content to your snippet file that you want to re-use across multiple - locations. Optionally, you can add variables that can be filled in via props - when you import the snippet. - -```mdx snippets/my-snippet.mdx -Hello world! This is my content I want to reuse across pages. My keyword of the -day is {word}. -``` - - - The content that you want to reuse must be inside the `snippets` directory in order for the import to work. - - -2. Import the snippet into your destination file. - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import MySnippet from "/snippets/path/to/my-snippet.mdx" - -## Header - -Lorem impsum dolor sit amet. - - -``` - -### Reusable variables - -1. Export a variable from your snippet file: - -```mdx snippets/path/to/custom-variables.mdx -export const myName = "my name" - -export const myObject = { fruit: "strawberries" } - -; -``` - -2. Import the snippet from your destination file and use the variable: - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import { myName, myObject } from "/snippets/path/to/custom-variables.mdx" - -Hello, my name is {myName} and I like {myObject.fruit}. -``` - -### Reusable components - -1. Inside your snippet file, create a component that takes in props by exporting - your component in the form of an arrow function. - -```mdx snippets/custom-component.mdx -export const MyComponent = ({ title }) => ( -
-

{title}

-

... snippet content ...

-
-) - -; -``` - - - MDX does not compile inside the body of an arrow function. Stick to HTML syntax when you can or use a default export - if you need to use MDX. - - -2. Import the snippet into your destination file and pass in the props - -```mdx destination-file.mdx ---- -title: My title -description: My Description ---- - -import { MyComponent } from "/snippets/custom-component.mdx" - -Lorem ipsum dolor sit amet. - - -``` diff --git a/packages/docs/essentials/settings.mdx b/packages/docs/essentials/settings.mdx deleted file mode 100644 index 2cc202ed1f..0000000000 --- a/packages/docs/essentials/settings.mdx +++ /dev/null @@ -1,316 +0,0 @@ ---- -title: "Global Settings" -description: "Mintlify gives you complete control over the look and feel of your documentation using the docs.json file" -icon: "gear" ---- - -Every Mintlify site needs a `docs.json` file with the core configuration settings. Learn more about the [properties](#properties) below. - -## Properties - - -Name of your project. Used for the global title. - -Example: `mintlify` - - - - - An array of groups with all the pages within that group - - - The name of the group. - - Example: `Settings` - - - - The relative paths to the markdown files that will serve as pages. - - Example: `["customization", "page"]` - - - - - - - - Path to logo image or object with path to "light" and "dark" mode logo images - - - Path to the logo in light mode - - - Path to the logo in dark mode - - - Where clicking on the logo links you to - - - - - - Path to the favicon image - - - - Hex color codes for your global theme - - - The primary color. Used most often for highlighted content, section headers, accents, in light mode - - - The primary color for dark mode. Used most often for highlighted content, section headers, accents, in dark mode - - - The primary color for important buttons - - - The color of the background in both light and dark mode - - - The hex color code of the background in light mode - - - The hex color code of the background in dark mode - - - - - - - - Array of `name`s and `url`s of links you want to include in the topbar - - - The name of the button. - - Example: `Contact us` - - - The url once you click on the button. Example: `https://mintlify.com/docs` - - - - - - - - - Link shows a button. GitHub shows the repo information at the url provided including the number of GitHub stars. - - - If `link`: What the button links to. - - If `github`: Link to the repository to load GitHub information from. - - - Text inside the button. Only required if `type` is a `link`. - - - - - - - Array of version names. Only use this if you want to show different versions of docs with a dropdown in the navigation - bar. - - - - An array of the anchors, includes the `icon`, `color`, and `url`. - - - The [Font Awesome](https://fontawesome.com/search?q=heart) icon used to feature the anchor. - - Example: `comments` - - - The name of the anchor label. - - Example: `Community` - - - The start of the URL that marks what pages go in the anchor. Generally, this is the name of the folder you put your pages in. - - - The hex color of the anchor icon background. Can also be a gradient if you pass an object with the properties `from` and `to` that are each a hex color. - - - Used if you want to hide an anchor until the correct docs version is selected. - - - Pass `true` if you want to hide the anchor until you directly link someone to docs inside it. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - - Override the default configurations for the top-most anchor. - - - The name of the top-most anchor - - - Font Awesome icon. - - - One of: "brands", "duotone", "light", "sharp-solid", "solid", or "thin" - - - - - - An array of navigational tabs. - - - The name of the tab label. - - - The start of the URL that marks what pages go in the tab. Generally, this is the name of the folder you put your - pages in. - - - - - - Configuration for API settings. Learn more about API pages at [API Components](/api-playground/demo). - - - The base url for all API endpoints. If `baseUrl` is an array, it will enable for multiple base url - options that the user can toggle. - - - - - - The authentication strategy used for all API endpoints. - - - The name of the authentication parameter used in the API playground. - - If method is `basic`, the format should be `[usernameName]:[passwordName]` - - - The default value that's designed to be a prefix for the authentication input field. - - E.g. If an `inputPrefix` of `AuthKey` would inherit the default input result of the authentication field as `AuthKey`. - - - - - - Configurations for the API playground - - - - Whether the playground is showing, hidden, or only displaying the endpoint with no added user interactivity `simple` - - Learn more at the [playground guides](/api-playground/demo) - - - - - - Enabling this flag ensures that key ordering in OpenAPI pages matches the key ordering defined in the OpenAPI file. - - This behavior will soon be enabled by default, at which point this field will be deprecated. - - - - - - - A string or an array of strings of URL(s) or relative path(s) pointing to your - OpenAPI file. - - Examples: - - ```json Absolute - "openapi": "https://example.com/openapi.json" - ``` - ```json Relative - "openapi": "/openapi.json" - ``` - ```json Multiple - "openapi": ["https://example.com/openapi1.json", "/openapi2.json", "/openapi3.json"] - ``` - - - - - - An object of social media accounts where the key:property pair represents the social media platform and the account url. - - Example: - ```json - { - "x": "https://x.com/mintlify", - "website": "https://mintlify.com" - } - ``` - - - One of the following values `website`, `facebook`, `x`, `discord`, `slack`, `github`, `linkedin`, `instagram`, `hacker-news` - - Example: `x` - - - The URL to the social platform. - - Example: `https://x.com/mintlify` - - - - - - Configurations to enable feedback buttons - - - - Enables a button to allow users to suggest edits via pull requests - - - Enables a button to allow users to raise an issue about the documentation - - - - - - Customize the dark mode toggle. - - - Set if you always want to show light or dark mode for new users. When not - set, we default to the same mode as the user's operating system. - - - Set to true to hide the dark/light mode toggle. You can combine `isHidden` with `default` to force your docs to only use light or dark mode. For example: - - - ```json Only Dark Mode - "modeToggle": { - "default": "dark", - "isHidden": true - } - ``` - - ```json Only Light Mode - "modeToggle": { - "default": "light", - "isHidden": true - } - ``` - - - - - - - - - A background image to be displayed behind every page. See example with [Infisical](https://infisical.com/docs) and - [FRPC](https://frpc.io). - diff --git a/packages/docs/favicon-v3.svg b/packages/docs/favicon-v3.svg deleted file mode 100644 index b785c738bf..0000000000 --- a/packages/docs/favicon-v3.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/docs/favicon.svg b/packages/docs/favicon.svg deleted file mode 100644 index b785c738bf..0000000000 --- a/packages/docs/favicon.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/packages/docs/images/checks-passed.png b/packages/docs/images/checks-passed.png deleted file mode 100644 index 3303c77364..0000000000 Binary files a/packages/docs/images/checks-passed.png and /dev/null differ diff --git a/packages/docs/images/hero-dark.png b/packages/docs/images/hero-dark.png deleted file mode 100644 index a61cbb1252..0000000000 Binary files a/packages/docs/images/hero-dark.png and /dev/null differ diff --git a/packages/docs/images/hero-light.png b/packages/docs/images/hero-light.png deleted file mode 100644 index 68c712d6db..0000000000 Binary files a/packages/docs/images/hero-light.png and /dev/null differ diff --git a/packages/docs/index.mdx b/packages/docs/index.mdx deleted file mode 100644 index 19a09f890c..0000000000 --- a/packages/docs/index.mdx +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "Introduction" -description: "Welcome to the new home for your documentation" ---- - -## Setting up - -Get your documentation site up and running in minutes. - - - Follow our three step quickstart guide. - - -## Make it yours - -Design a docs site that looks great and empowers your users. - - - - Edit your docs locally and preview them in real time. - - - Customize the design and colors of your site to match your brand. - - - Organize your docs to help users find what they need and succeed with your product. - - - Auto-generate API documentation from OpenAPI specifications. - - - -## Create beautiful pages - -Everything you need to create world-class documentation. - - - - Use MDX to style your docs pages. - - - Add sample code to demonstrate how to use your product. - - - Display images and other media. - - - Write once and reuse across your docs. - - - -## Need inspiration? - - - Browse our showcase of exceptional documentation sites. - diff --git a/packages/docs/logo/dark.svg b/packages/docs/logo/dark.svg deleted file mode 100644 index 8b343cd6fc..0000000000 --- a/packages/docs/logo/dark.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/docs/logo/light.svg b/packages/docs/logo/light.svg deleted file mode 100644 index 03e62bf1d9..0000000000 --- a/packages/docs/logo/light.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/docs/openapi.json b/packages/docs/openapi.json deleted file mode 120000 index 854dd8b2b8..0000000000 --- a/packages/docs/openapi.json +++ /dev/null @@ -1 +0,0 @@ -../sdk/openapi.json \ No newline at end of file diff --git a/packages/docs/quickstart.mdx b/packages/docs/quickstart.mdx deleted file mode 100644 index 52243fba6c..0000000000 --- a/packages/docs/quickstart.mdx +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "Quickstart" -description: "Start building awesome documentation in minutes" ---- - -## Get started in three steps - -Get your documentation site running locally and make your first customization. - -### Step 1: Set up your local environment - - - - During the onboarding process, you created a GitHub repository with your docs content if you didn't already have - one. You can find a link to this repository in your [dashboard](https://dashboard.mintlify.com). To clone the - repository locally so that you can make and preview changes to your docs, follow the [Cloning a - repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) guide - in the GitHub docs. - - - 1. Install the Mintlify CLI: `npm i -g mint` 2. Navigate to your docs directory and run: `mint dev` 3. Open - `http://localhost:3000` to see your docs live! - Your preview updates automatically as you edit files. - - - -### Step 2: Deploy your changes - - - - Install the Mintlify GitHub app from your [dashboard](https://dashboard.mintlify.com/settings/organization/github-app). - - Our GitHub app automatically deploys your changes to your docs site, so you don't need to manage deployments yourself. - - - For a first change, let's update the name and colors of your docs site. - - 1. Open `docs.json` in your editor. - 2. Change the `"name"` field to your project name. - 3. Update the `"colors"` to match your brand. - 4. Save and see your changes instantly at `http://localhost:3000`. - - Try changing the primary color to see an immediate difference! - - - - -### Step 3: Go live - - - 1. Commit and push your changes. 2. Your docs will update and be live in moments! - - -## Next steps - -Now that you have your docs running, explore these key features: - - - - - Learn MDX syntax and start writing your documentation. - - - - Make your docs match your brand perfectly. - - - - Include syntax-highlighted code blocks. - - - - Auto-generate API docs from OpenAPI specs. - - - - - - **Need help?** See our [full documentation](https://mintlify.com/docs) or join our - [community](https://mintlify.com/community). - diff --git a/packages/docs/snippets/snippet-intro.mdx b/packages/docs/snippets/snippet-intro.mdx deleted file mode 100644 index e20fbb6fc9..0000000000 --- a/packages/docs/snippets/snippet-intro.mdx +++ /dev/null @@ -1,4 +0,0 @@ -One of the core principles of software development is DRY (Don't Repeat -Yourself). This is a principle that applies to documentation as -well. If you find yourself repeating the same content in multiple places, you -should consider creating a custom snippet to keep your content in sync. diff --git a/packages/web/.gitignore b/packages/web/.gitignore deleted file mode 100644 index 6240da8b10..0000000000 --- a/packages/web/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -# build output -dist/ -# generated types -.astro/ - -# dependencies -node_modules/ - -# logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - - -# environment variables -.env -.env.production - -# macOS-specific files -.DS_Store diff --git a/packages/web/README.md b/packages/web/README.md deleted file mode 100644 index f9f6d31c6e..0000000000 --- a/packages/web/README.md +++ /dev/null @@ -1,54 +0,0 @@ -# Starlight Starter Kit: Basics - -[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) - -``` -npm create astro@latest -- --template starlight -``` - -[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) -[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) -[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/withastro/starlight&create_from_path=examples/basics) -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) - -> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! - -## 🚀 Project Structure - -Inside of your Astro + Starlight project, you'll see the following folders and files: - -``` -. -├── public/ -├── src/ -│ ├── assets/ -│ ├── content/ -│ │ ├── docs/ -│ └── content.config.ts -├── astro.config.mjs -├── package.json -└── tsconfig.json -``` - -Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. - -Images can be added to `src/assets/` and embedded in Markdown with a relative link. - -Static assets, like favicons, can be placed in the `public/` directory. - -## 🧞 Commands - -All commands are run from the root of the project, from a terminal: - -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `npm install` | Installs dependencies | -| `npm run dev` | Starts local dev server at `localhost:4321` | -| `npm run build` | Build your production site to `./dist/` | -| `npm run preview` | Preview your build locally, before deploying | -| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | -| `npm run astro -- --help` | Get help using the Astro CLI | - -## 👀 Want to learn more? - -Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/packages/web/astro.config.mjs b/packages/web/astro.config.mjs deleted file mode 100644 index 9a42bd3931..0000000000 --- a/packages/web/astro.config.mjs +++ /dev/null @@ -1,242 +0,0 @@ -// @ts-check -import { defineConfig } from "astro/config" -import starlight from "@astrojs/starlight" -import solidJs from "@astrojs/solid-js" -import cloudflare from "@astrojs/cloudflare" -import theme from "toolbeam-docs-theme" -import config from "./config.mjs" -import { rehypeHeadingIds } from "@astrojs/markdown-remark" -import rehypeAutolinkHeadings from "rehype-autolink-headings" -import { spawnSync } from "child_process" - -// https://astro.build/config -export default defineConfig({ - site: config.url, - base: "/docs", - output: "server", - adapter: cloudflare({ - imageService: "passthrough", - }), - devToolbar: { - enabled: false, - }, - server: { - host: "0.0.0.0", - }, - markdown: { - rehypePlugins: [rehypeHeadingIds, [rehypeAutolinkHeadings, { behavior: "wrap" }]], - }, - build: {}, - integrations: [ - configSchema(), - solidJs(), - starlight({ - title: "CoDev Code", - defaultLocale: "root", - locales: { - root: { - label: "English", - lang: "en", - dir: "ltr", - }, - es: { - label: "Espa\u00f1ol", - lang: "es-ES", - dir: "ltr", - }, - }, - favicon: "/favicon-v3.svg", - head: [ - { - tag: "link", - attrs: { - rel: "icon", - href: "/favicon-v3.ico", - sizes: "32x32", - }, - }, - { - tag: "link", - attrs: { - rel: "icon", - type: "image/png", - href: "/favicon-96x96-v3.png", - sizes: "96x96", - }, - }, - { - tag: "link", - attrs: { - rel: "apple-touch-icon", - href: "/apple-touch-icon-v3.png", - sizes: "180x180", - }, - }, - ], - lastUpdated: true, - expressiveCode: { themes: ["github-light", "github-dark"] }, - social: [{ icon: "github", label: "GitHub", href: config.github }], - editLink: { - baseUrl: `${config.github}/edit/main/packages/web/`, - }, - markdown: { - headingLinks: false, - }, - customCss: ["./src/styles/custom.css"], - logo: { - light: "./src/assets/logo-light.svg", - dark: "./src/assets/logo-dark.svg", - alt: "CoDev Code", - replacesTitle: true, - }, - sidebar: [ - "", - "config", - "providers", - "network", - "enterprise", - "troubleshooting", - { - label: "Windows", - translations: { - en: "Windows", - ar: "Windows", - "bs-BA": "Windows", - "da-DK": "Windows", - "de-DE": "Windows", - "es-ES": "Windows", - "fr-FR": "Windows", - "it-IT": "Windows", - "ja-JP": "Windows", - "ko-KR": "Windows", - "nb-NO": "Windows", - "pl-PL": "Windows", - "pt-BR": "Windows", - "ru-RU": "Windows", - "th-TH": "Windows", - "tr-TR": "Windows", - "zh-CN": "Windows", - "zh-TW": "Windows", - }, - link: "windows-wsl", - }, - { - label: "Usage", - translations: { - en: "Usage", - ar: "الاستخدام", - "bs-BA": "Korištenje", - "da-DK": "Brug", - "de-DE": "Nutzung", - "es-ES": "Uso", - "fr-FR": "Utilisation", - "it-IT": "Utilizzo", - "ja-JP": "使い方", - "ko-KR": "사용", - "nb-NO": "Bruk", - "pl-PL": "Użycie", - "pt-BR": "Uso", - "ru-RU": "Использование", - "th-TH": "การใช้งาน", - "tr-TR": "Kullanım", - "zh-CN": "使用", - "zh-TW": "使用", - }, - items: ["go", "tui", "cli", "web", "ide", "zen", "share", "github", "gitlab"], - }, - - { - label: "Configure", - translations: { - en: "Configure", - ar: "الإعداد", - "bs-BA": "Podešavanje", - "da-DK": "Konfiguration", - "de-DE": "Konfiguration", - "es-ES": "Configuración", - "fr-FR": "Configuration", - "it-IT": "Configurazione", - "ja-JP": "設定", - "ko-KR": "구성", - "nb-NO": "Konfigurasjon", - "pl-PL": "Konfiguracja", - "pt-BR": "Configuração", - "ru-RU": "Настройка", - "th-TH": "การกำหนดค่า", - "tr-TR": "Yapılandırma", - "zh-CN": "配置", - "zh-TW": "設定", - }, - items: [ - "tools", - "rules", - "agents", - "models", - "themes", - "keybinds", - "commands", - "formatters", - "permissions", - "policies", - "lsp", - "mcp-servers", - "acp", - "skills", - "references", - "custom-tools", - ], - }, - - { - label: "Develop", - translations: { - en: "Develop", - ar: "التطوير", - "bs-BA": "Razvoj", - "da-DK": "Udvikling", - "de-DE": "Entwicklung", - "es-ES": "Desarrollo", - "fr-FR": "Développement", - "it-IT": "Sviluppo", - "ja-JP": "開発", - "ko-KR": "개발", - "nb-NO": "Utvikling", - "pl-PL": "Rozwój", - "pt-BR": "Desenvolvimento", - "ru-RU": "Разработка", - "th-TH": "การพัฒนา", - "tr-TR": "Geliştirme", - "zh-CN": "开发", - "zh-TW": "開發", - }, - items: ["sdk", "server", "plugins", "ecosystem"], - }, - ], - components: { - Hero: "./src/components/Hero.astro", - Head: "./src/components/Head.astro", - Header: "./src/components/Header.astro", - Footer: "./src/components/Footer.astro", - LanguageSelect: "./src/components/LanguageSelect.astro", - SiteTitle: "./src/components/SiteTitle.astro", - }, - plugins: [ - theme({ - headerLinks: config.headerLinks, - }), - ], - }), - ], -}) - -function configSchema() { - return { - name: "configSchema", - hooks: { - "astro:build:done": async () => { - console.log("generating config schema") - spawnSync("../opencode/script/schema.ts", ["./dist/config.json", "./dist/tui.json"]) - }, - }, - } -} diff --git a/packages/web/config.mjs b/packages/web/config.mjs deleted file mode 100644 index ca30a6bff3..0000000000 --- a/packages/web/config.mjs +++ /dev/null @@ -1,13 +0,0 @@ -const stage = process.env.SST_STAGE || "dev" - -export default { - url: stage === "production" ? "https://opencode.ai" : `https://${stage}.opencode.ai`, - console: stage === "production" ? "https://opencode.ai/auth" : `https://${stage}.opencode.ai/auth`, - email: "help@anoma.ly", - socialCard: "https://social-cards.sst.dev", - github: "https://github.com/quickbeard/codev-code", - headerLinks: [ - { name: "app.header.home", url: "/" }, - { name: "app.header.docs", url: "/docs/" }, - ], -} diff --git a/packages/web/package.json b/packages/web/package.json deleted file mode 100644 index e2c1c2fec8..0000000000 --- a/packages/web/package.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "name": "@opencode-ai/web", - "type": "module", - "license": "MIT", - "version": "1.18.3-2", - "scripts": { - "dev": "astro dev", - "dev:remote": "VITE_API_URL=https://api.opencode.ai astro dev", - "start": "astro dev", - "build": "astro build", - "preview": "astro preview", - "astro": "astro" - }, - "dependencies": { - "@astrojs/cloudflare": "12.6.3", - "@astrojs/markdown-remark": "6.3.1", - "@astrojs/solid-js": "5.1.0", - "@astrojs/starlight": "0.34.3", - "@fontsource/ibm-plex-mono": "5.2.5", - "@shikijs/transformers": "3.20.0", - "@solid-primitives/resize-observer": "2.1.5", - "@types/luxon": "catalog:", - "ai": "catalog:", - "astro": "5.7.13", - "diff": "catalog:", - "js-base64": "3.7.7", - "lang-map": "0.4.0", - "luxon": "catalog:", - "marked": "catalog:", - "marked-shiki": "catalog:", - "rehype-autolink-headings": "7.1.0", - "remeda": "catalog:", - "shiki": "catalog:", - "solid-js": "catalog:", - "toolbeam-docs-theme": "0.4.8", - "vscode-languageserver-types": "3.17.5" - }, - "devDependencies": { - "opencode": "workspace:*", - "@types/node": "catalog:", - "@astrojs/check": "0.9.6", - "typescript": "catalog:" - } -} diff --git a/packages/web/public/apple-touch-icon-v3.png b/packages/web/public/apple-touch-icon-v3.png deleted file mode 120000 index a6f48a689d..0000000000 --- a/packages/web/public/apple-touch-icon-v3.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/apple-touch-icon-v3.png \ No newline at end of file diff --git a/packages/web/public/apple-touch-icon.png b/packages/web/public/apple-touch-icon.png deleted file mode 120000 index fb6e8b1702..0000000000 --- a/packages/web/public/apple-touch-icon.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/apple-touch-icon.png \ No newline at end of file diff --git a/packages/web/public/favicon-96x96-v3.png b/packages/web/public/favicon-96x96-v3.png deleted file mode 120000 index 5d21163ce8..0000000000 --- a/packages/web/public/favicon-96x96-v3.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon-96x96-v3.png \ No newline at end of file diff --git a/packages/web/public/favicon-96x96.png b/packages/web/public/favicon-96x96.png deleted file mode 120000 index 155c5ed2fc..0000000000 --- a/packages/web/public/favicon-96x96.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon-96x96.png \ No newline at end of file diff --git a/packages/web/public/favicon-v3.ico b/packages/web/public/favicon-v3.ico deleted file mode 120000 index b3da91f3c4..0000000000 --- a/packages/web/public/favicon-v3.ico +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon-v3.ico \ No newline at end of file diff --git a/packages/web/public/favicon-v3.svg b/packages/web/public/favicon-v3.svg deleted file mode 120000 index fc95f68af4..0000000000 --- a/packages/web/public/favicon-v3.svg +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon-v3.svg \ No newline at end of file diff --git a/packages/web/public/favicon.ico b/packages/web/public/favicon.ico deleted file mode 120000 index 1c90f01b16..0000000000 --- a/packages/web/public/favicon.ico +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon.ico \ No newline at end of file diff --git a/packages/web/public/favicon.svg b/packages/web/public/favicon.svg deleted file mode 120000 index 80804d2579..0000000000 --- a/packages/web/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/favicon.svg \ No newline at end of file diff --git a/packages/web/public/robots.txt b/packages/web/public/robots.txt deleted file mode 100644 index bddac69dea..0000000000 --- a/packages/web/public/robots.txt +++ /dev/null @@ -1,6 +0,0 @@ -User-agent: * -Allow: / - -# Disallow shared content pages -Disallow: /s/ -Disallow: /share/ \ No newline at end of file diff --git a/packages/web/public/site.webmanifest b/packages/web/public/site.webmanifest deleted file mode 120000 index a116d78796..0000000000 --- a/packages/web/public/site.webmanifest +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/site.webmanifest \ No newline at end of file diff --git a/packages/web/public/social-share-zen.png b/packages/web/public/social-share-zen.png deleted file mode 120000 index 02f205fc52..0000000000 --- a/packages/web/public/social-share-zen.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/images/social-share-zen.png \ No newline at end of file diff --git a/packages/web/public/social-share.png b/packages/web/public/social-share.png deleted file mode 120000 index 88bf2d4c65..0000000000 --- a/packages/web/public/social-share.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/images/social-share.png \ No newline at end of file diff --git a/packages/web/public/theme.json b/packages/web/public/theme.json deleted file mode 100644 index 7c80776344..0000000000 --- a/packages/web/public/theme.json +++ /dev/null @@ -1,183 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "$schema": { - "type": "string", - "description": "JSON schema reference for configuration validation" - }, - "defs": { - "type": "object", - "description": "Color definitions that can be referenced in the theme", - "patternProperties": { - "^[a-zA-Z][a-zA-Z0-9_]*$": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9a-fA-F]{6}$", - "description": "Hex color value" - }, - { - "type": "integer", - "minimum": 0, - "maximum": 255, - "description": "ANSI color code (0-255)" - }, - { - "type": "string", - "enum": ["none"], - "description": "No color (uses terminal default)" - } - ] - } - }, - "additionalProperties": false - }, - "theme": { - "type": "object", - "description": "Theme color definitions", - "properties": { - "primary": { "$ref": "#/definitions/colorValue" }, - "secondary": { "$ref": "#/definitions/colorValue" }, - "accent": { "$ref": "#/definitions/colorValue" }, - "error": { "$ref": "#/definitions/colorValue" }, - "warning": { "$ref": "#/definitions/colorValue" }, - "success": { "$ref": "#/definitions/colorValue" }, - "info": { "$ref": "#/definitions/colorValue" }, - "text": { "$ref": "#/definitions/colorValue" }, - "textMuted": { "$ref": "#/definitions/colorValue" }, - "selectedListItemText": { "$ref": "#/definitions/colorValue" }, - "background": { "$ref": "#/definitions/colorValue" }, - "backgroundPanel": { "$ref": "#/definitions/colorValue" }, - "backgroundElement": { "$ref": "#/definitions/colorValue" }, - "border": { "$ref": "#/definitions/colorValue" }, - "borderActive": { "$ref": "#/definitions/colorValue" }, - "borderSubtle": { "$ref": "#/definitions/colorValue" }, - "diffAdded": { "$ref": "#/definitions/colorValue" }, - "diffRemoved": { "$ref": "#/definitions/colorValue" }, - "diffContext": { "$ref": "#/definitions/colorValue" }, - "diffHunkHeader": { "$ref": "#/definitions/colorValue" }, - "diffHighlightAdded": { "$ref": "#/definitions/colorValue" }, - "diffHighlightRemoved": { "$ref": "#/definitions/colorValue" }, - "diffAddedBg": { "$ref": "#/definitions/colorValue" }, - "diffRemovedBg": { "$ref": "#/definitions/colorValue" }, - "diffContextBg": { "$ref": "#/definitions/colorValue" }, - "diffLineNumber": { "$ref": "#/definitions/colorValue" }, - "diffAddedLineNumberBg": { "$ref": "#/definitions/colorValue" }, - "diffRemovedLineNumberBg": { "$ref": "#/definitions/colorValue" }, - "markdownText": { "$ref": "#/definitions/colorValue" }, - "markdownHeading": { "$ref": "#/definitions/colorValue" }, - "markdownLink": { "$ref": "#/definitions/colorValue" }, - "markdownLinkText": { "$ref": "#/definitions/colorValue" }, - "markdownCode": { "$ref": "#/definitions/colorValue" }, - "markdownBlockQuote": { "$ref": "#/definitions/colorValue" }, - "markdownEmph": { "$ref": "#/definitions/colorValue" }, - "markdownStrong": { "$ref": "#/definitions/colorValue" }, - "markdownHorizontalRule": { "$ref": "#/definitions/colorValue" }, - "markdownListItem": { "$ref": "#/definitions/colorValue" }, - "markdownListEnumeration": { "$ref": "#/definitions/colorValue" }, - "markdownImage": { "$ref": "#/definitions/colorValue" }, - "markdownImageText": { "$ref": "#/definitions/colorValue" }, - "markdownCodeBlock": { "$ref": "#/definitions/colorValue" }, - "syntaxComment": { "$ref": "#/definitions/colorValue" }, - "syntaxKeyword": { "$ref": "#/definitions/colorValue" }, - "syntaxFunction": { "$ref": "#/definitions/colorValue" }, - "syntaxVariable": { "$ref": "#/definitions/colorValue" }, - "syntaxString": { "$ref": "#/definitions/colorValue" }, - "syntaxNumber": { "$ref": "#/definitions/colorValue" }, - "syntaxType": { "$ref": "#/definitions/colorValue" }, - "syntaxOperator": { "$ref": "#/definitions/colorValue" }, - "syntaxPunctuation": { "$ref": "#/definitions/colorValue" } - }, - "required": ["primary", "secondary", "accent", "text", "textMuted", "background"], - "additionalProperties": false - } - }, - "required": ["theme"], - "additionalProperties": false, - "definitions": { - "colorValue": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9a-fA-F]{6}$", - "description": "Hex color value (same for dark and light)" - }, - { - "type": "integer", - "minimum": 0, - "maximum": 255, - "description": "ANSI color code (0-255, same for dark and light)" - }, - { - "type": "string", - "enum": ["none"], - "description": "No color (uses terminal default)" - }, - { - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", - "description": "Reference to another color in the theme or defs" - }, - { - "type": "object", - "properties": { - "dark": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9a-fA-F]{6}$", - "description": "Hex color value for dark mode" - }, - { - "type": "integer", - "minimum": 0, - "maximum": 255, - "description": "ANSI color code for dark mode" - }, - { - "type": "string", - "enum": ["none"], - "description": "No color (uses terminal default)" - }, - { - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", - "description": "Reference to another color for dark mode" - } - ] - }, - "light": { - "oneOf": [ - { - "type": "string", - "pattern": "^#[0-9a-fA-F]{6}$", - "description": "Hex color value for light mode" - }, - { - "type": "integer", - "minimum": 0, - "maximum": 255, - "description": "ANSI color code for light mode" - }, - { - "type": "string", - "enum": ["none"], - "description": "No color (uses terminal default)" - }, - { - "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z0-9_]*$", - "description": "Reference to another color for light mode" - } - ] - } - }, - "required": ["dark", "light"], - "additionalProperties": false, - "description": "Separate colors for dark and light modes" - } - ] - } - } -} diff --git a/packages/web/public/web-app-manifest-192x192.png b/packages/web/public/web-app-manifest-192x192.png deleted file mode 120000 index 8cfdf8ca55..0000000000 --- a/packages/web/public/web-app-manifest-192x192.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/web-app-manifest-192x192.png \ No newline at end of file diff --git a/packages/web/public/web-app-manifest-512x512.png b/packages/web/public/web-app-manifest-512x512.png deleted file mode 120000 index 4165998e65..0000000000 --- a/packages/web/public/web-app-manifest-512x512.png +++ /dev/null @@ -1 +0,0 @@ -../../ui/src/assets/favicon/web-app-manifest-512x512.png \ No newline at end of file diff --git a/packages/web/src/assets/lander/check.svg b/packages/web/src/assets/lander/check.svg deleted file mode 100644 index 22de6f2a88..0000000000 --- a/packages/web/src/assets/lander/check.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/packages/web/src/assets/lander/copy.svg b/packages/web/src/assets/lander/copy.svg deleted file mode 100644 index f1baac30a0..0000000000 --- a/packages/web/src/assets/lander/copy.svg +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/packages/web/src/assets/lander/screenshot-github.png b/packages/web/src/assets/lander/screenshot-github.png deleted file mode 100644 index fda74e641b..0000000000 Binary files a/packages/web/src/assets/lander/screenshot-github.png and /dev/null differ diff --git a/packages/web/src/assets/lander/screenshot-splash.png b/packages/web/src/assets/lander/screenshot-splash.png deleted file mode 100644 index c5e6547daa..0000000000 Binary files a/packages/web/src/assets/lander/screenshot-splash.png and /dev/null differ diff --git a/packages/web/src/assets/lander/screenshot-vscode.png b/packages/web/src/assets/lander/screenshot-vscode.png deleted file mode 100644 index b8966a6b86..0000000000 Binary files a/packages/web/src/assets/lander/screenshot-vscode.png and /dev/null differ diff --git a/packages/web/src/assets/lander/screenshot.png b/packages/web/src/assets/lander/screenshot.png deleted file mode 100644 index b9d8bf4df1..0000000000 Binary files a/packages/web/src/assets/lander/screenshot.png and /dev/null differ diff --git a/packages/web/src/assets/logo-dark.svg b/packages/web/src/assets/logo-dark.svg deleted file mode 100644 index dffc20c896..0000000000 --- a/packages/web/src/assets/logo-dark.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/web/src/assets/logo-light.svg b/packages/web/src/assets/logo-light.svg deleted file mode 100644 index fdb3ac4a2c..0000000000 --- a/packages/web/src/assets/logo-light.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packages/web/src/assets/logo-ornate-dark.svg b/packages/web/src/assets/logo-ornate-dark.svg deleted file mode 100644 index a158273242..0000000000 --- a/packages/web/src/assets/logo-ornate-dark.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/web/src/assets/logo-ornate-light.svg b/packages/web/src/assets/logo-ornate-light.svg deleted file mode 100644 index 2a856dccef..0000000000 --- a/packages/web/src/assets/logo-ornate-light.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/packages/web/src/assets/web/web-homepage-active-session.png b/packages/web/src/assets/web/web-homepage-active-session.png deleted file mode 100644 index 5d1d7a78d9..0000000000 Binary files a/packages/web/src/assets/web/web-homepage-active-session.png and /dev/null differ diff --git a/packages/web/src/assets/web/web-homepage-new-session.png b/packages/web/src/assets/web/web-homepage-new-session.png deleted file mode 100644 index 821793b2a9..0000000000 Binary files a/packages/web/src/assets/web/web-homepage-new-session.png and /dev/null differ diff --git a/packages/web/src/assets/web/web-homepage-see-servers.png b/packages/web/src/assets/web/web-homepage-see-servers.png deleted file mode 100644 index 4480b9b8de..0000000000 Binary files a/packages/web/src/assets/web/web-homepage-see-servers.png and /dev/null differ diff --git a/packages/web/src/components/Footer.astro b/packages/web/src/components/Footer.astro deleted file mode 100644 index 73ebe34de3..0000000000 --- a/packages/web/src/components/Footer.astro +++ /dev/null @@ -1,125 +0,0 @@ ---- -import config from "virtual:starlight/user-config" -import LanguageSelect from "./LanguageSelect.astro" -import { Icon } from "@astrojs/starlight/components" - -const { lang, editUrl, lastUpdated, entry } = Astro.locals.starlightRoute -const template = entry.data.template -const issueLink = Astro.locals.t("app.footer.issueLink", "Found a bug? Open an issue") -const discordLink = Astro.locals.t("app.footer.discordLink", "Join our Discord community") - -const github = config.social?.find((item) => item.icon === "github") -const discord = config.social?.find((item) => item.icon === "discord") ---- - -{ - template === "doc" && ( - - ) -} - - diff --git a/packages/web/src/components/Head.astro b/packages/web/src/components/Head.astro deleted file mode 100644 index 4b35d26db4..0000000000 --- a/packages/web/src/components/Head.astro +++ /dev/null @@ -1,54 +0,0 @@ ---- -import { Base64 } from "js-base64"; -import Default from '@astrojs/starlight/components/Head.astro' -import config from '../../config.mjs' - -const base = import.meta.env.BASE_URL.replace(/^\//, "").replace(/\/$/, "") - -const slug = Astro.url.pathname.replace(/^\//, "").replace(/\/$/, ""); -const { - entry: { - data: { title , description }, - }, -} = Astro.locals.starlightRoute; -const isDocs = base === "" ? true : slug === base || slug.startsWith(`${base}/`) -const t = Astro.locals.t as (key: string) => string -const titleSuffix = t("app.head.titleSuffix") -const shareSlug = base === "" ? "s" : `${base}/s` -const isShare = slug === shareSlug || slug.startsWith(`${shareSlug}/`) -const isHome = slug === "" || slug === base - -let encodedTitle = ''; -let ogImage = `${config.url}/social-share.png`; -let truncatedDesc = ''; - -if (isDocs) { - // Truncate to fit S3's max key size - encodedTitle = encodeURIComponent( - Base64.encode( - // Convert to ASCII - encodeURIComponent( - // Truncate to fit S3's max key size - title.substring(0, 700) - ) - ) - ); - - if (description) { - truncatedDesc = encodeURIComponent(description.substring(0, 400)) - } - - ogImage = `${config.socialCard}/opencode-docs/${encodedTitle}.png?desc=${truncatedDesc}`; -} ---- - -{ isHome && ( -{title} | {titleSuffix} -)} - - - -{ !isShare && ( - - -)} diff --git a/packages/web/src/components/Header.astro b/packages/web/src/components/Header.astro deleted file mode 100644 index bb13c91175..0000000000 --- a/packages/web/src/components/Header.astro +++ /dev/null @@ -1,136 +0,0 @@ ---- -import config from "../../config.mjs" -import astroConfig from "virtual:starlight/user-config" -import { getRelativeLocaleUrl } from "astro:i18n" -import { Icon } from "@astrojs/starlight/components" -import Default from "toolbeam-docs-theme/overrides/Header.astro" -import SiteTitle from "@astrojs/starlight/components/SiteTitle.astro" - -const path = Astro.url.pathname -const locale = Astro.currentLocale || "root" -const route = Astro.locals.starlightRoute -const t = Astro.locals.t as (key: string) => string -const links = astroConfig.social || [] -const headerLinks = config.headerLinks -const sharePath = /\/s(\/|$)/.test(path) - -function href(url: string) { - if (url === "/" || url === "/docs" || url === "/docs/") { - return getRelativeLocaleUrl(locale, "") - } - return url -} ---- - -{sharePath ? ( -
-
- -
-
- {headerLinks?.map(({ name, url }) => ( - {t(name)} - ))} -
-
- {links.length > 0 && ( - - )} -
-
-) : ( - -)} - - diff --git a/packages/web/src/components/Hero.astro b/packages/web/src/components/Hero.astro deleted file mode 100644 index f80f85266c..0000000000 --- a/packages/web/src/components/Hero.astro +++ /dev/null @@ -1,11 +0,0 @@ ---- -import Default from '@astrojs/starlight/components/Hero.astro'; -import Lander from './Lander.astro'; - -const { slug } = Astro.locals.starlightRoute.entry; ---- - -{ slug === "" - ? - : -} diff --git a/packages/web/src/components/Lander.astro b/packages/web/src/components/Lander.astro deleted file mode 100644 index fa0babd954..0000000000 --- a/packages/web/src/components/Lander.astro +++ /dev/null @@ -1,717 +0,0 @@ ---- -import { Image } from 'astro:assets'; -import { getRelativeLocaleUrl } from 'astro:i18n'; -import config from "virtual:starlight/user-config"; - -import CopyIcon from "../assets/lander/copy.svg"; -import CheckIcon from "../assets/lander/check.svg"; -import TuiScreenshot from "../assets/lander/screenshot-splash.png"; -import VscodeScreenshot from "../assets/lander/screenshot-vscode.png"; -import GithubScreenshot from "../assets/lander/screenshot-github.png"; - -const { data } = Astro.locals.starlightRoute.entry; -const { title = data.title, tagline, image, actions = [] } = data.hero || {}; - -const imageAttrs = { - loading: 'eager' as const, - decoding: 'async' as const, - width: 400, - alt: image?.alt || '', -}; - -const github = (config.social || []).filter(s => s.icon === 'github')[0]; -const locale = Astro.currentLocale || 'root'; -const t = Astro.locals.t as (key: string) => string; -const docsHref = getRelativeLocaleUrl(locale, "") -const docsCliHref = getRelativeLocaleUrl(locale, "cli") -const docsIdeHref = getRelativeLocaleUrl(locale, "ide") -const docsGithubHref = getRelativeLocaleUrl(locale, "github") - -const command = "curl -fsSL" -const protocol = "https://" -const url = "opencode.ai/install" -const bash = "| bash" - -let darkImage: ImageMetadata | undefined; -let lightImage: ImageMetadata | undefined; -let rawHtml: string | undefined; -if (image) { - if ('file' in image) { - darkImage = image.file; - } else if ('dark' in image) { - darkImage = image.dark; - lightImage = image.light; - } else { - rawHtml = image.html; - } -} ---- -
-
- -

{t('app.lander.hero.title')}

-
- -
- -
- -
-
- -
-
    -
  • {t('app.lander.features.native_tui.title')}: {t('app.lander.features.native_tui.description')}
  • -
  • {t('app.lander.features.lsp_enabled.title')}: {t('app.lander.features.lsp_enabled.description')}
  • -
  • {t('app.lander.features.multi_session.title')}: {t('app.lander.features.multi_session.description')}
  • -
  • {t('app.lander.features.shareable_links.title')}: {t('app.lander.features.shareable_links.description')}
  • -
  • GitHub Copilot: {t('app.lander.features.github_copilot.description')}
  • -
  • ChatGPT Plus/Pro: {t('app.lander.features.chatgpt_plus_pro.description')}
  • -
  • {t('app.lander.features.use_any_model.title')}: {t('app.lander.features.use_any_model.prefix')} Models.dev, {t('app.lander.features.use_any_model.suffix')}
  • -
-
- -
-
-

npm

- -
-
-

Bun

- -
-
-

Homebrew

- -
-
-

Paru

- -
-
-

Mise

- -
-
- -
-
-
-
{t('app.lander.images.tui.caption')}
- - {t('app.lander.images.tui.alt')} - -
-
-
-
-
-
{t('app.lander.images.vscode.caption')}
- - {t('app.lander.images.vscode.alt')} - -
-
-
-
-
{t('app.lander.images.github.caption')}
- - {t('app.lander.images.github.alt')} - -
-
-
-
- - -
- - - - - - diff --git a/packages/web/src/components/LanguageSelect.astro b/packages/web/src/components/LanguageSelect.astro deleted file mode 100644 index e9da36ef65..0000000000 --- a/packages/web/src/components/LanguageSelect.astro +++ /dev/null @@ -1,29 +0,0 @@ ---- -import config from "virtual:starlight/user-config" -import StarlightLanguageSelect from "@astrojs/starlight/components/LanguageSelect.astro" - -const locales = Object.keys(config.locales ?? {}) ---- - - - - - - - - diff --git a/packages/web/src/components/Share.tsx b/packages/web/src/components/Share.tsx deleted file mode 100644 index 3ee86c270d..0000000000 --- a/packages/web/src/components/Share.tsx +++ /dev/null @@ -1,644 +0,0 @@ -import { For, Show, onMount, Suspense, onCleanup, createMemo, createSignal, SuspenseList } from "solid-js" -import { DateTime } from "luxon" -import { createStore, reconcile } from "solid-js/store" -import { IconArrowDown } from "./icons" -import { IconOpencode } from "./icons/custom" -import { ShareI18nProvider, formatCurrency, formatNumber, normalizeLocale } from "./share/common" -import styles from "./share.module.css" -import type { MessageV2 } from "opencode/session/message-v2" -import type { Message } from "opencode/session/message" -import type { Session } from "opencode/session/index" -import { Part, ProviderIcon } from "./share/part" - -type MessageWithParts = MessageV2.Info & { parts: MessageV2.Part[] } - -type Status = "disconnected" | "connecting" | "connected" | "error" | "reconnecting" - -function scrollToAnchor(id: string) { - const el = document.getElementById(id) - if (!el) return - - el.scrollIntoView({ behavior: "smooth" }) -} - -function getStatusText(status: [Status, string?], messages: Record): string { - switch (status[0]) { - case "connected": - return messages.status_connected_waiting - case "connecting": - return messages.status_connecting - case "disconnected": - return messages.status_disconnected - case "reconnecting": - return messages.status_reconnecting - case "error": - return status[1] || messages.status_error - default: - return messages.status_unknown - } -} - -export default function Share(props: { - id: string - api: string - info: Session.Info - messages: { locale: string } & Record -}) { - let lastScrollY = 0 - let hasScrolledToAnchor = false - let scrollTimeout: number | undefined - let scrollSentinel: HTMLElement | undefined - let scrollObserver: IntersectionObserver | undefined - - const params = new URLSearchParams(window.location.search) - const debug = params.get("debug") === "true" - - const [showScrollButton, setShowScrollButton] = createSignal(false) - const [isButtonHovered, setIsButtonHovered] = createSignal(false) - const [isNearBottom, setIsNearBottom] = createSignal(false) - - const [store, setStore] = createStore<{ - info?: Session.Info - messages: Record - }>({ - info: { - id: props.id, - slug: props.info.slug, - projectID: props.info.projectID, - directory: props.info.directory, - title: props.info.title, - version: props.info.version, - time: { - created: props.info.time.created, - updated: props.info.time.updated, - }, - }, - messages: {}, - }) - const messages = createMemo(() => Object.values(store.messages).toSorted((a, b) => a.id?.localeCompare(b.id))) - const [connectionStatus, setConnectionStatus] = createSignal<[Status, string?]>(["disconnected"]) - - onMount(() => { - const apiUrl = props.api - - if (!props.id) { - setConnectionStatus(["error", props.messages.error_id_not_found]) - return - } - - if (!apiUrl) { - console.error("API URL not found in environment variables") - setConnectionStatus(["error", props.messages.error_api_url_not_found]) - return - } - - let reconnectTimer: number | undefined - let socket: WebSocket | null = null - - // Function to create and set up WebSocket with auto-reconnect - const setupWebSocket = () => { - // Close any existing connection - if (socket) { - socket.close() - } - - setConnectionStatus(["connecting"]) - - // Always use secure WebSocket protocol (wss) - const wsBaseUrl = apiUrl.replace(/^https?:\/\//, "wss://") - const wsUrl = `${wsBaseUrl}/share_poll?id=${props.id}` - // Create WebSocket connection - socket = new WebSocket(wsUrl) - - // Handle connection opening - socket.onopen = () => { - setConnectionStatus(["connected"]) - } - - // Handle incoming messages - socket.onmessage = (event) => { - try { - const d = JSON.parse(event.data) - const [root, type, ...splits] = d.key.split("/") - if (root !== "session") return - if (type === "info") { - setStore("info", reconcile(d.content)) - return - } - if (type === "message") { - const [, messageID] = splits - if ("metadata" in d.content) { - d.content = fromV1(d.content) - } - d.content.parts = d.content.parts ?? store.messages[messageID]?.parts ?? [] - setStore("messages", messageID, reconcile(d.content)) - } - if (type === "part") { - setStore("messages", d.content.messageID, "parts", (arr) => { - const index = arr.findIndex((x) => x.id === d.content.id) - if (index === -1) arr.push(d.content) - if (index > -1) arr[index] = d.content - return [...arr] - }) - } - } catch (error) { - console.error("Error parsing WebSocket message:", error) - } - } - - // Handle errors - socket.onerror = (error) => { - console.error("WebSocket error:", error) - setConnectionStatus(["error", props.messages.error_connection_failed]) - } - - // Handle connection close and reconnection - socket.onclose = () => { - setConnectionStatus(["reconnecting"]) - - // Try to reconnect after 2 seconds - clearTimeout(reconnectTimer) - reconnectTimer = window.setTimeout(setupWebSocket, 2000) as unknown as number - } - } - - // Initial connection - setupWebSocket() - - // Clean up on component unmount - onCleanup(() => { - if (socket) { - socket.close() - } - clearTimeout(reconnectTimer) - }) - }) - - function checkScrollNeed() { - const currentScrollY = window.scrollY - const isScrollingDown = currentScrollY > lastScrollY - const scrolled = currentScrollY > 200 // Show after scrolling 200px - - // Only show when scrolling down, scrolled enough, and not near bottom - const shouldShow = isScrollingDown && scrolled && !isNearBottom() - - // Update last scroll position - lastScrollY = currentScrollY - - if (shouldShow) { - setShowScrollButton(true) - // Clear existing timeout - if (scrollTimeout) { - clearTimeout(scrollTimeout) - } - // Hide button after 3 seconds of no scrolling (unless hovered) - scrollTimeout = window.setTimeout(() => { - if (!isButtonHovered()) { - setShowScrollButton(false) - } - }, 1500) - } else if (!isButtonHovered()) { - // Only hide if not hovered (to prevent disappearing while user is about to click) - setShowScrollButton(false) - if (scrollTimeout) { - clearTimeout(scrollTimeout) - } - } - } - - onMount(() => { - lastScrollY = window.scrollY // Initialize scroll position - - // Create sentinel element - const sentinel = document.createElement("div") - sentinel.style.height = "1px" - sentinel.style.position = "absolute" - sentinel.style.bottom = "100px" - sentinel.style.width = "100%" - sentinel.style.pointerEvents = "none" - document.body.appendChild(sentinel) - - // Create intersection observer - const observer = new IntersectionObserver((entries) => { - setIsNearBottom(entries[0].isIntersecting) - }) - observer.observe(sentinel) - - // Store references for cleanup - scrollSentinel = sentinel - scrollObserver = observer - - checkScrollNeed() - window.addEventListener("scroll", checkScrollNeed) - window.addEventListener("resize", checkScrollNeed) - }) - - onCleanup(() => { - window.removeEventListener("scroll", checkScrollNeed) - window.removeEventListener("resize", checkScrollNeed) - - // Clean up observer and sentinel - if (scrollObserver) { - scrollObserver.disconnect() - } - if (scrollSentinel) { - document.body.removeChild(scrollSentinel) - } - - if (scrollTimeout) { - clearTimeout(scrollTimeout) - } - }) - - const data = createMemo(() => { - const result = { - rootDir: undefined as string | undefined, - created: undefined as number | undefined, - completed: undefined as number | undefined, - messages: [] as MessageWithParts[], - models: {} as Record, - cost: 0, - tokens: { - input: 0, - output: 0, - reasoning: 0, - }, - } - - if (!store.info) return result - - result.created = store.info.time.created - - const msgs = messages() - for (let i = 0; i < msgs.length; i++) { - const msg = msgs[i] - - result.messages.push(msg) - - if (msg.role === "assistant") { - result.cost += msg.cost - result.tokens.input += msg.tokens.input - result.tokens.output += msg.tokens.output - result.tokens.reasoning += msg.tokens.reasoning - - result.models[`${msg.providerID} ${msg.modelID}`] = [msg.providerID, msg.modelID] - - if (msg.path.root) { - result.rootDir = msg.path.root - } - - if (msg.time.completed) { - result.completed = msg.time.completed - } - } - } - return result - }) - - return ( - - -
-
-

{store.info?.title}

-
-
    -
  • -
    - -
    - - v{store.info?.version} - -
  • - {Object.values(data().models).length > 0 ? ( - - {([provider, model]) => ( -
  • -
    - -
    - {model} -
  • - )} -
    - ) : ( -
  • - {props.messages.models} - — -
  • - )} -
-
- {DateTime.fromMillis(data().created || 0) - .setLocale(normalizeLocale(props.messages.locale)) - .toLocaleString(DateTime.DATETIME_MED)} -
-
-
- -
- 0} fallback={

{props.messages.waiting_for_messages}

}> -
- - - {(msg, msgIndex) => { - const filteredParts = createMemo(() => - msg.parts.filter((x, index) => { - if (x.type === "step-start" && index > 0) return false - if (x.type === "snapshot") return false - if (x.type === "patch") return false - if (x.type === "step-finish") return false - if (x.type === "text" && x.synthetic === true) return false - if (x.type === "text" && !x.text) return false - if (x.type === "tool" && (x.state.status === "pending" || x.state.status === "running")) - return false - return true - }), - ) - - return ( - - - {(part, partIndex) => { - const last = () => - data().messages.length === msgIndex() + 1 && filteredParts().length === partIndex() + 1 - - onMount(() => { - const hash = window.location.hash.slice(1) - // Wait till all parts are loaded - if (hash !== "" && !hasScrolledToAnchor && last()) { - hasScrolledToAnchor = true - scrollToAnchor(hash) - } - }) - - return - }} - - - ) - }} - - -
-
- -
-
-

{getStatusText(connectionStatus(), props.messages)}

-
    -
  • - {props.messages.cost} - {data().cost !== undefined ? ( - {formatCurrency(data().cost, props.messages.locale)} - ) : ( - — - )} -
  • -
  • - {props.messages.input_tokens} - {data().tokens.input ? ( - {formatNumber(data().tokens.input, props.messages.locale)} - ) : ( - — - )} -
  • -
  • - {props.messages.output_tokens} - {data().tokens.output ? ( - {formatNumber(data().tokens.output, props.messages.locale)} - ) : ( - — - )} -
  • -
  • - {props.messages.reasoning_tokens} - {data().tokens.reasoning ? ( - {formatNumber(data().tokens.reasoning, props.messages.locale)} - ) : ( - — - )} -
  • -
-
-
-
-
-
- - -
-
- 0} fallback={

{props.messages.waiting_for_messages}

}> -
    - - {(msg) => ( -
  • -
    - {props.messages.debug_key}: {msg.id} -
    -
    {JSON.stringify(msg, null, 2)}
    -
  • - )} -
    -
-
-
-
-
- - - - -
-
-
- ) -} - -export function fromV1(v1: Message.Info): MessageWithParts { - if (v1.role === "assistant") { - return { - id: v1.id, - sessionID: v1.metadata.sessionID, - role: "assistant", - parentID: "", - agent: "build", - time: { - created: v1.metadata.time.created, - completed: v1.metadata.time.completed, - }, - cost: v1.metadata.assistant!.cost, - path: v1.metadata.assistant!.path, - summary: v1.metadata.assistant!.summary, - tokens: v1.metadata.assistant!.tokens ?? { - input: 0, - output: 0, - cache: { - read: 0, - write: 0, - }, - reasoning: 0, - }, - modelID: v1.metadata.assistant!.modelID, - providerID: v1.metadata.assistant!.providerID, - mode: "build", - error: v1.metadata.error, - parts: v1.parts.flatMap((part, index): MessageV2.Part[] => { - const base = { - id: index.toString(), - messageID: v1.id, - sessionID: v1.metadata.sessionID, - } - if (part.type === "text") { - return [ - { - ...base, - type: "text", - text: part.text, - }, - ] - } - if (part.type === "step-start") { - return [ - { - ...base, - type: "step-start", - }, - ] - } - if (part.type === "tool-invocation") { - return [ - { - ...base, - type: "tool", - callID: part.toolInvocation.toolCallId, - tool: part.toolInvocation.toolName, - state: (() => { - if (part.toolInvocation.state === "partial-call") { - return { - status: "pending", - input: {}, - raw: "", - } - } - - const { title, time, ...metadata } = v1.metadata.tool[part.toolInvocation.toolCallId] - if (part.toolInvocation.state === "call") { - return { - status: "running", - input: part.toolInvocation.args, - time: { - start: time.start, - }, - } - } - - if (part.toolInvocation.state === "result") { - return { - status: "completed", - input: part.toolInvocation.args, - output: part.toolInvocation.result, - title, - time, - metadata, - } - } - throw new Error("unknown tool invocation state") - })(), - }, - ] - } - return [] - }), - } - } - - if (v1.role === "user") { - return { - id: v1.id, - sessionID: v1.metadata.sessionID, - role: "user", - agent: "user", - model: { - providerID: "", - modelID: "", - }, - time: { - created: v1.metadata.time.created, - }, - parts: v1.parts.flatMap((part, index): MessageV2.Part[] => { - const base = { - id: index.toString(), - messageID: v1.id, - sessionID: v1.metadata.sessionID, - } - if (part.type === "text") { - return [ - { - ...base, - type: "text", - text: part.text, - }, - ] - } - if (part.type === "file") { - return [ - { - ...base, - type: "file", - mime: part.mediaType, - filename: part.filename, - url: part.url, - }, - ] - } - return [] - }), - } - } - - throw new Error("unknown message type") -} diff --git a/packages/web/src/components/SiteTitle.astro b/packages/web/src/components/SiteTitle.astro deleted file mode 100644 index 6f1405cb14..0000000000 --- a/packages/web/src/components/SiteTitle.astro +++ /dev/null @@ -1,59 +0,0 @@ ---- -import { logos } from 'virtual:starlight/user-images'; -import config from 'virtual:starlight/user-config'; -const { siteTitle, siteTitleHref } = Astro.locals.starlightRoute; ---- - - - { - config.logo && logos.dark && ( - <> - {config.logo.alt} - {/* Show light alternate if a user configure both light and dark logos. */} - {!('src' in config.logo) && ( - {config.logo.alt} - )} - - ) - } - - {siteTitle} - - - - diff --git a/packages/web/src/components/icons/custom.tsx b/packages/web/src/components/icons/custom.tsx deleted file mode 100644 index 8023032e57..0000000000 --- a/packages/web/src/components/icons/custom.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { type JSX } from "solid-js" - -// https://icones.js.org/collection/ri?s=openai&icon=ri:openai-fill -export function IconOpenAI(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -// https://icones.js.org/collection/ri?s=anthropic&icon=ri:anthropic-fill -export function IconAnthropic(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -// https://icones.js.org/collection/ri?s=gemini&icon=ri:gemini-fill -export function IconGemini(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -export function IconOpencode(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} - -// https://icones.js.org/collection/ri?s=meta&icon=ri:meta-fill -export function IconMeta(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -// https://icones.js.org/collection/ri?s=robot&icon=ri:robot-2-line -export function IconRobot(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -// https://icones.js.org/collection/ri?s=brain&icon=ri:brain-2-line -export function IconBrain(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} diff --git a/packages/web/src/components/icons/index.tsx b/packages/web/src/components/icons/index.tsx deleted file mode 100644 index 62445611f1..0000000000 --- a/packages/web/src/components/icons/index.tsx +++ /dev/null @@ -1,4454 +0,0 @@ -import { type JSX } from "solid-js" -// heroicons - -export function IconAcademicCap(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconAdjustmentsHorizontal(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconAdjustmentsVertical(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArchiveBoxArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArchiveBoxXMark(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArchiveBox(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownOnSquareStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownOnSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDownTray(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLeftCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLeftOnRectangle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLongDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLongLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLongRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowLongUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowPathRoundedSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowPath(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowRightCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowRightOnRectangle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowSmallDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowSmallLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowSmallRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowSmallUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowTopRightOnSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowTrendingDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowTrendingUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpOnSquareStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpOnSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUpTray(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUturnDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUturnLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUturnRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowUturnUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowsPointingIn(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowsPointingOut(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowsRightLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconArrowsUpDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconAtSymbol(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBackspace(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBackward(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconBanknotes(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars2(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars3BottomLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars3BottomRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars3CenterLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars3(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBars4(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBarsArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBarsArrowUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBattery0(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBattery100(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBattery50(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBeaker(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBellAlert(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBellSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBellSnooze(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBell(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBoltSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBolt(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} - -export function IconBoltSolid(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBookOpen(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBookmarkSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBookmarkSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBookmark(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBriefcase(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconBugAnt(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBuildingLibrary(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBuildingOffice2(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBuildingOffice(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconBuildingStorefront(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCake(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCalculator(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCalendarDays(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCalendar(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCamera(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconChartBarSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChartBar(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconChartPie(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconChatBubbleBottomCenterText(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleBottomCenter(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleLeftEllipsis(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleLeftRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleOvalLeftEllipsis(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChatBubbleOvalLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCheckBadge(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCheckCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCheck(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronDoubleDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronDoubleLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronDoubleRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronDoubleUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronUpDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconChevronUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCircleStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconClipboardDocumentCheck(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconClipboardDocumentList(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconClipboardDocument(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconClipboard(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconClock(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCloudArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCloudArrowUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCloud(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCodeBracketSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCodeBracket(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCog6Tooth(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconCog8Tooth(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconCog(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCommandLine(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconComputerDesktop(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCpuChip(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCreditCard(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCubeTransparent(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCube(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyBangladeshi(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyDollar(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyEuro(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyPound(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyRupee(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCurrencyYen(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCursorArrowRays(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconCursorArrowRipple(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDevicePhoneMobile(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDeviceTablet(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentArrowUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentChartBar(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentCheck(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentDuplicate(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentMagnifyingGlass(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentMinus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocumentText(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconDocument(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEllipsisHorizontalCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEllipsisHorizontal(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconEllipsisVertical(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconEnvelopeOpen(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEnvelope(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEnvelopeSolid(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconExclamationCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconExclamationTriangle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEyeDropper(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEyeSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconEye(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconFaceFrown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFaceSmile(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFilm(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFingerPrint(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFire(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconFlag(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFolderArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFolderMinus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFolderOpen(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFolderPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconFolder(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconForward(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconFunnel(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGif(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGiftTop(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGift(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGlobeAlt(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGlobeAmericas(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGlobeAsiaAustralia(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconGlobeEuropeAfrica(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHandRaised(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHandThumbDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHandThumbUp(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHashtag(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHeart(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHomeModern(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconHome(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconIdentification(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconInboxArrowDown(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconInboxStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconInbox(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconInformationCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconKey(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLanguage(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLifebuoy(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLightBulb(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLink(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconListBullet(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLockClosed(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLockOpen(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMagnifyingGlassCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMagnifyingGlassMinus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMagnifyingGlassPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMagnifyingGlass(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMapPin(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconMap(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMegaphone(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMicrophone(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMinusCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMinusSmall(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMinus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMoon(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMusicalNote(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconNewspaper(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconNoSymbol(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPaintBrush(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPaperAirplane(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPaperClip(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPauseCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPause(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPencilSquare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPencil(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPhoneArrowDownLeft(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPhoneArrowUpRight(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPhoneXMark(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPhone(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPhoto(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPlayCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconPlayPause(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPlay(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPlusCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPlusSmall(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPower(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPresentationChartBar(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPresentationChartLine(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPrinter(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconPuzzlePiece(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconQrCode(props: JSX.SvgSVGAttributes) { - return ( - - - - - - - - - - - - - - ) -} -export function IconQuestionMarkCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconQueueList(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconRadio(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconReceiptPercent(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconReceiptRefund(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconRectangleGroup(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconRectangleStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconRocketLaunch(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconRss(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconScale(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconScissors(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconServerStack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconServer(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconShare(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconShieldCheck(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconShieldExclamation(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconShoppingBag(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconShoppingCart(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSignalSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSignal(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSparkles(props: JSX.SvgSVGAttributes) { - return ( - - - - - - ) -} -export function IconSpeakerWave(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSpeakerXMark(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSquare2Stack(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSquare3Stack3d(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSquares2x2(props: JSX.SvgSVGAttributes) { - return ( - - - - - - - ) -} -export function IconSquaresPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconStar(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconStopCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconStop(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSun(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSwatch(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTableCells(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTag(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconTicket(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTrash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTrophy(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTruck(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconTv(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconUserCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconUserGroup(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconUserMinus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconUserPlus(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconUser(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconUsers(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconVariable(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconVideoCameraSlash(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconVideoCamera(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconViewColumns(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconViewfinderCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconWallet(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconWifi(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconWindow(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconWrenchScrewdriver(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconWrench(props: JSX.SvgSVGAttributes) { - return ( - - - - - ) -} -export function IconXCircle(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconXMark(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -// index -export function IconCommand(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconLetter(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconMultiSelect(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} -export function IconSettings(props: JSX.SvgSVGAttributes) { - return ( - - - - - - - - - - - - ) -} -export function IconSingleSelect(props: JSX.SvgSVGAttributes) { - return ( - - - - ) -} diff --git a/packages/web/src/components/share.module.css b/packages/web/src/components/share.module.css deleted file mode 100644 index 9930e6b57c..0000000000 --- a/packages/web/src/components/share.module.css +++ /dev/null @@ -1,832 +0,0 @@ -.root { - display: flex; - flex-direction: column; - gap: 2.5rem; - line-height: 1; - padding: 1.5rem; - - @media (max-width: 30rem) { - padding: 1rem; - gap: 2rem; - } - - --sm-tool-width: 28rem; - --md-tool-width: 40rem; - --lg-tool-width: 56rem; - - --term-icon: url("data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2060%2016'%20preserveAspectRatio%3D'xMidYMid%20meet'%3E%3Ccircle%20cx%3D'8'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'30'%20cy%3D'8'%20r%3D'8'%2F%3E%3Ccircle%20cx%3D'52'%20cy%3D'8'%20r%3D'8'%2F%3E%3C%2Fsvg%3E"); - - [data-component="header"] { - display: flex; - flex-direction: column; - gap: 1rem; - - @media (max-width: 30rem) { - gap: 1rem; - } - } - - [data-component="header-title"] { - font-size: 2.75rem; - font-weight: 500; - line-height: 1.2; - letter-spacing: -0.05em; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - line-clamp: 3; - overflow: hidden; - - @media (max-width: 30rem) { - font-size: 1.75rem; - line-height: 1.25; - -webkit-line-clamp: 3; - } - } - - [data-component="header-details"] { - display: flex; - flex-direction: column; - gap: 0.5rem; - } - - [data-component="header-stats"] { - list-style-type: none; - padding: 0; - margin: 0; - display: flex; - gap: 0.5rem 0.875rem; - flex-wrap: wrap; - max-width: var(--lg-tool-width); - - [data-slot="item"] { - display: flex; - align-items: center; - gap: 0.3125rem; - font-size: 0.875rem; - - span[data-placeholder] { - color: var(--sl-color-text-dimmed); - } - } - - [data-slot="icon"] { - flex: 0 0 auto; - color: var(--sl-color-text-dimmed); - opacity: 0.85; - - svg { - display: block; - } - } - - [data-slot="model"] { - color: var(--sl-color-text); - } - } - - [data-component="header-time"] { - color: var(--sl-color-text-dimmed); - font-size: 0.875rem; - } - - [data-component="text-button"] { - cursor: pointer; - appearance: none; - background-color: transparent; - border: none; - padding: 0; - color: var(--sl-color-text-secondary); - - &:hover { - color: var(--sl-color-text); - } - - &[data-element-button-more] { - display: flex; - align-items: center; - gap: 0.125rem; - - span[data-button-icon] { - line-height: 1; - opacity: 0.85; - - svg { - display: block; - } - } - } - } -} - -.parts { - display: flex; - flex-direction: column; - gap: 0.625rem; - - [data-section="part"] { - display: flex; - gap: 0.625rem; - - & > [data-section="decoration"] { - flex: 0 0 auto; - display: flex; - flex-direction: column; - gap: 0.625rem; - align-items: center; - justify-content: flex-start; - - [data-element-anchor] { - position: relative; - - a:first-child { - display: block; - flex: 0 0 auto; - width: 18px; - opacity: 0.65; - - svg { - color: var(--sl-color-text-secondary); - display: block; - - &:nth-child(3) { - color: var(--sl-color-green-high); - } - } - - svg:nth-child(2), - svg:nth-child(3) { - display: none; - } - - &:hover { - svg:nth-child(1) { - display: none; - } - - svg:nth-child(2) { - display: block; - } - } - } - - [data-element-tooltip] { - position: absolute; - top: 50%; - left: calc(100% + 12px); - transform: translate(0, -50%); - line-height: 1.1; - padding: 0.375em 0.5em calc(0.375em + 2px); - background: var(--sl-color-white); - color: var(--sl-color-text-invert); - font-size: 0.6875rem; - border-radius: 7px; - white-space: nowrap; - - z-index: 1; - opacity: 0; - visibility: hidden; - - &::after { - content: ""; - position: absolute; - top: 50%; - left: -15px; - transform: translateY(-50%); - border: 8px solid transparent; - border-right-color: var(--sl-color-white); - } - } - - &[data-status="copied"] { - [data-element-tooltip] { - opacity: 1; - visibility: visible; - } - - a, - a:hover { - svg:nth-child(1), - svg:nth-child(2) { - display: none; - } - - svg:nth-child(3) { - display: block; - } - } - } - } - - div:last-child { - width: 3px; - height: 100%; - border-radius: 1px; - background-color: var(--sl-color-hairline); - } - } - - & > [data-section="content"] { - flex: 1 1 auto; - min-width: 0; - padding: 0 0 0.375rem; - display: flex; - flex-direction: column; - gap: 1rem; - - [data-part-tool-body] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.375rem; - } - - [data-part-title] { - line-height: 18px; - font-size: 0.875rem; - color: var(--sl-color-text-secondary); - max-width: var(--md-tool-width); - - display: flex; - align-items: flex-start; - gap: 0.375rem; - - span[data-element-label] { - color: var(--sl-color-text-secondary); - } - - b { - color: var(--sl-color-text); - word-break: break-all; - font-weight: 500; - } - } - - span[data-part-footer] { - align-self: flex-start; - font-size: 0.75rem; - color: var(--sl-color-text-dimmed); - } - - span[data-part-model] { - line-height: 1.5; - } - - [data-part-tool-args] { - display: inline-grid; - align-items: center; - grid-template-columns: max-content max-content minmax(0, 1fr); - max-width: var(--md-tool-width); - gap: 0.25rem 0.375rem; - - & > div:nth-child(3n + 1) { - width: 8px; - height: 2px; - border-radius: 1px; - background: var(--sl-color-divider); - } - - & > div:nth-child(3n + 2), - & > div:nth-child(3n + 3) { - font-size: 0.75rem; - line-height: 1.5; - } - - & > div:nth-child(3n + 3) { - padding-left: 0.125rem; - word-break: break-word; - color: var(--sl-color-text-secondary); - } - } - - [data-part-tool-result] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - - button { - font-size: 0.75rem; - } - } - - [data-part-tool-edit] { - width: 100%; - max-width: var(--lg-tool-width); - } - } - } - - /* Part types */ - [data-part-type="user-text"], - [data-part-type="ai-text"], - [data-part-type="ai-model"], - [data-part-type="system-text"], - [data-part-type="fallback"] { - & > [data-section="content"] { - padding-bottom: 1rem; - } - } - - [data-part-type="tool-list"], - [data-part-type="tool-glob"], - [data-part-type="tool-read"], - [data-part-type="tool-edit"], - [data-part-type="tool-write"], - [data-part-type="tool-fetch"] { - & > [data-section="content"] > [data-part-tool-body] { - gap: 0.5rem; - } - } - - [data-part-type="tool-grep"] { - &:not(:has([data-part-tool-args])) > [data-section="content"] > [data-part-tool-body] { - gap: 0.5rem; - } - } - - [data-part-type="tool-write"], - [data-part-type="tool-read"], - [data-part-type="tool-fetch"] { - [data-part-tool-result] { - [data-part-tool-code] { - max-width: var(--md-tool-width); - border: 1px solid var(--sl-color-divider); - background-color: var(--sl-color-bg-surface); - border-radius: 0.25rem; - padding: 0.5rem calc(0.5rem + 3px); - - pre { - line-height: 1.6; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - } - } - } - } - - [data-part-type="summary"] { - & > [data-section="decoration"] { - span:first-child { - flex: 0 0 auto; - display: block; - margin: 2px; - width: 14px; - height: 14px; - border-radius: 50%; - background-color: var(--sl-color-divider); - - &[data-status="connected"] { - background-color: var(--sl-color-green); - } - - &[data-status="connecting"] { - background-color: var(--sl-color-orange); - } - - &[data-status="disconnected"] { - background-color: var(--sl-color-divider); - } - - &[data-status="reconnecting"] { - background-color: var(--sl-color-orange); - } - - &[data-status="error"] { - background-color: var(--sl-color-red); - } - } - } - - & > [data-section="content"] { - display: flex; - flex-direction: column; - gap: 0.5rem; - - p[data-section="copy"] { - display: block; - line-height: 18px; - font-size: 0.875rem; - color: var(--sl-color-text-dimmed); - } - - [data-section="stats"] { - list-style-type: none; - padding: 0; - margin: 0; - display: flex; - gap: 0.5rem 0.875rem; - flex-wrap: wrap; - - li { - display: flex; - align-items: center; - gap: 0.5rem; - font-size: 0.75rem; - color: var(--sl-color-text-secondary); - - span[data-placeholder] { - color: var(--sl-color-text-dimmed); - } - } - } - } - } -} - -.message-text { - background-color: var(--sl-color-bg-surface); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - align-self: flex-start; - max-width: var(--md-tool-width); - - &[data-size="sm"] { - pre { - font-size: 0.75rem; - } - } - - &[data-color="dimmed"] { - pre { - color: var(--sl-color-text-dimmed); - } - } - - pre { - line-height: 1.5; - font-size: 0.875rem; - white-space: pre-wrap; - overflow-wrap: anywhere; - color: var(--sl-color-text); - } - - button { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } - - &[data-invert="true"] { - background-color: var(--sl-color-blue-high); - - pre { - color: var(--sl-color-text-invert); - } - - button { - opacity: 0.85; - color: var(--sl-color-text-invert); - - &:hover { - opacity: 1; - } - } - } - - &[data-background="none"] { - background-color: transparent; - } - - &[data-background="blue"] { - background-color: var(--sl-color-blue-low); - } - - &[data-expanded="true"] { - pre { - display: block; - } - } - - &[data-expanded="false"] { - pre { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - overflow: hidden; - } - } -} - -.message-error { - background-color: var(--sl-color-bg-surface); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - align-self: flex-start; - max-width: var(--md-tool-width); - - [data-section="content"] { - pre { - margin-bottom: 0.5rem; - line-height: 1.5; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - - &:last-child { - margin-bottom: 0; - } - - span { - margin-right: 0.25rem; - - &:last-child { - margin-right: 0; - } - } - - span[data-color="red"] { - color: var(--sl-color-red); - } - - span[data-color="dimmed"] { - color: var(--sl-color-text-dimmed); - } - - span[data-marker="label"] { - text-transform: uppercase; - letter-spacing: -0.5px; - } - - span[data-separator] { - margin-right: 0.375rem; - } - } - } - - &[data-expanded="true"] { - [data-section="content"] { - display: block; - } - } - - &[data-expanded="false"] { - [data-section="content"] { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 7; - overflow: hidden; - } - } - - button { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } -} - -.message-terminal { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - width: 100%; - max-width: var(--sm-tool-width); - - & > [data-section="body"] { - width: 100%; - border: 1px solid var(--sl-color-divider); - border-radius: 0.25rem; - - [data-section="header"] { - position: relative; - border-bottom: 1px solid var(--sl-color-divider); - width: 100%; - height: 1.625rem; - text-align: center; - padding: 0 3.25rem; - - & > span { - max-width: min(100%, 140ch); - display: inline-block; - white-space: nowrap; - overflow: hidden; - line-height: 1.625rem; - font-size: 0.75rem; - text-overflow: ellipsis; - color: var(--sl-color-text-dimmed); - } - - &::before { - content: ""; - position: absolute; - pointer-events: none; - top: 8px; - left: 10px; - width: 2rem; - height: 0.5rem; - line-height: 0; - background-color: var(--sl-color-hairline); - mask-image: var(--term-icon); - mask-repeat: no-repeat; - } - } - } - - [data-section="content"] { - padding: 0.5rem calc(0.5rem + 3px); - - pre { - --shiki-dark-bg: var(--sl-color-bg) !important; - background-color: var(--sl-color-bg) !important; - line-height: 1.6; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - } - } - - [data-section="error"] { - pre { - color: var(--sl-color-red) !important; - --shiki-dark: var(--sl-color-red) !important; - } - } - - &[data-expanded="true"] { - pre { - display: block; - } - } - - &[data-expanded="false"] { - pre { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 7; - overflow: hidden; - } - } - - button { - flex: 0 0 auto; - padding-left: 1px; - font-size: 0.75rem; - } -} - -.message-markdown { - border: 1px solid var(--sl-color-blue-high); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - align-self: flex-start; - max-width: var(--md-tool-width); - - button { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } - - &[data-highlight="true"] { - background-color: var(--sl-color-blue-low); - } - - &[data-expanded="true"] { - [data-element-markdown] { - display: block; - } - } - - &[data-expanded="false"] { - [data-element-markdown] { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - overflow: hidden; - } - } -} - -.diff-code-block { - pre { - line-height: 1.25; - font-size: 0.75rem; - } -} - -.todos { - list-style-type: none; - padding: 0; - margin: 0; - width: 100%; - max-width: var(--sm-tool-width); - border: 1px solid var(--sl-color-divider); - border-radius: 0.25rem; - - li { - margin: 0; - position: relative; - padding-left: 1.5rem; - font-size: 0.75rem; - padding: 0.375rem 0.625rem 0.375rem 1.75rem; - border-bottom: 1px solid var(--sl-color-divider); - line-height: 1.5; - word-break: break-word; - - &:last-child { - border-bottom: none; - } - - & > span { - position: absolute; - display: inline-block; - left: 0.5rem; - top: calc(0.5rem + 1px); - width: 0.75rem; - height: 0.75rem; - border: 1px solid var(--sl-color-divider); - border-radius: 0.15rem; - - &::before { - } - } - - &[data-status="pending"] { - color: var(--sl-color-text); - } - - &[data-status="in_progress"] { - color: var(--sl-color-text); - - & > span { - border-color: var(--sl-color-orange); - } - - & > span::before { - content: ""; - position: absolute; - top: 2px; - left: 2px; - width: calc(0.75rem - 2px - 4px); - height: calc(0.75rem - 2px - 4px); - box-shadow: inset 1rem 1rem var(--sl-color-orange-low); - } - } - - &[data-status="completed"] { - color: var(--sl-color-text-secondary); - - & > span { - border-color: var(--sl-color-green-low); - } - - & > span::before { - content: ""; - position: absolute; - top: 2px; - left: 2px; - width: calc(0.75rem - 2px - 4px); - height: calc(0.75rem - 2px - 4px); - box-shadow: inset 1rem 1rem var(--sl-color-green); - - transform-origin: bottom left; - clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); - } - } - } -} - -.scroll-button { - position: fixed; - bottom: 2rem; - right: 2rem; - width: 2.5rem; - height: 2.5rem; - border-radius: 0.25rem; - border: 1px solid var(--sl-color-divider); - background-color: var(--sl-color-bg-surface); - color: var(--sl-color-text-secondary); - cursor: pointer; - display: flex; - align-items: center; - justify-content: center; - transition: - all 0.15s ease, - opacity 0.5s ease; - z-index: 100; - appearance: none; - opacity: 1; - - &:active { - transform: translateY(1px); - } - - svg { - display: block; - } -} diff --git a/packages/web/src/components/share/common.tsx b/packages/web/src/components/share/common.tsx deleted file mode 100644 index ad50e425fa..0000000000 --- a/packages/web/src/components/share/common.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import { createContext, createSignal, splitProps, useContext } from "solid-js" -import type { JSX } from "solid-js/jsx-runtime" -import { makeResizeObserver } from "@solid-primitives/resize-observer" -import { IconCheckCircle, IconHashtag } from "../icons" - -export type ShareMessages = { locale: string } & Record - -const shareContext = createContext() - -export function ShareI18nProvider(props: { messages: ShareMessages; children: JSX.Element }) { - return {props.children} -} - -export function useShareMessages() { - const value = useContext(shareContext) - if (value) { - return value - } - throw new Error("ShareI18nProvider is required") -} - -export function normalizeLocale(locale: string) { - return locale === "root" ? "en" : locale -} - -export function formatNumber(value: number, locale: string) { - return new Intl.NumberFormat(normalizeLocale(locale)).format(value) -} - -export function formatCurrency(value: number, locale: string) { - return new Intl.NumberFormat(normalizeLocale(locale), { - style: "currency", - currency: "USD", - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }).format(value) -} - -export function formatCount(value: number, locale: string, singular: string, plural: string) { - const unit = value === 1 ? singular : plural - return `${formatNumber(value, locale)} ${unit}` -} - -interface AnchorProps extends JSX.HTMLAttributes { - id: string -} -export function AnchorIcon(props: AnchorProps) { - const [local, rest] = splitProps(props, ["id", "children"]) - const [copied, setCopied] = createSignal(false) - const messages = useShareMessages() - - return ( - - ) -} - -export function createOverflow() { - const [overflow, setOverflow] = createSignal(false) - return { - get status() { - return overflow() - }, - ref(el: HTMLElement) { - const sync = () => { - setOverflow(el.scrollHeight > el.clientHeight + 1) - } - - const obs = makeResizeObserver(sync) - obs.observe(el) - - sync() - }, - } -} - -export function formatDuration(ms: number, locale: string): string { - const normalized = normalizeLocale(locale) - const ONE_SECOND = 1000 - const ONE_MINUTE = 60 * ONE_SECOND - - if (ms >= ONE_MINUTE) { - return new Intl.NumberFormat(normalized, { - style: "unit", - unit: "minute", - unitDisplay: "narrow", - maximumFractionDigits: 0, - }).format(Math.floor(ms / ONE_MINUTE)) - } - - if (ms >= ONE_SECOND) { - return new Intl.NumberFormat(normalized, { - style: "unit", - unit: "second", - unitDisplay: "narrow", - maximumFractionDigits: 0, - }).format(Math.floor(ms / ONE_SECOND)) - } - - return new Intl.NumberFormat(normalized, { - style: "unit", - unit: "millisecond", - unitDisplay: "narrow", - maximumFractionDigits: 0, - }).format(ms) -} diff --git a/packages/web/src/components/share/content-bash.module.css b/packages/web/src/components/share/content-bash.module.css deleted file mode 100644 index 0915282d77..0000000000 --- a/packages/web/src/components/share/content-bash.module.css +++ /dev/null @@ -1,85 +0,0 @@ -.root { - display: contents; - - [data-slot="expand-button"] { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } - - [data-slot="body"] { - border: 1px solid var(--sl-color-divider); - border-radius: 0.25rem; - overflow: hidden; - width: 100%; - } - - [data-slot="header"] { - position: relative; - border-bottom: 1px solid var(--sl-color-divider); - width: 100%; - height: 1.625rem; - text-align: center; - padding: 0 3.25rem; - - > span { - max-width: min(100%, 140ch); - display: inline-block; - white-space: nowrap; - overflow: hidden; - line-height: 1.625rem; - font-size: 0.75rem; - text-overflow: ellipsis; - color: var(--sl-color-text-dimmed); - } - - &::before { - content: ""; - position: absolute; - pointer-events: none; - top: 8px; - left: 10px; - width: 2rem; - height: 0.5rem; - line-height: 0; - background-color: var(--sl-color-hairline); - mask-image: var(--term-icon); - mask-repeat: no-repeat; - } - } - - [data-slot="content"] { - display: flex; - flex-direction: column; - padding: 0.5rem calc(0.5rem + 3px); - - pre { - --shiki-dark-bg: var(--sl-color-bg) !important; - background-color: var(--sl-color-bg) !important; - line-height: 1.6; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - margin: 0; - - span { - white-space: break-spaces; - } - } - } - - [data-slot="output"] { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 10; - line-clamp: 10; - overflow: hidden; - } - - &[data-expanded] [data-slot="output"] { - display: block; - -webkit-line-clamp: none; - line-clamp: none; - overflow: visible; - } -} diff --git a/packages/web/src/components/share/content-bash.tsx b/packages/web/src/components/share/content-bash.tsx deleted file mode 100644 index 14fd6df6c2..0000000000 --- a/packages/web/src/components/share/content-bash.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import style from "./content-bash.module.css" -import { createResource, createSignal } from "solid-js" -import { createOverflow, useShareMessages } from "./common" -import { codeToHtml } from "shiki" - -interface Props { - command: string - output: string - expand?: boolean -} - -export function ContentBash(props: Props) { - const messages = useShareMessages() - const [commandHtml] = createResource( - () => props.command, - async (command) => { - return codeToHtml(command || "", { - lang: "bash", - themes: { - light: "github-light", - dark: "github-dark", - }, - }) - }, - ) - - const [outputHtml] = createResource( - () => props.output, - async (output) => { - return codeToHtml(output || "", { - lang: "console", - themes: { - light: "github-light", - dark: "github-dark", - }, - }) - }, - ) - - const [expanded, setExpanded] = createSignal(false) - const overflow = createOverflow() - - return ( -
-
-
- Shell -
-
-
-
-
-
- - {!props.expand && overflow.status && ( - - )} -
- ) -} diff --git a/packages/web/src/components/share/content-code.module.css b/packages/web/src/components/share/content-code.module.css deleted file mode 100644 index ec159d6467..0000000000 --- a/packages/web/src/components/share/content-code.module.css +++ /dev/null @@ -1,26 +0,0 @@ -.root { - border: 1px solid var(--sl-color-divider); - background-color: var(--sl-color-bg-surface); - border-radius: 0.25rem; - padding: 0.5rem calc(0.5rem + 3px); - - &[data-flush="true"] { - border: none; - background-color: transparent; - padding: 0; - border-radius: 0; - } - - pre { - --shiki-dark-bg: var(--sl-color-bg-surface) !important; - background-color: var(--sl-color-bg-surface) !important; - line-height: 1.6; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - - span { - white-space: break-spaces; - } - } -} diff --git a/packages/web/src/components/share/content-code.tsx b/packages/web/src/components/share/content-code.tsx deleted file mode 100644 index 2978286020..0000000000 --- a/packages/web/src/components/share/content-code.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { codeToHtml, bundledLanguages } from "shiki" -import { createResource, Suspense } from "solid-js" -import style from "./content-code.module.css" - -interface Props { - code: string - lang?: string - flush?: boolean -} -export function ContentCode(props: Props) { - const [html] = createResource( - () => [props.code, props.lang], - async ([code, lang]) => { - // TODO: For testing delays - // await new Promise((resolve) => setTimeout(resolve, 3000)) - return (await codeToHtml(code || "", { - lang: lang && lang in bundledLanguages ? lang : "text", - themes: { - light: "github-light", - dark: "github-dark", - }, - })) as string - }, - ) - return ( - -
- - ) -} diff --git a/packages/web/src/components/share/content-diff.module.css b/packages/web/src/components/share/content-diff.module.css deleted file mode 100644 index 1dfb0777ba..0000000000 --- a/packages/web/src/components/share/content-diff.module.css +++ /dev/null @@ -1,153 +0,0 @@ -.root { - display: flex; - flex-direction: column; - border: 1px solid var(--sl-color-divider); - background-color: var(--sl-color-bg-surface); - border-radius: 0.25rem; - - [data-component="desktop"] { - display: block; - } - - [data-component="mobile"] { - display: none; - } - - [data-component="diff-block"] { - display: flex; - flex-direction: column; - } - - [data-component="diff-row"] { - display: grid; - grid-template-columns: 1fr 1fr; - align-items: stretch; - - &:first-child { - [data-slot="before"], - [data-slot="after"] { - padding-top: 0.25rem; - } - } - - &:last-child { - [data-slot="before"], - [data-slot="after"] { - padding-bottom: 0.25rem; - } - } - - [data-slot="before"], - [data-slot="after"] { - position: relative; - display: flex; - flex-direction: column; - overflow-x: visible; - min-width: 0; - align-items: stretch; - padding: 0 1rem 0 2.2ch; - - &[data-diff-type="removed"] { - background-color: var(--sl-color-red-low); - - pre { - --shiki-dark-bg: var(--sl-color-red-low) !important; - background-color: var(--sl-color-red-low) !important; - } - - &::before { - content: "-"; - position: absolute; - left: 0.6ch; - top: 1px; - user-select: none; - color: var(--sl-color-red-high); - } - } - - &[data-diff-type="added"] { - background-color: var(--sl-color-green-low); - - pre { - --shiki-dark-bg: var(--sl-color-green-low) !important; - background-color: var(--sl-color-green-low) !important; - } - - &::before { - content: "+"; - position: absolute; - user-select: none; - color: var(--sl-color-green-high); - left: 0.6ch; - top: 1px; - } - } - } - - [data-slot="before"] { - border-right: 1px solid var(--sl-color-divider); - } - } - - [data-component="mobile"] { - & > [data-component="diff-block"]:first-child > div { - padding-top: 0.25rem; - } - - & > [data-component="diff-block"]:last-child > div { - padding-bottom: 0.25rem; - } - - & > [data-component="diff-block"] > div { - padding: 0 1rem 0 2.2ch; - - &[data-diff-type="removed"] { - position: relative; - background-color: var(--sl-color-red-low); - - pre { - --shiki-dark-bg: var(--sl-color-red-low) !important; - background-color: var(--sl-color-red-low) !important; - } - - &::before { - content: "-"; - position: absolute; - left: 0.6ch; - top: 1px; - user-select: none; - color: var(--sl-color-red-high); - } - } - - &[data-diff-type="added"] { - position: relative; - background-color: var(--sl-color-green-low); - - pre { - --shiki-dark-bg: var(--sl-color-green-low) !important; - background-color: var(--sl-color-green-low) !important; - } - - &::before { - content: "+"; - position: absolute; - left: 0.6ch; - top: 1px; - user-select: none; - color: var(--sl-color-green-high); - } - } - } - } - - @media (max-width: 40rem) { - [data-component="desktop"] { - display: none; - } - - [data-component="mobile"] { - display: block; - } - } -} diff --git a/packages/web/src/components/share/content-diff.tsx b/packages/web/src/components/share/content-diff.tsx deleted file mode 100644 index c8dd35b38f..0000000000 --- a/packages/web/src/components/share/content-diff.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import { parsePatch } from "diff" -import { createMemo, For } from "solid-js" -import { ContentCode } from "./content-code" -import styles from "./content-diff.module.css" - -type DiffRow = { - left: string - right: string - type: "added" | "removed" | "unchanged" | "modified" -} - -interface Props { - diff: string - lang?: string -} - -export function ContentDiff(props: Props) { - const rows = createMemo(() => { - const diffRows: DiffRow[] = [] - - try { - const patches = parsePatch(props.diff) - - for (const patch of patches) { - for (const hunk of patch.hunks) { - const lines = hunk.lines - let i = 0 - - while (i < lines.length) { - const line = lines[i] - const content = line.slice(1) - const prefix = line[0] - - if (prefix === "-") { - // Look ahead for consecutive additions to pair with removals - const removals: string[] = [content] - let j = i + 1 - - // Collect all consecutive removals - while (j < lines.length && lines[j][0] === "-") { - removals.push(lines[j].slice(1)) - j++ - } - - // Collect all consecutive additions that follow - const additions: string[] = [] - while (j < lines.length && lines[j][0] === "+") { - additions.push(lines[j].slice(1)) - j++ - } - - // Pair removals with additions - const maxLength = Math.max(removals.length, additions.length) - for (let k = 0; k < maxLength; k++) { - const hasLeft = k < removals.length - const hasRight = k < additions.length - - if (hasLeft && hasRight) { - // Replacement - left is removed, right is added - diffRows.push({ - left: removals[k], - right: additions[k], - type: "modified", - }) - } else if (hasLeft) { - // Pure removal - diffRows.push({ - left: removals[k], - right: "", - type: "removed", - }) - } else if (hasRight) { - // Pure addition - only create if we actually have content - diffRows.push({ - left: "", - right: additions[k], - type: "added", - }) - } - } - - i = j - } else if (prefix === "+") { - // Standalone addition (not paired with removal) - diffRows.push({ - left: "", - right: content, - type: "added", - }) - i++ - } else if (prefix === " ") { - diffRows.push({ - left: content === "" ? " " : content, - right: content === "" ? " " : content, - type: "unchanged", - }) - i++ - } else { - i++ - } - } - } - } - } catch (error) { - console.error("Failed to parse patch:", error) - return [] - } - - return diffRows - }) - - const mobileRows = createMemo(() => { - const mobileBlocks: { - type: "removed" | "added" | "unchanged" - lines: string[] - }[] = [] - const currentRows = rows() - - let i = 0 - while (i < currentRows.length) { - const removedLines: string[] = [] - const addedLines: string[] = [] - - // Collect consecutive modified/removed/added rows - while ( - i < currentRows.length && - (currentRows[i].type === "modified" || currentRows[i].type === "removed" || currentRows[i].type === "added") - ) { - const row = currentRows[i] - if (row.left && (row.type === "removed" || row.type === "modified")) { - removedLines.push(row.left) - } - if (row.right && (row.type === "added" || row.type === "modified")) { - addedLines.push(row.right) - } - i++ - } - - // Add grouped blocks - if (removedLines.length > 0) { - mobileBlocks.push({ type: "removed", lines: removedLines }) - } - if (addedLines.length > 0) { - mobileBlocks.push({ type: "added", lines: addedLines }) - } - - // Add unchanged rows as-is - if (i < currentRows.length && currentRows[i].type === "unchanged") { - mobileBlocks.push({ - type: "unchanged", - lines: [currentRows[i].left], - }) - i++ - } - } - - return mobileBlocks - }) - - return ( -
-
- - {(row) => ( -
-
- -
-
- -
-
- )} -
-
- -
- - {(block) => ( -
- - {(line) => ( -
- -
- )} -
-
- )} -
-
-
- ) -} - -// const testDiff = `--- combined_before.txt 2025-06-24 16:38:08 -// +++ combined_after.txt 2025-06-24 16:38:12 -// @@ -1,21 +1,25 @@ -// unchanged line -// -deleted line -// -old content -// +added line -// +new content -// -// -removed empty line below -// +added empty line above -// -// - tab indented -// -trailing spaces -// -very long line that will definitely wrap in most editors and cause potential alignment issues when displayed in a two column diff view -// -unicode content: 🚀 ✨ 中文 -// -mixed content with tabs and spaces -// + space indented -// +no trailing spaces -// +short line -// +very long replacement line that will also wrap and test how the diff viewer handles long line additions after short line removals -// +different unicode: 🎉 💻 日本語 -// +normalized content with consistent spacing -// +newline to content -// -// -content to remove -// -whitespace only: -// -multiple -// -consecutive -// -deletions -// -single deletion -// + -// +single addition -// +first addition -// +second addition -// +third addition -// line before addition -// +first added line -// + -// +third added line -// line after addition -// final unchanged line` diff --git a/packages/web/src/components/share/content-error.module.css b/packages/web/src/components/share/content-error.module.css deleted file mode 100644 index 9ed051a806..0000000000 --- a/packages/web/src/components/share/content-error.module.css +++ /dev/null @@ -1,64 +0,0 @@ -.root { - background-color: var(--sl-color-bg-surface); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - align-self: flex-start; - - [data-section="content"] { - pre { - margin-bottom: 0.5rem; - line-height: 1.5; - font-size: 0.75rem; - white-space: pre-wrap; - word-break: break-word; - - &:last-child { - margin-bottom: 0; - } - - span { - margin-right: 0.25rem; - &:last-child { - margin-right: 0; - } - } - span[data-color="red"] { - color: var(--sl-color-red); - } - span[data-color="dimmed"] { - color: var(--sl-color-text-dimmed); - } - span[data-marker="label"] { - text-transform: uppercase; - letter-spacing: -0.5px; - } - span[data-separator] { - margin-right: 0.375rem; - } - } - } - - &[data-expanded="true"] { - [data-section="content"] { - display: block; - } - } - &[data-expanded="false"] { - [data-section="content"] { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 7; - overflow: hidden; - } - } - - button { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } -} diff --git a/packages/web/src/components/share/content-error.tsx b/packages/web/src/components/share/content-error.tsx deleted file mode 100644 index 0f85889976..0000000000 --- a/packages/web/src/components/share/content-error.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import style from "./content-error.module.css" -import { type JSX, createSignal } from "solid-js" -import { createOverflow, useShareMessages } from "./common" - -interface Props extends JSX.HTMLAttributes { - expand?: boolean -} -export function ContentError(props: Props) { - const [expanded, setExpanded] = createSignal(false) - const overflow = createOverflow() - const messages = useShareMessages() - - return ( -
-
- {props.children} -
- {((!props.expand && overflow.status) || expanded()) && ( - - )} -
- ) -} diff --git a/packages/web/src/components/share/content-markdown.module.css b/packages/web/src/components/share/content-markdown.module.css deleted file mode 100644 index 858a8adea8..0000000000 --- a/packages/web/src/components/share/content-markdown.module.css +++ /dev/null @@ -1,154 +0,0 @@ -.root { - position: relative; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - - [data-slot="expand-button"] { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.857em; - } - - [data-slot="markdown"] { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - line-clamp: 3; - overflow: hidden; - - [data-expanded] & { - display: block; - } - - font-size: 1em; - line-height: 1.5; - - p, - blockquote, - ul, - ol, - dl, - table, - pre { - margin-bottom: 1rem; - } - - ul, - ol { - margin-bottom: 0.5rem; - } - - /* Add spacing between top-level list items */ - ol > li { - margin-bottom: 0.5rem; - } - - strong { - font-weight: 600; - } - - ol { - list-style-position: outside; - padding-left: 1.5rem; - } - - ul { - padding-left: 1.5rem; - } - - /* Nested list spacing */ - li ul, - li ol { - margin-top: 0.25rem; - margin-bottom: 0; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - font-size: 1em; - font-weight: 600; - margin-bottom: 0.5rem; - } - - & > *:last-child { - margin-bottom: 0; - } - - pre { - --shiki-dark-bg: var(--sl-color-bg-surface) !important; - background-color: var(--sl-color-bg-surface) !important; - padding: 0.5rem 0.75rem; - line-height: 1.6; - font-size: 0.857em; - white-space: pre-wrap; - word-break: break-word; - - span { - white-space: break-spaces; - } - } - - code { - font-weight: 500; - - &:not(pre code) { - &::before { - content: "`"; - font-weight: 700; - } - - &::after { - content: "`"; - font-weight: 700; - } - } - } - - table { - border-collapse: collapse; - width: 100%; - } - - th, - td { - border: 1px solid var(--sl-color-border); - padding: 0.5rem 0.75rem; - text-align: left; - } - - th { - border-bottom: 1px solid var(--sl-color-border); - } - - /* Remove outer borders */ - table tr:first-child th, - table tr:first-child td { - border-top: none; - } - - table tr:last-child td { - border-bottom: none; - } - - table th:first-child, - table td:first-child { - border-left: none; - } - - table th:last-child, - table td:last-child { - border-right: none; - } - } - - [data-component="copy-button"] { - top: 0; - right: 0; - } -} diff --git a/packages/web/src/components/share/content-markdown.tsx b/packages/web/src/components/share/content-markdown.tsx deleted file mode 100644 index 10a06bf5ed..0000000000 --- a/packages/web/src/components/share/content-markdown.tsx +++ /dev/null @@ -1,74 +0,0 @@ -import { marked } from "marked" -import { codeToHtml } from "shiki" -import markedShiki from "marked-shiki" -import { createOverflow, useShareMessages } from "./common" -import { CopyButton } from "./copy-button" -import { createResource, createSignal } from "solid-js" -import style from "./content-markdown.module.css" - -const markedWithShiki = marked.use( - { - renderer: { - link({ href, title, text }) { - const titleAttr = title ? ` title="${title}"` : "" - return `${text}` - }, - }, - }, - markedShiki({ - highlight(code, lang) { - return codeToHtml(code, { - lang: lang || "text", - themes: { - light: "github-light", - dark: "github-dark", - }, - }) - }, - }), -) - -interface Props { - text: string - expand?: boolean - highlight?: boolean -} -export function ContentMarkdown(props: Props) { - const [html] = createResource( - () => strip(props.text), - async (markdown) => { - return markedWithShiki.parse(markdown) - }, - ) - const [expanded, setExpanded] = createSignal(false) - const overflow = createOverflow() - const messages = useShareMessages() - - return ( -
-
- - {!props.expand && overflow.status && ( - - )} - -
- ) -} - -function strip(text: string): string { - const wrappedRe = /^\s*<([A-Za-z]\w*)>\s*([\s\S]*?)\s*<\/\1>\s*$/ - const match = text.match(wrappedRe) - return match ? match[2] : text -} diff --git a/packages/web/src/components/share/content-text.module.css b/packages/web/src/components/share/content-text.module.css deleted file mode 100644 index 139aa3faab..0000000000 --- a/packages/web/src/components/share/content-text.module.css +++ /dev/null @@ -1,63 +0,0 @@ -.root { - position: relative; - color: var(--sl-color-text); - background-color: var(--sl-color-bg-surface); - padding: 0.5rem calc(0.5rem + 3px); - padding-right: calc(1rem + 18px); - border-radius: 0.25rem; - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 1rem; - align-self: flex-start; - font-size: 0.875rem; - - &[data-compact] { - font-size: 0.75rem; - color: var(--sl-color-text-dimmed); - } - - [data-slot="text"] { - line-height: 1.5; - white-space: pre-wrap; - overflow-wrap: anywhere; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 3; - line-clamp: 3; - overflow: hidden; - - [data-expanded] & { - display: block; - } - } - - [data-slot="expand-button"] { - flex: 0 0 auto; - padding: 2px 0; - font-size: 0.75rem; - } - - &[data-theme="invert"] { - background-color: var(--sl-color-blue-high); - color: var(--sl-color-text-invert); - - [data-slot="expand-button"] { - opacity: 0.85; - color: var(--sl-color-text-invert); - - &:hover { - opacity: 1; - } - } - } - - &[data-theme="blue"] { - background-color: var(--sl-color-blue-low); - } - - [data-component="copy-button"] { - top: 0.5rem; - right: calc(0.5rem - 1px); - } -} diff --git a/packages/web/src/components/share/content-text.tsx b/packages/web/src/components/share/content-text.tsx deleted file mode 100644 index b549b74a4c..0000000000 --- a/packages/web/src/components/share/content-text.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import style from "./content-text.module.css" -import { createSignal } from "solid-js" -import { createOverflow, useShareMessages } from "./common" -import { CopyButton } from "./copy-button" - -interface Props { - text: string - expand?: boolean - compact?: boolean -} -export function ContentText(props: Props) { - const [expanded, setExpanded] = createSignal(false) - const overflow = createOverflow() - const messages = useShareMessages() - - return ( -
-
-        {props.text}
-      
- {((!props.expand && overflow.status) || expanded()) && ( - - )} - -
- ) -} diff --git a/packages/web/src/components/share/copy-button.module.css b/packages/web/src/components/share/copy-button.module.css deleted file mode 100644 index 31013fc08f..0000000000 --- a/packages/web/src/components/share/copy-button.module.css +++ /dev/null @@ -1,30 +0,0 @@ -.root { - position: absolute; - opacity: 0; - visibility: hidden; - transition: opacity 0.15s ease; - - button { - cursor: pointer; - background: none; - border: none; - padding: 0.125rem; - color: var(--sl-color-text-secondary); - - svg { - display: block; - width: 1rem; - height: 1rem; - } - - &[data-copied="true"] { - color: var(--sl-color-green-high); - } - } -} - -/* Show copy button when parent is hovered */ -*:hover > .root { - opacity: 1; - visibility: visible; -} diff --git a/packages/web/src/components/share/copy-button.tsx b/packages/web/src/components/share/copy-button.tsx deleted file mode 100644 index 6c5097a997..0000000000 --- a/packages/web/src/components/share/copy-button.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { createSignal } from "solid-js" -import { IconClipboard, IconCheckCircle } from "../icons" -import { useShareMessages } from "./common" -import styles from "./copy-button.module.css" - -interface CopyButtonProps { - text: string -} - -export function CopyButton(props: CopyButtonProps) { - const [copied, setCopied] = createSignal(false) - const messages = useShareMessages() - - function handleCopyClick() { - if (props.text) { - navigator.clipboard.writeText(props.text).catch((err) => console.error("Copy failed", err)) - - setCopied(true) - setTimeout(() => setCopied(false), 2000) - } - } - - return ( -
- -
- ) -} diff --git a/packages/web/src/components/share/part.module.css b/packages/web/src/components/share/part.module.css deleted file mode 100644 index b1269445f6..0000000000 --- a/packages/web/src/components/share/part.module.css +++ /dev/null @@ -1,428 +0,0 @@ -.root { - display: flex; - gap: 0.625rem; - - [data-component="decoration"] { - flex: 0 0 auto; - display: flex; - flex-direction: column; - gap: 0.625rem; - align-items: center; - justify-content: flex-start; - - [data-slot="anchor"] { - position: relative; - - a:first-child { - display: block; - flex: 0 0 auto; - width: 18px; - opacity: 0.65; - - svg { - color: var(--sl-color-text-secondary); - display: block; - - &:nth-child(3) { - color: var(--sl-color-green-high); - } - } - - svg:nth-child(2), - svg:nth-child(3) { - display: none; - } - - &:hover { - svg:nth-child(1) { - display: none; - } - - svg:nth-child(2) { - display: block; - } - } - } - - [data-copied] & { - a, - a:hover { - svg:nth-child(1), - svg:nth-child(2) { - display: none; - } - - svg:nth-child(3) { - display: block; - } - } - } - } - - [data-slot="bar"] { - width: 3px; - height: 100%; - border-radius: 1px; - background-color: var(--sl-color-hairline); - } - - [data-slot="tooltip"] { - position: absolute; - top: 50%; - left: calc(100% + 12px); - transform: translate(0, -50%); - line-height: 1.1; - padding: 0.375em 0.5em calc(0.375em + 2px); - background: var(--sl-color-white); - color: var(--sl-color-text-invert); - font-size: 0.6875rem; - border-radius: 7px; - white-space: nowrap; - - z-index: 1; - opacity: 0; - visibility: hidden; - - &::after { - content: ""; - position: absolute; - top: 50%; - left: -15px; - transform: translateY(-50%); - border: 8px solid transparent; - border-right-color: var(--sl-color-white); - } - - [data-copied] & { - opacity: 1; - visibility: visible; - } - } - } - - [data-component="content"] { - flex: 1 1 auto; - min-width: 0; - padding: 0 0 1rem; - display: flex; - flex-direction: column; - gap: 1rem; - } - - [data-component="spacer"] { - height: 0rem; - } - - [data-component="content-footer"] { - align-self: flex-start; - font-size: 0.75rem; - color: var(--sl-color-text-dimmed); - } - - [data-component="user-text"] { - min-width: 0; - display: flex; - flex-direction: column; - gap: 1rem; - flex-grow: 1; - max-width: var(--md-tool-width); - position: relative; - } - - [data-component="assistant-reasoning"] { - min-width: 0; - display: flex; - flex-direction: column; - gap: 0.5rem; - flex-grow: 1; - max-width: var(--md-tool-width); - - [data-component="assistant-reasoning-markdown"] { - align-self: flex-start; - font-size: 0.75rem; - border: 1px solid var(--sl-color-blue-high); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - position: relative; - } - } - - [data-component="assistant-text"] { - min-width: 0; - display: flex; - flex-direction: column; - gap: 1rem; - flex-grow: 1; - max-width: var(--md-tool-width); - - & > [data-component="assistant-text-markdown"] { - align-self: flex-start; - font-size: 0.875rem; - border: 1px solid var(--sl-color-blue-high); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - position: relative; - } - } - - [data-component="step-start"] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.375rem; - - [data-slot="provider"] { - line-height: 18px; - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: -0.5px; - color: var(--sl-color-text-secondary); - } - - [data-slot="model"] { - line-height: 1.5; - } - } - - [data-component="attachment"] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.375rem; - padding-bottom: 1rem; - - [data-slot="copy"] { - line-height: 18px; - font-size: 0.875rem; - text-transform: uppercase; - letter-spacing: -0.5px; - color: var(--sl-color-text-secondary); - } - - [data-slot="filename"] { - line-height: 1.5; - font-size: 0.875rem; - font-weight: 500; - max-width: var(--md-tool-width); - } - } - - [data-component="button-text"] { - cursor: pointer; - appearance: none; - background-color: transparent; - border: none; - padding: 0; - color: var(--sl-color-text-secondary); - font-size: 0.75rem; - - &:hover { - color: var(--sl-color-text); - } - - &[data-more] { - display: flex; - align-items: center; - gap: 0.125rem; - - span[data-slot="icon"] { - line-height: 1; - opacity: 0.85; - - svg { - display: block; - } - } - } - } - - [data-component="tool"] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.375rem; - - &[data-tool="bash"] { - max-width: var(--sm-tool-width); - } - - &[data-tool="error"] { - max-width: var(--md-tool-width); - } - - &[data-tool="read"], - &[data-tool="edit"], - &[data-tool="list"], - &[data-tool="glob"], - &[data-tool="grep"], - &[data-tool="write"], - &[data-tool="webfetch"] { - [data-component="tool-result"] { - max-width: var(--sm-tool-width); - } - } - &[data-tool="edit"] { - [data-component="tool-result"] { - max-width: var(--lg-tool-width); - align-items: stretch; - width: 100%; - } - } - &[data-tool="task"] { - [data-component="tool-input"] { - font-size: 0.75rem; - line-height: 1.5; - max-width: var(--md-tool-width); - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - } - [data-component="tool-output"] { - max-width: var(--sm-tool-width); - font-size: 0.75rem; - border: 1px solid var(--sl-color-divider); - padding: 0.5rem calc(0.5rem + 3px); - border-radius: 0.25rem; - position: relative; - } - } - } - - [data-component="tool-title"] { - line-height: 18px; - font-size: 0.875rem; - color: var(--sl-color-text-secondary); - max-width: var(--md-tool-width); - display: flex; - align-items: flex-start; - gap: 0.375rem; - - [data-slot="name"] { - text-transform: uppercase; - letter-spacing: -0.5px; - } - - [data-slot="target"] { - color: var(--sl-color-text); - word-break: break-all; - font-weight: 500; - } - } - - [data-component="tool-result"] { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 0.5rem; - } - - [data-component="todos"] { - list-style-type: none; - padding: 0; - margin: 0; - width: 100%; - max-width: var(--sm-tool-width); - border: 1px solid var(--sl-color-divider); - border-radius: 0.25rem; - - [data-slot="item"] { - margin: 0; - position: relative; - padding-left: 1.5rem; - font-size: 0.75rem; - padding: 0.375rem 0.625rem 0.375rem 1.75rem; - border-bottom: 1px solid var(--sl-color-divider); - line-height: 1.5; - word-break: break-word; - - &:last-child { - border-bottom: none; - } - - & > span { - position: absolute; - display: inline-block; - left: 0.5rem; - top: calc(0.5rem + 1px); - width: 0.75rem; - height: 0.75rem; - border: 1px solid var(--sl-color-divider); - border-radius: 0.15rem; - - &::before { - } - } - - &[data-status="pending"] { - color: var(--sl-color-text); - } - - &[data-status="in_progress"] { - color: var(--sl-color-text); - - & > span { - border-color: var(--sl-color-orange); - } - - & > span::before { - content: ""; - position: absolute; - top: 2px; - left: 2px; - width: calc(0.75rem - 2px - 4px); - height: calc(0.75rem - 2px - 4px); - box-shadow: inset 1rem 1rem var(--sl-color-orange-low); - } - } - - &[data-status="completed"] { - color: var(--sl-color-text-secondary); - - & > span { - border-color: var(--sl-color-green-low); - } - - & > span::before { - content: ""; - position: absolute; - top: 2px; - left: 2px; - width: calc(0.75rem - 2px - 4px); - height: calc(0.75rem - 2px - 4px); - box-shadow: inset 1rem 1rem var(--sl-color-green); - - transform-origin: bottom left; - clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%); - } - } - } - } - - [data-component="tool-args"] { - display: inline-grid; - align-items: center; - grid-template-columns: max-content max-content minmax(0, 1fr); - max-width: var(--md-tool-width); - gap: 0.25rem 0.375rem; - - & > div:nth-child(3n + 1) { - width: 8px; - height: 2px; - border-radius: 1px; - background: var(--sl-color-divider); - } - - & > div:nth-child(3n + 2), - & > div:nth-child(3n + 3) { - font-size: 0.75rem; - line-height: 1.5; - } - - & > div:nth-child(3n + 3) { - padding-left: 0.125rem; - word-break: break-word; - color: var(--sl-color-text-secondary); - } - } -} diff --git a/packages/web/src/components/share/part.tsx b/packages/web/src/components/share/part.tsx deleted file mode 100644 index 67099196a0..0000000000 --- a/packages/web/src/components/share/part.tsx +++ /dev/null @@ -1,816 +0,0 @@ -import map from "lang-map" -import { DateTime } from "luxon" -import { For, Show, Match, Switch, type JSX, createMemo, createSignal, type ParentProps } from "solid-js" -import { - IconHashtag, - IconSparkles, - IconGlobeAlt, - IconDocument, - IconPaperClip, - IconQueueList, - IconUserCircle, - IconCommandLine, - IconCheckCircle, - IconChevronDown, - IconChevronRight, - IconDocumentPlus, - IconPencilSquare, - IconRectangleStack, - IconMagnifyingGlass, - IconDocumentMagnifyingGlass, -} from "../icons" -import { IconMeta, IconRobot, IconOpenAI, IconGemini, IconAnthropic, IconBrain } from "../icons/custom" -import { ContentCode } from "./content-code" -import { ContentDiff } from "./content-diff" -import { ContentText } from "./content-text" -import { ContentBash } from "./content-bash" -import { ContentError } from "./content-error" -import { formatCount, formatDuration, formatNumber, normalizeLocale, useShareMessages } from "../share/common" -import { ContentMarkdown } from "./content-markdown" -import type { MessageV2 } from "opencode/session/message-v2" -import type { Diagnostic } from "vscode-languageserver-types" - -import styles from "./part.module.css" - -const MIN_DURATION = 2000 - -export interface PartProps { - index: number - message: MessageV2.Info - part: MessageV2.Part - last: boolean -} - -export function Part(props: PartProps) { - const [copied, setCopied] = createSignal(false) - const id = createMemo(() => props.message.id + "-" + props.index) - const messages = useShareMessages() - - return ( -
- -
- {props.message.role === "user" && props.part.type === "text" && ( -
- -
- )} - {props.message.role === "assistant" && props.part.type === "text" && ( -
-
- -
- {props.last && props.message.role === "assistant" && props.message.time.completed && ( -
- {DateTime.fromMillis(props.message.time.completed) - .setLocale(normalizeLocale(messages.locale)) - .toLocaleString(DateTime.DATETIME_MED)} -
- )} -
- )} - {props.message.role === "assistant" && props.part.type === "reasoning" && ( -
-
- {messages.thinking} -
- -
- -
- -
-
-
-
-
- )} - {props.message.role === "user" && props.part.type === "file" && ( -
-
{messages.attachment}
-
{props.part.filename}
-
- )} - {props.part.type === "step-start" && props.message.role === "assistant" && ( -
-
{props.message.providerID}
-
{props.message.modelID}
-
- )} - {props.part.type === "tool" && props.part.state.status === "error" && ( -
- {formatErrorString(props.part.state.error, messages.error)} - -
- )} - {props.part.type === "tool" && - props.part.state.status === "completed" && - props.message.role === "assistant" && ( - <> -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - )} -
-
- ) -} - -type ToolProps = { - id: MessageV2.ToolPart["id"] - tool: MessageV2.ToolPart["tool"] - state: MessageV2.ToolStateCompleted - message: MessageV2.Assistant - isLastPart?: boolean -} - -interface Todo { - id: string - content: string - status: "pending" | "in_progress" | "completed" - priority: "low" | "medium" | "high" -} - -function stripWorkingDirectory(filePath?: string, workingDir?: string) { - if (filePath === undefined || workingDir === undefined) return filePath - - const prefix = workingDir.endsWith("/") ? workingDir : workingDir + "/" - - if (filePath === workingDir) { - return "" - } - - if (filePath.startsWith(prefix)) { - return filePath.slice(prefix.length) - } - - return filePath -} - -function getShikiLang(filename: string) { - const ext = filename.split(".").pop()?.toLowerCase() ?? "" - const langs = map.languages(ext) - const type = langs?.[0]?.toLowerCase() - - const overrides: Record = { - conf: "shellscript", - } - - return type ? (overrides[type] ?? type) : "plaintext" -} - -function getDiagnostics( - diagnosticsByFile: Record, - currentFile: string, - label: string, -): JSX.Element[] { - const result: JSX.Element[] = [] - - if (diagnosticsByFile === undefined || diagnosticsByFile[currentFile] === undefined) return result - - for (const d of diagnosticsByFile[currentFile]) { - if (d.severity !== 1) continue - - const line = d.range.start.line + 1 - const column = d.range.start.character + 1 - - result.push( -
-        
-          {label}
-        
-        
-          [{line}:{column}]
-        
-        {d.message}
-      
, - ) - } - - return result -} - -function formatErrorString(error: string, label: string): JSX.Element { - const errorMarker = "Error: " - const startsWithError = error.startsWith(errorMarker) - - return startsWithError ? ( -
-      
-        {label}
-      
-      {error.slice(errorMarker.length)}
-    
- ) : ( -
-      {error}
-    
- ) -} - -export function TodoWriteTool(props: ToolProps) { - const messages = useShareMessages() - const priority: Record = { - in_progress: 0, - pending: 1, - completed: 2, - } - const todos = createMemo(() => - ((props.state.input?.todos ?? []) as Todo[]).slice().sort((a, b) => priority[a.status] - priority[b.status]), - ) - const starting = () => todos().every((t: Todo) => t.status === "pending") - const finished = () => todos().every((t: Todo) => t.status === "completed") - - return ( - <> -
- - - {messages.creating_plan} - {messages.completing_plan} - - -
- 0}> -
    - - {(todo) => ( -
  • - - {todo.content} -
  • - )} -
    -
-
- - ) -} - -export function GrepTool(props: ToolProps) { - const messages = useShareMessages() - - return ( - <> -
- Grep - “{props.state.input.pattern}” -
-
- - 0}> - - - - - - - - -
- - ) -} - -export function ListTool(props: ToolProps) { - const path = createMemo(() => - props.state.input?.path !== props.message.path.cwd - ? stripWorkingDirectory(props.state.input?.path, props.message.path.cwd) - : props.state.input?.path, - ) - - return ( - <> -
- LS - - {path()} - -
-
- - - - - - - -
- - ) -} - -export function WebFetchTool(props: ToolProps) { - const messages = useShareMessages() - - return ( - <> -
- Fetch - {props.state.input.url} -
-
- - - {formatErrorString(props.state.output, messages.error)} - - - - - - - -
- - ) -} - -export function ReadTool(props: ToolProps) { - const messages = useShareMessages() - const filePath = createMemo(() => stripWorkingDirectory(props.state.input?.filePath, props.message.path.cwd)) - - return ( - <> -
- Read - - {filePath()} - -
-
- - - {formatErrorString(props.state.output, messages.error)} - - - - - - - - - - - - -
- - ) -} - -export function WriteTool(props: ToolProps) { - const messages = useShareMessages() - const filePath = createMemo(() => stripWorkingDirectory(props.state.input?.filePath, props.message.path.cwd)) - const diagnostics = createMemo(() => - getDiagnostics(props.state.metadata?.diagnostics, props.state.input.filePath, messages.error), - ) - - return ( - <> -
- Write - - {filePath()} - -
- 0}> - {diagnostics()} - -
- - - {formatErrorString(props.state.output, messages.error)} - - - - - - - -
- - ) -} - -export function EditTool(props: ToolProps) { - const messages = useShareMessages() - const filePath = createMemo(() => stripWorkingDirectory(props.state.input.filePath, props.message.path.cwd)) - const diagnostics = createMemo(() => - getDiagnostics(props.state.metadata?.diagnostics, props.state.input.filePath, messages.error), - ) - - return ( - <> -
- Edit - - {filePath()} - -
-
- - - {formatErrorString(props.state.metadata?.message || "", messages.error)} - - -
- -
-
-
-
- 0}> - {diagnostics()} - - - ) -} - -export function BashTool(props: ToolProps) { - return ( - - ) -} - -export function GlobTool(props: ToolProps) { - const messages = useShareMessages() - - return ( - <> -
- Glob - “{props.state.input.pattern}” -
- - 0}> -
- - - -
-
- - - -
- - ) -} - -interface ResultsButtonProps extends ParentProps { - showCopy?: string - hideCopy?: string -} -function ResultsButton(props: ResultsButtonProps) { - const [show, setShow] = createSignal(false) - const messages = useShareMessages() - - return ( - <> - - {props.children} - - ) -} - -export function Spacer() { - return
-} - -function Footer(props: ParentProps<{ title: string }>) { - return ( -
- {props.children} -
- ) -} - -function ToolFooter(props: { time: number }) { - const messages = useShareMessages() - return ( - props.time > MIN_DURATION && ( -
- {formatDuration(props.time, messages.locale)} -
- ) - ) -} - -function TaskTool(props: ToolProps) { - const messages = useShareMessages() - - return ( - <> -
- Task - {props.state.input.description} -
-
“{props.state.input.prompt}”
- -
- -
-
- - ) -} - -export function FallbackTool(props: ToolProps) { - return ( - <> -
- {props.tool} -
-
- - {(arg) => ( - <> -
-
{arg[0]}
-
- {typeof arg[1] === "string" || typeof arg[1] === "number" || typeof arg[1] === "boolean" - ? String(arg[1]) - : arg[1] == null - ? "" - : JSON.stringify(arg[1])} -
- - )} -
-
- - -
- - - -
-
-
- - ) -} - -// Converts nested objects/arrays into [path, value] pairs. -// E.g. {a:{b:{c:1}}, d:[{e:2}, 3]} => [["a.b.c",1], ["d[0].e",2], ["d[1]",3]] -function flattenToolArgs(obj: unknown, prefix: string = ""): Array<[string, unknown]> { - const entries: Array<[string, unknown]> = [] - if (typeof obj !== "object" || obj === null) return entries - - for (const [key, value] of Object.entries(obj as Record)) { - const path = prefix ? `${prefix}.${key}` : key - - if (value !== null && typeof value === "object") { - if (Array.isArray(value)) { - value.forEach((item, index) => { - const arrayPath = `${path}[${index}]` - if (item !== null && typeof item === "object") { - entries.push(...flattenToolArgs(item, arrayPath)) - } else { - entries.push([arrayPath, item]) - } - }) - } else { - entries.push(...flattenToolArgs(value, path)) - } - } else { - entries.push([path, value]) - } - } - - return entries -} - -function getProvider(model: string) { - const lowerModel = model.toLowerCase() - - if (/claude|anthropic/.test(lowerModel)) return "anthropic" - if (/gpt|o[1-4]|codex|openai/.test(lowerModel)) return "openai" - if (/gemini|palm|bard|google/.test(lowerModel)) return "gemini" - if (/llama|meta/.test(lowerModel)) return "meta" - - return "any" -} - -export function ProviderIcon(props: { model: string; size?: number }) { - const provider = getProvider(props.model) - const size = props.size || 16 - return ( - }> - - - - - - - - - - - - - - ) -} diff --git a/packages/web/src/content.config.ts b/packages/web/src/content.config.ts deleted file mode 100644 index 2ed34e4c3d..0000000000 --- a/packages/web/src/content.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { defineCollection, z } from "astro:content" -import { docsLoader, i18nLoader } from "@astrojs/starlight/loaders" -import { docsSchema, i18nSchema } from "@astrojs/starlight/schema" -import en from "./content/i18n/en.json" - -const custom = Object.fromEntries(Object.keys(en).map((key) => [key, z.string()])) - -export const collections = { - docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), - i18n: defineCollection({ - loader: i18nLoader(), - schema: i18nSchema({ - extend: z.object(custom).catchall(z.string()), - }), - }), -} diff --git a/packages/web/src/content/docs/acp.mdx b/packages/web/src/content/docs/acp.mdx deleted file mode 100644 index 2e32e03e24..0000000000 --- a/packages/web/src/content/docs/acp.mdx +++ /dev/null @@ -1,156 +0,0 @@ ---- -title: ACP Support -description: Use CoDev Code in any ACP-compatible editor. ---- - -CoDev Code supports the [Agent Client Protocol](https://agentclientprotocol.com) or (ACP), allowing you to use it directly in compatible editors and IDEs. - -:::tip -For a list of editors and tools that support ACP, check out the [ACP progress report](https://zed.dev/blog/acp-progress-report#available-now). -::: - -ACP is an open protocol that standardizes communication between code editors and AI coding agents. - ---- - -## Configure - -To use CoDev Code via ACP, configure your editor to run the `codev acp` command. - -The command starts CoDev Code as an ACP-compatible subprocess that communicates with your editor over JSON-RPC via stdio. - -Below are examples for popular editors that support ACP. - ---- - -### Zed - -Add to your [Zed](https://zed.dev) configuration (`~/.config/zed/settings.json`): - -```json title="~/.config/zed/settings.json" -{ - "agent_servers": { - "CoDev Code": { - "command": "codev", - "args": ["acp"] - } - } -} -``` - -To open it, use the `agent: new thread` action in the **Command Palette**. - -You can also bind a keyboard shortcut by editing your `keymap.json`: - -```json title="keymap.json" -[ - { - "bindings": { - "cmd-alt-o": [ - "agent::NewExternalAgentThread", - { - "agent": { - "custom": { - "name": "CoDev Code", - "command": { - "command": "codev", - "args": ["acp"] - } - } - } - } - ] - } - } -] -``` - ---- - -### JetBrains IDEs - -Add to your [JetBrains IDE](https://www.jetbrains.com/) acp.json according to the [documentation](https://www.jetbrains.com/help/ai-assistant/acp.html): - -```json title="acp.json" -{ - "agent_servers": { - "CoDev Code": { - "command": "/absolute/path/bin/codev", - "args": ["acp"] - } - } -} -``` - -To open it, use the new 'CoDev Code' agent in the AI Chat agent selector. - ---- - -### Avante.nvim - -Add to your [Avante.nvim](https://github.com/yetone/avante.nvim) configuration: - -```lua -{ - acp_providers = { - ["opencode"] = { - command = "codev", - args = { "acp" } - } - } -} -``` - -If you need to pass environment variables: - -```lua {6-8} -{ - acp_providers = { - ["opencode"] = { - command = "codev", - args = { "acp" }, - env = { - CODEV_API_KEY = os.getenv("CODEV_API_KEY") - } - } - } -} -``` - ---- - -### CodeCompanion.nvim - -To use CoDev Code as an ACP agent in [CodeCompanion.nvim](https://github.com/olimorris/codecompanion.nvim), add the following to your Neovim config: - -```lua -require("codecompanion").setup({ - interactions = { - chat = { - adapter = { - name = "opencode", - model = "claude-sonnet-4", - }, - }, - }, -}) -``` - -This config sets up CodeCompanion to use CoDev Code as the ACP agent for chat. - -If you need to pass environment variables (like `CODEV_API_KEY`), refer to [Configuring Adapters: Environment Variables](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) in the CodeCompanion.nvim documentation for full details. - -## Support - -CoDev Code works the same via ACP as it does in the terminal. All features are supported: - -:::note -Some built-in slash commands like `/undo` and `/redo` are currently unsupported. -::: - -- Built-in tools (file operations, terminal commands, etc.) -- Custom tools and slash commands -- MCP servers configured in your CoDev Code config -- Project-specific rules from `AGENTS.md` -- Custom formatters and linters -- Agents and permissions system diff --git a/packages/web/src/content/docs/agents.mdx b/packages/web/src/content/docs/agents.mdx deleted file mode 100644 index 35742b3c3d..0000000000 --- a/packages/web/src/content/docs/agents.mdx +++ /dev/null @@ -1,781 +0,0 @@ ---- -title: Agents -description: Configure and use specialized agents. ---- - -Agents are specialized AI assistants that can be configured for specific tasks and workflows. They allow you to create focused tools with custom prompts, models, and tool access. - -:::tip -Use the plan agent to analyze code and review suggestions without making any code changes. -::: - -You can switch between agents during a session or invoke them with the `@` mention. - ---- - -## Types - -There are two types of agents in CoDev Code; primary agents and subagents. - ---- - -### Primary agents - -Primary agents are the main assistants you interact with directly. You can cycle through them using the **Tab** key, or your configured `switch_agent` keybind. These agents handle your main conversation. Tool access is configured via permissions — for example, Build has all tools enabled while Plan is restricted. - -:::tip -You can use the **Tab** key to switch between primary agents during a session. -::: - -CoDev Code comes with two built-in primary agents, **Build** and **Plan**. We'll -look at these below. - ---- - -### Subagents - -Subagents are specialized assistants that primary agents can invoke for specific tasks. You can also manually invoke them by **@ mentioning** them in your messages. - -CoDev Code comes with three built-in subagents, **General**, **Explore**, and **Scout**. We'll look at this below. - ---- - -## Built-in - -CoDev Code comes with two built-in primary agents and three built-in subagents. - ---- - -### Use build - -_Mode_: `primary` - -Build is the **default** primary agent with all tools enabled. This is the standard agent for development work where you need full access to file operations and system commands. - ---- - -### Use plan - -_Mode_: `primary` - -A restricted agent designed for planning and analysis. We use a permission system to give you more control and prevent unintended changes. -By default, all of the following are set to `ask`: - -- `file edits`: All writes, patches, and edits -- `bash`: All bash commands - -This agent is useful when you want the LLM to analyze code, suggest changes, or create plans without making any actual modifications to your codebase. - ---- - -### Use general - -_Mode_: `subagent` - -A general-purpose agent for researching complex questions and executing multi-step tasks. Has full tool access (except todo), so it can make file changes when needed. Use this to run multiple units of work in parallel. - ---- - -### Use explore - -_Mode_: `subagent` - -A fast, read-only agent for exploring codebases. Cannot modify files. Use this when you need to quickly find files by patterns, search code for keywords, or answer questions about the codebase. - ---- - -### Use scout - -_Mode_: `subagent` - -A read-only agent for external docs and dependency research. Use this when you need to clone a dependency repository into CoDev Code's managed cache, inspect library source, or cross-reference local code against upstream implementations without modifying your workspace. - ---- - -### Use compaction - -_Mode_: `primary` - -Hidden system agent that compacts long context into a smaller summary. It runs automatically when needed and is not selectable in the UI. - ---- - -### Use title - -_Mode_: `primary` - -Hidden system agent that generates short session titles. It runs automatically and is not selectable in the UI. - ---- - -### Use summary - -_Mode_: `primary` - -Hidden system agent that creates session summaries. It runs automatically and is not selectable in the UI. - ---- - -## Usage - -1. For primary agents, use the **Tab** key to cycle through them during a session. You can also use your configured `switch_agent` keybind. - -2. Subagents can be invoked: - - **Automatically** by primary agents for specialized tasks based on their descriptions. - - Manually by **@ mentioning** a subagent in your message. For example. - - ```txt frame="none" - @general help me search for this function - ``` - -3. **Navigation between sessions**: When subagents create child sessions, use `session_child_first` (default: **\+Down**) to enter the first child session from the parent. - -4. Once you are in a child session, use: - - `session_child_cycle` (default: **Right**) to cycle to the next child session - - `session_child_cycle_reverse` (default: **Left**) to cycle to the previous child session - - `session_parent` (default: **Up**) to return to the parent session - - This lets you switch between the main conversation and specialized subagent work. - ---- - -## Configure - -You can customize the built-in agents or create your own through configuration. Agents can be configured in two ways: - ---- - -### JSON - -Configure agents in your `codev.json` config file: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "mode": "primary", - "model": "anthropic/claude-sonnet-4-20250514", - "prompt": "{file:./prompts/build.txt}", - "permission": { - "edit": "allow", - "bash": "allow" - } - }, - "plan": { - "mode": "primary", - "model": "anthropic/claude-haiku-4-20250514", - "permission": { - "edit": "deny", - "bash": "deny" - } - }, - "code-reviewer": { - "description": "Reviews code for best practices and potential issues", - "mode": "subagent", - "model": "anthropic/claude-sonnet-4-20250514", - "prompt": "You are a code reviewer. Focus on security, performance, and maintainability.", - "permission": { - "edit": "deny" - } - } - } -} -``` - ---- - -### Markdown - -You can also define agents using markdown files. Place them in: - -- Global: `~/.config/codev/agents/` -- Per-project: `.codev/agents/` - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Reviews code for quality and best practices -mode: subagent -model: anthropic/claude-sonnet-4-20250514 -temperature: 0.1 -permission: - edit: deny - bash: deny ---- - -You are in code review mode. Focus on: - -- Code quality and best practices -- Potential bugs and edge cases -- Performance implications -- Security considerations - -Provide constructive feedback without making direct changes. -``` - -The markdown file name becomes the agent name. For example, `review.md` creates a `review` agent. - ---- - -## Options - -Let's look at these configuration options in detail. - ---- - -### Description - -Use the `description` option to provide a brief description of what the agent does and when to use it. - -```json title="codev.json" -{ - "agent": { - "review": { - "description": "Reviews code for best practices and potential issues" - } - } -} -``` - -This is a **required** config option. - ---- - -### Temperature - -Control the randomness and creativity of the LLM's responses with the `temperature` config. - -Lower values make responses more focused and deterministic, while higher values increase creativity and variability. - -```json title="codev.json" -{ - "agent": { - "plan": { - "temperature": 0.1 - }, - "creative": { - "temperature": 0.8 - } - } -} -``` - -Temperature values typically range from 0.0 to 1.0: - -- **0.0-0.2**: Very focused and deterministic responses, ideal for code analysis and planning -- **0.3-0.5**: Balanced responses with some creativity, good for general development tasks -- **0.6-1.0**: More creative and varied responses, useful for brainstorming and exploration - -```json title="codev.json" -{ - "agent": { - "analyze": { - "temperature": 0.1, - "prompt": "{file:./prompts/analysis.txt}" - }, - "build": { - "temperature": 0.3 - }, - "brainstorm": { - "temperature": 0.7, - "prompt": "{file:./prompts/creative.txt}" - } - } -} -``` - -If no temperature is specified, CoDev Code uses model-specific defaults; typically 0 for most models, 0.55 for Qwen models. - ---- - -### Max steps - -Control the maximum number of agentic iterations an agent can perform before being forced to respond with text only. This allows users who wish to control costs to set a limit on agentic actions. - -If this is not set, the agent will continue to iterate until the model chooses to stop or the user interrupts the session. - -```json title="codev.json" -{ - "agent": { - "quick-thinker": { - "description": "Fast reasoning with limited iterations", - "prompt": "You are a quick thinker. Solve problems with minimal steps.", - "steps": 5 - } - } -} -``` - -When the limit is reached, the agent receives a special system prompt instructing it to respond with a summarization of its work and recommended remaining tasks. - -:::caution -The legacy `maxSteps` field is deprecated. Use `steps` instead. -::: - ---- - -### Disable - -Set to `true` to disable the agent. - -```json title="codev.json" -{ - "agent": { - "review": { - "disable": true - } - } -} -``` - ---- - -### Prompt - -Specify a custom system prompt file for this agent with the `prompt` config. The prompt file should contain instructions specific to the agent's purpose. - -```json title="codev.json" -{ - "agent": { - "review": { - "prompt": "{file:./prompts/code-review.txt}" - } - } -} -``` - -This path is relative to where the config file is located. So this works for both the global CoDev Code config and the project specific config. - ---- - -### Model - -Use the `model` config to override the model for this agent. Useful for using different models optimized for different tasks. For example, a faster model for planning, a more capable model for implementation. - -:::tip -If you don’t specify a model, primary agents use the [model globally configured](/docs/config#models) while subagents will use the model of the primary agent that invoked the subagent. -::: - -```json title="codev.json" -{ - "agent": { - "plan": { - "model": "anthropic/claude-haiku-4-20250514" - } - } -} -``` - -The model ID in your CoDev Code config uses the format `provider/model-id`. For example, if you're using [OpenCode Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex. - ---- - -### Tools (deprecated) - -`tools` is **deprecated**. Prefer the agent's [`permission`](#permissions) field for new configs, updates and more fine-grained control. - -Allows you to control which tools are available in this agent. You can enable or disable specific tools by setting them to `true` or `false`. In an agent's `tools` config, `true` is equivalent to `{"*": "allow"}` permission and `false` is equivalent to `{"*": "deny"}` permission. - -```json title="codev.json" {3-6,9-12} -{ - "$schema": "https://opencode.ai/config.json", - "tools": { - "write": true, - "bash": true - }, - "agent": { - "plan": { - "tools": { - "write": false, - "bash": false - } - } - } -} -``` - -:::note -The agent-specific config overrides the global config. -::: - -You can also use wildcards in legacy `tools` entries to control multiple tools at once. For example, to disable all tools from an MCP server: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "readonly": { - "tools": { - "mymcp_*": false, - "write": false, - "edit": false - } - } - } -} -``` - -[Learn more about tools](/docs/tools). - ---- - -### Permissions - -You can configure permissions to manage what actions an agent can take. Each permission key can be set to: - -- `"ask"` — Prompt for approval before running the tool -- `"allow"` — Allow all operations without approval -- `"deny"` — Disable the tool - -The available permission keys are: - -| Key | Tools it gates | -| -------------------- | ---------------------------------------------------------------- | -| `read` | `read` | -| `edit` | `write`, `edit`, `apply_patch` | -| `glob` | `glob` | -| `grep` | `grep` | -| `list` | `list` | -| `bash` | `bash` | -| `task` | `task` | -| `external_directory` | Any tool that reads or writes files outside the project worktree | -| `todowrite` | `todowrite`, `todoread` | -| `webfetch` | `webfetch` | -| `websearch` | `websearch` | -| `lsp` | `lsp` | -| `skill` | `skill` | -| `question` | `question` | -| `doom_loop` | Recovery prompts when an agent appears stuck | - -`read`, `edit`, `glob`, `grep`, `list`, `bash`, `task`, `external_directory`, `lsp`, and `skill` accept either a shorthand action (`"allow" | "ask" | "deny"`) or an object of glob/pattern → action for fine-grained control. The remaining keys accept the shorthand action only. - -:::note -Permission keys are matched as wildcard patterns against the underlying tool name, so the same syntax works for built-ins, custom tools, and MCP tools — for example `"mymcp_*": "deny"` denies every tool from an MCP server, and `"mymcp_search": "ask"` targets a single one. -::: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny" - } -} -``` - -You can override these permissions per agent. - -```json title="codev.json" {3-5,8-10} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny" - }, - "agent": { - "build": { - "permission": { - "edit": "ask" - } - } - } -} -``` - -You can also set permissions in Markdown agents. - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Code review without edits -mode: subagent -permission: - edit: deny - bash: - "*": ask - "git diff": allow - "git log*": allow - "grep *": allow - webfetch: deny ---- - -Only analyze code and suggest changes. -``` - -You can set permissions for specific bash commands. - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "git push": "ask", - "grep *": "allow" - } - } - } - } -} -``` - -This can take a glob pattern. - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "git *": "ask" - } - } - } - } -} -``` - -And you can also use the `*` wildcard to manage permissions for all commands. -Since the last matching rule takes precedence, put the `*` wildcard first and specific rules after. - -```json title="codev.json" {8} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "*": "ask", - "git status *": "allow" - } - } - } - } -} -``` - -[Learn more about permissions](/docs/permissions). - ---- - -### Mode - -Control the agent's mode with the `mode` config. The `mode` option is used to determine how the agent can be used. - -```json title="codev.json" -{ - "agent": { - "review": { - "mode": "subagent" - } - } -} -``` - -The `mode` option can be set to `primary`, `subagent`, or `all`. If no `mode` is specified, it defaults to `all`. - ---- - -### Hidden - -Hide a subagent from the `@` autocomplete menu with `hidden: true`. Useful for internal subagents that should only be invoked programmatically by other agents via the Task tool. - -```json title="codev.json" -{ - "agent": { - "internal-helper": { - "mode": "subagent", - "hidden": true - } - } -} -``` - -This only affects user visibility in the autocomplete menu. Hidden agents can still be invoked by the model via the Task tool if permissions allow. - -:::note -Only applies to `mode: subagent` agents. -::: - ---- - -### Task permissions - -Control which subagents an agent can invoke via the Task tool with `permission.task`. Uses glob patterns for flexible matching. - -```json title="codev.json" -{ - "agent": { - "orchestrator": { - "mode": "primary", - "permission": { - "task": { - "*": "deny", - "orchestrator-*": "allow", - "code-reviewer": "ask" - } - } - } - } -} -``` - -When set to `deny`, the subagent is removed from the Task tool description entirely, so the model won't attempt to invoke it. - -:::tip -Rules are evaluated in order, and the **last matching rule wins**. In the example above, `orchestrator-planner` matches both `*` (deny) and `orchestrator-*` (allow), but since `orchestrator-*` comes after `*`, the result is `allow`. -::: - -:::tip -Users can always invoke any subagent directly via the `@` autocomplete menu, even if the agent's task permissions would deny it. -::: - ---- - -### Color - -Customize the agent's visual appearance in the UI with the `color` option. This affects how the agent appears in the interface. - -Use a valid hex color (e.g., `#FF5733`) or theme color: `primary`, `secondary`, `accent`, `success`, `warning`, `error`, `info`. - -```json title="codev.json" -{ - "agent": { - "creative": { - "color": "#ff6b6b" - }, - "code-reviewer": { - "color": "accent" - } - } -} -``` - ---- - -### Top P - -Control response diversity with the `top_p` option. Alternative to temperature for controlling randomness. - -```json title="codev.json" -{ - "agent": { - "brainstorm": { - "top_p": 0.9 - } - } -} -``` - -Values range from 0.0 to 1.0. Lower values are more focused, higher values more diverse. - ---- - -### Additional - -Any other options you specify in your agent configuration will be **passed through directly** to the provider as model options. This allows you to use provider-specific features and parameters. - -For example, with OpenAI's reasoning models, you can control the reasoning effort: - -```json title="codev.json" {6,7} -{ - "agent": { - "deep-thinker": { - "description": "Agent that uses high reasoning effort for complex problems", - "model": "openai/gpt-5", - "reasoningEffort": "high", - "textVerbosity": "low" - } - } -} -``` - -These additional options are model and provider-specific. Check your provider's documentation for available parameters. - -:::tip -Run `codev models` to see a list of the available models. -::: - ---- - -## Create agents - -You can create new agents using the following command: - -```bash -codev agent create -``` - -This interactive command will: - -1. Ask where to save the agent; global or project-specific. -2. Description of what the agent should do. -3. Generate an appropriate system prompt and identifier. -4. Let you select which permissions the agent should be allowed (anything you don't select is denied). -5. Finally, create a markdown file with the agent configuration. - ---- - -## Use cases - -Here are some common use cases for different agents. - -- **Build agent**: Full development work with all tools enabled -- **Plan agent**: Analysis and planning without making changes -- **Review agent**: Code review with read-only access plus documentation tools -- **Debug agent**: Focused on investigation with bash and read tools enabled -- **Docs agent**: Documentation writing with file operations but no system commands - ---- - -## Examples - -Here are some example agents you might find useful. - -:::tip -Do you have an agent you'd like to share? [Submit a PR](https://github.com/quickbeard/codev-code). -::: - ---- - -### Documentation agent - -```markdown title="~/.config/codev/agents/docs-writer.md" ---- -description: Writes and maintains project documentation -mode: subagent -permission: - bash: deny ---- - -You are a technical writer. Create clear, comprehensive documentation. - -Focus on: - -- Clear explanations -- Proper structure -- Code examples -- User-friendly language -``` - ---- - -### Security auditor - -```markdown title="~/.config/codev/agents/security-auditor.md" ---- -description: Performs security audits and identifies vulnerabilities -mode: subagent -permission: - edit: deny ---- - -You are a security expert. Focus on identifying potential security issues. - -Look for: - -- Input validation vulnerabilities -- Authentication and authorization flaws -- Data exposure risks -- Dependency vulnerabilities -- Configuration security issues -``` diff --git a/packages/web/src/content/docs/cli.mdx b/packages/web/src/content/docs/cli.mdx deleted file mode 100644 index 66498c55d4..0000000000 --- a/packages/web/src/content/docs/cli.mdx +++ /dev/null @@ -1,733 +0,0 @@ ---- -title: CLI -description: CoDev Code CLI options and commands. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" - -The CoDev Code CLI by default starts the [TUI](/docs/tui) when run without any arguments. - -```bash -codev -``` - -But it also accepts commands as documented on this page. This allows you to interact with CoDev Code programmatically. - -```bash -codev run "Explain how closures work in JavaScript" -``` - ---- - -### tui - -Start the CoDev Code terminal user interface. - -```bash -codev [project] -``` - -#### Flags - -| Flag | Short | Description | -| ------------------------------------------- | ----- | ----------------------------------------------------------------------- | -| {"--continue"} | `-c` | Continue the last session | -| {"--session"} | `-s` | Session ID to continue | -| {"--fork"} | | Fork the session when continuing (use with `--continue` or `--session`) | -| {"--prompt"} | | Prompt to use | -| {"--model"} | `-m` | Model to use in the form of provider/model | -| {"--agent"} | | Agent to use | -| {"--auto"} | | Auto-approve permissions that are not explicitly denied | -| {"--port"} | | Port to listen on | -| {"--hostname"} | | Hostname to listen on | -| {"--mdns"} | | Enable mDNS discovery | -| {"--mdns-domain"} | | Custom mDNS domain name | -| {"--cors"} | | Additional browser origin(s) to allow CORS | - ---- - -## Commands - -The CoDev Code CLI also has the following commands. - ---- - -### agent - -Manage agents for CoDev Code. - -```bash -codev agent [command] -``` - ---- - -#### create - -Create a new agent with custom configuration. - -```bash -codev agent create -``` - -This command will guide you through creating a new agent with a custom system prompt and permission configuration. Anything you don't allow is denied in the generated agent's frontmatter. - -#### Flags - -| Flag | Short | Description | -| ------------------------------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| {"--path"} | | Directory to write the agent file to (defaults to global or `.codev/agent` based on the prompt) | -| {"--description"} | | What the agent should do | -| {"--mode"} | | Agent mode: `all`, `primary`, or `subagent` | -| {"--permissions"} | | Comma-separated list of permissions to allow (default: all). Available: `bash`, `read`, `edit`, `glob`, `grep`, `webfetch`, `task`, `todowrite`, `websearch`, `lsp`, `skill`. Anything omitted is denied. Alias: `--tools` | -| {"--model"} | `-m` | Model to use, in `provider/model` format | - -Passing all of `--path`, `--description`, `--mode`, and `--permissions` runs the command non-interactively. - ---- - -#### list - -List all available agents. - -```bash -codev agent list -``` - ---- - -### attach - -Attach a terminal to an already running CoDev Code backend server started via `serve` or `web` commands. - -```bash -codev attach [url] -``` - -This allows using the TUI with a remote CoDev Code backend. For example: - -```bash -# Start the backend server for web/mobile access -codev web --port 4096 --hostname 0.0.0.0 - -# In another terminal, attach the TUI to the running backend -codev attach http://10.20.30.40:4096 -``` - -#### Flags - -| Flag | Short | Description | -| ---------------------------------------- | ----- | -------------------------------------------------------------------------- | -| {"--dir"} | | Working directory to start TUI in | -| {"--continue"} | `-c` | Continue the last session | -| {"--session"} | `-s` | Session ID to continue | -| {"--fork"} | | Fork the session when continuing (use with `--continue` or `--session`) | -| {"--password"} | `-p` | Basic auth password (defaults to `CODEV_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Basic auth username (defaults to `CODEV_SERVER_USERNAME` or `opencode`) | - ---- - -### auth - -Command to manage credentials and login for providers. - -```bash -codev auth [command] -``` - ---- - -#### login - -CoDev Code is powered by the provider list at [Models.dev](https://models.dev), so you can use `codev auth login` to configure API keys for any provider you'd like to use. This is stored in `~/.local/share/codev/auth.json`. - -```bash -codev auth login -``` - -When CoDev Code starts up it loads the providers from the credentials file. And if there are any keys defined in your environments or a `.env` file in your project. - -##### Flags - -| Flag | Short | Description | -| ---------------------------------------- | ----- | ---------------------------------------------------- | -| {"--provider"} | `-p` | Provider ID or name to log in to | -| {"--method"} | `-m` | Login method label to use, skipping method selection | - ---- - -#### list - -Lists all the authenticated providers as stored in the credentials file. - -```bash -codev auth list -``` - -Or the short version. - -```bash -codev auth ls -``` - ---- - -#### logout - -Logs you out of a provider by clearing it from the credentials file. - -```bash -codev auth logout -``` - ---- - -### github - -Manage the GitHub agent for repository automation. - -```bash -codev github [command] -``` - ---- - -#### install - -Install the GitHub agent in your repository. - -```bash -codev github install -``` - -This sets up the necessary GitHub Actions workflow and guides you through the configuration process. [Learn more](/docs/github). - ---- - -#### run - -Run the GitHub agent. This is typically used in GitHub Actions. - -```bash -codev github run -``` - -##### Flags - -| Flag | Description | -| ------------------------------------- | -------------------------------------- | -| {"--event"} | GitHub mock event to run the agent for | -| {"--token"} | GitHub personal access token | - ---- - -### mcp - -Manage Model Context Protocol servers. - -```bash -codev mcp [command] -``` - ---- - -#### add - -Add an MCP server to your configuration. - -```bash -codev mcp add -``` - -This command will guide you through adding either a local or remote MCP server. - ---- - -#### list - -List all configured MCP servers and their connection status. - -```bash -codev mcp list -``` - -Or use the short version. - -```bash -codev mcp ls -``` - ---- - -#### auth - -Authenticate with an OAuth-enabled MCP server. - -```bash -codev mcp auth [name] -``` - -If you don't provide a server name, you'll be prompted to select from available OAuth-capable servers. - -You can also list OAuth-capable servers and their authentication status. - -```bash -codev mcp auth list -``` - -Or use the short version. - -```bash -codev mcp auth ls -``` - ---- - -#### logout - -Remove OAuth credentials for an MCP server. - -```bash -codev mcp logout [name] -``` - ---- - -#### debug - -Debug OAuth connection issues for an MCP server. - -```bash -codev mcp debug -``` - ---- - -### models - -List all available models from configured providers. - -```bash -codev models [provider] -``` - -This command displays all models available across your configured providers in the format `provider/model`. - -This is useful for figuring out the exact model name to use in [your config](/docs/config/). - -You can optionally pass a provider ID to filter models by that provider. - -```bash -codev models anthropic -``` - -#### Flags - -| Flag | Description | -| --------------------------------------- | ------------------------------------------------------------ | -| {"--refresh"} | Refresh the models cache from models.dev | -| {"--verbose"} | Use more verbose model output (includes metadata like costs) | - -Use the `--refresh` flag to update the cached model list. This is useful when new models have been added to a provider and you want to see them in CoDev Code. - -```bash -codev models --refresh -``` - ---- - -### run - -Run CoDev Code in non-interactive mode by passing a prompt directly. - -```bash -codev run [message..] -``` - -This is useful for scripting, automation, or when you want a quick answer without launching the full TUI. For example. - -```bash "codev run" -codev run Explain the use of context in Go -``` - -You can also attach to a running `codev serve` instance to avoid MCP server cold boot times on every run: - -```bash -# Start a headless server in one terminal -codev serve - -# In another terminal, run commands that attach to it -codev run --attach http://localhost:4096 "Explain async/await in JavaScript" -``` - -#### Flags - -| Flag | Short | Description | -| ---------------------------------------- | ----- | -------------------------------------------------------------------------- | -| {"--command"} | | The command to run, use message for args | -| {"--continue"} | `-c` | Continue the last session | -| {"--session"} | `-s` | Session ID to continue | -| {"--fork"} | | Fork the session when continuing (use with `--continue` or `--session`) | -| {"--share"} | | Share the session | -| {"--model"} | `-m` | Model to use in the form of provider/model | -| {"--agent"} | | Agent to use | -| {"--file"} | `-f` | File(s) to attach to message | -| {"--format"} | | Format: default (formatted) or json (raw JSON events) | -| {"--title"} | | Title for the session (uses truncated prompt if no value provided) | -| {"--attach"} | | Attach to a running CoDev Code server (e.g., http://localhost:4096) | -| {"--password"} | `-p` | Basic auth password (defaults to `CODEV_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Basic auth username (defaults to `CODEV_SERVER_USERNAME` or `opencode`) | -| {"--dir"} | | Directory to run in, or path on the remote server when attaching | -| {"--port"} | | Port for the local server (defaults to random port) | -| {"--variant"} | | Model variant (provider-specific reasoning effort) | -| {"--thinking"} | | Show thinking blocks | -| {"--auto"} | | Auto-approve permissions that are not explicitly denied | - ---- - -### serve - -Start a headless CoDev Code server for API access. Check out the [server docs](/docs/server) for the full HTTP interface. - -```bash -codev serve -``` - -This starts an HTTP server that provides API access to CoDev Code functionality without the TUI interface. Set `CODEV_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). - -#### Flags - -| Flag | Description | -| ------------------------------------------- | ------------------------------------------ | -| {"--port"} | Port to listen on | -| {"--hostname"} | Hostname to listen on | -| {"--mdns"} | Enable mDNS discovery | -| {"--mdns-domain"} | Custom mDNS domain name | -| {"--cors"} | Additional browser origin(s) to allow CORS | - ---- - -### session - -Manage CoDev Code sessions. - -```bash -codev session [command] -``` - ---- - -#### list - -List all CoDev Code sessions. - -```bash -codev session list -``` - -##### Flags - -| Flag | Short | Description | -| ----------------------------------------- | ----- | ------------------------------------ | -| {"--max-count"} | `-n` | Limit to N most recent sessions | -| {"--format"} | | Output format: table or json (table) | - ---- - -#### delete - -Delete an CoDev Code session. - -```bash -codev session delete -``` - ---- - -### stats - -Show token usage and cost statistics for your CoDev Code sessions. - -```bash -codev stats -``` - -#### Flags - -| Flag | Description | -| --------------------------------------- | --------------------------------------------------------------------------- | -| {"--days"} | Show stats for the last N days (all time) | -| {"--tools"} | Number of tools to show (all) | -| {"--models"} | Show model usage breakdown (hidden by default). Pass a number to show top N | -| {"--project"} | Filter by project (all projects, empty string: current project) | - ---- - -### export - -Export session data as JSON. - -```bash -codev export [sessionID] -``` - -If you don't provide a session ID, you'll be prompted to select from available sessions. - -#### Flags - -| Flag | Description | -| ---------------------------------------- | ------------------------------------- | -| {"--sanitize"} | Redact sensitive transcript/file data | - ---- - -### import - -Import session data from a JSON file or CoDev Code share URL. - -```bash -codev import -``` - -You can import from a local file or an CoDev Code share URL. - -```bash -codev import session.json -codev import https://opncd.ai/s/abc123 -``` - ---- - -### web - -Start a headless CoDev Code server with a web interface. - -```bash -codev web -``` - -This starts an HTTP server and opens a web browser to access CoDev Code through a web interface. Set `CODEV_SERVER_PASSWORD` to enable HTTP basic auth (username defaults to `opencode`). - -#### Flags - -| Flag | Description | -| ------------------------------------------- | ------------------------------------------ | -| {"--port"} | Port to listen on | -| {"--hostname"} | Hostname to listen on | -| {"--mdns"} | Enable mDNS discovery | -| {"--mdns-domain"} | Custom mDNS domain name | -| {"--cors"} | Additional browser origin(s) to allow CORS | - ---- - -### acp - -Start an ACP (Agent Client Protocol) server. - -```bash -codev acp -``` - -This command starts an ACP server that communicates via stdin/stdout using nd-JSON. - -#### Flags - -| Flag | Description | -| ------------------------------------------- | ------------------------------------------ | -| {"--cwd"} | Working directory | -| {"--port"} | Port to listen on | -| {"--hostname"} | Hostname to listen on | -| {"--mdns"} | Enable mDNS discovery | -| {"--mdns-domain"} | Custom mDNS domain name | -| {"--cors"} | Additional browser origin(s) to allow CORS | - ---- - -### plugin - -Install a plugin and update your config. - -```bash -codev plugin -``` - -Or use the alias. - -```bash -codev plug -``` - -#### Flags - -| Flag | Short | Description | -| -------------------------------------- | ----- | ------------------------------- | -| {"--global"} | `-g` | Install in global config | -| {"--force"} | `-f` | Replace existing plugin version | - ---- - -### pr - -Fetch and checkout a GitHub PR branch, then run CoDev Code. - -```bash -codev pr -``` - ---- - -### db - -Database tools. - -```bash -codev db [query] -``` - -#### Flags - -| Flag | Description | -| -------------------------------------- | ------------------------------ | -| {"--format"} | Output format: `json` or `tsv` | - ---- - -#### path - -Print the database path. - -```bash -codev db path -``` - ---- - -### debug - -Debugging and troubleshooting tools. - -```bash -codev debug [command] -``` - ---- - -### uninstall - -Uninstall CoDev Code and remove all related files. - -```bash -codev uninstall -``` - -#### Flags - -| Flag | Short | Description | -| ------------------------------------------- | ----- | ------------------------------------------- | -| {"--keep-config"} | `-c` | Keep configuration files | -| {"--keep-data"} | `-d` | Keep session data and snapshots | -| {"--dry-run"} | | Show what would be removed without removing | -| {"--force"} | `-f` | Skip confirmation prompts | - ---- - -### upgrade - -Updates CoDev Code to the latest version or a specific version. - -```bash -codev upgrade [target] -``` - -To upgrade to the latest version. - -```bash -codev upgrade -``` - -To upgrade to a specific version. - -```bash -codev upgrade v0.1.48 -``` - -#### Flags - -| Flag | Short | Description | -| -------------------------------------- | ----- | ----------------------------------------------------------------- | -| {"--method"} | `-m` | The installation method that was used; curl, npm, pnpm, bun, brew | - ---- - -## Global Flags - -The CoDev Code CLI takes the following global flags. - -| Flag | Short | Description | -| ------------------------------------------ | ----- | ------------------------------------ | -| {"--help"} | `-h` | Display help | -| {"--version"} | `-v` | Print version number | -| {"--print-logs"} | | Print logs to stderr | -| {"--log-level"} | | Log level (DEBUG, INFO, WARN, ERROR) | -| {"--pure"} | | Run without external plugins | - ---- - -## Environment variables - -CoDev Code can be configured using environment variables. - -| Variable | Type | Description | -| ------------------------------------- | ------- | ------------------------------------------------- | -| `CODEV_AUTO_SHARE` | boolean | Automatically share sessions | -| `CODEV_GIT_BASH_PATH` | string | Path to Git Bash executable on Windows | -| `CODEV_CONFIG` | string | Path to config file | -| `CODEV_TUI_CONFIG` | string | Path to TUI config file | -| `CODEV_CONFIG_DIR` | string | Path to config directory | -| `CODEV_CONFIG_CONTENT` | string | Inline json config content | -| `CODEV_DISABLE_AUTOUPDATE` | boolean | Disable automatic update checks | -| `CODEV_DISABLE_PRUNE` | boolean | Disable pruning of old data | -| `CODEV_DISABLE_TERMINAL_TITLE` | boolean | Disable automatic terminal title updates | -| `CODEV_PERMISSION` | string | Inlined json permissions config | -| `CODEV_DISABLE_DEFAULT_PLUGINS` | boolean | Disable default plugins | -| `CODEV_DISABLE_LSP_DOWNLOAD` | boolean | Disable automatic LSP server downloads | -| `CODEV_ENABLE_EXPERIMENTAL_MODELS` | boolean | Enable experimental models | -| `CODEV_DISABLE_AUTOCOMPACT` | boolean | Disable automatic context compaction | -| `CODEV_DISABLE_CLAUDE_CODE` | boolean | Disable reading from `.claude` (prompt + skills) | -| `CODEV_DISABLE_CLAUDE_CODE_PROMPT` | boolean | Disable reading `~/.claude/CLAUDE.md` | -| `CODEV_DISABLE_CLAUDE_CODE_SKILLS` | boolean | Disable loading `.claude/skills` | -| `CODEV_DISABLE_MODELS_FETCH` | boolean | Disable fetching models from remote sources | -| `CODEV_DISABLE_MOUSE` | boolean | Disable mouse capture in the TUI | -| `CODEV_FAKE_VCS` | string | Fake VCS provider for testing purposes | -| `CODEV_CLIENT` | string | Client identifier (defaults to `cli`) | -| `CODEV_ENABLE_EXA` | boolean | Enable Exa web search tools | -| `CODEV_SERVER_PASSWORD` | string | Enable basic auth for `serve`/`web` | -| `CODEV_SERVER_USERNAME` | string | Override basic auth username (default `opencode`) | -| `CODEV_MODELS_URL` | string | Custom URL for fetching models configuration | - ---- - -### Experimental - -These environment variables enable experimental features that may change or be removed. - -| Variable | Type | Description | -| ----------------------------------------------- | ------- | --------------------------------------- | -| `CODEV_EXPERIMENTAL` | boolean | Enable the experimental umbrella flag | -| `CODEV_EXPERIMENTAL_ICON_DISCOVERY` | boolean | Enable icon discovery | -| `CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | boolean | Disable copy on select in TUI | -| `CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | number | Default timeout for bash commands in ms | -| `CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | number | Max output tokens for LLM responses | -| `CODEV_EXPERIMENTAL_FILEWATCHER` | boolean | Enable file watcher for entire dir | -| `CODEV_EXPERIMENTAL_OXFMT` | boolean | Enable oxfmt formatter | -| `CODEV_EXPERIMENTAL_LSP_TOOL` | boolean | Enable experimental LSP tool | -| `CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER` | boolean | Disable file watcher | -| `CODEV_EXPERIMENTAL_EXA` | boolean | Enable experimental Exa features | -| `CODEV_EXPERIMENTAL_LSP_TY` | boolean | Enable TY LSP for python files | -| `CODEV_EXPERIMENTAL_PLAN_MODE` | boolean | Enable plan mode | -| `CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | boolean | Enable background subagent tasks | -| `CODEV_EXPERIMENTAL_EVENT_SYSTEM` | boolean | Enable experimental event system | -| `CODEV_EXPERIMENTAL_NATIVE_LLM` | boolean | Enable native LLM request path | -| `CODEV_EXPERIMENTAL_PARALLEL` | boolean | Enable parallel web search execution | -| `CODEV_EXPERIMENTAL_SCOUT` | boolean | Enable Scout subagent | -| `CODEV_EXPERIMENTAL_WORKSPACES` | boolean | Enable workspace support | diff --git a/packages/web/src/content/docs/commands.mdx b/packages/web/src/content/docs/commands.mdx deleted file mode 100644 index bf6f515bed..0000000000 --- a/packages/web/src/content/docs/commands.mdx +++ /dev/null @@ -1,323 +0,0 @@ ---- -title: Commands -description: Create custom commands for repetitive tasks. ---- - -Custom commands let you specify a prompt you want to run when that command is executed in the TUI. - -```bash frame="none" -/my-command -``` - -Custom commands are in addition to the built-in commands like `/init`, `/undo`, `/redo`, `/share`, `/help`. [Learn more](/docs/tui#commands). - ---- - -## Create command files - -Create markdown files in the `commands/` directory to define custom commands. - -Create `.codev/commands/test.md`: - -```md title=".codev/commands/test.md" ---- -description: Run tests with coverage -agent: build -model: anthropic/claude-3-5-sonnet-20241022 ---- - -Run the full test suite with coverage report and show any failures. -Focus on the failing tests and suggest fixes. -``` - -The frontmatter defines command properties. The content becomes the template. - -Use the command by typing `/` followed by the command name. - -```bash frame="none" -"/test" -``` - ---- - -## Configure - -You can add custom commands through the CoDev Code config or by creating markdown files in the `commands/` directory. - ---- - -### JSON - -Use the `command` option in your CoDev Code [config](/docs/config): - -```json title="codev.jsonc" {4-12} -{ - "$schema": "https://opencode.ai/config.json", - "command": { - // This becomes the name of the command - "test": { - // This is the prompt that will be sent to the LLM - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.", - // This is shown as the description in the TUI - "description": "Run tests with coverage", - "agent": "build", - "model": "anthropic/claude-3-5-sonnet-20241022" - } - } -} -``` - -Now you can run this command in the TUI: - -```bash frame="none" -/test -``` - ---- - -### Markdown - -You can also define commands using markdown files. Place them in: - -- Global: `~/.config/codev/commands/` -- Per-project: `.codev/commands/` - -```markdown title="~/.config/codev/commands/test.md" ---- -description: Run tests with coverage -agent: build -model: anthropic/claude-3-5-sonnet-20241022 ---- - -Run the full test suite with coverage report and show any failures. -Focus on the failing tests and suggest fixes. -``` - -The markdown file name becomes the command name. For example, `test.md` lets -you run: - -```bash frame="none" -/test -``` - ---- - -## Prompt config - -The prompts for the custom commands support several special placeholders and syntax. - ---- - -### Arguments - -Pass arguments to commands using the `$ARGUMENTS` placeholder. - -```md title=".codev/commands/component.md" ---- -description: Create a new component ---- - -Create a new React component named $ARGUMENTS with TypeScript support. -Include proper typing and basic structure. -``` - -Run the command with arguments: - -```bash frame="none" -/component Button -``` - -And `$ARGUMENTS` will be replaced with `Button`. - -You can also access individual arguments using positional parameters: - -- `$1` - First argument -- `$2` - Second argument -- `$3` - Third argument -- And so on... - -For example: - -```md title=".codev/commands/create-file.md" ---- -description: Create a new file with content ---- - -Create a file named $1 in the directory $2 -with the following content: $3 -``` - -Run the command: - -```bash frame="none" -/create-file config.json src "{ \"key\": \"value\" }" -``` - -This replaces: - -- `$1` with `config.json` -- `$2` with `src` -- `$3` with `{ "key": "value" }` - ---- - -### Shell output - -Use _!`command`_ to inject [bash command](/docs/tui#bash-commands) output into your prompt. - -For example, to create a custom command that analyzes test coverage: - -```md title=".codev/commands/analyze-coverage.md" ---- -description: Analyze test coverage ---- - -Here are the current test results: -!`npm test` - -Based on these results, suggest improvements to increase coverage. -``` - -Or to review recent changes: - -```md title=".codev/commands/review-changes.md" ---- -description: Review recent changes ---- - -Recent git commits: -!`git log --oneline -10` - -Review these changes and suggest any improvements. -``` - -Commands run in your project's root directory and their output becomes part of the prompt. - ---- - -### File references - -Include files in your command using `@` followed by the filename. - -```md title=".codev/commands/review-component.md" ---- -description: Review component ---- - -Review the component in @src/components/Button.tsx. -Check for performance issues and suggest improvements. -``` - -The file content gets included in the prompt automatically. - ---- - -## Options - -Let's look at the configuration options in detail. - ---- - -### Template - -The `template` option defines the prompt that will be sent to the LLM when the command is executed. - -```json title="codev.json" -{ - "command": { - "test": { - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes." - } - } -} -``` - -This is a **required** config option. - ---- - -### Description - -Use the `description` option to provide a brief description of what the command does. - -```json title="codev.json" -{ - "command": { - "test": { - "description": "Run tests with coverage" - } - } -} -``` - -This is shown as the description in the TUI when you type in the command. - ---- - -### Agent - -Use the `agent` config to optionally specify which [agent](/docs/agents) should execute this command. -If this is a [subagent](/docs/agents/#subagents) the command will trigger a subagent invocation by default. -To disable this behavior, set `subtask` to `false`. - -```json title="codev.json" -{ - "command": { - "review": { - "agent": "plan" - } - } -} -``` - -This is an **optional** config option. If not specified, defaults to your current agent. - ---- - -### Subtask - -Use the `subtask` boolean to force the command to trigger a [subagent](/docs/agents/#subagents) invocation. -This is useful if you want the command to not pollute your primary context and will **force** the agent to act as a subagent, -even if `mode` is set to `primary` on the [agent](/docs/agents) configuration. - -```json title="codev.json" -{ - "command": { - "analyze": { - "subtask": true - } - } -} -``` - -This is an **optional** config option. - ---- - -### Model - -Use the `model` config to override the default model for this command. - -```json title="codev.json" -{ - "command": { - "analyze": { - "model": "anthropic/claude-3-5-sonnet-20241022" - } - } -} -``` - -This is an **optional** config option. - ---- - -## Built-in - -CoDev Code includes several built-in commands like `/init`, `/undo`, `/redo`, `/share`, `/help`; [learn more](/docs/tui#commands). - -:::note -Custom commands can override built-in commands. -::: - -If you define a custom command with the same name, it will override the built-in command. diff --git a/packages/web/src/content/docs/config.mdx b/packages/web/src/content/docs/config.mdx deleted file mode 100644 index 99bb80ce5c..0000000000 --- a/packages/web/src/content/docs/config.mdx +++ /dev/null @@ -1,941 +0,0 @@ ---- -title: Config -description: Using the CoDev Code JSON config. ---- - -You can configure CoDev Code using a JSON config file. - ---- - -## Format - -CoDev Code supports both **JSON** and **JSONC** (JSON with Comments) formats. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "model": "anthropic/claude-sonnet-4-5", - "autoupdate": true, - "server": { - "port": 4096, - }, -} -``` - ---- - -## Locations - -You can place your config in a couple of different locations and they have a -different order of precedence. - -:::note -Configuration files are **merged together**, not replaced. -::: - -Configuration files are merged together, not replaced. Settings from the following config locations are combined. Later configs override earlier ones only for conflicting keys. Non-conflicting settings from all configs are preserved. - -For example, if your global config sets `autoupdate: true` and your project config sets `model: "anthropic/claude-sonnet-4-5"`, the final configuration will include both settings. - ---- - -### Precedence order - -Config sources are loaded in this order (later sources override earlier ones): - -1. **Remote config** (from `.well-known/opencode`) - organizational defaults -2. **Global config** (`~/.config/codev/codev.json`) - user preferences -3. **Custom config** (`CODEV_CONFIG` env var) - custom overrides -4. **Project config** (`codev.json` in project) - project-specific settings -5. **`.codev` directories** - agents, commands, plugins -6. **Inline config** (`CODEV_CONFIG_CONTENT` env var) - runtime overrides -7. **Managed config files** (`/Library/Application Support/codev/` on macOS) - admin-controlled -8. **macOS managed preferences** (`.mobileconfig` via MDM) - highest priority, not user-overridable - -This means project configs can override global defaults, and global configs can override remote organizational defaults. Managed settings override everything. - -:::note -The `.codev` and `~/.config/codev` directories use **plural names** for subdirectories: `agents/`, `commands/`, `modes/`, `plugins/`, `skills/`, `tools/`, and `themes/`. Singular names (e.g., `agent/`) are also supported for backwards compatibility. -::: - ---- - -### Remote - -Organizations can provide default configuration via the `.well-known/opencode` endpoint. This is fetched automatically when you authenticate with a provider that supports it. - -Remote config is loaded first, serving as the base layer. All other config sources (global, project) can override these defaults. - -For example, if your organization provides MCP servers that are disabled by default: - -```json title="Remote config from .well-known/opencode" -{ - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": false - } - } -} -``` - -You can enable specific servers in your local config: - -```json title="codev.json" -{ - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": true - } - } -} -``` - ---- - -### Global - -Place your global CoDev Code config in `~/.config/codev/codev.json`. Use global config for user-wide server/runtime preferences like providers, models, and permissions. - -For TUI-specific settings, use `~/.config/codev/tui.json`. - -Global config overrides remote organizational defaults. - ---- - -### Per project - -Add `codev.json` in your project root. Project config has the highest precedence among standard config files - it overrides both global and remote configs. - -For project-specific TUI settings, add `tui.json` alongside it. - -:::tip -Place project specific config in the root of your project. -::: - -When CoDev Code starts up, it first looks for a config file in the current directory, then traverses up to the nearest Git directory. - -This is also safe to be checked into Git and uses the same schema as the global one. - ---- - -### Custom path - -Specify a custom config file path using the `CODEV_CONFIG` environment variable. - -```bash -export CODEV_CONFIG=/path/to/my/custom-config.json -codev run "Hello world" -``` - -Custom config is loaded between global and project configs in the precedence order. - ---- - -### Custom directory - -Specify a custom config directory using the `CODEV_CONFIG_DIR` -environment variable. This directory will be searched for agents, commands, -modes, and plugins just like the standard `.codev` directory, and should -follow the same structure. - -```bash -export CODEV_CONFIG_DIR=/path/to/my/config-directory -codev run "Hello world" -``` - -The custom directory is loaded after the global config and `.codev` directories, so it **can override** their settings. - ---- - -### Managed settings - -Organizations can enforce configuration that users cannot override. Managed settings are loaded at the highest priority tier. - -#### File-based - -Drop an `codev.json` or `codev.jsonc` file in the system managed config directory: - -| Platform | Path | -| -------- | ---------------------------------------- | -| macOS | `/Library/Application Support/codev/` | -| Linux | `/etc/codev/` | -| Windows | `%ProgramData%\opencode` | - -These directories require admin/root access to write, so users cannot modify them. - -#### macOS managed preferences - -On macOS, CoDev Code reads managed preferences from the `ai.opencode.managed` preference domain. Deploy a `.mobileconfig` via MDM (Jamf, Kandji, FleetDM) and the settings are enforced automatically. - -CoDev Code checks these paths: - -1. `/Library/Managed Preferences//ai.opencode.managed.plist` -2. `/Library/Managed Preferences/ai.opencode.managed.plist` - -The plist keys map directly to `codev.json` fields. MDM metadata keys (`PayloadUUID`, `PayloadType`, etc.) are stripped automatically. - -**Creating a `.mobileconfig`** - -Use the `ai.opencode.managed` PayloadType. The CoDev Code config keys go directly in the payload dict: - -```xml - - - - - PayloadContent - - - PayloadType - ai.opencode.managed - PayloadIdentifier - com.example.codev.config - PayloadUUID - GENERATE-YOUR-OWN-UUID - PayloadVersion - 1 - share - disabled - server - - hostname - 127.0.0.1 - - permission - - * - ask - bash - - * - ask - rm -rf * - deny - - - - - PayloadType - Configuration - PayloadIdentifier - com.example.codev - PayloadUUID - GENERATE-YOUR-OWN-UUID - PayloadVersion - 1 - - -``` - -Generate unique UUIDs with `uuidgen`. Customize the settings to match your organization's requirements. - -**Deploying via MDM** - -- **Jamf Pro:** Computers > Configuration Profiles > Upload > scope to target devices or smart groups -- **FleetDM:** Add the `.mobileconfig` to your gitops repo under `mdm.macos_settings.custom_settings` and run `fleetctl apply` - -**Verifying on a device** - -Double-click the `.mobileconfig` to install locally for testing (shows in System Settings > Privacy & Security > Profiles), then run: - -```bash -codev debug config -``` - -All managed preference keys appear in the resolved config and cannot be overridden by user or project configuration. - ---- - -## Schema - -The server/runtime config schema is defined in [**`opencode.ai/config.json`**](https://opencode.ai/config.json). - -TUI config uses [**`opencode.ai/tui.json`**](https://opencode.ai/tui.json). - -Your editor should be able to validate and autocomplete based on the schema. - ---- - -### TUI - -Use a dedicated `tui.json` (or `tui.jsonc`) file for TUI-specific settings. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "scroll_speed": 3, - "scroll_acceleration": { - "enabled": true - }, - "diff_style": "auto", - "mouse": true, - "attention": { - "enabled": true, - "notifications": true, - "sound": true, - "volume": 0.4 - } -} -``` - -Use `CODEV_TUI_CONFIG` to point to a custom TUI config file. - -Set `attention.enabled` to turn on TUI desktop notifications and sounds. See [TUI attention](/docs/tui#attention). - -Legacy `theme`, `keybinds`, and `tui` keys in `codev.json` are deprecated and automatically migrated when possible. - ---- - -### Server - -You can configure server settings for the `codev serve` and `codev web` commands through the `server` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "server": { - "port": 4096, - "hostname": "0.0.0.0", - "mdns": true, - "mdnsDomain": "myproject.local", - "cors": ["http://localhost:5173"] - } -} -``` - -Available options: - -- `port` - Port to listen on. -- `hostname` - Hostname to listen on. When `mdns` is enabled and no hostname is set, defaults to `0.0.0.0`. -- `mdns` - Enable mDNS service discovery. This allows other devices on the network to discover your CoDev Code server. -- `mdnsDomain` - Custom domain name for mDNS service. Defaults to `opencode.local`. Useful for running multiple instances on the same network. -- `cors` - Additional origins to allow for CORS when using the HTTP server from a browser-based client. Values must be full origins (scheme + host + optional port), eg `https://app.example.com`. - -[Learn more about the server here](/docs/server). - ---- - -### Shell - -You can configure the shell used for the interactive terminal using the `shell` option. Compatible shells are also used for agent tool calls. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "shell": "pwsh" -} -``` - -If not specified, CoDev Code will automatically discover and use a sensible default based on your operating system (e.g. `pwsh` or `cmd.exe` on Windows, `/bin/zsh` or `/bin/bash` on macOS/Linux). You can provide an absolute path or a short name. - ---- - -### Tools - -You can manage the tools an LLM can use through the `tools` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "tools": { - "write": false, - "bash": false - } -} -``` - -[Learn more about tools here](/docs/tools). - ---- - -### Models - -You can configure the providers and models you want to use in your CoDev Code config through the `provider`, `model` and `small_model` options. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": {}, - "model": "anthropic/claude-sonnet-4-5", - "small_model": "anthropic/claude-haiku-4-5" -} -``` - -The `small_model` option configures a separate model for lightweight tasks like title generation. By default, CoDev Code tries to use a cheaper model if one is available from your provider, otherwise it falls back to your main model. - -Provider options can include `timeout`, `chunkTimeout`, and `setCacheKey`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "options": { - "timeout": 600000, - "chunkTimeout": 30000, - "setCacheKey": true - } - } - } -} -``` - -- `timeout` - Request timeout in milliseconds (default: 300000). Set to `false` to disable. -- `chunkTimeout` - Timeout in milliseconds between streamed response chunks. If no chunk arrives in time, the request is aborted. -- `setCacheKey` - Ensure a cache key is always set for designated provider. - -You can also configure [local models](/docs/models#local). [Learn more](/docs/models). - ---- - -### Policies - -Use the `experimental.policies` option to allow or deny CoDev Code actions on configured resources. Currently, policies can control which providers CoDev Code may use. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": { - "policies": [ - { - "effect": "deny", - "action": "provider.use", - "resource": "openai" - } - ] - } -} -``` - -[Learn more about policies here](/docs/policies). - ---- - -### Image attachments - -CoDev Code normalizes image attachments before sending them to the model. By default, images are resized when they exceed `2000x2000` pixels or `5242880` base64 bytes. - -Configure image attachment limits with the `attachment.image` option: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "attachment": { - "image": { - "auto_resize": true, - "max_width": 2000, - "max_height": 2000, - "max_base64_bytes": 5242880 - } - } -} -``` - -- `auto_resize` - Resize images that exceed the configured limits before provider requests. Set to `false` to reject oversized images instead. -- `max_width` - Maximum image width in pixels before resizing or rejection. -- `max_height` - Maximum image height in pixels before resizing or rejection. -- `max_base64_bytes` - Maximum encoded image payload size. This is the base64 payload size, not the original file size. - -If an image still cannot fit after resizing, CoDev Code omits oversized tool-result images or fails oversized user-provided images with an image size error. - ---- - -#### Provider-Specific Options - -Some providers support additional configuration options beyond the generic `timeout` and `apiKey` settings. - -##### Amazon Bedrock - -Amazon Bedrock supports AWS-specific configuration: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "my-aws-profile", - "endpoint": "https://bedrock-runtime.us-east-1.vpce-xxxxx.amazonaws.com" - } - } - } -} -``` - -- `region` - AWS region for Bedrock (defaults to `AWS_REGION` env var or `us-east-1`) -- `profile` - AWS named profile from `~/.aws/credentials` (defaults to `AWS_PROFILE` env var) -- `endpoint` - Custom endpoint URL for VPC endpoints. This is an alias for the generic `baseURL` option using AWS-specific terminology. If both are specified, `endpoint` takes precedence. - -:::note -Bearer tokens (`AWS_BEARER_TOKEN_BEDROCK` or `/connect`) take precedence over profile-based authentication. See [authentication precedence](/docs/providers#authentication-precedence) for details. -::: - -[Learn more about Amazon Bedrock configuration](/docs/providers#amazon-bedrock). - ---- - -### Themes - -Set your UI theme in `tui.json`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "theme": "tokyonight" -} -``` - -[Learn more here](/docs/themes). - ---- - -### Agents - -You can configure specialized agents for specific tasks through the `agent` option. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "code-reviewer": { - "description": "Reviews code for best practices and potential issues", - "model": "anthropic/claude-sonnet-4-5", - "prompt": "You are a code reviewer. Focus on security, performance, and maintainability.", - "tools": { - // Disable file modification tools for review-only agent - "write": false, - "edit": false, - }, - }, - }, -} -``` - -You can also define agents using markdown files in `~/.config/codev/agents/` or `.codev/agents/`. [Learn more here](/docs/agents). - ---- - -### Default agent - -You can set the default agent using the `default_agent` option. This determines which agent is used when none is explicitly specified. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "default_agent": "plan" -} -``` - -The default agent must be a primary agent (not a subagent). This can be a built-in agent like `"build"` or `"plan"`, or a [custom agent](/docs/agents) you've defined. If the specified agent doesn't exist or is a subagent, CoDev Code will fall back to `"build"` with a warning. - -This setting applies across all interfaces: TUI, CLI (`codev run`), desktop app, and GitHub Action. - ---- - -### Subagent depth - -You can control how deeply subagents can invoke other subagents using the `subagent_depth` option. - -```json title="opencode.json" -{ - "$schema": "https://opencode.ai/config.json", - "subagent_depth": 2 -} -``` - -The default is `1`, which allows primary agents to launch subagents but prevents those subagents from launching additional subagents. Set it to `2` to allow one additional level of nested subagents, or `0` to prevent all subagent launches. - ---- - -### Sharing - -You can configure the [share](/docs/share) feature through the `share` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "manual" -} -``` - -This takes: - -- `"manual"` - Allow manual sharing via commands (default) -- `"auto"` - Automatically share new conversations -- `"disabled"` - Disable sharing entirely - -By default, sharing is set to manual mode where you need to explicitly share conversations using the `/share` command. - ---- - -### Commands - -You can configure custom commands for repetitive tasks through the `command` option. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "command": { - "test": { - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.", - "description": "Run tests with coverage", - "agent": "build", - "model": "anthropic/claude-haiku-4-5", - }, - "component": { - "template": "Create a new React component named $ARGUMENTS with TypeScript support.\nInclude proper typing and basic structure.", - "description": "Create a new component", - }, - }, -} -``` - -You can also define commands using markdown files in `~/.config/codev/commands/` or `.codev/commands/`. [Learn more here](/docs/commands). - ---- - -### Keybinds - -Customize TUI keyboard shortcuts in `tui.json` with `keybinds`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "keybinds": { - "command_list": "ctrl+p" - } -} -``` - -`keybinds` is merged with built-in defaults, so you only need to configure the shortcuts you want to change. - -[Learn more here](/docs/keybinds). - ---- - -### Snapshot - -CoDev Code uses snapshots to track file changes during agent operations, enabling you to undo and revert changes within a session. Snapshots are enabled by default. - -For large repositories or projects with many submodules, the snapshot system can cause slow indexing and significant disk usage as it tracks all changes using an internal git repository. You can disable snapshots using the `snapshot` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "snapshot": false -} -``` - -Note that disabling snapshots means changes made by the agent cannot be rolled back through the UI. - ---- - -### Autoupdate - -CoDev Code will automatically download any new updates when it starts up. You can disable this with the `autoupdate` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "autoupdate": false -} -``` - -If you don't want updates but want to be notified when a new version is available, set `autoupdate` to `"notify"`. -Notice that this only works if it was not installed using a package manager such as Homebrew. - ---- - -### Formatters - -You can enable and configure code formatters through the `formatter` option. Omit it to keep formatters disabled. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": true -} -``` - -Use an object to keep built-ins enabled while configuring overrides or custom formatters. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "disabled": true - }, - "custom-prettier": { - "command": ["npx", "prettier", "--write", "$FILE"], - "environment": { - "NODE_ENV": "development" - }, - "extensions": [".js", ".ts", ".jsx", ".tsx"] - } - } -} -``` - -[Learn more about formatters here](/docs/formatters). - ---- - -### LSP Servers - -You can enable and configure LSP servers through the `lsp` option. Omit it to keep LSP disabled. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": true -} -``` - -Use an object to keep built-ins enabled while configuring overrides or custom LSP servers. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "typescript": { - "disabled": true - } - } -} -``` - -[Learn more about LSP servers here](/docs/lsp). - ---- - -### Permissions - -By default, CoDev Code **allows all operations** without requiring explicit approval. You can change this using the `permission` option. - -For example, to ensure that the `edit` and `bash` tools require user approval: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "ask", - "bash": "ask" - } -} -``` - -[Learn more about permissions here](/docs/permissions). - ---- - -### Compaction - -You can control context compaction behavior through the `compaction` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "compaction": { - "auto": true, - "prune": false, - "reserved": 10000 - } -} -``` - -- `auto` - Automatically compact the session when context is full (default: `true`). -- `prune` - Remove old tool outputs to save tokens (default: `false`). Set to `true` to enable pruning. -- `reserved` - Token buffer for compaction. Leaves enough window to avoid overflow during compaction. - ---- - -### Watcher - -You can configure file watcher ignore patterns through the `watcher` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "watcher": { - "ignore": ["node_modules/**", "dist/**", ".git/**"] - } -} -``` - -Patterns follow glob syntax. Use this to exclude noisy directories from file watching. - ---- - -### MCP servers - -You can configure MCP servers you want to use through the `mcp` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": {} -} -``` - -[Learn more here](/docs/mcp-servers). - ---- - -### Plugins - -[Plugins](/docs/plugins) extend CoDev Code with custom tools, hooks, and integrations. - -Place plugin files in `.codev/plugins/` or `~/.config/codev/plugins/`. You can also load plugins from npm through the `plugin` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-helicone-session", "@my-org/custom-plugin"] -} -``` - -[Learn more here](/docs/plugins). - ---- - -### Instructions - -You can configure the instructions for the model you're using through the `instructions` option. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["CONTRIBUTING.md", "docs/guidelines.md", ".cursor/rules/*.md"] -} -``` - -This takes an array of paths and glob patterns to instruction files. [Learn more -about rules here](/docs/rules). - ---- - -### Disabled providers - -You can disable providers that are loaded automatically through the `disabled_providers` option. This is useful when you want to prevent certain providers from being loaded even if their credentials are available. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "disabled_providers": ["openai", "gemini"] -} -``` - -:::note -The `disabled_providers` takes priority over `enabled_providers`. -::: - -The `disabled_providers` option accepts an array of provider IDs. When a provider is disabled: - -- It won't be loaded even if environment variables are set. -- It won't be loaded even if API keys are configured through the `/connect` command. -- The provider's models won't appear in the model selection list. - ---- - -### Enabled providers - -You can specify an allowlist of providers through the `enabled_providers` option. When set, only the specified providers will be enabled and all others will be ignored. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "enabled_providers": ["anthropic", "openai"] -} -``` - -This is useful when you want to restrict CoDev Code to only use specific providers rather than disabling them one by one. - -:::note -The `disabled_providers` takes priority over `enabled_providers`. -::: - -If a provider appears in both `enabled_providers` and `disabled_providers`, the `disabled_providers` takes priority for backwards compatibility. - ---- - -### Experimental - -The `experimental` key contains options that are under active development. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": {} -} -``` - -:::caution -Experimental options are not stable. They may change or be removed without notice. -::: - ---- - -## Variables - -You can use variable substitution in your config files to reference environment variables and file contents. - ---- - -### Env vars - -Use `{env:VARIABLE_NAME}` to substitute environment variables: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "model": "{env:CODEV_MODEL}", - "provider": { - "anthropic": { - "models": {}, - "options": { - "apiKey": "{env:ANTHROPIC_API_KEY}" - } - } - } -} -``` - -If the environment variable is not set, it will be replaced with an empty string. - ---- - -### Files - -Use `{file:path/to/file}` to substitute the contents of a file: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["./custom-instructions.md"], - "provider": { - "openai": { - "options": { - "apiKey": "{file:~/.secrets/openai-key}" - } - } - } -} -``` - -File paths can be: - -- Relative to the config file directory -- Or absolute paths starting with `/` or `~` - -These are useful for: - -- Keeping sensitive data like API keys in separate files. -- Including large instruction files without cluttering your config. -- Sharing common configuration snippets across multiple config files. diff --git a/packages/web/src/content/docs/custom-tools.mdx b/packages/web/src/content/docs/custom-tools.mdx deleted file mode 100644 index 2f59023494..0000000000 --- a/packages/web/src/content/docs/custom-tools.mdx +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Custom Tools -description: Create tools the LLM can call in CoDev Code. ---- - -Custom tools are functions you create that the LLM can call during conversations. They work alongside CoDev Code's [built-in tools](/docs/tools) like `read`, `write`, and `bash`. - ---- - -## Creating a tool - -Tools are defined as **TypeScript** or **JavaScript** files. However, the tool definition can invoke scripts written in **any language** — TypeScript or JavaScript is only used for the tool definition itself. - ---- - -### Location - -They can be defined: - -- Locally by placing them in the `.codev/tools/` directory of your project. -- Or globally, by placing them in `~/.config/codev/tools/`. - ---- - -### Structure - -The easiest way to create tools is using the `tool()` helper which provides type-safety and validation. - -```ts title=".codev/tools/database.ts" {1} -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Query the project database", - args: { - query: tool.schema.string().describe("SQL query to execute"), - }, - async execute(args) { - // Your database logic here - return `Executed query: ${args.query}` - }, -}) -``` - -The **filename** becomes the **tool name**. The above creates a `database` tool. - ---- - -#### Multiple tools per file - -You can also export multiple tools from a single file. Each export becomes **a separate tool** with the name **`_`**: - -```ts title=".codev/tools/math.ts" -import { tool } from "@opencode-ai/plugin" - -export const add = tool({ - description: "Add two numbers", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args) { - return (args.a + args.b).toString() - }, -}) - -export const multiply = tool({ - description: "Multiply two numbers", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args) { - return (args.a * args.b).toString() - }, -}) -``` - -This creates two tools: `math_add` and `math_multiply`. - ---- - -#### Name collisions with built-in tools - -Custom tools are keyed by tool name. If a custom tool uses the same name as a built-in tool, the custom tool takes precedence. - -For example, this file replaces the built-in `bash` tool: - -```ts title=".codev/tools/bash.ts" -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Restricted bash wrapper", - args: { - command: tool.schema.string(), - }, - async execute(args) { - return `blocked: ${args.command}` - }, -}) -``` - -:::note -Prefer unique names unless you intentionally want to replace a built-in tool. If you want to disable a built in tool but not override it, use [permissions](/docs/permissions). -::: - ---- - -### Arguments - -You can use `tool.schema`, which is just [Zod](https://zod.dev), to define argument types. - -```ts "tool.schema" -args: { - query: tool.schema.string().describe("SQL query to execute") -} -``` - -You can also import [Zod](https://zod.dev) directly and return a plain object: - -```ts {6} -import { z } from "zod" - -export default { - description: "Tool description", - args: { - param: z.string().describe("Parameter description"), - }, - async execute(args, context) { - // Tool implementation - return "result" - }, -} -``` - ---- - -### Context - -Tools receive context about the current session: - -```ts title=".codev/tools/project.ts" {8} -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Get project information", - args: {}, - async execute(args, context) { - // Access context information - const { agent, sessionID, messageID, directory, worktree } = context - return `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}, Directory: ${directory}, Worktree: ${worktree}` - }, -}) -``` - -Use `context.directory` for the session working directory. -Use `context.worktree` for the git worktree root. - ---- - -## Examples - -### Write a tool in Python - -You can write your tools in any language you want. Here's an example that adds two numbers using Python. - -First, create the tool as a Python script: - -```python title=".codev/tools/add.py" -import sys - -a = int(sys.argv[1]) -b = int(sys.argv[2]) -print(a + b) -``` - -Then create the tool definition that invokes it: - -```ts title=".codev/tools/python-add.ts" {10} -import { tool } from "@opencode-ai/plugin" -import path from "path" - -export default tool({ - description: "Add two numbers using Python", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args, context) { - const script = path.join(context.worktree, ".codev/tools/add.py") - const result = await Bun.$`python3 ${script} ${args.a} ${args.b}`.text() - return result.trim() - }, -}) -``` - -Here we are using the [`Bun.$`](https://bun.com/docs/runtime/shell) utility to run the Python script. diff --git a/packages/web/src/content/docs/ecosystem.mdx b/packages/web/src/content/docs/ecosystem.mdx deleted file mode 100644 index 74e5137928..0000000000 --- a/packages/web/src/content/docs/ecosystem.mdx +++ /dev/null @@ -1,83 +0,0 @@ ---- -title: Ecosystem -description: Projects and integrations built with CoDev Code. ---- - -A collection of community projects built on CoDev Code. - -:::note -Want to add your CoDev Code related project to this list? Submit a PR. -::: - -You can also check out [awesome-opencode](https://github.com/awesome-opencode/awesome-opencode) and [opencode.cafe](https://opencode.cafe), a community that aggregates the ecosystem and community. - ---- - -## Plugins - -| Name | Description | -| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| [opencode-daytona](https://github.com/daytonaio/daytona/tree/main/libs/opencode-plugin) | Automatically run CoDev Code sessions in isolated Daytona sandboxes with git sync and live previews | -| [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) | Automatically inject Helicone session headers for request grouping | -| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Auto-inject TypeScript/Svelte types into file reads with lookup tools | -| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Use your ChatGPT Plus/Pro subscription instead of API credits | -| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Use your existing Gemini plan instead of API billing | -| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Use Antigravity's free models instead of API billing | -| [opencode-devcontainers](https://github.com/athal7/opencode-devcontainers) | Multi-branch devcontainer isolation with shallow clones and auto-assigned ports | -| [opencode-google-antigravity-auth](https://github.com/shekohex/opencode-google-antigravity-auth) | Google Antigravity OAuth Plugin, with support for Google Search, and more robust API handling | -| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimize token usage by pruning obsolete tool outputs | -| [opencode-vibeguard](https://github.com/inkdust2021/opencode-vibeguard) | Redact secrets/PII into VibeGuard-style placeholders before LLM calls; restore locally | -| [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited.git) | Add native websearch support for supported providers with Google grounded style | -| [opencode-pty](https://github.com/shekohex/opencode-pty.git) | Enables AI agents to run background processes in a PTY, send interactive input to them. | -| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Instructions for non-interactive shell commands - prevents hangs from TTY-dependent operations | -| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Track CoDev Code usage with Wakatime | -| [opencode-md-table-formatter](https://github.com/franlol/opencode-md-table-formatter/tree/main) | Clean up markdown tables produced by LLMs | -| [opencode-morph-fast-apply](https://github.com/JRedeker/opencode-morph-fast-apply) | 10x faster code editing with Morph Fast Apply API and lazy edit markers | -| [opencode-morph-plugin](https://github.com/morphllm/opencode-morph-plugin) | Fast Apply editing, WarpGrep codebase search, and context compaction via Morph | -| [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) | Background agents, pre-built LSP/AST/MCP tools, curated agents, Claude Code compatible | -| [opencode-notificator](https://github.com/panta82/opencode-notificator) | Desktop notifications and sound alerts for CoDev Code sessions | -| [opencode-notifier](https://github.com/mohak34/opencode-notifier) | Desktop notifications and sound alerts for permission, completion, and error events | -| [opencode-zellij-namer](https://github.com/24601/opencode-zellij-namer) | AI-powered automatic Zellij session naming based on CoDev Code context | -| [opencode-skillful](https://github.com/zenobi-us/opencode-skillful) | Allow CoDev Code agents to lazy load prompts on demand with skill discovery and injection | -| [opencode-supermemory](https://github.com/supermemoryai/opencode-supermemory) | Persistent memory across sessions using Supermemory | -| [@plannotator/opencode](https://github.com/backnotprop/plannotator/tree/main/apps/opencode-plugin) | Interactive plan review with visual annotation and private/offline sharing | -| [@openspoon/subtask2](https://github.com/spoons-and-mirrors/subtask2) | Extend CoDev Code /commands into a powerful orchestration system with granular flow control | -| [opencode-scheduler](https://github.com/different-ai/opencode-scheduler) | Schedule recurring jobs using launchd (Mac) or systemd (Linux) with cron syntax | -| [opencode-conductor](https://github.com/derekbar90/opencode-conductor) | Protocol-Driven Workflow: Automation of the Context -> Spec -> Plan -> Implement lifecycle. | -| [micode](https://github.com/vtemian/micode) | Structured Brainstorm → Plan → Implement workflow with session continuity | -| [octto](https://github.com/vtemian/octto) | Interactive browser UI for AI brainstorming with multi-question forms | -| [opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents) | Claude Code-style background agents with async delegation and context persistence | -| [opencode-notify](https://github.com/kdcokenny/opencode-notify) | Native OS notifications for CoDev Code – know when tasks complete | -| [opencode-workspace](https://github.com/kdcokenny/opencode-workspace) | Bundled multi-agent orchestration harness – 16 components, one install | -| [opencode-worktree](https://github.com/kdcokenny/opencode-worktree) | Zero-friction git worktrees for CoDev Code | -| [opencode-sentry-monitor](https://github.com/stolinski/opencode-sentry-monitor) | Trace and debug your AI agents with Sentry AI Monitoring | -| [opencode-firecrawl](https://github.com/firecrawl/opencode-firecrawl) | Web scraping, crawling, and search via the Firecrawl CLI | -| [opencode-jfrog-plugin](https://github.com/jfrog/opencode-jfrog-plugin) | JFrog Plugin for seamless integration of CoDev Code users to JFrog platform | -| [opencode-goal-plugin](https://github.com/willytop8/OpenCode-goal-plugin) | Session-scoped `/goal` workflow that keeps objectives in context and auto-continues until complete | - ---- - -## Projects - -| Name | Description | -| ------------------------------------------------------------------------------------------ | ---------------------------------------------------------------- | -| [kimaki](https://github.com/remorses/kimaki) | Discord bot to control CoDev Code sessions, built on the SDK | -| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Neovim plugin for editor-aware prompts, built on the API | -| [portal](https://github.com/hosenur/portal) | Mobile-first web UI for CoDev Code over Tailscale/VPN | -| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Template for building CoDev Code plugins | -| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Neovim frontend for CoDev Code - a terminal-based AI coding agent | -| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Vercel AI SDK provider for using CoDev Code via @opencode-ai/sdk | -| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Web / Desktop App and VS Code Extension for CoDev Code | -| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | Obsidian plugin that embeds CoDev Code in Obsidian's UI | -| [OpenWork](https://github.com/different-ai/openwork) | An open-source alternative to Claude Cowork, powered by CoDev Code | -| [ocx](https://github.com/kdcokenny/ocx) | CoDev Code extension manager with portable, isolated profiles. | -| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Desktop, Web, Mobile and Remote Client App for CoDev Code | - ---- - -## Agents - -| Name | Description | -| ----------------------------------------------------------------- | ------------------------------------------------------------ | -| [Agentic](https://github.com/Cluster444/agentic) | Modular AI agents and commands for structured development | -| [opencode-agents](https://github.com/darrenhinde/opencode-agents) | Configs, prompts, agents, and plugins for enhanced workflows | diff --git a/packages/web/src/content/docs/enterprise.mdx b/packages/web/src/content/docs/enterprise.mdx deleted file mode 100644 index 9e469fd842..0000000000 --- a/packages/web/src/content/docs/enterprise.mdx +++ /dev/null @@ -1,169 +0,0 @@ ---- -title: Enterprise -description: Using CoDev Code securely in your organization. ---- - -export const enterprise = "https://opencode.ai/enterprise" - -CoDev Code Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway. - -:::note -CoDev Code does not store any of your code or context data. -::: - -To get started with CoDev Code Enterprise: - -1. Do a trial internally with your team. -2. **Contact us** to discuss pricing and implementation options. - ---- - -## Trial - -CoDev Code is open source and does not store any of your code or context data, so your developers can simply [get started](/docs/) and carry out a trial. - ---- - -### Data handling - -**CoDev Code does not store your code or context data.** All processing happens locally or through direct API calls to your AI provider. - -This means that as long as you are using a provider you trust, or an internal -AI gateway, you can use CoDev Code securely. - -The only caveat here is the optional `/share` feature. - ---- - -#### Sharing conversations - -If a user enables the `/share` feature, the conversation and the data associated with it are sent to the service we use to host these share pages at opencode.ai. - -The data is currently served through our CDN's edge network, and is cached on the edge near your users. - -We recommend you disable this for your trial. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "disabled" -} -``` - -[Learn more about sharing](/docs/share). - ---- - -### Code ownership - -**You own all code produced by CoDev Code.** There are no licensing restrictions or ownership claims. - ---- - -## Pricing - -We use a per-seat model for CoDev Code Enterprise. If you have your own LLM gateway, we do not charge for tokens used. For further details about pricing and implementation options, **contact us**. - ---- - -## Deployment - -Once you have completed your trial and you are ready to use CoDev Code at -your organization, you can **contact us** to discuss -pricing and implementation options. - ---- - -### Central Config - -We can set up CoDev Code to use a single central config for your entire organization. - -This centralized config can integrate with your SSO provider and ensures all users access only your internal AI gateway. - ---- - -### SSO integration - -Through the central config, CoDev Code can integrate with your organization's SSO provider for authentication. - -This allows CoDev Code to obtain credentials for your internal AI gateway through your existing identity management system. - ---- - -### Internal AI gateway - -With the central config, CoDev Code can also be configured to use only your internal AI gateway. - -You can also disable all other AI providers, ensuring all requests go through your organization's approved infrastructure. - ---- - -### Self-hosting - -While we recommend disabling the share pages to ensure your data never leaves -your organization, we can also help you self-host them on your infrastructure. - -This is currently on our roadmap. If you're interested, **let us know**. - ---- - -## FAQ - -
-What is CoDev Code Enterprise? - -CoDev Code Enterprise is for organizations that want to ensure that their code and data never leaves their infrastructure. It can do this by using a centralized config that integrates with your SSO and internal AI gateway. - -
- -
-How do I get started with CoDev Code Enterprise? - -Simply start with an internal trial with your team. CoDev Code by default does not store your code or context data, making it easy to get started. - -Then **contact us** to discuss pricing and implementation options. - -
- -
-How does enterprise pricing work? - -We offer per-seat enterprise pricing. If you have your own LLM gateway, we do not charge for tokens used. For further details, **contact us** for a custom quote based on your organization's needs. - -
- -
-Is my data secure with CoDev Code Enterprise? - -Yes. CoDev Code does not store your code or context data. All processing happens locally or through direct API calls to your AI provider. With central config and SSO integration, your data remains secure within your organization's infrastructure. - -
- -
-Can we use our own private NPM registry? - -CoDev Code supports private npm registries through Bun's native `.npmrc` file support. If your organization uses a private registry, such as JFrog Artifactory, Nexus, or similar, ensure developers are authenticated before running CoDev Code. - -To set up authentication with your private registry: - -```bash -npm login --registry=https://your-company.jfrog.io/api/npm/npm-virtual/ -``` - -This creates `~/.npmrc` with authentication details. CoDev Code will automatically -pick this up. - -:::caution -You must be logged into the private registry before running CoDev Code. -::: - -Alternatively, you can manually configure a `.npmrc` file: - -```bash title="~/.npmrc" -registry=https://your-company.jfrog.io/api/npm/npm-virtual/ -//your-company.jfrog.io/api/npm/npm-virtual/:_authToken=${NPM_AUTH_TOKEN} -``` - -Developers must be logged into the private registry before running CoDev Code to ensure packages can be installed from your enterprise registry. - -
diff --git a/packages/web/src/content/docs/es/acp.mdx b/packages/web/src/content/docs/es/acp.mdx deleted file mode 100644 index 77c405f30d..0000000000 --- a/packages/web/src/content/docs/es/acp.mdx +++ /dev/null @@ -1,156 +0,0 @@ ---- -title: Soporte ACP -description: Utilice CoDev Code en cualquier editor compatible con ACP. ---- - -CoDev Code admite el [Agent Client Protocol](https://agentclientprotocol.com) o (ACP), lo que le permite usarlo directamente en editores e IDE compatibles. - -:::tip -Para obtener una lista de editores y herramientas compatibles con ACP, consulte el [informe de progreso de ACP](https://zed.dev/blog/acp-progress-report#available-now). -::: - -ACP es un protocolo abierto que estandariza la comunicación entre editores de código y agentes de codificación de IA. - ---- - -## Configuración - -Para usar CoDev Code a través de ACP, configure su editor para ejecutar el comando `codev acp`. - -El comando inicia CoDev Code como un subproceso compatible con ACP que se comunica con su editor a través de JSON-RPC a través de stdio. - -A continuación se muestran ejemplos de editores populares que admiten ACP. - ---- - -### Zed - -Agregue a su configuración [Zed](https://zed.dev) (`~/.config/zed/settings.json`): - -```json title="~/.config/zed/settings.json" -{ - "agent_servers": { - "CoDev Code": { - "command": "codev", - "args": ["acp"] - } - } -} -``` - -Para abrirlo, use la acción `agent: new thread` en la **Paleta de comandos**. - -También puedes vincular un atajo de teclado editando tu `keymap.json`: - -```json title="keymap.json" -[ - { - "bindings": { - "cmd-alt-o": [ - "agent::NewExternalAgentThread", - { - "agent": { - "custom": { - "name": "CoDev Code", - "command": { - "command": "codev", - "args": ["acp"] - } - } - } - } - ] - } - } -] -``` - ---- - -### JetBrains IDEs - -Agregue a su [JetBrains IDE](https://www.jetbrains.com/) acp.json de acuerdo con la [documentación](https://www.jetbrains.com/help/ai-assistant/acp.html): - -```json title="acp.json" -{ - "agent_servers": { - "CoDev Code": { - "command": "/absolute/path/bin/codev", - "args": ["acp"] - } - } -} -``` - -Para abrirlo, use el nuevo agente 'CoDev Code' en el selector de agentes de AI Chat. - ---- - -### Avante.nvim - -Agregue a su configuración [Avante.nvim](https://github.com/yetone/avante.nvim): - -```lua -{ - acp_providers = { - ["opencode"] = { - command = "codev", - args = { "acp" } - } - } -} -``` - -Si necesita pasar variables de entorno: - -```lua {6-8} -{ - acp_providers = { - ["opencode"] = { - command = "codev", - args = { "acp" }, - env = { - CODEV_API_KEY = os.getenv("CODEV_API_KEY") - } - } - } -} -``` - ---- - -### CodeCompanion.nvim - -Para usar CoDev Code como agente ACP en [CodeCompanion.nvim](https://github.com/olimorris/codecompanion.nvim), agregue lo siguiente a su configuración de Neovim: - -```lua -require("codecompanion").setup({ - interactions = { - chat = { - adapter = { - name = "opencode", - model = "claude-sonnet-4", - }, - }, - }, -}) -``` - -Esta configuración configura CodeCompanion para usar CoDev Code como agente ACP para el chat. - -Si necesita pasar variables de entorno (como `CODEV_API_KEY`), consulte [Configuración de adaptadores: variables de entorno](https://codecompanion.olimorris.dev/getting-started#setting-an-api-key) en la documentación de CodeCompanion.nvim para obtener detalles completos. - -## Soporte - -CoDev Code funciona igual a través de ACP que en la terminal. Todas las funciones son compatibles: - -:::note -Algunos comandos de barra integrados como `/undo` y `/redo` no son compatibles actualmente. -::: - -- Herramientas integradas (operaciones de archivos, comandos de terminal, etc.) -- Herramientas personalizadas y comandos de barra -- Servidores MCP configurados en su configuración CoDev Code -- Reglas específicas del proyecto de `AGENTS.md` -- Formateadores y linters personalizados -- Sistema de agentes y permisos. diff --git a/packages/web/src/content/docs/es/agents.mdx b/packages/web/src/content/docs/es/agents.mdx deleted file mode 100644 index 50292cf9a7..0000000000 --- a/packages/web/src/content/docs/es/agents.mdx +++ /dev/null @@ -1,755 +0,0 @@ ---- -title: Agentes -description: Configurar y utilizar agentes especializados. ---- - -Los agentes son asistentes de IA especializados que se pueden configurar para tareas y flujos de trabajo específicos. Le permiten crear herramientas enfocadas con indicaciones, modelos y acceso a herramientas personalizados. - -:::tip -Utilice el agente del plan para analizar el código y revisar sugerencias sin realizar ningún cambio en el código. -::: - -Puede cambiar entre agentes durante una sesión o invocarlos con la mención `@`. - ---- - -## Tipos - -Hay dos tipos de agentes en CoDev Code; agentes primarios y subagentes. - ---- - -### Agentes primarios - -Los agentes primarios son los asistentes principales con los que interactúas directamente. Puede recorrerlos usando la tecla **Tab** o la combinación de teclas `switch_agent` configurada. Estos agentes manejan su conversación principal. El acceso a las herramientas se configura mediante permisos; por ejemplo, Build tiene todas las herramientas habilitadas mientras que Plan está restringido. - -:::tip -Puede utilizar la tecla **Tab** para cambiar entre agentes principales durante una sesión. -::: - -CoDev Code viene con dos agentes principales integrados, **Build** y **Plan**. Bien -mira estos a continuación. - ---- - -### Subagentes - -Los subagentes son asistentes especializados que los agentes principales pueden invocar para tareas específicas. También puedes invocarlos manualmente **@ mencionándolos** en tus mensajes. - -CoDev Code viene con tres subagentes integrados, **General**, **Explore** y **Scout**. Veremos esto a continuación. - ---- - -## Integrados - -CoDev Code viene con dos agentes primarios integrados y tres subagentes integrados. - ---- - -### Build - -_Modo_: `primary` - -Build es el agente principal **predeterminado** con todas las herramientas habilitadas. Este es el agente estándar para trabajos de desarrollo en los que necesita acceso completo a las operaciones de archivos y comandos del sistema. - ---- - -### Plan - -_Modo_: `primary` - -Un agente restringido diseñado para la planificación y el análisis. Utilizamos un sistema de permisos para brindarle más control y evitar cambios no deseados. -De forma predeterminada, todo lo siguiente está configurado en `ask`: - -- `file edits`: todas las escrituras, parches y ediciones. -- `bash`: Todos los comandos bash - -Este agente es útil cuando desea que LLM analice código, sugiera cambios o cree planes sin realizar modificaciones reales a su base de código. - ---- - -### General - -_Modo_: `subagent` - -Un agente de uso general para investigar preguntas complejas y ejecutar tareas de varios pasos. Tiene acceso completo a las herramientas (excepto tareas pendientes), por lo que puede realizar cambios en los archivos cuando sea necesario. Utilícelo para ejecutar varias unidades de trabajo en paralelo. - ---- - -### Explore - -_Modo_: `subagent` - -Un agente rápido y de solo lectura para explorar bases de código. No se pueden modificar archivos. Úselo cuando necesite buscar rápidamente archivos por patrones, buscar palabras clave en el código o responder preguntas sobre el código base. - ---- - -### Scout - -_Modo_: `subagent` - -Un agente de solo lectura para investigar documentación externa y dependencias. Úsalo cuando necesites clonar el repositorio de una dependencia en la caché administrada de CoDev Code, inspeccionar el código fuente de una librería o contrastar el código local con implementaciones upstream sin modificar tu espacio de trabajo. - ---- - -### Compactación - -_Modo_: `primary` - -Agente de sistema oculto que compacta un contexto largo en un resumen más pequeño. Se ejecuta automáticamente cuando es necesario y no se puede seleccionar en la interfaz de usuario. - ---- - -### Título - -_Modo_: `primary` - -Agente del sistema oculto que genera títulos de sesión cortos. Se ejecuta automáticamente y no se puede seleccionar en la interfaz de usuario. - ---- - -### Resumen - -_Modo_: `primary` - -Agente del sistema oculto que crea resúmenes de sesiones. Se ejecuta automáticamente y no se puede seleccionar en la interfaz de usuario. - ---- - -## Uso - -1. Para los agentes principales, use la tecla **Tab** para recorrerlos durante una sesión. También puede utilizar su combinación de teclas `switch_agent` configurada. - -2. Se pueden invocar subagentes: - - **Automáticamente** por agentes principales para tareas especializadas según sus descripciones. - - Manualmente **@ mencionando** un subagente en tu mensaje. Por ejemplo. - - ```txt frame="none" - @general help me search for this function - ``` - -3. **Navegación entre sesiones**: cuando los subagentes crean sus propias sesiones secundarias, puede navegar entre la sesión principal y todas las sesiones secundarias usando: - - **\+Right** (or su combinación de teclas `session_child_cycle` configurada) para avanzar a través de padre → hijo1 → hijo2 → ... → padre - - **\+Left** (or su combinación de teclas `session_child_cycle_reverse` configurada) para retroceder entre padre ← hijo1 ← hijo2 ← ... ← padre - - Esto le permite cambiar sin problemas entre la conversación principal y el trabajo de subagente especializado. - ---- - -## Configuración - -Puede personalizar los agentes integrados o crear los suyos propios mediante la configuración. Los agentes se pueden configurar de dos maneras: - ---- - -### JSON - -Configure agentes en su archivo de configuración `codev.json`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "mode": "primary", - "model": "anthropic/claude-sonnet-4-20250514", - "prompt": "{file:./prompts/build.txt}", - "tools": { - "write": true, - "edit": true, - "bash": true - } - }, - "plan": { - "mode": "primary", - "model": "anthropic/claude-haiku-4-20250514", - "tools": { - "write": false, - "edit": false, - "bash": false - } - }, - "code-reviewer": { - "description": "Reviews code for best practices and potential issues", - "mode": "subagent", - "model": "anthropic/claude-sonnet-4-20250514", - "prompt": "You are a code reviewer. Focus on security, performance, and maintainability.", - "tools": { - "write": false, - "edit": false - } - } - } -} -``` - ---- - -### Markdown - -También puede definir agentes utilizando archivos de Markdown. Colócalos en: - -- Global: `~/.config/codev/agents/` -- Por proyecto: `.codev/agents/` - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Reviews code for quality and best practices -mode: subagent -model: anthropic/claude-sonnet-4-20250514 -temperature: 0.1 -tools: - write: false - edit: false - bash: false ---- - -You are in code review mode. Focus on: - -- Code quality and best practices -- Potential bugs and edge cases -- Performance implications -- Security considerations - -Provide constructive feedback without making direct changes. -``` - -El nombre del archivo de Markdown se convierte en el nombre del agente. Por ejemplo, `review.md` crea un agente `review`. - ---- - -## Opciones - -Veamos estas opciones de configuración en detalle. - ---- - -### Descripción - -Utilice la opción `description` para proporcionar una breve descripción de lo que hace el agente y cuándo usarlo. - -```json title="codev.json" -{ - "agent": { - "review": { - "description": "Reviews code for best practices and potential issues" - } - } -} -``` - -Esta es una opción de configuración **obligatoria**. - ---- - -### Temperatura - -Controle la aleatoriedad y la creatividad de las respuestas de LLM con la configuración `temperature`. - -Los valores más bajos hacen que las respuestas sean más centradas y deterministas, mientras que los valores más altos aumentan la creatividad y la variabilidad. - -```json title="codev.json" -{ - "agent": { - "plan": { - "temperature": 0.1 - }, - "creative": { - "temperature": 0.8 - } - } -} -``` - -Los valores de temperatura suelen oscilar entre 0,0 y 1,0: - -- **0.0-0.2**: Respuestas muy enfocadas y deterministas, ideales para análisis y planificación de código. -- **0,3-0,5**: respuestas equilibradas con algo de creatividad, buenas para tareas de desarrollo general. -- **0.6-1.0**: respuestas más creativas y variadas, útiles para la lluvia de ideas y la exploración. - -```json title="codev.json" -{ - "agent": { - "analyze": { - "temperature": 0.1, - "prompt": "{file:./prompts/analysis.txt}" - }, - "build": { - "temperature": 0.3 - }, - "brainstorm": { - "temperature": 0.7, - "prompt": "{file:./prompts/creative.txt}" - } - } -} -``` - -Si no se especifica ninguna temperatura, CoDev Code utiliza valores predeterminados específicos del modelo; normalmente 0 para la mayoría de los modelos, 0,55 para los modelos Qwen. - ---- - -### Pasos máximos - -Controle la cantidad máxima de iteraciones agentes que un agente puede realizar antes de verse obligado a responder solo con texto. Esto permite a los usuarios que desean controlar los costos establecer un límite a las acciones de agencia. - -Si no se establece esto, el agente continuará iterando hasta que el modelo decida detenerse o el usuario interrumpa la sesión. - -```json title="codev.json" -{ - "agent": { - "quick-thinker": { - "description": "Fast reasoning with limited iterations", - "prompt": "You are a quick thinker. Solve problems with minimal steps.", - "steps": 5 - } - } -} -``` - -Cuando se alcanza el límite, el agente recibe un mensaje especial del sistema que le indica que responda con un resumen de su trabajo y las tareas restantes recomendadas. - -:::caution -El campo heredado `maxSteps` está en desuso. Utilice `steps` en su lugar. -::: - ---- - -### Deshabilitar - -Establezca en `true` para deshabilitar el agente. - -```json title="codev.json" -{ - "agent": { - "review": { - "disable": true - } - } -} -``` - ---- - -### Indicación - -Especifique un archivo de aviso del sistema personalizado para este agente con la configuración `prompt`. El archivo de aviso debe contener instrucciones específicas para el propósito del agente. - -```json title="codev.json" -{ - "agent": { - "review": { - "prompt": "{file:./prompts/code-review.txt}" - } - } -} -``` - -Esta ruta es relativa a donde se encuentra el archivo de configuración. Entonces esto funciona tanto para la configuración global CoDev Code como para la configuración específica del proyecto. - ---- - -### Modelo - -Utilice la configuración `model` para anular el modelo de este agente. Útil para utilizar diferentes modelos optimizados para diferentes tareas. Por ejemplo, un modelo más rápido de planificación, un modelo más capaz de implementación. - -:::tip -Si no especifica un modelo, los agentes primarios usarán el [modelo configurado globalmente](/docs/config#models), mientras que los subagentes usarán el modelo del agente primario que invocó al subagente. -::: - -```json title="codev.json" -{ - "agent": { - "plan": { - "model": "anthropic/claude-haiku-4-20250514" - } - } -} -``` - -El ID del modelo en su configuración CoDev Code usa el formato `provider/model-id`. Por ejemplo, si usa [OpenCode Zen](/docs/zen), usaría `opencode/gpt-5.1-codex` para GPT 5.1 Codex. - ---- - -### Herramientas - -Controle qué herramientas están disponibles en este agente con la configuración `tools`. Puede habilitar o deshabilitar herramientas específicas configurándolas en `true` o `false`. - -```json title="codev.json" {3-6,9-12} -{ - "$schema": "https://opencode.ai/config.json", - "tools": { - "write": true, - "bash": true - }, - "agent": { - "plan": { - "tools": { - "write": false, - "bash": false - } - } - } -} -``` - -:::note -La configuración específica del agente anula la configuración global. -::: - -También puedes utilizar comodines para controlar varias herramientas a la vez. Por ejemplo, para desactivar todas las herramientas de un servidor MCP: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "readonly": { - "tools": { - "mymcp_*": false, - "write": false, - "edit": false - } - } - } -} -``` - -[Más información sobre herramientas](/docs/tools). - ---- - -### Permisos - -Puede configurar permisos para administrar qué acciones puede realizar un agente. Actualmente, los permisos para las herramientas `edit`, `bash` y `webfetch` se pueden configurar para: - -- `"ask"`: solicitar aprobación antes de ejecutar la herramienta -- `"allow"` — Permitir todas las operaciones sin aprobación -- `"deny"` — Desactiva la herramienta - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny" - } -} -``` - -Puede anular estos permisos por agente. - -```json title="codev.json" {3-5,8-10} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny" - }, - "agent": { - "build": { - "permission": { - "edit": "ask" - } - } - } -} -``` - -También puede establecer permisos en los agentes de Markdown. - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Code review without edits -mode: subagent -permission: - edit: deny - bash: - "*": ask - "git diff": allow - "git log*": allow - "grep *": allow - webfetch: deny ---- - -Only analyze code and suggest changes. -``` - -Puede establecer permisos para comandos bash específicos. - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "git push": "ask", - "grep *": "allow" - } - } - } - } -} -``` - -Esto puede tomar un patrón global. - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "git *": "ask" - } - } - } - } -} -``` - -Y también puedes usar el comodín `*` para administrar los permisos de todos los comandos. -Dado que la última regla de coincidencia tiene prioridad, coloque el comodín `*` primero y las reglas específicas después. - -```json title="codev.json" {8} -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "build": { - "permission": { - "bash": { - "*": "ask", - "git status *": "allow" - } - } - } - } -} -``` - -[Más información sobre permisos](/docs/permissions). - ---- - -### Modo - -Controle el modo del agente con la configuración `mode`. La opción `mode` se utiliza para determinar cómo se puede utilizar el agente. - -```json title="codev.json" -{ - "agent": { - "review": { - "mode": "subagent" - } - } -} -``` - -La opción `mode` se puede configurar en `primary`, `subagent` o `all`. Si no se especifica `mode`, el valor predeterminado es `all`. - ---- - -### Oculto - -Oculte un subagente del menú de autocompletar `@` con `hidden: true`. Útil para subagentes internos que solo deben ser invocados mediante programación por otros agentes a través de la herramienta Tarea. - -```json title="codev.json" -{ - "agent": { - "internal-helper": { - "mode": "subagent", - "hidden": true - } - } -} -``` - -Esto sólo afecta la visibilidad del usuario en el menú de autocompletar. El modelo aún puede invocar agentes ocultos a través de la herramienta Tarea si los permisos lo permiten. - -:::note -Sólo aplica para agentes `mode: subagent`. -::: - ---- - -### Permisos de tarea - -Controle qué subagentes puede invocar un agente a través de la herramienta Tarea con `permission.task`. Utiliza patrones globales para una combinación flexible. - -```json title="codev.json" -{ - "agent": { - "orchestrator": { - "mode": "primary", - "permission": { - "task": { - "*": "deny", - "orchestrator-*": "allow", - "code-reviewer": "ask" - } - } - } - } -} -``` - -Cuando se establece en `deny`, el subagente se elimina por completo de la descripción de la herramienta Tarea, por lo que el modelo no intentará invocarlo. - -:::tip -Las reglas se evalúan en orden y la **última regla coincidente gana**. En el ejemplo anterior, `orchestrator-planner` coincide con `*` (denegar) y `orchestrator-*` (permitir), pero como `orchestrator-*` viene después de `*`, el resultado es `allow`. -::: - -:::tip -Los usuarios siempre pueden invocar cualquier subagente directamente a través del menú de autocompletar `@`, incluso si los permisos de tarea del agente lo niegan. -::: - ---- - -### Color - -Personalice la apariencia visual del agente en la interfaz de usuario con la opción `color`. Esto afecta la forma en que aparece el agente en la interfaz. - -Utilice un color hexadecimal válido (por ejemplo, `#FF5733`) o un color de tema: `primary`, `secondary`, `accent`, `success`, `warning`, `error`, `info`. - -```json title="codev.json" -{ - "agent": { - "creative": { - "color": "#ff6b6b" - }, - "code-reviewer": { - "color": "accent" - } - } -} -``` - ---- - -### Top P - -Controle la diversidad de respuestas con la opción `top_p`. Alternativa a la temperatura para controlar la aleatoriedad. - -```json title="codev.json" -{ - "agent": { - "brainstorm": { - "top_p": 0.9 - } - } -} -``` - -Los valores oscilan entre 0,0 y 1,0. Los valores más bajos están más enfocados, los valores más altos son más diversos. - ---- - -### Adicional - -Cualquier otra opción que especifique en la configuración de su agente se **pasará directamente** al proveedor como opciones de modelo. Esto le permite utilizar funciones y parámetros específicos del proveedor. - -Por ejemplo, con los modelos de razonamiento de OpenAI, puedes controlar el esfuerzo de razonamiento: - -```json title="codev.json" {6,7} -{ - "agent": { - "deep-thinker": { - "description": "Agent that uses high reasoning effort for complex problems", - "model": "openai/gpt-5", - "reasoningEffort": "high", - "textVerbosity": "low" - } - } -} -``` - -Estas opciones adicionales son específicas del modelo y del proveedor. Consulte la documentación de su proveedor para conocer los parámetros disponibles. - -:::tip -Ejecute `codev models` para ver una lista de los modelos disponibles. -::: - ---- - -## Crear agentes - -Puede crear nuevos agentes usando el siguiente comando: - -```bash -codev agent create -``` - -Este comando interactivo: - -1. Preguntar dónde guardar al agente; global o específico del proyecto. -2. Descripción de lo que debe hacer el agente. -3. Genere un indicador y un identificador del sistema adecuados. -4. Le permite seleccionar a qué herramientas puede acceder el agente. -5. Finalmente, cree un archivo Markdown con la configuración del agente. - ---- - -## Casos de uso - -A continuación se muestran algunos casos de uso comunes para diferentes agentes. - -- **Agente Build**: trabajo de desarrollo completo con todas las herramientas habilitadas -- **Agente Plan**: Análisis y planificación sin realizar cambios -- **Agente Review**: revisión de código con acceso de solo lectura más herramientas de documentación -- **Agente Debug**: centrado en la investigación con bash y herramientas de lectura habilitadas -- **Agente Docs**: escritura de documentación con operaciones de archivos pero sin comandos del sistema. - ---- - -## Ejemplos - -A continuación se muestran algunos agentes de ejemplo que pueden resultarle útiles. - -:::tip -¿Tiene un agente que le gustaría compartir? [Enviar un PR](https://github.com/quickbeard/codev-code). -::: - ---- - -### Agente de documentación - -```markdown title="~/.config/codev/agents/docs-writer.md" ---- -description: Writes and maintains project documentation -mode: subagent -tools: - bash: false ---- - -You are a technical writer. Create clear, comprehensive documentation. - -Focus on: - -- Clear explanations -- Proper structure -- Code examples -- User-friendly language -``` - ---- - -### Auditor de seguridad - -```markdown title="~/.config/codev/agents/security-auditor.md" ---- -description: Performs security audits and identifies vulnerabilities -mode: subagent -tools: - write: false - edit: false ---- - -You are a security expert. Focus on identifying potential security issues. - -Look for: - -- Input validation vulnerabilities -- Authentication and authorization flaws -- Data exposure risks -- Dependency vulnerabilities -- Configuration security issues -``` diff --git a/packages/web/src/content/docs/es/cli.mdx b/packages/web/src/content/docs/es/cli.mdx deleted file mode 100644 index 824321fd9c..0000000000 --- a/packages/web/src/content/docs/es/cli.mdx +++ /dev/null @@ -1,616 +0,0 @@ ---- -title: CLI -description: Opciones y comandos de la CLI de CoDev Code. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" - -La CLI de CoDev Code de forma predeterminada inicia el [TUI](/docs/tui) cuando se ejecuta sin ningún argumento. - -```bash -codev -``` - -Pero también acepta comandos como se documenta en esta página. Esto le permite interactuar con CoDev Code mediante programación. - -```bash -codev run "Explain how closures work in JavaScript" -``` - ---- - -### tui - -Inicie la interfaz de usuario del terminal CoDev Code. - -```bash -codev [project] -``` - -#### Opciones - -| Opción | Corta | Descripción | -| ---------------------------------------- | ----- | --------------------------------------------------------------------- | -| {"--continue"} | `-c` | Continuar la última sesión | -| {"--session"} | `-s` | ID de sesión para continuar | -| {"--fork"} | | Bifurcar la sesión al continuar (usar con `--continue` o `--session`) | -| {"--prompt"} | | Aviso de uso | -| {"--model"} | `-m` | Modelo a utilizar en forma de proveedor/modelo | -| {"--agent"} | | Agente a utilizar | -| {"--port"} | | Puerto para escuchar | -| {"--hostname"} | | Nombre de host para escuchar | - ---- - -## Comandos - -La CLI de CoDev Code también tiene los siguientes comandos. - ---- - -### agent - -Administrar agentes para CoDev Code. - -```bash -codev agent [command] -``` - ---- - -### attach - -Conecte una terminal a un servidor backend CoDev Code que ya se esté ejecutando y iniciado mediante los comandos `serve` o `web`. - -```bash -codev attach [url] -``` - -Esto permite usar TUI con un backend remoto CoDev Code. Por ejemplo: - -```bash -# Start the backend server for web/mobile access -codev web --port 4096 --hostname 0.0.0.0 - -# In another terminal, attach the TUI to the running backend -codev attach http://10.20.30.40:4096 -``` - -#### Opciones - -| Opción | Corta | Descripción | -| ---------------------------------------- | ----- | ----------------------------------------------------------------------------------------- | -| {"--dir"} | | Directorio de trabajo para iniciar TUI en | -| {"--continue"} | `-c` | Continuar la última sesión | -| {"--session"} | `-s` | ID de sesión para continuar | -| {"--fork"} | | Bifurcar la sesión al continuar (usar con `--continue` o `--session`) | -| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `CODEV_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `CODEV_SERVER_USERNAME` u `opencode`) | - ---- - -#### create - -Cree un nuevo agente con configuración personalizada. - -```bash -codev agent create -``` - -Este comando lo guiará en la creación de un nuevo agente con un mensaje del sistema personalizado y una configuración de herramientas. - ---- - -#### list - -Enumere todos los agentes disponibles. - -```bash -codev agent list -``` - ---- - -### auth - -Comando para administrar credenciales e iniciar sesión para proveedores. - -```bash -codev auth [command] -``` - ---- - -#### login - -CoDev Code funciona con la lista de proveedores en [Models.dev](https://models.dev), por lo que puede usar `codev auth login` para configurar las claves API para cualquier proveedor que desee utilizar. Esto se almacena en `~/.local/share/codev/auth.json`. - -```bash -codev auth login -``` - -Cuando se inicia CoDev Code, carga los proveedores desde el archivo de credenciales. Y si hay claves definidas en sus entornos o un archivo `.env` en su proyecto. - ---- - -#### list - -Enumera todos los proveedores autenticados tal como están almacenados en el archivo de credenciales. - -```bash -codev auth list -``` - -O la versión corta. - -```bash -codev auth ls -``` - ---- - -#### logout - -Cierra tu sesión de un proveedor eliminándolo del archivo de credenciales. - -```bash -codev auth logout -``` - ---- - -### github - -Administre el agente GitHub para la automatización del repositorio. - -```bash -codev github [command] -``` - ---- - -#### install - -Instale el agente GitHub en su repositorio. - -```bash -codev github install -``` - -Esto configura el flujo de trabajo de acciones GitHub necesario y lo guía a través del proceso de configuración. [Más información](/docs/github). - ---- - -#### run - -Ejecute el agente GitHub. Esto se usa normalmente en acciones GitHub. - -```bash -codev github run -``` - -##### Opciones - -| Opción | Descripción | -| ------------------------------------- | ---------------------------------------------- | -| {"--event"} | GitHub evento simulado para ejecutar el agente | -| {"--token"} | GitHub token de acceso personal | - ---- - -### mcp - -Administrar servidores de protocolo de contexto modelo. - -```bash -codev mcp [command] -``` - ---- - -#### add - -Agregue un servidor MCP a su configuración. - -```bash -codev mcp add -``` - -Este comando lo guiará para agregar un servidor MCP local o remoto. - ---- - -#### list - -Enumere todos los servidores MCP configurados y su estado de conexión. - -```bash -codev mcp list -``` - -O utilice la versión corta. - -```bash -codev mcp ls -``` - ---- - -#### auth - -Autentíquese con un servidor MCP habilitado para OAuth. - -```bash -codev mcp auth [name] -``` - -Si no proporciona un nombre de servidor, se le pedirá que seleccione entre los servidores compatibles con OAuth disponibles. - -También puede enumerar los servidores compatibles con OAuth y su estado de autenticación. - -```bash -codev mcp auth list -``` - -O utilice la versión corta. - -```bash -codev mcp auth ls -``` - ---- - -#### logout - -Elimine las credenciales OAuth para un servidor MCP. - -```bash -codev mcp logout [name] -``` - ---- - -#### debug - -Depurar problemas de conexión OAuth para un servidor MCP. - -```bash -codev mcp debug -``` - ---- - -### models - -Enumere todos los modelos disponibles de los proveedores configurados. - -```bash -codev models [provider] -``` - -Este comando muestra todos los modelos disponibles en sus proveedores configurados en el formato `provider/model`. - -Esto es útil para determinar el nombre exacto del modelo que se usará en [su configuración](/docs/config/). - -Opcionalmente, puede pasar un ID de proveedor para filtrar modelos por ese proveedor. - -```bash -codev models anthropic -``` - -#### Opciones - -| Opción | Descripción | -| --------------------------------------- | --------------------------------------------------------------------------- | -| {"--refresh"} | Actualizar la caché de modelos desde models.dev | -| {"--verbose"} | Utilice una salida del modelo más detallada (incluye metadatos como costos) | - -Utilice el indicador `--refresh` para actualizar la lista de modelos almacenados en caché. Esto es útil cuando se han agregado nuevos modelos a un proveedor y desea verlos en CoDev Code. - -```bash -codev models --refresh -``` - ---- - -### run - -Ejecute CoDev Code en modo no interactivo pasando un mensaje directamente. - -```bash -codev run [message..] -``` - -Esto es útil para secuencias de comandos, automatización o cuando desea una respuesta rápida sin iniciar el TUI completo. Por ejemplo. - -```bash "codev run" -codev run Explain the use of context in Go -``` - -También puede conectarse a una instancia `codev serve` en ejecución para evitar tiempos de arranque en frío del servidor MCP en cada ejecución: - -```bash -# Start a headless server in one terminal -codev serve - -# In another terminal, run commands that attach to it -codev run --attach http://localhost:4096 "Explain async/await in JavaScript" -``` - -#### Opciones - -| Opción | Corta | Descripción | -| ---------------------------------------- | ----- | ----------------------------------------------------------------------------------------- | -| {"--command"} | | El comando a ejecutar, use mensaje para args | -| {"--continue"} | `-c` | Continuar la última sesión | -| {"--session"} | `-s` | ID de sesión para continuar | -| {"--fork"} | | Bifurcar la sesión al continuar (usar con `--continue` o `--session`) | -| {"--share"} | | Comparte la sesión | -| {"--model"} | `-m` | Modelo a utilizar en forma de proveedor/modelo | -| {"--agent"} | | Agente a utilizar | -| {"--file"} | `-f` | Archivo(s) para adjuntar al mensaje | -| {"--format"} | | Formato: predeterminado (formateado) o json (eventos JSON sin formato) | -| {"--title"} | | Título de la sesión (utiliza un mensaje truncado si no se proporciona ningún valor) | -| {"--attach"} | | Adjuntar a un servidor CoDev Code en ejecución (por ejemplo, http://localhost:4096) | -| {"--password"} | `-p` | Contraseña de autenticación básica (predeterminada: `CODEV_SERVER_PASSWORD`) | -| {"--username"} | `-u` | Usuario de autenticación básica (predeterminado: `CODEV_SERVER_USERNAME` u `opencode`) | -| {"--dir"} | | Directorio de ejecución, o ruta en el servidor remoto al adjuntar | -| {"--variant"} | | Variante del modelo (esfuerzo de razonamiento específico del proveedor) | -| {"--thinking"} | | Mostrar bloques de pensamiento | -| {"--port"} | | Puerto para el servidor local (el puerto predeterminado es aleatorio) | - ---- - -### serve - -Inicie un servidor CoDev Code sin cabeza para acceso API. Consulte los [documentos del servidor](/docs/server) para conocer la interfaz HTTP completa. - -```bash -codev serve -``` - -Esto inicia un servidor HTTP que proporciona acceso API a la funcionalidad de CoDev Code sin la interfaz TUI. Configure `CODEV_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). - -#### Opciones - -| Opción | Descripción | -| ---------------------------------------- | ---------------------------------------------------- | -| {"--port"} | Puerto para escuchar | -| {"--hostname"} | Nombre de host para escuchar | -| {"--mdns"} | Habilitar el descubrimiento de mDNS | -| {"--cors"} | Orígenes de navegador adicionales para permitir CORS | - ---- - -### session - -Administrar CoDev Code sesiones. - -```bash -codev session [command] -``` - ---- - -#### list - -Enumere todas las sesiones CoDev Code. - -```bash -codev session list -``` - -##### Opciones - -| Opción | Corta | Descripción | -| ----------------------------------------- | ----- | --------------------------------------- | -| {"--max-count"} | `-n` | Limitar a N sesiones más recientes | -| {"--format"} | | Formato de salida: tabla o json (tabla) | - ---- - -### stats - -Muestre el uso de tokens y las estadísticas de costos para sus sesiones CoDev Code. - -```bash -codev stats -``` - -#### Opciones - -| Opción | Descripción | -| --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| {"--days"} | Mostrar estadísticas de los últimos N días (todo el tiempo) | -| {"--tools"} | Número de herramientas para mostrar (todas) | -| {"--models"} | Mostrar el desglose del uso del modelo (oculto de forma predeterminada). Pase un número para mostrar la parte superior N | -| {"--project"} | Filtrar por proyecto (todos los proyectos, cadena vacía: proyecto actual) | - ---- - -### export - -Exportar datos de la sesión como JSON. - -```bash -codev export [sessionID] -``` - -Si no proporciona una ID de sesión, se le pedirá que seleccione entre las sesiones disponibles. - ---- - -### import - -Importe datos de sesión desde un archivo JSON o una URL compartida CoDev Code. - -```bash -codev import -``` - -Puede importar desde un archivo local o una URL compartida CoDev Code. - -```bash -codev import session.json -codev import https://opncd.ai/s/abc123 -``` - ---- - -### web - -Inicie un servidor CoDev Code sin cabeza con una interfaz web. - -```bash -codev web -``` - -Esto inicia un servidor HTTP y abre un navegador web para acceder a CoDev Code a través de una interfaz web. Configure `CODEV_SERVER_PASSWORD` para habilitar la autenticación básica HTTP (el nombre de usuario predeterminado es `opencode`). - -#### Opciones - -| Opción | Descripción | -| ---------------------------------------- | ---------------------------------------------------- | -| {"--port"} | Puerto para escuchar | -| {"--hostname"} | Nombre de host para escuchar | -| {"--mdns"} | Habilitar el descubrimiento de mDNS | -| {"--cors"} | Orígenes de navegador adicionales para permitir CORS | - ---- - -### acp - -Inicie un servidor ACP (Agent Client Protocol). - -```bash -codev acp -``` - -Este comando inicia un servidor ACP que se comunica a través de stdin/stdout usando nd-JSON. - -#### Opciones - -| Opción | Descripción | -| ---------------------------------------- | ---------------------------- | -| {"--cwd"} | Directorio de trabajo | -| {"--port"} | Puerto para escuchar | -| {"--hostname"} | Nombre de host para escuchar | - ---- - -### uninstall - -Desinstale CoDev Code y elimine todos los archivos relacionados. - -```bash -codev uninstall -``` - -#### Opciones - -| Opción | Corta | Descripción | -| ------------------------------------------- | ----- | ----------------------------------------- | -| {"--keep-config"} | `-c` | Mantener archivos de configuración | -| {"--keep-data"} | `-d` | Conservar datos de sesión e instantáneas | -| {"--dry-run"} | | Mostrar lo que se eliminaría sin eliminar | -| {"--force"} | `-f` | Saltar mensajes de confirmación | - ---- - -### upgrade - -Actualiza CoDev Code a la última versión o a una versión específica. - -```bash -codev upgrade [target] -``` - -Para actualizar a la última versión. - -```bash -codev upgrade -``` - -Para actualizar a una versión específica. - -```bash -codev upgrade v0.1.48 -``` - -#### Opciones - -| Opción | Corta | Descripción | -| -------------------------------------- | ----- | ------------------------------------------------------------------- | -| {"--method"} | `-m` | El método de instalación que se utilizó; curl, npm, pnpm, bun, brew | - ---- - -## Opciones globales - -La CLI de CoDev Code toma las siguientes banderas globales. - -| Opción | Corta | Descripción | -| ------------------------------------------ | ----- | -------------------------------------------- | -| {"--help"} | `-h` | Mostrar ayuda | -| {"--version"} | `-v` | Número de versión de impresión | -| {"--print-logs"} | | Imprimir registros en stderr | -| {"--log-level"} | | Nivel de registro (DEBUG, INFO, WARN, ERROR) | - ---- - -## Variables de entorno - -CoDev Code se puede configurar mediante variables de entorno. - -| Variable | Type | Description | -| ------------------------------------- | -------- | ------------------------------------------------------------------------------- | -| `CODEV_AUTO_SHARE` | booleano | Compartir sesiones automáticamente | -| `CODEV_GIT_BASH_PATH` | cadena | Ruta al ejecutable de Git Bash en Windows | -| `CODEV_CONFIG` | cadena | Ruta al archivo de configuración | -| `CODEV_CONFIG_DIR` | cadena | Ruta al directorio de configuración | -| `CODEV_CONFIG_CONTENT` | cadena | Contenido de configuración json en línea | -| `CODEV_DISABLE_AUTOUPDATE` | booleano | Deshabilitar las comprobaciones automáticas de actualizaciones | -| `CODEV_DISABLE_PRUNE` | booleano | Deshabilitar la poda de datos antiguos | -| `CODEV_DISABLE_TERMINAL_TITLE` | booleano | Deshabilitar las actualizaciones automáticas de títulos de terminal | -| `CODEV_PERMISSION` | cadena | Configuración de permisos json incorporados | -| `CODEV_DISABLE_DEFAULT_PLUGINS` | booleano | Deshabilitar complementos predeterminados | -| `CODEV_DISABLE_LSP_DOWNLOAD` | booleano | Deshabilitar las descargas automáticas del servidor LSP | -| `CODEV_ENABLE_EXPERIMENTAL_MODELS` | booleano | Habilitar modelos experimentales | -| `CODEV_DISABLE_AUTOCOMPACT` | booleano | Deshabilitar la compactación automática de contexto | -| `CODEV_DISABLE_CLAUDE_CODE` | booleano | Deshabilitar la lectura desde `.claude` (mensaje + habilidades) | -| `CODEV_DISABLE_CLAUDE_CODE_PROMPT` | booleano | Desactivar lectura `~/.claude/CLAUDE.md` | -| `CODEV_DISABLE_CLAUDE_CODE_SKILLS` | booleano | Deshabilitar la carga `.claude/skills` | -| `CODEV_DISABLE_MODELS_FETCH` | booleano | Deshabilitar la recuperación de modelos desde fuentes remotas | -| `CODEV_FAKE_VCS` | cadena | Proveedor de VCS falso para fines de prueba | -| `CODEV_CLIENT` | cadena | Identificador de cliente (por defecto `cli`) | -| `CODEV_ENABLE_EXA` | booleano | Habilitar las herramientas de búsqueda web de Exa | -| `CODEV_SERVER_PASSWORD` | cadena | Habilite la autenticación básica para `serve`/`web` | -| `CODEV_SERVER_USERNAME` | cadena | Anular el nombre de usuario de autenticación básica (predeterminado `opencode`) | -| `CODEV_MODELS_URL` | cadena | URL personalizada para buscar la configuración de modelos | - ---- - -### Experimental - -Estas variables de entorno habilitan funciones experimentales que pueden cambiar o eliminarse. - -| Variable | Type | Description | -| ----------------------------------------------- | -------- | ---------------------------------------------------------- | -| `CODEV_EXPERIMENTAL` | booleano | Habilitar funciones experimentales de la bandera global | -| `CODEV_EXPERIMENTAL_ICON_DISCOVERY` | booleano | Habilitar descubrimiento de íconos | -| `CODEV_EXPERIMENTAL_DISABLE_COPY_ON_SELECT` | booleano | Deshabilitar copia al seleccionar en TUI | -| `CODEV_EXPERIMENTAL_BASH_DEFAULT_TIMEOUT_MS` | número | Tiempo de espera predeterminado para comandos bash en ms | -| `CODEV_EXPERIMENTAL_OUTPUT_TOKEN_MAX` | número | Tokens de salida máximos para respuestas LLM | -| `CODEV_EXPERIMENTAL_FILEWATCHER` | booleano | Habilite el observador de archivos para todo el directorio | -| `CODEV_EXPERIMENTAL_OXFMT` | booleano | Habilitar el formateador oxfmt | -| `CODEV_EXPERIMENTAL_LSP_TOOL` | booleano | Habilitar herramienta experimental LSP | -| `CODEV_EXPERIMENTAL_DISABLE_FILEWATCHER` | booleano | Deshabilitar el observador de archivos | -| `CODEV_EXPERIMENTAL_EXA` | booleano | Habilitar funciones experimentales de Exa | -| `CODEV_EXPERIMENTAL_LSP_TY` | booleano | Habilitar Habilitar TY LSP para archivos python | -| `CODEV_EXPERIMENTAL_PLAN_MODE` | booleano | Habilitar modo de plan | -| `CODEV_EXPERIMENTAL_BACKGROUND_SUBAGENTS` | booleano | Habilitar tareas de subagentes en segundo plano | -| `CODEV_EXPERIMENTAL_EVENT_SYSTEM` | booleano | Habilitar sistema de eventos experimental | -| `CODEV_EXPERIMENTAL_NATIVE_LLM` | booleano | Habilitar ruta nativa de solicitud LLM | -| `CODEV_EXPERIMENTAL_PARALLEL` | booleano | Habilitar ejecución paralela de búsqueda web | -| `CODEV_EXPERIMENTAL_SCOUT` | booleano | Habilitar subagente Scout | -| `CODEV_EXPERIMENTAL_WORKSPACES` | booleano | Habilitar soporte de espacios de trabajo | diff --git a/packages/web/src/content/docs/es/commands.mdx b/packages/web/src/content/docs/es/commands.mdx deleted file mode 100644 index ce7b20855c..0000000000 --- a/packages/web/src/content/docs/es/commands.mdx +++ /dev/null @@ -1,323 +0,0 @@ ---- -title: Comandos -description: Cree comandos personalizados para tareas repetitivas. ---- - -Los comandos personalizados le permiten especificar un mensaje que desea ejecutar cuando ese comando se ejecuta en TUI. - -```bash frame="none" -/my-command -``` - -Los comandos personalizados se suman a los comandos integrados como `/init`, `/undo`, `/redo`, `/share`, `/help`. [Más información](/docs/tui#commands). - ---- - -## Crear archivos de comando - -Cree archivos de Markdown en el directorio `commands/` para definir comandos personalizados. - -Crear `.codev/commands/test.md`: - -```md title=".codev/commands/test.md" ---- -description: Run tests with coverage -agent: build -model: anthropic/claude-3-5-sonnet-20241022 ---- - -Run the full test suite with coverage report and show any failures. -Focus on the failing tests and suggest fixes. -``` - -El frontmatter define las propiedades del comando. El contenido se convierte en la plantilla. - -Utilice el comando escribiendo `/` seguido del nombre del comando. - -```bash frame="none" -"/test" -``` - ---- - -## Configuración - -Puede agregar comandos personalizados a través de la configuración CoDev Code o creando archivos de Markdown en el directorio `commands/`. - ---- - -### JSON - -Utilice la opción `command` en su CoDev Code [config](/docs/config): - -```json title="codev.jsonc" {4-12} -{ - "$schema": "https://opencode.ai/config.json", - "command": { - // This becomes the name of the command - "test": { - // This is the prompt that will be sent to the LLM - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.", - // This is shown as the description in the TUI - "description": "Run tests with coverage", - "agent": "build", - "model": "anthropic/claude-3-5-sonnet-20241022" - } - } -} -``` - -Ahora puedes ejecutar este comando en TUI: - -```bash frame="none" -/test -``` - ---- - -### Markdown - -También puede definir comandos utilizando archivos de Markdown. Colócalos en: - -- Global: `~/.config/codev/commands/` -- Por proyecto: `.codev/commands/` - -```markdown title="~/.config/codev/commands/test.md" ---- -description: Run tests with coverage -agent: build -model: anthropic/claude-3-5-sonnet-20241022 ---- - -Run the full test suite with coverage report and show any failures. -Focus on the failing tests and suggest fixes. -``` - -El nombre del archivo de Markdown se convierte en el nombre del comando. Por ejemplo, `test.md` permite -que lo ejecutes: - -```bash frame="none" -/test -``` - ---- - -## Configuración de indicaciones - -Las indicaciones para los comandos personalizados admiten varios marcadores de posición y sintaxis especiales. - ---- - -### Argumentos - -Pase argumentos a comandos usando el marcador de posición `$ARGUMENTS`. - -```md title=".codev/commands/component.md" ---- -description: Create a new component ---- - -Create a new React component named $ARGUMENTS with TypeScript support. -Include proper typing and basic structure. -``` - -Ejecute el comando con argumentos: - -```bash frame="none" -/component Button -``` - -Y `$ARGUMENTS` será reemplazado por `Button`. - -También puede acceder a argumentos individuales utilizando parámetros posicionales: - -- `$1` - Primer argumento -- `$2` - Segundo argumento -- `$3` - Tercer argumento -- Etcétera... - -Por ejemplo: - -```md title=".codev/commands/create-file.md" ---- -description: Create a new file with content ---- - -Create a file named $1 in the directory $2 -with the following content: $3 -``` - -Ejecute el comando: - -```bash frame="none" -/create-file config.json src "{ \"key\": \"value\" }" -``` - -Esto reemplaza: - -- `$1` con `config.json` -- `$2` con `src` -- `$3` con `{ "key": "value" }` - ---- - -### Salida del shell - -Utilice _!`command`_ para inyectar la salida de [comando bash](/docs/tui#bash-commands) en su mensaje. - -Por ejemplo, para crear un comando personalizado que analice la cobertura de la prueba: - -```md title=".codev/commands/analyze-coverage.md" ---- -description: Analyze test coverage ---- - -Here are the current test results: -!`npm test` - -Based on these results, suggest improvements to increase coverage. -``` - -O para revisar cambios recientes: - -```md title=".codev/commands/review-changes.md" ---- -description: Review recent changes ---- - -Recent git commits: -!`git log --oneline -10` - -Review these changes and suggest any improvements. -``` - -Los comandos se ejecutan en el directorio raíz de su proyecto y su salida pasa a formar parte del mensaje. - ---- - -### Referencias de archivos - -Incluya archivos en su comando usando `@` seguido del nombre del archivo. - -```md title=".codev/commands/review-component.md" ---- -description: Review component ---- - -Review the component in @src/components/Button.tsx. -Check for performance issues and suggest improvements. -``` - -El contenido del archivo se incluye automáticamente en el mensaje. - ---- - -## Opciones - -Veamos las opciones de configuración en detalle. - ---- - -### Plantilla - -La opción `template` define el mensaje que se enviará al LLM cuando se ejecute el comando. - -```json title="codev.json" -{ - "command": { - "test": { - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes." - } - } -} -``` - -Esta es una opción de configuración **obligatoria**. - ---- - -### Descripción - -Utilice la opción `description` para proporcionar una breve descripción de lo que hace el comando. - -```json title="codev.json" -{ - "command": { - "test": { - "description": "Run tests with coverage" - } - } -} -``` - -Esto se muestra como descripción en TUI cuando escribe el comando. - ---- - -### Agente - -Utilice la configuración `agent` para especificar opcionalmente qué [agente](/docs/agents) debe ejecutar este comando. -Si se trata de un [subagente](/docs/agents/#subagents), el comando activará una invocación de subagente de forma predeterminada. -Para desactivar este comportamiento, establezca `subtask` en `false`. - -```json title="codev.json" -{ - "command": { - "review": { - "agent": "plan" - } - } -} -``` - -Esta es una opción de configuración **opcional**. Si no se especifica, el valor predeterminado es su agente actual. - ---- - -### Subtarea - -Utilice el booleano `subtask` para forzar que el comando active una invocación de [subagente](/docs/agents/#subagents). -Esto es útil si desea que el comando no contamine su contexto principal y **obligue** al agente a actuar como subagente. -incluso si `mode` está configurado en `primary` en la configuración de [agente](/docs/agents). - -```json title="codev.json" -{ - "command": { - "analyze": { - "subtask": true - } - } -} -``` - -Esta es una opción de configuración **opcional**. - ---- - -### Modelo - -Utilice la configuración `model` para anular el modelo predeterminado para este comando. - -```json title="codev.json" -{ - "command": { - "analyze": { - "model": "anthropic/claude-3-5-sonnet-20241022" - } - } -} -``` - -Esta es una opción de configuración **opcional**. - ---- - -## Integrados - -CoDev Code incluye varios comandos integrados como `/init`, `/undo`, `/redo`, `/share`, `/help`; [más información](/docs/tui#commands). - -:::note -Los comandos personalizados pueden anular los comandos integrados. -::: - -Si define un comando personalizado con el mismo nombre, anulará el comando integrado. diff --git a/packages/web/src/content/docs/es/config.mdx b/packages/web/src/content/docs/es/config.mdx deleted file mode 100644 index ce20ce2bc3..0000000000 --- a/packages/web/src/content/docs/es/config.mdx +++ /dev/null @@ -1,685 +0,0 @@ ---- -title: Configuración -description: Usando la configuración CoDev Code JSON. ---- - -Puede configurar CoDev Code usando un archivo de configuración JSON. - ---- - -## Formato - -CoDev Code admite los formatos **JSON** y **JSONC** (JSON con comentarios). - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - // Theme configuration - "theme": "opencode", - "model": "anthropic/claude-sonnet-4-5", - "autoupdate": true, -} -``` - ---- - -## Ubicaciones - -Puedes colocar tu configuración en un par de ubicaciones diferentes y tienen un -diferente orden de precedencia. - -:::note -Los archivos de configuración se **fusionan**, no se reemplazan. -::: - -Los archivos de configuración se fusionan, no se reemplazan. Se combinan las configuraciones de las siguientes ubicaciones de configuración. Las configuraciones posteriores anulan las anteriores solo para claves en conflicto. Se conservan las configuraciones no conflictivas de todas las configuraciones. - -Por ejemplo, si su configuración global establece `theme: "opencode"` y `autoupdate: true`, y la configuración de su proyecto establece `model: "anthropic/claude-sonnet-4-5"`, la configuración final incluirá las tres configuraciones. - ---- - -### Orden de precedencia - -Las fuentes de configuración se cargan en este orden (las fuentes posteriores anulan las anteriores): - -1. **Configuración remota** (de `.well-known/opencode`): valores predeterminados de la organización -2. **Configuración global** (`~/.config/codev/codev.json`) - preferencias del usuario -3. **Configuración personalizada** (`CODEV_CONFIG` env var): anulaciones personalizadas -4. **Configuración del proyecto** (`codev.json` en el proyecto): configuración específica del proyecto -5. Directorios **`.codev`** - agentes, comandos, complementos -6. **Configuración en línea** (`CODEV_CONFIG_CONTENT` env var): anulaciones del tiempo de ejecución - -Esto significa que las configuraciones del proyecto pueden anular los valores predeterminados globales y las configuraciones globales pueden anular los valores predeterminados de la organización remota. - -:::note -Los directorios `.codev` y `~/.config/codev` usan **nombres en plural** para los subdirectorios: `agents/`, `commands/`, `modes/`, `plugins/`, `skills/`, `tools/` y `themes/`. También se admiten nombres singulares (por ejemplo, `agent/`) para compatibilidad con versiones anteriores. -::: - ---- - -### Remoto - -Las organizaciones pueden proporcionar una configuración predeterminada a través del punto final `.well-known/opencode`. Esto se obtiene automáticamente cuando se autentica con un proveedor que lo admita. - -La configuración remota se carga primero y sirve como capa base. Todas las demás fuentes de configuración (global, proyecto) pueden anular estos valores predeterminados. - -Por ejemplo, si su organización proporciona servidores MCP que están deshabilitados de forma predeterminada: - -```json title="Remote config from .well-known/opencode" -{ - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": false - } - } -} -``` - -Puede habilitar servidores específicos en su configuración local: - -```json title="codev.json" -{ - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": true - } - } -} -``` - ---- - -### Global - -Coloque su configuración global CoDev Code en `~/.config/codev/codev.json`. Utilice la configuración global para las preferencias de todo el usuario, como temas, proveedores o combinaciones de teclas. - -La configuración global anula los valores predeterminados de la organización remota. - ---- - -### Por proyecto - -Agregue `codev.json` en la raíz de su proyecto. La configuración del proyecto tiene la mayor prioridad entre los archivos de configuración estándar: anula las configuraciones globales y remotas. - -:::tip -Coloque la configuración específica del proyecto en la raíz de su proyecto. -::: - -Cuando se inicia CoDev Code, busca un archivo de configuración en el directorio actual o recorre hasta el directorio Git más cercano. - -Esto también es seguro para registrarlo en Git y utiliza el mismo esquema que el global. - ---- - -### Ruta personalizada - -Especifique una ruta de archivo de configuración personalizada utilizando la variable de entorno `CODEV_CONFIG`. - -```bash -export CODEV_CONFIG=/path/to/my/custom-config.json -codev run "Hello world" -``` - -La configuración personalizada se carga entre las configuraciones globales y del proyecto en orden de prioridad. - ---- - -### Directorio personalizado - -Especifique un directorio de configuración personalizado usando `CODEV_CONFIG_DIR` -variable de entorno. En este directorio se buscarán agentes, comandos, -modos y complementos como el directorio estándar `.codev`, y debería -Sigue la misma estructura. - -```bash -export CODEV_CONFIG_DIR=/path/to/my/config-directory -codev run "Hello world" -``` - -El directorio personalizado se carga después de los directorios global config y `.codev`, por lo que **puede anular** su configuración. - ---- - -## Esquema - -El archivo de configuración tiene un esquema definido en [**`opencode.ai/config.json`**](https://opencode.ai/config.json). - -Su editor debería poder validar y autocompletar según el esquema. - ---- - -### TUI - -Puede configurar ajustes específicos de TUI a través de la opción `tui`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "tui": { - "scroll_speed": 3, - "scroll_acceleration": { - "enabled": true - }, - "diff_style": "auto" - } -} -``` - -Opciones disponibles: - -- `scroll_acceleration.enabled` - Habilita la aceleración de desplazamiento estilo macOS. **Tiene prioridad sobre `scroll_speed`.** -- `scroll_speed` - Multiplicador de velocidad de desplazamiento personalizado (predeterminado: `3`, mínimo: `1`). Se ignora si `scroll_acceleration.enabled` es `true`. -- `diff_style` - Controla la representación de diferencias. `"auto"` se adapta al ancho del terminal, `"stacked"` siempre muestra una sola columna. - -[Obtenga más información sobre el uso de TUI aquí](/docs/tui). - ---- - -### Servidor - -Puede configurar los ajustes del servidor para los comandos `codev serve` y `codev web` a través de la opción `server`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "server": { - "port": 4096, - "hostname": "0.0.0.0", - "mdns": true, - "mdnsDomain": "myproject.local", - "cors": ["http://localhost:5173"] - } -} -``` - -Opciones disponibles: - -- `port` - Puerto para escuchar. -- `hostname`: nombre de host para escuchar. Cuando `mdns` está habilitado y no se establece ningún nombre de host, el valor predeterminado es `0.0.0.0`. -- `mdns`: habilita el descubrimiento de servicios mDNS. Esto permite que otros dispositivos en la red descubran su servidor CoDev Code. -- `mdnsDomain` - Nombre de dominio personalizado para el servicio mDNS. El valor predeterminado es `opencode.local`. Útil para ejecutar múltiples instancias en la misma red. -- `cors`: orígenes adicionales para permitir CORS cuando se utiliza el servidor HTTP desde un cliente basado en navegador. Los valores deben ser orígenes completos (esquema + host + puerto opcional), por ejemplo, `https://app.example.com`. - -[Obtenga más información sobre el servidor aquí](/docs/server). - ---- - -### Herramientas - -Puede administrar las herramientas que un LLM puede usar a través de la opción `tools`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "tools": { - "write": false, - "bash": false - } -} -``` - -[Obtenga más información sobre las herramientas aquí](/docs/tools). - ---- - -### Modelos - -Puede configurar los proveedores y modelos que desea utilizar en su configuración CoDev Code a través de las opciones `provider`, `model` y `small_model`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": {}, - "model": "anthropic/claude-sonnet-4-5", - "small_model": "anthropic/claude-haiku-4-5" -} -``` - -La opción `small_model` configura un modelo separado para tareas livianas como la generación de títulos. De forma predeterminada, CoDev Code intenta utilizar un modelo más económico si su proveedor tiene uno disponible; de ​​lo contrario, recurre a su modelo principal. - -Las opciones de proveedores pueden incluir `timeout` y `setCacheKey`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "options": { - "timeout": 600000, - "setCacheKey": true - } - } - } -} -``` - -- `timeout`: tiempo de espera de solicitud en milisegundos (predeterminado: 300000). Establezca en `false` para desactivar. -- `setCacheKey`: asegúrese de que siempre haya una clave de caché configurada para el proveedor designado. - -También puede configurar [modelos locales](/docs/models#local). [Más información](/docs/models). - ---- - -#### Opciones específicas del proveedor - -Algunos proveedores admiten opciones de configuración adicionales más allá de las configuraciones genéricas `timeout` y `apiKey`. - -##### Amazon Bedrock - -Amazon Bedrock admite la configuración específica de AWS: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "my-aws-profile", - "endpoint": "https://bedrock-runtime.us-east-1.vpce-xxxxx.amazonaws.com" - } - } - } -} -``` - -- `region` - AWS región para Bedrock (el valor predeterminado es `AWS_REGION` env var o `us-east-1`) -- `profile` - AWS perfil con nombre de `~/.aws/credentials` (el valor predeterminado es `AWS_PROFILE` var env) -- `endpoint`: URL de punto de enlace personalizada para puntos de enlace de VPC. Este es un alias para la opción genérica `baseURL` que utiliza terminología específica de AWS. Si se especifican ambos, `endpoint` tiene prioridad. - -:::note -Los tokens de portador (`AWS_BEARER_TOKEN_BEDROCK` o `/connect`) tienen prioridad sobre la autenticación basada en perfil. Consulte [precedencia de autenticación](/docs/providers#authentication-precedence) para obtener más detalles. -::: - -[Obtenga más información sobre la configuración de Amazon Bedrock](/docs/providers#amazon-bedrock). - ---- - -### Temas - -Puede configurar el tema que desea usar en su configuración CoDev Code a través de la opción `theme`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "theme": "" -} -``` - -[Más información aquí](/docs/themes). - ---- - -### Agentes - -Puedes configurar agentes especializados para tareas específicas a través de la opción `agent`. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "agent": { - "code-reviewer": { - "description": "Reviews code for best practices and potential issues", - "model": "anthropic/claude-sonnet-4-5", - "prompt": "You are a code reviewer. Focus on security, performance, and maintainability.", - "tools": { - // Disable file modification tools for review-only agent - "write": false, - "edit": false, - }, - }, - }, -} -``` - -También puede definir agentes utilizando archivos de Markdown en `~/.config/codev/agents/` o `.codev/agents/`. [Más información aquí](/docs/agents). - ---- - -### Agente predeterminado - -Puede configurar el agente predeterminado usando la opción `default_agent`. Esto determina qué agente se utiliza cuando no se especifica ninguno explícitamente. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "default_agent": "plan" -} -``` - -El agente predeterminado debe ser un agente principal (no un subagente). Puede ser un agente integrado como `"build"` o `"plan"`, o un [agente personalizado](/docs/agents) que haya definido. Si el agente especificado no existe o es un subagente, CoDev Code recurrirá a `"build"` con una advertencia. - -Esta configuración se aplica en todas las interfaces: TUI, CLI (`codev run`), aplicación de escritorio y GitHub Acción. - ---- - -### Compartir - -Puede configurar la función [compartir](/docs/share) a través de la opción `share`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "manual" -} -``` - -Esto requiere: - -- `"manual"` - Permitir compartir manualmente mediante comandos (predeterminado) -- `"auto"` - Comparte automáticamente nuevas conversaciones -- `"disabled"` - Deshabilitar el uso compartido por completo - -De forma predeterminada, el uso compartido está configurado en modo manual, donde debe compartir conversaciones explícitamente usando el comando `/share`. - ---- - -### Comandos - -Puede configurar comandos personalizados para tareas repetitivas a través de la opción `command`. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "command": { - "test": { - "template": "Run the full test suite with coverage report and show any failures.\nFocus on the failing tests and suggest fixes.", - "description": "Run tests with coverage", - "agent": "build", - "model": "anthropic/claude-haiku-4-5", - }, - "component": { - "template": "Create a new React component named $ARGUMENTS with TypeScript support.\nInclude proper typing and basic structure.", - "description": "Create a new component", - }, - }, -} -``` - -También puede definir comandos utilizando archivos de Markdown en `~/.config/codev/commands/` o `.codev/commands/`. [Más información aquí](/docs/commands). - ---- - -### Atajos de teclado - -Puede personalizar sus combinaciones de teclas a través de la opción `keybinds`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "keybinds": {} -} -``` - -[Más información aquí](/docs/keybinds). - ---- - -### Actualización automática - -CoDev Code descargará automáticamente cualquier actualización nueva cuando se inicie. Puede desactivar esto con la opción `autoupdate`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "autoupdate": false -} -``` - -Si no desea actualizaciones pero desea recibir una notificación cuando haya una nueva versión disponible, configure `autoupdate` en `"notify"`. -Tenga en cuenta que esto sólo funciona si no se instaló mediante un administrador de paquetes como Homebrew. - ---- - -### Formateadores - -Puede configurar formateadores de código a través de la opción `formatter`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "disabled": true - }, - "custom-prettier": { - "command": ["npx", "prettier", "--write", "$FILE"], - "environment": { - "NODE_ENV": "development" - }, - "extensions": [".js", ".ts", ".jsx", ".tsx"] - } - } -} -``` - -[Obtenga más información sobre los formateadores aquí](/docs/formatters). - ---- - -### Permisos - -De forma predeterminada, CoDev Code **permite todas las operaciones** sin requerir aprobación explícita. Puede cambiar esto usando la opción `permission`. - -Por ejemplo, para garantizar que las herramientas `edit` y `bash` requieran la aprobación del usuario: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "ask", - "bash": "ask" - } -} -``` - -[Obtenga más información sobre los permisos aquí](/docs/permissions). - ---- - -### Compactación - -Puede controlar el comportamiento de compactación del contexto a través de la opción `compaction`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "compaction": { - "auto": true, - "prune": false - } -} -``` - -- `auto`: compacta automáticamente la sesión cuando el contexto está lleno (predeterminado: `true`). -- `prune`: elimina las salidas de herramientas antiguas para guardar tokens (predeterminado: `false`). - ---- - -### Observador - -Puede configurar patrones de ignorancia del observador de archivos a través de la opción `watcher`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "watcher": { - "ignore": ["node_modules/**", "dist/**", ".git/**"] - } -} -``` - -Los patrones siguen la sintaxis global. Utilice esto para excluir directorios ruidosos de la visualización de archivos. - ---- - -### Servidores MCP - -Puede configurar los servidores MCP que desee utilizar a través de la opción `mcp`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": {} -} -``` - -[Más información aquí](/docs/mcp-servers). - ---- - -### Complementos - -Los [complementos](/docs/plugins) amplían CoDev Code con herramientas, enlaces e integraciones personalizados. - -Coloque los archivos de complemento en `.codev/plugins/` o `~/.config/codev/plugins/`. También puedes cargar complementos desde npm a través de la opción `plugin`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-helicone-session", "@my-org/custom-plugin"] -} -``` - -[Más información aquí](/docs/plugins). - ---- - -### Instrucciones - -Puedes configurar las instrucciones para el modelo que estás usando a través de la opción `instructions`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["CONTRIBUTING.md", "docs/guidelines.md", ".cursor/rules/*.md"] -} -``` - -Esto requiere una variedad de rutas y patrones globales para archivos de instrucciones. [Más información -sobre las reglas aquí](/docs/rules). - ---- - -### Proveedores deshabilitados - -Puede deshabilitar proveedores que se cargan automáticamente a través de la opción `disabled_providers`. Esto es útil cuando desea evitar que se carguen ciertos proveedores incluso si sus credenciales están disponibles. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "disabled_providers": ["openai", "gemini"] -} -``` - -:::note -El `disabled_providers` tiene prioridad sobre `enabled_providers`. -::: - -La opción `disabled_providers` acepta una variedad de ID de proveedores. Cuando un proveedor está deshabilitado: - -- No se cargará incluso si se establecen variables de entorno. -- No se cargará incluso si las teclas API están configuradas mediante el comando `/connect`. -- Los modelos del proveedor no aparecerán en la lista de selección de modelos. - ---- - -### Proveedores habilitados - -Puede especificar una lista de proveedores permitidos a través de la opción `enabled_providers`. Cuando se establece, solo se habilitarán los proveedores especificados y se ignorarán todos los demás. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "enabled_providers": ["anthropic", "openai"] -} -``` - -Esto es útil cuando desea restringir CoDev Code para que utilice únicamente proveedores específicos en lugar de deshabilitarlos uno por uno. - -:::note -El `disabled_providers` tiene prioridad sobre `enabled_providers`. -::: - -Si un proveedor aparece tanto en `enabled_providers` como en `disabled_providers`, el `disabled_providers` tiene prioridad para la compatibilidad con versiones anteriores. - ---- - -### Experimental - -La clave `experimental` contiene opciones que se encuentran en desarrollo activo. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": {} -} -``` - -:::caution -Las opciones experimentales no son estables. Pueden cambiar o eliminarse sin previo aviso. -::: - ---- - -## Variables - -Puede utilizar la sustitución de variables en sus archivos de configuración para hacer referencia a variables de entorno y contenidos de archivos. - ---- - -### Variables de entorno - -Utilice `{env:VARIABLE_NAME}` para sustituir variables de entorno: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "model": "{env:CODEV_MODEL}", - "provider": { - "anthropic": { - "models": {}, - "options": { - "apiKey": "{env:ANTHROPIC_API_KEY}" - } - } - } -} -``` - -Si la variable de entorno no está configurada, se reemplazará con una cadena vacía. - ---- - -### Archivos - -Utilice `{file:path/to/file}` para sustituir el contenido de un archivo: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["./custom-instructions.md"], - "provider": { - "openai": { - "options": { - "apiKey": "{file:~/.secrets/openai-key}" - } - } - } -} -``` - -Las rutas de los archivos pueden ser: - -- Relativo al directorio del archivo de configuración -- O rutas absolutas que comienzan con `/` o `~` - -Estos son útiles para: - -- Mantener datos confidenciales como claves API en archivos separados. -- Incluye archivos de instrucciones grandes sin saturar tu configuración. -- Compartir fragmentos de configuración comunes en múltiples archivos de configuración. diff --git a/packages/web/src/content/docs/es/custom-tools.mdx b/packages/web/src/content/docs/es/custom-tools.mdx deleted file mode 100644 index a9c0ccabe3..0000000000 --- a/packages/web/src/content/docs/es/custom-tools.mdx +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Herramientas personalizadas -description: Cree herramientas que LLM pueda llamar en CoDev Code. ---- - -Las herramientas personalizadas son funciones que usted crea y que el LLM puede llamar durante las conversaciones. Trabajan junto con las [herramientas integradas](/docs/tools) de CoDev Code como `read`, `write` y `bash`. - ---- - -## Crear una herramienta - -Las herramientas se definen como archivos **TypeScript** o **JavaScript**. Sin embargo, la definición de la herramienta puede invocar secuencias de comandos escritas en **cualquier idioma**: TypeScript o JavaScript solo se utilizan para la definición de la herramienta en sí. - ---- - -### Ubicación - -Se pueden definir: - -- Localmente colocándolos en el directorio `.codev/tools/` de tu proyecto. -- O de forma global, colocándolos en `~/.config/codev/tools/`. - ---- - -### Estructura - -La forma más sencilla de crear herramientas es utilizar el asistente `tool()` que proporciona seguridad de tipos y validación. - -```ts title=".codev/tools/database.ts" {1} -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Query the project database", - args: { - query: tool.schema.string().describe("SQL query to execute"), - }, - async execute(args) { - // Your database logic here - return `Executed query: ${args.query}` - }, -}) -``` - -El **nombre de archivo** se convierte en el **nombre de la herramienta**. Lo anterior crea una herramienta `database`. - ---- - -#### Múltiples herramientas por archivo - -También puede exportar varias herramientas desde un solo archivo. Cada exportación se convierte en **una herramienta independiente** con el nombre **`_`**: - -```ts title=".codev/tools/math.ts" -import { tool } from "@opencode-ai/plugin" - -export const add = tool({ - description: "Add two numbers", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args) { - return args.a + args.b - }, -}) - -export const multiply = tool({ - description: "Multiply two numbers", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args) { - return args.a * args.b - }, -}) -``` - -Esto crea dos herramientas: `math_add` y `math_multiply`. - ---- - -#### Colisiones de nombres con herramientas integradas - -Las herramientas personalizadas están codificadas por el nombre de la herramienta. Si una herramienta personalizada utiliza el mismo nombre que una herramienta integrada, la herramienta personalizada tiene prioridad. - -Por ejemplo, este archivo reemplaza la herramienta `bash` integrada: - -```ts title=".codev/tools/bash.ts" -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Restricted bash wrapper", - args: { - command: tool.schema.string(), - }, - async execute(args) { - return `blocked: ${args.command}` - }, -}) -``` - -:::note -Prefiera nombres únicos a menos que intencionalmente desee reemplazar una herramienta integrada. Si desea deshabilitar una herramienta integrada pero no anularla, use [permisos](/docs/permissions). -::: - ---- - -### Argumentos - -Puedes usar `tool.schema`, que es simplemente [Zod](https://zod.dev), para definir tipos de argumentos. - -```ts "tool.schema" -args: { - query: tool.schema.string().describe("SQL query to execute") -} -``` - -También puedes importar [Zod](https://zod.dev) directamente y devolver un objeto simple: - -```ts {6} -import { z } from "zod" - -export default { - description: "Tool description", - args: { - param: z.string().describe("Parameter description"), - }, - async execute(args, context) { - // Tool implementation - return "result" - }, -} -``` - ---- - -### Contexto - -Las herramientas reciben contexto sobre la sesión actual: - -```ts title=".codev/tools/project.ts" {8} -import { tool } from "@opencode-ai/plugin" - -export default tool({ - description: "Get project information", - args: {}, - async execute(args, context) { - // Access context information - const { agent, sessionID, messageID, directory, worktree } = context - return `Agent: ${agent}, Session: ${sessionID}, Message: ${messageID}, Directory: ${directory}, Worktree: ${worktree}` - }, -}) -``` - -Utilice `context.directory` para el directorio de trabajo de la sesión. -Utilice `context.worktree` para la raíz del árbol de trabajo de git. - ---- - -## Ejemplos - -### Escribir una herramienta en Python - -Puede escribir sus herramientas en cualquier idioma que desee. Aquí hay un ejemplo que suma dos números usando Python. - -Primero, cree la herramienta como un script de Python: - -```python title=".codev/tools/add.py" -import sys - -a = int(sys.argv[1]) -b = int(sys.argv[2]) -print(a + b) -``` - -Luego cree la definición de herramienta que la invoca: - -```ts title=".codev/tools/python-add.ts" {10} -import { tool } from "@opencode-ai/plugin" -import path from "path" - -export default tool({ - description: "Add two numbers using Python", - args: { - a: tool.schema.number().describe("First number"), - b: tool.schema.number().describe("Second number"), - }, - async execute(args, context) { - const script = path.join(context.worktree, ".codev/tools/add.py") - const result = await Bun.$`python3 ${script} ${args.a} ${args.b}`.text() - return result.trim() - }, -}) -``` - -Aquí estamos usando la utilidad [`Bun.$`](https://bun.com/docs/runtime/shell) para ejecutar el script Python. diff --git a/packages/web/src/content/docs/es/ecosystem.mdx b/packages/web/src/content/docs/es/ecosystem.mdx deleted file mode 100644 index f0a4763d65..0000000000 --- a/packages/web/src/content/docs/es/ecosystem.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: Ecosistema -description: Proyectos e integraciones construidas con CoDev Code. ---- - -Una colección de proyectos comunitarios construidos en CoDev Code. - -:::note -¿Quieres agregar tu proyecto relacionado con CoDev Code a esta lista? Envíe un PR. -::: - -También puedes consultar [awesome-opencode](https://github.com/awesome-opencode/awesome-opencode) y [opencode.cafe](https://opencode.cafe), una comunidad que agrega el ecosistema y la comunidad. - ---- - -## Complementos - -| Nombre | Descripción | -| -------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| [opencode-daytona](https://github.com/daytonaio/daytona/tree/main/libs/opencode-plugin) | Ejecute automáticamente sesiones CoDev Code en entornos sandbox aislados de Daytona con git sync y vistas previas en vivo | -| [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) | Inyecte automáticamente encabezados de sesión de Helicone para agrupación de solicitudes | -| [opencode-type-inject](https://github.com/nick-vi/opencode-type-inject) | Inyecte automáticamente tipos TypeScript/Svelte en lecturas de archivos con herramientas de búsqueda | -| [opencode-openai-codex-auth](https://github.com/numman-ali/opencode-openai-codex-auth) | Utilice su suscripción ChatGPT Plus/Pro en lugar de créditos API | -| [opencode-gemini-auth](https://github.com/jenslys/opencode-gemini-auth) | Utilice su plan Gemini existente en lugar de la facturación API | -| [opencode-antigravity-auth](https://github.com/NoeFabris/opencode-antigravity-auth) | Utilice los modelos gratuitos de Antigravity en lugar de la facturación API | -| [opencode-devcontainers](https://github.com/athal7/opencode-devcontainers) | Aislamiento de contenedores de desarrollo de múltiples ramas con clones superficiales y puertos asignados automáticamente | -| [opencode-google-antigravity-auth](https://github.com/shekohex/opencode-google-antigravity-auth) | Complemento Google Antigravity OAuth, compatible con la Búsqueda de Google y manejo más sólido de API | -| [opencode-dynamic-context-pruning](https://github.com/Tarquinen/opencode-dynamic-context-pruning) | Optimice el uso de tokens eliminando los resultados de herramientas obsoletas | -| [opencode-vibeguard](https://github.com/inkdust2021/opencode-vibeguard) | Redacta secretos/PII en marcadores de posición estilo VibeGuard antes de las llamadas a LLM; restaura localmente | -| [opencode-websearch-cited](https://github.com/ghoulr/opencode-websearch-cited.git) | Agregue soporte de búsqueda web nativa para proveedores compatibles con el estilo basado en Google | -| [opencode-pty](https://github.com/shekohex/opencode-pty.git) | Permite a los agentes de IA ejecutar procesos en segundo plano en un PTY y enviarles información interactiva. | -| [opencode-shell-strategy](https://github.com/JRedeker/opencode-shell-strategy) | Instrucciones para comandos de shell no interactivos: evita bloqueos de operaciones dependientes de TTY | -| [opencode-wakatime](https://github.com/angristan/opencode-wakatime) | Seguimiento del uso de CoDev Code con Wakatime | -| [opencode-md-table-formatter](https://github.com/franlol/opencode-md-table-formatter/tree/main) | Limpiar tablas de Markdown producidas por LLMs | -| [opencode-morph-plugin](https://github.com/morphllm/opencode-morph-plugin) | Edición Fast Apply, búsqueda de código con WarpGrep y compactación de contexto a través de Morph | -| [oh-my-opencode](https://github.com/code-yeongyu/oh-my-opencode) | Agentes en segundo plano, herramientas LSP/AST/MCP prediseñadas, agentes seleccionados, compatible con Claude Code | -| [opencode-notificator](https://github.com/panta82/opencode-notificator) | Notificaciones de escritorio y alertas sonoras para sesiones CoDev Code | -| [opencode-notifier](https://github.com/mohak34/opencode-notifier) | Notificaciones de escritorio y alertas sonoras para eventos de permiso, finalización y error | -| [opencode-zellij-namer](https://github.com/24601/opencode-zellij-namer) | Nomenclatura automática de sesiones Zellij impulsada por IA basada en el contexto CoDev Code | -| [opencode-skillful](https://github.com/zenobi-us/opencode-skillful) | Permitir que los agentes CoDev Code carguen mensajes de forma diferida a pedido con descubrimiento e inyección de habilidades | -| [opencode-supermemory](https://github.com/supermemoryai/opencode-supermemory) | Memoria persistente entre sesiones utilizando Supermemory | -| [@plannotator/opencode](https://github.com/backnotprop/plannotator/tree/main/apps/opencode-plugin) | Revisión interactiva del plan con anotaciones visuales y uso compartido privado/sin conexión | -| [@openspoon/subtask2](https://github.com/spoons-and-mirrors/subtask2) | Amplíe CoDev Code /commands a un potente sistema de orquestación con control de flujo granular | -| [opencode-scheduler](https://github.com/different-ai/opencode-scheduler) | Programe trabajos recurrentes usando launchd (Mac) o systemd (Linux) con sintaxis cron | -| [micode](https://github.com/vtemian/micode) | Lluvia de ideas estructurada → Planificar → Implementar flujo de trabajo con continuidad de sesión | -| [octto](https://github.com/vtemian/octto) | Interfaz de usuario interactiva del navegador para lluvia de ideas de IA con formularios de preguntas múltiples | -| [opencode-background-agents](https://github.com/kdcokenny/opencode-background-agents) | Agentes en segundo plano estilo Claude Code con delegación asíncrona y persistencia de contexto | -| [opencode-notify](https://github.com/kdcokenny/opencode-notify) | Notificaciones nativas del sistema operativo para CoDev Code: sepa cuándo se completan las tareas | -| [opencode-workspace](https://github.com/kdcokenny/opencode-workspace) | Arnés de orquestación multiagente incluido: 16 componentes, una instalación | -| [opencode-worktree](https://github.com/kdcokenny/opencode-worktree) | Árboles de trabajo de Git de fricción cero para CoDev Code | -| [opencode-sentry-monitor](https://github.com/stolinski/opencode-sentry-monitor) | Rastree y depure sus agentes de IA con Sentry AI Monitoring | - ---- - -## Proyectos - -| Nombre | Descripción | -| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------ | -| [kimaki](https://github.com/remorses/kimaki) | Bot de Discord para controlar sesiones CoDev Code, basado en el SDK | -| [opencode.nvim](https://github.com/NickvanDyke/opencode.nvim) | Complemento Neovim para avisos compatibles con el editor, creado en API | -| [portal](https://github.com/hosenur/portal) | Interfaz de usuario web móvil para CoDev Code a través de Tailscale/VPN | -| [opencode plugin template](https://github.com/zenobi-us/opencode-plugin-template/) | Plantilla para crear complementos CoDev Code | -| [opencode.nvim](https://github.com/sudo-tee/opencode.nvim) | Interfaz de Neovim para CoDev Code: un agente de codificación de IA basado en terminal | -| [ai-sdk-provider-opencode-sdk](https://github.com/ben-vargas/ai-sdk-provider-opencode-sdk) | Proveedor Vercel AI SDK para usar CoDev Code a través de @opencode-ai/sdk | -| [OpenChamber](https://github.com/btriapitsyn/openchamber) | Aplicación web/de escritorio y extensión VS Code para CoDev Code | -| [OpenCode-Obsidian](https://github.com/mtymek/opencode-obsidian) | Complemento de Obsidian que incorpora CoDev Code en la interfaz de usuario de Obsidian | -| [OpenWork](https://github.com/different-ai/openwork) | Una alternativa de código abierto a Claude Cowork, impulsada por CoDev Code | -| [ocx](https://github.com/kdcokenny/ocx) | Administrador de extensiones CoDev Code con perfiles portátiles y aislados. | -| [CodeNomad](https://github.com/NeuralNomadsAI/CodeNomad) | Aplicación de escritorio, web, móvil y de cliente remoto para CoDev Code | - ---- - -## Agentes - -| Nombre | Descripción | -| ----------------------------------------------------------------- | -------------------------------------------------------------------------------- | -| [Agentic](https://github.com/Cluster444/agentic) | Agentes y comandos modulares de IA para un desarrollo estructurado | -| [opencode-agents](https://github.com/darrenhinde/opencode-agents) | Configuraciones, avisos, agentes y complementos para flujos de trabajo mejorados | diff --git a/packages/web/src/content/docs/es/enterprise.mdx b/packages/web/src/content/docs/es/enterprise.mdx deleted file mode 100644 index 1fee1a8ff5..0000000000 --- a/packages/web/src/content/docs/es/enterprise.mdx +++ /dev/null @@ -1,170 +0,0 @@ ---- -title: Empresa -description: Usar CoDev Code de forma segura en su organización. ---- - -import config from "../../../../config.mjs" -export const email = `mailto:${config.email}` - -CoDev Code Enterprise es para organizaciones que desean garantizar que su código y sus datos nunca abandonen su infraestructura. Puede hacerlo mediante el uso de una configuración centralizada que se integra con su SSO y su puerta de enlace AI interna. - -:::note -CoDev Code no almacena ningún código ni datos de contexto. -::: - -Para comenzar con CoDev Code Enterprise: - -1. Haz una prueba interna con tu equipo. -2. **Contáctenos** para analizar los precios y las opciones de implementación. - ---- - -## Prueba - -CoDev Code es de código abierto y no almacena ningún código ni datos de contexto, por lo que sus desarrolladores pueden simplemente [comenzar](/docs/) y realizar una prueba. - ---- - -### Manejo de datos - -**CoDev Code no almacena su código ni datos de contexto.** Todo el procesamiento se realiza localmente o mediante llamadas directas API a su proveedor de IA. - -Esto significa que, siempre que uses un proveedor de confianza o un -AI gateway interno, puedes usar CoDev Code de forma segura. - -La única advertencia aquí es la característica opcional `/share`. - ---- - -#### Compartir conversaciones - -Si un usuario habilita la función `/share`, la conversación y los datos asociados con ella se envían al servicio que utilizamos para alojar estas páginas compartidas en opencode.ai. - -Actualmente, los datos se entregan a través de la red perimetral de nuestra CDN y se almacenan en caché en el perímetro cerca de sus usuarios. - -Le recomendamos que desactive esto para su prueba. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "disabled" -} -``` - -[Más información sobre cómo compartir](/docs/share). - ---- - -### Propiedad del código - -**Eres propietario de todo el código producido por CoDev Code.** No existen restricciones de licencia ni reclamaciones de propiedad. - ---- - -## Precios - -Usamos un modelo por puesto para CoDev Code Enterprise. Si tiene su propia puerta de enlace LLM, no cobramos por los tokens utilizados. Para obtener más detalles sobre precios y opciones de implementación, **contáctenos**. - ---- - -## Implementación - -Una vez que haya completado su prueba y esté listo para usar CoDev Code en -su organización, puede **contáctenos** para discutir -opciones de fijación de precios y de implementación. - ---- - -### Configuración central - -Podemos configurar CoDev Code para usar una única configuración central para toda su organización. - -Esta configuración centralizada puede integrarse con su proveedor de SSO y garantiza que todos los usuarios accedan únicamente a su puerta de enlace de IA interna. - ---- - -### Integración SSO - -A través de la configuración central, CoDev Code puede integrarse con el proveedor de SSO de su organización para la autenticación. - -Esto permite a CoDev Code obtener credenciales para su puerta de enlace interna de IA a través de su sistema de gestión de identidad existente. - ---- - -### Puerta de enlace interna de IA - -Con la configuración central, CoDev Code también se puede configurar para usar solo su puerta de enlace AI interna. - -También puede desactivar todos los demás proveedores de IA, asegurándose de que todas las solicitudes pasen por la infraestructura aprobada de su organización. - ---- - -### Autohospedaje - -Si bien recomendamos desactivar las páginas para compartir para garantizar que sus datos nunca abandonen -su organización, también podemos ayudarle a autohospedarlos en su infraestructura. - -Esto se encuentra actualmente en nuestra hoja de ruta. Si está interesado, **háganoslo saber**. - ---- - -## Preguntas frecuentes - -
-¿Qué es CoDev Code Enterprise? - -CoDev Code Enterprise es para organizaciones que desean garantizar que su código y sus datos nunca abandonen su infraestructura. Puede hacerlo mediante el uso de una configuración centralizada que se integra con su SSO y su puerta de enlace AI interna. - -
- -
-¿Cómo empiezo con CoDev Code Enterprise? - -Simplemente comience con una prueba interna con su equipo. CoDev Code de forma predeterminada no almacena su código ni datos de contexto, lo que facilita el inicio. - -Luego **contáctenos** para analizar los precios y las opciones de implementación. - -
- -
-¿Cómo funcionan los precios empresariales? - -Ofrecemos precios empresariales por asiento. Si tiene su propia puerta de enlace LLM, no cobramos por los tokens utilizados. Para obtener más detalles, **contáctenos** para obtener una cotización personalizada basada en las necesidades de su organización. - -
- -
-¿Están mis datos seguros con CoDev Code Enterprise? - -Sí. CoDev Code no almacena su código ni datos de contexto. Todo el procesamiento se realiza localmente o mediante llamadas directas API a su proveedor de IA. Con la configuración central y la integración de SSO, sus datos permanecen seguros dentro de la infraestructura de su organización. - -
- -
-¿Podemos utilizar nuestro propio registro privado de NPM? - -CoDev Code admite registros privados npm a través del soporte de archivos `.npmrc` nativo de Bun. Si su organización utiliza un registro privado, como JFrog Artifactory, Nexus o similar, asegúrese de que los desarrolladores estén autenticados antes de ejecutar CoDev Code. - -Para configurar la autenticación con su registro privado: - -```bash -npm login --registry=https://your-company.jfrog.io/api/npm/npm-virtual/ -``` - -Esto crea `~/.npmrc` con detalles de autenticación. CoDev Code automáticamente -recoge esto. - -:::caution -Debe iniciar sesión en el registro privado antes de ejecutar CoDev Code. -::: - -Alternativamente, puede configurar manualmente un archivo `.npmrc`: - -```bash title="~/.npmrc" -registry=https://your-company.jfrog.io/api/npm/npm-virtual/ -//your-company.jfrog.io/api/npm/npm-virtual/:_authToken=${NPM_AUTH_TOKEN} -``` - -Los desarrolladores deben iniciar sesión en el registro privado antes de ejecutar CoDev Code para garantizar que los paquetes se puedan instalar desde su registro empresarial. - -
diff --git a/packages/web/src/content/docs/es/formatters.mdx b/packages/web/src/content/docs/es/formatters.mdx deleted file mode 100644 index 4380823eeb..0000000000 --- a/packages/web/src/content/docs/es/formatters.mdx +++ /dev/null @@ -1,131 +0,0 @@ ---- -title: Formateadores -description: CoDev Code utiliza formateadores específicos del idioma. ---- - -CoDev Code formatea automáticamente los archivos después de escribirlos o editarlos utilizando formateadores específicos del idioma. Esto garantiza que el código generado siga los estilos de código de su proyecto. - ---- - -## Integrados - -CoDev Code viene con varios formateadores integrados para lenguajes y marcos populares. A continuación se muestra una lista de los formateadores, las extensiones de archivo compatibles y los comandos u opciones de configuración que necesita. - -| Formateador | Extensiones | Requisitos | -| -------------------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | -| gofmt | .go | Comando `gofmt` disponible | -| mix | .ex, .exs, .eex, .heex, .leex, .neex, .sface | Comando `mix` disponible | -| prettier | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml y [más](https://prettier.io/docs/en/index.html) | dependencia `prettier` en `package.json` | -| biome | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml y [más](https://biomejs.dev/) | `biome.json(c)` archivo de configuración | -| zig | .zig, .zon | Comando `zig` disponible | -| clang-format | .c, .cpp, .h, .hpp, .ino y [más](https://clang.llvm.org/docs/ClangFormat.html) | `.clang-format` archivo de configuración | -| ktlint | .kt, .kts | Comando `ktlint` disponible | -| ruff | .py, .pyi | Comando `ruff` disponible con configuración | -| rustfmt | .rs | Comando `rustfmt` disponible | -| cargo fmt | .rs | Comando `cargo fmt` disponible | -| uv | .py, .pyi | Comando `uv` disponible | -| rubocop | .rb, .rake, .gemspec, .ru | Comando `rubocop` disponible | -| standardrb | .rb, .rake, .gemspec, .ru | Comando `standardrb` disponible | -| htmlbeautifier | .erb, .html.erb | Comando `htmlbeautifier` disponible | -| air | .R | Comando `air` disponible | -| dart | .dart | Comando `dart` disponible | -| dfmt | .d | Comando `dfmt` disponible | -| ocamlformat | .ml, .mli | Comando `ocamlformat` disponible y archivo de configuración `.ocamlformat` | -| terraform | .tf, .tfvars | Comando `terraform` disponible | -| gleam | .gleam | Comando `gleam` disponible | -| nixfmt | .nix | Comando `nixfmt` disponible | -| shfmt | .sh, .bash | Comando `shfmt` disponible | -| pint | .php | dependencia `laravel/pint` en `composer.json` | -| oxfmt (Experimental) | .js, .jsx, .ts, .tsx | Dependencia de `oxfmt` en `package.json` y un [indicador de variable de entorno experimental](/docs/cli/#experimental) | -| ormolu | .hs | Comando `ormolu` disponible | - -Entonces, si su proyecto tiene `prettier` en su `package.json`, CoDev Code lo usará automáticamente. - ---- - -## Cómo funciona - -Cuando CoDev Code escribe o edita un archivo: - -1. Comprueba la extensión del archivo con todos los formateadores habilitados. -2. Ejecuta el comando de formateo apropiado en el archivo. -3. Aplica los cambios de formato automáticamente. - -Este proceso ocurre en segundo plano, lo que garantiza que los estilos de su código se mantengan sin ningún paso manual. - ---- - -## Configuración - -Puede personalizar los formateadores a través de la sección `formatter` en su configuración CoDev Code. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": {} -} -``` - -Cada configuración del formateador admite lo siguiente: - -| Propiedad | Tipo | Descripción | -| ------------- | -------- | --------------------------------------------------------------- | -| `disabled` | booleano | Establezca esto en `true` para deshabilitar el formateador | -| `command` | cadena[] | El comando a ejecutar para formatear | -| `environment` | objeto | Variables de entorno para configurar al ejecutar el formateador | -| `extensions` | cadena[] | Extensiones de archivo que este formateador debería manejar | - -Veamos algunos ejemplos. - ---- - -### Deshabilitar formateadores - -Para deshabilitar **todos** los formateadores globalmente, configure `formatter` en `false`: - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": false -} -``` - -Para deshabilitar un formateador **específico**, establezca `disabled` en `true`: - -```json title="codev.json" {5} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "disabled": true - } - } -} -``` - ---- - -### Formateadores personalizados - -Puede anular los formateadores integrados o agregar otros nuevos especificando el comando, las variables de entorno y las extensiones de archivo: - -```json title="codev.json" {4-14} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "command": ["npx", "prettier", "--write", "$FILE"], - "environment": { - "NODE_ENV": "development" - }, - "extensions": [".js", ".ts", ".jsx", ".tsx"] - }, - "custom-markdown-formatter": { - "command": ["deno", "fmt", "$FILE"], - "extensions": [".md"] - } - } -} -``` - -El marcador de posición **`$FILE`** en el comando se reemplazará con la ruta al archivo que se está formateando. diff --git a/packages/web/src/content/docs/es/github.mdx b/packages/web/src/content/docs/es/github.mdx deleted file mode 100644 index 2bc8e497bb..0000000000 --- a/packages/web/src/content/docs/es/github.mdx +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: GitHub -description: Utilice CoDev Code en problemas y solicitudes de extracción de GitHub. ---- - -CoDev Code se integra con su flujo de trabajo GitHub. Mencione `/codev` en su comentario y CoDev Code ejecutará tareas dentro de su corredor de acciones GitHub. - ---- - -## Características - -- **Clasificación de problemas**: Pídele a CoDev Code que investigue un problema y te lo explique. -- **Reparar e implementar**: pídale a CoDev Code que solucione un problema o implemente una función. Y funcionará en una nueva sucursal y enviará un PR con todos los cambios. -- **Seguro**: CoDev Code se ejecuta dentro de los corredores de tu GitHub. - ---- - -## Instalación - -Ejecute el siguiente comando en un proyecto que se encuentra en un repositorio GitHub: - -```bash -codev github install -``` - -Esto lo guiará a través de la creación del archivo de flujo de trabajo y la configuración de secretos. - ---- - -### Configuración manual - -O puede configurarlo manualmente. - -1. **Agregar el flujo de trabajo** - - Agregue el siguiente archivo de flujo de trabajo a `.github/workflows/codev.yml` en su repositorio. Asegúrese de configurar las claves `model` apropiadas y API requeridas en `env`. - - ```yml title=".github/workflows/codev.yml" {25,30} - name: codev - - on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - - jobs: - codev: - if: contains(github.event.comment.body, '/codev') - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - fetch-depth: 1 - persist-credentials: false - - - name: Run CoDev Code - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - ``` - - La acción se autentica de forma predeterminada con el [`GITHUB_TOKEN` incorporado](https://docs.github.com/en/actions/tutorials/authenticate-with-github_token) del flujo de trabajo, por lo que no es necesario instalar ninguna aplicación GitHub. Las confirmaciones, los comentarios y las solicitudes de extracción aparecen como provenientes de `github-actions[bot]`. - -2. **Guarda las claves API en secretos** - - En la **configuración** de tu organización o proyecto, expande **Secretos y variables** a la izquierda y selecciona **Acciones**. Y agregue las claves API requeridas. - ---- - -## Configuración - -- `model`: El modelo a usar con CoDev Code. Toma el formato de `provider/model`. Esto es **obligatorio**. -- `agent`: El agente a utilizar. Debe ser un agente primario. Vuelve a `default_agent` desde la configuración o `"build"` si no se encuentra. -- `share`: si se comparte la sesión CoDev Code. El valor predeterminado es **falso**; compartir publica la sesión en el servicio de compartir del proyecto original (upstream). -- `prompt`: mensaje personalizado opcional para anular el comportamiento predeterminado. Utilice esto para personalizar cómo CoDev Code procesa las solicitudes. -- `mentions`: lista separada por comas de frases desencadenantes (sin distinguir mayúsculas de minúsculas). El valor predeterminado es `/codev`. -- `use_github_token`: si se autentica con el `GITHUB_TOKEN` del flujo de trabajo. El valor predeterminado es **verdadero**. Asegúrese de otorgar los permisos necesarios en su flujo de trabajo: - - ```yaml - permissions: - contents: write - pull-requests: write - issues: write - ``` - - Configúrelo en `false` solo si la aplicación [opencode-agent GitHub App](https://github.com/apps/opencode-agent) del proyecto original está instalada en el repositorio; la acción entonces intercambia un token OIDC por un token de aplicación (esto requiere el permiso `id-token: write`), y la actividad aparece como proveniente de la aplicación. - ---- - -## Eventos admitidos - -CoDev Code puede desencadenarse por los siguientes eventos GitHub: - -| Tipo de evento | Activado por | Detalles | -| ----------------------------- | --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -| `issue_comment` | Comentar sobre un tema o PR | Mencione `/codev` en su comentario. CoDev Code lee el contexto y puede crear ramas, abrir relaciones públicas o responder. | -| `pull_request_review_comment` | Comente líneas de código específicas en un PR | Mencione `/codev` mientras revisa el código. CoDev Code recibe la ruta del archivo, los números de línea y el contexto de diferencias. | -| `issues` | Número abierto o editado | Activa automáticamente CoDev Code cuando se crean o modifican problemas. Requiere entrada `prompt`. | -| `pull_request` | PR abierto o actualizado | Activa automáticamente CoDev Code cuando los PR se abren, sincronizan o vuelven a abrir. Útil para revisiones automatizadas. | -| `schedule` | Programación basada en cron | Ejecute CoDev Code según una programación. Requiere entrada `prompt`. La salida va a registros y relaciones públicas (no hay temas que comentar). | -| `workflow_dispatch` | Activador manual desde GitHub UI | Active CoDev Code a pedido a través de la pestaña Acciones. Requiere entrada `prompt`. La salida va a registros y relaciones públicas. | - -### Ejemplo de programación - -Ejecute CoDev Code según una programación para realizar tareas automatizadas: - -```yaml title=".github/workflows/codev-scheduled.yml" -name: Scheduled CoDev Code Task - -on: - schedule: - - cron: "0 9 * * 1" # Every Monday at 9am UTC - -jobs: - codev: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - persist-credentials: false - - - name: Run CoDev Code - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review the codebase for any TODO comments and create a summary. - If you find issues worth addressing, open an issue to track them. -``` - -Para eventos programados, la entrada `prompt` es **obligatoria** ya que no hay comentarios del que extraer instrucciones. Los flujos de trabajo programados se ejecutan sin un contexto de usuario para verificar los permisos, por lo que el flujo de trabajo debe otorgar `contents: write` y `pull-requests: write` si espera que CoDev Code cree ramas o PR. - ---- - -### Ejemplo de solicitud de extracción - -Revisar automáticamente los PR cuando se abren o actualizan: - -```yaml title=".github/workflows/codev-review.yml" -name: codev-review - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - review: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - issues: write - steps: - - uses: actions/checkout@v6 - with: - persist-credentials: false - - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review this pull request: - - Check for code quality issues - - Look for potential bugs - - Suggest improvements -``` - -Para los eventos `pull_request`, si no se proporciona `prompt`, CoDev Code revisa de forma predeterminada la solicitud de extracción. - ---- - -### Ejemplo de clasificación de problemas - -Clasifique automáticamente nuevos problemas. Este ejemplo filtra cuentas con más de 30 días para reducir el spam: - -```yaml title=".github/workflows/codev-triage.yml" -name: Issue Triage - -on: - issues: - types: [opened] - -jobs: - triage: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - steps: - - name: Check account age - id: check - uses: actions/github-script@v7 - with: - script: | - const user = await github.rest.users.getByUsername({ - username: context.payload.issue.user.login - }); - const created = new Date(user.data.created_at); - const days = (Date.now() - created) / (1000 * 60 * 60 * 24); - return days >= 30; - result-encoding: string - - - uses: actions/checkout@v6 - if: steps.check.outputs.result == 'true' - with: - persist-credentials: false - - - uses: quickbeard/codev-code/github@main - if: steps.check.outputs.result == 'true' - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review this issue. If there's a clear fix or relevant docs: - - Provide documentation links - - Add error handling guidance for code examples - Otherwise, do not comment. -``` - -Para eventos `issues`, la entrada `prompt` es **obligatoria** ya que no hay ningún comentario del que extraer instrucciones. - ---- - -## Indicaciones personalizadas - -Anule el mensaje predeterminado para personalizar el comportamiento de CoDev Code para su flujo de trabajo. - -```yaml title=".github/workflows/codev.yml" -- uses: quickbeard/codev-code/github@main - with: - model: anthropic/claude-sonnet-4-5 - prompt: | - Review this pull request: - - Check for code quality issues - - Look for potential bugs - - Suggest improvements -``` - -Esto es útil para hacer cumplir criterios de revisión específicos, estándares de codificación o áreas de enfoque relevantes para su proyecto. - ---- - -## Ejemplos - -A continuación se muestran algunos ejemplos de cómo puede utilizar CoDev Code en GitHub. - -- **Explica un problema** - - Agregue este comentario en una edición GitHub. - - ``` - /codev explain this issue - ``` - - CoDev Code leerá el hilo completo, incluidos todos los comentarios, y responderá con una explicación clara. - -- **Solucionar un problema** - - En un problema GitHub, diga: - - ``` - /codev fix this - ``` - - Y CoDev Code creará una nueva rama, implementará los cambios y abrirá un PR con los cambios. - -- **Revisar relaciones públicas y realizar cambios** - - Deja el siguiente comentario en un GitHub PR. - - ``` - Delete the attachment from S3 when the note is removed /codev - ``` - - CoDev Code implementará el cambio solicitado y lo comprometerá con el mismo PR. - -- **Revisar líneas de código específicas** - - Deje un comentario directamente en las líneas de código en la pestaña "Archivos" del PR. CoDev Code detecta automáticamente el archivo, los números de línea y el contexto de diferencias para proporcionar respuestas precisas. - - ``` - [Comment on specific lines in Files tab] - /codev add error handling here - ``` - - Al comentar líneas específicas, CoDev Code recibe: - - El archivo exacto que se está revisando. - - Las líneas de código específicas. - - El contexto diferencial circundante. - - Información del número de línea - - Esto permite solicitudes más específicas sin necesidad de especificar rutas de archivo o números de línea manualmente. diff --git a/packages/web/src/content/docs/es/gitlab.mdx b/packages/web/src/content/docs/es/gitlab.mdx deleted file mode 100644 index 8a3f5e4914..0000000000 --- a/packages/web/src/content/docs/es/gitlab.mdx +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: GitLab -description: Utilice CoDev Code en problemas GitLab y solicitudes de fusión. ---- - -CoDev Code se integra con su flujo de trabajo GitLab a través de su canal de CI/CD GitLab o con GitLab Duo. - -En ambos casos, CoDev Code se ejecutará en tus corredores GitLab. - ---- - -## GitLab CI - -CoDev Code funciona en una tubería GitLab normal. Puede integrarlo en una canalización como un [componente de CI](https://docs.gitlab.com/ee/ci/components/) - -Aquí estamos utilizando un componente CI/CD creado por la comunidad para CoDev Code — [nagyv/gitlab-opencode](https://gitlab.com/nagyv/gitlab-opencode). - ---- - -### Características - -- **Usar configuración personalizada por trabajo**: configure CoDev Code con un directorio de configuración personalizado, por ejemplo `./config/#custom-directory` para habilitar o deshabilitar la funcionalidad por invocación de CoDev Code. -- **Configuración mínima**: el componente CI configura CoDev Code en segundo plano, solo necesita crear la configuración CoDev Code y el mensaje inicial. -- **Flexible**: el componente CI admite varias entradas para personalizar su comportamiento - ---- - -### Configuración - -1. Guarde su CoDev Code autenticación JSON como variables de entorno de CI de tipo de archivo en **Configuración** > **CI/CD** > **Variables**. Asegúrate de marcarlos como "Enmascarados y ocultos". -2. Agregue lo siguiente a su archivo `.gitlab-ci.yml`. - - ```yaml title=".gitlab-ci.yml" - include: - - component: $CI_SERVER_FQDN/nagyv/gitlab-opencode/opencode@2 - inputs: - config_dir: ${CI_PROJECT_DIR}/opencode-config - auth_json: $CODEV_AUTH_JSON # The variable name for your CoDev Code authentication JSON - command: optional-custom-command - message: "Your prompt here" - ``` - -Para obtener más entradas y casos de uso, [consulte los documentos](https://gitlab.com/explore/catalog/nagyv/gitlab-opencode) de este componente. - ---- - -## GitLab Duo - -CoDev Code se integra con su flujo de trabajo GitLab. -Mencione `@opencode` en un comentario y CoDev Code ejecutará tareas dentro de su canal de CI GitLab. - ---- - -### Características - -- **Clasificación de problemas**: Pídele a CoDev Code que investigue un problema y te lo explique. -- **Reparar e implementar**: pídale a CoDev Code que solucione un problema o implemente una función. - Creará una nueva rama y generará una solicitud de fusión con los cambios. -- **Seguro**: CoDev Code se ejecuta en tus corredores GitLab. - ---- - -### Configuración - -CoDev Code se ejecuta en su canalización de CI/CD GitLab. Esto es lo que necesitará para configurarlo: - -:::tip -Consulte los [**GitLab documentos**](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/) para obtener instrucciones actualizadas. -::: - -1. Configure su entorno GitLab -2. Configurar CI/CD -3. Obtenga una clave API de proveedor de modelo de IA -4. Crea una cuenta de servicio -5. Configurar variables CI/CD -6. Cree un archivo de configuración de flujo, aquí hay un ejemplo: - -
- - Configuración de flujo - - ```yaml - image: node:22-slim - commands: - - echo "Installing CoDev Code" - - npm install --global codev-code - - echo "Installing glab" - - export GITLAB_TOKEN=$GITLAB_TOKEN_OPENCODE - - apt-get update --quiet && apt-get install --yes curl wget gpg git && rm --recursive --force /var/lib/apt/lists/* - - curl --silent --show-error --location "https://raw.githubusercontent.com/upciti/wakemeops/main/assets/install_repository" | bash - - apt-get install --yes glab - - echo "Configuring glab" - - echo $GITLAB_HOST - - echo "Creating CoDev Code auth configuration" - - mkdir --parents ~/.local/share/codev - - | - cat > ~/.local/share/codev/auth.json << EOF - { - "anthropic": { - "type": "api", - "key": "$ANTHROPIC_API_KEY" - } - } - EOF - - echo "Configuring git" - - git config --global user.email "opencode@gitlab.com" - - git config --global user.name "CoDev Code" - - echo "Testing glab" - - glab issue list - - echo "Running CoDev Code" - - | - codev run " - You are an AI assistant helping with GitLab operations. - - Context: $AI_FLOW_CONTEXT - Task: $AI_FLOW_INPUT - Event: $AI_FLOW_EVENT - - Please execute the requested task using the available GitLab tools. - Be thorough in your analysis and provide clear explanations. - - - Please use the glab CLI to access data from GitLab. The glab CLI has already been authenticated. You can run the corresponding commands. - - If you are asked to summarize an MR or issue or asked to provide more information then please post back a note to the MR/Issue so that the user can see it. - You don't need to commit or push up changes, those will be done automatically based on the file changes you make. - - " - - git checkout --branch $CI_WORKLOAD_REF origin/$CI_WORKLOAD_REF - - echo "Checking for git changes and pushing if any exist" - - | - if ! git diff --quiet || ! git diff --cached --quiet || [ --not --zero "$(git ls-files --others --exclude-standard)" ]; then - echo "Git changes detected, adding and pushing..." - git add . - if git diff --cached --quiet; then - echo "No staged changes to commit" - else - echo "Committing changes to branch: $CI_WORKLOAD_REF" - git commit --message "Codex changes" - echo "Pushing changes up to $CI_WORKLOAD_REF" - git push https://gitlab-ci-token:$GITLAB_TOKEN@$GITLAB_HOST/gl-demo-ultimate-dev-ai-epic-17570/test-java-project.git $CI_WORKLOAD_REF - echo "Changes successfully pushed" - fi - else - echo "No git changes detected, skipping push" - fi - variables: - - ANTHROPIC_API_KEY - - GITLAB_TOKEN_OPENCODE - - GITLAB_HOST - ``` - -
- -Puede consultar los [GitLab CLI documentos de los agentes](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/) para obtener instrucciones detalladas. - ---- - -### Ejemplos - -A continuación se muestran algunos ejemplos de cómo puede utilizar CoDev Code en GitLab. - -:::tip -Puede configurarlo para utilizar una frase de activación diferente a `@opencode`. -::: - -- **Explica un problema** - - Agregue este comentario en una edición GitLab. - - ``` - @opencode explain this issue - ``` - - CoDev Code leerá el problema y responderá con una explicación clara. - -- **Solucionar un problema** - - En un problema GitLab, diga: - - ``` - @opencode fix this - ``` - - CoDev Code creará una nueva rama, implementará los cambios y abrirá una solicitud de fusión con los cambios. - -- **Revisar solicitudes de fusión** - - Deje el siguiente comentario sobre una solicitud de fusión GitLab. - - ``` - @opencode review this merge request - ``` - - CoDev Code revisará la solicitud de fusión y brindará comentarios. diff --git a/packages/web/src/content/docs/es/go.mdx b/packages/web/src/content/docs/es/go.mdx deleted file mode 100644 index 776820bc7b..0000000000 --- a/packages/web/src/content/docs/es/go.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: Go -description: Suscripción de bajo costo para modelos abiertos de programación. ---- - -import config from "../../../../config.mjs" -export const console = config.console -export const email = `mailto:${config.email}` - -OpenCode Go es una suscripción de bajo costo — **$5 por tu primer mes**, luego **$10/mes** — que te brinda acceso confiable a modelos abiertos de programación populares. - -Go funciona como cualquier otro proveedor en CoDev Code. Te suscribes a OpenCode Go y -obtienes tu API key. Es **completamente opcional** y no necesitas usarlo para -usar CoDev Code. - -Está diseñado principalmente para usuarios internacionales, con modelos alojados en EE. UU., la UE y Singapur para un acceso global estable. - ---- - -## Antecedentes - -Los modelos abiertos se han vuelto realmente buenos. Ahora alcanzan un rendimiento cercano a -los modelos propietarios en tareas de programación. Y como muchos proveedores pueden servirlos -de manera competitiva, suelen ser mucho más económicos. - -Sin embargo, obtener un acceso confiable y de baja latencia a ellos puede ser difícil. Los proveedores -varían en calidad y disponibilidad. - -:::tip -Probamos un grupo selecto de modelos y proveedores que funcionan bien con CoDev Code. -::: - -Para solucionar esto, hicimos un par de cosas: - -1. Probamos un grupo selecto de modelos abiertos y hablamos con sus equipos sobre cómo - ejecutarlos mejor. -2. Luego trabajamos con algunos proveedores para asegurarnos de que se sirvieran - correctamente. -3. Finalmente, evaluamos el rendimiento de la combinación del modelo/proveedor y elaboramos - una lista que nos sentimos seguros de recomendar. - -OpenCode Go te da acceso a estos modelos por **$5 por tu primer mes**, luego **$10/mes**. - ---- - -## Cómo funciona - -OpenCode Go funciona como cualquier otro proveedor en CoDev Code. - -1. Inicias sesión en **OpenCode Zen**, te suscribes a Go y - copias tu API key. -2. Ejecutas el comando `/connect` en la TUI, seleccionas `OpenCode Go` y pegas - tu API key. -3. Ejecutas `/models` en la TUI para ver la lista de modelos disponibles a través de Go. - -:::note -Solo un miembro por espacio de trabajo puede suscribirse a OpenCode Go. -::: - -La lista actual de modelos incluye: - -- **GLM-5.2** -- **GLM-5.1** -- **Kimi K2.7 Code** -- **Kimi K2.6** -- **MiMo-V2.5** -- **MiMo-V2.5-Pro** -- **MiniMax M3** -- **MiniMax M2.7** -- **Qwen3.7 Max** -- **Qwen3.7 Plus** -- **Qwen3.6 Plus** -- **DeepSeek V4 Pro** -- **DeepSeek V4 Flash** - -La lista de modelos puede cambiar a medida que probamos y agregamos otros nuevos. - ---- - -## Límites de uso - -OpenCode Go incluye los siguientes límites: - -- **Límite de 5 horas** — $12 de uso -- **Límite semanal** — $30 de uso -- **Límite mensual** — $60 de uso - -Los límites se definen en valor en dólares. Esto significa que tu cantidad real de peticiones depende del modelo que uses. Los modelos más económicos como DeepSeek V4 Flash permiten más peticiones, mientras que los modelos de mayor costo como GLM-5.2 permiten menos. - -La siguiente tabla proporciona una cantidad estimada de peticiones basada en los patrones típicos de uso de Go: - -| Model | peticiones por 5 horas | peticiones por semana | peticiones por mes | -| ----------------- | ---------------------- | --------------------- | ------------------ | -| GLM-5.2 | 880 | 2,150 | 4,300 | -| GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K2.6 | 1,150 | 2,880 | 5,750 | -| Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | -| MiMo-V2.5 | 30,100 | 75,200 | 150,400 | -| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 | -| MiniMax M3 | 3,200 | 8,000 | 16,000 | -| MiniMax M2.7 | 3,400 | 8,500 | 17,000 | -| Qwen3.7 Max | 950 | 2,390 | 4,770 | -| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 | -| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 | -| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 | -| DeepSeek V4 Flash | 31,650 | 79,050 | 158,150 | - -Las estimaciones se basan en los patrones de peticiones promedio observados: - -- GLM-5.2/5.1 — 700 tokens de entrada, 52,000 en caché, 150 tokens de salida por petición -- Kimi K2.7 Code/K2.6 — 870 tokens de entrada, 55,000 en caché, 200 tokens de salida por petición -- DeepSeek V4 Pro — 750 tokens de entrada, 82,000 en caché, 290 tokens de salida por petición -- DeepSeek V4 Flash — 790 tokens de entrada, 68,000 en caché, 280 tokens de salida por petición -- MiniMax M3 — 510 tokens de entrada, 56,000 en caché, 190 tokens de salida por petición -- MiniMax M2.7 — 300 tokens de entrada, 55,000 en caché, 125 tokens de salida por petición -- Qwen3.7 Max — 420 tokens de entrada, 66,000 en caché, 200 tokens de salida por petición -- Qwen3.7 Plus — 500 tokens de entrada, 57,000 en caché, 190 tokens de salida por petición -- Qwen3.6 Plus — 500 tokens de entrada, 57,000 en caché, 190 tokens de salida por petición -- MiMo-V2.5 — 830 tokens de entrada, 71,500 en caché, 295 tokens de salida por petición -- MiMo-V2.5-Pro — 790 tokens de entrada, 86,000 en caché, 305 tokens de salida por petición - -Las estimaciones también se basan en los siguientes precios por 1M tokens: - -| Modelo | Entrada | Salida | Lectura en caché | Escritura en caché | -| ---------------------------- | ------- | ------ | ---------------- | ------------------ | -| GLM-5.2 | $1.40 | $4.40 | $0.26 | - | -| GLM-5.1 | $1.40 | $4.40 | $0.26 | - | -| Kimi K2.7 Code | $0.95 | $4.00 | $0.19 | - | -| Kimi K2.6 | $0.95 | $4.00 | $0.16 | - | -| MiMo V2.5 | $0.14 | $0.28 | $0.0028 | - | -| MiMo V2.5 Pro | $1.74 | $3.48 | $0.0145 | - | -| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | -| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | -| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | -| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | -| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | -| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | -| Qwen3.6 Plus (> 256K tokens) | $2.00 | $6.00 | $0.20 | $2.50 | -| DeepSeek V4 Pro | $1.74 | $3.48 | $0.0145 | - | -| DeepSeek V4 Flash | $0.14 | $0.28 | $0.0028 | - | - -Puedes realizar un seguimiento de tu uso actual en la **consola**. - -:::tip -Si alcanzas el límite de uso, puedes continuar usando los modelos gratuitos. -::: - -Los límites de uso pueden cambiar a medida que aprendemos del uso inicial y de los comentarios (feedback). - ---- - -### Uso más allá de los límites - -Si también tienes créditos en tu saldo de Zen, puedes habilitar la opción **Use balance** -en la consola. Cuando está habilitada, Go recurrirá a tu saldo de Zen -después de que hayas alcanzado tus límites de uso en lugar de bloquear las peticiones. - ---- - -## Endpoints - -También puedes acceder a los modelos de Go a través de los siguientes endpoints de la API. - -| Modelo | ID del modelo | Endpoint | Paquete de AI SDK | -| ----------------- | ----------------- | ------------------------------------------------ | --------------------------- | -| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM-5.1 | glm-5.1 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.6 | kimi-k2.6 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Pro | deepseek-v4-pro | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash | deepseek-v4-flash | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5 | mimo-v2.5 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5-Pro | mimo-v2.5-pro | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | - -El [ID del modelo](/docs/config/#models) en tu configuración de CoDev Code -usa el formato `opencode-go/`. Por ejemplo, para Kimi K2.7 Code, usarías -`opencode-go/kimi-k2.7-code` en tu configuración. - ---- - -### Modelos - -Puedes obtener la lista completa de modelos disponibles y sus metadatos desde: - -``` -https://opencode.ai/zen/go/v1/models -``` - ---- - -## Privacidad - -El plan está diseñado principalmente para usuarios internacionales, con modelos alojados en US, EU y Singapore para ofrecer un acceso global estable. Nuestros proveedores siguen una política de retención cero y no utilizan tus datos para el entrenamiento de modelos. - ---- - -## Objetivos - -Creamos OpenCode Go para: - -1. Hacer que la programación con IA sea **accesible** para más personas con una suscripción de bajo costo. -2. Proporcionar un acceso **confiable** a los mejores modelos abiertos de programación. -3. Seleccionar modelos que estén **probados y evaluados** para su uso en agentes de programación. -4. Evitar la **dependencia (lock-in)** al permitirte usar también cualquier otro proveedor con CoDev Code. diff --git a/packages/web/src/content/docs/es/ide.mdx b/packages/web/src/content/docs/es/ide.mdx deleted file mode 100644 index 2212ae7483..0000000000 --- a/packages/web/src/content/docs/es/ide.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: IDE -description: La extensión CoDev Code para VS Code, Cursor y otros IDE ---- - -CoDev Code se integra con VS Code, Cursor o cualquier IDE que admita un terminal. Simplemente ejecute `codev` en la terminal para comenzar. - ---- - -## Uso - -- **Inicio rápido**: use `Cmd+Esc` (Mac) o `Ctrl+Esc` (Windows/Linux) para abrir CoDev Code en una vista de terminal dividida, o enfoque una sesión de terminal existente si ya se está ejecutando una. -- **Nueva sesión**: use `Cmd+Shift+Esc` (Mac) o `Ctrl+Shift+Esc` (Windows/Linux) para iniciar una nueva sesión de terminal CoDev Code, incluso si ya hay una abierta. También puede hacer clic en el botón CoDev Code en la interfaz de usuario. -- **Conciencia del contexto**: comparte automáticamente tu selección o pestaña actual con CoDev Code. -- **Atajos de referencia de archivos**: utilice `Cmd+Option+K` (Mac) o `Alt+Ctrl+K` (Linux/Windows) para insertar referencias de archivos. Por ejemplo, `@File#L37-42`. - ---- - -## Instalación - -Para instalar CoDev Code en VS Code y bifurcaciones populares como Cursor, Windsurf, VSCodium: - -1. Abra VS Code -2. Abra el terminal integrado -3. Ejecute `codev`: la extensión se instala automáticamente - -Si, por otro lado, desea utilizar su propio IDE cuando ejecuta `/editor` o `/export` desde TUI, deberá configurar `export EDITOR="code --wait"`. [Más información](/docs/tui/#editor-setup). - ---- - -### Instalación manual - -La extensión no está publicada en Extension Marketplace. Compile el `.vsix` desde una copia del repositorio e instálelo manualmente: - -```bash -cd sdks/vscode -bun install -bun run vsix -code --install-extension dist/codev-code-.vsix -``` - ---- - -### Solución de problemas - -Si la extensión no se instala automáticamente: - -- Asegúrese de estar ejecutando `codev` en el terminal integrado. -- Confirme que el CLI para su IDE esté instalado: - - Para VS Code: comando `code` - - Para cursor: comando `cursor` - - Para Windsurf: comando `windsurf` - - Para VSCodium: comando `codium` - - Si no, ejecute `Cmd+Shift+P` (Mac) o `Ctrl+Shift+P` (Windows/Linux) y busque "Shell Command: Install 'code' command in PATH" (o el equivalente para su IDE) -- Asegúrese de que VS Code tenga permiso para instalar extensiones. diff --git a/packages/web/src/content/docs/es/index.mdx b/packages/web/src/content/docs/es/index.mdx deleted file mode 100644 index d1d5ce6b56..0000000000 --- a/packages/web/src/content/docs/es/index.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: Introducción -description: Comience a usar CoDev Code. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" -import config from "../../../../config.mjs" -export const console = config.console - -[**CoDev Code**](/) es un agente de codigo de IA de código abierto. Está disponible como interfaz basada en terminal, aplicación de escritorio o extensión IDE. - -![CoDev Code TUI con el tema opencode](../../../assets/lander/screenshot.png) - -Comencemos. - ---- - -#### Requisitos previos - -Para usar CoDev Code en la terminal, necesitará: - -1. Un emulador de terminal moderno como: - - [WezTerm](https://wezterm.org), multiplataforma - - [Alacritty](https://alacritty.org), multiplataforma - - [Ghostty](https://ghostty.org), Linux y macOS - - [Kitty](https://sw.kovidgoyal.net/kitty/), Linux y macOS - -2. Claves de API de los proveedores de LLM que quiera usar. - ---- - -## Instalar - -CoDev Code se distribuye como el paquete `codev-code` en npm. Instálalo globalmente con tu gestor de paquetes de Node.js para obtener el comando `codev`. - - - - ```bash - npm install -g codev-code - ``` - - - ```bash - bun install -g codev-code - ``` - - - ```bash - pnpm install -g codev-code - ``` - - - ```bash - yarn global add codev-code - ``` - - - -#### Windows - -:::tip[Recomendado: Usar WSL] -Para obtener la mejor experiencia en Windows, recomendamos utilizar [Windows Subsystem for Linux (WSL)](/docs/windows-wsl). Ofrece mejor rendimiento y compatibilidad total con las funciones de CoDev Code. -::: - -En Windows, instálalo de la misma forma con npm (u otro gestor de paquetes de Node.js): - -```bash -npm install -g codev-code -``` - -También puede obtener el binario desde [Versiones](https://github.com/quickbeard/codev-code/releases). - ---- - -## Configuración - -Con CoDev Code, puede usar cualquier proveedor de LLM configurando sus claves de API. - -Si es nuevo en el uso de proveedores de LLM, le recomendamos usar [OpenCode Zen](/docs/zen). -Es una selección de modelos probados y verificados por el equipo de OpenCode. - -1. Ejecute el comando `/connect` en la TUI, seleccione opencode y diríjase a [opencode.ai/auth](https://opencode.ai/auth). - - ```txt - /connect - ``` - -2. Inicie sesión, agregue sus datos de facturación y copie su clave de API. - -3. Pega tu clave de API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -También puede seleccionar otro proveedor. [Más información](/docs/providers#directory). - ---- - -## Inicializar - -Ahora que ya configuró un proveedor, vaya al proyecto en el que quiera trabajar. - -```bash -cd /path/to/project -``` - -Luego, ejecute CoDev Code. - -```bash -codev -``` - -A continuación, inicialice CoDev Code para el proyecto con el siguiente comando: - -```bash frame="none" -/init -``` - -CoDev Code analizará su proyecto y creará un archivo AGENTS.md en la raíz. - -:::tip -Asegúrese de versionar en Git el archivo AGENTS.md de su proyecto. -::: - -Esto ayuda a CoDev Code a comprender la estructura del proyecto y los patrones de código que se usan en él. - ---- - -## Usar - -Ahora ya está listo para usar CoDev Code en su proyecto. Puede pedirle desde explicaciones del código hasta cambios concretos. - -Si es la primera vez que usa un agente de codigo con IA, estos ejemplos pueden servirle como punto de partida. - ---- - -### Hacer preguntas - -Puede pedirle a CoDev Code que le explique el código base. - -:::tip -Utilice la tecla `@` para realizar una búsqueda aproximada de archivos dentro del proyecto. -::: - -```txt frame="none" "@packages/functions/src/api/index.ts" -¿Cómo se maneja la autenticación en @packages/functions/src/api/index.ts -``` - -Esto resulta útil cuando hay una parte del código base en la que usted no ha trabajado. - ---- - -### Agregar funcionalidades - -Puede pedirle a CoDev Code que agregue nuevas funcionalidades a su proyecto. Aun así, primero recomendamos pedirle que cree un plan. - -1. **Crear un plan** - - CoDev Code tiene un modo Plan que desactiva temporalmente su capacidad de hacer cambios y, en su lugar, propone _cómo_ implementará la funcionalidad. - - Cambie a este modo con la tecla **Tab.** Verá un indicador en la esquina inferior derecha. - - ```bash frame="none" title="Switch to Plan mode" - - ``` - - Ahora describa lo que quiere que haga. - - ```txt frame="none" - Cuando un usuario elimine una nota, queremos marcarla como eliminada en la base de datos. - Luego, cree una pantalla que muestre todas las notas eliminadas recientemente. - Desde esa pantalla, el usuario podrá restaurar una nota o eliminarla de forma permanente. - ``` - - Procure darle a CoDev Code suficiente contexto para que entienda exactamente lo que necesita. Ayuda hablarle como si estuviera hablando con un desarrollador junior de su equipo. - - :::tip - Déle a CoDev Code todo el contexto y los ejemplos que pueda para ayudarle a comprender lo que desea. - ::: - -2. **Iterar sobre el plan** - - Una vez que CoDev Code le proponga un plan, puede darle comentarios o agregar más detalles. - - ```txt frame="none" - Queremos diseñar esta nueva pantalla usando un diseño que ya hemos usado antes. - [Imagen #1] Revise esta imagen y úsela como referencia. - ``` - - :::tip - Arrastre y suelte imágenes en la terminal para agregarlas al mensaje. - ::: - - CoDev Code puede analizar cualquier imagen que usted le proporcione y añadirla al contexto del mensaje. Puede hacerlo arrastrando y soltando una imagen en la terminal. - -3. **Implementar la funcionalidad** - - Cuando esté conforme con el plan, vuelva al modo _Build_ presionando de nuevo la tecla Tab. - - ```bash frame="none" - - ``` - - Luego, pídale que haga los cambios. - - ```bash frame="none" - Perfecto. Continúe y realice los cambios. - ``` - ---- - -### Realizar cambios - -Para cambios más sencillos, puede pedirle a CoDev Code que los implemente directamente, sin revisar antes un plan. - -```txt frame="none" "@packages/functions/src/settings.ts" "@packages/functions/src/notes.ts" -Necesitamos agregar autenticación a la ruta /settings. Revise cómo se maneja esto -en la ruta /notes en @packages/functions/src/notes.ts e implemente -la misma lógica en @packages/functions/src/settings.ts. -``` - -Procure dar suficientes detalles para que CoDev Code pueda tomar las decisiones correctas al hacer los cambios - ---- - -### Deshacer cambios - -Supongamos que le pide a CoDev Code que haga algunos cambios. - -```txt frame="none" "@packages/functions/src/api/index.ts" -¿Puede refactorizar la función en @packages/functions/src/api/index.ts? -``` - -Pero luego se da cuenta de que no era lo que quería. Puede **deshacer** los cambios usando el comando `/undo`. - -```bash frame="none" -/undo -``` - -CoDev Code revertirá los cambios que hizo y volverá a mostrar su mensaje original. - -```txt frame="none" "@packages/functions/src/api/index.ts" -¿Puede refactorizar la función en @packages/functions/src/api/index.ts? -``` - -Desde ahí, puede modificar el mensaje y pedirle a CoDev Code que lo intente de nuevo. - -:::tip -Puede ejecutar `/undo` varias veces para deshacer varios cambios. -::: - -También puede rehacer los cambios usando el comando `/redo.` - -```bash frame="none" -/redo -``` - ---- - -## Compartir - -Las conversaciones que tenga con CoDev Code pueden [compartirse con su -equipo](/docs/share). - -```bash frame="none" -/share -``` - -Esto creará un enlace a la conversación actual y lo copiará en su portapapeles. - -:::note -Las conversaciones no se comparten de forma predeterminada. -::: - -Aquí tiene una [conversación de ejemplo](https://opencode.ai/s/4XP1fce5) con CoDev Code. - ---- - -## Personalizar - -Y eso es todo. Ya conoce lo básico para empezar a usar CoDev Code. - -Para personalizarlo, recomendamos [elegir un tema](/docs/themes), [personalizar las combinaciones de teclas](/docs/keybinds), [configurar formateadores de código](/docs/formatters), [crear comandos personalizados](/docs/commands) o explorar la [configuración CoDev Code](/docs/config). diff --git a/packages/web/src/content/docs/es/keybinds.mdx b/packages/web/src/content/docs/es/keybinds.mdx deleted file mode 100644 index 4298e42811..0000000000 --- a/packages/web/src/content/docs/es/keybinds.mdx +++ /dev/null @@ -1,196 +0,0 @@ ---- -title: Combinaciones de teclas -description: Personaliza tus combinaciones de teclas. ---- - -CoDev Code tiene una lista de combinaciones de teclas que puede personalizar a través de `tui.json`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "keybinds": { - "leader": "ctrl+x", - "app_exit": "ctrl+d,q", - "app_exit_confirm": "ctrl+c", - "editor_open": "e", - "theme_list": "t", - "sidebar_toggle": "ctrl+b,b", - "scrollbar_toggle": "none", - "username_toggle": "none", - "status_view": "s", - "tool_details": "none", - "session_export": "x", - "session_new": "n", - "session_list": "l", - "session_timeline": "g", - "session_fork": "none", - "session_rename": "none", - "session_share": "none", - "session_unshare": "none", - "session_interrupt": "escape", - "session_interrupt_now": "ctrl+c", - "session_compact": "c", - "session_child_first": "down", - "session_child_cycle": "right", - "session_child_cycle_reverse": "left", - "session_parent": "up", - "messages_page_up": "pageup,ctrl+alt+b", - "messages_page_down": "pagedown,ctrl+alt+f", - "messages_line_up": "ctrl+alt+y", - "messages_line_down": "ctrl+alt+e", - "messages_half_page_up": "ctrl+alt+u", - "messages_half_page_down": "ctrl+alt+d", - "messages_first": "ctrl+g,home", - "messages_last": "ctrl+alt+g,end", - "messages_next": "none", - "messages_previous": "none", - "messages_copy": "y", - "messages_undo": "u", - "messages_redo": "r", - "messages_last_user": "none", - "messages_toggle_conceal": "h", - "model_list": "m", - "model_cycle_recent": "f2", - "model_cycle_recent_reverse": "shift+f2", - "model_cycle_favorite": "none", - "model_cycle_favorite_reverse": "none", - "variant_cycle": "ctrl+t", - "variant_list": "none", - "command_list": "ctrl+p", - "agent_list": "a", - "agent_cycle": "tab", - "agent_cycle_reverse": "shift+tab", - "input_clear": "ctrl+c", - "input_paste": "ctrl+v", - "input_submit": "return", - "input_newline": "shift+return,ctrl+return,alt+return,ctrl+j", - "input_move_left": "left,ctrl+o", - "input_move_right": "right,ctrl+f", - "input_move_up": "up", - "input_move_down": "down", - "input_select_left": "shift+left", - "input_select_right": "shift+right", - "input_select_up": "shift+up", - "input_select_down": "shift+down", - "input_line_home": "ctrl+a", - "input_line_end": "ctrl+e", - "input_select_line_home": "ctrl+shift+a", - "input_select_line_end": "ctrl+shift+e", - "input_visual_line_home": "alt+a", - "input_visual_line_end": "alt+e", - "input_select_visual_line_home": "alt+shift+a", - "input_select_visual_line_end": "alt+shift+e", - "input_buffer_home": "home", - "input_buffer_end": "end", - "input_select_buffer_home": "shift+home", - "input_select_buffer_end": "shift+end", - "input_delete_line": "ctrl+shift+d", - "input_delete_to_line_end": "ctrl+k", - "input_delete_to_line_start": "ctrl+u", - "input_backspace": "backspace,shift+backspace", - "input_delete": "ctrl+d,delete,shift+delete", - "input_undo": "ctrl+-,super+z", - "input_redo": "ctrl+.,super+shift+z", - "input_word_forward": "alt+f,alt+right,ctrl+right", - "input_word_backward": "alt+b,alt+left,ctrl+left", - "input_select_word_forward": "alt+shift+f,alt+shift+right", - "input_select_word_backward": "alt+shift+b,alt+shift+left", - "input_delete_word_forward": "alt+d,alt+delete,ctrl+delete", - "input_delete_word_backward": "ctrl+w,ctrl+backspace,alt+backspace", - "history_previous": "up", - "history_next": "down", - "terminal_suspend": "ctrl+z", - "terminal_title_toggle": "none", - "tips_toggle": "h", - "display_thinking": "none" - } -} -``` - ---- - -## Tecla líder - -CoDev Code usa una tecla `leader` para la mayoría de las combinaciones de teclas. Esto evita conflictos en tu terminal. - -De forma predeterminada, `ctrl+x` es la tecla principal y la mayoría de las acciones requieren que primero presione la tecla principal y luego el acceso directo. Por ejemplo, para iniciar una nueva sesión, primero presione `ctrl+x` y luego presione `n`. - -No es necesario utilizar una tecla líder para las combinaciones de teclas, pero le recomendamos que lo haga. - ---- - -## Desactivar combinación de teclas - -Puede deshabilitar una combinación de teclas agregando la clave a `tui.json` con un valor de "none". - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "keybinds": { - "session_compact": "none" - } -} -``` - ---- - -## Atajos de mensajes de escritorio - -La entrada de solicitud de la aplicación de escritorio CoDev Code admite atajos comunes de estilo Readline/Emacs para editar texto. Estos están integrados y actualmente no se pueden configurar a través de `codev.json`. - -| Atajo | Acción | -| -------- | -------------------------------------------------------------- | -| `ctrl+a` | Mover al inicio de la línea actual | -| `ctrl+e` | Mover al final de la línea actual | -| `ctrl+b` | Mover el cursor hacia atrás un carácter | -| `ctrl+f` | Mover el cursor hacia adelante un carácter | -| `alt+b` | Mover el cursor hacia atrás una palabra | -| `alt+f` | Mover el cursor hacia adelante una palabra | -| `ctrl+d` | Eliminar carácter debajo del cursor | -| `ctrl+k` | Borrar hasta el final de la línea | -| `ctrl+u` | Borrar al inicio de la línea | -| `ctrl+w` | Borrar palabra anterior | -| `alt+d` | Borrar la siguiente palabra | -| `ctrl+t` | Transponer caracteres | -| `ctrl+g` | Cancelar ventanas emergentes/abortar la respuesta en ejecución | - ---- - -## Mayús+Entrar - -Algunos terminales no envían teclas modificadoras con Enter de forma predeterminada. Es posible que necesite configurar su terminal para enviar `Shift+Enter` como secuencia de escape. - -### Windows Terminal - -Abra su `settings.json` en: - -``` -%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json -``` - -Agregue esto a la matriz `actions` de nivel raíz: - -```json -"actions": [ - { - "command": { - "action": "sendInput", - "input": "\u001b[13;2u" - }, - "id": "User.sendInput.ShiftEnterCustom" - } -] -``` - -Agregue esto a la matriz `keybindings` de nivel raíz: - -```json -"keybindings": [ - { - "keys": "shift+enter", - "id": "User.sendInput.ShiftEnterCustom" - } -] -``` - -Guarde el archivo y reinicie Windows Terminal o abra una nueva pestaña. diff --git a/packages/web/src/content/docs/es/lsp.mdx b/packages/web/src/content/docs/es/lsp.mdx deleted file mode 100644 index 2548c70ad1..0000000000 --- a/packages/web/src/content/docs/es/lsp.mdx +++ /dev/null @@ -1,208 +0,0 @@ ---- -title: Servidores LSP -description: CoDev Code se integra con sus servidores LSP. ---- - -CoDev Code puede integrarse con servidores Language Server Protocol (LSP) para usar diagnósticos como feedback para el agente. - ---- - -## Incorporados - -CoDev Code viene con varios servidores LSP integrados para idiomas populares: - -| Servidor LSP | Extensiones | Requisitos | -| ------------------ | ------------------------------------------------------------------- | ------------------------------------------------------------------------ | -| astro | .astro | Autoinstalaciones para proyectos Astro | -| bash | .sh, .bash, .zsh, .ksh | Autoinstala el servidor en lenguaje bash | -| clangd | .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ | Instalaciones automáticas para proyectos C/C++ | -| csharp | .cs | `.NET SDK` instalado | -| clojure-lsp | .clj, .cljs, .cljc, .edn | Comando `clojure-lsp` disponible | -| dart | .dart | Comando `dart` disponible | -| deno | .ts, .tsx, .js, .jsx, .mjs | Comando `deno` disponible (detecta automáticamente deno.json/deno.jsonc) | -| elixir-ls | .ex, .exs | Comando `elixir` disponible | -| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependencia en proyecto | -| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` instalado | -| gleam | .gleam | Comando `gleam` disponible | -| gopls | .go | Comando `go` disponible | -| hls | .hs, .lhs | Comando `haskell-language-server-wrapper` disponible | -| jdtls | .java | `Java SDK (version 21+)` instalado | -| julials | .jl | `julia` y `LanguageServer.jl` instalados | -| kotlin-ls | .kt, .kts | Autoinstalaciones para proyectos Kotlin | -| lua-ls | .lua | Autoinstalaciones para proyectos Lua | -| nixd | .nix | Comando `nixd` disponible | -| ocaml-lsp | .ml, .mli | Comando `ocamllsp` disponible | -| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte | `oxlint` dependencia en proyecto | -| php intelephense | .php | Autoinstalaciones para proyectos PHP | -| prisma | .prisma | Comando `prisma` disponible | -| pyright | .py, .pyi | Dependencia `pyright` instalada | -| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | Comandos `ruby` y `gem` disponibles | -| rust | .rs | Comando `rust-analyzer` disponible | -| sourcekit-lsp | .swift, .objc, .objcpp | `swift` instalado (`xcode` en macOS) | -| svelte | .svelte | Autoinstalaciones para proyectos Svelte | -| terraform | .tf, .tfvars | Instalaciones automáticas desde versiones GitHub | -| tinymist | .typ, .typc | Instalaciones automáticas desde versiones GitHub | -| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` dependencia en proyecto | -| vue | .vue | Autoinstalaciones para proyectos Vue | -| yaml-ls | .yaml, .yml | Autoinstala Red Hat yaml-language-server | -| zls | .zig, .zon | Comando `zig` disponible | - -LSP está deshabilitado por defecto. Cuando está habilitado, los servidores se inician cuando se detecta una de las extensiones de archivo anteriores y se cumplen los requisitos. - -:::note -Puede deshabilitar las descargas automáticas del servidor LSP configurando la variable de entorno `CODEV_DISABLE_LSP_DOWNLOAD` en `true`. -::: - ---- - -## Cómo funciona - -Cuando LSP está habilitado y CoDev Code abre un archivo: - -1. Comprueba la extensión del archivo con todos los servidores LSP habilitados. -2. Inicia el servidor LSP apropiado si aún no se está ejecutando. - ---- - -## Buenas prácticas - -LSP puede ayudar al agente a encontrar y corregir problemas proporcionando diagnósticos de los servidores de lenguaje. Esto es útil en algunos proyectos, pero no siempre es una mejora neta. - -Los servidores de lenguaje pueden desincronizarse, usar bastante memoria, variar según la versión o el proyecto y ralentizar los flujos de trabajo del agente. En muchos proyectos es mejor hacer que el agente ejecute lint, typecheck u otras herramientas CLI de diagnóstico directamente, para que los errores vuelvan al ciclo del agente sin esas compensaciones. Documenta esos comandos en archivos de instrucciones como `AGENTS.md` o skills para que el agente sepa qué ejecutar. Habilita LSP cuando tu proyecto se beneficie de feedback adicional del servidor de lenguaje. - ---- - -## Configuración - -Puede habilitar y personalizar los servidores LSP a través de la sección `lsp` en su configuración CoDev Code. - -Para habilitar todos los servidores LSP integrados, configure `lsp` como `true`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": true -} -``` - -Use un objeto para mantener habilitados los servidores integrados mientras configura anulaciones o servidores personalizados. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": {} -} -``` - -Cada servidor LSP admite lo siguiente: - -| Propiedad | Tipo | Descripción | -| ---------------- | -------- | ------------------------------------------------------------ | -| `disabled` | booleano | Establezca esto en `true` para deshabilitar el servidor LSP | -| `command` | cadena[] | El comando para iniciar el servidor LSP | -| `extensions` | cadena[] | Extensiones de archivo que este servidor LSP debería manejar | -| `env` | objeto | Variables de entorno para configurar al iniciar el servidor | -| `initialization` | objeto | Opciones de inicialización para enviar al servidor LSP | - -Veamos algunos ejemplos. - ---- - -### Variables de entorno - -Utilice la propiedad `env` para establecer variables de entorno al iniciar el servidor LSP: - -```json title="codev.json" {5-7} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "rust": { - "env": { - "RUST_LOG": "debug" - } - } - } -} -``` - ---- - -### Opciones de inicialización - -Utilice la propiedad `initialization` para pasar opciones de inicialización al servidor LSP. Estas son configuraciones específicas del servidor enviadas durante la solicitud LSP `initialize`: - -```json title="codev.json" {5-9} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "typescript": { - "initialization": { - "preferences": { - "importModuleSpecifierPreference": "relative" - } - } - } - } -} -``` - -:::note -Las opciones de inicialización varían según el servidor LSP. Consulte la documentación de su servidor LSP para conocer las opciones disponibles. -::: - ---- - -### Deshabilitar servidores LSP - -Si se omite `lsp`, todos los servidores LSP están deshabilitados. Para deshabilitar todos los servidores LSP después de que otra configuración los haya habilitado, configure `lsp` en `false`: - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": false -} -``` - -Para deshabilitar un servidor LSP **específico**, configure `disabled` en `true`: - -```json title="codev.json" {5} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "typescript": { - "disabled": true - } - } -} -``` - ---- - -### Servidores LSP personalizados - -Puede agregar servidores LSP personalizados especificando el comando y las extensiones de archivo: - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "custom-lsp": { - "command": ["custom-lsp-server", "--stdio"], - "extensions": [".custom"] - } - } -} -``` - ---- - -## Información adicional - -### PHP Intelephense - -PHP Intelephense ofrece funciones premium a través de una clave de licencia. Puede proporcionar una clave de licencia colocando (únicamente) la clave en un archivo de texto en: - -- En macOS/Linux: `$HOME/intelephense/license.txt` -- En Windows: `%USERPROFILE%/intelephense/license.txt` - -El archivo debe contener sólo la clave de licencia sin contenido adicional. diff --git a/packages/web/src/content/docs/es/mcp-servers.mdx b/packages/web/src/content/docs/es/mcp-servers.mdx deleted file mode 100644 index 9ae4b13b1b..0000000000 --- a/packages/web/src/content/docs/es/mcp-servers.mdx +++ /dev/null @@ -1,511 +0,0 @@ ---- -title: MCP servidores -description: Agregue herramientas MCP locales y remotas. ---- - -Puede agregar herramientas externas a CoDev Code utilizando el _Model Context Protocol_ o MCP. CoDev Code admite servidores locales y remotos. - -Una vez agregadas, las herramientas MCP están disponibles automáticamente para LLM junto con las herramientas integradas. - ---- - -#### Advertencias - -Cuando utiliza un servidor MCP, se suma al contexto. Esto puede acumularse rápidamente si tiene muchas herramientas. Por lo que recomendamos tener cuidado con qué servidores MCP utiliza. - -:::tip -Los servidores MCP se agregan a su contexto, por lo que debe tener cuidado con cuáles habilita. -::: - -Ciertos servidores MCP, como el servidor GitHub MCP, tienden a agregar muchos tokens y pueden exceder fácilmente el límite de contexto. - ---- - -## Habilitar - -Puede definir servidores MCP en su [CoDev Code Config](https://opencode.ai/docs/config/) en `mcp`. Agregue cada MCP con un nombre único. Puede referirse a ese MCP por su nombre cuando solicite el LLM. - -```jsonc title="codev.jsonc" {6} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "name-of-mcp-server": { - // ... - "enabled": true, - }, - "name-of-other-mcp-server": { - // ... - }, - }, -} -``` - -También puede desactivar un servidor configurando `enabled` en `false`. Esto es útil si desea desactivar temporalmente un servidor sin eliminarlo de su configuración. - ---- - -### Anulación de los valores predeterminados remotos - -Las organizaciones pueden proporcionar servidores MCP predeterminados a través de su punto final `.well-known/opencode`. Estos servidores pueden estar deshabilitados de forma predeterminada, lo que permite a los usuarios optar por los que necesitan. - -Para habilitar un servidor específico desde la configuración remota de su organización, agréguelo a su configuración local con `enabled: true`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": true - } - } -} -``` - -Los valores de configuración local anulan los valores predeterminados remotos. Consulte [precedencia de configuración](/docs/config#precedence-order) para obtener más detalles. - ---- - -## Locales - -Agregue servidores MCP locales usando `type` a `"local"` dentro del objeto MCP. - -```jsonc title="codev.jsonc" {15} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-local-mcp-server": { - "type": "local", - // Or ["bun", "x", "my-mcp-command"] - "command": ["npx", "-y", "my-mcp-command"], - "enabled": true, - "environment": { - "MY_ENV_VAR": "my_env_var_value", - }, - }, - }, -} -``` - -El comando es cómo se inicia el servidor MCP local. También puede pasar una lista de variables de entorno. - -Por ejemplo, así es como puede agregar el servidor de prueba [`@modelcontextprotocol/server-everything`](https://www.npmjs.com/package/@modelcontextprotocol/server-everything) MCP. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "mcp_everything": { - "type": "local", - "command": ["npx", "-y", "@modelcontextprotocol/server-everything"], - }, - }, -} -``` - -Y para usarlo puedo agregar `use the mcp_everything tool` a mis indicaciones. - -```txt "mcp_everything" -use the mcp_everything tool to add the number 3 and 4 -``` - ---- - -#### Opciones - -Aquí están todas las opciones para configurar un servidor MCP local. - -| Opción | Tipo | Requerido | Descripción | -| ------------- | -------- | --------- | ------------------------------------------------------------------------------------------------------------------ | -| `type` | Cadena | Y | El tipo de conexión del servidor MCP debe ser `"local"`. | -| `command` | Matriz | Y | Comando y argumentos para ejecutar el servidor MCP. | -| `environment` | Objeto | | Variables de entorno para configurar al ejecutar el servidor. | -| `enabled` | booleano | | Habilite o deshabilite el servidor MCP al inicio. | -| `timeout` | Número | | Tiempo de espera en ms para recuperar herramientas del servidor MCP. El valor predeterminado es 5000 (5 segundos). | - ---- - -## Remoto - -Agregue servidores MCP remotos configurando `type` en `"remote"`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-remote-mcp": { - "type": "remote", - "url": "https://my-mcp-server.com", - "enabled": true, - "headers": { - "Authorization": "Bearer MY_API_KEY" - } - } - } -} -``` - -`url` es la URL del servidor MCP remoto y con la opción `headers` puede pasar una lista de encabezados. - ---- - -#### Opciones - -| Opción | Tipo | Requerido | Descripción | -| --------- | -------- | --------- | ------------------------------------------------------------------------------------------------------------------ | -| `type` | Cadena | Y | El tipo de conexión del servidor MCP debe ser `"remote"`. | -| `url` | Cadena | Y | URL del servidor MCP remoto. | -| `enabled` | booleano | | Habilite o deshabilite el servidor MCP al inicio. | -| `headers` | Objeto | | Encabezados para enviar con la solicitud. | -| `oauth` | Objeto | | OAuth configuración de autenticación. Consulte la sección [OAuth](#oauth) a continuación. | -| `timeout` | Número | | Tiempo de espera en ms para recuperar herramientas del servidor MCP. El valor predeterminado es 5000 (5 segundos). | - ---- - -## OAuth - -CoDev Code maneja automáticamente la autenticación OAuth para servidores MCP remotos. Cuando un servidor requiere autenticación, CoDev Code: - -1. Detectar la respuesta 401 e iniciar el flujo OAuth -2. Utilice **Registro dinámico de cliente (RFC 7591)** si el servidor lo admite. -3. Almacene tokens de forma segura para futuras solicitudes - ---- - -### Automático - -Para la mayoría de los servidores MCP habilitados para OAuth, no se necesita ninguna configuración especial. Simplemente configure el servidor remoto: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-oauth-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp" - } - } -} -``` - -Si el servidor requiere autenticación, CoDev Code le pedirá que se autentique cuando intente usarlo por primera vez. De lo contrario, puede [activar manualmente el flujo](#authenticating) con `codev mcp auth `. - ---- - -### Preinscrito - -Si tiene credenciales de cliente del proveedor del servidor MCP, puede configurarlas: - -```json title="codev.json" {7-11} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-oauth-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp", - "oauth": { - "clientId": "{env:MY_MCP_CLIENT_ID}", - "clientSecret": "{env:MY_MCP_CLIENT_SECRET}", - "scope": "tools:read tools:execute" - } - } - } -} -``` - ---- - -### Autenticación - -Puede activar manualmente la autenticación o administrar las credenciales. - -Autenticar con un servidor MCP específico: - -```bash -codev mcp auth my-oauth-server -``` - -Enumere todos los servidores MCP y su estado de autenticación: - -```bash -codev mcp list -``` - -Eliminar las credenciales almacenadas: - -```bash -codev mcp logout my-oauth-server -``` - -El comando `mcp auth` abrirá su navegador para obtener autorización. Después de su autorización, CoDev Code almacenará los tokens de forma segura en `~/.local/share/codev/mcp-auth.json`. - ---- - -#### Deshabilitando OAuth - -Si desea deshabilitar el OAuth automático para un servidor (por ejemplo, para servidores que usan claves API), configure `oauth` en `false`: - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-api-key-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp", - "oauth": false, - "headers": { - "Authorization": "Bearer {env:MY_API_KEY}" - } - } - } -} -``` - ---- - -#### Opciones de OAuth - -| Opción | Tipo | Descripción | -| -------------- | --------------- | -------------------------------------------------------------------------------------------- | -| `oauth` | Objeto \| falso | OAuth objeto de configuración, o `false` para deshabilitar la detección automática de OAuth. | -| `clientId` | Cadena | OAuth ID de cliente. Si no se proporciona, se intentará el registro dinámico del cliente. | -| `clientSecret` | Cadena | OAuth secreto del cliente, si lo requiere el servidor de autorización. | -| `scope` | Cadena | OAuth alcances para solicitar durante la autorización. | - -#### Depuración - -Si un servidor MCP remoto no puede autenticarse, puede diagnosticar problemas con: - -```bash -# View auth status for all OAuth-capable servers -codev mcp auth list - -# Debug connection and OAuth flow for a specific server -codev mcp debug my-oauth-server -``` - -El comando `mcp debug` muestra el estado de autenticación actual, prueba la conectividad HTTP e intenta el flujo de descubrimiento OAuth. - ---- - -## Administrar - -Sus MCP están disponibles como herramientas en CoDev Code, junto con herramientas integradas. Para que puedas administrarlos a través de la configuración CoDev Code como cualquier otra herramienta. - ---- - -### Global - -Esto significa que puede habilitarlos o deshabilitarlos globalmente. - -```json title="codev.json" {14} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp-foo": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-foo"] - }, - "my-mcp-bar": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-bar"] - } - }, - "tools": { - "my-mcp-foo": false - } -} -``` - -También podemos usar un patrón global para deshabilitar todos los MCP coincidentes. - -```json title="codev.json" {14} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp-foo": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-foo"] - }, - "my-mcp-bar": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-bar"] - } - }, - "tools": { - "my-mcp*": false - } -} -``` - -Aquí estamos usando el patrón global `my-mcp*` para deshabilitar todos los MCP. - ---- - -### Por agente - -Si tiene una gran cantidad de servidores MCP, es posible que desee habilitarlos solo por agente y deshabilitarlos globalmente. Para hacer esto: - -1. Desactívelo como herramienta a nivel global. -2. En su [configuración del agente](/docs/agents#tools), habilite el servidor MCP como herramienta. - -```json title="codev.json" {11, 14-18} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp": { - "type": "local", - "command": ["bun", "x", "my-mcp-command"], - "enabled": true - } - }, - "tools": { - "my-mcp*": false - }, - "agent": { - "my-agent": { - "tools": { - "my-mcp*": true - } - } - } -} -``` - ---- - -#### Patrones globales - -El patrón global utiliza patrones globales simples de expresiones regulares: - -- `*` coincide con cero o más de cualquier carácter (por ejemplo, `"my-mcp*"` coincide con `my-mcp_search`, `my-mcp_list`, etc.) -- `?` coincide exactamente con un carácter -- Todos los demás caracteres coinciden literalmente - -:::note -Las herramientas del servidor MCP están registradas con el nombre del servidor como prefijo, por lo que para deshabilitar todas las herramientas para un servidor simplemente use: - -``` -"mymcpservername_*": false -``` - -::: - ---- - -## Ejemplos - -A continuación se muestran ejemplos de algunos servidores MCP comunes. Puede enviar un PR si desea documentar otros servidores. - ---- - -### sentry - -Agregue el [servidor Sentry MCP](https://mcp.sentry.dev) para interactuar con sus proyectos y problemas Sentry. - -```json title="codev.json" {4-8} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "sentry": { - "type": "remote", - "url": "https://mcp.sentry.dev/mcp", - "oauth": {} - } - } -} -``` - -Después de agregar la configuración, autentíquese con Sentry: - -```bash -codev mcp auth sentry -``` - -Esto abrirá una ventana del navegador para completar el flujo OAuth y conectar CoDev Code a su cuenta Sentry. - -Una vez autenticado, puede utilizar las herramientas Sentry en sus indicaciones para consultar problemas, proyectos y datos de errores. - -```txt "use sentry" -Show me the latest unresolved issues in my project. use sentry -``` - ---- - -### Context7 - -Agregue el [servidor Context7 MCP](https://github.com/upstash/context7) para buscar en los documentos. - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "context7": { - "type": "remote", - "url": "https://mcp.context7.com/mcp" - } - } -} -``` - -Si se ha registrado para obtener una cuenta gratuita, puede usar su clave API y obtener límites de tarifas más altos. - -```json title="codev.json" {7-9} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "context7": { - "type": "remote", - "url": "https://mcp.context7.com/mcp", - "headers": { - "CONTEXT7_API_KEY": "{env:CONTEXT7_API_KEY}" - } - } - } -} -``` - -Aquí asumimos que tiene configurada la variable de entorno `CONTEXT7_API_KEY`. - -Agregue `use context7` a sus indicaciones para usar el servidor Context7 MCP. - -```txt "use context7" -Configure a Cloudflare Worker script to cache JSON API responses for five minutes. use context7 -``` - -Alternativamente, puede agregar algo como esto a su [AGENTS.md](/docs/rules/). - -```md title="AGENTS.md" -When you need to search docs, use `context7` tools. -``` - ---- - -### Grep by Vercel - -Agregue el servidor [Grep by Vercel](https://grep.app) MCP para buscar fragmentos de código en GitHub. - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "gh_grep": { - "type": "remote", - "url": "https://mcp.grep.app" - } - } -} -``` - -Dado que llamamos a nuestro servidor MCP `gh_grep`, puede agregar `use the gh_grep tool` a sus indicaciones para que el agente lo use. - -```txt "use the gh_grep tool" -What's the right way to set a custom domain in an SST Astro component? use the gh_grep tool -``` - -Alternativamente, puede agregar algo como esto a su [AGENTS.md](/docs/rules/). - -```md title="AGENTS.md" -If you are unsure how to do something, use `gh_grep` to search code examples from GitHub. -``` diff --git a/packages/web/src/content/docs/es/models.mdx b/packages/web/src/content/docs/es/models.mdx deleted file mode 100644 index 16ff75b076..0000000000 --- a/packages/web/src/content/docs/es/models.mdx +++ /dev/null @@ -1,223 +0,0 @@ ---- -title: Modelos -description: Configuración de un proveedor y modelo LLM. ---- - -CoDev Code usa el [AI SDK](https://ai-sdk.dev/) y [Models.dev](https://models.dev) para admitir **75+ proveedores LLM** y admite la ejecución de modelos locales. - ---- - -## Proveedores - -Los proveedores más populares están precargados de forma predeterminada. Si agregó las credenciales de un proveedor mediante el comando `/connect`, estarán disponibles cuando inicie CoDev Code. - -Obtenga más información sobre [proveedores](/docs/providers). - ---- - -## Seleccionar un modelo - -Una vez que hayas configurado tu proveedor podrás seleccionar el modelo que desees escribiendo: - -```bash frame="none" -/models -``` - ---- - -## Modelos recomendados - -Hay muchos modelos disponibles y cada semana salen nuevos modelos. - -:::tip -Considere utilizar uno de los modelos que recomendamos. -::: - -Sin embargo, sólo unos pocos de ellos son buenos tanto para generar código como para llamar a herramientas. - -Aqui tienes varios modelos que funcionan bien con CoDev Code, sin orden particular. (Esta no es una lista exhaustiva ni necesariamente actualizada): - -- GPT 5.2 -- GPT 5.1 Codex -- Claude Opus 4.5 -- Claude Sonnet 4.5 -- Minimax M2.1 -- Gemini 3 Pro - ---- - -## Establecer un valor predeterminado - -Para configurar uno de estos como modelo predeterminado, puedes definir la clave `model` en tu -configuracion de CoDev Code. - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "model": "lmstudio/google/gemma-3n-e4b" -} -``` - -Aquí el ID completo es `provider_id/model_id`. Por ejemplo, si usa [OpenCode Zen](/docs/zen), usaría `opencode/gpt-5.1-codex` para GPT 5.1 Codex. - -Si ha configurado un [proveedor personalizado](/docs/providers#custom), `provider_id` es la clave de la parte `provider` de su configuración y `model_id` es la clave de `provider.models`. - ---- - -## Configurar modelos - -Puede configurar globalmente las opciones de un modelo a través de la configuración. - -```jsonc title="codev.jsonc" {7-12,19-24} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "openai": { - "models": { - "gpt-5": { - "options": { - "reasoningEffort": "high", - "textVerbosity": "low", - "reasoningSummary": "auto", - "include": ["reasoning.encrypted_content"], - }, - }, - }, - }, - "anthropic": { - "models": { - "claude-sonnet-4-5-20250929": { - "options": { - "thinking": { - "type": "enabled", - "budgetTokens": 16000, - }, - }, - }, - }, - }, - }, -} -``` - -Aquí estamos configurando ajustes globales para dos modelos integrados: `gpt-5` cuando se accede a través del proveedor `openai` y `claude-sonnet-4-20250514` cuando se accede a través del proveedor `anthropic`. -Los nombres de modelo y proveedor integrados se pueden encontrar en [Models.dev](https://models.dev). - -También puede configurar estas opciones para cualquier agente que esté utilizando. La configuración del agente anula cualquier opción global aquí. [Más información](/docs/agents/#additional). - -También puede definir variantes personalizadas que amplíen las integradas. Las variantes le permiten configurar diferentes ajustes para el mismo modelo sin crear entradas duplicadas: - -```jsonc title="codev.jsonc" {6-21} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "opencode": { - "models": { - "gpt-5": { - "variants": { - "high": { - "reasoningEffort": "high", - "textVerbosity": "low", - "reasoningSummary": "auto", - }, - "low": { - "reasoningEffort": "low", - "textVerbosity": "low", - "reasoningSummary": "auto", - }, - }, - }, - }, - }, - }, -} -``` - ---- - -## Variantes - -Muchos modelos admiten múltiples variantes con diferentes configuraciones. CoDev Code se envía con variantes predeterminadas integradas para proveedores populares. - -### Variantes integradas - -CoDev Code se envía con variantes predeterminadas para muchos proveedores: - -**Anthropic**: - -- `high` - Presupuesto de pensamiento alto (predeterminado) -- `max` - Presupuesto de pensamiento máximo - -**OpenAI**: - -Varía según el modelo, pero aproximadamente: - -- `none` - Sin razonamiento -- `minimal` - Mínimo esfuerzo de razonamiento -- `low` - Bajo esfuerzo de razonamiento -- `medium` - Esfuerzo de razonamiento medio -- `high` - Alto esfuerzo de razonamiento -- `xhigh` - Esfuerzo de razonamiento extra alto - -**Google**: - -- `low` - Menor esfuerzo/presupuesto simbólico -- `high` - Mayor esfuerzo/presupuesto simbólico - -:::tip -Esta lista no es exhaustiva. Muchos otros proveedores también tienen valores predeterminados integrados. -::: - -### Variantes personalizadas - -Puede anular las variantes existentes o agregar las suyas propias: - -```jsonc title="codev.jsonc" {7-18} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "openai": { - "models": { - "gpt-5": { - "variants": { - "thinking": { - "reasoningEffort": "high", - "textVerbosity": "low", - }, - "fast": { - "disabled": true, - }, - }, - }, - }, - }, - }, -} -``` - -### Alternar variantes - -Utilice la combinación de teclas `variant_cycle` para cambiar rápidamente entre variantes. [Más información](/docs/keybinds). - ---- - -## Carga de modelos - -Cuando se inicia CoDev Code, busca modelos en el siguiente orden de prioridad: - -1. El indicador de línea de comando `--model` o `-m`. El formato es el mismo que en el archivo de configuración: `provider_id/model_id`. - -2. La lista de modelos en la configuración CoDev Code. - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "model": "anthropic/claude-sonnet-4-20250514" - } - ``` - - El formato aquí es `provider/model`. - -3. El último modelo utilizado. - -4. El primer modelo que utiliza una prioridad interna. diff --git a/packages/web/src/content/docs/es/network.mdx b/packages/web/src/content/docs/es/network.mdx deleted file mode 100644 index dbc51d3159..0000000000 --- a/packages/web/src/content/docs/es/network.mdx +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Red -description: Configure proxies y certificados personalizados. ---- - -CoDev Code admite variables de entorno de proxy estándar y certificados personalizados para entornos de red empresarial. - ---- - -## Proxy - -CoDev Code respeta las variables de entorno de proxy estándar. - -```bash -# HTTPS proxy (recommended) -export HTTPS_PROXY=https://proxy.example.com:8080 - -# HTTP proxy (if HTTPS not available) -export HTTP_PROXY=http://proxy.example.com:8080 - -# Bypass proxy for local server (required) -export NO_PROXY=localhost,127.0.0.1 -``` - -:::caution -El TUI se comunica con un servidor HTTP local. Debe omitir el proxy para esta conexión para evitar bucles de enrutamiento. -::: - -Puede configurar el puerto y el nombre de host del servidor usando [CLI flags](/docs/cli#run). - ---- - -### Autenticación - -Si su proxy requiere autenticación básica, incluya las credenciales en la URL. - -```bash -export HTTPS_PROXY=http://username:password@proxy.example.com:8080 -``` - -:::caution -Evite codificar contraseñas. Utilice variables de entorno o almacenamiento seguro de credenciales. -::: - -Para servidores proxy que requieren autenticación avanzada como NTLM o Kerberos, considere usar una puerta de enlace LLM que admita su método de autenticación. - ---- - -## Certificados personalizados - -Si su empresa utiliza CA personalizadas para conexiones HTTPS, configure CoDev Code para confiar en ellas. - -```bash -export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem -``` - -Esto funciona tanto para conexiones proxy como para acceso directo a API. diff --git a/packages/web/src/content/docs/es/permissions.mdx b/packages/web/src/content/docs/es/permissions.mdx deleted file mode 100644 index 1d727b84e6..0000000000 --- a/packages/web/src/content/docs/es/permissions.mdx +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: Permisos -description: Controle qué acciones requieren aprobación para ejecutarse. ---- - -CoDev Code usa la configuración `permission` para decidir si una acción determinada debe ejecutarse automáticamente, avisarle o bloquearse. - -A partir de `v1.1.1`, la configuración booleana heredada `tools` está obsoleta y se ha fusionado en `permission`. La antigua configuración `tools` todavía se admite por compatibilidad con versiones anteriores. - ---- - -## Acciones - -Cada regla de permiso se resuelve en una de: - -- `"allow"` — ejecutar sin aprobación -- `"ask"` — solicitar aprobación -- `"deny"` — bloquea la acción - ---- - -## Configuración - -Puede establecer permisos globalmente (con `*`) y anular herramientas específicas. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "*": "ask", - "bash": "allow", - "edit": "deny" - } -} -``` - -También puedes configurar todos los permisos a la vez: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": "allow" -} -``` - ---- - -## Reglas granulares (sintaxis de objeto) - -Para la mayoría de los permisos, puede utilizar un objeto para aplicar diferentes acciones según la entrada de la herramienta. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "npm *": "allow", - "rm *": "deny", - "grep *": "allow" - }, - "edit": { - "*": "deny", - "packages/web/src/content/docs/*.mdx": "allow" - } - } -} -``` - -Las reglas se evalúan según la coincidencia de patrones, y la **última regla coincidente gana**. Un patrón común es poner primero la regla general `"*"` y después reglas más específicas. - -### Comodines - -Los patrones de permisos utilizan una simple coincidencia de comodines: - -- `*` coincide con cero o más de cualquier carácter -- `?` coincide exactamente con un carácter -- Todos los demás caracteres coinciden literalmente - -### Expansión del directorio de inicio - -Puede usar `~` o `$HOME` al comienzo de un patrón para hacer referencia a su directorio de inicio. Esto es particularmente útil para las reglas [`external_directory`](#external-directories). - -- `~/projects/*` -> `/Users/username/projects/*` -- `$HOME/projects/*` -> `/Users/username/projects/*` -- `~` -> `/Users/username` - -### Directorios externos - -Utilice `external_directory` para permitir llamadas a herramientas que toquen rutas fuera del directorio de trabajo donde se inició CoDev Code. Esto se aplica a cualquier herramienta que tome una ruta como entrada (por ejemplo, `read`, `edit`, `glob`, `grep` y muchos comandos `bash`). - -La expansión del hogar (como `~/...`) solo afecta la forma en que se escribe un patrón. No hace que una ruta externa forme parte del espacio de trabajo actual, por lo que las rutas fuera del directorio de trabajo aún deben permitirse a través de `external_directory`. - -Por ejemplo, esto permite el acceso a todo lo que se encuentra en `~/projects/personal/`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "external_directory": { - "~/projects/personal/**": "allow" - } - } -} -``` - -Cualquier directorio permitido aquí hereda los mismos valores predeterminados que el espacio de trabajo actual. Dado que [`read` tiene por defecto `allow`](#defaults), también se permiten lecturas para entradas bajo `external_directory` a menos que se anulen. Agregue reglas explícitas cuando una herramienta deba restringirse en estas rutas, como bloquear ediciones mientras se mantienen las lecturas: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "external_directory": { - "~/projects/personal/**": "allow" - }, - "edit": { - "~/projects/personal/**": "deny" - } - } -} -``` - -Mantenga la lista centrada en rutas confiables y aplique reglas adicionales de permitir o denegar según sea necesario para otras herramientas (por ejemplo, `bash`). - ---- - -## Permisos disponibles - -Los permisos CoDev Code están codificados por el nombre de la herramienta, además de un par de medidas de seguridad: - -- `read` — leer un archivo (coincide con la ruta del archivo) -- `edit` — todas las modificaciones de archivos (cubre `edit`, `write`, `patch`) -- `glob` — globalización de archivos (coincide con el patrón global) -- `grep` — búsqueda de contenido (coincide con el patrón de expresiones regulares) -- `bash`: ejecuta comandos de shell (coincide con comandos analizados como `git status --porcelain`) -- `task` — lanzamiento de subagentes (coincide con el tipo de subagente) -- `skill` — cargar una habilidad (coincide con el nombre de la habilidad) -- `lsp`: ejecución de consultas LSP (actualmente no granulares) -- `webfetch` — obteniendo una URL (coincide con la URL) -- `websearch` — búsqueda web (coincide con la consulta) -- `external_directory`: se activa cuando una herramienta toca rutas fuera del directorio de trabajo del proyecto. -- `doom_loop`: se activa cuando la misma llamada de herramienta se repite 3 veces con entrada idéntica - ---- - -## Valores predeterminados - -Si no especifica nada, CoDev Code comienza desde valores predeterminados permisivos: - -- La mayoría de los permisos están predeterminados en `"allow"`. -- `doom_loop` y `external_directory` por defecto son `"ask"`. -- `read` es `"allow"`, pero los archivos `.env` están denegados de forma predeterminada: - -```json title="codev.json" -{ - "permission": { - "read": { - "*": "allow", - "*.env": "deny", - "*.env.*": "deny", - "*.env.example": "allow" - } - } -} -``` - ---- - -## ¿Qué significa "preguntar"? - -Cuando CoDev Code solicita aprobación, la interfaz de usuario ofrece tres resultados: - -- `once` — aprobar solo esta solicitud -- `always`: aprueba solicitudes futuras que coincidan con los patrones sugeridos (para el resto de la sesión actual CoDev Code) -- `reject` — rechazar la solicitud - -La herramienta proporciona el conjunto de patrones que `always` aprobaría (por ejemplo, las aprobaciones de bash generalmente incluyen en la lista blanca un prefijo de comando seguro como `git status*`). - ---- - -## Agentes - -Puede anular los permisos por agente. Los permisos del agente se combinan con la configuración global y las reglas del agente tienen prioridad. [Más información](/docs/agents#permissions) sobre los permisos de los agentes. - -:::note -Consulte la sección [Reglas granulares (sintaxis de objeto)](#granular-rules-object-syntax) anterior para obtener ejemplos de coincidencia de patrones más detallados. -::: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "git commit *": "deny", - "git push *": "deny", - "grep *": "allow" - } - }, - "agent": { - "build": { - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "git commit *": "ask", - "git push *": "deny", - "grep *": "allow" - } - } - } - } -} -``` - -También puede configurar los permisos del agente en Markdown: - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Code review without edits -mode: subagent -permission: - edit: deny - bash: ask - webfetch: deny ---- - -Only analyze code and suggest changes. -``` - -:::tip -Utilice la coincidencia de patrones para comandos con argumentos. `"grep *"` permite `grep pattern file.txt`, mientras que `"grep"` solo lo bloquearía. Los comandos como `git status` funcionan para el comportamiento predeterminado pero requieren permiso explícito (como `"git status *"`) cuando se pasan argumentos. -::: diff --git a/packages/web/src/content/docs/es/plugins.mdx b/packages/web/src/content/docs/es/plugins.mdx deleted file mode 100644 index 993cc982ac..0000000000 --- a/packages/web/src/content/docs/es/plugins.mdx +++ /dev/null @@ -1,389 +0,0 @@ ---- -title: Complementos -description: Escriba sus propios complementos para extender CoDev Code. ---- - -Los complementos le permiten extender CoDev Code al conectarse a varios eventos y personalizar el comportamiento. Puede crear complementos para agregar nuevas funciones, integrarlos con servicios externos o modificar el comportamiento predeterminado de CoDev Code. - -Para ver ejemplos, consulte los [complementos](/docs/ecosystem#plugins) creados por la comunidad. - ---- - -## Usar un complemento - -Hay dos formas de cargar complementos. - ---- - -### Desde archivos locales - -Coloque los archivos JavaScript o TypeScript en el directorio del complemento. - -- `.codev/plugins/` - Complementos a nivel de proyecto -- `~/.config/codev/plugins/` - Complementos globales - -Los archivos en estos directorios se cargan automáticamente al inicio. - ---- - -### Desde npm - -Especifique paquetes npm en su archivo de configuración. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-helicone-session", "opencode-wakatime", "@my-org/custom-plugin"] -} -``` - -Se admiten paquetes npm regulares y de alcance. - -Explore los complementos disponibles en el [ecosistema](/docs/ecosystem#plugins). - ---- - -### Cómo se instalan los complementos - -Los **complementos npm** se instalan automáticamente usando Bun al inicio. Los paquetes y sus dependencias se almacenan en caché en `~/.cache/codev/node_modules/`. - -**Los complementos locales** se cargan directamente desde el directorio de complementos. Para usar paquetes externos, debe crear un `package.json` dentro de su directorio de configuración (consulte [Dependencias](#dependencies)), o publicar el complemento en npm y [agregarlo a su configuración](/docs/config#plugins). - ---- - -### Orden de carga - -Los complementos se cargan desde todas las fuentes y todos los enlaces se ejecutan en secuencia. El orden de carga es: - -1. Configuración global (`~/.config/codev/codev.json`) -2. Configuración del proyecto (`codev.json`) -3. Directorio global de complementos (`~/.config/codev/plugins/`) -4. Directorio de complementos del proyecto (`.codev/plugins/`) - -Los paquetes npm duplicados con el mismo nombre y versión se cargan una vez. Sin embargo, un complemento local y un complemento npm con nombres similares se cargan por separado. - ---- - -## Crear un complemento - -Un complemento es un módulo **JavaScript/TypeScript** que exporta uno o más complementos. -funciones. Cada función recibe un objeto de contexto y devuelve un objeto de enlace. - ---- - -### Dependencias - -Los complementos locales y las herramientas personalizadas pueden utilizar paquetes npm externos. Agregue un `package.json` a su directorio de configuración con las dependencias que necesita. - -```json title=".codev/package.json" -{ - "dependencies": { - "shescape": "^2.1.0" - } -} -``` - -CoDev Code ejecuta `bun install` al inicio para instalarlos. Luego, sus complementos y herramientas pueden importarlos. - -```ts title=".codev/plugins/my-plugin.ts" -import { escape } from "shescape" - -export const MyPlugin = async (ctx) => { - return { - "tool.execute.before": async (input, output) => { - if (input.tool === "bash") { - output.args.command = escape(output.args.command) - } - }, - } -} -``` - ---- - -### Estructura básica - -```js title=".codev/plugins/example.js" -export const MyPlugin = async ({ project, client, $, directory, worktree }) => { - console.log("Plugin initialized!") - - return { - // Hook implementations go here - } -} -``` - -La función del complemento recibe: - -- `project`: La información actual del proyecto. -- `directory`: El directorio de trabajo actual. -- `worktree`: La ruta del árbol de trabajo de git. -- `client`: Un cliente SDK CoDev Code para interactuar con la IA. -- `$`: [shell API](https://bun.com/docs/runtime/shell) de Bun para ejecutar comandos. - ---- - -### Soporte TypeScript - -Para los complementos TypeScript, puede importar tipos desde el paquete de complementos: - -```ts title="my-plugin.ts" {1} -import type { Plugin } from "@opencode-ai/plugin" - -export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { - return { - // Type-safe hook implementations - } -} -``` - ---- - -### Eventos - -Los complementos pueden suscribirse a eventos como se ve a continuación en la sección Ejemplos. Aquí hay una lista de los diferentes eventos disponibles. - -#### Eventos de comando - -- `command.executed` - -#### Eventos de archivo - -- `file.edited` -- `file.watcher.updated` - -#### Eventos de instalación - -- `installation.updated` - -#### Eventos LSP - -- `lsp.client.diagnostics` -- `lsp.updated` - -#### Eventos de mensajes - -- `message.part.removed` -- `message.part.updated` -- `message.removed` -- `message.updated` - -#### Eventos de permiso - -- `permission.asked` -- `permission.replied` - -#### Eventos del servidor - -- `server.connected` - -#### Eventos de sesión - -- `session.created` -- `session.compacted` -- `session.deleted` -- `session.diff` -- `session.error` -- `session.idle` -- `session.status` -- `session.updated` - -#### Eventos de Todo - -- `todo.updated` - -#### Eventos de Shell - -- `shell.env` - -#### Eventos de herramientas - -- `tool.execute.after` -- `tool.execute.before` - -#### Eventos TUI - -- `tui.prompt.append` -- `tui.command.execute` -- `tui.toast.show` - ---- - -## Ejemplos - -A continuación se muestran algunos ejemplos de complementos que puede utilizar para ampliar CoDev Code. - ---- - -### Enviar notificaciones - -Enviar notificaciones cuando ocurran ciertos eventos: - -```js title=".codev/plugins/notification.js" -export const NotificationPlugin = async ({ project, client, $, directory, worktree }) => { - return { - event: async ({ event }) => { - // Send notification on session completion - if (event.type === "session.idle") { - await $`osascript -e 'display notification "Session completed!" with title "opencode"'` - } - }, - } -} -``` - -Estamos usando `osascript` para ejecutar AppleScript en macOS. Aquí lo estamos usando para enviar notificaciones. - -:::note -Si está utilizando la aplicación de escritorio CoDev Code, puede enviar notificaciones del sistema automáticamente cuando una respuesta esté lista o cuando se produzca un error en una sesión. -::: - ---- - -### Protección .env - -Evite que CoDev Code lea archivos `.env`: - -```javascript title=".codev/plugins/env-protection.js" -export const EnvProtection = async ({ project, client, $, directory, worktree }) => { - return { - "tool.execute.before": async (input, output) => { - if (input.tool === "read" && output.args.filePath.includes(".env")) { - throw new Error("Do not read .env files") - } - }, - } -} -``` - ---- - -### Inyectar variables de entorno - -Inyecte variables de entorno en toda la ejecución del shell (herramientas de inteligencia artificial y terminales de usuario): - -```javascript title=".codev/plugins/inject-env.js" -export const InjectEnvPlugin = async () => { - return { - "shell.env": async (input, output) => { - output.env.MY_API_KEY = "secret" - output.env.PROJECT_ROOT = input.cwd - }, - } -} -``` - ---- - -### Herramientas personalizadas - -Los complementos también pueden agregar herramientas personalizadas a CoDev Code: - -```ts title=".codev/plugins/custom-tools.ts" -import { type Plugin, tool } from "@opencode-ai/plugin" - -export const CustomToolsPlugin: Plugin = async (ctx) => { - return { - tool: { - mytool: tool({ - description: "This is a custom tool", - args: { - foo: tool.schema.string(), - }, - async execute(args, context) { - const { directory, worktree } = context - return `Hello ${args.foo} from ${directory} (worktree: ${worktree})` - }, - }), - }, - } -} -``` - -El ayudante `tool` crea una herramienta personalizada a la que CoDev Code puede llamar. Toma una función de esquema Zod y devuelve una definición de herramienta con: - -- `description`: Qué hace la herramienta -- `args`: Esquema Zod para los argumentos de la herramienta. -- `execute`: Función que se ejecuta cuando se llama a la herramienta - -Sus herramientas personalizadas estarán disponibles para CoDev Code junto con las herramientas integradas. - -:::note -Si una herramienta de complemento utiliza el mismo nombre que una herramienta integrada, la herramienta de complemento tiene prioridad. -::: - ---- - -### Registro - -Utilice `client.app.log()` en lugar de `console.log` para el registro estructurado: - -```ts title=".codev/plugins/my-plugin.ts" -export const MyPlugin = async ({ client }) => { - await client.app.log({ - body: { - service: "my-plugin", - level: "info", - message: "Plugin initialized", - extra: { foo: "bar" }, - }, - }) -} -``` - -Niveles: `debug`, `info`, `warn`, `error`. Consulte la [documentación del SDK](https://opencode.ai/docs/sdk) para obtener más detalles. - ---- - -### Hooks de compactación - -Personalice el contexto incluido cuando se compacta una sesión: - -```ts title=".codev/plugins/compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" - -export const CompactionPlugin: Plugin = async (ctx) => { - return { - "experimental.session.compacting": async (input, output) => { - // Inject additional context into the compaction prompt - output.context.push(` -## Custom Context - -Include any state that should persist across compaction: -- Current task status -- Important decisions made -- Files being actively worked on -`) - }, - } -} -``` - -El hook `experimental.session.compacting` se activa antes de que LLM genere un resumen de continuación. Úselo para inyectar contexto específico del dominio que el mensaje de compactación predeterminado omitiría. - -También puede reemplazar completamente el mensaje de compactación configurando `output.prompt`: - -```ts title=".codev/plugins/custom-compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" - -export const CustomCompactionPlugin: Plugin = async (ctx) => { - return { - "experimental.session.compacting": async (input, output) => { - // Replace the entire compaction prompt - output.prompt = ` -You are generating a continuation prompt for a multi-agent swarm session. - -Summarize: -1. The current task and its status -2. Which files are being modified and by whom -3. Any blockers or dependencies between agents -4. The next steps to complete the work - -Format as a structured prompt that a new agent can use to resume work. -` - }, - } -} -``` - -Cuando se configura `output.prompt`, reemplaza completamente el mensaje de compactación predeterminado. En este caso, se ignora la matriz `output.context`. diff --git a/packages/web/src/content/docs/es/providers.mdx b/packages/web/src/content/docs/es/providers.mdx deleted file mode 100644 index d9ba240903..0000000000 --- a/packages/web/src/content/docs/es/providers.mdx +++ /dev/null @@ -1,1989 +0,0 @@ ---- -title: Proveedores -description: Usando cualquier proveedor LLM en CoDev Code. ---- - -import config from "../../../../config.mjs" -export const console = config.console - -CoDev Code usa el [AI SDK](https://ai-sdk.dev/) y [Models.dev](https://models.dev) para admitir **75+ proveedores LLM** y admite la ejecución de modelos locales. - -Para agregar un proveedor necesita: - -1. Agregue las claves API para el proveedor usando el comando `/connect`. -2. Configure el proveedor en su configuración CoDev Code. - ---- - -### Credenciales - -Cuando agrega las claves API de un proveedor con el comando `/connect`, se almacenan -en `~/.local/share/codev/auth.json`. - ---- - -### Configuración - -Puedes personalizar los proveedores a través de la sección `provider` en tu CoDev Code -configuración. - ---- - -#### URL base - -Puede personalizar la URL base para cualquier proveedor configurando la opción `baseURL`. Esto resulta útil cuando se utilizan servicios proxy o puntos finales personalizados. - -```json title="codev.json" {6} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "options": { - "baseURL": "https://api.anthropic.com/v1" - } - } - } -} -``` - ---- - -## OpenCode Zen - -OpenCode Zen es una lista de modelos proporcionados por el equipo OpenCode que han sido -probado y verificado para funcionar bien con CoDev Code. [Más información](/docs/zen). - -:::tip -Si eres nuevo, te recomendamos comenzar con OpenCode Zen. -::: - -1. Ejecute el comando `/connect` en TUI, seleccione opencode y diríjase a [opencode.ai/auth](https://opencode.ai/auth). - - ```txt - /connect - ``` - -2. Inicie sesión, agregue sus datos de facturación y copie su clave API. - -3. Pega tu clave API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute `/models` en TUI para ver la lista de modelos que recomendamos. - - ```txt - /models - ``` - -Funciona como cualquier otro proveedor en CoDev Code y su uso es completamente opcional. - ---- - -## OpenCode Go - -OpenCode Go es un plan de suscripción de bajo costo que brinda acceso confiable a modelos de codificación abiertos populares proporcionados por el equipo de OpenCode que han sido -probado y verificado para funcionar bien con CoDev Code. - -1. Ejecute el comando `/connect` en TUI, seleccione `OpenCode Go` y diríjase a [opencode.ai/auth](https://opencode.ai/zen). - - ```txt - /connect - ``` - -2. Inicie sesión, agregue sus datos de facturación y copie su clave API. - -3. Pegue su clave API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute `/models` en TUI para ver la lista de modelos que recomendamos. - - ```txt - /models - ``` - -Funciona como cualquier otro proveedor en CoDev Code y su uso es completamente opcional. - ---- - -## Directorio - -Veamos algunos de los proveedores en detalle. Si desea agregar un proveedor a la -lista, no dude en abrir un PR. - -:::note -¿No ves un proveedor aquí? Envíe un PR. -::: - ---- - -### 302.AI - -1. Dirígete a la [consola 302.AI](https://302.ai/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **302.AI**. - - ```txt - /connect - ``` - -3. Ingrese su clave 302.AI API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - ---- - -### Amazon Bedrock - -Para usar Amazon Bedrock con CoDev Code: - -1. Dirígete al **Catálogo de modelos** en la consola Amazon Bedrock y solicita - Accede a los modelos que desees. - - :::consejo - Necesita tener acceso al modelo que desea en Amazon Bedrock. - ::: - -2. **Configure la autenticación** utilizando uno de los siguientes métodos: - - #### Variables de entorno (Inicio rápido) - - Establezca una de estas variables de entorno mientras ejecuta CoDev Code: - - ```bash - # Option 1: Using AWS access keys - AWS_ACCESS_KEY_ID=XXX AWS_SECRET_ACCESS_KEY=YYY codev - - # Option 2: Using named AWS profile - AWS_PROFILE=my-profile codev - - # Option 3: Using Bedrock bearer token - AWS_BEARER_TOKEN_BEDROCK=XXX codev - ``` - - O agrégalos a tu perfil de bash: - - ```bash title="~/.bash_profile" - export AWS_PROFILE=my-dev-profile - export AWS_REGION=us-east-1 - ``` - - #### Archivo de configuración (recomendado) - - Para una configuración persistente o específica del proyecto, utilice `codev.json`: - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "my-aws-profile" - } - } - } - } - ``` - - **Opciones disponibles:** - - `region` - AWS región (p. ej., `us-east-1`, `eu-west-1`) - - `profile` - AWS perfil con nombre de `~/.aws/credentials` - - `endpoint`: URL de punto de enlace personalizada para puntos de enlace de la VPC (alias para la opción genérica `baseURL`) - - :::consejo - Las opciones del archivo de configuración tienen prioridad sobre las variables de entorno. - ::: - - #### Avanzado: puntos finales de la VPC - - Si utiliza puntos de enlace de VPC para Bedrock: - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "production", - "endpoint": "https://bedrock-runtime.us-east-1.vpce-xxxxx.amazonaws.com" - } - } - } - } - ``` - - :::nota - La opción `endpoint` es un alias para la opción genérica `baseURL`, que utiliza terminología específica de AWS. Si se especifican `endpoint` y `baseURL`, `endpoint` tiene prioridad. - ::: - - #### Métodos de autenticación - - **`AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`**: Crear un usuario de IAM y generar claves de acceso en la Consola AWS - - **`AWS_PROFILE`**: Utilice perfiles con nombre de `~/.aws/credentials`. Primero configure con `aws configure --profile my-profile` o `aws sso login` - - **`AWS_BEARER_TOKEN_BEDROCK`**: Genera claves API a largo plazo desde la consola Amazon Bedrock - - **`AWS_WEB_IDENTITY_TOKEN_FILE` / `AWS_ROLE_ARN`**: Para EKS IRSA (Roles IAM para Cuentas de Servicio) u otros entornos de Kubernetes con federación OIDC. Kubernetes inyecta automáticamente estas variables de entorno cuando se utilizan anotaciones de cuentas de servicio. - - #### Prioridad de autenticación - - Amazon Bedrock utiliza la siguiente prioridad de autenticación: - 1. **Bearer token** - variable de entorno `AWS_BEARER_TOKEN_BEDROCK` o token del comando `/connect` - 2. **AWS Cadena de credenciales**: perfil, claves de acceso, credenciales compartidas, roles de IAM, tokens de identidad web (EKS IRSA), metadatos de instancia - - :::nota - Cuando se define un bearer token (a traves de `/connect` o `AWS_BEARER_TOKEN_BEDROCK`), tiene prioridad sobre todos los metodos de credenciales de AWS, incluidos los perfiles configurados. - ::: - -3. Ejecute el comando `/models` para seleccionar el modelo que desee. - - ```txt - /models - ``` - -:::note -Para perfiles de inferencia personalizados, utilice el modelo y el nombre del proveedor en la clave y establezca la propiedad `id` en arn. Esto garantiza un almacenamiento en caché correcto: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - // ... - "models": { - "anthropic-claude-sonnet-4.5": { - "id": "arn:aws:bedrock:us-east-1:xxx:application-inference-profile/yyy" - } - } - } - } -} -``` - -::: - ---- - -### Anthropic - -1. Una vez que se haya registrado, ejecute el comando `/connect` y seleccione Anthropic. - - ```txt - /connect - ``` - -2. Aquí puedes seleccionar la opción **Claude Pro/Max** y se abrirá tu navegador. - y pedirle que se autentique. - - ```txt - ┌ Select auth method - │ - │ Claude Pro/Max - │ Create an API Key - │ Manually enter API Key - └ - ``` - -3. Ahora todos los modelos Anthropic deberían estar disponibles cuando use el comando `/models`. - - ```txt - /models - ``` - -:::info -El uso de su suscripción Claude Pro/Max en CoDev Code no está oficialmente respaldado por [Anthropic](https://anthropic.com). -::: - -##### Usando las teclas API - -También puede seleccionar **Crear una clave API** si no tiene una suscripción Pro/Max. También abrirá su navegador y le pedirá que inicie sesión en Anthropic y le dará un código que puede pegar en su terminal. - -O si ya tienes una clave API, puedes seleccionar **Ingresar manualmente la clave API** y pegarla en tu terminal. - ---- - -### Atomic Chat - -Puedes configurar CoDev Code para usar modelos locales mediante [Atomic Chat](https://atomic.chat), una aplicación de escritorio que ejecuta LLMs locales detrás de un servidor API compatible con OpenAI (endpoint por defecto `http://127.0.0.1:1337/v1`). - -```json title="codev.json" "atomic-chat" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "atomic-chat": { - "npm": "@ai-sdk/openai-compatible", - "name": "Atomic Chat (local)", - "options": { - "baseURL": "http://127.0.0.1:1337/v1" - }, - "models": { - "": { - "name": "" - } - } - } - } -} -``` - -En este ejemplo: - -- `atomic-chat` es el identificador personalizado del proveedor. Puede ser cualquier cadena que quieras. -- `npm` especifica el paquete que se usará para este proveedor. Aquí se usa `@ai-sdk/openai-compatible` para cualquier API compatible con OpenAI. -- `name` es el nombre que se muestra para el proveedor en la interfaz. -- `options.baseURL` es el endpoint del servidor local. Cambia el host y el puerto según tu configuración de Atomic Chat. -- `models` es un mapa de IDs de modelos a sus nombres de pantalla. Cada ID debe coincidir con el `id` devuelto por `GET /v1/models` — ejecuta `curl http://127.0.0.1:1337/v1/models` para listar los IDs cargados actualmente en Atomic Chat. - -:::tip -Si las llamadas a herramientas no funcionan bien, elige un modelo cargado con buen soporte para tool calling (por ejemplo, una variante Qwen-Coder o DeepSeek-Coder). -::: - ---- - -### Azure OpenAI - -:::note -Si encuentra errores del tipo "Lo siento, pero no puedo ayudar con esa solicitud", intente cambiar el filtro de contenido de **DefaultV2** a **Default** en su recurso de Azure. -::: - -1. Diríjase al [portal de Azure](https://portal.azure.com/) y cree un recurso **Azure OpenAI**. Necesitarás: - - **Nombre del recurso**: esto pasa a formar parte de su punto final API (`https://RESOURCE_NAME.openai.azure.com/`) - - **Clave API**: `KEY 1` o `KEY 2` de su recurso - -2. Vaya a [Azure AI Foundry](https://ai.azure.com/) e implemente un modelo. - - :::nota - El nombre de la implementación debe coincidir con el nombre del modelo para que CoDev Code funcione correctamente. - ::: - -3. Ejecute el comando `/connect` y busque **Azure**. - - ```txt - /connect - ``` - -4. Ingrese su clave API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -5. Configure el nombre de su recurso como una variable de entorno: - - ```bash - AZURE_RESOURCE_NAME=XXX codev - ``` - - O agrégalo a tu perfil de bash: - - ```bash title="~/.bash_profile" - export AZURE_RESOURCE_NAME=XXX - ``` - -6. Ejecute el comando `/models` para seleccionar su modelo implementado. - - ```txt - /models - ``` - ---- - -### Servicios cognitivos de Azure - -1. Diríjase al [portal de Azure](https://portal.azure.com/) y cree un recurso **Azure OpenAI**. Necesitarás: - - **Nombre del recurso**: esto pasa a formar parte de su punto final API (`https://AZURE_COGNITIVE_SERVICES_RESOURCE_NAME.cognitiveservices.azure.com/`) - - **Clave API**: `KEY 1` o `KEY 2` de su recurso - -2. Vaya a [Azure AI Foundry](https://ai.azure.com/) e implemente un modelo. - - :::nota - El nombre de la implementación debe coincidir con el nombre del modelo para que CoDev Code funcione correctamente. - ::: - -3. Ejecute el comando `/connect` y busque **Azure Cognitive Services**. - - ```txt - /connect - ``` - -4. Ingrese su clave API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -5. Configure el nombre de su recurso como una variable de entorno: - - ```bash - AZURE_COGNITIVE_SERVICES_RESOURCE_NAME=XXX codev - ``` - - O agrégalo a tu perfil de bash: - - ```bash title="~/.bash_profile" - export AZURE_COGNITIVE_SERVICES_RESOURCE_NAME=XXX - ``` - -6. Ejecute el comando `/models` para seleccionar su modelo implementado. - - ```txt - /models - ``` - ---- - -### Baseten - -1. Dirígete a [Baseten](https://app.baseten.co/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **Baseten**. - - ```txt - /connect - ``` - -3. Ingrese su clave Baseten API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - ---- - -### Cerebras - -1. Dirígete a la [consola Cerebras](https://inference.cerebras.ai/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **Cerebras**. - - ```txt - /connect - ``` - -3. Ingrese su clave Cerebras API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Qwen 3 Coder 480B_. - - ```txt - /models - ``` - ---- - -### Cloudflare AI Gateway - -Cloudflare AI Gateway le permite acceder a modelos de OpenAI, Anthropic, Workers AI y más a través de un punto final unificado. Con [Facturación unificada](https://developers.cloudflare.com/ai-gateway/features/unified-billing/) no necesita claves API independientes para cada proveedor. - -1. Dirígete al [panel de Cloudflare](https://dash.cloudflare.com/), navega hasta **AI** > **AI Gateway** y crea una nueva puerta de enlace. - -2. Configure su ID de cuenta y su ID de puerta de enlace como variables de entorno. - - ```bash title="~/.bash_profile" - export CLOUDFLARE_ACCOUNT_ID=your-32-character-account-id - export CLOUDFLARE_GATEWAY_ID=your-gateway-id - ``` - -3. Ejecute el comando `/connect` y busque **Cloudflare AI Gateway**. - - ```txt - /connect - ``` - -4. Ingrese su token API de Cloudflare. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - - O configúrelo como una variable de entorno. - - ```bash title="~/.bash_profile" - export CLOUDFLARE_API_TOKEN=your-api-token - ``` - -5. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - - También puede agregar modelos a través de su configuración CoDev Code. - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "cloudflare-ai-gateway": { - "models": { - "openai/gpt-4o": {}, - "anthropic/claude-sonnet-4": {} - } - } - } - } - ``` - ---- - -### Córtecs - -1. Dirígete a la [consola de Cortecs](https://cortecs.ai/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **Cortecs**. - - ```txt - /connect - ``` - -3. Ingrese su clave Cortecs API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### DeepSeek - -1. Dirígete a la [consola de DeepSeek](https://platform.deepseek.com/), crea una cuenta y haz clic en **Crear nueva clave API**. - -2. Ejecute el comando `/connect` y busque **DeepSeek**. - - ```txt - /connect - ``` - -3. Ingrese su clave DeepSeek API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo de DeepSeek como _DeepSeek V4 Pro_. - - ```txt - /models - ``` - ---- - -### Deep Infra - -1. Dirígete al [panel de Deep Infra](https://deepinfra.com/dash), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **Deep Infra**. - - ```txt - /connect - ``` - -3. Ingrese su clave Deep Infra API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - ---- - -### FrogBot - -1. Dirígete al [Panel de frogbot](https://app.frogbot.ai/signup), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **FrogBot**. - - ```txt - /connect - ``` - -3. Ingrese su clave de frogbot API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - ---- - -### Fireworks AI - -1. Dirígete a la [Consola de Fireworks AI](https://app.fireworks.ai/), crea una cuenta y haz clic en **Crear clave API**. - -2. Ejecute el comando `/connect` y busque **Fireworks AI**. - - ```txt - /connect - ``` - -3. Ingrese su clave API de AI de Fireworks. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### GitLab Duo - -GitLab Duo proporciona chat agente basado en IA con capacidades de llamada de herramientas nativas a través del proxy Anthropic de GitLab. - -1. Ejecute el comando `/connect` y seleccione GitLab. - - ```txt - /connect - ``` - -2. Elija su método de autenticación: - - ```txt - ┌ Select auth method - │ - │ OAuth (Recommended) - │ Personal Access Token - │ - └ - ``` - - #### Usando OAuth (recomendado) - - Seleccione **OAuth** y su navegador se abrirá para autorización. - - #### Uso del token de acceso personal - 1. Vaya a [GitLab Configuración de usuario > Tokens de acceso](https://gitlab.com/-/user_settings/personal_access_tokens) - 2. Haga clic en **Agregar nuevo token** - 3. Nombre: `CoDev Code`, Alcances: `api` - 4. Copie el token (comienza con `glpat-`) - 5. Introdúcelo en la terminal. - -3. Ejecute el comando `/models` para ver los modelos disponibles. - - ```txt - /models - ``` - - Hay tres modelos basados ​​en Claude disponibles: - - **duo-chat-haiku-4-5** (predeterminado) - Respuestas rápidas para tareas rápidas - - **duo-chat-sonnet-4-5** - Rendimiento equilibrado para la mayoría de los flujos de trabajo - - **duo-chat-opus-4-5** - Más capaz para análisis complejos - -:::note -También puede especificar la variable de entorno 'GITLAB_TOKEN' si no desea -para almacenar el token en el almacenamiento de autenticación CoDev Code. -::: - -##### Autohospedado GitLab - -:::note[nota de cumplimiento] -CoDev Code utiliza un modelo pequeño para algunas tareas de IA, como generar el título de la sesión. -Está configurado para usar gpt-5-nano de forma predeterminada, alojado por Zen. Para bloquear CoDev Code -Para usar solo su propia instancia alojada en GitLab, agregue lo siguiente a su -Archivo `codev.json`. También se recomienda desactivar el uso compartido de sesiones. - -```json -{ - "$schema": "https://opencode.ai/config.json", - "small_model": "gitlab/duo-chat-haiku-4-5", - "share": "disabled" -} -``` - -::: - -Para instancias GitLab autohospedadas: - -```bash -export GITLAB_INSTANCE_URL=https://gitlab.company.com -export GITLAB_TOKEN=glpat-... -``` - -Si su instancia ejecuta una puerta de enlace AI personalizada: - -```bash -GITLAB_AI_GATEWAY_URL=https://ai-gateway.company.com -``` - -O agregue a su perfil de bash: - -```bash title="~/.bash_profile" -export GITLAB_INSTANCE_URL=https://gitlab.company.com -export GITLAB_AI_GATEWAY_URL=https://ai-gateway.company.com -export GITLAB_TOKEN=glpat-... -``` - -:::note -Su administrador GitLab debe habilitar lo siguiente: - -1. [Plataforma de agente Duo](https://docs.gitlab.com/user/duo_agent_platform/turn_on_off/) para el usuario, grupo o instancia -2. Indicadores de funciones (a través de la consola Rails): - - `agent_platform_claude_code` - - `third_party_agents_enabled` - ::: - -##### OAuth para instancias autohospedadas - -Para que Oauth funcione para su instancia autohospedada, debe crear -una nueva aplicación (Configuración → Aplicaciones) con el -URL de devolución de llamada `http://127.0.0.1:8080/callback` y siguientes ámbitos: - -- api (Acceda al API en su nombre) -- read_user (Lee tu información personal) -- read_repository (Permite acceso de solo lectura al repositorio) - -Luego exponga el ID de la aplicación como variable de entorno: - -```bash -export GITLAB_OAUTH_CLIENT_ID=your_application_id_here -``` - -Más documentación en la página de inicio de [opencode-gitlab-auth](https://www.npmjs.com/package/opencode-gitlab-auth). - -##### Configuración - -Personalizar a través de `codev.json`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "gitlab": { - "options": { - "instanceUrl": "https://gitlab.com" - } - } - } -} -``` - -##### Herramientas de API de GitLab (opcionales, pero muy recomendables) - -Para acceder a herramientas GitLab (solicitudes de fusión, problemas, canalizaciones, CI/CD, etc.): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-gitlab-plugin"] -} -``` - -Este complemento proporciona capacidades integrales de administración del repositorio GitLab que incluyen revisiones de MR, seguimiento de problemas, monitoreo de canalizaciones y más. - ---- - -### GitHub Copilot - -Para utilizar su suscripción GitHub Copilot con CoDev Code: - -:::note -Algunos modelos pueden necesitar un [Pro+ -suscripción](https://github.com/features/copilot/plans) para usar. -::: - -1. Ejecute el comando `/connect` y busque GitHub Copilot. - - ```txt - /connect - ``` - -2. Navegue hasta [github.com/login/device](https://github.com/login/device) e ingrese el código. - - ```txt - ┌ Login with GitHub Copilot - │ - │ https://github.com/login/device - │ - │ Enter code: 8F43-6FCF - │ - │ - └ Waiting for authorization... - ``` - -3. Ahora ejecute el comando `/models` para seleccionar el modelo que desea. - - ```txt - /models - ``` - ---- - -### Google Vertex AI - -Para utilizar Google Vertex AI con CoDev Code: - -1. Dirígete a **Model Garden** en Google Cloud Console y verifica el - Modelos disponibles en su región. - - :::note - Debes tener un proyecto de Google Cloud con Vertex AI API habilitado. - ::: - -2. Establezca las variables de entorno requeridas: - - `GOOGLE_CLOUD_PROJECT`: tu ID de proyecto de Google Cloud - - `VERTEX_LOCATION` (opcional): la región para Vertex AI (por defecto es `global`) - - Autenticación (elija una): - - `GOOGLE_APPLICATION_CREDENTIALS`: ruta al archivo clave JSON de su cuenta de servicio - - Autenticar usando gcloud CLI: `gcloud auth application-default login` - - Configúrelos mientras ejecuta CoDev Code. - - ```bash - GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json GOOGLE_CLOUD_PROJECT=your-project-id codev - ``` - - O agréguelos a su perfil de bash. - - ```bash title="~/.bash_profile" - export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json - export GOOGLE_CLOUD_PROJECT=your-project-id - export VERTEX_LOCATION=global - ``` - -:::tip -La región `global` mejora la disponibilidad y reduce los errores sin costo adicional. Utilice puntos finales regionales (por ejemplo, `us-central1`) para los requisitos de residencia de datos. [Más información](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models#regional_and_global_endpoints) -::: - -3. Ejecute el comando `/models` para seleccionar el modelo que desee. - - ```txt - /models - ``` - ---- - -### Groq - -1. Dirígete a la [consola Groq](https://console.groq.com/), haz clic en **Crear clave API** y copia la clave. - -2. Ejecute el comando `/connect` y busque Groq. - - ```txt - /connect - ``` - -3. Ingrese la clave API para el proveedor. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar el que desee. - - ```txt - /models - ``` - ---- - -### Hugging Face - -[Hugging Face Inference Providers](https://huggingface.co/docs/inference-providers) proporciona acceso a modelos abiertos compatibles con más de 17 proveedores. - -1. Ve a [Hugging Face settings](https://huggingface.co/settings/tokens/new?ownUserPermissions=inference.serverless.write&tokenType=fineGrained) para crear un token con permisos para llamar a inference providers. - -2. Ejecute el comando `/connect` y busque **Hugging Face**. - - ```txt - /connect - ``` - -3. Ingresa tu token de Hugging Face. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Kimi-K2-Instruct_ o _GLM-4.6_. - - ```txt - /models - ``` - ---- - -### Helicone - -[Helicone](https://helicone.ai) es una plataforma de observabilidad LLM que proporciona registro, monitoreo y análisis para sus aplicaciones de IA. Helicone AI Gateway enruta sus solicitudes al proveedor apropiado automáticamente según el modelo. - -1. Dirígete a [Helicone](https://helicone.ai), crea una cuenta y genera una clave API desde tu panel. - -2. Ejecute el comando `/connect` y busque **Helicone**. - - ```txt - /connect - ``` - -3. Ingrese su clave Helicone API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - -Para obtener más proveedores y funciones avanzadas como almacenamiento en caché y limitación de velocidad, consulte la [documentación de Helicone](https://docs.helicone.ai). - -#### Configuraciones opcionales - -En caso de que vea una característica o modelo de Helicone que no esté configurado automáticamente a través de CoDev Code, siempre podrá configurarlo usted mismo. - -Aquí está el [Directorio de modelos de Helicone](https://helicone.ai/models), lo necesitará para obtener las ID de los modelos que desea agregar. - -```jsonc title="~/.config/codev/codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "helicone": { - "npm": "@ai-sdk/openai-compatible", - "name": "Helicone", - "options": { - "baseURL": "https://ai-gateway.helicone.ai", - }, - "models": { - "gpt-4o": { - // Model ID (from Helicone's model directory page) - "name": "GPT-4o", // Your own custom name for the model - }, - "claude-sonnet-4-20250514": { - "name": "Claude Sonnet 4", - }, - }, - }, - }, -} -``` - -#### Encabezados personalizados - -Helicone admite encabezados personalizados para funciones como almacenamiento en caché, seguimiento de usuarios y gestión de sesiones. Agréguelos a la configuración de su proveedor usando `options.headers`: - -```jsonc title="~/.config/codev/codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "helicone": { - "npm": "@ai-sdk/openai-compatible", - "name": "Helicone", - "options": { - "baseURL": "https://ai-gateway.helicone.ai", - "headers": { - "Helicone-Cache-Enabled": "true", - "Helicone-User-Id": "opencode", - }, - }, - }, - }, -} -``` - -##### Seguimiento de sesión - -La función [Sesiones](https://docs.helicone.ai/features/sessions) de Helicone le permite agrupar solicitudes LLM relacionadas. Utilice el complemento [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) para registrar automáticamente cada conversación CoDev Code como una sesión en Helicone. - -```bash -npm install -g opencode-helicone-session -``` - -Agréguelo a su configuración. - -```json title="codev.json" -{ - "plugin": ["opencode-helicone-session"] -} -``` - -El complemento inyecta encabezados `Helicone-Session-Id` y `Helicone-Session-Name` en sus solicitudes. En la página Sesiones de Helicone, verá cada conversación CoDev Code enumerada como una sesión separada. - -##### Cabeceras comunes de Helicone - -| Encabezado | Descripción | -| -------------------------- | --------------------------------------------------------------------------------- | -| `Helicone-Cache-Enabled` | Habilitar el almacenamiento en caché de respuestas (`true`/`false`) | -| `Helicone-User-Id` | Seguimiento de métricas por usuario | -| `Helicone-Property-[Name]` | Agregar propiedades personalizadas (por ejemplo, `Helicone-Property-Environment`) | -| `Helicone-Prompt-Id` | Solicitudes asociadas con versiones rápidas | - -Consulte el [Directorio de encabezados de Helicone](https://docs.helicone.ai/helicone-headers/header-directory) para conocer todos los encabezados disponibles. - ---- - -### llama.cpp - -Puede configurar CoDev Code para usar modelos locales a través de la utilidad llama-server de [llama.cpp](https://github.com/ggml-org/llama.cpp) - -```json title="codev.json" "llama.cpp" {5, 6, 8, 10-15} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "llama.cpp": { - "npm": "@ai-sdk/openai-compatible", - "name": "llama-server (local)", - "options": { - "baseURL": "http://127.0.0.1:8080/v1" - }, - "models": { - "qwen3-coder:a3b": { - "name": "Qwen3-Coder: a3b-30b (local)", - "limit": { - "context": 128000, - "output": 65536 - } - } - } - } - } -} -``` - -En este ejemplo: - -- `llama.cpp` es el ID del proveedor personalizado. Puede ser cualquier cadena que desees. -- `npm` especifica el paquete que se utilizará para este proveedor. Aquí, `@ai-sdk/openai-compatible` se utiliza para cualquier OpenAI compatible con API. -- `name` es el nombre para mostrar del proveedor en la interfaz de usuario. -- `options.baseURL` es el punto final del servidor local. -- `models` es un mapa de ID de modelo para sus configuraciones. El nombre del modelo se mostrará en la lista de selección de modelos. - ---- - -### IO.NET - -IO.NET ofrece 17 modelos optimizados para varios casos de uso: - -1. Dirígete a la [consola IO.NET](https://ai.io.net/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **IO.NET**. - - ```txt - /connect - ``` - -3. Ingrese su clave IO.NET API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - ---- - -### LM Studio - -Puede configurar CoDev Code para usar modelos locales a través de LM Studio. - -```json title="codev.json" "lmstudio" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "lmstudio": { - "npm": "@ai-sdk/openai-compatible", - "name": "LM Studio (local)", - "options": { - "baseURL": "http://127.0.0.1:1234/v1" - }, - "models": { - "google/gemma-3n-e4b": { - "name": "Gemma 3n-e4b (local)" - } - } - } - } -} -``` - -En este ejemplo: - -- `lmstudio` es el ID del proveedor personalizado. Puede ser cualquier cadena que desees. -- `npm` especifica el paquete que se utilizará para este proveedor. Aquí, `@ai-sdk/openai-compatible` se utiliza para cualquier OpenAI compatible con API. -- `name` es el nombre para mostrar del proveedor en la interfaz de usuario. -- `options.baseURL` es el punto final del servidor local. -- `models` es un mapa de ID de modelo para sus configuraciones. El nombre del modelo se mostrará en la lista de selección de modelos. - ---- - -### Moonshot AI - -Para usar Kimi K2 de Moonshot AI: - -1. Dirígete a la [consola Moonshot AI](https://platform.moonshot.ai/console), crea una cuenta y haz clic en **Crear clave API**. - -2. Ejecute el comando `/connect` y busque **Moonshot AI**. - - ```txt - /connect - ``` - -3. Ingrese su clave Moonshot API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar _Kimi K2_. - - ```txt - /models - ``` - ---- - -### MiniMax - -1. Dirígete a la [Consola MiniMax API](https://platform.minimax.io/login), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **MiniMax**. - - ```txt - /connect - ``` - -3. Ingrese su clave MiniMax API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _M2.1_. - - ```txt - /models - ``` - ---- - -### Nebius Token Factory - -1. Dirígete a la [consola de Nebius Token Factory](https://tokenfactory.nebius.com/), crea una cuenta y haz clic en **Agregar clave**. - -2. Ejecute el comando `/connect` y busque **Nebius Token Factory**. - - ```txt - /connect - ``` - -3. Ingrese su clave API de Nebius Token Factory. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### Ollama - -Puedes configurar CoDev Code para usar modelos locales a través de Ollama. - -:::tip -Ollama puede configurarse automáticamente para CoDev Code. Consulte los [documentos de integración de Ollama](https://docs.ollama.com/integrations/opencode) para obtener más detalles. -::: - -```json title="codev.json" "ollama" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "ollama": { - "npm": "@ai-sdk/openai-compatible", - "name": "Ollama (local)", - "options": { - "baseURL": "http://localhost:11434/v1" - }, - "models": { - "llama2": { - "name": "Llama 2" - } - } - } - } -} -``` - -En este ejemplo: - -- `ollama` es el ID del proveedor personalizado. Puede ser cualquier cadena que desees. -- `npm` especifica el paquete que se utilizará para este proveedor. Aquí, `@ai-sdk/openai-compatible` se utiliza para cualquier OpenAI compatible con API. -- `name` es el nombre para mostrar del proveedor en la interfaz de usuario. -- `options.baseURL` es el punto final del servidor local. -- `models` es un mapa de ID de modelo para sus configuraciones. El nombre del modelo se mostrará en la lista de selección de modelos. - -:::tip -Si las llamadas a herramientas no funcionan, intente aumentar `num_ctx` en Ollama. Comience alrededor de 16k - 32k. -::: - ---- - -### Ollama Cloud - -Para usar Ollama Cloud con CoDev Code: - -1. Dirígete a [https://ollama.com/](https://ollama.com/) e inicia sesión o crea una cuenta. - -2. Vaya a **Configuración** > **Claves** y haga clic en **Agregar clave API** para generar una nueva clave API. - -3. Copie la clave API para usarla en CoDev Code. - -4. Ejecute el comando `/connect` y busque **Ollama Cloud**. - - ```txt - /connect - ``` - -5. Ingrese su clave Ollama Cloud API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -6. **Importante**: Antes de usar modelos en la nube en CoDev Code, debe obtener la información del modelo localmente: - - ```bash - ollama pull gpt-oss:20b-cloud - ``` - -7. Ejecute el comando `/models` para seleccionar su modelo de Ollama Cloud. - - ```txt - /models - ``` - ---- - -### OpenAI - -Recomendamos registrarse en [ChatGPT Plus o Pro](https://chatgpt.com/pricing). - -1. Una vez que se haya registrado, ejecute el comando `/connect` y seleccione OpenAI. - - ```txt - /connect - ``` - -2. Aquí puedes seleccionar la opción **ChatGPT Plus/Pro** y se abrirá tu navegador. - y pedirle que se autentique. - - ```txt - ┌ Select auth method - │ - │ ChatGPT Plus/Pro - │ Manually enter API Key - │ - └ - ``` - -3. Ahora todos los modelos OpenAI deberían estar disponibles cuando use el comando `/models`. - - ```txt - /models - ``` - -##### Usando las teclas API - -Si ya tiene una clave API, puede seleccionar **Ingresar manualmente la clave API** y pegarla en su terminal. - ---- - -### OpenCode Zen - -OpenCode Zen es una lista de modelos probados y verificados proporcionada por el equipo OpenCode. [Más información](/docs/zen). - -1. Inicie sesión en **OpenCode Zen** y haga clic en **Crear API clave**. - -2. Ejecute el comando `/connect` y busque **OpenCode Zen**. - - ```txt - /connect - ``` - -3. Ingrese su clave CoDev Code API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Qwen 3 Coder 480B_. - - ```txt - /models - ``` - ---- - -### OpenRouter - -1. Dirígete al [panel de OpenRouter](https://openrouter.ai/settings/keys), haz clic en **Crear clave API** y copia la clave. - -2. Ejecute el comando `/connect` y busque OpenRouter. - - ```txt - /connect - ``` - -3. Ingrese la clave API para el proveedor. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Muchos modelos de OpenRouter están precargados de forma predeterminada, ejecute el comando `/models` para seleccionar el que desee. - - ```txt - /models - ``` - - También puede agregar modelos adicionales a través de su configuración CoDev Code. - - ```json title="codev.json" {6} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "openrouter": { - "models": { - "somecoolnewmodel": {} - } - } - } - } - ``` - -5. También puedes personalizarlos a través de tu configuración CoDev Code. A continuación se muestra un ejemplo de cómo especificar un proveedor. - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "openrouter": { - "models": { - "moonshotai/kimi-k2": { - "options": { - "provider": { - "order": ["baseten"], - "allow_fallbacks": false - } - } - } - } - } - } - } - ``` - ---- - -### SAP AI Core - -SAP AI Core brinda acceso a más de 40 modelos de OpenAI, Anthropic, Google, Amazon, Meta, Mistral y AI21 a través de una plataforma unificada. - -1. Vaya a su [SAP BTP Cockpit](https://account.hana.ondemand.com/), navegue hasta su instancia de servicio SAP AI Core y cree una clave de servicio. - - :::consejo - La clave de servicio es un objeto JSON que contiene `clientid`, `clientsecret`, `url` y `serviceurls.AI_API_URL`. Puede encontrar su instancia de AI Core en **Servicios** > **Instancias y suscripciones** en BTP Cockpit. - ::: - -2. Ejecute el comando `/connect` y busque **SAP AI Core**. - - ```txt - /connect - ``` - -3. Ingrese su clave de servicio JSON. - - ```txt - ┌ Service key - │ - │ - └ enter - ``` - - O configure la variable de entorno `AICORE_SERVICE_KEY`: - - ```bash - AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' codev - ``` - - O agrégalo a tu perfil de bash: - - ```bash title="~/.bash_profile" - export AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' - ``` - -4. Opcionalmente, configure el ID de implementación y el grupo de recursos: - - ```bash - AICORE_DEPLOYMENT_ID=your-deployment-id AICORE_RESOURCE_GROUP=your-resource-group codev - ``` - - :::note - Estas configuraciones son opcionales y deben configurarse de acuerdo con su configuración de SAP AI Core. - ::: - -5. Ejecute el comando `/models` para seleccionar entre más de 40 modelos disponibles. - - ```txt - /models - ``` - ---- - -### STACKIT - -STACKIT AI Model Serving proporciona un entorno de alojamiento soberano totalmente gestionado para modelos de IA, centrándose en LLM como Llama, Mistral y Qwen, con máxima soberanía de datos en infraestructura europea. - -1. Diríjase al [Portal STACKIT](https://portal.stackit.cloud), navegue hasta **AI Model Serving** y cree un token de autenticación para su proyecto. - - :::tip - Necesita una cuenta de cliente STACKIT, una cuenta de usuario y un proyecto antes de crear tokens de autenticación. - ::: - -2. Ejecute el comando `/connect` y busque **STACKIT**. - - ```txt - /connect - ``` - -3. Ingrese su token de autenticación de STACKIT AI Model Serving. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar entre los modelos disponibles como _Qwen3-VL 235B_ o _Llama 3.3 70B_. - - ```txt - /models - ``` - ---- - -### OVHcloud AI Endpoints - -1. Dirígete al [panel de OVHcloud](https://ovh.com/manager). Navegue a la sección `Public Cloud`, `AI & Machine Learning` > `AI Endpoints` y en la pestaña `API Keys`, haga clic en **Crear una nueva clave API**. - -2. Ejecute el comando `/connect` y busque **OVHcloud AI Endpoints**. - - ```txt - /connect - ``` - -3. Introduzca la clave API de sus OVHcloud AI Endpoints. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _gpt-oss-120b_. - - ```txt - /models - ``` - ---- - -### Scaleway - -Para utilizar [API generativas de Scaleway](https://www.scaleway.com/en/docs/generative-apis/) con CoDev Code: - -1. Dirígete a la [Configuración de IAM de la consola Scaleway](https://console.scaleway.com/iam/api-keys) para generar una nueva clave API. - -2. Ejecute el comando `/connect` y busque **Scaleway**. - - ```txt - /connect - ``` - -3. Ingrese su clave Scaleway API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _devstral-2-123b-instruct-2512_ o _gpt-oss-120b_. - - ```txt - /models - ``` - ---- - -### Together AI - -1. Dirígete a la [consola de Together AI](https://api.together.ai), crea una cuenta y haz clic en **Agregar clave**. - -2. Ejecute el comando `/connect` y busque **Together AI**. - - ```txt - /connect - ``` - -3. Ingrese su clave Together AI API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### Venice AI - -1. Dirígete a la [consola de Venice AI](https://venice.ai), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **Venice AI**. - - ```txt - /connect - ``` - -3. Ingrese su clave Venice AI API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Llama 3.3 70B_. - - ```txt - /models - ``` - ---- - -### Vercel AI Gateway - -Vercel AI Gateway le permite acceder a modelos de OpenAI, Anthropic, Google, xAI y más a través de un punto final unificado. Los modelos se ofrecen a precio de lista sin margen de beneficio. - -1. Dirígete al [panel de Vercel](https://vercel.com/), navega hasta la pestaña **AI Gateway** y haz clic en **API claves** para crear una nueva clave API. - -2. Ejecute el comando `/connect` y busque **Vercel AI Gateway**. - - ```txt - /connect - ``` - -3. Ingrese su clave Vercel AI Gateway API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo. - - ```txt - /models - ``` - -También puede personalizar modelos a través de su configuración CoDev Code. A continuación se muestra un ejemplo de cómo especificar el orden de enrutamiento del proveedor. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "vercel": { - "models": { - "anthropic/claude-sonnet-4": { - "options": { - "order": ["anthropic", "vertex"] - } - } - } - } - } -} -``` - -Algunas opciones de enrutamiento útiles: - -| Opción | Descripción | -| ------------------- | ----------------------------------------------------------------------- | -| `order` | Secuencia de proveedores para probar | -| `only` | Restringir a proveedores específicos | -| `zeroDataRetention` | Utilice únicamente proveedores con políticas de retención de datos cero | - ---- - -### xAI - -1. Dirígete a la [consola xAI](https://console.x.ai/), crea una cuenta y genera una clave API. - -2. Ejecute el comando `/connect` y busque **xAI**. - - ```txt - /connect - ``` - -3. Ingrese su clave xAI API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _Grok Beta_. - - ```txt - /models - ``` - ---- - -### Z.AI - -1. Dirígete a la [consola Z.AI API](https://z.ai/manage-apikey/apikey-list), crea una cuenta y haz clic en **Crear una nueva clave API**. - -2. Ejecute el comando `/connect` y busque **Z.AI**. - - ```txt - /connect - ``` - - Si está suscrito al **Plan de codificación GLM**, seleccione **Plan de codificación Z.AI**. - -3. Ingrese su clave Z.AI API. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Ejecute el comando `/models` para seleccionar un modelo como _GLM-4.7_. - - ```txt - /models - ``` - ---- - -### ZenMux - -1. Dirígete al [panel de ZenMux](https://zenmux.ai/settings/keys), haz clic en **Crear clave API** y copia la clave. - -2. Ejecute el comando `/connect` y busque ZenMux. - - ```txt - /connect - ``` - -3. Ingrese la clave API para el proveedor. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Muchos modelos de ZenMux están precargados de forma predeterminada, ejecute el comando `/models` para seleccionar el que desee. - - ```txt - /models - ``` - - También puede agregar modelos adicionales a través de su configuración CoDev Code. - - ```json title="codev.json" {6} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "zenmux": { - "models": { - "somecoolnewmodel": {} - } - } - } - } - ``` - ---- - -## Proveedor personalizado - -Para agregar cualquier proveedor **compatible con OpenAI** que no aparezca en el comando `/connect`: - -:::tip -Puede utilizar cualquier proveedor compatible con OpenAI con CoDev Code. La mayoría de los proveedores de IA modernos ofrecen API compatibles con OpenAI. -::: - -1. Ejecute el comando `/connect` y desplácese hacia abajo hasta **Otro**. - - ```bash - $ /connect - - ┌ Add credential - │ - ◆ Select provider - │ ... - │ ● Other - └ - ``` - -2. Ingrese una identificación única para el proveedor. - - ```bash - $ /connect - - ┌ Add credential - │ - ◇ Enter provider id - │ myprovider - └ - ``` - - :::note - Elija una identificación memorable, la usará en su archivo de configuración. - ::: - -3. Ingrese su clave API para el proveedor. - - ```bash - $ /connect - - ┌ Add credential - │ - ▲ This only stores a credential for myprovider - you will need to configure it in codev.json, check the docs for examples. - │ - ◇ Enter your API key - │ sk-... - └ - ``` - -4. Cree o actualice su archivo `codev.json` en el directorio de su proyecto: - - ```json title="codev.json" ""myprovider"" {5-15} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "myprovider": { - "npm": "@ai-sdk/openai-compatible", - "name": "My AI ProviderDisplay Name", - "options": { - "baseURL": "https://api.myprovider.com/v1" - }, - "models": { - "my-model-name": { - "name": "My Model Display Name" - } - } - } - } - } - ``` - - Aquí están las opciones de configuración: - - **npm**: paquete AI SDK para usar, `@ai-sdk/openai-compatible` para proveedores compatibles con OpenAI - - **nombre**: nombre para mostrar en la interfaz de usuario. - - **modelos**: Modelos disponibles. - - **options.baseURL**: API URL del punto final. - - **options.apiKey**: Opcionalmente, configure la clave API, si no usa autenticación. - - **options.headers**: Opcionalmente, configure encabezados personalizados. - - Más información sobre las opciones avanzadas en el siguiente ejemplo. - -5. Ejecute el comando `/models` y su proveedor y modelos personalizados aparecerán en la lista de selección. - ---- - -##### Ejemplo - -A continuación se muestra un ejemplo de configuración de las opciones `apiKey`, `headers` y modelo `limit`. - -```json title="codev.json" {9,11,17-20} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "myprovider": { - "npm": "@ai-sdk/openai-compatible", - "name": "My AI ProviderDisplay Name", - "options": { - "baseURL": "https://api.myprovider.com/v1", - "apiKey": "{env:ANTHROPIC_API_KEY}", - "headers": { - "Authorization": "Bearer custom-token" - } - }, - "models": { - "my-model-name": { - "name": "My Model Display Name", - "limit": { - "context": 200000, - "output": 65536 - } - } - } - } - } -} -``` - -Detalles de configuración: - -- **apiKey**: se configura usando la sintaxis de la variable `env`, [más información](/docs/config#env-vars). -- **encabezados**: encabezados personalizados enviados con cada solicitud. -- **limit.context**: tokens de entrada máximos que acepta el modelo. -- **limit.output**: tokens máximos que el modelo puede generar. - -Los campos `limit` le permiten a CoDev Code comprender cuánto contexto le queda. Los proveedores estándar los extraen de models.dev automáticamente. - ---- - -## Solución de problemas - -Si tiene problemas para configurar un proveedor, verifique lo siguiente: - -1. **Verifique la configuración de autenticación**: Ejecute `codev auth list` para ver si las credenciales - para el proveedor se agregan a su configuración. - - Esto no se aplica a proveedores como Amazon Bedrock, que dependen de variables de entorno para su autenticación. - -2. Para proveedores personalizados, verifique la configuración CoDev Code y: - - Asegúrese de que el ID del proveedor utilizado en el comando `/connect` coincida con el ID en su configuración CoDev Code. - - Se utiliza el paquete npm correcto para el proveedor. Por ejemplo, utilice `@ai-sdk/cerebras` para Cerebras. Y para todos los demás proveedores compatibles con OpenAI, utilice `@ai-sdk/openai-compatible`. - - Verifique que se utilice el punto final API correcto en el campo `options.baseURL`. diff --git a/packages/web/src/content/docs/es/rules.mdx b/packages/web/src/content/docs/es/rules.mdx deleted file mode 100644 index a81c74ecce..0000000000 --- a/packages/web/src/content/docs/es/rules.mdx +++ /dev/null @@ -1,180 +0,0 @@ ---- -title: Reglas -description: Establezca instrucciones personalizadas para CoDev Code. ---- - -Puede proporcionar instrucciones personalizadas a CoDev Code creando un archivo `AGENTS.md`. Esto es similar a las reglas del Cursor. Contiene instrucciones que se incluirán en el contexto de LLM para personalizar su comportamiento para su proyecto específico. - ---- - -## Inicializar - -Para crear un nuevo archivo `AGENTS.md`, puede ejecutar el comando `/init` en CoDev Code. - -:::tip -Debes enviar el archivo `AGENTS.md` de tu proyecto a Git. -::: - -Esto escaneará su proyecto y todo su contenido para comprender de qué se trata y generar un archivo `AGENTS.md` con él. Esto ayuda a CoDev Code a navegar mejor por el proyecto. - -Si tiene un archivo `AGENTS.md` existente, intentará agregarlo. - ---- - -## Ejemplo - -También puedes crear este archivo manualmente. A continuación se muestra un ejemplo de algunas cosas que puede colocar en un archivo `AGENTS.md`. - -```markdown title="AGENTS.md" -# SST v3 Monorepo Project - -This is an SST v3 monorepo with TypeScript. The project uses bun workspaces for package management. - -## Project Structure - -- `packages/` - Contains all workspace packages (functions, core, web, etc.) -- `infra/` - Infrastructure definitions split by service (storage.ts, api.ts, web.ts) -- `sst.config.ts` - Main SST configuration with dynamic imports - -## Code Standards - -- Use TypeScript with strict mode enabled -- Shared code goes in `packages/core/` with proper exports configuration -- Functions go in `packages/functions/` -- Infrastructure should be split into logical files in `infra/` - -## Monorepo Conventions - -- Import shared modules using workspace names: `@my-app/core/example` -``` - -Estamos agregando instrucciones específicas del proyecto aquí y esto se compartirá con todo su equipo. - ---- - -## Tipos - -CoDev Code también admite la lectura del archivo `AGENTS.md` desde múltiples ubicaciones. Y esto tiene diferentes propósitos. - -### Proyecto - -Coloque un `AGENTS.md` en la raíz de su proyecto para reglas específicas del proyecto. Estos solo se aplican cuando trabaja en este directorio o sus subdirectorios. - -### Global - -También puedes tener reglas globales en un archivo `~/.config/codev/AGENTS.md`. Esto se aplica en todas las sesiones CoDev Code. - -Dado que esto no está comprometido con Git ni se comparte con su equipo, recomendamos usarlo para especificar las reglas personales que debe seguir LLM. - -### Compatibilidad con Claude Code - -Para los usuarios que migran desde Claude Code, CoDev Code admite las convenciones de archivos de Claude Code como alternativas: - -- **Reglas del proyecto**: `CLAUDE.md` en el directorio de tu proyecto (se usa si no existe `AGENTS.md`) -- **Reglas globales**: `~/.claude/CLAUDE.md` (se usa si no existe `~/.config/codev/AGENTS.md`) -- **Habilidades**: `~/.claude/skills/`; consulte [Habilidades del agente](/docs/skills/) para obtener más detalles. - -Para deshabilitar la compatibilidad de Claude Code, configure una de estas variables de entorno: - -```bash -export CODEV_DISABLE_CLAUDE_CODE=1 # Disable all .claude support -export CODEV_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md -export CODEV_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills -``` - ---- - -## Prioridad - -Cuando se inicia CoDev Code, busca archivos de reglas en este orden: - -1. **Archivos locales** atravesando desde el directorio actual (`AGENTS.md`, `CLAUDE.md`) -2. **Archivo global** en `~/.config/codev/AGENTS.md` -3. **Archivo de Claude Code** en `~/.claude/CLAUDE.md` (a menos que esté deshabilitado) - -El primer archivo coincidente gana en cada categoría. Por ejemplo, si tiene `AGENTS.md` y `CLAUDE.md`, solo se usa `AGENTS.md`. De manera similar, `~/.config/codev/AGENTS.md` tiene prioridad sobre `~/.claude/CLAUDE.md`. - ---- - -## Instrucciones personalizadas - -Puede especificar archivos de instrucciones personalizados en su `codev.json` o el `~/.config/codev/codev.json` global. Esto le permite a usted y a su equipo reutilizar las reglas existentes en lugar de tener que duplicarlas en AGENTS.md. - -Ejemplo: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["CONTRIBUTING.md", "docs/guidelines.md", ".cursor/rules/*.md"] -} -``` - -También puede utilizar URL remotas para cargar instrucciones desde la web. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["https://raw.githubusercontent.com/my-org/shared-rules/main/style.md"] -} -``` - -Las instrucciones remotas se recuperan con un tiempo de espera de 5 segundos. - -Todos los archivos de instrucciones se combinan con sus archivos `AGENTS.md`. - ---- - -## Hacer referencia a archivos externos - -Si bien CoDev Code no analiza automáticamente las referencias de archivos en `AGENTS.md`, puedes lograr una funcionalidad similar de dos maneras: - -### Usar codev.json - -El enfoque recomendado es utilizar el campo `instructions` en `codev.json`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["docs/development-standards.md", "test/testing-guidelines.md", "packages/*/AGENTS.md"] -} -``` - -### Instrucciones manuales en AGENTS.md - -Puede enseñarle a CoDev Code a leer archivos externos proporcionando instrucciones explícitas en su `AGENTS.md`. He aquí un ejemplo práctico: - -```markdown title="AGENTS.md" -# TypeScript Project Rules - -## External File Loading - -CRITICAL: When you encounter a file reference (e.g., @rules/general.md), use your Read tool to load it on a need-to-know basis. They're relevant to the SPECIFIC task at hand. - -Instructions: - -- Do NOT preemptively load all references - use lazy loading based on actual need -- When loaded, treat content as mandatory instructions that override defaults -- Follow references recursively when needed - -## Development Guidelines - -For TypeScript code style and best practices: @docs/typescript-guidelines.md -For React component architecture and hooks patterns: @docs/react-patterns.md -For REST API design and error handling: @docs/api-standards.md -For testing strategies and coverage requirements: @test/testing-guidelines.md - -## General Guidelines - -Read the following file immediately as it's relevant to all workflows: @rules/general-guidelines.md. -``` - -Este enfoque le permite: - -- Crear archivos de reglas modulares y reutilizables -- Compartir reglas entre proyectos a través de enlaces simbólicos o submódulos de git -- Mantenga AGENTS.md conciso mientras hace referencia a pautas detalladas -- Asegúrese de que CoDev Code cargue archivos solo cuando sea necesario para la tarea específica - -:::tip -Para monorepos o proyectos con estándares compartidos, usar `codev.json` con patrones globales (como `packages/*/AGENTS.md`) es más fácil de mantener que las instrucciones manuales. -::: diff --git a/packages/web/src/content/docs/es/sdk.mdx b/packages/web/src/content/docs/es/sdk.mdx deleted file mode 100644 index a7acb122ca..0000000000 --- a/packages/web/src/content/docs/es/sdk.mdx +++ /dev/null @@ -1,463 +0,0 @@ ---- -title: SDK -description: Cliente JS con seguridad de tipos para el servidor CoDev Code. ---- - -import config from "../../../../config.mjs" -export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts` - -El SDK CoDev Code JS/TS proporciona un cliente con seguridad de tipos para interactuar con el servidor. -Úselo para crear integraciones y controlar CoDev Code mediante programación. - -[Más información](/docs/server) sobre cómo funciona el servidor. Para ver ejemplos, consulte los [proyectos](/docs/ecosystem#projects) creados por la comunidad. - ---- - -## Instalar - -Instale el SDK desde npm: - -```bash -npm install @opencode-ai/sdk -``` - ---- - -## Crear cliente - -Cree una instancia de CoDev Code: - -```javascript -import { createOpencode } from "@opencode-ai/sdk" - -const { client } = await createOpencode() -``` - -Esto inicia tanto un servidor como un cliente. - -#### Opciones - -| Opción | Tipo | Descripción | Predeterminado | -| ---------- | ------------- | ----------------------------------------------- | -------------- | -| `hostname` | `string` | Nombre de host del servidor | `127.0.0.1` | -| `port` | `number` | Puerto del servidor | `4096` | -| `signal` | `AbortSignal` | Señal de aborto para cancelación | `undefined` | -| `timeout` | `number` | Tiempo de espera en ms para inicio del servidor | `5000` | -| `config` | `Config` | Objeto de configuración | `{}` | - ---- - -## Configuración - -Puede pasar un objeto de configuración para personalizar el comportamiento. La instancia aún recoge su `codev.json`, pero puede anular o agregar configuración en línea: - -```javascript -import { createOpencode } from "@opencode-ai/sdk" - -const opencode = await createOpencode({ - hostname: "127.0.0.1", - port: 4096, - config: { - model: "anthropic/claude-3-5-sonnet-20241022", - }, -}) - -console.log(`Server running at ${opencode.server.url}`) - -opencode.server.close() -``` - -## Solo cliente - -Si ya tiene una instancia en ejecución de CoDev Code, puede crear una instancia de cliente para conectarse a ella: - -```javascript -import { createOpencodeClient } from "@opencode-ai/sdk" - -const client = createOpencodeClient({ - baseUrl: "http://localhost:4096", -}) -``` - -#### Opciones - -| Opción | Tipo | Descripción | Predeterminado | -| --------------- | ---------- | -------------------------------------------- | ----------------------- | -| `baseUrl` | `string` | URL del servidor | `http://localhost:4096` | -| `fetch` | `function` | Implementación de recuperación personalizada | `globalThis.fetch` | -| `parseAs` | `string` | Método de análisis de respuesta | `auto` | -| `responseStyle` | `string` | Estilo de devolución: `data` o `fields` | `fields` | -| `throwOnError` | `boolean` | Lanzar errores en lugar de devolver | `false` | - ---- - -## Tipos - -El SDK incluye definiciones TypeScript para todos los tipos API. Importarlos directamente: - -```typescript -import type { Session, Message, Part } from "@opencode-ai/sdk" -``` - -Todos los tipos se generan a partir de la especificación OpenAPI del servidor y están disponibles en el archivo de tipos. - ---- - -## Errores - -El SDK puede generar errores que puedes detectar y manejar: - -```typescript -try { - await client.session.get({ path: { id: "invalid-id" } }) -} catch (error) { - console.error("Failed to get session:", (error as Error).message) -} -``` - ---- - -## Salida Estructurada - -Puede solicitar una salida JSON estructurada del modelo especificando un `format` con un esquema JSON. El modelo utilizará una herramienta `StructuredOutput` para devolver un JSON validado que coincida con su esquema. - -### Uso Básico - -```typescript -const result = await client.session.prompt({ - path: { id: sessionId }, - body: { - parts: [{ type: "text", text: "Research Anthropic and provide company info" }], - format: { - type: "json_schema", - schema: { - type: "object", - properties: { - company: { type: "string", description: "Company name" }, - founded: { type: "number", description: "Year founded" }, - products: { - type: "array", - items: { type: "string" }, - description: "Main products", - }, - }, - required: ["company", "founded"], - }, - }, - }, -}) - -// Access the structured output -console.log(result.data.info.structured_output) -// { company: "Anthropic", founded: 2021, products: ["Claude", "Claude API"] } -``` - -### Tipos de Formato de Salida - -| Tipo | Descripción | -| ------------- | --------------------------------------------------------------------- | -| `text` | Predeterminado. Respuesta de texto estándar (sin salida estructurada) | -| `json_schema` | Devuelve JSON validado que coincide con el esquema proporcionado | - -### Formato de Esquema JSON - -Cuando use `type: 'json_schema'`, proporcione: - -| Campo | Tipo | Descripción | -| ------------ | --------------- | ---------------------------------------------------------------- | -| `type` | `'json_schema'` | Requerido. Especifica el modo de esquema JSON | -| `schema` | `object` | Requerido. Objeto JSON Schema que define la estructura de salida | -| `retryCount` | `number` | Opcional. Número de reintentos de validación (predeterminado: 2) | - -### Manejo de Errores - -Si el modelo no logra producir una salida estructurada válida después de todos los reintentos, la respuesta incluirá un `StructuredOutputError`: - -```typescript -if (result.data.info.error?.name === "StructuredOutputError") { - console.error("Failed to produce structured output:", result.data.info.error.message) - console.error("Attempts:", result.data.info.error.retries) -} -``` - -### Mejores Prácticas - -1. **Proporcione descripciones claras** en las propiedades de su esquema para ayudar al modelo a entender qué datos extraer -2. **Use `required`** para especificar qué campos deben estar presentes -3. **Mantenga los esquemas enfocados** - los esquemas anidados complejos pueden ser más difíciles de completar correctamente para el modelo -4. **Establezca un `retryCount` apropiado** - aumente para esquemas complejos, disminuya para simples - ---- - -## API - -El SDK expone todas las API del servidor a través de un cliente con seguridad de tipos. - ---- - -### Global - -| Método | Descripción | Respuesta | -| ----------------- | --------------------------------------------- | ------------------------------------ | -| `global.health()` | Verificar el estado y la versión del servidor | `{ healthy: true, version: string }` | - ---- - -#### Ejemplos - -```javascript -const health = await client.global.health() -console.log(health.data.version) -``` - ---- - -### Aplicación - -| Método | Descripción | Respuesta | -| -------------- | ------------------------------------ | ------------------------------------------- | -| `app.log()` | Escribe una entrada de registro | `boolean` | -| `app.agents()` | Listar todos los agentes disponibles | Agent[] | - ---- - -#### Ejemplos - -```javascript -// Write a log entry -await client.app.log({ - body: { - service: "my-app", - level: "info", - message: "Operation completed", - }, -}) - -// List available agents -const agents = await client.app.agents() -``` - ---- - -### Proyecto - -| Método | Descripción | Respuesta | -| ------------------- | -------------------------- | --------------------------------------------- | -| `project.list()` | Listar todos los proyectos | Project[] | -| `project.current()` | Obtener proyecto actual | Project | - ---- - -#### Ejemplos - -```javascript -// List all projects -const projects = await client.project.list() - -// Get current project -const currentProject = await client.project.current() -``` - ---- - -### Ruta - -| Método | Descripción | Respuesta | -| ------------ | ------------------- | ---------------------------------------- | -| `path.get()` | Obtener ruta actual | Path | - ---- - -#### Ejemplos - -```javascript -// Get current path information -const pathInfo = await client.path.get() -``` - ---- - -### Configuración - -| Método | Descripción | Respuesta | -| -------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| `config.get()` | Obtener información de configuración | Config | -| `config.providers()` | Lista de proveedores y modelos predeterminados | `{ providers: `Provider[]`, default: { [key: string]: string } }` | - ---- - -#### Ejemplos - -```javascript -const config = await client.config.get() - -const { providers, default: defaults } = await client.config.providers() -``` - ---- - -### Sesiones - -| Método | Descripción | Notas | -| ---------------------------------------------------------- | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `session.list()` | Listar sesiones | Devuelve Session[] | -| `session.get({ path })` | Obtener sesión | Devuelve Session | -| `session.children({ path })` | Listar sesiones secundarias | Devuelve Session[] | -| `session.create({ body })` | Crear sesión | Devuelve Session | -| `session.delete({ path })` | Eliminar sesión | Devuelve `boolean` | -| `session.update({ path, body })` | Actualizar propiedades de sesión | Devuelve Session | -| `session.init({ path, body })` | Analizar aplicación y crear `AGENTS.md` | Devuelve `boolean` | -| `session.abort({ path })` | Cancelar una sesión en ejecución | Devuelve `boolean` | -| `session.share({ path })` | Compartir sesión | Devuelve Session | -| `session.unshare({ path })` | Dejar de compartir sesión | Devuelve Session | -| `session.summarize({ path, body })` | Resumir sesión | Devuelve `boolean` | -| `session.messages({ path })` | Listar mensajes en una sesión | Devuelve `{ info: `Message`, parts: `Part[]`}[]` | -| `session.message({ path })` | Obtener detalles del mensaje | Devuelve `{ info: `Message`, parts: `Part[]`}` | -| `session.prompt({ path, body })` | Enviar mensaje rápido | `body.noReply: true` devuelve UserMessage (solo contexto). El valor predeterminado devuelve AssistantMessage con respuesta de IA. Admite `body.outputFormat` para [salida estructurada](#salida-estructurada) | -| `session.command({ path, body })` | Enviar comando a la sesión | Devuelve `{ info: `AssistantMessage`, parts: `Part[]`}` | -| `session.shell({ path, body })` | Ejecute un comando de shell | Devuelve AssistantMessage | -| `session.revert({ path, body })` | Revertir un mensaje | Devuelve Session | -| `session.unrevert({ path })` | Restaurar mensajes revertidos | Devuelve Session | -| `postSessionByIdPermissionsByPermissionId({ path, body })` | Responder a una solicitud de permiso | Devuelve `boolean` | - ---- - -#### Ejemplos - -```javascript -// Create and manage sessions -const session = await client.session.create({ - body: { title: "My session" }, -}) - -const sessions = await client.session.list() - -// Send a prompt message -const result = await client.session.prompt({ - path: { id: session.id }, - body: { - model: { providerID: "anthropic", modelID: "claude-3-5-sonnet-20241022" }, - parts: [{ type: "text", text: "Hello!" }], - }, -}) - -// Inject context without triggering AI response (useful for plugins) -await client.session.prompt({ - path: { id: session.id }, - body: { - noReply: true, - parts: [{ type: "text", text: "You are a helpful assistant." }], - }, -}) -``` - ---- - -### Archivos - -| Método | Descripción | Respuesta | -| ------------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| `find.text({ query })` | Buscar texto en archivos | Matriz de objetos coincidentes con `path`, `lines`, `line_number`, `absolute_offset`, `submatches` | -| `find.files({ query })` | Buscar archivos y directorios por nombre | `string[]` (rutas) | -| `find.symbols({ query })` | Buscar símbolos del espacio de trabajo | Symbol[] | -| `file.read({ query })` | Leer un archivo | `{ type: "raw" \| "patch", content: string }` | -| `file.status({ query? })` | Obtener el estado de los archivos rastreados | File[] | - -`find.files` admite algunos campos de consulta opcionales: - -- `type`: `"file"` o `"directory"` -- `directory`: anula la raíz del proyecto para la búsqueda. -- `limit`: resultados máximos (1–200) - ---- - -#### Ejemplos - -```javascript -// Search and read files -const textResults = await client.find.text({ - query: { pattern: "function.*opencode" }, -}) - -const files = await client.find.files({ - query: { query: "*.ts", type: "file" }, -}) - -const directories = await client.find.files({ - query: { query: "packages", type: "directory", limit: 20 }, -}) - -const content = await client.file.read({ - query: { path: "src/index.ts" }, -}) -``` - ---- - -### TUI - -| Método | Descripción | Respuesta | -| ------------------------------ | ---------------------------------- | --------- | -| `tui.appendPrompt({ body })` | Agregar texto al mensaje | `boolean` | -| `tui.openHelp()` | Abra el cuadro de diálogo de ayuda | `boolean` | -| `tui.openSessions()` | Abrir el selector de sesiones | `boolean` | -| `tui.openThemes()` | Abra el selector de temas | `boolean` | -| `tui.openModels()` | Abrir el selector de modelo | `boolean` | -| `tui.submitPrompt()` | Enviar el mensaje actual | `boolean` | -| `tui.clearPrompt()` | Borrar el mensaje | `boolean` | -| `tui.executeCommand({ body })` | Ejecutar un comando | `boolean` | -| `tui.showToast({ body })` | Mostrar notificación del brindis | `boolean` | - ---- - -#### Ejemplos - -```javascript -// Control TUI interface -await client.tui.appendPrompt({ - body: { text: "Add this to prompt" }, -}) - -await client.tui.showToast({ - body: { message: "Task completed", variant: "success" }, -}) -``` - ---- - -### Autenticación - -| Método | Descripción | Respuesta | -| ------------------- | ---------------------------------------- | --------- | -| `auth.set({ ... })` | Establecer credenciales de autenticación | `boolean` | - ---- - -#### Ejemplos - -```javascript -await client.auth.set({ - path: { id: "anthropic" }, - body: { type: "api", key: "your-api-key" }, -}) -``` - ---- - -### Eventos - -| Método | Descripción | Respuesta | -| ------------------- | ----------------------------------------------- | ----------------------------------------------- | -| `event.subscribe()` | Transmisión de eventos enviados por el servidor | Transmisión de eventos enviados por el servidor | - ---- - -#### Ejemplos - -```javascript -// Listen to real-time events -const events = await client.event.subscribe() -for await (const event of events.stream) { - console.log("Event:", event.type, event.properties) -} -``` diff --git a/packages/web/src/content/docs/es/server.mdx b/packages/web/src/content/docs/es/server.mdx deleted file mode 100644 index 80e4433561..0000000000 --- a/packages/web/src/content/docs/es/server.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: Servidor -description: Interactuar con el servidor CoDev Code a través de HTTP. ---- - -import config from "../../../../config.mjs" -export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts` - -El comando `codev serve` ejecuta un servidor HTTP sin cabeza que expone un punto final OpenAPI que un cliente CoDev Code puede usar. - ---- - -### Uso - -```bash -codev serve [--port ] [--hostname ] [--cors ] -``` - -#### Opciones - -| Bandera | Descripción | Predeterminado | -| --------------- | ----------------------------------------------------- | ---------------- | -| `--port` | Puerto para escuchar | `4096` | -| `--hostname` | Nombre de host para escuchar | `127.0.0.1` | -| `--mdns` | Habilitar el descubrimiento de mDNS | `false` | -| `--mdns-domain` | Nombre de dominio personalizado para el servicio mDNS | `opencode.local` | -| `--cors` | Orígenes de navegador adicionales para permitir | `[]` | - -`--cors` se puede pasar varias veces: - -```bash -codev serve --cors http://localhost:5173 --cors https://app.example.com -``` - ---- - -### Autenticación - -Configure `CODEV_SERVER_PASSWORD` para proteger el servidor con autenticación básica HTTP. El nombre de usuario predeterminado es `opencode`, o configure `CODEV_SERVER_USERNAME` para anularlo. Esto se aplica tanto a `codev serve` como a `codev web`. - -```bash -CODEV_SERVER_PASSWORD=your-password codev serve -``` - ---- - -### Cómo funciona - -Cuando ejecuta `codev`, inicia un TUI y un servidor. Donde el TUI es el -Cliente que habla con el servidor. El servidor expone una especificación OpenAPI 3.1 -punto final. Este punto final también se utiliza para generar un [SDK](/docs/sdk). - -:::tip -Utilice el servidor CoDev Code para interactuar con CoDev Code mediante programación. -::: - -Esta arquitectura permite que CoDev Code admita múltiples clientes y le permite interactuar con CoDev Code mediante programación. - -Puede ejecutar `codev serve` para iniciar un servidor independiente. Si tienes el -CoDev Code TUI ejecutándose, `codev serve` iniciará un nuevo servidor. - ---- - -#### Conectarse a un servidor existente - -Cuando inicia el TUI, asigna aleatoriamente un puerto y un nombre de host. En su lugar, puede pasar `--hostname` y `--port` [banderas](/docs/cli). Luego use esto para conectarse a su servidor. - -El punto final [`/tui`](#tui) se puede utilizar para conducir el TUI a través del servidor. Por ejemplo, puede completar previamente o ejecutar un mensaje. Esta configuración es utilizada por los complementos CoDev Code [IDE](/docs/ide). - ---- - -## Especificaciones - -El servidor publica una especificación OpenAPI 3.1 que se puede ver en: - -``` -http://:/doc -``` - -Por ejemplo, `http://localhost:4096/doc`. Utilice la especificación para generar clientes o inspeccionar tipos de solicitudes y respuestas. O verlo en un explorador Swagger. - ---- - -## API - -El servidor CoDev Code expone las siguientes API. - ---- - -### Global - -| Método | Ruta | Descripción | Respuesta | -| ------ | ---------------- | ------------------------------------------- | ------------------------------------ | -| `GET` | `/global/health` | Obtener el estado y la versión del servidor | `{ healthy: true, version: string }` | -| `GET` | `/global/event` | Obtenga eventos globales (transmisión SSE) | Flujo de eventos | - ---- - -### Proyecto - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------------------ | -------------------------- | --------------------------------------------- | -| `GET` | `/project` | Listar todos los proyectos | Project[] | -| `GET` | `/project/current` | Obtener el proyecto actual | Project | - ---- - -### Ruta y VCS - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------- | -------------------------------------------------- | ------------------------------------------- | -| `GET` | `/path` | Obtener la ruta actual | Path | -| `GET` | `/vcs` | Obtenga información de VCS para el proyecto actual | VcsInfo | - ---- - -### Instancia - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------------------- | ---------------------------- | --------- | -| `POST` | `/instance/dispose` | Eliminar la instancia actual | `boolean` | - ---- - -### Configuración - -| Método | Ruta | Descripción | Respuesta | -| ------- | ------------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------- | -| `GET` | `/config` | Obtener información de configuración | Config | -| `PATCH` | `/config` | Actualizar configuración | Config | -| `GET` | `/config/providers` | Lista de proveedores y modelos predeterminados | `{ providers: `Proveedor[]`, default: { [key: string]: string } }` | - ---- - -### Proveedor - -| Método | Ruta | Descripción | Respuesta | -| ------ | -------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------ | -| `GET` | `/provider` | Listar todos los proveedores | `{ all: `Proveedor[]`, default: {...}, connected: string[] }` | -| `GET` | `/provider/auth` | Obtener métodos de autenticación de proveedores | `{ [providerID: string]: `ProviderAuthMethod[]` }` | -| `POST` | `/provider/{id}/oauth/authorize` | Autorizar a un proveedor usando OAuth | ProviderAuthAuthorization | -| `POST` | `/provider/{id}/oauth/callback` | Manejar la devolución de llamada OAuth para un proveedor | `boolean` | - ---- - -### Sesiones - -| Método | Ruta | Descripción | Notas | -| -------- | ---------------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------- | -| `GET` | `/session` | Listar todas las sesiones | Devuelve Session[] | -| `POST` | `/session` | Crear una nueva sesión | cuerpo: `{ parentID?, title? }`, devuelve Session | -| `GET` | `/session/status` | Obtener el estado de la sesión para todas las sesiones | Devuelve `{ [sessionID: string]: `SessionStatus` }` | -| `GET` | `/session/:id` | Obtener detalles de la sesión | Devuelve Session | -| `DELETE` | `/session/:id` | Eliminar una sesión y todos sus datos | Devuelve `boolean` | -| `PATCH` | `/session/:id` | Actualizar propiedades de sesión | cuerpo: `{ title? }`, devuelve Session | -| `GET` | `/session/:id/children` | Obtener las sesiones secundarias de una sesión | Devuelve Session[] | -| `GET` | `/session/:id/todo` | Obtener la lista de tareas pendientes para una sesión | Devuelve Todo[] | -| `POST` | `/session/:id/init` | Analizar aplicación y crear `AGENTS.md` | cuerpo: `{ messageID, providerID, modelID }`, devuelve `boolean` | -| `POST` | `/session/:id/fork` | Bifurca una sesión existente en un mensaje | cuerpo: `{ messageID? }`, devuelve Session | -| `POST` | `/session/:id/abort` | Cancelar una sesión en ejecución | Devuelve `boolean` | -| `POST` | `/session/:id/share` | Compartir una sesión | Devuelve Session | -| `DELETE` | `/session/:id/share` | Dejar de compartir una sesión | Devuelve Session | -| `GET` | `/session/:id/diff` | Obtenga la diferencia para esta sesión | consulta: `messageID?`, devuelve FileDiff[] | -| `POST` | `/session/:id/summarize` | Resumir la sesión | cuerpo: `{ providerID, modelID }`, devuelve `boolean` | -| `POST` | `/session/:id/revert` | Revertir un mensaje | cuerpo: `{ messageID, partID? }`, devuelve `boolean` | -| `POST` | `/session/:id/unrevert` | Restaurar todos los mensajes revertidos | Devuelve `boolean` | -| `POST` | `/session/:id/permissions/:permissionID` | Responder a una solicitud de permiso | cuerpo: `{ response, remember? }`, devuelve `boolean` | - ---- - -### Mensajes - -| Método | Ruta | Descripción | Notas | -| ------ | --------------------------------- | --------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `GET` | `/session/:id/message` | Listar mensajes en una sesión | consulta: `limit?`, devuelve `{ info: `Mensaje`, parts: `Parte[]`}[]` | -| `POST` | `/session/:id/message` | Envía un mensaje y espera respuesta | cuerpo: `{ messageID?, model?, agent?, noReply?, system?, tools?, parts }`, devuelve `{ info: `Mensaje`, parts: `Parte[]`}` | -| `GET` | `/session/:id/message/:messageID` | Obtener detalles del mensaje | Devuelve `{ info: `Mensaje`, parts: `Parte[]`}` | -| `POST` | `/session/:id/prompt_async` | Enviar un mensaje de forma asincrónica (sin espera) | cuerpo: igual que `/session/:id/message`, devuelve `204 No Content` | -| `POST` | `/session/:id/command` | Ejecutar un comando de barra diagonal | cuerpo: `{ messageID?, agent?, model?, command, arguments }`, devuelve `{ info: `Mensaje`, parts: `Parte[]`}` | -| `POST` | `/session/:id/shell` | Ejecute un comando de shell | cuerpo: `{ agent, model?, command }`, devuelve `{ info: `Mensaje`, parts: `Parte[]`}` | - ---- - -### Comandos - -| Método | Ruta | Descripción | Respuesta | -| ------ | ---------- | ------------------------- | --------------------------------------------- | -| `GET` | `/command` | Listar todos los comandos | Command[] | - ---- - -### Archivos - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------------------------ | -------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| `GET` | `/find?pattern=` | Buscar texto en archivos | Matriz de objetos coincidentes con `path`, `lines`, `line_number`, `absolute_offset`, `submatches` | -| `GET` | `/find/file?query=` | Buscar archivos y directorios por nombre | `string[]` (caminos) | -| `GET` | `/find/symbol?query=` | Buscar símbolos del espacio de trabajo | Symbol[] | -| `GET` | `/file?path=` | Listar archivos y directorios | FileNode[] | -| `GET` | `/file/content?path=

` | Leer un archivo | FileContent | -| `GET` | `/file/status` | Obtener el estado de los archivos rastreados | File[] | - -#### Parámetros de consulta de /find/file - -- `query` (obligatorio) — cadena de búsqueda (coincidencia aproximada) -- `type` (opcional): limita los resultados a `"file"` o `"directory"` -- `directory` (opcional): anula la raíz del proyecto para la búsqueda. -- `limit` (opcional) — resultados máximos (1–200) -- `dirs` (opcional): indicador heredado (`"false"` devuelve solo archivos) - ---- - -### Herramientas (experimentales) - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------------------------------------------- | ---------------------------------------------------- | -------------------------------------------- | -| `GET` | `/experimental/tool/ids` | Listar todos los ID de herramientas | ToolIDs | -| `GET` | `/experimental/tool?provider=

&model=` | Listar herramientas con esquemas JSON para un modelo | ToolList | - ---- - -### LSP, formateadores y MCP - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------------ | ------------------------------------- | --------------------------------------------------------- | -| `GET` | `/lsp` | Obtener el estado del servidor LSP | LSPStatus[] | -| `GET` | `/formatter` | Obtener estado del formateador | FormatterStatus[] | -| `GET` | `/mcp` | Obtener el estado del servidor MCP | `{ [name: string]: `MCPStatus` }` | -| `POST` | `/mcp` | Agregue el servidor MCP dinámicamente | cuerpo: `{ name, config }`, devuelve MCP objeto de estado | - ---- - -### Agentes - -| Método | Ruta | Descripción | Respuesta | -| ------ | -------- | ------------------------------------ | ------------------------------------------- | -| `GET` | `/agent` | Listar todos los agentes disponibles | Agent[] | - ---- - -### Registro - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------ | --------------------------------------------------------------------------- | --------- | -| `POST` | `/log` | Escribir entrada de registro. Cuerpo: `{ service, level, message, extra? }` | `boolean` | - ---- - -### TUI - -| Método | Ruta | Descripción | Respuesta | -| ------ | ----------------------- | ------------------------------------------------- | ------------------------------ | -| `POST` | `/tui/append-prompt` | Agregar texto al mensaje | `boolean` | -| `POST` | `/tui/open-help` | Abra el cuadro de diálogo de ayuda | `boolean` | -| `POST` | `/tui/open-sessions` | Abrir el selector de sesiones | `boolean` | -| `POST` | `/tui/open-themes` | Abra el selector de temas | `boolean` | -| `POST` | `/tui/open-models` | Abrir el selector de modelo | `boolean` | -| `POST` | `/tui/submit-prompt` | Enviar el mensaje actual | `boolean` | -| `POST` | `/tui/clear-prompt` | Borrar el mensaje | `boolean` | -| `POST` | `/tui/execute-command` | Ejecutar un comando (`{ command }`) | `boolean` | -| `POST` | `/tui/show-toast` | Mostrar brindis (`{ title?, message, variant }`) | `boolean` | -| `GET` | `/tui/control/next` | Espere la próxima solicitud de control | Objeto de solicitud de control | -| `POST` | `/tui/control/response` | Responder a una solicitud de control (`{ body }`) | `boolean` | - ---- - -### Autenticación - -| Método | Ruta | Descripción | Respuesta | -| ------ | ----------- | ----------------------------------------------------------------------------------------------- | --------- | -| `PUT` | `/auth/:id` | Establecer credenciales de autenticación. El cuerpo debe coincidir con el esquema del proveedor | `boolean` | - ---- - -### Eventos - -| Método | Ruta | Descripción | Respuesta | -| ------ | -------- | ------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | -| `GET` | `/event` | Transmisión de eventos enviados por el servidor. El primer evento es `server.connected`, luego eventos de bus | Transmisión de eventos enviados por el servidor | - ---- - -### Documentación - -| Método | Ruta | Descripción | Respuesta | -| ------ | ------ | -------------------------- | -------------------------------------- | -| `GET` | `/doc` | Especificación OpenAPI 3.1 | Página HTML con especificación OpenAPI | diff --git a/packages/web/src/content/docs/es/share.mdx b/packages/web/src/content/docs/es/share.mdx deleted file mode 100644 index 5aabff746a..0000000000 --- a/packages/web/src/content/docs/es/share.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Compartir -description: Comparte tus conversaciones CoDev Code. ---- - -La función para compartir de CoDev Code te permite crear enlaces públicos a tus conversaciones de CoDev Code, para que puedas colaborar con compañeros de equipo u obtener ayuda de otros. - -:::note -Las conversaciones compartidas son de acceso público para cualquier persona que tenga el enlace. -::: - ---- - -## Cómo funciona - -Cuando compartes una conversación, CoDev Code: - -1. Crea una URL pública única para su sesión. -2. Sincroniza tu historial de conversaciones con nuestros servidores -3. Hace que la conversación sea accesible a través del enlace para compartir: `opncd.ai/s/` - ---- - -## Uso compartido - -CoDev Code admite tres modos de compartir que controlan cómo se comparten las conversaciones: - ---- - -### Manual (predeterminado) - -De forma predeterminada, CoDev Code usa el modo de compartir manual. Las sesiones no se comparten automáticamente, pero puedes compartirlas manualmente usando el comando `/share`: - -``` -/share -``` - -Esto generará una URL única que se copiará en su portapapeles. - -Para configurar explícitamente el modo manual en su [archivo de configuración](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "manual" -} -``` - ---- - -### Compartir automáticamente - -Puede habilitar el uso compartido automático para todas las conversaciones nuevas configurando la opción `share` en `"auto"` en su [archivo de configuración](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "auto" -} -``` - -Con el uso compartido automático habilitado, cada nueva conversación se compartirá automáticamente y se generará un enlace. - ---- - -### Desactivado - -Puede desactivar el uso compartido por completo configurando la opción `share` en `"disabled"` en su [archivo de configuración](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "disabled" -} -``` - -Para aplicar esto en todo su equipo para un proyecto determinado, agréguelo al `codev.json` en su proyecto y regístrelo en Git. - ---- - -## Dejar de compartir - -Para dejar de compartir una conversación y eliminarla del acceso público: - -``` -/unshare -``` - -Esto eliminará el enlace para compartir y eliminará los datos relacionados con la conversación. - ---- - -## Privacidad - -Hay algunas cosas a tener en cuenta al compartir una conversación. - ---- - -### Retención de datos - -Las conversaciones compartidas permanecen accesibles hasta que las dejes de compartir explícitamente. Este -incluye: - -- Historial de conversaciones completo -- Todos los mensajes y respuestas. -- Metadatos de la sesión - ---- - -### Recomendaciones - -- Comparta únicamente conversaciones que no contengan información confidencial. -- Revisar el contenido de la conversación antes de compartir. -- Dejar de compartir conversaciones cuando se complete la colaboración. -- Evite compartir conversaciones con código propietario o datos confidenciales. -- Para proyectos confidenciales, deshabilite el uso compartido por completo. - ---- - -## Para empresas - -Para implementaciones empresariales, la función de compartir puede ser: - -- **Desactivado** completamente por motivos de seguridad. -- **Restringido** solo a usuarios autenticados a través de SSO -- **Autohospedado** en tu propia infraestructura - -[Obtenga más información](/docs/enterprise) sobre el uso de CoDev Code en su organización. diff --git a/packages/web/src/content/docs/es/skills.mdx b/packages/web/src/content/docs/es/skills.mdx deleted file mode 100644 index 4bfb212e55..0000000000 --- a/packages/web/src/content/docs/es/skills.mdx +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: "Habilidades del agente" -description: "Defina el comportamiento reutilizable mediante definiciones de SKILL.md" ---- - -Las habilidades del agente permiten a CoDev Code descubrir instrucciones reutilizables de su repositorio o directorio de inicio. -Las habilidades se cargan bajo demanda a través de la herramienta nativa `skill`: los agentes ven las habilidades disponibles y pueden cargar el contenido completo cuando sea necesario. - ---- - -## Colocar archivos - -Cree una carpeta por nombre de habilidad y coloque un `SKILL.md` dentro de ella. -CoDev Code busca estas ubicaciones: - -- Configuración del proyecto: `.codev/skills//SKILL.md` -- Configuración global: `~/.config/codev/skills//SKILL.md` -- Compatible con Proyecto Claude: `.claude/skills//SKILL.md` -- Compatible con Claude global: `~/.claude/skills//SKILL.md` -- Compatible con agente de proyecto: `.agents/skills//SKILL.md` -- Compatible con agentes globales: `~/.agents/skills//SKILL.md` - ---- - -## Entender el descubrimiento - -Para las rutas locales del proyecto, CoDev Code sube desde su directorio de trabajo actual hasta llegar al árbol de trabajo de git. -Carga cualquier `skills/*/SKILL.md` coincidente en `.codev/` y cualquier `.claude/skills/*/SKILL.md` o `.agents/skills/*/SKILL.md` coincidente a lo largo del camino. - -Las definiciones globales también se cargan desde `~/.config/codev/skills/*/SKILL.md`, `~/.claude/skills/*/SKILL.md` y `~/.agents/skills/*/SKILL.md`. - ---- - -## Escribir la introducción - -Cada `SKILL.md` debe comenzar con el frontmatter de YAML. -Sólo se reconocen estos campos: - -- `name` (obligatorio) -- `description` (obligatorio) -- `license` (opcional) -- `compatibility` (opcional) -- `metadata` (opcional, mapa de cadena a cadena) - -Los campos desconocidos se ignoran. - ---- - -## Validar nombres - -`name` debe: - -- Tener entre 1 y 64 caracteres. -- Ser alfanuméricos en minúsculas con separadores de guión simple -- No comienza ni termina con `-` -- No contener `--` consecutivos -- Coincide con el nombre del directorio que contiene `SKILL.md` - -expresión regular equivalente: - -```text -^[a-z0-9]+(-[a-z0-9]+)*$ -``` - ---- - -## Seguir las reglas de longitud - -`description` debe tener entre 1 y 1024 caracteres. -Manténgalo lo suficientemente específico para que el agente elija correctamente. - ---- - -## Usar un ejemplo - -Crea `.codev/skills/git-release/SKILL.md` así: - -```markdown ---- -name: git-release -description: Create consistent releases and changelogs -license: MIT -compatibility: opencode -metadata: - audience: maintainers - workflow: github ---- - -## What I do - -- Draft release notes from merged PRs -- Propose a version bump -- Provide a copy-pasteable `gh release create` command - -## When to use me - -Use this when you are preparing a tagged release. -Ask clarifying questions if the target versioning scheme is unclear. -``` - ---- - -## Reconocer la descripción de la herramienta - -CoDev Code enumera las habilidades disponibles en la descripción de la herramienta `skill`. -Cada entrada incluye el nombre y la descripción de la habilidad: - -```xml - - - git-release - Create consistent releases and changelogs - - -``` - -El agente carga una habilidad llamando a la herramienta: - -``` -skill({ name: "git-release" }) -``` - ---- - -## Configurar permisos - -Controle a qué agentes de habilidades pueden acceder utilizando permisos basados ​​en patrones en `codev.json`: - -```json -{ - "permission": { - "skill": { - "*": "allow", - "pr-review": "allow", - "internal-*": "deny", - "experimental-*": "ask" - } - } -} -``` - -| Permiso | Comportamiento | -| ------- | ------------------------------------------------- | -| `allow` | La habilidad se carga inmediatamente | -| `deny` | Habilidad oculta al agente, acceso rechazado | -| `ask` | Se solicita al usuario aprobación antes de cargar | - -Los patrones admiten comodines: `internal-*` coincide con `internal-docs`, `internal-tools`, etc. - ---- - -## Anulación por agente - -Otorgue a agentes específicos permisos diferentes a los predeterminados globales. - -**Para agentes personalizados** (en el frente del agente): - -```yaml ---- -permission: - skill: - "documents-*": "allow" ---- -``` - -**Para agentes integrados** (en `codev.json`): - -```json -{ - "agent": { - "plan": { - "permission": { - "skill": { - "internal-*": "allow" - } - } - } - } -} -``` - ---- - -## Deshabilitar la herramienta de habilidades - -Deshabilite completamente las habilidades para los agentes que no deberían usarlas: - -**Para agentes personalizados**: - -```yaml ---- -tools: - skill: false ---- -``` - -**Para agentes integrados**: - -```json -{ - "agent": { - "plan": { - "tools": { - "skill": false - } - } - } -} -``` - -Cuando está deshabilitada, la sección `` se omite por completo. - ---- - -## Solucionar problemas de carga - -Si una habilidad no aparece: - -1. Verifique que `SKILL.md` esté escrito en mayúsculas. -2. Verifique que el frontmatter incluya `name` y `description` -3. Asegúrese de que los nombres de las habilidades sean únicos en todas las ubicaciones -4. Verifique los permisos: las habilidades con `deny` están ocultas para los agentes diff --git a/packages/web/src/content/docs/es/themes.mdx b/packages/web/src/content/docs/es/themes.mdx deleted file mode 100644 index 85e2aee915..0000000000 --- a/packages/web/src/content/docs/es/themes.mdx +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: Temas -description: Seleccione un tema integrado o defina el suyo propio. ---- - -Con CoDev Code puede seleccionar uno de varios temas integrados, usar un tema que se adapte al tema de su terminal o definir su propio tema personalizado. - -De forma predeterminada, CoDev Code usa nuestro propio tema `opencode`. - ---- - -## Requisitos del terminal - -Para que los temas se muestren correctamente con su paleta de colores completa, su terminal debe admitir **truecolor** (color de 24 bits). La mayoría de los terminales modernos admiten esto de forma predeterminada, pero es posible que debas habilitarlo: - -- **Verificar soporte**: Ejecute `echo $COLORTERM` - debería generar `truecolor` o `24bit` -- **Habilitar color verdadero**: establezca la variable de entorno `COLORTERM=truecolor` en su perfil de shell -- **Compatibilidad de terminal**: asegúrese de que su emulador de terminal admita colores de 24 bits (la mayoría de los terminales modernos como iTerm2, Alacritty, Kitty, Windows Terminal y las versiones recientes de GNOME Terminal lo hacen) - -Sin soporte de color verdadero, los temas pueden aparecer con una precisión de color reducida o retroceder a la aproximación de 256 colores más cercana. - ---- - -## Temas integrados - -CoDev Code viene con varios temas integrados. - -| Nombre | Descripción | -| ---------------------- | ----------------------------------------------------------------------------- | -| `system` | Se adapta al color de fondo de tu terminal | -| `tokyonight` | Basado en el tema [Tokyonight](https://github.com/folke/tokyonight.nvim) | -| `everforest` | Basado en el tema [Everforest](https://github.com/sainnhe/everforest) | -| `ayu` | Basado en el tema oscuro de [Ayu](https://github.com/ayu-theme) | -| `catppuccin` | Basado en el tema [Catppuccin](https://github.com/catppuccin) | -| `catppuccin-macchiato` | Basado en el tema [Catppuccin](https://github.com/catppuccin) | -| `gruvbox` | Basado en el tema [Gruvbox](https://github.com/morhetz/gruvbox) | -| `kanagawa` | Basado en el tema [Kanagawa](https://github.com/rebelot/kanagawa.nvim) | -| `nord` | Basado en el tema [Nord](https://github.com/nordtheme/nord) | -| `matrix` | Verde estilo hacker sobre el tema negro | -| `one-dark` | Basado en el tema oscuro [Atom One](https://github.com/Th3Whit3Wolf/one-nvim) | - -Y más, constantemente agregamos nuevos temas. - ---- - -## Tema del sistema - -El tema `system` está diseñado para adaptarse automáticamente a la combinación de colores de su terminal. A diferencia de los temas tradicionales que utilizan colores fijos, el tema _system_: - -- **Genera escala de grises**: Crea una escala de grises personalizada basada en el color de fondo de tu terminal, asegurando un contraste óptimo. -- **Utiliza colores ANSI**: aprovecha los colores ANSI estándar (0-15) para resaltar la sintaxis y los elementos de la interfaz de usuario, que respetan la paleta de colores de su terminal. -- **Conserva los valores predeterminados del terminal**: utiliza `none` para el texto y los colores de fondo para mantener la apariencia nativa de su terminal. - -El tema del sistema es para usuarios que: - -- Quiere que CoDev Code coincida con la apariencia de su terminal -- Utilice esquemas de color de terminal personalizados -- Prefiere una apariencia consistente en todas las aplicaciones de terminal - ---- - -## Usar un tema - -Puede seleccionar un tema abriendo la selección de tema con el comando `/theme`. O puede especificarlo en `tui.json`. - -```json title="tui.json" {3} -{ - "$schema": "https://opencode.ai/tui.json", - "theme": "tokyonight" -} -``` - ---- - -## Temas personalizados - -CoDev Code admite un sistema de temas flexible basado en JSON que permite a los usuarios crear y personalizar temas fácilmente. - ---- - -### Jerarquía - -Los temas se cargan desde varios directorios en el siguiente orden, donde los directorios posteriores anulan los anteriores: - -1. **Temas integrados**: están integrados en el binario -2. **Directorio de configuración de usuario**: definido en `~/.config/codev/themes/*.json` o `$XDG_CONFIG_HOME/codev/themes/*.json` -3. **Directorio raíz del proyecto**: definido en `/.codev/themes/*.json` -4. **Directorio de trabajo actual** - Definido en `./.codev/themes/*.json` - -Si varios directorios contienen un tema con el mismo nombre, se utilizará el tema del directorio con mayor prioridad. - ---- - -### Crear un tema - -Para crear un tema personalizado, cree un archivo JSON en uno de los directorios de temas. - -Para temas para todo el usuario: - -```bash no-frame -mkdir -p ~/.config/codev/themes -vim ~/.config/codev/themes/my-theme.json -``` - -Y para temas específicos del proyecto. - -```bash no-frame -mkdir -p .codev/themes -vim .codev/themes/my-theme.json -``` - ---- - -### Formato JSON - -Los temas utilizan un formato JSON flexible compatible con: - -- **Colores hexadecimales**: `"#ffffff"` -- **Colores ANSI**: `3` (0-255) -- **Referencias de color**: `"primary"` o definiciones personalizadas -- **Variantes oscuras/claras**: `{"dark": "#000", "light": "#fff"}` -- **Sin color**: `"none"` - Utiliza el color predeterminado del terminal o transparente - ---- - -### Definiciones de colores - -La sección `defs` es opcional y le permite definir colores reutilizables a los que se puede hacer referencia en el tema. - ---- - -### Valores predeterminados del terminal - -El valor especial `"none"` se puede utilizar para que cualquier color herede el color predeterminado del terminal. Esto es particularmente útil para crear temas que combinen perfectamente con la combinación de colores de su terminal: - -- `"text": "none"` - Utiliza el color de primer plano predeterminado del terminal -- `"background": "none"` - Utiliza el color de fondo predeterminado del terminal - ---- - -### Ejemplo - -A continuación se muestra un ejemplo de un tema personalizado: - -```json title="my-theme.json" -{ - "$schema": "https://opencode.ai/theme.json", - "defs": { - "nord0": "#2E3440", - "nord1": "#3B4252", - "nord2": "#434C5E", - "nord3": "#4C566A", - "nord4": "#D8DEE9", - "nord5": "#E5E9F0", - "nord6": "#ECEFF4", - "nord7": "#8FBCBB", - "nord8": "#88C0D0", - "nord9": "#81A1C1", - "nord10": "#5E81AC", - "nord11": "#BF616A", - "nord12": "#D08770", - "nord13": "#EBCB8B", - "nord14": "#A3BE8C", - "nord15": "#B48EAD" - }, - "theme": { - "primary": { - "dark": "nord8", - "light": "nord10" - }, - "secondary": { - "dark": "nord9", - "light": "nord9" - }, - "accent": { - "dark": "nord7", - "light": "nord7" - }, - "error": { - "dark": "nord11", - "light": "nord11" - }, - "warning": { - "dark": "nord12", - "light": "nord12" - }, - "success": { - "dark": "nord14", - "light": "nord14" - }, - "info": { - "dark": "nord8", - "light": "nord10" - }, - "text": { - "dark": "nord4", - "light": "nord0" - }, - "textMuted": { - "dark": "nord3", - "light": "nord1" - }, - "background": { - "dark": "nord0", - "light": "nord6" - }, - "backgroundPanel": { - "dark": "nord1", - "light": "nord5" - }, - "backgroundElement": { - "dark": "nord1", - "light": "nord4" - }, - "border": { - "dark": "nord2", - "light": "nord3" - }, - "borderActive": { - "dark": "nord3", - "light": "nord2" - }, - "borderSubtle": { - "dark": "nord2", - "light": "nord3" - }, - "diffAdded": { - "dark": "nord14", - "light": "nord14" - }, - "diffRemoved": { - "dark": "nord11", - "light": "nord11" - }, - "diffContext": { - "dark": "nord3", - "light": "nord3" - }, - "diffHunkHeader": { - "dark": "nord3", - "light": "nord3" - }, - "diffHighlightAdded": { - "dark": "nord14", - "light": "nord14" - }, - "diffHighlightRemoved": { - "dark": "nord11", - "light": "nord11" - }, - "diffAddedBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffRemovedBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffContextBg": { - "dark": "nord1", - "light": "nord5" - }, - "diffLineNumber": { - "dark": "nord2", - "light": "nord4" - }, - "diffAddedLineNumberBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffRemovedLineNumberBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "markdownText": { - "dark": "nord4", - "light": "nord0" - }, - "markdownHeading": { - "dark": "nord8", - "light": "nord10" - }, - "markdownLink": { - "dark": "nord9", - "light": "nord9" - }, - "markdownLinkText": { - "dark": "nord7", - "light": "nord7" - }, - "markdownCode": { - "dark": "nord14", - "light": "nord14" - }, - "markdownBlockQuote": { - "dark": "nord3", - "light": "nord3" - }, - "markdownEmph": { - "dark": "nord12", - "light": "nord12" - }, - "markdownStrong": { - "dark": "nord13", - "light": "nord13" - }, - "markdownHorizontalRule": { - "dark": "nord3", - "light": "nord3" - }, - "markdownListItem": { - "dark": "nord8", - "light": "nord10" - }, - "markdownListEnumeration": { - "dark": "nord7", - "light": "nord7" - }, - "markdownImage": { - "dark": "nord9", - "light": "nord9" - }, - "markdownImageText": { - "dark": "nord7", - "light": "nord7" - }, - "markdownCodeBlock": { - "dark": "nord4", - "light": "nord0" - }, - "syntaxComment": { - "dark": "nord3", - "light": "nord3" - }, - "syntaxKeyword": { - "dark": "nord9", - "light": "nord9" - }, - "syntaxFunction": { - "dark": "nord8", - "light": "nord8" - }, - "syntaxVariable": { - "dark": "nord7", - "light": "nord7" - }, - "syntaxString": { - "dark": "nord14", - "light": "nord14" - }, - "syntaxNumber": { - "dark": "nord15", - "light": "nord15" - }, - "syntaxType": { - "dark": "nord7", - "light": "nord7" - }, - "syntaxOperator": { - "dark": "nord9", - "light": "nord9" - }, - "syntaxPunctuation": { - "dark": "nord4", - "light": "nord0" - } - } -} -``` diff --git a/packages/web/src/content/docs/es/tools.mdx b/packages/web/src/content/docs/es/tools.mdx deleted file mode 100644 index aace2d84e2..0000000000 --- a/packages/web/src/content/docs/es/tools.mdx +++ /dev/null @@ -1,341 +0,0 @@ ---- -title: Herramientas -description: Administre las herramientas que puede usar un LLM. ---- - -Las herramientas permiten que LLM realice acciones en su código base. CoDev Code viene con un conjunto de herramientas integradas, pero puede ampliarlo con [herramientas personalizadas](/docs/custom-tools) o [servidores MCP](/docs/mcp-servers). - -De forma predeterminada, todas las herramientas están **habilitadas** y no necesitan permiso para ejecutarse. Puede controlar el comportamiento de la herramienta a través de [permisos](/docs/permissions). - ---- - -## Configuración - -Utilice el campo `permission` para controlar el comportamiento de la herramienta. Puede permitir, denegar o exigir aprobación para cada herramienta. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny", - "bash": "ask", - "webfetch": "allow" - } -} -``` - -También puedes utilizar comodines para controlar varias herramientas a la vez. Por ejemplo, para solicitar aprobación para todas las herramientas de un servidor MCP: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "mymcp_*": "ask" - } -} -``` - -[Más información](/docs/permissions) sobre la configuración de permisos. - ---- - -## Integradas - -Aquí están todas las herramientas integradas disponibles en CoDev Code. - ---- - -### bash - -Ejecute comandos de shell en el entorno de su proyecto. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": "allow" - } -} -``` - -Esta herramienta permite que LLM ejecute comandos de terminal como `npm install`, `git status` o cualquier otro comando de shell. - ---- - -### edit - -Modifique archivos existentes utilizando reemplazos de cadenas exactas. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -Esta herramienta realiza ediciones precisas de archivos reemplazando coincidencias de texto exactas. Es la forma principal en que LLM modifica el código. - ---- - -### write - -Cree nuevos archivos o sobrescriba los existentes. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -Utilice esto para permitir que LLM cree nuevos archivos. Sobrescribirá los archivos existentes si ya existen. - -:::note -La herramienta `write` está controlada por el permiso `edit`, que cubre todas las modificaciones de archivos (`edit`, `write`, `patch`). -::: - ---- - -### read - -Lea el contenido del archivo desde su base de código. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "read": "allow" - } -} -``` - -Esta herramienta lee archivos y devuelve su contenido. Admite la lectura de rangos de líneas específicos para archivos grandes. - ---- - -### grep - -Busque contenidos de archivos utilizando expresiones regulares. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "grep": "allow" - } -} -``` - -Búsqueda rápida de contenido en su base de código. Admite sintaxis de expresiones regulares completa y filtrado de patrones de archivos. - ---- - -### glob - -Encuentre archivos por coincidencia de patrones. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "glob": "allow" - } -} -``` - -Busque archivos usando patrones globales como `**/*.js` o `src/**/*.ts`. Devuelve rutas de archivos coincidentes ordenadas por hora de modificación. - ---- - -### lsp (experimental) - -Interactúe con sus servidores LSP configurados para obtener funciones de inteligencia de código como definiciones, referencias, información de desplazamiento y jerarquía de llamadas. - -:::note -Esta herramienta solo está disponible cuando `CODEV_EXPERIMENTAL_LSP_TOOL=true` (o `CODEV_EXPERIMENTAL=true`). -::: - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "lsp": "allow" - } -} -``` - -Las operaciones admitidas incluyen `goToDefinition`, `findReferences`, `hover`, `documentSymbol`, `workspaceSymbol`, `goToImplementation`, `prepareCallHierarchy`, `incomingCalls` y `outgoingCalls`. - -Para configurar qué servidores LSP están disponibles para su proyecto, consulte [Servidores LSP](/docs/lsp). - ---- - -### patch - -Aplicar parches a los archivos. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -Esta herramienta aplica archivos de parche a su código base. Útil para aplicar diferencias y parches de diversas fuentes. - -:::note -La herramienta `patch` está controlada por el permiso `edit`, que cubre todas las modificaciones de archivos (`edit`, `write`, `patch`). -::: - ---- - -### skill - -Cargue una [habilidad](/docs/skills) (un archivo `SKILL.md`) y devuelva su contenido en la conversación. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "skill": "allow" - } -} -``` - ---- - -### todowrite - -Administre listas de tareas pendientes durante las sesiones de codificación. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "todowrite": "allow" - } -} -``` - -Crea y actualiza listas de tareas para realizar un seguimiento del progreso durante operaciones complejas. El LLM usa esto para organizar tareas de varios pasos. - -:::note -Esta herramienta está deshabilitada para los subagentes de forma predeterminada, pero puede habilitarla manualmente. [Más información](/docs/agents/#permissions) -::: - ---- - -### webfetch - -Obtener contenido web. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "webfetch": "allow" - } -} -``` - -Permite que LLM busque y lea páginas web. Útil para buscar documentación o investigar recursos en línea. - ---- - -### websearch - -Busque información en la web. - -:::note -Esta herramienta solo está disponible cuando se utiliza el proveedor OpenCode o cuando la variable de entorno `CODEV_ENABLE_EXA` está configurada en cualquier valor verdadero (por ejemplo, `true` o `1`). - -Para habilitar al iniciar CoDev Code: - -```bash -CODEV_ENABLE_EXA=1 codev -``` - -::: - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "websearch": "allow" - } -} -``` - -Realiza búsquedas web utilizando Exa AI para encontrar información relevante en línea. Útil para investigar temas, encontrar eventos actuales o recopilar información más allá del límite de datos de entrenamiento. - -No se requiere ninguna clave API: la herramienta se conecta directamente al servicio MCP alojado de Exa AI sin autenticación. - -:::tip -Utilice `websearch` cuando necesite encontrar información (descubrimiento) y `webfetch` cuando necesite recuperar contenido de una URL específica (recuperación). -::: - ---- - -### question - -Haga preguntas al usuario durante la ejecución. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "question": "allow" - } -} -``` - -Esta herramienta permite que LLM haga preguntas al usuario durante una tarea. Es útil para: - -- Recopilar preferencias o requisitos del usuario. -- Aclarar instrucciones ambiguas -- Tomar decisiones sobre las opciones de implementación. -- Ofrecer opciones sobre qué dirección tomar. - -Cada pregunta incluye un encabezado, el texto de la pregunta y una lista de opciones. Los usuarios pueden seleccionar entre las opciones proporcionadas o escribir una respuesta personalizada. Cuando hay varias preguntas, los usuarios pueden navegar entre ellas antes de enviar todas las respuestas. - ---- - -## Herramientas personalizadas - -Las herramientas personalizadas le permiten definir sus propias funciones a las que LLM puede llamar. Estos están definidos en su archivo de configuración y pueden ejecutar código arbitrario. - -[Más información](/docs/custom-tools) sobre la creación de herramientas personalizadas. - ---- - -## Servidores MCP - -Los servidores MCP (Model Context Protocol) le permiten integrar herramientas y servicios externos. Esto incluye acceso a bases de datos, integraciones API y servicios de terceros. - -[Más información](/docs/mcp-servers) sobre la configuración de servidores MCP. - ---- - -## Internos - -Internamente, herramientas como `grep` y `glob` usan [ripgrep](https://github.com/BurntSushi/ripgrep) bajo el capó. De forma predeterminada, ripgrep respeta los patrones `.gitignore`, lo que significa que los archivos y directorios enumerados en su `.gitignore` se excluirán de las búsquedas y listados. - ---- - -### Ignorar patrones - -Para incluir archivos que normalmente se ignorarían, cree un archivo `.ignore` en la raíz de su proyecto. Este archivo puede permitir explícitamente ciertas rutas. - -```text title=".ignore" -!node_modules/ -!dist/ -!build/ -``` - -Por ejemplo, este archivo `.ignore` permite que ripgrep busque dentro de los directorios `node_modules/`, `dist/` y `build/` incluso si figuran en `.gitignore`. diff --git a/packages/web/src/content/docs/es/troubleshooting.mdx b/packages/web/src/content/docs/es/troubleshooting.mdx deleted file mode 100644 index 099f5557b3..0000000000 --- a/packages/web/src/content/docs/es/troubleshooting.mdx +++ /dev/null @@ -1,300 +0,0 @@ ---- -title: Solución de problemas -description: Problemas comunes y cómo resolverlos. ---- - -Para depurar problemas con CoDev Code, comience verificando los registros y los datos locales que almacena en el disco. - ---- - -## Registros - -Los archivos de registro se escriben en: - -- **macOS/Linux**: `~/.local/share/codev/log/` -- **Windows**: Presione `WIN+R` y pegue `%USERPROFILE%\.local\share\codev\log` - -Los archivos de registro reciben nombres con marcas de tiempo (por ejemplo, `2025-01-09T123456.log`) y se conservan los 10 archivos de registro más recientes. - -Puede configurar el nivel de registro con la opción de línea de comandos `--log-level` para obtener información de depuración más detallada. Por ejemplo, `codev --log-level DEBUG`. - ---- - -## Almacenamiento - -CoDev Code almacena datos de sesión y otros datos de aplicaciones en el disco en: - -- **macOS/Linux**: `~/.local/share/codev/` -- **Windows**: Presione `WIN+R` y pegue `%USERPROFILE%\.local\share\codev` - -Este directorio contiene: - -- `auth.json` - Datos de autenticación como API claves, OAuth tokens -- `log/` - Registros de aplicaciones -- `project/` - Datos específicos del proyecto, como datos de sesión y mensajes. - - Si el proyecto está dentro de un repositorio de Git, se almacena en `.//storage/` - - Si no es un repositorio de Git, se almacena en `./global/storage/` - ---- - -## Aplicación de escritorio - -CoDev Code Desktop ejecuta un servidor CoDev Code local (el sidecar `opencode-cli`) en segundo plano. La mayoría de los problemas se deben a un complemento que no funciona correctamente, una memoria caché dañada o una mala configuración del servidor. - -### Comprobaciones rápidas - -- Salga por completo y reinicie la aplicación. -- Si la aplicación muestra una pantalla de error, haga clic en **Reiniciar** y copie los detalles del error. -- Solo macOS: menú `CoDev Code` -> **Recargar vista web** (ayuda si la interfaz de usuario está en blanco/congelada). - ---- - -### Deshabilitar complementos - -Si la aplicación de escritorio falla al iniciarse, se bloquea o se comporta de manera extraña, comience por deshabilitar los complementos. - -#### Verifique la configuración global - -Abra su archivo de configuración global y busque una clave `plugin`. - -- **macOS/Linux**: `~/.config/codev/codev.jsonc` (o `~/.config/codev/codev.json`) -- **macOS/Linux** (instalaciones anteriores): `~/.local/share/codev/codev.jsonc` -- **Windows**: Presione `WIN+R` y pegue `%USERPROFILE%\.config\opencode\codev.jsonc` - -Si tiene complementos configurados, desactívelos temporalmente eliminando la clave o configurándola en una matriz vacía: - -```jsonc -{ - "$schema": "https://opencode.ai/config.json", - "plugin": [], -} -``` - -#### Verificar directorios de complementos - -CoDev Code también puede cargar complementos locales desde el disco. Quítelos temporalmente del camino (o cambie el nombre de la carpeta) y reinicie la aplicación de escritorio: - -- **Complementos globales** - - **macOS/Linux**: `~/.config/codev/plugins/` - - **Windows**: Presione `WIN+R` y pegue `%USERPROFILE%\.config\opencode\plugins` -- **Complementos de proyecto** (solo si usas la configuración por proyecto) - - `/.codev/plugins/` - -Si la aplicación comienza a funcionar nuevamente, vuelva a habilitar los complementos uno a la vez para encontrar cuál está causando el problema. - ---- - -### Borrar el caché - -Si deshabilitar los complementos no ayuda (o la instalación de un complemento está bloqueada), borre el caché para que CoDev Code pueda reconstruirlo. - -1. Salga de CoDev Code Desktop por completo. -2. Elimine el directorio de caché: - -- **macOS**: Buscador -> `Cmd+Shift+G` -> pegar `~/.cache/codev` -- **Linux**: eliminar `~/.cache/codev` (o ejecutar `rm -rf ~/.cache/codev`) -- **Windows**: Presione `WIN+R` y pegue `%USERPROFILE%\.cache\codev` - -3. Reinicie el escritorio CoDev Code. - ---- - -### Solucionar problemas de conexión del servidor - -CoDev Code Desktop puede iniciar su propio servidor local (predeterminado) o conectarse a la URL de un servidor que haya configurado. - -Si ve un cuadro de diálogo **"Error de conexión"** (o la aplicación nunca pasa de la pantalla de inicio), busque una URL de servidor personalizada. - -#### Borrar la URL del servidor predeterminado del escritorio - -Desde la pantalla de inicio, haga clic en el nombre del servidor (con el punto de estado) para abrir el selector de servidor. En la sección **Servidor predeterminado**, haga clic en **Borrar**. - -#### Elimina `server.port` / `server.hostname` de tu configuración - -Si su `codev.json(c)` contiene una sección `server`, elimínela temporalmente y reinicie la aplicación de escritorio. - -#### Verificar variables de entorno - -Si tiene `CODEV_PORT` configurado en su entorno, la aplicación de escritorio intentará usar ese puerto para el servidor local. - -- Desarme `CODEV_PORT` (o elija un puerto libre) y reinicie. - ---- - -### Linux: Problemas con Wayland/X11 - -En Linux, algunas configuraciones de Wayland pueden causar ventanas en blanco o errores de compositor. - -- Si estás en Wayland y la aplicación está en blanco o falla, intenta iniciarla con `OC_ALLOW_WAYLAND=1`. -- Si eso empeora las cosas, elimínelo e intente iniciarlo en una sesión X11. - ---- - -### Windows: tiempo de ejecución de WebView2 - -En Windows, el escritorio CoDev Code requiere Microsoft Edge **WebView2 Runtime**. Si la aplicación se abre en una ventana en blanco o no se inicia, instale/actualice WebView2 e inténtelo nuevamente. - ---- - -### Windows: Problemas generales de rendimiento - -Si tiene un rendimiento lento, problemas de acceso a archivos o problemas de terminal en Windows, intente usar [WSL (Windows Subsistema para Linux)](/docs/windows-wsl). WSL proporciona un entorno Linux que funciona de manera más fluida con las funciones de CoDev Code. - ---- - -### Notificaciones que no se muestran - -CoDev Code Desktop solo muestra notificaciones del sistema cuando: - -- las notificaciones están habilitadas para CoDev Code en la configuración de su sistema operativo, y -- la ventana de la aplicación no está enfocada. - ---- - -### Restablecer el almacenamiento de la aplicación de escritorio (último recurso) - -Si la aplicación no se inicia y no puede borrar la configuración desde la interfaz de usuario, restablezca el estado guardado de la aplicación de escritorio. - -1. Salga del escritorio CoDev Code. -2. Busque y elimine estos archivos (se encuentran en el directorio de datos de la aplicación de escritorio CoDev Code): - -- `opencode.settings.dat` (URL del servidor predeterminado de escritorio) -- `opencode.global.dat` y `opencode.workspace.*.dat` (estado de la interfaz de usuario como servidores/proyectos recientes) - -Para encontrar el directorio rápidamente: - -- **macOS**: Finder -> `Cmd+Shift+G` -> `~/Library/Application Support` (luego busque los nombres de archivo arriba) -- **Linux**: busque en `~/.local/share` los nombres de archivo anteriores -- **Windows**: Presione `WIN+R` -> `%APPDATA%` (luego busque los nombres de archivo arriba) - ---- - -## Obtener ayuda - -Si tiene problemas con CoDev Code: - -1. **Informar problemas el GitHub** - - La mejor manera de informar errores o solicitar funciones es a través de nuestro repositorio GitHub: - - [**github.com/quickbeard/codev-code/issues**](https://github.com/quickbeard/codev-code/issues) - - Antes de crear un nuevo problema, busque los problemas existentes para ver si su problema ya ha sido informado. - -2. **Únete a nuestro Discord** - - Para obtener ayuda en tiempo real y debates comunitarios, únase a nuestro servidor de Discord: - - [**opencode.ai/discord**](https://opencode.ai/discord) - ---- - -## Problemas comunes - -A continuación se detallan algunos problemas comunes y cómo resolverlos. - ---- - -### CoDev Code no se inicia - -1. Verifique los registros en busca de mensajes de error. -2. Intente ejecutar con `--print-logs` para ver el resultado en la terminal. -3. Asegúrese de tener la última versión con `codev upgrade` - ---- - -### Problemas de autenticación - -1. Intente volver a autenticarse con el comando `/connect` en TUI -2. Verifique que sus claves API sean válidas -3. Asegúrese de que su red permita conexiones al API del proveedor. - ---- - -### Modelo no disponible - -1. Comprueba que te has autenticado con el proveedor. -2. Verifique que el nombre del modelo en su configuración sea correcto -3. Algunos modelos pueden requerir acceso o suscripciones específicas - -Si encuentra `ProviderModelNotFoundError`, lo más probable es que esté equivocado. -haciendo referencia a un modelo en alguna parte. -Se debe hacer referencia a los modelos así: `/` - -Ejemplos: - -- `openai/gpt-4.1` -- `openrouter/google/gemini-2.5-flash` -- `opencode/kimi-k2` - -Para saber a qué modelos tiene acceso, ejecute `codev models` - ---- - -### Error de inicio del proveedor - -Si encuentra un ProviderInitError, es probable que tenga una configuración no válida o dañada. - -Para resolver esto: - -1. Primero, verifique que su proveedor esté configurado correctamente siguiendo la [guía de proveedores](/docs/providers) -2. Si el problema persiste, intente borrar la configuración almacenada: - - ```bash - rm -rf ~/.local/share/codev - ``` - - En Windows, presione `WIN+R` y elimine: `%USERPROFILE%\.local\share\codev` - -3. Vuelva a autenticarse con su proveedor utilizando el comando `/connect` en TUI. - ---- - -### AI_APICallError y problemas con el paquete del proveedor - -Si encuentra errores de llamada API, esto puede deberse a paquetes de proveedores obsoletos. CoDev Code instala dinámicamente paquetes de proveedores (OpenAI, Anthropic, Google, etc.) según sea necesario y los almacena en caché localmente. - -Para resolver problemas con el paquete del proveedor: - -1. Borre la caché del paquete del proveedor: - - ```bash - rm -rf ~/.cache/codev - ``` - - En Windows, presione `WIN+R` y elimine: `%USERPROFILE%\.cache\codev` - -2. Reinicie CoDev Code para reinstalar los paquetes del proveedor más recientes. - -Esto obligará a CoDev Code a descargar las versiones más recientes de los paquetes del proveedor, lo que a menudo resuelve problemas de compatibilidad con los parámetros del modelo y los cambios de API. - ---- - -### Copiar/pegar no funciona en Linux - -Los usuarios de Linux deben tener instalada una de las siguientes utilidades del portapapeles para que funcione la función copiar/pegar: - -**Para sistemas X11:** - -```bash -apt install -y xclip -# or -apt install -y xsel -``` - -**Para sistemas Wayland:** - -```bash -apt install -y wl-clipboard -``` - -**Para entornos sin cabeza:** - -```bash -apt install -y xvfb -# and run: -Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & -export DISPLAY=:99.0 -``` - -CoDev Code detectará si estás usando Wayland y prefieres `wl-clipboard`; de lo contrario, intentará encontrar herramientas del portapapeles en el orden de: `xclip` y `xsel`. diff --git a/packages/web/src/content/docs/es/tui.mdx b/packages/web/src/content/docs/es/tui.mdx deleted file mode 100644 index 42fc0f40e8..0000000000 --- a/packages/web/src/content/docs/es/tui.mdx +++ /dev/null @@ -1,429 +0,0 @@ ---- -title: TUI -description: Usando la interfaz de usuario del terminal CoDev Code. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" - -CoDev Code proporciona una interfaz de terminal interactiva o TUI para trabajar en sus proyectos con un LLM. - -Al ejecutar CoDev Code se inicia TUI para el directorio actual. - -```bash -codev -``` - -O puede iniciarlo para un directorio de trabajo específico. - -```bash -codev /path/to/project -``` - -Una vez que esté en TUI, puede indicarlo con un mensaje. - -```text -Give me a quick summary of the codebase. -``` - ---- - -## Referencias de archivos - -Puede hacer referencia a archivos en sus mensajes usando `@`. Esto realiza una búsqueda difusa de archivos en el directorio de trabajo actual. - -:::tip -También puede utilizar `@` para hacer referencia a archivos en sus mensajes. -::: - -```text "@packages/functions/src/api/index.ts" -How is auth handled in @packages/functions/src/api/index.ts? -``` - -El contenido del archivo se agrega a la conversación automáticamente. - ---- - -## Comandos bash - -Inicie un mensaje con `!` para ejecutar un comando de shell. - -```bash frame="none" -!ls -la -``` - -El resultado del comando se agrega a la conversación como resultado de la herramienta. - ---- - -## Comandos - -Cuando utilice CoDev Code TUI, puede escribir `/` seguido de un nombre de comando para ejecutar acciones rápidamente. Por ejemplo: - -```bash frame="none" -/help -``` - -La mayoría de los comandos también tienen una combinación de teclas que utiliza `ctrl+x` como tecla principal, donde `ctrl+x` es la tecla principal predeterminada. [Más información](/docs/keybinds). - -Aquí están todos los comandos de barra diagonal disponibles: - ---- - -### connect - -Agregue un proveedor a CoDev Code. Le permite seleccionar entre proveedores disponibles y agregar sus claves API. - -```bash frame="none" -/connect -``` - ---- - -### compact - -Compacta la sesión actual. _Alias_: `/summarize` - -```bash frame="none" -/compact -``` - -**Combinación de teclas:** `ctrl+x c` - ---- - -### details - -Alternar detalles de ejecución de la herramienta. - -```bash frame="none" -/details -``` - -**Combinación de teclas:** `ctrl+x d` - ---- - -### editor - -Abra un editor externo para redactar mensajes. Utiliza el editor configurado en su variable de entorno `EDITOR`. [Más información](#editor-setup). - -```bash frame="none" -/editor -``` - -**Combinación de teclas:** `ctrl+x e` - ---- - -### exit - -Salga de CoDev Code. _Alias_: `/quit`, `/q` - -```bash frame="none" -/exit -``` - -**Combinación de teclas:** `ctrl+x q` - ---- - -### export - -Exporte la conversación actual a Markdown y ábrala en su editor predeterminado. Utiliza el editor configurado en su variable de entorno `EDITOR`. [Más información](#editor-setup). - -```bash frame="none" -/export -``` - -**Combinación de teclas:** `ctrl+x x` - ---- - -### help - -Muestra el cuadro de diálogo de ayuda. - -```bash frame="none" -/help -``` - -**Combinación de teclas:** `ctrl+x h` - ---- - -### init - -Cree o actualice el archivo `AGENTS.md`. [Más información](/docs/rules). - -```bash frame="none" -/init -``` - -**Combinación de teclas:** `ctrl+x i` - ---- - -### models - -Listar modelos disponibles. - -```bash frame="none" -/models -``` - -**Combinación de teclas:** `ctrl+x m` - ---- - -### new - -Iniciar una nueva sesión. _Alias_: `/clear` - -```bash frame="none" -/new -``` - -**Combinación de teclas:** `ctrl+x n` - ---- - -### redo - -Rehacer un mensaje previamente deshecho. Solo disponible después de usar `/undo`. - -:::tip -También se restaurarán todos los cambios en el archivo. -::: - -Internamente, esto utiliza Git para gestionar los cambios de archivos. Entonces tu proyecto **necesita -ser un repositorio Git**. - -```bash frame="none" -/redo -``` - -**Combinación de teclas:** `ctrl+x r` - ---- - -### sessions - -Enumere y cambie entre sesiones. _Alias_: `/resume`, `/continue` - -```bash frame="none" -/sessions -``` - -**Combinación de teclas:** `ctrl+x l` - ---- - -### share - -Compartir la sesión actual. [Más información](/docs/share). - -```bash frame="none" -/share -``` - -**Combinación de teclas:** `ctrl+x s` - ---- - -### theme - -Listar temas disponibles. - -```bash frame="none" -/theme -``` - -**Combinación de teclas:** `ctrl+x t` - ---- - -### thinking - -Alterna la visibilidad de los bloques de pensamiento/razonamiento en la conversación. Cuando está habilitado, puede ver el proceso de razonamiento del modelo para los modelos que admiten el pensamiento extendido. - -:::note -Este comando solo controla si se **muestran** los bloques de pensamiento; no habilita ni deshabilita las capacidades de razonamiento del modelo. Para alternar las capacidades de razonamiento reales, use `ctrl+t` para recorrer las variantes del modelo. -::: - -```bash frame="none" -/thinking -``` - ---- - -### undo - -Deshacer el último mensaje de la conversación. Elimina el mensaje de usuario más reciente, todas las respuestas posteriores y cualquier cambio de archivo. - -:::tip -Cualquier cambio de archivo realizado también se revertirá. -::: - -Internamente, esto utiliza Git para gestionar los cambios de archivos. Entonces tu proyecto **necesita -ser un repositorio Git**. - -```bash frame="none" -/undo -``` - -**Combinación de teclas:** `ctrl+x u` - ---- - -### unshare - -Dejar de compartir la sesión actual. [Más información](/docs/share#un-sharing). - -```bash frame="none" -/unshare -``` - ---- - -## Configuración del editor - -Tanto el comando `/editor` como el `/export` usan el editor especificado en su variable de entorno `EDITOR`. - - - - ```bash - # Example for nano or vim - export EDITOR=nano - export EDITOR=vim - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - export EDITOR="code --wait" - ``` - - Para hacerlo permanente, agréguelo a su perfil de shell; - `~/.bashrc`, `~/.zshrc`, etc. - - - - - ```bash - set EDITOR=notepad - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - set EDITOR=code --wait - ``` - - Para hacerlo permanente, use **Propiedades del sistema** > **Entorno - Variables**. - - - - - ```powershell - $env:EDITOR = "notepad" - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - $env:EDITOR = "code --wait" - ``` - - Para hacerlo permanente, agréguelo a su perfil de PowerShell. - - - - -Las opciones de editor populares incluyen: - -- `code` - Código de Visual Studio -- `cursor` - Cursor -- `windsurf` - Windsurf -- `nvim` - Editor Neovim -- `vim` - Editor Vim -- `nano` - Nanoeditor -- `notepad` - Windows Bloc de notas -- `subl` - Texto sublime - -:::note -Algunos editores como VS Code deben iniciarse con el indicador `--wait`. -::: - -Algunos editores necesitan argumentos de línea de comandos para ejecutarse en modo de bloqueo. El indicador `--wait` hace que el proceso del editor se bloquee hasta que se cierre. - ---- - -## Configurar - -Puede personalizar el comportamiento de TUI a través de `tui.json` (o `tui.jsonc`). - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "theme": "opencode", - "leader_timeout": 2000, - "keybinds": { - "leader": "ctrl+x", - "command_list": "ctrl+p" - }, - "scroll_speed": 3, - "scroll_acceleration": { - "enabled": false - }, - "diff_style": "auto", - "mouse": true, - "attention": { - "enabled": true, - "notifications": true, - "sound": true, - "volume": 0.4, - "sound_pack": "opencode.default", - "sounds": { - "error": "./sounds/error.mp3" - } - } -} -``` - -Esto es independiente de `codev.json`, que configura el comportamiento del servidor/tiempo de ejecución. - -`keybinds` se combina con los valores predeterminados integrados, así que solo necesitas configurar los atajos que quieras cambiar. - -### Opciones - -- `theme`: establece su tema de interfaz de usuario. [Más información](/docs/themes). -- `keybinds`: personaliza los atajos de teclado. [Más información](/docs/keybinds). -- `leader_timeout`: controla cuánto tiempo espera CoDev Code después de la leader key. El valor predeterminado es `2000`. -- `scroll_acceleration.enabled`: habilite la aceleración de desplazamiento estilo macOS para un desplazamiento suave y natural. Cuando está habilitado, la velocidad de desplazamiento aumenta con gestos de desplazamiento rápido y se mantiene precisa para movimientos más lentos. **Esta configuración tiene prioridad sobre `scroll_speed` y la anula cuando está habilitada.** -- `scroll_speed`: controla la rapidez con la que se desplaza el TUI cuando se utilizan comandos de desplazamiento (mínimo: `0.001`, admite valores decimales). El valor predeterminado es `3`. **Nota: Esto se ignora si `scroll_acceleration.enabled` está configurado en `true`.** -- `diff_style`: controla la representación de diferencias. `"auto"` se adapta al ancho del terminal, `"stacked"` siempre muestra un diseño de una sola columna. -- `mouse`: habilita o deshabilita la captura del mouse en el TUI (predeterminado: `true`). Cuando está deshabilitada, se conserva el comportamiento nativo del terminal para seleccionar y desplazarse con el mouse. -- `attention`: configura las notificaciones de escritorio y los sonidos del TUI. Deshabilitado de forma predeterminada. - -Utilice `CODEV_TUI_CONFIG` para cargar una ruta de configuración de TUI personalizada. - -### Attention - -Attention permite que el TUI te avise cuando CoDev Code necesita que respondas una pregunta, apruebes un permiso, revises un error de sesión o sepas que una sesión terminó. Actívalo con `attention.enabled`; los eventos integrados reproducen sonidos al ocurrir. Las notificaciones de escritorio solo se envían cuando la ventana del terminal no está enfocada y no se usan para eventos de subagent. - -- `enabled`: activa todas las notificaciones y sonidos de Attention. El valor predeterminado es `false`. -- `notifications`: cuando Attention está activo, permite que el TUI envíe notificaciones de escritorio a través del terminal. El valor predeterminado es `true`. -- `sound`: cuando Attention está activo, permite reproducir sonidos de aviso. El valor predeterminado es `true`. -- `volume`: volumen predeterminado de los sonidos, de `0` a `1`. El valor predeterminado es `0.4`. -- `sound_pack`: ID del sound pack que se usará. El valor predeterminado es `opencode.default`. -- `sounds`: define archivos de sonido personalizados para `default`, `question`, `permission`, `error`, `done` o `subagent_done`. Las rutas pueden ser absolutas, URL `file://` o relativas a `tui.json`. - ---- - -## Personalización - -Puede personalizar varios aspectos de la vista TUI usando la paleta de comandos (`ctrl+x h` o `/help`). Estas configuraciones persisten después de los reinicios. - ---- - -#### Visualización del nombre de usuario - -Alterna si tu nombre de usuario aparece en los mensajes de chat. Accede a este a través de: - -- Paleta de comandos: busque "nombre de usuario" u "ocultar nombre de usuario" -- La configuración persiste automáticamente y se recordará en TUI sesiones diff --git a/packages/web/src/content/docs/es/web.mdx b/packages/web/src/content/docs/es/web.mdx deleted file mode 100644 index 7e39ad25b3..0000000000 --- a/packages/web/src/content/docs/es/web.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Web -description: Usando CoDev Code en su navegador. ---- - -CoDev Code puede ejecutarse como una aplicación web en su navegador, brindando la misma poderosa experiencia de codificación de IA sin necesidad de una terminal. - -![CoDev Code Web - Nueva sesión](../../../assets/web/web-homepage-new-session.png) - -## Empezar - -Inicie la interfaz web ejecutando: - -```bash -codev web -``` - -Esto inicia un servidor local en `127.0.0.1` con un puerto disponible aleatorio y abre automáticamente CoDev Code en su navegador predeterminado. - -:::caution -Si no se establece `CODEV_SERVER_PASSWORD`, el servidor no será seguro. Esto está bien para uso local, pero debe configurarse para acceso a la red. -::: - -:::tip[Windows Usuarios] -Para obtener la mejor experiencia, ejecute `codev web` desde [WSL](/docs/windows-wsl) en lugar de PowerShell. Esto garantiza el acceso adecuado al sistema de archivos y la integración del terminal. -::: - ---- - -## Configuración - -Puede configurar el servidor web usando indicadores de línea de comando o en su [archivo de configuración](/docs/config). - -### Puerto - -De forma predeterminada, CoDev Code elige un puerto disponible. Puede especificar un puerto: - -```bash -codev web --port 4096 -``` - -### Nombre de host - -De forma predeterminada, el servidor se vincula a `127.0.0.1` (solo localhost). Para hacer que CoDev Code sea accesible en su red: - -```bash -codev web --hostname 0.0.0.0 -``` - -Al usar `0.0.0.0`, CoDev Code mostrará direcciones locales y de red: - -``` - Local access: http://localhost:4096 - Network access: http://192.168.1.100:4096 -``` - -### Descubrimiento de mDNS - -Habilite mDNS para que su servidor sea reconocible en la red local: - -```bash -codev web --mdns -``` - -Esto establece automáticamente el nombre de host en `0.0.0.0` y anuncia el servidor como `opencode.local`. - -Puede personalizar el nombre de dominio mDNS para ejecutar varias instancias en la misma red: - -```bash -codev web --mdns --mdns-domain myproject.local -``` - -### CORS - -Para permitir dominios adicionales para CORS (útil para interfaces personalizadas): - -```bash -codev web --cors https://example.com -``` - -### Autenticación - -Para proteger el acceso, establezca una contraseña utilizando la variable de entorno `CODEV_SERVER_PASSWORD`: - -```bash -CODEV_SERVER_PASSWORD=secret codev web -``` - -El nombre de usuario predeterminado es `opencode` pero se puede cambiar con `CODEV_SERVER_USERNAME`. - ---- - -## Usar la interfaz web - -Una vez iniciada, la interfaz web proporciona acceso a sus sesiones CoDev Code. - -### Sesiones - -Vea y administre sus sesiones desde la página de inicio. Puedes ver sesiones activas e iniciar otras nuevas. - -![CoDev Code Web - Sesión activa](../../../assets/web/web-homepage-active-session.png) - -### Estado del servidor - -Haga clic en "Ver servidores" para ver los servidores conectados y su estado. - -![CoDev Code Web - Ver Servidores](../../../assets/web/web-homepage-see-servers.png) - ---- - -## Adjuntar una terminal - -Puede conectar un terminal TUI a un servidor web en ejecución: - -```bash -# Start the web server -codev web --port 4096 - -# In another terminal, attach the TUI -codev attach http://localhost:4096 -``` - -Esto le permite utilizar la interfaz web y el terminal simultáneamente, compartiendo las mismas sesiones y estados. - ---- - -## Archivo de configuración - -También puede configurar los ajustes del servidor en su archivo de configuración `codev.json`: - -```json -{ - "server": { - "port": 4096, - "hostname": "0.0.0.0", - "mdns": true, - "cors": ["https://example.com"] - } -} -``` - -Los indicadores de la línea de comando tienen prioridad sobre la configuración del archivo de configuración. diff --git a/packages/web/src/content/docs/es/windows-wsl.mdx b/packages/web/src/content/docs/es/windows-wsl.mdx deleted file mode 100644 index 2a11fc8e37..0000000000 --- a/packages/web/src/content/docs/es/windows-wsl.mdx +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: Windows (WSL) -description: Ejecuta CoDev Code en Windows con WSL para una mejor experiencia. ---- - -import { Steps } from "@astrojs/starlight/components" - -Aunque CoDev Code puede ejecutarse directamente en Windows, recomendamos usar [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) para obtener la mejor experiencia. WSL ofrece un entorno Linux que funciona perfectamente con las funciones de CoDev Code. - -:::tip[¿Por qué WSL?] -WSL ofrece mejor rendimiento del sistema de archivos, soporte completo de terminal y compatibilidad con las herramientas de desarrollo de las que depende CoDev Code. -::: - ---- - -## Configuración - - - -1. **Instala WSL** - - Si aún no lo hiciste, [instala WSL](https://learn.microsoft.com/en-us/windows/wsl/install) usando la guía oficial de Microsoft. - -2. **Instala CoDev Code en WSL** - - Cuando WSL esté listo, abre tu terminal de WSL e instala CoDev Code con uno de los [métodos de instalación](/docs/). - - ```bash - npm install -g codev-code - ``` - -3. **Usa CoDev Code desde WSL** - - Ve al directorio de tu proyecto (accede a los archivos de Windows desde `/mnt/c/`, `/mnt/d/`, etc.) y ejecuta CoDev Code. - - ```bash - cd /mnt/c/Users/YourName/project - codev - ``` - - - ---- - -## Aplicación de escritorio + servidor WSL - -Si prefieres usar la app de escritorio de CoDev Code pero quieres ejecutar el servidor en WSL: - -1. **Inicia el servidor en WSL** con `--hostname 0.0.0.0` para permitir conexiones externas: - - ```bash - codev serve --hostname 0.0.0.0 --port 4096 - ``` - -2. **Conecta la app de escritorio** a `http://localhost:4096` - -:::note -Si `localhost` no funciona en tu configuración, conéctate usando la dirección IP de WSL (desde WSL: `hostname -I`) y usa `http://:4096`. -::: - -:::caution -Cuando uses `--hostname 0.0.0.0`, define `CODEV_SERVER_PASSWORD` para proteger el servidor. - -```bash -CODEV_SERVER_PASSWORD=your-password codev serve --hostname 0.0.0.0 -``` - -::: - ---- - -## Cliente web + WSL - -Para obtener la mejor experiencia web en Windows: - -1. **Ejecuta `codev web` en la terminal de WSL** en lugar de PowerShell: - - ```bash - codev web --hostname 0.0.0.0 - ``` - -2. **Accede desde tu navegador de Windows** en `http://localhost:` (CoDev Code muestra la URL) - -Ejecutar `codev web` desde WSL garantiza acceso correcto al sistema de archivos e integración con la terminal, manteniéndolo accesible desde tu navegador de Windows. - ---- - -## Acceso a archivos de Windows - -WSL puede acceder a todos tus archivos de Windows mediante el directorio `/mnt/`: - -- Unidad `C:` → `/mnt/c/` -- Unidad `D:` → `/mnt/d/` -- Y así sucesivamente... - -Ejemplo: - -```bash -cd /mnt/c/Users/YourName/Documents/project -codev -``` - -:::tip -Para una experiencia más fluida, considera clonar o copiar tu repo al sistema de archivos de WSL (por ejemplo en `~/code/`) y ejecutar CoDev Code ahí. -::: - ---- - -## Consejos - -- Ejecuta CoDev Code en WSL para proyectos guardados en unidades de Windows: el acceso a archivos es transparente -- Usa la [extensión WSL de VS Code](https://code.visualstudio.com/docs/remote/wsl) junto con CoDev Code para un flujo de desarrollo integrado -- Tu configuración y tus sesiones de CoDev Code se guardan dentro del entorno WSL en `~/.local/share/codev/` diff --git a/packages/web/src/content/docs/es/zen.mdx b/packages/web/src/content/docs/es/zen.mdx deleted file mode 100644 index 9bf1044363..0000000000 --- a/packages/web/src/content/docs/es/zen.mdx +++ /dev/null @@ -1,331 +0,0 @@ ---- -title: Zen -description: Lista seleccionada de modelos proporcionada por OpenCode. ---- - -import config from "../../../../config.mjs" -export const console = config.console -export const email = `mailto:${config.email}` - -OpenCode Zen es una lista de modelos probados y verificados proporcionada por el equipo de OpenCode. - -Zen funciona como cualquier otro proveedor en CoDev Code. Inicias sesión en OpenCode Zen y obtienes -tu API key. Es **completamente opcional** y no necesitas usarlo para usar -CoDev Code. - ---- - -## Contexto - -Existe una gran cantidad de modelos, pero solo unos pocos de -estos modelos funcionan bien como agentes de coding. Además, la mayoría de los proveedores están -configurados de forma muy diferente; por eso obtienes un rendimiento y una calidad muy distintos. - -:::tip -Probamos un grupo selecto de modelos y proveedores que funcionan bien con CoDev Code. -::: - -Así que, si estás usando un modelo a través de algo como OpenRouter, nunca puedes estar -seguro de si estás obteniendo la mejor versión del modelo que quieres. - -Para solucionar esto, hicimos un par de cosas: - -1. Probamos un grupo selecto de modelos y hablamos con sus equipos sobre cómo - ejecutarlos de la mejor manera. -2. Luego trabajamos con algunos proveedores para asegurarnos de que se estuvieran sirviendo - correctamente. -3. Por último, evaluamos la combinación de modelo/proveedor y elaboramos - una lista que creemos que vale la pena recomendar. - -OpenCode Zen es un gateway de AI que te da acceso a estos modelos. - ---- - -## Cómo funciona - -OpenCode Zen funciona como cualquier otro proveedor en CoDev Code. - -1. Inicias sesión en **OpenCode Zen**, agregas tus datos de facturación - y copias tu API key. -2. Ejecutas el comando `/connect` en la TUI, seleccionas OpenCode Zen y pegas tu API key. -3. Ejecuta `/models` en la TUI para ver la lista de modelos que recomendamos. - -Se te cobra por solicitud y puedes agregar créditos a tu cuenta. - ---- - -## Endpoints - -También puedes acceder a nuestros modelos a través de los siguientes endpoints de API. - -| Modelo | Model ID | Endpoint | AI SDK Package | -| ---------------------- | ---------------------- | ---------------------------------------------------- | --------------------------- | -| GPT 5.6 Sol | gpt-5.6-sol | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.6 Terra | gpt-5.6-terra | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.5 | gpt-5.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.5 Pro | gpt-5.5-pro | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Pro | gpt-5.4-pro | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Mini | gpt-5.4-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Nano | gpt-5.4-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.3 Codex Spark | gpt-5.3-codex-spark | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 | gpt-5.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex | gpt-5.1-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex Max | gpt-5.1-codex-max | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex Mini | gpt-5.1-codex-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 | gpt-5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 Codex | gpt-5-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 Nano | gpt-5-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| Claude Fable 5 | claude-fable-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.8 | claude-opus-4-8 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.7 | claude-opus-4-7 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.6 | claude-opus-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.5 | claude-opus-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 5 | claude-sonnet-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 4.6 | claude-sonnet-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 4.5 | claude-sonnet-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Haiku 4.5 | claude-haiku-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Gemini 3.5 Flash | gemini-3.5-flash | `https://opencode.ai/zen/v1/models/gemini-3.5-flash` | `@ai-sdk/google` | -| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` | -| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` | -| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.5 Plus | qwen3.5-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| DeepSeek V4 Pro | deepseek-v4-pro | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash | deepseek-v4-flash | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5.2 | glm-5.2 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5.1 | glm-5.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5 | glm-5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.5 | kimi-k2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.6 | kimi-k2.6 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| North Mini Code Free | north-mini-code-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash Free | deepseek-v4-flash-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | - -El [identificador del modelo](/docs/config/#models) en tu configuración de CoDev Code -usa el formato `opencode/`. Por ejemplo, para GPT 5.5, usarías -`opencode/gpt-5.5` en tu configuración. - ---- - -### Modelos - -Puedes obtener la lista completa de modelos disponibles y sus metadatos desde: - -``` -https://opencode.ai/zen/v1/models -``` - ---- - -## Precios - -Admitimos un modelo de pago por uso. A continuación se muestran los precios **por 1M tokens**. - -| Modelo | Entrada | Salida | Lectura en caché | Escritura en caché | -| --------------------------------- | ------- | ------- | ---------------- | ------------------ | -| Big Pickle | Free | Free | Free | - | -| DeepSeek V4 Flash Free | Free | Free | Free | - | -| MiMo-V2.5 Free | Free | Free | Free | - | -| North Mini Code Free | Free | Free | Free | - | -| Nemotron 3 Ultra Free | Free | Free | Free | - | -| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | -| GLM 5.2 | $1.40 | $4.40 | $0.26 | - | -| GLM 5.1 | $1.40 | $4.40 | $0.26 | - | -| GLM 5 | $1.00 | $3.20 | $0.20 | - | -| Kimi K2.7 Code | $0.95 | $4.00 | $0.19 | - | -| Kimi K2.6 | $0.95 | $4.00 | $0.16 | - | -| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - | -| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | -| Qwen3.7 Plus | $0.40 | $1.60 | $0.04 | $0.50 | -| Qwen3.6 Plus | $0.50 | $3.00 | $0.05 | $0.625 | -| Qwen3.5 Plus | $0.20 | $1.20 | $0.02 | $0.25 | -| DeepSeek V4 Pro | $1.74 | $3.48 | $0.145 | - | -| DeepSeek V4 Flash | $0.14 | $0.28 | $0.028 | - | -| Grok 4.5 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | -| Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | -| Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | -| Claude Fable 5 | $10.00 | $50.00 | $1.00 | $12.50 | -| Claude Opus 4.8 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.7 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.6 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.5 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Sonnet 5 | $2.00 | $10.00 | $0.20 | $2.50 | -| Claude Sonnet 4.6 | $3.00 | $15.00 | $0.30 | $3.75 | -| Claude Sonnet 4.5 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 | -| Claude Sonnet 4.5 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 | -| Claude Haiku 4.5 | $1.00 | $5.00 | $0.10 | $1.25 | -| Gemini 3.5 Flash | $1.50 | $9.00 | $0.15 | - | -| Gemini 3.1 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | -| Gemini 3.1 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | -| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $5.00 | $30.00 | $0.50 | $6.25 | -| GPT 5.6 Sol (> 272K tokens) | $10.00 | $45.00 | $1.00 | $12.50 | -| GPT 5.6 Terra (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Terra (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | -| GPT 5.6 Luna (≤ 272K tokens) | $1.00 | $6.00 | $0.10 | $1.25 | -| GPT 5.6 Luna (> 272K tokens) | $2.00 | $9.00 | $0.20 | $2.50 | -| GPT 5.5 (≤ 272K tokens) | $5.00 | $30.00 | $0.50 | - | -| GPT 5.5 (> 272K tokens) | $10.00 | $45.00 | $1.00 | - | -| GPT 5.5 Pro | $30.00 | $180.00 | $30.00 | - | -| GPT 5.4 (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | - | -| GPT 5.4 (> 272K tokens) | $5.00 | $22.50 | $0.50 | - | -| GPT 5.4 Pro | $30.00 | $180.00 | $30.00 | - | -| GPT 5.4 Mini | $0.75 | $4.50 | $0.075 | - | -| GPT 5.4 Nano | $0.20 | $1.25 | $0.02 | - | -| GPT 5.3 Codex Spark | $1.75 | $14.00 | $0.175 | - | -| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | -| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | -| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | -| GPT 5.1 | $1.07 | $8.50 | $0.107 | - | -| GPT 5.1 Codex | $1.07 | $8.50 | $0.107 | - | -| GPT 5.1 Codex Max | $1.25 | $10.00 | $0.125 | - | -| GPT 5.1 Codex Mini | $0.25 | $2.00 | $0.025 | - | -| GPT 5 | $1.07 | $8.50 | $0.107 | - | -| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - | -| GPT 5 Nano | $0.05 | $0.40 | $0.005 | - | - -Puede que notes _Claude Haiku 3.5_ en tu historial de uso. Este es un [modelo de bajo costo](/docs/config/#models) que se usa para generar los títulos de tus sesiones. - -:::note -Las comisiones de tarjeta de crédito se trasladan al costo (4.4% + $0.30 por transacción); no cobramos nada más allá de eso. -::: - -Los modelos gratuitos: - -- DeepSeek V4 Flash Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo. -- MiMo-V2.5 Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo. -- North Mini Code Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo. -- Nemotron 3 Ultra Free está disponible en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo. -- Big Pickle es un modelo stealth que es gratuito en OpenCode por tiempo limitado. El equipo está usando este tiempo para recopilar comentarios y mejorar el modelo. - -Contáctanos si tienes alguna pregunta. - ---- - -### Recarga automática - -Si tu saldo baja de $5, Zen recargará automáticamente $20. - -Puedes cambiar el monto de la recarga automática. También puedes desactivar por completo la recarga automática. - ---- - -### Límites mensuales - -También puedes establecer un límite de uso mensual para todo el workspace y para cada -miembro de tu equipo. - -Por ejemplo, supongamos que estableces un límite de uso mensual de $20. Zen no usará -más de $20 en un mes. Pero si tienes habilitada la recarga automática, Zen podría terminar -cobrándote más de $20 si tu saldo baja de $5. - ---- - -### Modelos obsoletos - -| Modelo | Fecha de retirada | -| ------------------ | ----------------- | -| GPT 5.2 Codex | July 23, 2026 | -| GPT 5.1 Codex | July 23, 2026 | -| GPT 5.1 Codex Max | July 23, 2026 | -| GPT 5.1 Codex Mini | July 23, 2026 | -| GPT 5 Codex | July 23, 2026 | -| Claude Opus 4.1 | August 5, 2026 | -| Claude Sonnet 4 | June 15, 2026 | -| Claude Haiku 3.5 | February 16, 2026 | -| Gemini 3 Pro | March 9, 2026 | -| MiniMax M2.5 | August 5, 2026 | -| MiniMax M2.1 | March 15, 2026 | -| GLM 5 | May 14, 2026 | -| GLM 4.7 | March 15, 2026 | -| GLM 4.6 | March 15, 2026 | -| Kimi K2.5 | August 5, 2026 | -| Kimi K2 Thinking | March 6, 2026 | -| Kimi K2 | March 6, 2026 | -| Qwen3 Coder 480B | February 6, 2026 | - ---- - -## Privacidad - -Todos nuestros modelos están alojados en US. Nuestros proveedores siguen una política de zero-retention y no usan tus datos para el entrenamiento de modelos, con las siguientes excepciones: - -- Big Pickle: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. -- DeepSeek V4 Flash Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. -- MiMo-V2.5 Free: Durante su período gratuito, los datos recopilados pueden usarse para mejorar el modelo. -- North Mini Code Free: Durante el período gratuito, los datos recopilados podrán conservarse y utilizarse para mejorar el modelo. No envíes datos personales ni confidenciales. Consulta nuestros [Términos de uso](https://cohere.com/terms-of-use) y nuestra [Política de privacidad](https://cohere.com/privacy). -- Nemotron 3 Ultra Free (endpoints gratuitos de NVIDIA): Solo para uso de prueba — no envíes datos personales ni confidenciales. Tu uso se registra con fines de seguridad y para mejorar los productos y servicios de NVIDIA. Los datos de sesión registrados con fines de mejora no están vinculados a tu identidad ni a ningún identificador persistente. Para obtener más información sobre nuestras prácticas de procesamiento de datos, consulta nuestra [Política de privacidad](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). Al interactuar con este endpoint, aceptas que recopilemos, registremos y usemos dicha información, así como los [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). -- OpenAI APIs: Las solicitudes se conservan durante 30 días de acuerdo con [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). -- Anthropic APIs: Las solicitudes se conservan durante 30 días de acuerdo con [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). - ---- - -## Para equipos - -Zen también funciona muy bien para equipos. Puedes invitar a compañeros de equipo, asignar roles, seleccionar -los modelos que usa tu equipo y más. - -:::note -Los workspaces son actualmente gratuitos para equipos como parte de la beta. -::: - -Gestionar tu workspace es actualmente gratuito para equipos como parte de la beta. Compartiremos -más detalles sobre los precios pronto. - ---- - -### Roles - -Puedes invitar a compañeros de equipo a tu workspace y asignar roles: - -- **Admin**: Gestiona modelos, miembros, API keys y facturación -- **Member**: Gestiona solo sus propias API keys - -Los admins también pueden establecer límites mensuales de gasto para cada miembro para mantener los costos bajo control. - ---- - -### Acceso a modelos - -Los admins pueden habilitar o deshabilitar modelos específicos para el workspace. Las solicitudes realizadas a un modelo deshabilitado devolverán un error. - -Esto resulta útil en los casos en los que quieres deshabilitar el uso de un modelo que -recopila datos. - ---- - -### Bring your own key - -Puedes usar tus propias API keys de OpenAI o Anthropic mientras sigues accediendo a otros modelos en Zen. - -Cuando usas tus propias keys, los tokens te los factura directamente el proveedor, no Zen. - -Por ejemplo, tu organización podría ya tener una key para OpenAI o Anthropic -y quieres usarla en lugar de la que proporciona Zen. - ---- - -## Objetivos - -Creamos OpenCode Zen para: - -1. **Benchmark** de los mejores modelos/proveedores para agentes de coding. -2. Tener acceso a las opciones de **más alta calidad** y no degradar el rendimiento ni enrutar a proveedores más baratos. -3. Trasladar cualquier **bajada de precio** vendiendo al costo; así que el único margen es para cubrir nuestras comisiones de procesamiento. -4. Que no haya **lock-in** al permitirte usarlo con cualquier otro agente de coding. Y permitirte siempre usar también cualquier otro proveedor con CoDev Code. diff --git a/packages/web/src/content/docs/formatters.mdx b/packages/web/src/content/docs/formatters.mdx deleted file mode 100644 index 9938fd03b7..0000000000 --- a/packages/web/src/content/docs/formatters.mdx +++ /dev/null @@ -1,143 +0,0 @@ ---- -title: Formatters -description: CoDev Code uses language specific formatters. ---- - -CoDev Code can format files after they are written or edited using language-specific formatters. Formatters are disabled by default; enable them in your config before CoDev Code will run them. - ---- - -## Built-in - -CoDev Code comes with several built-in formatters for popular languages and frameworks. Below is a list of the formatters, supported file extensions, and commands or config options it needs. - -| Formatter | Extensions | Requirements | -| -------------------- | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------- | -| air | .R | `air` command available | -| biome | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://biomejs.dev/) | `biome.json(c)` config file | -| cargofmt | .rs | `cargo fmt` command available | -| clang-format | .c, .cpp, .h, .hpp, .ino, and [more](https://clang.llvm.org/docs/ClangFormat.html) | `.clang-format` config file | -| cljfmt | .clj, .cljs, .cljc, .edn | `cljfmt` command available | -| dart | .dart | `dart` command available | -| dfmt | .d | `dfmt` command available | -| gleam | .gleam | `gleam` command available | -| gofmt | .go | `gofmt` command available | -| htmlbeautifier | .erb, .html.erb | `htmlbeautifier` command available | -| ktlint | .kt, .kts | `ktlint` command available | -| mix | .ex, .exs, .eex, .heex, .leex, .neex, .sface | `mix` command available | -| nixfmt | .nix | `nixfmt` command available | -| ocamlformat | .ml, .mli | `ocamlformat` command available and `.ocamlformat` config file | -| ormolu | .hs | `ormolu` command available | -| oxfmt (Experimental) | .js, .jsx, .ts, .tsx | `oxfmt` dependency in `package.json` and an [experimental env variable flag](/docs/cli/#experimental) | -| pint | .php | `laravel/pint` dependency in `composer.json` | -| prettier | .js, .jsx, .ts, .tsx, .html, .css, .md, .json, .yaml, and [more](https://prettier.io/docs/en/index.html) | `prettier` dependency in `package.json` | -| rubocop | .rb, .rake, .gemspec, .ru | `rubocop` command available | -| ruff | .py, .pyi | `ruff` command available with config | -| rustfmt | .rs | `rustfmt` command available | -| shfmt | .sh, .bash | `shfmt` command available | -| standardrb | .rb, .rake, .gemspec, .ru | `standardrb` command available | -| terraform | .tf, .tfvars | `terraform` command available | -| uv | .py, .pyi | `uv` command available | -| zig | .zig, .zon | `zig` command available | - -When formatters are enabled, CoDev Code will use `prettier` for matching files if your project has `prettier` in `package.json`. - ---- - -## How it works - -When CoDev Code writes or edits a file and formatters are enabled, it: - -1. Checks the file extension against all enabled formatters. -2. Runs the appropriate formatter command on the file. -3. Applies the formatting changes. - -This process happens in the background for enabled formatters. - ---- - -## Configure - -You can enable and customize formatters through the `formatter` section in your CoDev Code config. - -To enable all built-in formatters, set `formatter` to `true`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": true -} -``` - -Use an object to keep built-ins enabled while configuring overrides or custom formatters. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "formatter": {} -} -``` - -Each formatter configuration supports the following: - -| Property | Type | Description | -| ------------- | -------- | ------------------------------------------------------------------------------------------ | -| `disabled` | boolean | Set this to `true` to disable the formatter | -| `command` | string[] | The command to run for formatting. Required for custom formatters; optional for built-ins. | -| `environment` | object | Environment variables to set when running the formatter | -| `extensions` | string[] | File extensions this formatter should handle | - -Let's look at some examples. - ---- - -### Disabling formatters - -If `formatter` is omitted, all formatters are disabled. To disable all formatters after another config enabled them, set `formatter` to `false`: - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": false -} -``` - -To disable a **specific** formatter, set `disabled` to `true`: - -```json title="codev.json" {5} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "disabled": true - } - } -} -``` - ---- - -### Custom formatters - -You can configure built-in formatters with options like `environment` or `extensions`. To add a custom formatter, specify a `command` and `extensions`: - -```json title="codev.json" {4-14} -{ - "$schema": "https://opencode.ai/config.json", - "formatter": { - "prettier": { - "command": ["npx", "prettier", "--write", "$FILE"], - "environment": { - "NODE_ENV": "development" - }, - "extensions": [".js", ".ts", ".jsx", ".tsx"] - }, - "custom-markdown-formatter": { - "command": ["deno", "fmt", "$FILE"], - "extensions": [".md"] - } - } -} -``` - -The **`$FILE` placeholder** in the command will be replaced with the path to the file being formatted. diff --git a/packages/web/src/content/docs/github.mdx b/packages/web/src/content/docs/github.mdx deleted file mode 100644 index c4fd525e27..0000000000 --- a/packages/web/src/content/docs/github.mdx +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: GitHub -description: Use CoDev Code in GitHub issues and pull-requests. ---- - -CoDev Code integrates with your GitHub workflow. Mention `/codev` in your comment, and CoDev Code will execute tasks within your GitHub Actions runner. - ---- - -## Features - -- **Triage issues**: Ask CoDev Code to look into an issue and explain it to you. -- **Fix and implement**: Ask CoDev Code to fix an issue or implement a feature. And it will work in a new branch and submits a PR with all the changes. -- **Secure**: CoDev Code runs inside your GitHub's runners. - ---- - -## Installation - -Run the following command in a project that is in a GitHub repo: - -```bash -codev github install -``` - -This will walk you through creating the workflow file and setting up secrets. - ---- - -### Manual Setup - -Or you can set it up manually. - -1. **Add the workflow** - - Add the following workflow file to `.github/workflows/codev.yml` in your repo. Make sure to set the appropriate `model` and required API keys in `env`. - - ```yml title=".github/workflows/codev.yml" {25,30} - name: codev - - on: - issue_comment: - types: [created] - pull_request_review_comment: - types: [created] - - jobs: - codev: - if: contains(github.event.comment.body, '/codev') - runs-on: ubuntu-latest - permissions: - contents: write - issues: write - pull-requests: write - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - fetch-depth: 1 - persist-credentials: false - - - name: Run CoDev Code - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - ``` - - The action authenticates with the workflow's [built-in `GITHUB_TOKEN`](https://docs.github.com/en/actions/tutorials/authenticate-with-github_token) by default, so no GitHub App install is needed. Commits, comments, and pull requests appear as coming from `github-actions[bot]`. - -2. **Store the API keys in secrets** - - In your organization or project **settings**, expand **Secrets and variables** on the left and select **Actions**. And add the required API keys. - ---- - -## Configuration - -- `model`: The model to use with CoDev Code. Takes the format of `provider/model`. This is **required**. -- `agent`: The agent to use. Must be a primary agent. Falls back to `default_agent` from config or `"build"` if not found. -- `share`: Whether to share the CoDev Code session. Defaults to **false**; sharing publishes the session to upstream's share service. -- `prompt`: Optional custom prompt to override the default behavior. Use this to customize how CoDev Code processes requests. -- `mentions`: Comma-separated list of trigger phrases (case-insensitive). Defaults to `/codev`. -- `use_github_token`: Whether to authenticate with the workflow's `GITHUB_TOKEN`. Defaults to **true**. Make sure to grant the required permissions in your workflow: - - ```yaml - permissions: - contents: write - pull-requests: write - issues: write - ``` - - Set it to `false` only if the upstream [opencode-agent GitHub App](https://github.com/apps/opencode-agent) is installed on the repository; the action then exchanges an OIDC token for an app token (this requires `id-token: write` permission), and activity appears as coming from the app. - ---- - -## Supported Events - -CoDev Code can be triggered by the following GitHub events: - -| Event Type | Triggered By | Details | -| ----------------------------- | -------------------------------------- | ------------------------------------------------------------------------------------------------------- | -| `issue_comment` | Comment on an issue or PR | Mention `/codev` in your comment. CoDev Code reads context and can create branches, open PRs, or reply. | -| `pull_request_review_comment` | Comment on specific code lines in a PR | Mention `/codev` while reviewing code. CoDev Code receives file path, line numbers, and diff context. | -| `issues` | Issue opened or edited | Automatically trigger CoDev Code when issues are created or modified. Requires `prompt` input. | -| `pull_request` | PR opened or updated | Automatically trigger CoDev Code when PRs are opened, synchronized, or reopened. Useful for automated reviews. | -| `schedule` | Cron-based schedule | Run CoDev Code on a schedule. Requires `prompt` input. Output goes to logs and PRs (no issue to comment on). | -| `workflow_dispatch` | Manual trigger from GitHub UI | Trigger CoDev Code on demand via Actions tab. Requires `prompt` input. Output goes to logs and PRs. | - -### Schedule Example - -Run CoDev Code on a schedule to perform automated tasks: - -```yaml title=".github/workflows/codev-scheduled.yml" -name: Scheduled CoDev Code Task - -on: - schedule: - - cron: "0 9 * * 1" # Every Monday at 9am UTC - -jobs: - codev: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - steps: - - name: Checkout repository - uses: actions/checkout@v6 - with: - persist-credentials: false - - - name: Run CoDev Code - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review the codebase for any TODO comments and create a summary. - If you find issues worth addressing, open an issue to track them. -``` - -For scheduled events, the `prompt` input is **required** since there's no comment to extract instructions from. Scheduled workflows run without a user context to permission-check, so the workflow must grant `contents: write` and `pull-requests: write` if you expect CoDev Code to create branches or PRs. - ---- - -### Pull Request Example - -Automatically review PRs when they are opened or updated: - -```yaml title=".github/workflows/codev-review.yml" -name: codev-review - -on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - -jobs: - review: - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - issues: write - steps: - - uses: actions/checkout@v6 - with: - persist-credentials: false - - uses: quickbeard/codev-code/github@main - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review this pull request: - - Check for code quality issues - - Look for potential bugs - - Suggest improvements -``` - -For `pull_request` events, if no `prompt` is provided, CoDev Code defaults to reviewing the pull request. - ---- - -### Issues Triage Example - -Automatically triage new issues. This example filters to accounts older than 30 days to reduce spam: - -```yaml title=".github/workflows/codev-triage.yml" -name: Issue Triage - -on: - issues: - types: [opened] - -jobs: - triage: - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - issues: write - steps: - - name: Check account age - id: check - uses: actions/github-script@v7 - with: - script: | - const user = await github.rest.users.getByUsername({ - username: context.payload.issue.user.login - }); - const created = new Date(user.data.created_at); - const days = (Date.now() - created) / (1000 * 60 * 60 * 24); - return days >= 30; - result-encoding: string - - - uses: actions/checkout@v6 - if: steps.check.outputs.result == 'true' - with: - persist-credentials: false - - - uses: quickbeard/codev-code/github@main - if: steps.check.outputs.result == 'true' - env: - ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - model: anthropic/claude-sonnet-4-20250514 - prompt: | - Review this issue. If there's a clear fix or relevant docs: - - Provide documentation links - - Add error handling guidance for code examples - Otherwise, do not comment. -``` - -For `issues` events, the `prompt` input is **required** since there's no comment to extract instructions from. - ---- - -## Custom prompts - -Override the default prompt to customize CoDev Code's behavior for your workflow. - -```yaml title=".github/workflows/codev.yml" -- uses: quickbeard/codev-code/github@main - with: - model: anthropic/claude-sonnet-4-5 - prompt: | - Review this pull request: - - Check for code quality issues - - Look for potential bugs - - Suggest improvements -``` - -This is useful for enforcing specific review criteria, coding standards, or focus areas relevant to your project. - ---- - -## Examples - -Here are some examples of how you can use CoDev Code in GitHub. - -- **Explain an issue** - - Add this comment in a GitHub issue. - - ``` - /codev explain this issue - ``` - - CoDev Code will read the entire thread, including all comments, and reply with a clear explanation. - -- **Fix an issue** - - In a GitHub issue, say: - - ``` - /codev fix this - ``` - - And CoDev Code will create a new branch, implement the changes, and open a PR with the changes. - -- **Review PRs and make changes** - - Leave the following comment on a GitHub PR. - - ``` - Delete the attachment from S3 when the note is removed /codev - ``` - - CoDev Code will implement the requested change and commit it to the same PR. - -- **Review specific code lines** - - Leave a comment directly on code lines in the PR's "Files" tab. CoDev Code automatically detects the file, line numbers, and diff context to provide precise responses. - - ``` - [Comment on specific lines in Files tab] - /codev add error handling here - ``` - - When commenting on specific lines, CoDev Code receives: - - The exact file being reviewed - - The specific lines of code - - The surrounding diff context - - Line number information - - This allows for more targeted requests without needing to specify file paths or line numbers manually. diff --git a/packages/web/src/content/docs/gitlab.mdx b/packages/web/src/content/docs/gitlab.mdx deleted file mode 100644 index 7188f0560f..0000000000 --- a/packages/web/src/content/docs/gitlab.mdx +++ /dev/null @@ -1,195 +0,0 @@ ---- -title: GitLab -description: Use CoDev Code in GitLab issues and merge requests. ---- - -CoDev Code integrates with your GitLab workflow through your GitLab CI/CD pipeline or with GitLab Duo. - -In both cases, CoDev Code will run on your GitLab runners. - ---- - -## GitLab CI - -CoDev Code works in a regular GitLab pipeline. You can build it into a pipeline as a [CI component](https://docs.gitlab.com/ee/ci/components/) - -Here we are using a community-created CI/CD component for CoDev Code — [nagyv/gitlab-opencode](https://gitlab.com/nagyv/gitlab-opencode). - ---- - -### Features - -- **Use custom configuration per job**: Configure CoDev Code with a custom configuration directory, for example `./config/#custom-directory` to enable or disable functionality per CoDev Code invocation. -- **Minimal setup**: The CI component sets up CoDev Code in the background, you only need to create the CoDev Code configuration and the initial prompt. -- **Flexible**: The CI component supports several inputs for customizing its behavior - ---- - -### Setup - -1. Store your CoDev Code authentication JSON as a File type CI environment variables under **Settings** > **CI/CD** > **Variables**. Make sure to mark them as "Masked and hidden". -2. Add the following to your `.gitlab-ci.yml` file. - - ```yaml title=".gitlab-ci.yml" - include: - - component: $CI_SERVER_FQDN/nagyv/gitlab-opencode/opencode@2 - inputs: - config_dir: ${CI_PROJECT_DIR}/opencode-config - auth_json: $CODEV_AUTH_JSON # The variable name for your CoDev Code authentication JSON - command: optional-custom-command - message: "Your prompt here" - ``` - -For more inputs and use cases [check out the docs](https://gitlab.com/explore/catalog/nagyv/gitlab-opencode) for this component. - ---- - -## GitLab Duo - -CoDev Code integrates with your GitLab workflow. -Mention `@opencode` in a comment, and CoDev Code will execute tasks within your GitLab CI pipeline. - ---- - -### Features - -- **Triage issues**: Ask CoDev Code to look into an issue and explain it to you. -- **Fix and implement**: Ask CoDev Code to fix an issue or implement a feature. - It will create a new branch and raise a merge request with the changes. -- **Secure**: CoDev Code runs on your GitLab runners. - ---- - -### Setup - -CoDev Code runs in your GitLab CI/CD pipeline, here's what you'll need to set it up: - -:::tip -Check out the [**GitLab docs**](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/) for up to date instructions. -::: - -1. Configure your GitLab environment -2. Set up CI/CD -3. Get an AI model provider API key -4. Create a service account -5. Configure CI/CD variables -6. Create a flow config file, here's an example: - -

- - Flow configuration - - ```yaml - image: node:22-slim - commands: - - echo "Installing CoDev Code" - - npm install --global codev-code - - echo "Installing glab" - - export GITLAB_TOKEN=$GITLAB_TOKEN_OPENCODE - - apt-get update --quiet && apt-get install --yes curl wget gpg git && rm --recursive --force /var/lib/apt/lists/* - - curl --silent --show-error --location "https://raw.githubusercontent.com/upciti/wakemeops/main/assets/install_repository" | bash - - apt-get install --yes glab - - echo "Configuring glab" - - echo $GITLAB_HOST - - echo "Creating CoDev Code auth configuration" - - mkdir --parents ~/.local/share/codev - - | - cat > ~/.local/share/codev/auth.json << EOF - { - "anthropic": { - "type": "api", - "key": "$ANTHROPIC_API_KEY" - } - } - EOF - - echo "Configuring git" - - git config --global user.email "opencode@gitlab.com" - - git config --global user.name "CoDev Code" - - echo "Testing glab" - - glab issue list - - echo "Running CoDev Code" - - | - codev run " - You are an AI assistant helping with GitLab operations. - - Context: $AI_FLOW_CONTEXT - Task: $AI_FLOW_INPUT - Event: $AI_FLOW_EVENT - - Please execute the requested task using the available GitLab tools. - Be thorough in your analysis and provide clear explanations. - - - Please use the glab CLI to access data from GitLab. The glab CLI has already been authenticated. You can run the corresponding commands. - - If you are asked to summarize an MR or issue or asked to provide more information then please post back a note to the MR/Issue so that the user can see it. - You don't need to commit or push up changes, those will be done automatically based on the file changes you make. - - " - - git checkout --branch $CI_WORKLOAD_REF origin/$CI_WORKLOAD_REF - - echo "Checking for git changes and pushing if any exist" - - | - if ! git diff --quiet || ! git diff --cached --quiet || [ --not --zero "$(git ls-files --others --exclude-standard)" ]; then - echo "Git changes detected, adding and pushing..." - git add . - if git diff --cached --quiet; then - echo "No staged changes to commit" - else - echo "Committing changes to branch: $CI_WORKLOAD_REF" - git commit --message "Codex changes" - echo "Pushing changes up to $CI_WORKLOAD_REF" - git push https://gitlab-ci-token:$GITLAB_TOKEN@$GITLAB_HOST/gl-demo-ultimate-dev-ai-epic-17570/test-java-project.git $CI_WORKLOAD_REF - echo "Changes successfully pushed" - fi - else - echo "No git changes detected, skipping push" - fi - variables: - - ANTHROPIC_API_KEY - - GITLAB_TOKEN_OPENCODE - - GITLAB_HOST - ``` - -
- -You can refer to the [GitLab CLI agents docs](https://docs.gitlab.com/user/duo_agent_platform/agent_assistant/) for detailed instructions. - ---- - -### Examples - -Here are some examples of how you can use CoDev Code in GitLab. - -:::tip -You can configure to use a different trigger phrase than `@opencode`. -::: - -- **Explain an issue** - - Add this comment in a GitLab issue. - - ``` - @opencode explain this issue - ``` - - CoDev Code will read the issue and reply with a clear explanation. - -- **Fix an issue** - - In a GitLab issue, say: - - ``` - @opencode fix this - ``` - - CoDev Code will create a new branch, implement the changes, and open a merge request with the changes. - -- **Review merge requests** - - Leave the following comment on a GitLab merge request. - - ``` - @opencode review this merge request - ``` - - CoDev Code will review the merge request and provide feedback. diff --git a/packages/web/src/content/docs/go.mdx b/packages/web/src/content/docs/go.mdx deleted file mode 100644 index 2e3bda9e19..0000000000 --- a/packages/web/src/content/docs/go.mdx +++ /dev/null @@ -1,211 +0,0 @@ ---- -title: Go -description: Low cost subscription for open coding models. ---- - -import config from "../../../config.mjs" -export const console = config.console -export const email = `mailto:${config.email}` - -OpenCode Go is a low cost subscription — **$5 for your first month**, then **$10/month** — that gives you reliable access to popular open coding models. - -Go works like any other provider in CoDev Code. You subscribe to OpenCode Go and -get your API key. It's **completely optional** and you don't need to use it to -use CoDev Code. - -It is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. - ---- - -## Background - -Open models have gotten really good. They now reach performance close to -proprietary models for coding tasks. And because many providers can serve them -competitively, they are usually far cheaper. - -However, getting reliable, low latency access to them can be difficult. Providers -vary in quality and availability. - -:::tip -We tested a select group of models and providers that work well with CoDev Code. -::: - -To fix this, we did a couple of things: - -1. We tested a select group of open models and talked to their teams about how to - best run them. -2. We then worked with a few providers to make sure these were being served - correctly. -3. Finally, we benchmarked the combination of the model/provider and came up - with a list that we feel good recommending. - -OpenCode Go gives you access to these models for **$5 for your first month**, then **$10/month**. - ---- - -## How it works - -OpenCode Go works like any other provider in CoDev Code. - -1. You sign in to **OpenCode Zen**, subscribe to Go, and - copy your API key. -2. You run the `/connect` command in the TUI, select `OpenCode Go`, and paste - your API key. -3. Run `/models` in the TUI to see the list of models available through Go. - -:::note -Only one member per workspace can subscribe to OpenCode Go. -::: - -The current list of models includes: - -- **GLM-5.2** -- **GLM-5.1** -- **Kimi K2.7 Code** -- **Kimi K2.6** -- **MiMo-V2.5** -- **MiMo-V2.5-Pro** -- **MiniMax M3** -- **MiniMax M2.7** -- **Qwen3.7 Max** -- **Qwen3.7 Plus** -- **Qwen3.6 Plus** -- **DeepSeek V4 Pro** -- **DeepSeek V4 Flash** - -The list of models may change as we test and add new ones. - ---- - -## Usage limits - -OpenCode Go includes the following limits: - -- **5 hour limit** — $12 of usage -- **Weekly limit** — $30 of usage -- **Monthly limit** — $60 of usage - -Limits are defined in dollar value. This means your actual request count depends on the model you use. Cheaper models like DeepSeek V4 Flash allow for more requests, while higher-cost models like GLM-5.2 allow for fewer. - -The table below provides an estimated request count based on typical Go usage patterns: - -| Model | requests per 5 hour | requests per week | requests per month | -| ----------------- | ------------------- | ----------------- | ------------------ | -| GLM-5.2 | 880 | 2,150 | 4,300 | -| GLM-5.1 | 880 | 2,150 | 4,300 | -| Kimi K2.6 | 1,150 | 2,880 | 5,750 | -| Kimi K2.7 Code | 1,350 | 4,630 | 9,250 | -| MiMo-V2.5 | 30,100 | 75,200 | 150,400 | -| MiMo-V2.5-Pro | 3,250 | 8,150 | 16,300 | -| MiniMax M3 | 3,200 | 8,000 | 16,000 | -| MiniMax M2.7 | 3,400 | 8,500 | 17,000 | -| Qwen3.7 Max | 950 | 2,390 | 4,770 | -| Qwen3.7 Plus | 4,300 | 10,800 | 21,600 | -| Qwen3.6 Plus | 3,300 | 8,200 | 16,300 | -| DeepSeek V4 Pro | 3,450 | 8,550 | 17,150 | -| DeepSeek V4 Flash | 31,650 | 79,050 | 158,150 | - -The estimates are based on observed average request patterns: - -- GLM-5.2/5.1 — 700 input, 52,000 cached, 150 output tokens per request -- Kimi K2.7 Code/K2.6 — 870 input, 55,000 cached, 200 output tokens per request -- DeepSeek V4 Pro — 750 input, 82,000 cached, 290 output tokens per request -- DeepSeek V4 Flash — 790 input, 68,000 cached, 280 output tokens per request -- MiniMax M3 — 510 input, 56,000 cached, 190 output tokens per request -- MiniMax M2.7 — 300 input, 55,000 cached, 125 output tokens per request -- MiMo-V2.5 — 830 input, 71,500 cached, 295 output tokens per request -- MiMo-V2.5-Pro — 790 input, 86,000 cached, 305 output tokens per request -- Qwen3.7 Max — 420 input, 66,000 cached, 200 output tokens per request -- Qwen3.7 Plus — 500 input, 57,000 cached, 190 output tokens per request -- Qwen3.6 Plus — 500 input, 57,000 cached, 190 output tokens per request - -The estimates are also based on the following prices per 1M tokens: - -| Model | Input | Output | Cached Read | Cached Write | -| ---------------------------- | ----- | ------ | ----------- | ------------ | -| GLM-5.2 | $1.40 | $4.40 | $0.26 | - | -| GLM-5.1 | $1.40 | $4.40 | $0.26 | - | -| Kimi K2.7 Code | $0.95 | $4.00 | $0.19 | - | -| Kimi K2.6 | $0.95 | $4.00 | $0.16 | - | -| MiMo V2.5 | $0.14 | $0.28 | $0.0028 | - | -| MiMo V2.5 Pro | $1.74 | $3.48 | $0.0145 | - | -| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | $0.375 | -| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | $0.375 | -| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | -| Qwen3.7 Plus (≤ 256K tokens) | $0.40 | $1.60 | $0.04 | $0.50 | -| Qwen3.7 Plus (> 256K tokens) | $1.20 | $4.80 | $0.12 | $1.50 | -| Qwen3.6 Plus (≤ 256K tokens) | $0.50 | $3.00 | $0.05 | $0.625 | -| Qwen3.6 Plus (> 256K tokens) | $2.00 | $6.00 | $0.20 | $2.50 | -| DeepSeek V4 Pro | $1.74 | $3.48 | $0.0145 | - | -| DeepSeek V4 Flash | $0.14 | $0.28 | $0.0028 | - | - -You can track your current usage in the **console**. - -:::tip -If you reach the usage limit, you can continue using the free models. -::: - -Usage limits may change as we learn from early usage and feedback. - ---- - -### Usage beyond limits - -If you also have credits on your Zen balance, you can enable the **Use balance** -option in the console. When enabled, Go will fall back to your Zen balance -after you've reached your usage limits instead of blocking requests. - ---- - -## Endpoints - -You can also access Go models through the following API endpoints. - -| Model | Model ID | Endpoint | AI SDK Package | -| ----------------- | ----------------- | ------------------------------------------------ | --------------------------- | -| GLM-5.2 | glm-5.2 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM-5.1 | glm-5.1 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.6 | kimi-k2.6 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Pro | deepseek-v4-pro | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash | deepseek-v4-flash | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5 | mimo-v2.5 | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5-Pro | mimo-v2.5-pro | `https://opencode.ai/zen/go/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/go/v1/messages` | `@ai-sdk/anthropic` | - -The [model id](/docs/config/#models) in your CoDev Code config -uses the format `opencode-go/`. For example, for Kimi K2.7 Code, you would -use `opencode-go/kimi-k2.7-code` in your config. - ---- - -### Models - -You can fetch the full list of available models and their metadata from: - -``` -https://opencode.ai/zen/go/v1/models -``` - ---- - -## Privacy - -The plan is designed primarily for international users, with models hosted in the US, EU, and Singapore for stable global access. Our providers follow a zero-retention policy and do not use your data for model training. - ---- - -## Goals - -We created OpenCode Go to: - -1. Make AI coding **accessible** to more people with a low cost subscription. -2. Provide **reliable** access to the best open coding models. -3. Curate models that are **tested and benchmarked** for coding agent use. -4. Have **no lock-in** by allowing you to use any other provider with CoDev Code as well. diff --git a/packages/web/src/content/docs/ide.mdx b/packages/web/src/content/docs/ide.mdx deleted file mode 100644 index 320bc4c95f..0000000000 --- a/packages/web/src/content/docs/ide.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: IDE -description: The CoDev Code extension for VS Code, Cursor, and other IDEs ---- - -CoDev Code integrates with VS Code, Cursor, or any IDE that supports a terminal. Just run `codev` in the terminal to get started. - ---- - -## Usage - -- **Quick Launch**: Use `Cmd+Esc` (Mac) or `Ctrl+Esc` (Windows/Linux) to open CoDev Code in a split terminal view, or focus an existing terminal session if one is already running. -- **New Session**: Use `Cmd+Shift+Esc` (Mac) or `Ctrl+Shift+Esc` (Windows/Linux) to start a new CoDev Code terminal session, even if one is already open. You can also click the CoDev Code button in the UI. -- **Context Awareness**: Automatically share your current selection or tab with CoDev Code. -- **File Reference Shortcuts**: Use `Cmd+Option+K` (Mac) or `Alt+Ctrl+K` (Linux/Windows) to insert file references. For example, `@File#L37-42`. - ---- - -## Installation - -To install CoDev Code on VS Code and popular forks like Cursor, Windsurf, VSCodium: - -1. Open VS Code -2. Open the integrated terminal -3. Run `codev` - the extension installs automatically - -If on the other hand you want to use your own IDE when you run `/editor` or `/export` from the TUI, you'll need to set `export EDITOR="code --wait"`. [Learn more](/docs/tui/#editor-setup). - ---- - -### Manual Install - -The extension is not listed on the Extension Marketplace. Build the `.vsix` from a checkout and install it manually: - -```bash -cd sdks/vscode -bun install -bun run vsix -code --install-extension dist/codev-code-.vsix -``` - ---- - -### Troubleshooting - -If the extension fails to install automatically: - -- Ensure you’re running `codev` in the integrated terminal. -- Confirm the CLI for your IDE is installed: - - For VS Code: `code` command - - For Cursor: `cursor` command - - For Windsurf: `windsurf` command - - For VSCodium: `codium` command - - If not, run `Cmd+Shift+P` (Mac) or `Ctrl+Shift+P` (Windows/Linux) and search for "Shell Command: Install 'code' command in PATH" (or the equivalent for your IDE) -- Ensure VS Code has permission to install extensions diff --git a/packages/web/src/content/docs/index.mdx b/packages/web/src/content/docs/index.mdx deleted file mode 100644 index 68f5952e4c..0000000000 --- a/packages/web/src/content/docs/index.mdx +++ /dev/null @@ -1,302 +0,0 @@ ---- -title: Intro -description: Get started with CoDev Code. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" -import config from "../../../config.mjs" -export const console = config.console - -[**CoDev Code**](/) is an open source AI coding agent. It's available as a terminal-based interface, desktop app, or IDE extension. - -![CoDev Code TUI with the opencode theme](../../assets/lander/screenshot.png) - -Let's get started. - ---- - -#### Prerequisites - -To use CoDev Code in your terminal, you'll need: - -1. A modern terminal emulator like: - - [WezTerm](https://wezterm.org), cross-platform - - [Alacritty](https://alacritty.org), cross-platform - - [Ghostty](https://ghostty.org), Linux and macOS - - [Kitty](https://sw.kovidgoyal.net/kitty/), Linux and macOS - -2. API keys for the LLM providers you want to use. - ---- - -## Install - -CoDev Code is distributed as the `codev-code` package on npm. Install it globally with your Node.js package manager to get the `codev` command. - - - - ```bash - npm install -g codev-code - ``` - - - ```bash - bun install -g codev-code - ``` - - - ```bash - pnpm install -g codev-code - ``` - - - ```bash - yarn global add codev-code - ``` - - - -#### Windows - -:::tip[Recommended: Use WSL] -For the best experience on Windows, we recommend using [Windows Subsystem for Linux (WSL)](/docs/windows-wsl). It provides better performance and full compatibility with CoDev Code's features. -::: - -On Windows, install the same way with npm (or another Node.js package manager): - -```bash -npm install -g codev-code -``` - -You can also grab the binary from the [Releases](https://github.com/quickbeard/codev-code/releases). - ---- - -## Configure - -With CoDev Code you can use any LLM provider by configuring their API keys. - -If you are new to using LLM providers, we recommend using [OpenCode Zen](/docs/zen). -It's a curated list of models that have been tested and verified by the OpenCode -team. - -1. Run the `/connect` command in the TUI, select opencode, and head to [opencode.ai/auth](https://opencode.ai/auth). - - ```txt - /connect - ``` - -2. Sign in, add your billing details, and copy your API key. - -3. Paste your API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -Alternatively, you can select one of the other providers. [Learn more](/docs/providers#directory). - ---- - -## Initialize - -Now that you've configured a provider, you can navigate to a project that -you want to work on. - -```bash -cd /path/to/project -``` - -And run CoDev Code. - -```bash -codev -``` - -Next, initialize CoDev Code for the project by running the following command. - -```bash frame="none" -/init -``` - -This will get CoDev Code to analyze your project and create an `AGENTS.md` file in -the project root. - -:::tip -You should commit your project's `AGENTS.md` file to Git. -::: - -This helps CoDev Code understand the project structure and the coding patterns -used. - ---- - -## Usage - -You are now ready to use CoDev Code to work on your project. Feel free to ask it -anything! - -If you are new to using an AI coding agent, here are some examples that might -help. - ---- - -### Ask questions - -You can ask CoDev Code to explain the codebase to you. - -:::tip -Use the `@` key to fuzzy search for files in the project. -::: - -```txt frame="none" "@packages/functions/src/api/index.ts" -How is authentication handled in @packages/functions/src/api/index.ts -``` - -This is helpful if there's a part of the codebase that you didn't work on. - ---- - -### Add features - -You can ask CoDev Code to add new features to your project. Though we first recommend asking it to create a plan. - -1. **Create a plan** - - CoDev Code has a _Plan mode_ that disables its ability to make changes and - instead suggest _how_ it'll implement the feature. - - Switch to it using the **Tab** key. You'll see an indicator for this in the lower right corner. - - ```bash frame="none" title="Switch to Plan mode" - - ``` - - Now let's describe what we want it to do. - - ```txt frame="none" - When a user deletes a note, we'd like to flag it as deleted in the database. - Then create a screen that shows all the recently deleted notes. - From this screen, the user can undelete a note or permanently delete it. - ``` - - You want to give CoDev Code enough details to understand what you want. It helps - to talk to it like you are talking to a junior developer on your team. - - :::tip - Give CoDev Code plenty of context and examples to help it understand what you - want. - ::: - -2. **Iterate on the plan** - - Once it gives you a plan, you can give it feedback or add more details. - - ```txt frame="none" - We'd like to design this new screen using a design I've used before. - [Image #1] Take a look at this image and use it as a reference. - ``` - - :::tip - Drag and drop images into the terminal to add them to the prompt. - ::: - - CoDev Code can scan any images you give it and add them to the prompt. You can - do this by dragging and dropping an image into the terminal. - -3. **Build the feature** - - Once you feel comfortable with the plan, switch back to _Build mode_ by - hitting the **Tab** key again. - - ```bash frame="none" - - ``` - - And asking it to make the changes. - - ```bash frame="none" - Sounds good! Go ahead and make the changes. - ``` - ---- - -### Make changes - -For more straightforward changes, you can ask CoDev Code to directly build it -without having to review the plan first. - -```txt frame="none" "@packages/functions/src/settings.ts" "@packages/functions/src/notes.ts" -We need to add authentication to the /settings route. Take a look at how this is -handled in the /notes route in @packages/functions/src/notes.ts and implement -the same logic in @packages/functions/src/settings.ts -``` - -You want to make sure you provide a good amount of detail so CoDev Code makes the right -changes. - ---- - -### Undo changes - -Let's say you ask CoDev Code to make some changes. - -```txt frame="none" "@packages/functions/src/api/index.ts" -Can you refactor the function in @packages/functions/src/api/index.ts? -``` - -But you realize that it is not what you wanted. You **can undo** the changes -using the `/undo` command. - -```bash frame="none" -/undo -``` - -CoDev Code will now revert the changes you made and show your original message -again. - -```txt frame="none" "@packages/functions/src/api/index.ts" -Can you refactor the function in @packages/functions/src/api/index.ts? -``` - -From here you can tweak the prompt and ask CoDev Code to try again. - -:::tip -You can run `/undo` multiple times to undo multiple changes. -::: - -Or you **can redo** the changes using the `/redo` command. - -```bash frame="none" -/redo -``` - ---- - -## Share - -The conversations that you have with CoDev Code can be [shared with your -team](/docs/share). - -```bash frame="none" -/share -``` - -This will create a link to the current conversation and copy it to your clipboard. - -:::note -Conversations are not shared by default. -::: - -Here's an [example conversation](https://opencode.ai/s/4XP1fce5) with CoDev Code. - ---- - -## Customize - -And that's it! You are now a pro at using CoDev Code. - -To make it your own, we recommend [picking a theme](/docs/themes), [customizing the keybinds](/docs/keybinds), [configuring code formatters](/docs/formatters), [creating custom commands](/docs/commands), or playing around with the [CoDev Code config](/docs/config). diff --git a/packages/web/src/content/docs/keybinds.mdx b/packages/web/src/content/docs/keybinds.mdx deleted file mode 100644 index 38e48f6318..0000000000 --- a/packages/web/src/content/docs/keybinds.mdx +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: Keybinds -description: Customize your keybinds. ---- - -CoDev Code has a list of keybinds that you can customize through `tui.json`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "leader_timeout": 2000, - "keybinds": { - "leader": "ctrl+x", - "app_exit": "ctrl+d,q", - "app_exit_confirm": "ctrl+c", - "app_debug": "none", - "app_console": "none", - "app_heap_snapshot": "none", - "app_toggle_animations": "none", - "app_toggle_file_context": "none", - "app_toggle_diffwrap": "none", - "app_toggle_paste_summary": "none", - "app_toggle_session_directory_filter": "none", - "command_list": "ctrl+p", - "help_show": "none", - "docs_open": "none", - - "editor_open": "e", - "theme_list": "t", - "theme_switch_mode": "none", - "theme_mode_lock": "none", - "sidebar_toggle": "ctrl+b,b", - "scrollbar_toggle": "none", - "status_view": "s", - - "session_export": "x", - "session_copy": "none", - "session_move": "none", - "session_new": "n", - "session_list": "l", - "session_timeline": "g", - "session_fork": "none", - "session_rename": "ctrl+r", - "session_delete": "ctrl+d", - "session_share": "none", - "session_unshare": "none", - "session_interrupt": "escape", - "session_interrupt_now": "ctrl+c", - "session_compact": "c", - "session_toggle_timestamps": "none", - "session_toggle_generic_tool_output": "none", - "session_child_first": "down", - "session_child_cycle": "right", - "session_child_cycle_reverse": "left", - "session_parent": "up", - - "stash_delete": "ctrl+d", - "model_provider_list": "ctrl+a", - "model_favorite_toggle": "ctrl+f", - "model_list": "m", - "model_cycle_recent": "f2", - "model_cycle_recent_reverse": "shift+f2", - "model_cycle_favorite": "none", - "model_cycle_favorite_reverse": "none", - "mcp_list": "none", - "provider_connect": "none", - "console_org_switch": "none", - "agent_list": "a", - "agent_cycle": "tab", - "agent_cycle_reverse": "shift+tab", - "variant_cycle": "ctrl+t", - "variant_list": "none", - - "messages_page_up": "pageup,ctrl+alt+b", - "messages_page_down": "pagedown,ctrl+alt+f", - "messages_line_up": "ctrl+alt+y", - "messages_line_down": "ctrl+alt+e", - "messages_half_page_up": "ctrl+alt+u", - "messages_half_page_down": "ctrl+alt+d", - "messages_first": "ctrl+g,home", - "messages_last": "ctrl+alt+g,end", - "messages_next": "none", - "messages_previous": "none", - "messages_last_user": "none", - "messages_copy": "y", - "messages_undo": "u", - "messages_redo": "r", - "messages_toggle_conceal": "h", - "tool_details": "none", - "display_thinking": "none", - - "prompt_submit": "none", - "prompt_editor_context_clear": "none", - "prompt_skills": "none", - "prompt_stash": "none", - "prompt_stash_pop": "none", - "prompt_stash_list": "none", - "workspace_set": "none", - - "input_clear": "ctrl+c", - "input_paste": { - "key": "ctrl+v", - "preventDefault": false - }, - "input_submit": "return", - "input_newline": "shift+return,ctrl+return,alt+return,ctrl+j", - "input_move_left": "left,ctrl+o", - "input_move_right": "right,ctrl+f", - "input_move_up": "up", - "input_move_down": "down", - "input_select_left": "shift+left", - "input_select_right": "shift+right", - "input_select_up": "shift+up", - "input_select_down": "shift+down", - "input_line_home": "ctrl+a", - "input_line_end": "ctrl+e", - "input_select_line_home": "ctrl+shift+a", - "input_select_line_end": "ctrl+shift+e", - "input_visual_line_home": "alt+a", - "input_visual_line_end": "alt+e", - "input_select_visual_line_home": "alt+shift+a", - "input_select_visual_line_end": "alt+shift+e", - "input_buffer_home": "home", - "input_buffer_end": "end", - "input_select_buffer_home": "shift+home", - "input_select_buffer_end": "shift+end", - "input_delete_line": "ctrl+shift+d", - "input_delete_to_line_end": "ctrl+k", - "input_delete_to_line_start": "ctrl+u", - "input_backspace": "backspace,shift+backspace", - "input_delete": "ctrl+d,delete,shift+delete", - "input_undo": "ctrl+-,super+z", - "input_redo": "ctrl+.,super+shift+z", - "input_word_forward": "alt+f,alt+right,ctrl+right", - "input_word_backward": "alt+b,alt+left,ctrl+left", - "input_select_word_forward": "alt+shift+f,alt+shift+right", - "input_select_word_backward": "alt+shift+b,alt+shift+left", - "input_delete_word_forward": "alt+d,alt+delete,ctrl+delete", - "input_delete_word_backward": "ctrl+w,ctrl+backspace,alt+backspace", - "input_select_all": "super+a", - "history_previous": "up", - "history_next": "down", - - "dialog.select.prev": "up,ctrl+p", - "dialog.select.next": "down,ctrl+n", - "dialog.select.page_up": "pageup", - "dialog.select.page_down": "pagedown", - "dialog.select.home": "home", - "dialog.select.end": "end", - "dialog.select.submit": "return", - "dialog.prompt.submit": "return", - "dialog.mcp.toggle": "space", - "prompt.autocomplete.prev": "up,ctrl+p", - "prompt.autocomplete.next": "down,ctrl+n", - "prompt.autocomplete.hide": "escape", - "prompt.autocomplete.select": "return", - "prompt.autocomplete.complete": "tab", - "permission.prompt.fullscreen": "ctrl+f", - "plugins.toggle": "space", - "dialog.plugins.install": "shift+i", - - "terminal_suspend": "ctrl+z", - "terminal_title_toggle": "none", - "tips_toggle": "h", - "plugin_manager": "none", - "plugin_install": "none", - - "which_key_toggle": "ctrl+alt+k", - "which_key_layout_toggle": "ctrl+alt+shift+k", - "which_key_pending_toggle": "ctrl+alt+shift+p", - "which_key_group_previous": "ctrl+alt+left,ctrl+alt+[", - "which_key_group_next": "ctrl+alt+right,ctrl+alt+]", - "which_key_scroll_up": "ctrl+alt+up,ctrl+alt+p", - "which_key_scroll_down": "ctrl+alt+down,ctrl+alt+n", - "which_key_page_up": "ctrl+alt+pageup", - "which_key_page_down": "ctrl+alt+pagedown", - "which_key_home": "ctrl+alt+home", - "which_key_end": "ctrl+alt+end" - } -} -``` - -:::note -On Windows, the defaults for `input_undo` and `terminal_suspend` are different: - -- `input_undo` defaults to `ctrl+z,ctrl+-,super+z` when it is not explicitly configured. The `ctrl+z` binding is added because Windows terminals do not support POSIX suspend. -- `terminal_suspend` is forced to `none` because native Windows terminals do not support POSIX suspend. - ::: - ---- - -## Leader Key - -CoDev Code uses a `leader` key for many keybinds. This avoids conflicts in your terminal. - -By default, `ctrl+x` is the leader key and many actions require you to first press the leader key and then the shortcut. For example, to start a new session you first press `ctrl+x` and then press `n`. - -You don't need to use a leader key for your keybinds but we recommend doing so. - -Some navigation keybinds intentionally do not use the leader key by default. For subagent sessions, the defaults are `session_child_first` = `down`, `session_child_cycle` = `right`, `session_child_cycle_reverse` = `left`, and `session_parent` = `up`. - -`leader_timeout` controls how long CoDev Code waits for the next key after the leader key. It defaults to `2000` milliseconds. - ---- - -## Binding Values - -A string can contain one shortcut or multiple comma-separated shortcuts. You can also use an array for multiple shortcuts. - -For advanced cases, use an object with `key`, `event`, `preventDefault`, or `fallthrough`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "keybinds": { - "messages_copy": ["y", "ctrl+shift+c"], - "input_paste": { - "key": "ctrl+v", - "preventDefault": false - } - } -} -``` - ---- - -## Disable Keybind - -You can disable a keybind by adding the key to `tui.json` with a value of `"none"` or `false`. - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "keybinds": { - "session_compact": "none" - } -} -``` - ---- - -## Desktop Prompt Shortcuts - -The CoDev Code desktop app prompt input supports common Readline/Emacs-style shortcuts for editing text. These are built-in and currently not configurable via `codev.json`. - -| Shortcut | Action | -| -------- | ---------------------------------------- | -| `ctrl+a` | Move to start of current line | -| `ctrl+e` | Move to end of current line | -| `ctrl+b` | Move cursor back one character | -| `ctrl+f` | Move cursor forward one character | -| `alt+b` | Move cursor back one word | -| `alt+f` | Move cursor forward one word | -| `ctrl+d` | Delete character under cursor | -| `ctrl+k` | Kill to end of line | -| `ctrl+u` | Kill to start of line | -| `ctrl+w` | Kill previous word | -| `alt+d` | Kill next word | -| `ctrl+t` | Transpose characters | -| `ctrl+g` | Cancel popovers / abort running response | - ---- - -## Shift+Enter - -Some terminals don't send modifier keys with Enter by default. You may need to configure your terminal to send `Shift+Enter` as an escape sequence. - -### Windows Terminal - -Open your `settings.json` at: - -``` -%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\settings.json -``` - -Add this to the root-level `actions` array: - -```json -"actions": [ - { - "command": { - "action": "sendInput", - "input": "\u001b[13;2u" - }, - "id": "User.sendInput.ShiftEnterCustom" - } -] -``` - -Add this to the root-level `keybindings` array: - -```json -"keybindings": [ - { - "keys": "shift+enter", - "id": "User.sendInput.ShiftEnterCustom" - } -] -``` - -Save the file and restart Windows Terminal or open a new tab. diff --git a/packages/web/src/content/docs/lsp.mdx b/packages/web/src/content/docs/lsp.mdx deleted file mode 100644 index e79190ee90..0000000000 --- a/packages/web/src/content/docs/lsp.mdx +++ /dev/null @@ -1,214 +0,0 @@ ---- -title: LSP Servers -description: CoDev Code integrates with your LSP servers. ---- - -CoDev Code can integrate with Language Server Protocol (LSP) servers to use diagnostics as feedback for the agent. - ---- - -## Built-in - -CoDev Code comes with several built-in LSP servers for popular languages: - -| LSP Server | Extensions | Requirements | -| ------------------ | ------------------------------------------------------------------- | ------------------------------------------------------------ | -| astro | .astro | Auto-installs for Astro projects | -| bash | .sh, .bash, .zsh, .ksh | Auto-installs bash-language-server | -| clangd | .c, .cpp, .cc, .cxx, .c++, .h, .hpp, .hh, .hxx, .h++ | Auto-installs for C/C++ projects | -| csharp | .cs, .csx | `.NET SDK` installed | -| clojure-lsp | .clj, .cljs, .cljc, .edn | `clojure-lsp` command available | -| dart | .dart | `dart` command available | -| deno | .ts, .tsx, .js, .jsx, .mjs | `deno` command available (auto-detects deno.json/deno.jsonc) | -| elixir-ls | .ex, .exs | `elixir` command available | -| eslint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue | `eslint` dependency in project | -| fsharp | .fs, .fsi, .fsx, .fsscript | `.NET SDK` installed | -| gleam | .gleam | `gleam` command available | -| gopls | .go | `go` command available | -| hls | .hs, .lhs | `haskell-language-server-wrapper` command available | -| jdtls | .java | `Java SDK (version 21+)` installed | -| julials | .jl | `julia` and `LanguageServer.jl` installed | -| kotlin-ls | .kt, .kts | Auto-installs for Kotlin projects | -| lua-ls | .lua | Auto-installs for Lua projects | -| nixd | .nix | `nixd` command available | -| ocaml-lsp | .ml, .mli | `ocamllsp` command available | -| oxlint | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts, .vue, .astro, .svelte | `oxlint` dependency in project | -| php intelephense | .php | Auto-installs for PHP projects | -| prisma | .prisma | `prisma` command available | -| pyright | .py, .pyi | `pyright` dependency installed | -| razor | .razor, .cshtml | `.NET SDK` and VS Code C# extension installed | -| ruby-lsp (rubocop) | .rb, .rake, .gemspec, .ru | `ruby` and `gem` commands available | -| rust | .rs | `rust-analyzer` command available | -| sourcekit-lsp | .swift, .objc, .objcpp | `swift` installed (`xcode` on macOS) | -| svelte | .svelte | Auto-installs for Svelte projects | -| terraform | .tf, .tfvars | Auto-installs from GitHub releases | -| tinymist | .typ, .typc | Auto-installs from GitHub releases | -| typescript | .ts, .tsx, .js, .jsx, .mjs, .cjs, .mts, .cts | `typescript` dependency in project | -| vue | .vue | Auto-installs for Vue projects | -| yaml-ls | .yaml, .yml | Auto-installs Red Hat yaml-language-server | -| zls | .zig, .zon | `zig` command available | - -LSP is disabled by default. When enabled, servers start when one of the above file extensions is detected and the requirements are met. - -:::note -You can disable automatic LSP server downloads by setting the `CODEV_DISABLE_LSP_DOWNLOAD` environment variable to `true`. -::: - ---- - -## How It Works - -When LSP is enabled and CoDev Code opens a file, it: - -1. Checks the file extension against all enabled LSP servers. -2. Starts the appropriate LSP server if not already running. - ---- - -## Best Practices - -LSP can help the agent find and fix issues by providing diagnostics from language servers. This is useful in some projects, but it is not always a net positive. - -Language servers can get out of sync, use significant memory, vary by version or project, and slow down agent workflows. In many projects it is better to have the agent run lint, typecheck, or other diagnostic CLI tools directly, so errors are fed back into the agent loop without those tradeoffs. Document those commands in instruction files such as `AGENTS.md` or skills so the agent knows what to run. Enable LSP when your project benefits from additional language-server feedback. - ---- - -## Configure - -You can enable and customize LSP servers through the `lsp` section in your CoDev Code config. - -To enable all built-in LSP servers, set `lsp` to `true`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": true -} -``` - -Use an object to keep built-ins enabled while configuring overrides or custom servers. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "lsp": {} -} -``` - -Each configured LSP server entry supports the following: - -Server entries need `command` unless they only disable a server. - -| Property | Type | Description | -| ---------------- | -------- | ------------------------------------------------- | -| `disabled` | boolean | Set this to `true` to disable the LSP server | -| `command` | string[] | The command to start the LSP server | -| `extensions` | string[] | File extensions this LSP server should handle | -| `env` | object | Environment variables to set when starting server | -| `initialization` | object | Initialization options to send to the LSP server | - -Let's look at some examples. - ---- - -### Environment variables - -Use the `env` property to set environment variables when starting the LSP server: - -```json title="codev.json" {5-8} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "rust": { - "command": ["rust-analyzer"], - "env": { - "RUST_LOG": "debug" - } - } - } -} -``` - ---- - -### Initialization options - -Use the `initialization` property to pass initialization options to the LSP server. These are server-specific settings sent during the LSP `initialize` request: - -```json title="codev.json" {5-13} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "custom-lsp": { - "command": ["custom-lsp-server", "--stdio"], - "extensions": [".custom"], - "initialization": { - "preferences": { - "importModuleSpecifierPreference": "relative" - } - } - } - } -} -``` - -:::note -Initialization options vary by LSP server. Check your LSP server's documentation for available options. -::: - ---- - -### Disabling LSP servers - -If `lsp` is omitted, all LSP servers are disabled. To disable all LSP servers after another config enabled them, set `lsp` to `false`: - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": false -} -``` - -To disable a **specific** LSP server, set `disabled` to `true`: - -```json title="codev.json" {5} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "typescript": { - "disabled": true - } - } -} -``` - ---- - -### Custom LSP servers - -You can add custom LSP servers by specifying the command and file extensions: - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "lsp": { - "custom-lsp": { - "command": ["custom-lsp-server", "--stdio"], - "extensions": [".custom"] - } - } -} -``` - ---- - -## Additional Information - -### PHP Intelephense - -PHP Intelephense offers premium features through a license key. You can provide a license key by placing (only) the key in a text file at: - -- On macOS/Linux: `$HOME/intelephense/license.txt` -- On Windows: `%USERPROFILE%/intelephense/license.txt` - -The file should contain only the license key with no additional content. diff --git a/packages/web/src/content/docs/mcp-servers.mdx b/packages/web/src/content/docs/mcp-servers.mdx deleted file mode 100644 index ac6c059152..0000000000 --- a/packages/web/src/content/docs/mcp-servers.mdx +++ /dev/null @@ -1,512 +0,0 @@ ---- -title: MCP servers -description: Add local and remote MCP tools. ---- - -You can add external tools to CoDev Code using the _Model Context Protocol_, or MCP. CoDev Code supports both local and remote servers. - -Once added, MCP tools are automatically available to the LLM alongside built-in tools. - ---- - -#### Caveats - -When you use an MCP server, it adds to the context. This can quickly add up if you have a lot of tools. So we recommend being careful with which MCP servers you use. - -:::tip -MCP servers add to your context, so you want to be careful with which ones you enable. -::: - -Certain MCP servers, like the GitHub MCP server, tend to add a lot of tokens and can easily exceed the context limit. - ---- - -## Enable - -You can define MCP servers in your [CoDev Code Config](https://opencode.ai/docs/config/) under `mcp`. Add each MCP with a unique name. You can refer to that MCP by name when prompting the LLM. - -```jsonc title="codev.jsonc" {6} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "name-of-mcp-server": { - // ... - "enabled": true, - }, - "name-of-other-mcp-server": { - // ... - }, - }, -} -``` - -You can also disable a server by setting `enabled` to `false`. This is useful if you want to temporarily disable a server without removing it from your config. - ---- - -### Overriding remote defaults - -Organizations can provide default MCP servers via their `.well-known/opencode` endpoint. These servers may be disabled by default, allowing users to opt-in to the ones they need. - -To enable a specific server from your organization's remote config, add it to your local config with `enabled: true`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "jira": { - "type": "remote", - "url": "https://jira.example.com/mcp", - "enabled": true - } - } -} -``` - -Your local config values override the remote defaults. See [config precedence](/docs/config#precedence-order) for more details. - ---- - -## Local - -Add local MCP servers using `type` to `"local"` within the MCP object. - -```jsonc title="codev.jsonc" {15} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-local-mcp-server": { - "type": "local", - // Or ["bun", "x", "my-mcp-command"] - "command": ["npx", "-y", "my-mcp-command"], - "enabled": true, - "environment": { - "MY_ENV_VAR": "my_env_var_value", - }, - }, - }, -} -``` - -The command is how the local MCP server is started. You can also pass in a list of environment variables as well. - -For example, here's how you can add the test [`@modelcontextprotocol/server-everything`](https://www.npmjs.com/package/@modelcontextprotocol/server-everything) MCP server. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "mcp_everything": { - "type": "local", - "command": ["npx", "-y", "@modelcontextprotocol/server-everything"], - }, - }, -} -``` - -And to use it I can add `use the mcp_everything tool` to my prompts. - -```txt "mcp_everything" -use the mcp_everything tool to add the number 3 and 4 -``` - ---- - -#### Options - -Here are all the options for configuring a local MCP server. - -| Option | Type | Required | Description | -| ------------- | ------- | -------- | ---------------------------------------------------------------------------------------- | -| `type` | String | Y | Type of MCP server connection, must be `"local"`. | -| `command` | Array | Y | Command and arguments to run the MCP server. | -| `cwd` | String | | Working directory for the MCP server process. Relative paths resolve from the workspace. | -| `environment` | Object | | Environment variables to set when running the server. | -| `enabled` | Boolean | | Enable or disable the MCP server on startup. | -| `timeout` | Number | | Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds). | - ---- - -## Remote - -Add remote MCP servers by setting `type` to `"remote"`. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-remote-mcp": { - "type": "remote", - "url": "https://my-mcp-server.com", - "enabled": true, - "headers": { - "Authorization": "Bearer MY_API_KEY" - } - } - } -} -``` - -The `url` is the URL of the remote MCP server and with the `headers` option you can pass in a list of headers. - ---- - -#### Options - -| Option | Type | Required | Description | -| --------- | ------- | -------- | ----------------------------------------------------------------------------------- | -| `type` | String | Y | Type of MCP server connection, must be `"remote"`. | -| `url` | String | Y | URL of the remote MCP server. | -| `enabled` | Boolean | | Enable or disable the MCP server on startup. | -| `headers` | Object | | Headers to send with the request. | -| `oauth` | Object | | OAuth authentication configuration. See [OAuth](#oauth) section below. | -| `timeout` | Number | | Timeout in ms for fetching tools from the MCP server. Defaults to 5000 (5 seconds). | - ---- - -## OAuth - -CoDev Code automatically handles OAuth authentication for remote MCP servers. When a server requires authentication, CoDev Code will: - -1. Detect the 401 response and initiate the OAuth flow -2. Use **Dynamic Client Registration (RFC 7591)** if supported by the server -3. Store tokens securely for future requests - ---- - -### Automatic - -For most OAuth-enabled MCP servers, no special configuration is needed. Just configure the remote server: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-oauth-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp" - } - } -} -``` - -If the server requires authentication, CoDev Code will prompt you to authenticate when you first try to use it. If not, you can [manually trigger the flow](#authenticating) with `codev mcp auth `. - ---- - -### Pre-registered - -If you have client credentials from the MCP server provider, you can configure them: - -```json title="codev.json" {7-11} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-oauth-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp", - "oauth": { - "clientId": "{env:MY_MCP_CLIENT_ID}", - "clientSecret": "{env:MY_MCP_CLIENT_SECRET}", - "scope": "tools:read tools:execute" - } - } - } -} -``` - ---- - -### Authenticating - -You can manually trigger authentication or manage credentials. - -Authenticate with a specific MCP server: - -```bash -codev mcp auth my-oauth-server -``` - -List all MCP servers and their auth status: - -```bash -codev mcp list -``` - -Remove stored credentials: - -```bash -codev mcp logout my-oauth-server -``` - -The `mcp auth` command will open your browser for authorization. After you authorize, CoDev Code will store the tokens securely in `~/.local/share/codev/mcp-auth.json`. - ---- - -#### Disabling OAuth - -If you want to disable automatic OAuth for a server (e.g., for servers that use API keys instead), set `oauth` to `false`: - -```json title="codev.json" {7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-api-key-server": { - "type": "remote", - "url": "https://mcp.example.com/mcp", - "oauth": false, - "headers": { - "Authorization": "Bearer {env:MY_API_KEY}" - } - } - } -} -``` - ---- - -#### OAuth Options - -| Option | Type | Description | -| -------------- | --------------- | -------------------------------------------------------------------------------- | -| `oauth` | Object \| false | OAuth config object, or `false` to disable OAuth auto-detection. | -| `clientId` | String | OAuth client ID. If not provided, dynamic client registration will be attempted. | -| `clientSecret` | String | OAuth client secret, if required by the authorization server. | -| `scope` | String | OAuth scopes to request during authorization. | - -#### Debugging - -If a remote MCP server is failing to authenticate, you can diagnose issues with: - -```bash -# View auth status for all OAuth-capable servers -codev mcp auth list - -# Debug connection and OAuth flow for a specific server -codev mcp debug my-oauth-server -``` - -The `mcp debug` command shows the current auth status, tests HTTP connectivity, and attempts the OAuth discovery flow. - ---- - -## Manage - -Your MCPs are available as tools in CoDev Code, alongside built-in tools. So you can manage them through the CoDev Code config like any other tool. - ---- - -### Global - -This means that you can enable or disable them globally. - -```json title="codev.json" {14} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp-foo": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-foo"] - }, - "my-mcp-bar": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-bar"] - } - }, - "tools": { - "my-mcp-foo": false - } -} -``` - -We can also use a glob pattern to disable all matching MCPs. - -```json title="codev.json" {14} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp-foo": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-foo"] - }, - "my-mcp-bar": { - "type": "local", - "command": ["bun", "x", "my-mcp-command-bar"] - } - }, - "tools": { - "my-mcp*": false - } -} -``` - -Here we are using the glob pattern `my-mcp*` to disable all MCPs. - ---- - -### Per agent - -If you have a large number of MCP servers you may want to only enable them per agent and disable them globally. To do this: - -1. Disable it as a tool globally. -2. In your [agent config](/docs/agents#tools), enable the MCP server as a tool. - -```json title="codev.json" {11, 14-18} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "my-mcp": { - "type": "local", - "command": ["bun", "x", "my-mcp-command"], - "enabled": true - } - }, - "tools": { - "my-mcp*": false - }, - "agent": { - "my-agent": { - "tools": { - "my-mcp*": true - } - } - } -} -``` - ---- - -#### Glob patterns - -The glob pattern uses simple regex globbing patterns: - -- `*` matches zero or more of any character (e.g., `"my-mcp*"` matches `my-mcp_search`, `my-mcp_list`, etc.) -- `?` matches exactly one character -- All other characters match literally - -:::note -MCP server tools are registered with server name as prefix, so to disable all tools for a server simply use: - -``` -"mymcpservername_*": false -``` - -::: - ---- - -## Examples - -Below are examples of some common MCP servers. You can submit a PR if you want to document other servers. - ---- - -### Sentry - -Add the [Sentry MCP server](https://mcp.sentry.dev) to interact with your Sentry projects and issues. - -```json title="codev.json" {4-8} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "sentry": { - "type": "remote", - "url": "https://mcp.sentry.dev/mcp", - "oauth": {} - } - } -} -``` - -After adding the configuration, authenticate with Sentry: - -```bash -codev mcp auth sentry -``` - -This will open a browser window to complete the OAuth flow and connect CoDev Code to your Sentry account. - -Once authenticated, you can use Sentry tools in your prompts to query issues, projects, and error data. - -```txt "use sentry" -Show me the latest unresolved issues in my project. use sentry -``` - ---- - -### Context7 - -Add the [Context7 MCP server](https://github.com/upstash/context7) to search through docs. - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "context7": { - "type": "remote", - "url": "https://mcp.context7.com/mcp" - } - } -} -``` - -If you have signed up for a free account, you can use your API key and get higher rate-limits. - -```json title="codev.json" {7-9} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "context7": { - "type": "remote", - "url": "https://mcp.context7.com/mcp", - "headers": { - "CONTEXT7_API_KEY": "{env:CONTEXT7_API_KEY}" - } - } - } -} -``` - -Here we are assuming that you have the `CONTEXT7_API_KEY` environment variable set. - -Add `use context7` to your prompts to use Context7 MCP server. - -```txt "use context7" -Configure a Cloudflare Worker script to cache JSON API responses for five minutes. use context7 -``` - -Alternatively, you can add something like this to your [AGENTS.md](/docs/rules/). - -```md title="AGENTS.md" -When you need to search docs, use `context7` tools. -``` - ---- - -### Grep by Vercel - -Add the [Grep by Vercel](https://grep.app) MCP server to search through code snippets on GitHub. - -```json title="codev.json" {4-7} -{ - "$schema": "https://opencode.ai/config.json", - "mcp": { - "gh_grep": { - "type": "remote", - "url": "https://mcp.grep.app" - } - } -} -``` - -Since we named our MCP server `gh_grep`, you can add `use the gh_grep tool` to your prompts to get the agent to use it. - -```txt "use the gh_grep tool" -What's the right way to set a custom domain in an SST Astro component? use the gh_grep tool -``` - -Alternatively, you can add something like this to your [AGENTS.md](/docs/rules/). - -```md title="AGENTS.md" -If you are unsure how to do something, use `gh_grep` to search code examples from GitHub. -``` diff --git a/packages/web/src/content/docs/models.mdx b/packages/web/src/content/docs/models.mdx deleted file mode 100644 index 38c5c696df..0000000000 --- a/packages/web/src/content/docs/models.mdx +++ /dev/null @@ -1,223 +0,0 @@ ---- -title: Models -description: Configuring an LLM provider and model. ---- - -CoDev Code uses the [AI SDK](https://ai-sdk.dev/) and [Models.dev](https://models.dev) to support **75+ LLM providers** and it supports running local models. - ---- - -## Providers - -Most popular providers are preloaded by default. If you've added the credentials for a provider through the `/connect` command, they'll be available when you start CoDev Code. - -Learn more about [providers](/docs/providers). - ---- - -## Select a model - -Once you've configured your provider you can select the model you want by typing in: - -```bash frame="none" -/models -``` - ---- - -## Recommended models - -There are a lot of models out there, with new models coming out every week. - -:::tip -Consider using one of the models we recommend. -::: - -However, there are only a few of them that are good at both generating code and tool calling. - -Here are several models that work well with CoDev Code, in no particular order. (This is not an exhaustive list nor is it necessarily up to date): - -- GPT 5.2 -- GPT 5.1 Codex -- Claude Opus 4.5 -- Claude Sonnet 4.5 -- Minimax M2.1 -- Gemini 3 Pro - ---- - -## Set a default - -To set one of these as the default model, you can set the `model` key in your -CoDev Code config. - -```json title="codev.json" {3} -{ - "$schema": "https://opencode.ai/config.json", - "model": "lmstudio/google/gemma-3n-e4b" -} -``` - -Here the full ID is `provider_id/model_id`. For example, if you're using [OpenCode Zen](/docs/zen), you would use `opencode/gpt-5.1-codex` for GPT 5.1 Codex. - -If you've configured a [custom provider](/docs/providers#custom), the `provider_id` is key from the `provider` part of your config, and the `model_id` is the key from `provider.models`. - ---- - -## Configure models - -You can globally configure a model's options through the config. - -```jsonc title="codev.jsonc" {7-12,19-24} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "openai": { - "models": { - "gpt-5": { - "options": { - "reasoningEffort": "high", - "textVerbosity": "low", - "reasoningSummary": "auto", - "include": ["reasoning.encrypted_content"], - }, - }, - }, - }, - "anthropic": { - "models": { - "claude-sonnet-4-5-20250929": { - "options": { - "thinking": { - "type": "enabled", - "budgetTokens": 16000, - }, - }, - }, - }, - }, - }, -} -``` - -Here we're configuring global settings for two built-in models: `gpt-5` when accessed via the `openai` provider, and `claude-sonnet-4-20250514` when accessed via the `anthropic` provider. -The built-in provider and model names can be found on [Models.dev](https://models.dev). - -You can also configure these options for any agents that you are using. The agent config overrides any global options here. [Learn more](/docs/agents/#additional). - -You can also define custom variants that extend built-in ones. Variants let you configure different settings for the same model without creating duplicate entries: - -```jsonc title="codev.jsonc" {6-21} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "opencode": { - "models": { - "gpt-5": { - "variants": { - "high": { - "reasoningEffort": "high", - "textVerbosity": "low", - "reasoningSummary": "auto", - }, - "low": { - "reasoningEffort": "low", - "textVerbosity": "low", - "reasoningSummary": "auto", - }, - }, - }, - }, - }, - }, -} -``` - ---- - -## Variants - -Many models support multiple variants with different configurations. CoDev Code ships with built-in default variants for popular providers. - -### Built-in variants - -CoDev Code ships with default variants for many providers: - -**Anthropic**: - -- `high` - High thinking budget (default) -- `max` - Maximum thinking budget - -**OpenAI**: - -Varies by model but roughly: - -- `none` - No reasoning -- `minimal` - Minimal reasoning effort -- `low` - Low reasoning effort -- `medium` - Medium reasoning effort -- `high` - High reasoning effort -- `xhigh` - Extra high reasoning effort - -**Google**: - -- `low` - Lower effort/token budget -- `high` - Higher effort/token budget - -:::tip -This list is not comprehensive. Many other providers have built-in defaults too. -::: - -### Custom variants - -You can override existing variants or add your own: - -```jsonc title="codev.jsonc" {7-18} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "openai": { - "models": { - "gpt-5": { - "variants": { - "thinking": { - "reasoningEffort": "high", - "textVerbosity": "low", - }, - "fast": { - "disabled": true, - }, - }, - }, - }, - }, - }, -} -``` - -### Cycle variants - -Use the keybind `variant_cycle` to quickly switch between variants. [Learn more](/docs/keybinds). - ---- - -## Loading models - -When CoDev Code starts up, it checks for models in the following priority order: - -1. The `--model` or `-m` command line flag. The format is the same as in the config file: `provider_id/model_id`. - -2. The model list in the CoDev Code config. - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "model": "anthropic/claude-sonnet-4-20250514" - } - ``` - - The format here is `provider/model`. - -3. The last used model. - -4. The first model using an internal priority. diff --git a/packages/web/src/content/docs/network.mdx b/packages/web/src/content/docs/network.mdx deleted file mode 100644 index f39fed3e07..0000000000 --- a/packages/web/src/content/docs/network.mdx +++ /dev/null @@ -1,57 +0,0 @@ ---- -title: Network -description: Configure proxies and custom certificates. ---- - -CoDev Code supports standard proxy environment variables and custom certificates for enterprise network environments. - ---- - -## Proxy - -CoDev Code respects standard proxy environment variables. - -```bash -# HTTPS proxy (recommended) -export HTTPS_PROXY=https://proxy.example.com:8080 - -# HTTP proxy (if HTTPS not available) -export HTTP_PROXY=http://proxy.example.com:8080 - -# Bypass proxy for local server (required) -export NO_PROXY=localhost,127.0.0.1 -``` - -:::caution -The TUI communicates with a local HTTP server. You must bypass the proxy for this connection to prevent routing loops. -::: - -You can configure the server's port and hostname using [CLI flags](/docs/cli#run). - ---- - -### Authenticate - -If your proxy requires basic authentication, include credentials in the URL. - -```bash -export HTTPS_PROXY=http://username:password@proxy.example.com:8080 -``` - -:::caution -Avoid hardcoding passwords. Use environment variables or secure credential storage. -::: - -For proxies requiring advanced authentication like NTLM or Kerberos, consider using an LLM Gateway that supports your authentication method. - ---- - -## Custom certificates - -If your enterprise uses custom CAs for HTTPS connections, configure CoDev Code to trust them. - -```bash -export NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem -``` - -This works for both proxy connections and direct API access. diff --git a/packages/web/src/content/docs/permissions.mdx b/packages/web/src/content/docs/permissions.mdx deleted file mode 100644 index e00acce27e..0000000000 --- a/packages/web/src/content/docs/permissions.mdx +++ /dev/null @@ -1,256 +0,0 @@ ---- -title: Permissions -description: Control which actions require approval to run. ---- - -CoDev Code uses the `permission` config to decide whether a given action should run automatically, prompt you, or be blocked. - -As of `v1.1.1`, the legacy `tools` boolean config is deprecated and has been merged into `permission`. The old `tools` config is still supported for backwards compatibility. - ---- - -## Actions - -Each permission rule resolves to one of: - -- `"allow"` — run without approval -- `"ask"` — prompt for approval -- `"deny"` — block the action - ---- - -## Auto mode - -Start CoDev Code with `--auto` to automatically approve permission requests that are not explicitly denied. - -```bash -codev --auto -``` - -You can also use auto mode with [`codev run`](/docs/cli#run). - -```bash -codev run --auto "Refactor this module" -``` - -Explicit `"deny"` rules are still enforced. Auto mode only changes requests that would otherwise ask for approval. - -In the TUI, open the command palette and select **Enable auto-approve permissions** or **Disable auto-approve permissions** to change modes. When auto mode is active, the prompt displays a muted `auto` indicator next to the current agent. - ---- - -## Configuration - -You can set permissions globally (with `*`), and override specific tools. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "*": "ask", - "bash": "allow", - "edit": "deny" - } -} -``` - -You can also set all permissions at once: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": "allow" -} -``` - ---- - -## Granular Rules (Object Syntax) - -For most permissions, you can use an object to apply different actions based on the tool input. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "npm *": "allow", - "rm *": "deny", - "grep *": "allow" - }, - "edit": { - "*": "deny", - "packages/web/src/content/docs/*.mdx": "allow" - } - } -} -``` - -Rules are evaluated by pattern match, with the **last matching rule winning**. A common pattern is to put the catch-all `"*"` rule first, and more specific rules after it. - -### Wildcards - -Permission patterns use simple wildcard matching: - -- `*` matches zero or more of any character -- `?` matches exactly one character -- All other characters match literally - -### Home Directory Expansion - -You can use `~` or `$HOME` at the start of a pattern to reference your home directory. This is particularly useful for [`external_directory`](#external-directories) rules. - -- `~/projects/*` -> `/Users/username/projects/*` -- `$HOME/projects/*` -> `/Users/username/projects/*` -- `~` -> `/Users/username` - -### External Directories - -Use `external_directory` to allow tool calls that touch paths outside the working directory where CoDev Code was started. This applies to any tool that takes a path as input (for example `read`, `edit`, `glob`, `grep`, and many `bash` commands). - -Home expansion (like `~/...`) only affects how a pattern is written. It does not make an external path part of the current workspace, so paths outside the working directory must still be allowed via `external_directory`. - -For example, this allows access to everything under `~/projects/personal/`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "external_directory": { - "~/projects/personal/**": "allow" - } - } -} -``` - -Any directory allowed here inherits the same defaults as the current workspace. Since [`read` defaults to `allow`](#defaults), reads are also allowed for entries under `external_directory` unless overridden. Add explicit rules when a tool should be restricted in these paths, such as blocking edits while keeping reads: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "external_directory": { - "~/projects/personal/**": "allow" - }, - "edit": { - "~/projects/personal/**": "deny" - } - } -} -``` - -Keep the list focused on trusted paths, and layer extra allow or deny rules as needed for other tools (for example `bash`). - ---- - -## Available Permissions - -CoDev Code permissions are keyed by tool name, plus a couple of safety guards: - -- `read` — reading a file (matches the file path) -- `edit` — all file modifications (covers `edit`, `write`, `patch`) -- `glob` — file globbing (matches the glob pattern) -- `grep` — content search (matches the regex pattern) -- `bash` — running shell commands (matches parsed commands like `git status --porcelain`) -- `task` — launching subagents (matches the subagent type) -- `skill` — loading a skill (matches the skill name) -- `lsp` — running LSP queries (currently non-granular) -- `question` — asking the user questions during execution -- `webfetch` — fetching a URL (matches the URL) -- `websearch` — web search (matches the query) -- `external_directory` — triggered when a tool touches paths outside the project working directory -- `doom_loop` — triggered when the same tool call repeats 3 times with identical input - ---- - -## Defaults - -If you don’t specify anything, CoDev Code starts from permissive defaults: - -- Most permissions default to `"allow"`. -- `doom_loop` and `external_directory` default to `"ask"`. -- `read` is `"allow"`, but `.env` files are denied by default: - -```json title="codev.json" -{ - "permission": { - "read": { - "*": "allow", - "*.env": "deny", - "*.env.*": "deny", - "*.env.example": "allow" - } - } -} -``` - ---- - -## What “Ask” Does - -When CoDev Code prompts for approval, the UI offers three outcomes: - -- `once` — approve just this request -- `always` — approve future requests matching the suggested patterns (for the rest of the current CoDev Code session) -- `reject` — deny the request - -The set of patterns that `always` would approve is provided by the tool (for example, bash approvals typically whitelist a safe command prefix like `git status*`). - ---- - -## Agents - -You can override permissions per agent. Agent permissions are merged with the global config, and agent rules take precedence. [Learn more](/docs/agents#permissions) about agent permissions. - -:::note -Refer to the [Granular Rules (Object Syntax)](#granular-rules-object-syntax) section above for more detailed pattern matching examples. -::: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "git commit *": "deny", - "git push *": "deny", - "grep *": "allow" - } - }, - "agent": { - "build": { - "permission": { - "bash": { - "*": "ask", - "git *": "allow", - "git commit *": "ask", - "git push *": "deny", - "grep *": "allow" - } - } - } - } -} -``` - -You can also configure agent permissions in Markdown: - -```markdown title="~/.config/codev/agents/review.md" ---- -description: Code review without edits -mode: subagent -permission: - edit: deny - bash: ask - webfetch: deny ---- - -Only analyze code and suggest changes. -``` - -:::tip -Use pattern matching for commands with arguments. `"grep *"` allows `grep pattern file.txt`, while `"grep"` alone would block it. Commands like `git status` work for default behavior but require explicit permission (like `"git status *"`) when arguments are passed. -::: diff --git a/packages/web/src/content/docs/plugins.mdx b/packages/web/src/content/docs/plugins.mdx deleted file mode 100644 index a8ee68939d..0000000000 --- a/packages/web/src/content/docs/plugins.mdx +++ /dev/null @@ -1,389 +0,0 @@ ---- -title: Plugins -description: Write your own plugins to extend CoDev Code. ---- - -Plugins allow you to extend CoDev Code by hooking into various events and customizing behavior. You can create plugins to add new features, integrate with external services, or modify CoDev Code's default behavior. - -For examples, check out the [plugins](/docs/ecosystem#plugins) created by the community. - ---- - -## Use a plugin - -There are two ways to load plugins. - ---- - -### From local files - -Place JavaScript or TypeScript files in the plugin directory. - -- `.codev/plugins/` - Project-level plugins -- `~/.config/codev/plugins/` - Global plugins - -Files in these directories are automatically loaded at startup. - ---- - -### From npm - -Specify npm packages in your config file. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-helicone-session", "opencode-wakatime", "@my-org/custom-plugin"] -} -``` - -Both regular and scoped npm packages are supported. - -Browse available plugins in the [ecosystem](/docs/ecosystem#plugins). - ---- - -### How plugins are installed - -**npm plugins** are installed automatically using Bun at startup. Packages and their dependencies are cached in `~/.cache/codev/node_modules/`. - -**Local plugins** are loaded directly from the plugin directory. To use external packages, you must create a `package.json` within your config directory (see [Dependencies](#dependencies)), or publish the plugin to npm and [add it to your config](/docs/config#plugins). - ---- - -### Load order - -Plugins are loaded from all sources and all hooks run in sequence. The load order is: - -1. Global config (`~/.config/codev/codev.json`) -2. Project config (`codev.json`) -3. Global plugin directory (`~/.config/codev/plugins/`) -4. Project plugin directory (`.codev/plugins/`) - -Duplicate npm packages with the same name and version are loaded once. However, a local plugin and an npm plugin with similar names are both loaded separately. - ---- - -## Create a plugin - -A plugin is a **JavaScript/TypeScript module** that exports one or more plugin -functions. Each function receives a context object and returns a hooks object. - ---- - -### Dependencies - -Local plugins and custom tools can use external npm packages. Add a `package.json` to your config directory with the dependencies you need. - -```json title=".codev/package.json" -{ - "dependencies": { - "shescape": "^2.1.0" - } -} -``` - -CoDev Code runs `bun install` at startup to install these. Your plugins and tools can then import them. - -```ts title=".codev/plugins/my-plugin.ts" -import { escape } from "shescape" - -export const MyPlugin = async (ctx) => { - return { - "tool.execute.before": async (input, output) => { - if (input.tool === "bash") { - output.args.command = escape(output.args.command) - } - }, - } -} -``` - ---- - -### Basic structure - -```js title=".codev/plugins/example.js" -export const MyPlugin = async ({ project, client, $, directory, worktree }) => { - console.log("Plugin initialized!") - - return { - // Hook implementations go here - } -} -``` - -The plugin function receives: - -- `project`: The current project information. -- `directory`: The current working directory. -- `worktree`: The git worktree path. -- `client`: A CoDev Code SDK client for interacting with the AI. -- `$`: Bun's [shell API](https://bun.com/docs/runtime/shell) for executing commands. - ---- - -### TypeScript support - -For TypeScript plugins, you can import types from the plugin package: - -```ts title="my-plugin.ts" {1} -import type { Plugin } from "@opencode-ai/plugin" - -export const MyPlugin: Plugin = async ({ project, client, $, directory, worktree }) => { - return { - // Type-safe hook implementations - } -} -``` - ---- - -### Events - -Plugins can subscribe to events as seen below in the Examples section. Here is a list of the different events available. - -#### Command Events - -- `command.executed` - -#### File Events - -- `file.edited` -- `file.watcher.updated` - -#### Installation Events - -- `installation.updated` - -#### LSP Events - -- `lsp.client.diagnostics` -- `lsp.updated` - -#### Message Events - -- `message.part.removed` -- `message.part.updated` -- `message.removed` -- `message.updated` - -#### Permission Events - -- `permission.asked` -- `permission.replied` - -#### Server Events - -- `server.connected` - -#### Session Events - -- `session.created` -- `session.compacted` -- `session.deleted` -- `session.diff` -- `session.error` -- `session.idle` -- `session.status` -- `session.updated` - -#### Todo Events - -- `todo.updated` - -#### Shell Events - -- `shell.env` - -#### Tool Events - -- `tool.execute.after` -- `tool.execute.before` - -#### TUI Events - -- `tui.prompt.append` -- `tui.command.execute` -- `tui.toast.show` - ---- - -## Examples - -Here are some examples of plugins you can use to extend CoDev Code. - ---- - -### Send notifications - -Send notifications when certain events occur: - -```js title=".codev/plugins/notification.js" -export const NotificationPlugin = async ({ project, client, $, directory, worktree }) => { - return { - event: async ({ event }) => { - // Send notification on session completion - if (event.type === "session.idle") { - await $`osascript -e 'display notification "Session completed!" with title "opencode"'` - } - }, - } -} -``` - -We are using `osascript` to run AppleScript on macOS. Here we are using it to send notifications. - -:::note -If you’re using the CoDev Code desktop app, it can send system notifications automatically when a response is ready or when a session errors. -::: - ---- - -### .env protection - -Prevent CoDev Code from reading `.env` files: - -```javascript title=".codev/plugins/env-protection.js" -export const EnvProtection = async ({ project, client, $, directory, worktree }) => { - return { - "tool.execute.before": async (input, output) => { - if (input.tool === "read" && output.args.filePath.includes(".env")) { - throw new Error("Do not read .env files") - } - }, - } -} -``` - ---- - -### Inject environment variables - -Inject environment variables into all shell execution (AI tools and user terminals): - -```javascript title=".codev/plugins/inject-env.js" -export const InjectEnvPlugin = async () => { - return { - "shell.env": async (input, output) => { - output.env.MY_API_KEY = "secret" - output.env.PROJECT_ROOT = input.cwd - }, - } -} -``` - ---- - -### Custom tools - -Plugins can also add custom tools to CoDev Code: - -```ts title=".codev/plugins/custom-tools.ts" -import { type Plugin, tool } from "@opencode-ai/plugin" - -export const CustomToolsPlugin: Plugin = async (ctx) => { - return { - tool: { - mytool: tool({ - description: "This is a custom tool", - args: { - foo: tool.schema.string(), - }, - async execute(args, context) { - const { directory, worktree } = context - return `Hello ${args.foo} from ${directory} (worktree: ${worktree})` - }, - }), - }, - } -} -``` - -The `tool` helper creates a custom tool that CoDev Code can call. It takes a Zod schema function and returns a tool definition with: - -- `description`: What the tool does -- `args`: Zod schema for the tool's arguments -- `execute`: Function that runs when the tool is called - -Your custom tools will be available to CoDev Code alongside built-in tools. - -:::note -If a plugin tool uses the same name as a built-in tool, the plugin tool takes precedence. -::: - ---- - -### Logging - -Use `client.app.log()` instead of `console.log` for structured logging: - -```ts title=".codev/plugins/my-plugin.ts" -export const MyPlugin = async ({ client }) => { - await client.app.log({ - body: { - service: "my-plugin", - level: "info", - message: "Plugin initialized", - extra: { foo: "bar" }, - }, - }) -} -``` - -Levels: `debug`, `info`, `warn`, `error`. See [SDK documentation](https://opencode.ai/docs/sdk) for details. - ---- - -### Compaction hooks - -Customize the context included when a session is compacted: - -```ts title=".codev/plugins/compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" - -export const CompactionPlugin: Plugin = async (ctx) => { - return { - "experimental.session.compacting": async (input, output) => { - // Inject additional context into the compaction prompt - output.context.push(` -## Custom Context - -Include any state that should persist across compaction: -- Current task status -- Important decisions made -- Files being actively worked on -`) - }, - } -} -``` - -The `experimental.session.compacting` hook fires before the LLM generates a continuation summary. Use it to inject domain-specific context that the default compaction prompt would miss. - -You can also replace the compaction prompt entirely by setting `output.prompt`: - -```ts title=".codev/plugins/custom-compaction.ts" -import type { Plugin } from "@opencode-ai/plugin" - -export const CustomCompactionPlugin: Plugin = async (ctx) => { - return { - "experimental.session.compacting": async (input, output) => { - // Replace the entire compaction prompt - output.prompt = ` -You are generating a continuation prompt for a multi-agent swarm session. - -Summarize: -1. The current task and its status -2. Which files are being modified and by whom -3. Any blockers or dependencies between agents -4. The next steps to complete the work - -Format as a structured prompt that a new agent can use to resume work. -` - }, - } -} -``` - -When `output.prompt` is set, it completely replaces the default compaction prompt. The `output.context` array is ignored in this case. diff --git a/packages/web/src/content/docs/policies.mdx b/packages/web/src/content/docs/policies.mdx deleted file mode 100644 index 2977e78371..0000000000 --- a/packages/web/src/content/docs/policies.mdx +++ /dev/null @@ -1,137 +0,0 @@ ---- -title: Policies -description: Control which configured resources CoDev Code may use. ---- - -Policies control whether CoDev Code may perform an action on a named resource. This feature is experimental and is configured with the `experimental.policies` array in `codev.json`. - -Policies are separate from [permissions](/docs/permissions). Permissions control what tools can do during a session, while policies control whether CoDev Code may use a resource such as an LLM provider. - ---- - -## Configuration - -Each policy statement has three fields: - -- `effect` - Either `"allow"` or `"deny"`. -- `action` - The operation being controlled. -- `resource` - The resource ID or wildcard pattern the statement applies to. - -For example, deny use of the `openai` provider: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": { - "policies": [ - { - "effect": "deny", - "action": "provider.use", - "resource": "openai" - } - ] - } -} -``` - -A provider denied by policy is not available for model selection or model use, even if it has credentials or is otherwise configured correctly. - ---- - -## Available Policies - -CoDev Code currently supports one policy action: - -| Action | Resource | Description | -| -------------- | ----------------------------- | ------------------------------------- | -| `provider.use` | Provider ID, such as `openai` | Allow or deny use of an LLM provider. | - -More policy actions may be added in the future. - ---- - -## Matching - -The `resource` field supports wildcard matching. Use `*` to match zero or more characters and `?` to match one character. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": { - "policies": [ - { - "effect": "deny", - "action": "provider.use", - "resource": "company-*" - } - ] - } -} -``` - -This denies providers such as `company-us` and `company-eu`. - ---- - -## Rule Order - -When multiple statements match, the last matching statement wins. Put broad rules first, then more specific exceptions after them. - -For example, allow only Anthropic: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "experimental": { - "policies": [ - { - "effect": "deny", - "action": "provider.use", - "resource": "*" - }, - { - "effect": "allow", - "action": "provider.use", - "resource": "anthropic" - } - ] - } -} -``` - -If no policy matches a provider, provider use is allowed by default. - -Policies may be set in both your global config and project config. If policies from both locations match the same provider, your global policy takes priority over the project policy. This prevents a repository from re-enabling a provider that you deny globally. - ---- - -## Provider Lists - -Use policies instead of the older `disabled_providers` and `enabled_providers` settings when controlling provider access. - -To replace `disabled_providers`: - -```json title="codev.json" -{ - "experimental": { - "policies": [ - { "effect": "deny", "action": "provider.use", "resource": "openai" }, - { "effect": "deny", "action": "provider.use", "resource": "google" } - ] - } -} -``` - -To replace `enabled_providers`, deny all providers first and allow the selected providers after it: - -```json title="codev.json" -{ - "experimental": { - "policies": [ - { "effect": "deny", "action": "provider.use", "resource": "*" }, - { "effect": "allow", "action": "provider.use", "resource": "anthropic" }, - { "effect": "allow", "action": "provider.use", "resource": "openai" } - ] - } -} -``` diff --git a/packages/web/src/content/docs/providers.mdx b/packages/web/src/content/docs/providers.mdx deleted file mode 100644 index 60a7d8941e..0000000000 --- a/packages/web/src/content/docs/providers.mdx +++ /dev/null @@ -1,2501 +0,0 @@ ---- -title: Providers -description: Using any LLM provider in CoDev Code. ---- - -import config from "../../../config.mjs" -export const console = config.console - -CoDev Code uses the [AI SDK](https://ai-sdk.dev/) and [Models.dev](https://models.dev) to support **75+ LLM providers** and it supports running local models. - -To add a provider you need to: - -1. Add the API keys for the provider using the `/connect` command. -2. Configure the provider in your CoDev Code config. - ---- - -### Credentials - -When you add a provider's API keys with the `/connect` command, they are stored -in `~/.local/share/codev/auth.json`. - ---- - -### Config - -You can customize the providers through the `provider` section in your CoDev Code -config. - ---- - -#### Base URL - -You can customize the base URL for any provider by setting the `baseURL` option. This is useful when using proxy services or custom endpoints. - -```json title="codev.json" {6} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "options": { - "baseURL": "https://api.anthropic.com/v1" - } - } - } -} -``` - ---- - -#### Hiding models - -You can hide specific models from the `/models` picker for a provider using the `blacklist` option. This is useful when a provider exposes models you don't want to use or select. - -```json title="codev.json" {6} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "blacklist": ["claude-opus-4-20250514"] - } - } -} -``` - -The inverse `whitelist` option hides every model except the ones listed. - -```json title="codev.json" {6} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "anthropic": { - "whitelist": ["claude-sonnet-4-20250514"] - } - } -} -``` - -Both options take an array of model IDs — the same IDs shown in the `/models` picker. - -- `blacklist` removes the listed models from the picker. -- `whitelist` keeps only the listed models and hides the rest. -- You can combine them: `whitelist` narrows the set, then `blacklist` removes entries from it. - ---- - -## OpenCode Zen - -OpenCode Zen is a list of models provided by the OpenCode team that have been -tested and verified to work well with CoDev Code. [Learn more](/docs/zen). - -:::tip -If you are new, we recommend starting with OpenCode Zen. -::: - -1. Run the `/connect` command in the TUI, select `OpenCode Zen`, and head to [opencode.ai/auth](https://opencode.ai/zen). - - ```txt - /connect - ``` - -2. Sign in, add your billing details, and copy your API key. - -3. Paste your API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run `/models` in the TUI to see the list of models we recommend. - - ```txt - /models - ``` - -It works like any other provider in CoDev Code and is completely optional to use. - ---- - -## OpenCode Go - -OpenCode Go is a low cost subscription plan that provides reliable access to popular open coding models provided by the OpenCode team that have been -tested and verified to work well with CoDev Code. - -1. Run the `/connect` command in the TUI, select `OpenCode Go`, and head to [opencode.ai/auth](https://opencode.ai/zen). - - ```txt - /connect - ``` - -2. Sign in, add your billing details, and copy your API key. - -3. Paste your API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run `/models` in the TUI to see the list of models we recommend. - - ```txt - /models - ``` - -It works like any other provider in CoDev Code and is completely optional to use. - ---- - -## Directory - -Let's look at some of the providers in detail. If you'd like to add a provider to the -list, feel free to open a PR. - -:::note -Don't see a provider here? Submit a PR. -::: - ---- - -### 302.AI - -1. Head over to the [302.AI console](https://302.ai/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **302.AI**. - - ```txt - /connect - ``` - -3. Enter your 302.AI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - ---- - -### Amazon Bedrock - -To use Amazon Bedrock with CoDev Code: - -1. Head over to the **Model catalog** in the Amazon Bedrock console and request - access to the models you want. - - :::tip - You need to have access to the model you want in Amazon Bedrock. - ::: - -2. **Configure authentication** using one of the following methods: - - *** - - #### Environment Variables (Quick Start) - - Set one of these environment variables while running CoDev Code: - - ```bash - # Option 1: Using AWS access keys - AWS_ACCESS_KEY_ID=XXX AWS_SECRET_ACCESS_KEY=YYY codev - - # Option 2: Using named AWS profile - AWS_PROFILE=my-profile codev - - # Option 3: Using Bedrock bearer token - AWS_BEARER_TOKEN_BEDROCK=XXX codev - ``` - - Or add them to your bash profile: - - ```bash title="~/.bash_profile" - export AWS_PROFILE=my-dev-profile - export AWS_REGION=us-east-1 - ``` - - *** - - #### Configuration File (Recommended) - - For project-specific or persistent configuration, use `codev.json`: - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "my-aws-profile" - } - } - } - } - ``` - - **Available options:** - - `region` - AWS region (e.g., `us-east-1`, `eu-west-1`) - - `profile` - AWS named profile from `~/.aws/credentials` - - `endpoint` - Custom endpoint URL for VPC endpoints (alias for generic `baseURL` option) - - :::tip - Configuration file options take precedence over environment variables. - ::: - - *** - - #### Advanced: VPC Endpoints - - If you're using VPC endpoints for Bedrock: - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - "options": { - "region": "us-east-1", - "profile": "production", - "endpoint": "https://bedrock-runtime.us-east-1.vpce-xxxxx.amazonaws.com" - } - } - } - } - ``` - - :::note - The `endpoint` option is an alias for the generic `baseURL` option, using AWS-specific terminology. If both `endpoint` and `baseURL` are specified, `endpoint` takes precedence. - ::: - - *** - - #### Authentication Methods - - **`AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`**: Create an IAM user and generate access keys in the AWS Console - - **`AWS_PROFILE`**: Use named profiles from `~/.aws/credentials`. First configure with `aws configure --profile my-profile` or `aws sso login` - - **`AWS_BEARER_TOKEN_BEDROCK`**: Generate long-term API keys from the Amazon Bedrock console - - **`AWS_WEB_IDENTITY_TOKEN_FILE` / `AWS_ROLE_ARN`**: For EKS IRSA (IAM Roles for Service Accounts) or other Kubernetes environments with OIDC federation. These environment variables are automatically injected by Kubernetes when using service account annotations. - - *** - - #### Authentication Precedence - - Amazon Bedrock uses the following authentication priority: - 1. **Bearer Token** - `AWS_BEARER_TOKEN_BEDROCK` environment variable or token from `/connect` command - 2. **AWS Credential Chain** - Profile, access keys, shared credentials, IAM roles, Web Identity Tokens (EKS IRSA), instance metadata - - :::note - When a bearer token is set (via `/connect` or `AWS_BEARER_TOKEN_BEDROCK`), it takes precedence over all AWS credential methods including configured profiles. - ::: - -3. Run the `/models` command to select the model you want. - - ```txt - /models - ``` - -:::note -For custom inference profiles, use the model and provider name in the key and set the `id` property to the arn. This ensures correct caching. -::: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "amazon-bedrock": { - // ... - "models": { - "anthropic-claude-sonnet-4.5": { - "id": "arn:aws:bedrock:us-east-1:xxx:application-inference-profile/yyy" - } - } - } - } -} -``` - ---- - -### Anthropic - -1. Once you've signed up, run the `/connect` command and select Anthropic. - - ```txt - /connect - ``` - -2. Here you can select the **Claude Pro/Max** option and it'll open your browser - and ask you to authenticate. - - ```txt - ┌ Select auth method - │ - │ Manually enter API Key - └ - ``` - -3. Now all the Anthropic models should be available when you use the `/models` command. - - ```txt - /models - ``` - -:::info -There are plugins that allow you to use your Claude Pro/Max models with -CoDev Code. Anthropic explicitly prohibits this. - -Previous versions of CoDev Code came bundled with these plugins but that is no -longer the case as of 1.3.0 - -Other companies support freedom of choice with developer tooling - you can use -the following subscriptions in CoDev Code with zero setup: - -- ChatGPT Plus -- Github Copilot -- Gitlab Duo - ::: - ---- - -### Atomic Chat - -You can configure CoDev Code to use local models through [Atomic Chat](https://atomic.chat), a desktop application that runs local LLMs behind an OpenAI-compatible API server (default endpoint `http://127.0.0.1:1337/v1`). - -```json title="codev.json" "atomic-chat" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "atomic-chat": { - "npm": "@ai-sdk/openai-compatible", - "name": "Atomic Chat (local)", - "options": { - "baseURL": "http://127.0.0.1:1337/v1" - }, - "models": { - "": { - "name": "" - } - } - } - } -} -``` - -In this example: - -- `atomic-chat` is the custom provider ID. This can be any string you want. -- `npm` specifies the package to use for this provider. Here, `@ai-sdk/openai-compatible` is used for any OpenAI-compatible API. -- `name` is the display name for the provider in the UI. -- `options.baseURL` is the endpoint for the local server. Change the host and port to match your Atomic Chat setup. -- `models` is a map of model IDs to their display names. Each ID must match the `id` returned by `GET /v1/models` — run `curl http://127.0.0.1:1337/v1/models` to list the ids currently loaded in Atomic Chat. - -:::tip -If tool calls aren't working well, pick a loaded model with strong tool-calling support (for example, a Qwen-Coder or DeepSeek-Coder variant). -::: - ---- - -### Azure OpenAI - -:::note -If you encounter "I'm sorry, but I cannot assist with that request" errors, try changing the content filter from **DefaultV2** to **Default** in your Azure resource. -::: - -1. Head over to the [Azure portal](https://portal.azure.com/) and create an **Azure OpenAI** resource. You'll need: - - **Resource name**: This becomes part of your API endpoint (`https://RESOURCE_NAME.openai.azure.com/`) - - **API key**: Either `KEY 1` or `KEY 2` from your resource - -2. Go to [Azure AI Foundry](https://ai.azure.com/) and deploy a model. - - :::note - The deployment name must match the model name for CoDev Code to work properly. - ::: - -3. Run the `/connect` command and search for **Azure**. - - ```txt - /connect - ``` - -4. Enter your API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -5. Set your resource name as an environment variable: - - ```bash - AZURE_RESOURCE_NAME=XXX codev - ``` - - Or add it to your bash profile: - - ```bash title="~/.bash_profile" - export AZURE_RESOURCE_NAME=XXX - ``` - -6. Run the `/models` command to select your deployed model. - - ```txt - /models - ``` - ---- - -### Azure Cognitive Services - -1. Head over to the [Azure portal](https://portal.azure.com/) and create an **Azure OpenAI** resource. You'll need: - - **Resource name**: This becomes part of your API endpoint (`https://AZURE_COGNITIVE_SERVICES_RESOURCE_NAME.cognitiveservices.azure.com/`) - - **API key**: Either `KEY 1` or `KEY 2` from your resource - -2. Go to [Azure AI Foundry](https://ai.azure.com/) and deploy a model. - - :::note - The deployment name must match the model name for CoDev Code to work properly. - ::: - -3. Run the `/connect` command and search for **Azure Cognitive Services**. - - ```txt - /connect - ``` - -4. Enter your API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -5. Set your resource name as an environment variable: - - ```bash - AZURE_COGNITIVE_SERVICES_RESOURCE_NAME=XXX codev - ``` - - Or add it to your bash profile: - - ```bash title="~/.bash_profile" - export AZURE_COGNITIVE_SERVICES_RESOURCE_NAME=XXX - ``` - -6. Run the `/models` command to select your deployed model. - - ```txt - /models - ``` - ---- - -### Baseten - -1. Head over to the [Baseten](https://app.baseten.co/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **Baseten**. - - ```txt - /connect - ``` - -3. Enter your Baseten API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - ---- - -### Cerebras - -1. Head over to the [Cerebras console](https://inference.cerebras.ai/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **Cerebras**. - - ```txt - /connect - ``` - -3. Enter your Cerebras API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Qwen 3 Coder 480B_. - - ```txt - /models - ``` - ---- - -### Cloudflare AI Gateway - -Cloudflare AI Gateway lets you access models from OpenAI, Anthropic, Workers AI, and more through a unified endpoint. With [Unified Billing](https://developers.cloudflare.com/ai-gateway/features/unified-billing/) you don't need separate API keys for each provider. - -1. Head over to the [Cloudflare dashboard](https://dash.cloudflare.com/), navigate to **AI** > **AI Gateway**, and create a new gateway. Note your **Account ID** and **Gateway ID**. - -2. Run the `/connect` command and search for **Cloudflare AI Gateway**. - - ```txt - /connect - ``` - -3. Enter your **Account ID** when prompted. - - ```txt - ┌ Enter your Cloudflare Account ID - │ - │ - └ enter - ``` - -4. Enter your **Gateway ID** when prompted. - - ```txt - ┌ Enter your Cloudflare AI Gateway ID - │ - │ - └ enter - ``` - -5. Enter your **Cloudflare API token**. - - ```txt - ┌ Gateway API token - │ - │ - └ enter - ``` - -6. Run the `/models` command to select a model. - - ```txt - /models - ``` - - You can also add models through your CoDev Code config. - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "cloudflare-ai-gateway": { - "models": { - "openai/gpt-4o": {}, - "anthropic/claude-sonnet-4": {} - } - } - } - } - ``` - - Alternatively, you can set environment variables instead of using `/connect`. - - ```bash title="~/.bash_profile" - export CLOUDFLARE_ACCOUNT_ID=your-32-character-account-id - export CLOUDFLARE_GATEWAY_ID=your-gateway-id - export CLOUDFLARE_API_TOKEN=your-api-token - ``` - ---- - -### Cloudflare Workers AI - -Cloudflare Workers AI lets you run AI models on Cloudflare's global network directly via REST API, with no separate provider accounts needed for supported models. - -1. Head over to the [Cloudflare dashboard](https://dash.cloudflare.com/), navigate to **Workers AI**, and select **Use REST API** to get your **Account ID** and create an API token. - -2. Run the `/connect` command and search for **Cloudflare Workers AI**. - - ```txt - /connect - ``` - -3. Enter your **Account ID** when prompted. - - ```txt - ┌ Enter your Cloudflare Account ID - │ - │ - └ enter - ``` - -4. Enter your **Cloudflare API key**. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -5. Run the `/models` command to select a model. - - ```txt - /models - ``` - - Alternatively, you can set environment variables instead of using `/connect`. - - ```bash title="~/.bash_profile" - export CLOUDFLARE_ACCOUNT_ID=your-32-character-account-id - export CLOUDFLARE_API_KEY=your-api-token - ``` - ---- - -### Cortecs - -1. Head over to the [Cortecs console](https://cortecs.ai/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **Cortecs**. - - ```txt - /connect - ``` - -3. Enter your Cortecs API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### DeepSeek - -1. Head over to the [DeepSeek console](https://platform.deepseek.com/), create an account, and click **Create new API key**. - -2. Run the `/connect` command and search for **DeepSeek**. - - ```txt - /connect - ``` - -3. Enter your DeepSeek API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a DeepSeek model like _DeepSeek V4 Pro_. - - ```txt - /models - ``` - ---- - -### Deep Infra - -1. Head over to the [Deep Infra dashboard](https://deepinfra.com/dash), create an account, and generate an API key. - -2. Run the `/connect` command and search for **Deep Infra**. - - ```txt - /connect - ``` - -3. Enter your Deep Infra API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - ---- - -### DigitalOcean - -DigitalOcean's [Inference Engine](https://docs.digitalocean.com/products/inference/) provides access to open models like GPT-OSS, Llama, Qwen, and DeepSeek, plus custom [Inference Routers](https://docs.digitalocean.com/products/genai-platform/concepts/inference-routers/) that route each request to the cheapest, fastest, or best-fit model for a task. - -CoDev Code supports two authentication methods: - -- **OAuth (Recommended)** — Sign in to your DigitalOcean account; CoDev Code uses your DigitalOcean API token directly for inference and discovers your Inference Routers. -- **Model Access Key** — Paste an existing key from the DigitalOcean console. - -#### OAuth (Recommended) - -1. Run the `/connect` command and search for **DigitalOcean**. - - ```txt - /connect - ``` - -2. Select **Login with DigitalOcean**. - - ```txt - ┌ Select auth method - │ - │ Login with DigitalOcean - │ Paste Model Access Key - └ - ``` - -3. Your browser opens to authorize CoDev Code. Sign in and approve. - - :::note - CoDev Code requests `genai:read` and `inference:query` OAuth scopes. Your DigitalOcean API token is used directly for inference — no separate Model Access Key is created. - ::: - - :::note - Inference Routers only appear in the model picker after OAuth. Pasting a Model Access Key manually does not discover routers. - ::: - -4. Run the `/models` command. Your Inference Routers appear as the format `router:` in the model selection. - - ```txt - /models - ``` - -5. To pick up newly created Inference Routers, re-run `/connect` and select **DigitalOcean** again. - -#### Using a Model Access Key - -If you'd rather paste a key directly: - -1. Head over to the **Manage** page in the Inference section of the [DigitalOcean console](https://cloud.digitalocean.com/) and create a new key. - -2. Run the `/connect` command and select **DigitalOcean**, then **Paste Model Access Key**. - - ```txt - ┌ Enter your DigitalOcean Model Access Key - │ - │ - └ enter - ``` - - :::note - Inference Routers are not auto-discovered with this method. To surface them in the model picker, sign in via OAuth instead. - ::: - -3. Run the `/models` command to select a model. - - ```txt - /models - ``` - -#### Environment Variable - -Alternatively, set your Model Access Key as an environment variable. - -```bash frame="none" -export DIGITALOCEAN_ACCESS_TOKEN=your-model-access-key -``` - -#### Inference Routers - -Inference Routers let you define a routing policy across multiple models — picking the cheapest, fastest, or most appropriate model per request based on the task. After OAuth, CoDev Code surfaces each router as `router:` in the model picker. - -Selecting a router model is a drop-in replacement for any other model — CoDev Code forwards your request and DigitalOcean picks the underlying model based on your router's policy. Learn more about [Inference Routers](https://docs.digitalocean.com/products/inference/how-to/use-inference-router/) - ---- - -### FrogBot - -1. Head over to the [FrogBot dashboard](https://app.frogbot.ai/signup), create an account, and generate an API key. - -2. Run the `/connect` command and search for **FrogBot**. - - ```txt - /connect - ``` - -3. Enter your FrogBot API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - ---- - -### Fireworks AI - -1. Head over to the [Fireworks AI console](https://app.fireworks.ai/), create an account, and click **Create API Key**. - -2. Run the `/connect` command and search for **Fireworks AI**. - - ```txt - /connect - ``` - -3. Enter your Fireworks AI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### GitLab Duo - -:::caution[Experimental] -GitLab Duo support in CoDev Code is experimental. Features, configuration, and -behavior may change in future releases. -::: - -CoDev Code integrates with the [GitLab Duo Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/), -providing AI-powered agentic chat with native tool calling capabilities. - -:::note[License requirements] -GitLab Duo Agent Platform requires a **Premium** or **Ultimate** GitLab -subscription. It is available on GitLab.com and GitLab Self-Managed. -See [GitLab Duo Agent Platform prerequisites](https://docs.gitlab.com/user/duo_agent_platform/#prerequisites) -for full requirements. -::: - -1. Run the `/connect` command and select GitLab. - - ```txt - /connect - ``` - -2. Choose your authentication method: - - ```txt - ┌ Select auth method - │ - │ OAuth (Recommended) - │ Personal Access Token - └ - ``` - - #### Using OAuth (Recommended) - - Select **OAuth** and your browser will open for authorization. - - #### Using Personal Access Token - 1. Go to [GitLab User Settings > Access Tokens](https://gitlab.com/-/user_settings/personal_access_tokens) - 2. Click **Add new token** - 3. Name: `CoDev Code`, Scopes: `api` - 4. Copy the token (starts with `glpat-`) - 5. Enter it in the terminal - -3. Run the `/models` command to see available models. - - ```txt - /models - ``` - - Three Claude-based models are available: - - **duo-chat-haiku-4-5** (Default) - Fast responses for quick tasks - - **duo-chat-sonnet-4-5** - Balanced performance for most workflows - - **duo-chat-opus-4-5** - Most capable for complex analysis - -:::note -You can also specify 'GITLAB_TOKEN' environment variable if you don't want -to store token in CoDev Code auth storage. -::: - -##### Self-Hosted GitLab - -:::note[compliance note] -CoDev Code uses a small model for some AI tasks like generating the session title. -It is configured to use gpt-5-nano by default, hosted by Zen. To lock CoDev Code -to only use your own GitLab-hosted instance, add the following to your -`codev.json` file. It is also recommended to disable session sharing. - -```json -{ - "$schema": "https://opencode.ai/config.json", - "small_model": "gitlab/duo-chat-haiku-4-5", - "share": "disabled" -} -``` - -::: - -For self-hosted GitLab instances: - -```bash -export GITLAB_INSTANCE_URL=https://gitlab.company.com -export GITLAB_TOKEN=glpat-... -``` - -If your instance runs a custom AI Gateway: - -```bash -GITLAB_AI_GATEWAY_URL=https://ai-gateway.company.com -``` - -Or add to your bash profile: - -```bash title="~/.bash_profile" -export GITLAB_INSTANCE_URL=https://gitlab.company.com -export GITLAB_AI_GATEWAY_URL=https://ai-gateway.company.com -export GITLAB_TOKEN=glpat-... -``` - -:::note -Your GitLab administrator must: - -1. [Turn on GitLab Duo](https://docs.gitlab.com/user/duo_agent_platform/turn_on_off/#turn-gitlab-duo-on-or-off) - for the user, group, or instance -2. [Turn on the Agent Platform](https://docs.gitlab.com/user/duo_agent_platform/turn_on_off/#turn-gitlab-duo-agent-platform-on-or-off) - (GitLab 18.8+) or [enable beta and experimental features](https://docs.gitlab.com/user/duo_agent_platform/turn_on_off/#turn-on-beta-and-experimental-features) - (GitLab 18.7 and earlier) -3. For Self-Managed, [configure your instance](https://docs.gitlab.com/administration/gitlab_duo/configure/gitlab_self_managed/) - ::: - -##### OAuth for Self-Hosted instances - -In order to make Oauth working for your self-hosted instance, you need to create -a new application (Settings → Applications) with the -callback URL `http://127.0.0.1:8080/callback` and following scopes: - -- api (Access the API on your behalf) -- read_user (Read your personal information) -- read_repository (Allows read-only access to the repository) - -Then expose application ID as environment variable: - -```bash -export GITLAB_OAUTH_CLIENT_ID=your_application_id_here -``` - -More documentation on [opencode-gitlab-auth](https://www.npmjs.com/package/opencode-gitlab-auth) homepage. - -##### Configuration - -Customize through `codev.json`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "gitlab": { - "options": { - "instanceUrl": "https://gitlab.com" - } - } - } -} -``` - -##### GitLab Duo Agent Platform (DAP) Workflow Models - -DAP workflow models provide an alternative execution path that routes tool calls -through GitLab's Duo Workflow Service (DWS) instead of the standard agentic chat. -When a `duo-workflow-*` model is selected, CoDev Code will: - -1. Discover available models from your GitLab namespace -2. Present a selection picker if multiple models are available -3. Cache the selected model to disk for fast subsequent startups -4. Route tool execution requests through CoDev Code's permission-gated tool system - -Available DAP workflow models follow the `duo-workflow-*` naming convention and -are dynamically discovered from your GitLab instance. - -##### GitLab API Tools (Optional, but highly recommended) - -To access GitLab tools (merge requests, issues, pipelines, CI/CD, etc.): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "plugin": ["opencode-gitlab-plugin"] -} -``` - -This plugin provides comprehensive GitLab repository management capabilities including MR reviews, issue tracking, pipeline monitoring, and more. - ---- - -### GitHub Copilot - -To use your GitHub Copilot subscription with CoDev Code: - -:::note -Some models might need a [Pro+ -subscription](https://github.com/features/copilot/plans) to use. -::: - -1. Run the `/connect` command and search for GitHub Copilot. - - ```txt - /connect - ``` - -2. Navigate to [github.com/login/device](https://github.com/login/device) and enter the code. - - ```txt - ┌ Login with GitHub Copilot - │ - │ https://github.com/login/device - │ - │ Enter code: 8F43-6FCF - │ - └ Waiting for authorization... - ``` - -3. Now run the `/models` command to select the model you want. - - ```txt - /models - ``` - ---- - -### GMI Cloud - -To use GMI Cloud with CoDev Code: - -1. Head over to the [GMI Cloud console](https://console.gmicloud.ai/) to create an API key. You can also review the [API reference](https://docs.gmicloud.ai/inference-engine/api-reference/llm-api-reference) for the endpoint details. - -2. Run the `/connect` command and search for **GMI Cloud**. - - ```txt - /connect - ``` - -3. Enter your GMI Cloud API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select the model you want. - - ```txt - /models - ``` - ---- - -### Google Vertex AI - -To use Google Vertex AI with CoDev Code: - -1. Head over to the **Model Garden** in the Google Cloud Console and check the - models available in your region. - - :::note - You need to have a Google Cloud project with Vertex AI API enabled. - ::: - -2. Set the required environment variables: - - `GOOGLE_CLOUD_PROJECT`: Your Google Cloud project ID - - `VERTEX_LOCATION` (optional): The region for Vertex AI (defaults to `global`) - - Authentication (choose one): - - `GOOGLE_APPLICATION_CREDENTIALS`: Path to your service account JSON key file - - Authenticate using gcloud CLI: `gcloud auth application-default login` - - Set them while running CoDev Code. - - ```bash - GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json GOOGLE_CLOUD_PROJECT=your-project-id codev - ``` - - Or add them to your bash profile. - - ```bash title="~/.bash_profile" - export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json - export GOOGLE_CLOUD_PROJECT=your-project-id - export VERTEX_LOCATION=global - ``` - -:::tip -The `global` region improves availability and reduces errors at no extra cost. Use regional endpoints (e.g., `us-central1`) for data residency requirements. [Learn more](https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models#regional_and_global_endpoints) -::: - -3. Run the `/models` command to select the model you want. - - ```txt - /models - ``` - ---- - -### Groq - -1. Head over to the [Groq console](https://console.groq.com/), click **Create API Key**, and copy the key. - -2. Run the `/connect` command and search for Groq. - - ```txt - /connect - ``` - -3. Enter the API key for the provider. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select the one you want. - - ```txt - /models - ``` - ---- - -### Hugging Face - -[Hugging Face Inference Providers](https://huggingface.co/docs/inference-providers) provides access to open models supported by 17+ providers. - -1. Head over to [Hugging Face settings](https://huggingface.co/settings/tokens/new?ownUserPermissions=inference.serverless.write&tokenType=fineGrained) to create a token with permission to make calls to Inference Providers. - -2. Run the `/connect` command and search for **Hugging Face**. - - ```txt - /connect - ``` - -3. Enter your Hugging Face token. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Kimi-K2-Instruct_ or _GLM-4.6_. - - ```txt - /models - ``` - ---- - -### Helicone - -[Helicone](https://helicone.ai) is an LLM observability platform that provides logging, monitoring, and analytics for your AI applications. The Helicone AI Gateway routes your requests to the appropriate provider automatically based on the model. - -1. Head over to [Helicone](https://helicone.ai), create an account, and generate an API key from your dashboard. - -2. Run the `/connect` command and search for **Helicone**. - - ```txt - /connect - ``` - -3. Enter your Helicone API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - -For more providers and advanced features like caching and rate limiting, check the [Helicone documentation](https://docs.helicone.ai). - -#### Optional Configs - -In the event you see a feature or model from Helicone that isn't configured automatically through CoDev Code, you can always configure it yourself. - -Here's [Helicone's Model Directory](https://helicone.ai/models), you'll need this to grab the IDs of the models you want to add. - -```jsonc title="~/.config/codev/codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "helicone": { - "npm": "@ai-sdk/openai-compatible", - "name": "Helicone", - "options": { - "baseURL": "https://ai-gateway.helicone.ai", - }, - "models": { - "gpt-4o": { - // Model ID (from Helicone's model directory page) - "name": "GPT-4o", // Your own custom name for the model - }, - "claude-sonnet-4-20250514": { - "name": "Claude Sonnet 4", - }, - }, - }, - }, -} -``` - -#### Custom Headers - -Helicone supports custom headers for features like caching, user tracking, and session management. Add them to your provider config using `options.headers`: - -```jsonc title="~/.config/codev/codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "helicone": { - "npm": "@ai-sdk/openai-compatible", - "name": "Helicone", - "options": { - "baseURL": "https://ai-gateway.helicone.ai", - "headers": { - "Helicone-Cache-Enabled": "true", - "Helicone-User-Id": "opencode", - }, - }, - }, - }, -} -``` - -##### Session tracking - -Helicone's [Sessions](https://docs.helicone.ai/features/sessions) feature lets you group related LLM requests together. Use the [opencode-helicone-session](https://github.com/H2Shami/opencode-helicone-session) plugin to automatically log each CoDev Code conversation as a session in Helicone. - -```bash -npm install -g opencode-helicone-session -``` - -Add it to your config. - -```json title="codev.json" -{ - "plugin": ["opencode-helicone-session"] -} -``` - -The plugin injects `Helicone-Session-Id` and `Helicone-Session-Name` headers into your requests. In Helicone's Sessions page, you'll see each CoDev Code conversation listed as a separate session. - -##### Common Helicone headers - -| Header | Description | -| -------------------------- | ------------------------------------------------------------- | -| `Helicone-Cache-Enabled` | Enable response caching (`true`/`false`) | -| `Helicone-User-Id` | Track metrics by user | -| `Helicone-Property-[Name]` | Add custom properties (e.g., `Helicone-Property-Environment`) | -| `Helicone-Prompt-Id` | Associate requests with prompt versions | - -See the [Helicone Header Directory](https://docs.helicone.ai/helicone-headers/header-directory) for all available headers. - ---- - -### llama.cpp - -You can configure CoDev Code to use local models through [llama.cpp's](https://github.com/ggml-org/llama.cpp) llama-server utility - -```json title="codev.json" "llama.cpp" {5, 6, 8, 10-15} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "llama.cpp": { - "npm": "@ai-sdk/openai-compatible", - "name": "llama-server (local)", - "options": { - "baseURL": "http://127.0.0.1:8080/v1" - }, - "models": { - "qwen3-coder:a3b": { - "name": "Qwen3-Coder: a3b-30b (local)", - "limit": { - "context": 128000, - "output": 65536 - } - } - } - } - } -} -``` - -In this example: - -- `llama.cpp` is the custom provider ID. This can be any string you want. -- `npm` specifies the package to use for this provider. Here, `@ai-sdk/openai-compatible` is used for any OpenAI-compatible API. -- `name` is the display name for the provider in the UI. -- `options.baseURL` is the endpoint for the local server. -- `models` is a map of model IDs to their configurations. The model name will be displayed in the model selection list. - ---- - -### IO.NET - -IO.NET offers 17 models optimized for various use cases: - -1. Head over to the [IO.NET console](https://ai.io.net/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **IO.NET**. - - ```txt - /connect - ``` - -3. Enter your IO.NET API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - ---- - -### LM Studio - -You can configure CoDev Code to use local models through LM Studio. - -```json title="codev.json" "lmstudio" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "lmstudio": { - "npm": "@ai-sdk/openai-compatible", - "name": "LM Studio (local)", - "options": { - "baseURL": "http://127.0.0.1:1234/v1" - }, - "models": { - "google/gemma-3n-e4b": { - "name": "Gemma 3n-e4b (local)" - } - } - } - } -} -``` - -In this example: - -- `lmstudio` is the custom provider ID. This can be any string you want. -- `npm` specifies the package to use for this provider. Here, `@ai-sdk/openai-compatible` is used for any OpenAI-compatible API. -- `name` is the display name for the provider in the UI. -- `options.baseURL` is the endpoint for the local server. -- `models` is a map of model IDs to their configurations. The model name will be displayed in the model selection list. - ---- - -### Moonshot AI - -To use Kimi K2 from Moonshot AI: - -1. Head over to the [Moonshot AI console](https://platform.moonshot.ai/console), create an account, and click **Create API key**. - -2. Run the `/connect` command and search for **Moonshot AI**. - - ```txt - /connect - ``` - -3. Enter your Moonshot API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select _Kimi K2_. - - ```txt - /models - ``` - ---- - -### MiniMax - -1. Head over to the [MiniMax API Console](https://platform.minimax.io/login), create an account, and generate an API key. - -2. Run the `/connect` command and search for **MiniMax**. - - ```txt - /connect - ``` - -3. Enter your MiniMax API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _M2.1_. - - ```txt - /models - ``` - ---- - -### NVIDIA - -NVIDIA provides access to Nemotron models and many other open models through [build.nvidia.com](https://build.nvidia.com) for free. - -1. Head over to [build.nvidia.com](https://build.nvidia.com), create an account, and generate an API key. - -2. Run the `/connect` command and search for **NVIDIA**. - - ```txt - /connect - ``` - -3. Enter your NVIDIA API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like nemotron-3-super-120b-a12b. - - ```txt - /models - ``` - -#### On-Prem / NIM - -You can also use NVIDIA models locally via [NVIDIA NIM](https://docs.nvidia.com/nim/) by setting a custom base URL. - -```json title="codev.json" {6} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "nvidia": { - "options": { - "baseURL": "http://localhost:8000/v1" - } - } - } -} -``` - -#### Environment Variable - -Alternatively, set your API key as an environment variable. - -```bash frame="none" -export NVIDIA_API_KEY=nvapi-your-key-here -``` - ---- - -### Nebius Token Factory - -1. Head over to the [Nebius Token Factory console](https://tokenfactory.nebius.com/), create an account, and click **Add Key**. - -2. Run the `/connect` command and search for **Nebius Token Factory**. - - ```txt - /connect - ``` - -3. Enter your Nebius Token Factory API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### Ollama - -You can configure CoDev Code to use local models through Ollama. - -:::tip -Ollama can automatically configure itself for CoDev Code. See the [Ollama integration docs](https://docs.ollama.com/integrations/opencode) for details. -::: - -```json title="codev.json" "ollama" {5, 6, 8, 10-14} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "ollama": { - "npm": "@ai-sdk/openai-compatible", - "name": "Ollama (local)", - "options": { - "baseURL": "http://localhost:11434/v1" - }, - "models": { - "llama2": { - "name": "Llama 2" - } - } - } - } -} -``` - -In this example: - -- `ollama` is the custom provider ID. This can be any string you want. -- `npm` specifies the package to use for this provider. Here, `@ai-sdk/openai-compatible` is used for any OpenAI-compatible API. -- `name` is the display name for the provider in the UI. -- `options.baseURL` is the endpoint for the local server. -- `models` is a map of model IDs to their configurations. The model name will be displayed in the model selection list. - -:::tip -If tool calls aren't working, try increasing `num_ctx` in Ollama. Start around 16k - 32k. -::: - ---- - -### Ollama Cloud - -To use Ollama Cloud with CoDev Code: - -1. Head over to [https://ollama.com/](https://ollama.com/) and sign in or create an account. - -2. Navigate to **Settings** > **Keys** and click **Add API Key** to generate a new API key. - -3. Copy the API key for use in CoDev Code. - -4. Run the `/connect` command and search for **Ollama Cloud**. - - ```txt - /connect - ``` - -5. Enter your Ollama Cloud API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -6. **Important**: Before using cloud models in CoDev Code, you must pull the model information locally: - - ```bash - ollama pull gpt-oss:20b-cloud - ``` - -7. Run the `/models` command to select your Ollama Cloud model. - - ```txt - /models - ``` - ---- - -### OpenAI - -We recommend signing up for [ChatGPT Plus or Pro](https://chatgpt.com/pricing). - -1. Once you've signed up, run the `/connect` command and select OpenAI. - - ```txt - /connect - ``` - -2. Here you can select the **ChatGPT Plus/Pro** option and it'll open your browser - and ask you to authenticate. - - ```txt - ┌ Select auth method - │ - │ ChatGPT Plus/Pro - │ Manually enter API Key - └ - ``` - -3. Now all the OpenAI models should be available when you use the `/models` command. - - ```txt - /models - ``` - -##### Using API keys - -If you already have an API key, you can select **Manually enter API Key** and paste it in your terminal. - ---- - -### OpenCode Zen - -OpenCode Zen is a list of tested and verified models provided by the OpenCode team. [Learn more](/docs/zen). - -1. Sign in to **OpenCode Zen** and click **Create API Key**. - -2. Run the `/connect` command and search for **OpenCode Zen**. - - ```txt - /connect - ``` - -3. Enter your CoDev Code API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Qwen 3 Coder 480B_. - - ```txt - /models - ``` - ---- - -### OpenRouter - -1. Head over to the [OpenRouter dashboard](https://openrouter.ai/settings/keys), click **Create API Key**, and copy the key. - -2. Run the `/connect` command and search for OpenRouter. - - ```txt - /connect - ``` - -3. Enter the API key for the provider. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Many OpenRouter models are preloaded by default, run the `/models` command to select the one you want. - - ```txt - /models - ``` - - You can also add additional models through your CoDev Code config. - - ```json title="codev.json" {6} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "openrouter": { - "models": { - "somecoolnewmodel": {} - } - } - } - } - ``` - -5. You can also customize them through your CoDev Code config. Here's an example of specifying a provider - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "openrouter": { - "models": { - "moonshotai/kimi-k2": { - "options": { - "provider": { - "order": ["baseten"], - "allow_fallbacks": false - } - } - } - } - } - } - } - ``` - ---- - -### LLM Gateway - -1. Head over to the [LLM Gateway dashboard](https://llmgateway.io/dashboard), click **Create API Key**, and copy the key. - -2. Run the `/connect` command and search for LLM Gateway. - - ```txt - /connect - ``` - -3. Enter the API key for the provider. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Many LLM Gateway models are preloaded by default, run the `/models` command to select the one you want. - - ```txt - /models - ``` - - You can also add additional models through your CoDev Code config. - - ```json title="codev.json" {6} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "llmgateway": { - "models": { - "somecoolnewmodel": {} - } - } - } - } - ``` - -5. You can also customize them through your CoDev Code config. Here's an example of specifying a provider - - ```json title="codev.json" - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "llmgateway": { - "models": { - "glm-4.7": { - "name": "GLM 4.7" - }, - "gpt-5.2": { - "name": "GPT-5.2" - }, - "gemini-2.5-pro": { - "name": "Gemini 2.5 Pro" - }, - "claude-3-5-sonnet-20241022": { - "name": "Claude 3.5 Sonnet" - } - } - } - } - } - ``` - ---- - -### SAP AI Core - -SAP AI Core provides access to 40+ models from OpenAI, Anthropic, Google, Amazon, Meta, Mistral, and AI21 through a unified platform. - -1. Go to your [SAP BTP Cockpit](https://account.hana.ondemand.com/), navigate to your SAP AI Core service instance, and create a service key. - - :::tip - The service key is a JSON object containing `clientid`, `clientsecret`, `url`, and `serviceurls.AI_API_URL`. You can find your AI Core instance under **Services** > **Instances and Subscriptions** in the BTP Cockpit. - ::: - -2. Run the `/connect` command and search for **SAP AI Core**. - - ```txt - /connect - ``` - -3. Enter your service key JSON. - - ```txt - ┌ Service key - │ - │ - └ enter - ``` - - Or set the `AICORE_SERVICE_KEY` environment variable: - - ```bash - AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' codev - ``` - - Or add it to your bash profile: - - ```bash title="~/.bash_profile" - export AICORE_SERVICE_KEY='{"clientid":"...","clientsecret":"...","url":"...","serviceurls":{"AI_API_URL":"..."}}' - ``` - -4. Optionally set deployment ID and resource group: - - ```bash - AICORE_DEPLOYMENT_ID=your-deployment-id AICORE_RESOURCE_GROUP=your-resource-group codev - ``` - - :::note - These settings are optional and should be configured according to your SAP AI Core setup. - ::: - -5. Run the `/models` command to select from 40+ available models. - - ```txt - /models - ``` - ---- - -### STACKIT - -STACKIT AI Model Serving provides fully managed sovereign hosting environment for AI models, focusing on LLMs like Llama, Mistral, and Qwen, with maximum data sovereignty on European infrastructure. - -1. Head over to [STACKIT Portal](https://portal.stackit.cloud), navigate to **AI Model Serving**, and create an auth token for your project. - - :::tip - You need a STACKIT customer account, user account, and project before creating auth tokens. - ::: - -2. Run the `/connect` command and search for **STACKIT**. - - ```txt - /connect - ``` - -3. Enter your STACKIT AI Model Serving auth token. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select from available models like _Qwen3-VL 235B_ or _Llama 3.3 70B_. - - ```txt - /models - ``` - ---- - -### OVHcloud AI Endpoints - -1. Head over to the [OVHcloud panel](https://ovh.com/manager). Navigate to the `Public Cloud` section, `AI & Machine Learning` > `AI Endpoints` and in `API Keys` tab, click **Create a new API key**. - -2. Run the `/connect` command and search for **OVHcloud AI Endpoints**. - - ```txt - /connect - ``` - -3. Enter your OVHcloud AI Endpoints API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _gpt-oss-120b_. - - ```txt - /models - ``` - ---- - -### Scaleway - -To use [Scaleway Generative APIs](https://www.scaleway.com/en/docs/generative-apis/) with CoDev Code: - -1. Head over to the [Scaleway Console IAM settings](https://console.scaleway.com/iam/api-keys) to generate a new API key. - -2. Run the `/connect` command and search for **Scaleway**. - - ```txt - /connect - ``` - -3. Enter your Scaleway API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _devstral-2-123b-instruct-2512_ or _gpt-oss-120b_. - - ```txt - /models - ``` - ---- - -### Snowflake Cortex - -[Snowflake Cortex](https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-rest-api) gives you access to frontier models (Claude, OpenAI GPT-5, and more) via an OpenAI-compatible API. All inference runs within the Snowflake perimeter and is billed in Snowflake credits. For per-model rates, see the [Snowflake Service Consumption Table](https://www.snowflake.com/legal-files/CreditConsumptionTable.pdf). - -Don't have a Snowflake account? [Sign up for a free trial](https://signup.snowflake.com/?utm_source=opencode&utm_medium=docs&utm_campaign=cortex-provider). - -CoDev Code's core workflow for coding, editing files, and running commands relies on tool calling. Only the Claude and OpenAI families within Snowflake Cortex support this. The provider is limited to those families to support the core workflow. - -CoDev Code supports two authentication methods: - -- **Browser OAuth (Recommended)** — sign in with your IdP/SSO; no secrets to manage, tokens refresh automatically. -- **Manual bearer token** — paste a PAT or JWT from the Snowflake console. - -#### Browser OAuth (Recommended) - -1. Run the `/connect` command and search for **Snowflake Cortex**. - - ```txt - /connect - ``` - -2. Select **Login with Snowflake (External Browser)**. - - ```txt - ┌ Select auth method - │ - │ Login with Snowflake (External Browser) - │ Paste PAT or bearer token manually - └ - ``` - -3. Enter your [account identifier](https://docs.snowflake.com/en/user-guide/admin-account-identifier) when prompted, for example `myorg-myaccount` or `xy12345.us-east-1`. - - ```txt - ┌ Snowflake Account Identifier - │ - │ - └ enter - ``` - -4. Optionally enter a Snowflake role to scope the session (e.g. `SYSADMIN`). Leave blank to use your default role. - -5. Complete sign-in in the browser that opens. CoDev Code captures the OAuth callback automatically and stores the token — no copy/paste needed. - -6. Run the `/models` command to select a model. - - ```txt - /models - ``` - -:::note -Browser OAuth uses Snowflake's built-in `SNOWFLAKE$LOCAL_APPLICATION` security integration ([docs](https://docs.snowflake.com/en/user-guide/oauth-local-applications)), which is rolling out to all accounts. To check availability in your account: - -```sql -SHOW SECURITY INTEGRATIONS LIKE 'SNOWFLAKE$LOCAL_APPLICATION'; -``` - -If the result is empty, use the **Manual bearer token** method below while the integration rolls out to your account. -::: - -#### Manual bearer token - -If you prefer to paste a token directly, or if `SNOWFLAKE$LOCAL_APPLICATION` is not yet available in your account: - -1. Generate a [Programmatic Access Token (PAT)](https://docs.snowflake.com/en/user-guide/programmatic-access-tokens) in your Snowflake account. - -2. Run the `/connect` command, search for **Snowflake Cortex**, and select **Paste PAT or bearer token manually**. - -3. Enter your [account identifier](https://docs.snowflake.com/en/user-guide/admin-account-identifier) when prompted. - -4. Paste your PAT. - -5. Run the `/models` command to select a model. - - ```txt - /models - ``` - -#### Environment variable - -For CI or headless environments, set a PAT or JWT before starting CoDev Code: - -```bash -export SNOWFLAKE_ACCOUNT=myorg-myaccount -export SNOWFLAKE_CORTEX_TOKEN=your-pat-or-jwt -``` - -:::note -`SNOWFLAKE_CORTEX_TOKEN` accepts a PAT or JWT only — the browser OAuth flow is available via `/connect` only and cannot be configured through an environment variable. `SNOWFLAKE_CORTEX_PAT` is still supported for backward compatibility. -::: - -The model catalog is provided automatically. A minimal `codev.json` is all that's needed: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "model": "snowflake-cortex/claude-sonnet-4-6", - "small_model": "snowflake-cortex/claude-haiku-4-5" -} -``` - ---- - -### Together AI - -1. Head over to the [Together AI console](https://api.together.ai), create an account, and click **Add Key**. - -2. Run the `/connect` command and search for **Together AI**. - - ```txt - /connect - ``` - -3. Enter your Together AI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Kimi K2 Instruct_. - - ```txt - /models - ``` - ---- - -### Venice AI - -1. Head over to the [Venice AI console](https://venice.ai), create an account, and generate an API key. - -2. Run the `/connect` command and search for **Venice AI**. - - ```txt - /connect - ``` - -3. Enter your Venice AI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Llama 3.3 70B_. - - ```txt - /models - ``` - ---- - -### Vercel AI Gateway - -Vercel AI Gateway lets you access models from OpenAI, Anthropic, Google, xAI, and more through a unified endpoint. Models are offered at list price with no markup. - -1. Head over to the [Vercel dashboard](https://vercel.com/), navigate to the **AI Gateway** tab, and click **API keys** to create a new API key. - -2. Run the `/connect` command and search for **Vercel AI Gateway**. - - ```txt - /connect - ``` - -3. Enter your Vercel AI Gateway API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model. - - ```txt - /models - ``` - -You can also customize models through your CoDev Code config. Here's an example of specifying provider routing order. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "vercel": { - "models": { - "anthropic/claude-sonnet-4": { - "options": { - "order": ["anthropic", "vertex"] - } - } - } - } - } -} -``` - -Some useful routing options: - -| Option | Description | -| ------------------- | ---------------------------------------------------- | -| `order` | Provider sequence to try | -| `only` | Restrict to specific providers | -| `zeroDataRetention` | Only use providers with zero data retention policies | - ---- - -### xAI - -Three ways to authenticate: a SuperGrok subscription via browser OAuth, the same SuperGrok subscription via a headless device-code flow (for VPS / SSH / Docker), or a pay-as-you-go API key from the xAI console. - -#### Option A — SuperGrok OAuth (browser login) - -1. Run the `/connect` command and search for **xAI**. - - ```txt - /connect - ``` - -2. Select **xAI Grok OAuth (SuperGrok Subscription)**. CoDev Code opens xAI's consent screen in your browser and waits for the callback on `http://127.0.0.1:56121/callback`. - -3. Run the `/models` command to select a Grok model. - - ```txt - /models - ``` - -CoDev Code refreshes the OAuth access token automatically. Any Grok or X Premium plan that includes Grok API access works; you do not need a separate `XAI_API_KEY`. - -#### Option B — SuperGrok device-code (headless / remote server / VPS) - -Use this when CoDev Code is running somewhere a browser can't reach the loopback redirect: a VPS, a remote dev box over SSH, inside Docker, in CI, etc. No callback port is opened on the host running CoDev Code — instead xAI hands the CLI a short code that you type into a browser on any other device (laptop, phone, …). - -1. Run the `/connect` command on the remote host and search for **xAI**. - - ```txt - /connect - ``` - -2. Select **xAI Grok OAuth (Headless / Remote / VPS)**. CoDev Code prints a verification URL and a short user code. - - ```txt - Open https://x.ai/device on any device and enter code: ABCD-1234 - ``` - -3. Open the URL on a device that has a browser (your laptop or phone), enter the code, and approve the consent screen. CoDev Code polls xAI's token endpoint and stores the resulting OAuth tokens once you approve. Token refresh works the same as Option A. - -#### Option C — API key - -1. Head over to the [xAI console](https://console.x.ai/), create an account, and generate an API key. - -2. Run the `/connect` command and search for **xAI**. - - ```txt - /connect - ``` - -3. Select **Manually enter API Key** and paste your xAI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _Grok Beta_. - - ```txt - /models - ``` - ---- - -### Z.AI - -1. Head over to the [Z.AI API console](https://z.ai/manage-apikey/apikey-list), create an account, and click **Create a new API key**. - -2. Run the `/connect` command and search for **Z.AI**. - - ```txt - /connect - ``` - - If you are subscribed to the **GLM Coding Plan**, select **Z.AI Coding Plan**. - -3. Enter your Z.AI API key. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Run the `/models` command to select a model like _GLM-4.7_. - - ```txt - /models - ``` - ---- - -### ZenMux - -1. Head over to the [ZenMux dashboard](https://zenmux.ai/settings/keys), click **Create API Key**, and copy the key. - -2. Run the `/connect` command and search for ZenMux. - - ```txt - /connect - ``` - -3. Enter the API key for the provider. - - ```txt - ┌ API key - │ - │ - └ enter - ``` - -4. Many ZenMux models are preloaded by default, run the `/models` command to select the one you want. - - ```txt - /models - ``` - - You can also add additional models through your CoDev Code config. - - ```json title="codev.json" {6} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "zenmux": { - "models": { - "somecoolnewmodel": {} - } - } - } - } - ``` - ---- - -## Custom provider - -To add any **OpenAI-compatible** provider that's not listed in the `/connect` command: - -:::tip -You can use any OpenAI-compatible provider with CoDev Code. Most modern AI providers offer OpenAI-compatible APIs. -::: - -1. Run the `/connect` command and scroll down to **Other**. - - ```bash - $ /connect - - ┌ Add credential - │ - ◆ Select provider - │ ... - │ ● Other - └ - ``` - -2. Enter a unique ID for the provider. - - ```bash - $ /connect - - ┌ Add credential - │ - ◇ Enter provider id - │ myprovider - └ - ``` - - :::note - Choose a memorable ID, you'll use this in your config file. - ::: - -3. Enter your API key for the provider. - - ```bash - $ /connect - - ┌ Add credential - │ - ▲ This only stores a credential for myprovider - you will need to configure it in codev.json, check the docs for examples. - │ - ◇ Enter your API key - │ sk-... - └ - ``` - -4. Create or update your `codev.json` file in your project directory: - - ```json title="codev.json" ""myprovider"" {5-15} - { - "$schema": "https://opencode.ai/config.json", - "provider": { - "myprovider": { - "npm": "@ai-sdk/openai-compatible", - "name": "My AI ProviderDisplay Name", - "options": { - "baseURL": "https://api.myprovider.com/v1" - }, - "models": { - "my-model-name": { - "name": "My Model Display Name" - } - } - } - } - } - ``` - - Here are the configuration options: - - **npm**: AI SDK package to use, `@ai-sdk/openai-compatible` for OpenAI-compatible providers (for `/v1/chat/completions`). If your provider/model uses `/v1/responses`, use `@ai-sdk/openai`. - - **name**: Display name in UI. - - **models**: Available models. - - **options.baseURL**: API endpoint URL. - - **options.apiKey**: Optionally set the API key, if not using auth. - - **options.headers**: Optionally set custom headers. - - More on the advanced options in the example below. - -5. Run the `/models` command and your custom provider and models will appear in the selection list. - ---- - -##### Example - -Here's an example setting the `apiKey`, `headers`, and model `limit` options. - -```json title="codev.json" {9,11,17-20} -{ - "$schema": "https://opencode.ai/config.json", - "provider": { - "myprovider": { - "npm": "@ai-sdk/openai-compatible", - "name": "My AI ProviderDisplay Name", - "options": { - "baseURL": "https://api.myprovider.com/v1", - "apiKey": "{env:ANTHROPIC_API_KEY}", - "headers": { - "Authorization": "Bearer custom-token" - } - }, - "models": { - "my-model-name": { - "name": "My Model Display Name", - "limit": { - "context": 200000, - "output": 65536 - } - } - } - } - } -} -``` - -Configuration details: - -- **apiKey**: Set using `env` variable syntax, [learn more](/docs/config#env-vars). -- **headers**: Custom headers sent with each request. -- **limit.context**: Maximum input tokens the model accepts. -- **limit.output**: Maximum tokens the model can generate. - -The `limit` fields allow CoDev Code to understand how much context you have left. Standard providers pull these from models.dev automatically. - ---- - -## Troubleshooting - -If you are having trouble with configuring a provider, check the following: - -1. **Check the auth setup**: Run `codev auth list` to see if the credentials - for the provider are added to your config. - - This doesn't apply to providers like Amazon Bedrock, that rely on environment variables for their auth. - -2. For custom providers, check the CoDev Code config and: - - Make sure the provider ID used in the `/connect` command matches the ID in your CoDev Code config. - - The right npm package is used for the provider. For example, use `@ai-sdk/cerebras` for Cerebras. And for all other OpenAI-compatible providers, use `@ai-sdk/openai-compatible` (for `/v1/chat/completions`); if a model uses `/v1/responses`, use `@ai-sdk/openai`. For mixed setups under one provider, you can override per model via `provider.npm`. - - Check correct API endpoint is used in the `options.baseURL` field. diff --git a/packages/web/src/content/docs/references.mdx b/packages/web/src/content/docs/references.mdx deleted file mode 100644 index 85927e1a4f..0000000000 --- a/packages/web/src/content/docs/references.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: References -description: Add local directories and Git repositories as project references. ---- - -References give CoDev Code access to directories outside the current project. Use them to make documentation, shared libraries, examples, or another repository available while you work. - -References are configured by alias in `codev.json` or `codev.jsonc`. - -```jsonc title="codev.jsonc" -{ - "$schema": "https://opencode.ai/config.json", - "references": { - "docs": { - "path": "../product-docs", - "description": "Use for product behavior and documentation conventions", - }, - "sdk": { - "repository": "anomalyco/opencode-sdk-js", - "branch": "main", - "description": "Use for JavaScript SDK implementation details", - }, - }, -} -``` - ---- - -## Local directories - -Use `path` to reference a local directory. - -```jsonc title="codev.jsonc" -{ - "references": { - "docs": { - "path": "../docs", - }, - }, -} -``` - -Paths can be: - -- Relative to the config file that defines the reference -- Absolute, such as `/home/user/docs` -- Relative to your home directory, such as `~/docs` - -You can also use a string shorthand: - -```jsonc title="codev.jsonc" -{ - "references": { - "docs": "../docs", - }, -} -``` - ---- - -## Git repositories - -Use `repository` to reference a Git repository. CoDev Code materializes the repository in its local repository cache and makes the checked-out source available as a reference directory. - -```jsonc title="codev.jsonc" -{ - "references": { - "effect": { - "repository": "Effect-TS/effect", - "branch": "main", - }, - }, -} -``` - -`repository` accepts Git URLs, host/path references, and GitHub `owner/repo` shorthand. The optional `branch` field selects a branch or ref. Without `branch`, CoDev Code uses the repository's default branch. - -You can use string shorthand when you do not need a branch, description, or other options: - -```jsonc title="codev.jsonc" -{ - "references": { - "effect": "Effect-TS/effect", - }, -} -``` - -:::note -Git references are refreshed asynchronously. A newly configured repository may take a moment to finish cloning or updating. -::: - ---- - -## Describe usage - -Add `description` to explain when an agent should use a reference. - -```jsonc title="codev.jsonc" -{ - "references": { - "design-system": { - "path": "../design-system", - "description": "Use when implementing UI components or design tokens", - }, - }, -} -``` - -CoDev Code includes references with descriptions in agent context. Descriptions should be short and specific enough to distinguish references with similar content. References without descriptions remain available through autocomplete and direct use, but are not advertised to agents. - ---- - -## Hide autocomplete entries - -Set `hidden` to `true` to omit a reference from `@` autocomplete in the TUI. - -```jsonc title="codev.jsonc" -{ - "references": { - "internal": { - "path": "../internal", - "description": "Use for internal implementation details", - "hidden": true, - }, - }, -} -``` - -`hidden` only affects autocomplete. A hidden reference with a description remains included in agent context. - ---- - -## Use references - -Configured references appear in TUI `@` autocomplete. Type `@alias` to attach the reference root, or `@alias/` to search for files inside it. - -```text -Compare this implementation with @sdk/src/client.ts -``` - -Agents also receive the resolved paths and descriptions of configured references that have descriptions in their system context, so they can inspect a reference when it is relevant without you attaching it manually. - -CoDev Code automatically allows reference directories through its external-directory permission boundary. Normal tool permissions still apply; for example, an agent that cannot edit files does not gain edit access because a directory is configured as a reference. - ---- - -## Configure fields - -| Field | Local | Git | Description | -| ------------- | ----- | --- | ------------------------------------------------ | -| `path` | Yes | No | Local reference directory | -| `repository` | No | Yes | Git URL, host/path, or GitHub `owner/repo` value | -| `branch` | No | Yes | Optional Git branch or ref | -| `description` | Yes | Yes | Guidance describing when to use the reference | -| `hidden` | Yes | Yes | Hide the reference from TUI `@` autocomplete | - -Reference aliases cannot be empty or contain `/`, whitespace, backticks, or commas. diff --git a/packages/web/src/content/docs/rules.mdx b/packages/web/src/content/docs/rules.mdx deleted file mode 100644 index 0f52fbc0fa..0000000000 --- a/packages/web/src/content/docs/rules.mdx +++ /dev/null @@ -1,188 +0,0 @@ ---- -title: Rules -description: Set custom instructions for CoDev Code. ---- - -You can provide custom instructions to CoDev Code by creating an `AGENTS.md` file. This is similar to Cursor's rules. It contains instructions that will be included in the LLM's context to customize its behavior for your specific project. - ---- - -## Initialize - -To create a new `AGENTS.md` file, you can run the `/init` command in CoDev Code. - -:::tip -You should commit your project's `AGENTS.md` file to Git. -::: - -`/init` scans the important files in your repo, may ask a couple of targeted questions when the codebase cannot answer them, and then creates or updates `AGENTS.md` with concise project-specific guidance. - -It focuses on the things future agent sessions are most likely to need: - -- build, lint, and test commands -- command order and focused verification steps when they matter -- architecture and repo structure that are not obvious from filenames alone -- project-specific conventions, setup quirks, and operational gotchas -- references to existing instruction sources like Cursor or Copilot rules - -If you already have an `AGENTS.md`, `/init` will improve it in place instead of blindly replacing it. - ---- - -## Example - -You can also just create this file manually. Here's an example of some things you can put into an `AGENTS.md` file. - -```markdown title="AGENTS.md" -# SST v3 Monorepo Project - -This is an SST v3 monorepo with TypeScript. The project uses bun workspaces for package management. - -## Project Structure - -- `packages/` - Contains all workspace packages (functions, core, web, etc.) -- `infra/` - Infrastructure definitions split by service (storage.ts, api.ts, web.ts) -- `sst.config.ts` - Main SST configuration with dynamic imports - -## Code Standards - -- Use TypeScript with strict mode enabled -- Shared code goes in `packages/core/` with proper exports configuration -- Functions go in `packages/functions/` -- Infrastructure should be split into logical files in `infra/` - -## Monorepo Conventions - -- Import shared modules using workspace names: `@my-app/core/example` -``` - -We are adding project-specific instructions here and this will be shared across your team. - ---- - -## Types - -CoDev Code also supports reading the `AGENTS.md` file from multiple locations. And this serves different purposes. - -### Project - -Place an `AGENTS.md` in your project root for project-specific rules. These only apply when you are working in this directory or its sub-directories. - -### Global - -You can also have global rules in a `~/.config/codev/AGENTS.md` file. This gets applied across all CoDev Code sessions. - -Since this isn't committed to Git or shared with your team, we recommend using this to specify any personal rules that the LLM should follow. - -### Claude Code Compatibility - -For users migrating from Claude Code, CoDev Code supports Claude Code's file conventions as fallbacks: - -- **Project rules**: `CLAUDE.md` in your project directory (used if no `AGENTS.md` exists) -- **Global rules**: `~/.claude/CLAUDE.md` (used if no `~/.config/codev/AGENTS.md` exists) -- **Skills**: `~/.claude/skills/` — see [Agent Skills](/docs/skills/) for details - -To disable Claude Code compatibility, set one of these environment variables: - -```bash -export CODEV_DISABLE_CLAUDE_CODE=1 # Disable all .claude support -export CODEV_DISABLE_CLAUDE_CODE_PROMPT=1 # Disable only ~/.claude/CLAUDE.md -export CODEV_DISABLE_CLAUDE_CODE_SKILLS=1 # Disable only .claude/skills -``` - ---- - -## Precedence - -When CoDev Code starts, it looks for rule files in this order: - -1. **Local files** by traversing up from the current directory (`AGENTS.md`, `CLAUDE.md`) -2. **Global file** at `~/.config/codev/AGENTS.md` -3. **Claude Code file** at `~/.claude/CLAUDE.md` (unless disabled) - -The first matching file wins in each category. For example, if you have both `AGENTS.md` and `CLAUDE.md`, only `AGENTS.md` is used. Similarly, `~/.config/codev/AGENTS.md` takes precedence over `~/.claude/CLAUDE.md`. - ---- - -## Custom Instructions - -You can specify custom instruction files in your `codev.json` or the global `~/.config/codev/codev.json`. This allows you and your team to reuse existing rules rather than having to duplicate them to AGENTS.md. - -Example: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["CONTRIBUTING.md", "docs/guidelines.md", ".cursor/rules/*.md"] -} -``` - -You can also use remote URLs to load instructions from the web. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["https://raw.githubusercontent.com/my-org/shared-rules/main/style.md"] -} -``` - -Remote instructions are fetched with a 5 second timeout. - -All instruction files are combined with your `AGENTS.md` files. - ---- - -## Referencing External Files - -While CoDev Code doesn't automatically parse file references in `AGENTS.md`, you can achieve similar functionality in two ways: - -### Using codev.json - -The recommended approach is to use the `instructions` field in `codev.json`: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "instructions": ["docs/development-standards.md", "test/testing-guidelines.md", "packages/*/AGENTS.md"] -} -``` - -### Manual Instructions in AGENTS.md - -You can teach CoDev Code to read external files by providing explicit instructions in your `AGENTS.md`. Here's a practical example: - -```markdown title="AGENTS.md" -# TypeScript Project Rules - -## External File Loading - -CRITICAL: When you encounter a file reference (e.g., @rules/general.md), use your Read tool to load it on a need-to-know basis. They're relevant to the SPECIFIC task at hand. - -Instructions: - -- Do NOT preemptively load all references - use lazy loading based on actual need -- When loaded, treat content as mandatory instructions that override defaults -- Follow references recursively when needed - -## Development Guidelines - -For TypeScript code style and best practices: @docs/typescript-guidelines.md -For React component architecture and hooks patterns: @docs/react-patterns.md -For REST API design and error handling: @docs/api-standards.md -For testing strategies and coverage requirements: @test/testing-guidelines.md - -## General Guidelines - -Read the following file immediately as it's relevant to all workflows: @rules/general-guidelines.md. -``` - -This approach allows you to: - -- Create modular, reusable rule files -- Share rules across projects via symlinks or git submodules -- Keep AGENTS.md concise while referencing detailed guidelines -- Ensure CoDev Code loads files only when needed for the specific task - -:::tip -For monorepos or projects with shared standards, using `codev.json` with glob patterns (like `packages/*/AGENTS.md`) is more maintainable than manual instructions. -::: diff --git a/packages/web/src/content/docs/sdk.mdx b/packages/web/src/content/docs/sdk.mdx deleted file mode 100644 index 7f93af106c..0000000000 --- a/packages/web/src/content/docs/sdk.mdx +++ /dev/null @@ -1,463 +0,0 @@ ---- -title: SDK -description: Type-safe JS client for CoDev Code server. ---- - -import config from "../../../config.mjs" -export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts` - -The CoDev Code JS/TS SDK provides a type-safe client for interacting with the server. -Use it to build integrations and control CoDev Code programmatically. - -[Learn more](/docs/server) about how the server works. For examples, check out the [projects](/docs/ecosystem#projects) built by the community. - ---- - -## Install - -Install the SDK from npm: - -```bash -npm install @opencode-ai/sdk -``` - ---- - -## Create client - -Create an instance of CoDev Code: - -```javascript -import { createOpencode } from "@opencode-ai/sdk" - -const { client } = await createOpencode() -``` - -This starts both a server and a client - -#### Options - -| Option | Type | Description | Default | -| ---------- | ------------- | ------------------------------ | ----------- | -| `hostname` | `string` | Server hostname | `127.0.0.1` | -| `port` | `number` | Server port | `4096` | -| `signal` | `AbortSignal` | Abort signal for cancellation | `undefined` | -| `timeout` | `number` | Timeout in ms for server start | `5000` | -| `config` | `Config` | Configuration object | `{}` | - ---- - -## Config - -You can pass a configuration object to customize behavior. The instance still picks up your `codev.json`, but you can override or add configuration inline: - -```javascript -import { createOpencode } from "@opencode-ai/sdk" - -const opencode = await createOpencode({ - hostname: "127.0.0.1", - port: 4096, - config: { - model: "anthropic/claude-3-5-sonnet-20241022", - }, -}) - -console.log(`Server running at ${opencode.server.url}`) - -opencode.server.close() -``` - -## Client only - -If you already have a running instance of CoDev Code, you can create a client instance to connect to it: - -```javascript -import { createOpencodeClient } from "@opencode-ai/sdk" - -const client = createOpencodeClient({ - baseUrl: "http://localhost:4096", -}) -``` - -#### Options - -| Option | Type | Description | Default | -| --------------- | ---------- | -------------------------------- | ----------------------- | -| `baseUrl` | `string` | URL of the server | `http://localhost:4096` | -| `fetch` | `function` | Custom fetch implementation | `globalThis.fetch` | -| `parseAs` | `string` | Response parsing method | `auto` | -| `responseStyle` | `string` | Return style: `data` or `fields` | `fields` | -| `throwOnError` | `boolean` | Throw errors instead of return | `false` | - ---- - -## Types - -The SDK includes TypeScript definitions for all API types. Import them directly: - -```typescript -import type { Session, Message, Part } from "@opencode-ai/sdk" -``` - -All types are generated from the server's OpenAPI specification and available in the types file. - ---- - -## Errors - -The SDK can throw errors that you can catch and handle: - -```typescript -try { - await client.session.get({ path: { id: "invalid-id" } }) -} catch (error) { - console.error("Failed to get session:", (error as Error).message) -} -``` - ---- - -## Structured Output - -You can request structured JSON output from the model by specifying an `format` with a JSON schema. The model will use a `StructuredOutput` tool to return validated JSON matching your schema. - -### Basic Usage - -```typescript -const result = await client.session.prompt({ - path: { id: sessionId }, - body: { - parts: [{ type: "text", text: "Research Anthropic and provide company info" }], - format: { - type: "json_schema", - schema: { - type: "object", - properties: { - company: { type: "string", description: "Company name" }, - founded: { type: "number", description: "Year founded" }, - products: { - type: "array", - items: { type: "string" }, - description: "Main products", - }, - }, - required: ["company", "founded"], - }, - }, - }, -}) - -// Access the structured output -console.log(result.data.info.structured_output) -// { company: "Anthropic", founded: 2021, products: ["Claude", "Claude API"] } -``` - -### Output Format Types - -| Type | Description | -| ------------- | ------------------------------------------------------ | -| `text` | Default. Standard text response (no structured output) | -| `json_schema` | Returns validated JSON matching the provided schema | - -### JSON Schema Format - -When using `type: 'json_schema'`, provide: - -| Field | Type | Description | -| ------------ | --------------- | ---------------------------------------------------------- | -| `type` | `'json_schema'` | Required. Specifies JSON schema mode | -| `schema` | `object` | Required. JSON Schema object defining the output structure | -| `retryCount` | `number` | Optional. Number of validation retries (default: 2) | - -### Error Handling - -If the model fails to produce valid structured output after all retries, the response will include a `StructuredOutputError`: - -```typescript -if (result.data.info.error?.name === "StructuredOutputError") { - console.error("Failed to produce structured output:", result.data.info.error.message) - console.error("Attempts:", result.data.info.error.retries) -} -``` - -### Best Practices - -1. **Provide clear descriptions** in your schema properties to help the model understand what data to extract -2. **Use `required`** to specify which fields must be present -3. **Keep schemas focused** - complex nested schemas may be harder for the model to fill correctly -4. **Set appropriate `retryCount`** - increase for complex schemas, decrease for simple ones - ---- - -## APIs - -The SDK exposes all server APIs through a type-safe client. - ---- - -### Global - -| Method | Description | Response | -| ----------------- | ------------------------------- | ------------------------------------ | -| `global.health()` | Check server health and version | `{ healthy: true, version: string }` | - ---- - -#### Examples - -```javascript -const health = await client.global.health() -console.log(health.data.version) -``` - ---- - -### App - -| Method | Description | Response | -| -------------- | ------------------------- | ------------------------------------------- | -| `app.log()` | Write a log entry | `boolean` | -| `app.agents()` | List all available agents | Agent[] | - ---- - -#### Examples - -```javascript -// Write a log entry -await client.app.log({ - body: { - service: "my-app", - level: "info", - message: "Operation completed", - }, -}) - -// List available agents -const agents = await client.app.agents() -``` - ---- - -### Project - -| Method | Description | Response | -| ------------------- | ------------------- | --------------------------------------------- | -| `project.list()` | List all projects | Project[] | -| `project.current()` | Get current project | Project | - ---- - -#### Examples - -```javascript -// List all projects -const projects = await client.project.list() - -// Get current project -const currentProject = await client.project.current() -``` - ---- - -### Path - -| Method | Description | Response | -| ------------ | ---------------- | ---------------------------------------- | -| `path.get()` | Get current path | Path | - ---- - -#### Examples - -```javascript -// Get current path information -const pathInfo = await client.path.get() -``` - ---- - -### Config - -| Method | Description | Response | -| -------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- | -| `config.get()` | Get config info | Config | -| `config.providers()` | List providers and default models | `{ providers: `Provider[]`, default: { [key: string]: string } }` | - ---- - -#### Examples - -```javascript -const config = await client.config.get() - -const { providers, default: defaults } = await client.config.providers() -``` - ---- - -### Sessions - -| Method | Description | Notes | -| ---------------------------------------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `session.list()` | List sessions | Returns Session[] | -| `session.get({ path })` | Get session | Returns Session | -| `session.children({ path })` | List child sessions | Returns Session[] | -| `session.create({ body })` | Create session | Returns Session | -| `session.delete({ path })` | Delete session | Returns `boolean` | -| `session.update({ path, body })` | Update session properties | Returns Session | -| `session.init({ path, body })` | Analyze app and create `AGENTS.md` | Returns `boolean` | -| `session.abort({ path })` | Abort a running session | Returns `boolean` | -| `session.share({ path })` | Share session | Returns Session | -| `session.unshare({ path })` | Unshare session | Returns Session | -| `session.summarize({ path, body })` | Summarize session | Returns `boolean` | -| `session.messages({ path })` | List messages in a session | Returns `{ info: `Message`, parts: `Part[]`}[]` | -| `session.message({ path })` | Get message details | Returns `{ info: `Message`, parts: `Part[]`}` | -| `session.prompt({ path, body })` | Send prompt message | `body.noReply: true` returns UserMessage (context only). Default returns AssistantMessage with AI response. Supports `body.outputFormat` for [structured output](#structured-output) | -| `session.command({ path, body })` | Send command to session | Returns `{ info: `AssistantMessage`, parts: `Part[]`}` | -| `session.shell({ path, body })` | Run a shell command | Returns AssistantMessage | -| `session.revert({ path, body })` | Revert a message | Returns Session | -| `session.unrevert({ path })` | Restore reverted messages | Returns Session | -| `postSessionByIdPermissionsByPermissionId({ path, body })` | Respond to a permission request | Returns `boolean` | - ---- - -#### Examples - -```javascript -// Create and manage sessions -const session = await client.session.create({ - body: { title: "My session" }, -}) - -const sessions = await client.session.list() - -// Send a prompt message -const result = await client.session.prompt({ - path: { id: session.id }, - body: { - model: { providerID: "anthropic", modelID: "claude-3-5-sonnet-20241022" }, - parts: [{ type: "text", text: "Hello!" }], - }, -}) - -// Inject context without triggering AI response (useful for plugins) -await client.session.prompt({ - path: { id: session.id }, - body: { - noReply: true, - parts: [{ type: "text", text: "You are a helpful assistant." }], - }, -}) -``` - ---- - -### Files - -| Method | Description | Response | -| ------------------------- | ---------------------------------- | ------------------------------------------------------------------------------------------- | -| `find.text({ query })` | Search for text in files | Array of match objects with `path`, `lines`, `line_number`, `absolute_offset`, `submatches` | -| `find.files({ query })` | Find files and directories by name | `string[]` (paths) | -| `find.symbols({ query })` | Find workspace symbols | Symbol[] | -| `file.read({ query })` | Read a file | `{ type: "raw" \| "patch", content: string }` | -| `file.status({ query? })` | Get status for tracked files | File[] | - -`find.files` supports a few optional query fields: - -- `type`: `"file"` or `"directory"` -- `directory`: override the project root for the search -- `limit`: max results (1–200) - ---- - -#### Examples - -```javascript -// Search and read files -const textResults = await client.find.text({ - query: { pattern: "function.*opencode" }, -}) - -const files = await client.find.files({ - query: { query: "*.ts", type: "file" }, -}) - -const directories = await client.find.files({ - query: { query: "packages", type: "directory", limit: 20 }, -}) - -const content = await client.file.read({ - query: { path: "src/index.ts" }, -}) -``` - ---- - -### TUI - -| Method | Description | Response | -| ------------------------------ | ------------------------- | --------- | -| `tui.appendPrompt({ body })` | Append text to the prompt | `boolean` | -| `tui.openHelp()` | Open the help dialog | `boolean` | -| `tui.openSessions()` | Open the session selector | `boolean` | -| `tui.openThemes()` | Open the theme selector | `boolean` | -| `tui.openModels()` | Open the model selector | `boolean` | -| `tui.submitPrompt()` | Submit the current prompt | `boolean` | -| `tui.clearPrompt()` | Clear the prompt | `boolean` | -| `tui.executeCommand({ body })` | Execute a command | `boolean` | -| `tui.showToast({ body })` | Show toast notification | `boolean` | - ---- - -#### Examples - -```javascript -// Control TUI interface -await client.tui.appendPrompt({ - body: { text: "Add this to prompt" }, -}) - -await client.tui.showToast({ - body: { message: "Task completed", variant: "success" }, -}) -``` - ---- - -### Auth - -| Method | Description | Response | -| ------------------- | ------------------------------ | --------- | -| `auth.set({ ... })` | Set authentication credentials | `boolean` | - ---- - -#### Examples - -```javascript -await client.auth.set({ - path: { id: "anthropic" }, - body: { type: "api", key: "your-api-key" }, -}) -``` - ---- - -### Events - -| Method | Description | Response | -| ------------------- | ------------------------- | ------------------------- | -| `event.subscribe()` | Server-sent events stream | Server-sent events stream | - ---- - -#### Examples - -```javascript -// Listen to real-time events -const events = await client.event.subscribe() -for await (const event of events.stream) { - console.log("Event:", event.type, event.properties) -} -``` diff --git a/packages/web/src/content/docs/server.mdx b/packages/web/src/content/docs/server.mdx deleted file mode 100644 index b7cd4abe75..0000000000 --- a/packages/web/src/content/docs/server.mdx +++ /dev/null @@ -1,287 +0,0 @@ ---- -title: Server -description: Interact with CoDev Code server over HTTP. ---- - -import config from "../../../config.mjs" -export const typesUrl = `${config.github}/blob/dev/packages/sdk/js/src/gen/types.gen.ts` - -The `codev serve` command runs a headless HTTP server that exposes an OpenAPI endpoint that a CoDev Code client can use. - ---- - -### Usage - -```bash -codev serve [--port ] [--hostname ] [--cors ] -``` - -#### Options - -| Flag | Description | Default | -| --------------- | ----------------------------------- | ---------------- | -| `--port` | Port to listen on | `4096` | -| `--hostname` | Hostname to listen on | `127.0.0.1` | -| `--mdns` | Enable mDNS discovery | `false` | -| `--mdns-domain` | Custom domain name for mDNS service | `opencode.local` | -| `--cors` | Additional browser origins to allow | `[]` | - -`--cors` can be passed multiple times: - -```bash -codev serve --cors http://localhost:5173 --cors https://app.example.com -``` - ---- - -### Authentication - -Set `CODEV_SERVER_PASSWORD` to protect the server with HTTP basic auth. The username defaults to `opencode`, or set `CODEV_SERVER_USERNAME` to override it. This applies to both `codev serve` and `codev web`. - -```bash -CODEV_SERVER_PASSWORD=your-password codev serve -``` - ---- - -### How it works - -When you run `codev` it starts a TUI and a server. Where the TUI is the -client that talks to the server. The server exposes an OpenAPI 3.1 spec -endpoint. This endpoint is also used to generate an [SDK](/docs/sdk). - -:::tip -Use the CoDev Code server to interact with CoDev Code programmatically. -::: - -This architecture lets CoDev Code support multiple clients and allows you to interact with CoDev Code programmatically. - -You can run `codev serve` to start a standalone server. If you have the -CoDev Code TUI running, `codev serve` will start a new server. - ---- - -#### Connect to an existing server - -When you start the TUI it randomly assigns a port and hostname. You can instead pass in the `--hostname` and `--port` [flags](/docs/cli). Then use this to connect to its server. - -The [`/tui`](#tui) endpoint can be used to drive the TUI through the server. For example, you can prefill or run a prompt. This setup is used by the CoDev Code [IDE](/docs/ide) plugins. - ---- - -## Spec - -The server publishes an OpenAPI 3.1 spec that can be viewed at: - -``` -http://:/doc -``` - -For example, `http://localhost:4096/doc`. Use the spec to generate clients or inspect request and response types. Or view it in a Swagger explorer. - ---- - -## APIs - -The CoDev Code server exposes the following APIs. - ---- - -### Global - -| Method | Path | Description | Response | -| ------ | ---------------- | ------------------------------ | ------------------------------------ | -| `GET` | `/global/health` | Get server health and version | `{ healthy: true, version: string }` | -| `GET` | `/global/event` | Get global events (SSE stream) | Event stream | - ---- - -### Project - -| Method | Path | Description | Response | -| ------ | ------------------ | ----------------------- | --------------------------------------------- | -| `GET` | `/project` | List all projects | Project[] | -| `GET` | `/project/current` | Get the current project | Project | - ---- - -### Path & VCS - -| Method | Path | Description | Response | -| ------ | ------- | ------------------------------------ | ------------------------------------------- | -| `GET` | `/path` | Get the current path | Path | -| `GET` | `/vcs` | Get VCS info for the current project | VcsInfo | - ---- - -### Instance - -| Method | Path | Description | Response | -| ------ | ------------------- | ---------------------------- | --------- | -| `POST` | `/instance/dispose` | Dispose the current instance | `boolean` | - ---- - -### Config - -| Method | Path | Description | Response | -| ------- | ------------------- | --------------------------------- | ---------------------------------------------------------------------------------------- | -| `GET` | `/config` | Get config info | Config | -| `PATCH` | `/config` | Update config | Config | -| `GET` | `/config/providers` | List providers and default models | `{ providers: `Provider[]`, default: { [key: string]: string } }` | - ---- - -### Provider - -| Method | Path | Description | Response | -| ------ | -------------------------------- | ------------------------------------ | ----------------------------------------------------------------------------------- | -| `GET` | `/provider` | List all providers | `{ all: `Provider[]`, default: {...}, connected: string[] }` | -| `GET` | `/provider/auth` | Get provider authentication methods | `{ [providerID: string]: `ProviderAuthMethod[]` }` | -| `POST` | `/provider/{id}/oauth/authorize` | Authorize a provider using OAuth | ProviderAuthAuthorization | -| `POST` | `/provider/{id}/oauth/callback` | Handle OAuth callback for a provider | `boolean` | - ---- - -### Sessions - -| Method | Path | Description | Notes | -| -------- | ---------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------- | -| `GET` | `/session` | List all sessions | Returns Session[] | -| `POST` | `/session` | Create a new session | body: `{ parentID?, title? }`, returns Session | -| `GET` | `/session/status` | Get session status for all sessions | Returns `{ [sessionID: string]: `SessionStatus` }` | -| `GET` | `/session/:id` | Get session details | Returns Session | -| `DELETE` | `/session/:id` | Delete a session and all its data | Returns `boolean` | -| `PATCH` | `/session/:id` | Update session properties | body: `{ title? }`, returns Session | -| `GET` | `/session/:id/children` | Get a session's child sessions | Returns Session[] | -| `GET` | `/session/:id/todo` | Get the todo list for a session | Returns Todo[] | -| `POST` | `/session/:id/init` | Analyze app and create `AGENTS.md` | body: `{ messageID, providerID, modelID }`, returns `boolean` | -| `POST` | `/session/:id/fork` | Fork an existing session at a message | body: `{ messageID? }`, returns Session | -| `POST` | `/session/:id/abort` | Abort a running session | Returns `boolean` | -| `POST` | `/session/:id/share` | Share a session | Returns Session | -| `DELETE` | `/session/:id/share` | Unshare a session | Returns Session | -| `GET` | `/session/:id/diff` | Get the diff for this session | query: `messageID?`, returns FileDiff[] | -| `POST` | `/session/:id/summarize` | Summarize the session | body: `{ providerID, modelID }`, returns `boolean` | -| `POST` | `/session/:id/revert` | Revert a message | body: `{ messageID, partID? }`, returns `boolean` | -| `POST` | `/session/:id/unrevert` | Restore all reverted messages | Returns `boolean` | -| `POST` | `/session/:id/permissions/:permissionID` | Respond to a permission request | body: `{ response, remember? }`, returns `boolean` | - ---- - -### Messages - -| Method | Path | Description | Notes | -| ------ | --------------------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `GET` | `/session/:id/message` | List messages in a session | query: `limit?`, returns `{ info: `Message`, parts: `Part[]`}[]` | -| `POST` | `/session/:id/message` | Send a message and wait for response | body: `{ messageID?, model?, agent?, noReply?, system?, tools?, parts }`, returns `{ info: `Message`, parts: `Part[]`}` | -| `GET` | `/session/:id/message/:messageID` | Get message details | Returns `{ info: `Message`, parts: `Part[]`}` | -| `POST` | `/session/:id/prompt_async` | Send a message asynchronously (no wait) | body: same as `/session/:id/message`, returns `204 No Content` | -| `POST` | `/session/:id/command` | Execute a slash command | body: `{ messageID?, agent?, model?, command, arguments }`, returns `{ info: `Message`, parts: `Part[]`}` | -| `POST` | `/session/:id/shell` | Run a shell command | body: `{ agent, model?, command }`, returns `{ info: `Message`, parts: `Part[]`}` | - ---- - -### Commands - -| Method | Path | Description | Response | -| ------ | ---------- | ----------------- | --------------------------------------------- | -| `GET` | `/command` | List all commands | Command[] | - ---- - -### Files - -| Method | Path | Description | Response | -| ------ | ------------------------ | ---------------------------------- | ------------------------------------------------------------------------------------------- | -| `GET` | `/find?pattern=` | Search for text in files | Array of match objects with `path`, `lines`, `line_number`, `absolute_offset`, `submatches` | -| `GET` | `/find/file?query=` | Find files and directories by name | `string[]` (paths) | -| `GET` | `/find/symbol?query=` | Find workspace symbols | Symbol[] | -| `GET` | `/file?path=` | List files and directories | FileNode[] | -| `GET` | `/file/content?path=

` | Read a file | FileContent | -| `GET` | `/file/status` | Get status for tracked files | File[] | - -#### `/find/file` query parameters - -- `query` (required) — search string (fuzzy match) -- `type` (optional) — limit results to `"file"` or `"directory"` -- `directory` (optional) — override the project root for the search -- `limit` (optional) — max results (1–200) -- `dirs` (optional) — legacy flag (`"false"` returns only files) - ---- - -### Tools (Experimental) - -| Method | Path | Description | Response | -| ------ | ------------------------------------------- | ---------------------------------------- | -------------------------------------------- | -| `GET` | `/experimental/tool/ids` | List all tool IDs | ToolIDs | -| `GET` | `/experimental/tool?provider=

&model=` | List tools with JSON schemas for a model | ToolList | - ---- - -### LSP, Formatters & MCP - -| Method | Path | Description | Response | -| ------ | ------------ | -------------------------- | -------------------------------------------------------- | -| `GET` | `/lsp` | Get LSP server status | LSPStatus[] | -| `GET` | `/formatter` | Get formatter status | FormatterStatus[] | -| `GET` | `/mcp` | Get MCP server status | `{ [name: string]: `MCPStatus` }` | -| `POST` | `/mcp` | Add MCP server dynamically | body: `{ name, config }`, returns MCP status object | - ---- - -### Agents - -| Method | Path | Description | Response | -| ------ | -------- | ------------------------- | ------------------------------------------- | -| `GET` | `/agent` | List all available agents | Agent[] | - ---- - -### Logging - -| Method | Path | Description | Response | -| ------ | ------ | ------------------------------------------------------------ | --------- | -| `POST` | `/log` | Write log entry. Body: `{ service, level, message, extra? }` | `boolean` | - ---- - -### TUI - -| Method | Path | Description | Response | -| ------ | ----------------------- | ------------------------------------------- | ---------------------- | -| `POST` | `/tui/append-prompt` | Append text to the prompt | `boolean` | -| `POST` | `/tui/open-help` | Open the help dialog | `boolean` | -| `POST` | `/tui/open-sessions` | Open the session selector | `boolean` | -| `POST` | `/tui/open-themes` | Open the theme selector | `boolean` | -| `POST` | `/tui/open-models` | Open the model selector | `boolean` | -| `POST` | `/tui/submit-prompt` | Submit the current prompt | `boolean` | -| `POST` | `/tui/clear-prompt` | Clear the prompt | `boolean` | -| `POST` | `/tui/execute-command` | Execute a command (`{ command }`) | `boolean` | -| `POST` | `/tui/show-toast` | Show toast (`{ title?, message, variant }`) | `boolean` | -| `GET` | `/tui/control/next` | Wait for the next control request | Control request object | -| `POST` | `/tui/control/response` | Respond to a control request (`{ body }`) | `boolean` | - ---- - -### Auth - -| Method | Path | Description | Response | -| ------ | ----------- | --------------------------------------------------------------- | --------- | -| `PUT` | `/auth/:id` | Set authentication credentials. Body must match provider schema | `boolean` | - ---- - -### Events - -| Method | Path | Description | Response | -| ------ | -------- | ----------------------------------------------------------------------------- | ------------------------- | -| `GET` | `/event` | Server-sent events stream. First event is `server.connected`, then bus events | Server-sent events stream | - ---- - -### Docs - -| Method | Path | Description | Response | -| ------ | ------ | ------------------------- | --------------------------- | -| `GET` | `/doc` | OpenAPI 3.1 specification | HTML page with OpenAPI spec | diff --git a/packages/web/src/content/docs/share.mdx b/packages/web/src/content/docs/share.mdx deleted file mode 100644 index 09ddc4377f..0000000000 --- a/packages/web/src/content/docs/share.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Share -description: Share your CoDev Code conversations. ---- - -CoDev Code's share feature allows you to create public links to your CoDev Code conversations, so you can collaborate with teammates or get help from others. - -:::note -Shared conversations are publicly accessible to anyone with the link. -::: - ---- - -## How it works - -When you share a conversation, CoDev Code: - -1. Creates a unique public URL for your session -2. Syncs your conversation history to our servers -3. Makes the conversation accessible via the shareable link — `opncd.ai/s/` - ---- - -## Sharing - -CoDev Code supports three sharing modes that control how conversations are shared: - ---- - -### Manual (default) - -By default, CoDev Code uses manual sharing mode. Sessions are not shared automatically, but you can manually share them using the `/share` command: - -``` -/share -``` - -This will generate a unique URL that'll be copied to your clipboard. - -To explicitly set manual mode in your [config file](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "manual" -} -``` - ---- - -### Auto-share - -You can enable automatic sharing for all new conversations by setting the `share` option to `"auto"` in your [config file](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "auto" -} -``` - -With auto-share enabled, every new conversation will automatically be shared and a link will be generated. - ---- - -### Disabled - -You can disable sharing entirely by setting the `share` option to `"disabled"` in your [config file](/docs/config): - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "share": "disabled" -} -``` - -To enforce this across your team for a given project, add it to the `codev.json` in your project and check into Git. - ---- - -## Un-sharing - -To stop sharing a conversation and remove it from public access: - -``` -/unshare -``` - -This will remove the share link and delete the data related to the conversation. - ---- - -## Privacy - -There are a few things to keep in mind when sharing a conversation. - ---- - -### Data retention - -Shared conversations remain accessible until you explicitly unshare them. This -includes: - -- Full conversation history -- All messages and responses -- Session metadata - ---- - -### Recommendations - -- Only share conversations that don't contain sensitive information. -- Review conversation content before sharing. -- Unshare conversations when collaboration is complete. -- Avoid sharing conversations with proprietary code or confidential data. -- For sensitive projects, disable sharing entirely. - ---- - -## For enterprises - -For enterprise deployments, the share feature can be: - -- **Disabled** entirely for security compliance -- **Restricted** to users authenticated through SSO only -- **Self-hosted** on your own infrastructure - -[Learn more](/docs/enterprise) about using CoDev Code in your organization. diff --git a/packages/web/src/content/docs/skills.mdx b/packages/web/src/content/docs/skills.mdx deleted file mode 100644 index 701ef0892c..0000000000 --- a/packages/web/src/content/docs/skills.mdx +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: "Agent Skills" -description: "Define reusable behavior via SKILL.md definitions" ---- - -Agent skills let CoDev Code discover reusable instructions from your repo or home directory. -Skills are loaded on-demand via the native `skill` tool—agents see available skills and can load the full content when needed. - ---- - -## Place files - -Create one folder per skill name and put a `SKILL.md` inside it. -CoDev Code searches these locations: - -- Project config: `.codev/skills//SKILL.md` -- Global config: `~/.config/codev/skills//SKILL.md` -- Project Claude-compatible: `.claude/skills//SKILL.md` -- Global Claude-compatible: `~/.claude/skills//SKILL.md` -- Project agent-compatible: `.agents/skills//SKILL.md` -- Global agent-compatible: `~/.agents/skills//SKILL.md` - ---- - -## Understand discovery - -For project-local paths, CoDev Code walks up from your current working directory until it reaches the git worktree. -It loads any matching `skills/*/SKILL.md` in `.codev/` and any matching `.claude/skills/*/SKILL.md` or `.agents/skills/*/SKILL.md` along the way. - -Global definitions are also loaded from `~/.config/codev/skills/*/SKILL.md`, `~/.claude/skills/*/SKILL.md`, and `~/.agents/skills/*/SKILL.md`. - ---- - -## Write frontmatter - -Each `SKILL.md` must start with YAML frontmatter. -Only these fields are recognized: - -- `name` (required) -- `description` (required) -- `license` (optional) -- `compatibility` (optional) -- `metadata` (optional, string-to-string map) - -Unknown frontmatter fields are ignored. - ---- - -## Validate names - -`name` must: - -- Be 1–64 characters -- Be lowercase alphanumeric with single hyphen separators -- Not start or end with `-` -- Not contain consecutive `--` -- Match the directory name that contains `SKILL.md` - -Equivalent regex: - -```text -^[a-z0-9]+(-[a-z0-9]+)*$ -``` - ---- - -## Follow length rules - -`description` must be 1-1024 characters. -Keep it specific enough for the agent to choose correctly. - ---- - -## Use an example - -Create `.codev/skills/git-release/SKILL.md` like this: - -```markdown ---- -name: git-release -description: Create consistent releases and changelogs -license: MIT -compatibility: opencode -metadata: - audience: maintainers - workflow: github ---- - -## What I do - -- Draft release notes from merged PRs -- Propose a version bump -- Provide a copy-pasteable `gh release create` command - -## When to use me - -Use this when you are preparing a tagged release. -Ask clarifying questions if the target versioning scheme is unclear. -``` - ---- - -## Recognize tool description - -CoDev Code lists available skills in the `skill` tool description. -Each entry includes the skill name and description: - -```xml - - - git-release - Create consistent releases and changelogs - - -``` - -The agent loads a skill by calling the tool: - -``` -skill({ name: "git-release" }) -``` - ---- - -## Configure permissions - -Control which skills agents can access using pattern-based permissions in `codev.json`: - -```json -{ - "permission": { - "skill": { - "*": "allow", - "pr-review": "allow", - "internal-*": "deny", - "experimental-*": "ask" - } - } -} -``` - -| Permission | Behavior | -| ---------- | ----------------------------------------- | -| `allow` | Skill loads immediately | -| `deny` | Skill hidden from agent, access rejected | -| `ask` | User prompted for approval before loading | - -Patterns support wildcards: `internal-*` matches `internal-docs`, `internal-tools`, etc. - ---- - -## Override per agent - -Give specific agents different permissions than the global defaults. - -**For custom agents** (in agent frontmatter): - -```yaml ---- -permission: - skill: - "documents-*": "allow" ---- -``` - -**For built-in agents** (in `codev.json`): - -```json -{ - "agent": { - "plan": { - "permission": { - "skill": { - "internal-*": "allow" - } - } - } - } -} -``` - ---- - -## Disable the skill tool - -Completely disable skills for agents that shouldn't use them: - -**For custom agents**: - -```yaml ---- -tools: - skill: false ---- -``` - -**For built-in agents**: - -```json -{ - "agent": { - "plan": { - "tools": { - "skill": false - } - } - } -} -``` - -When disabled, the `` section is omitted entirely. - ---- - -## Troubleshoot loading - -If a skill does not show up: - -1. Verify `SKILL.md` is spelled in all caps -2. Check that frontmatter includes `name` and `description` -3. Ensure skill names are unique across all locations -4. Check permissions—skills with `deny` are hidden from agents diff --git a/packages/web/src/content/docs/themes.mdx b/packages/web/src/content/docs/themes.mdx deleted file mode 100644 index 8db72b59fb..0000000000 --- a/packages/web/src/content/docs/themes.mdx +++ /dev/null @@ -1,369 +0,0 @@ ---- -title: Themes -description: Select a built-in theme or define your own. ---- - -With CoDev Code you can select from one of several built-in themes, use a theme that adapts to your terminal theme, or define your own custom theme. - -By default, CoDev Code uses our own `opencode` theme. - ---- - -## Terminal requirements - -For themes to display correctly with their full color palette, your terminal must support **truecolor** (24-bit color). Most modern terminals support this by default, but you may need to enable it: - -- **Check support**: Run `echo $COLORTERM` - it should output `truecolor` or `24bit` -- **Enable truecolor**: Set the environment variable `COLORTERM=truecolor` in your shell profile -- **Terminal compatibility**: Ensure your terminal emulator supports 24-bit color (most modern terminals like iTerm2, Alacritty, Kitty, Windows Terminal, and recent versions of GNOME Terminal do) - -Without truecolor support, themes may appear with reduced color accuracy or fall back to the nearest 256-color approximation. - ---- - -## Built-in themes - -CoDev Code comes with several built-in themes. - -| Name | Description | -| ---------------------- | ---------------------------------------------------------------------------- | -| `system` | Adapts to your terminal’s background color | -| `tokyonight` | Based on the [Tokyonight](https://github.com/folke/tokyonight.nvim) theme | -| `everforest` | Based on the [Everforest](https://github.com/sainnhe/everforest) theme | -| `ayu` | Based on the [Ayu](https://github.com/ayu-theme) dark theme | -| `catppuccin` | Based on the [Catppuccin](https://github.com/catppuccin) theme | -| `catppuccin-macchiato` | Based on the [Catppuccin](https://github.com/catppuccin) theme | -| `gruvbox` | Based on the [Gruvbox](https://github.com/morhetz/gruvbox) theme | -| `kanagawa` | Based on the [Kanagawa](https://github.com/rebelot/kanagawa.nvim) theme | -| `nord` | Based on the [Nord](https://github.com/nordtheme/nord) theme | -| `matrix` | Hacker-style green on black theme | -| `one-dark` | Based on the [Atom One](https://github.com/Th3Whit3Wolf/one-nvim) Dark theme | - -And more, we are constantly adding new themes. - ---- - -## System theme - -The `system` theme is designed to automatically adapt to your terminal's color scheme. Unlike traditional themes that use fixed colors, the _system_ theme: - -- **Generates gray scale**: Creates a custom gray scale based on your terminal's background color, ensuring optimal contrast. -- **Uses ANSI colors**: Leverages standard ANSI colors (0-15) for syntax highlighting and UI elements, which respect your terminal's color palette. -- **Preserves terminal defaults**: Uses `none` for text and background colors to maintain your terminal's native appearance. - -The system theme is for users who: - -- Want CoDev Code to match their terminal's appearance -- Use custom terminal color schemes -- Prefer a consistent look across all terminal applications - ---- - -## Using a theme - -You can select a theme by bringing up the theme select with the `/theme` command. Or you can specify it in `tui.json`. - -```json title="tui.json" {3} -{ - "$schema": "https://opencode.ai/tui.json", - "theme": "tokyonight" -} -``` - ---- - -## Custom themes - -CoDev Code supports a flexible JSON-based theme system that allows users to create and customize themes easily. - ---- - -### Hierarchy - -Themes are loaded from multiple directories in the following order where later directories override earlier ones: - -1. **Built-in themes** - These are embedded in the binary -2. **User config directory** - Defined in `~/.config/codev/themes/*.json` or `$XDG_CONFIG_HOME/codev/themes/*.json` -3. **Project root directory** - Defined in the `/.codev/themes/*.json` -4. **Current working directory** - Defined in `./.codev/themes/*.json` - -If multiple directories contain a theme with the same name, the theme from the directory with higher priority will be used. - ---- - -### Creating a theme - -To create a custom theme, create a JSON file in one of the theme directories. - -For user-wide themes: - -```bash no-frame -mkdir -p ~/.config/codev/themes -vim ~/.config/codev/themes/my-theme.json -``` - -And for project-specific themes. - -```bash no-frame -mkdir -p .codev/themes -vim .codev/themes/my-theme.json -``` - ---- - -### JSON format - -Themes use a flexible JSON format with support for: - -- **Hex colors**: `"#ffffff"` -- **ANSI colors**: `3` (0-255) -- **Color references**: `"primary"` or custom definitions -- **Dark/light variants**: `{"dark": "#000", "light": "#fff"}` -- **No color**: `"none"` - Uses the terminal's default color or transparent - ---- - -### Color definitions - -The `defs` section is optional and it allows you to define reusable colors that can be referenced in the theme. - ---- - -### Terminal defaults - -The special value `"none"` can be used for any color to inherit the terminal's default color. This is particularly useful for creating themes that blend seamlessly with your terminal's color scheme: - -- `"text": "none"` - Uses terminal's default foreground color -- `"background": "none"` - Uses terminal's default background color - ---- - -### Example - -Here's an example of a custom theme: - -```json title="my-theme.json" -{ - "$schema": "https://opencode.ai/theme.json", - "defs": { - "nord0": "#2E3440", - "nord1": "#3B4252", - "nord2": "#434C5E", - "nord3": "#4C566A", - "nord4": "#D8DEE9", - "nord5": "#E5E9F0", - "nord6": "#ECEFF4", - "nord7": "#8FBCBB", - "nord8": "#88C0D0", - "nord9": "#81A1C1", - "nord10": "#5E81AC", - "nord11": "#BF616A", - "nord12": "#D08770", - "nord13": "#EBCB8B", - "nord14": "#A3BE8C", - "nord15": "#B48EAD" - }, - "theme": { - "primary": { - "dark": "nord8", - "light": "nord10" - }, - "secondary": { - "dark": "nord9", - "light": "nord9" - }, - "accent": { - "dark": "nord7", - "light": "nord7" - }, - "error": { - "dark": "nord11", - "light": "nord11" - }, - "warning": { - "dark": "nord12", - "light": "nord12" - }, - "success": { - "dark": "nord14", - "light": "nord14" - }, - "info": { - "dark": "nord8", - "light": "nord10" - }, - "text": { - "dark": "nord4", - "light": "nord0" - }, - "textMuted": { - "dark": "nord3", - "light": "nord1" - }, - "background": { - "dark": "nord0", - "light": "nord6" - }, - "backgroundPanel": { - "dark": "nord1", - "light": "nord5" - }, - "backgroundElement": { - "dark": "nord1", - "light": "nord4" - }, - "border": { - "dark": "nord2", - "light": "nord3" - }, - "borderActive": { - "dark": "nord3", - "light": "nord2" - }, - "borderSubtle": { - "dark": "nord2", - "light": "nord3" - }, - "diffAdded": { - "dark": "nord14", - "light": "nord14" - }, - "diffRemoved": { - "dark": "nord11", - "light": "nord11" - }, - "diffContext": { - "dark": "nord3", - "light": "nord3" - }, - "diffHunkHeader": { - "dark": "nord3", - "light": "nord3" - }, - "diffHighlightAdded": { - "dark": "nord14", - "light": "nord14" - }, - "diffHighlightRemoved": { - "dark": "nord11", - "light": "nord11" - }, - "diffAddedBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffRemovedBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffContextBg": { - "dark": "nord1", - "light": "nord5" - }, - "diffLineNumber": { - "dark": "nord2", - "light": "nord4" - }, - "diffAddedLineNumberBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "diffRemovedLineNumberBg": { - "dark": "#3B4252", - "light": "#E5E9F0" - }, - "markdownText": { - "dark": "nord4", - "light": "nord0" - }, - "markdownHeading": { - "dark": "nord8", - "light": "nord10" - }, - "markdownLink": { - "dark": "nord9", - "light": "nord9" - }, - "markdownLinkText": { - "dark": "nord7", - "light": "nord7" - }, - "markdownCode": { - "dark": "nord14", - "light": "nord14" - }, - "markdownBlockQuote": { - "dark": "nord3", - "light": "nord3" - }, - "markdownEmph": { - "dark": "nord12", - "light": "nord12" - }, - "markdownStrong": { - "dark": "nord13", - "light": "nord13" - }, - "markdownHorizontalRule": { - "dark": "nord3", - "light": "nord3" - }, - "markdownListItem": { - "dark": "nord8", - "light": "nord10" - }, - "markdownListEnumeration": { - "dark": "nord7", - "light": "nord7" - }, - "markdownImage": { - "dark": "nord9", - "light": "nord9" - }, - "markdownImageText": { - "dark": "nord7", - "light": "nord7" - }, - "markdownCodeBlock": { - "dark": "nord4", - "light": "nord0" - }, - "syntaxComment": { - "dark": "nord3", - "light": "nord3" - }, - "syntaxKeyword": { - "dark": "nord9", - "light": "nord9" - }, - "syntaxFunction": { - "dark": "nord8", - "light": "nord8" - }, - "syntaxVariable": { - "dark": "nord7", - "light": "nord7" - }, - "syntaxString": { - "dark": "nord14", - "light": "nord14" - }, - "syntaxNumber": { - "dark": "nord15", - "light": "nord15" - }, - "syntaxType": { - "dark": "nord7", - "light": "nord7" - }, - "syntaxOperator": { - "dark": "nord9", - "light": "nord9" - }, - "syntaxPunctuation": { - "dark": "nord4", - "light": "nord0" - } - } -} -``` diff --git a/packages/web/src/content/docs/tools.mdx b/packages/web/src/content/docs/tools.mdx deleted file mode 100644 index fd2fc1e4f3..0000000000 --- a/packages/web/src/content/docs/tools.mdx +++ /dev/null @@ -1,345 +0,0 @@ ---- -title: Tools -description: Manage the tools an LLM can use. ---- - -Tools allow the LLM to perform actions in your codebase. CoDev Code comes with a set of built-in tools, but you can extend it with [custom tools](/docs/custom-tools) or [MCP servers](/docs/mcp-servers). - -By default, all tools are **enabled** and don't need permission to run. You can control tool behavior through [permissions](/docs/permissions). - ---- - -## Configure - -Use the `permission` field to control tool behavior. You can allow, deny, or require approval for each tool. - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "deny", - "bash": "ask", - "webfetch": "allow" - } -} -``` - -You can also use wildcards to control multiple tools at once. For example, to require approval for all tools from an MCP server: - -```json title="codev.json" -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "mymcp_*": "ask" - } -} -``` - -[Learn more](/docs/permissions) about configuring permissions. - ---- - -## Built-in - -Here are all the built-in tools available in CoDev Code. - ---- - -### bash - -Execute shell commands in your project environment. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "bash": "allow" - } -} -``` - -This tool allows the LLM to run terminal commands like `npm install`, `git status`, or any other shell command. - ---- - -### edit - -Modify existing files using exact string replacements. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -This tool performs precise edits to files by replacing exact text matches. It's the primary way the LLM modifies code. - ---- - -### write - -Create new files or overwrite existing ones. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -Use this to allow the LLM to create new files. It will overwrite existing files if they already exist. - -:::note -The `write` tool is controlled by the `edit` permission, which covers all file modifications (`edit`, `write`, `apply_patch`). -::: - ---- - -### read - -Read file contents from your codebase. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "read": "allow" - } -} -``` - -This tool reads files and returns their contents. It supports reading specific line ranges for large files. - ---- - -### grep - -Search file contents using regular expressions. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "grep": "allow" - } -} -``` - -Fast content search across your codebase. Supports full regex syntax and file pattern filtering. - ---- - -### glob - -Find files by pattern matching. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "glob": "allow" - } -} -``` - -Search for files using glob patterns like `**/*.js` or `src/**/*.ts`. Returns matching file paths sorted by modification time. - ---- - -### lsp (experimental) - -Interact with your configured LSP servers to get code intelligence features like definitions, references, hover info, and call hierarchy. - -:::note -This tool is only available when `CODEV_EXPERIMENTAL_LSP_TOOL=true` (or `CODEV_EXPERIMENTAL=true`). -::: - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "lsp": "allow" - } -} -``` - -Supported operations include `goToDefinition`, `findReferences`, `hover`, `documentSymbol`, `workspaceSymbol`, `goToImplementation`, `prepareCallHierarchy`, `incomingCalls`, and `outgoingCalls`. - -To configure which LSP servers are available for your project, see [LSP Servers](/docs/lsp). - ---- - -### apply_patch - -Apply patches to files. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "edit": "allow" - } -} -``` - -This tool applies patch files to your codebase. Useful for applying diffs and patches from various sources. - -When handling `tool.execute.before` or `tool.execute.after` hooks, check `input.tool === "apply_patch"` (not `"patch"`). - -`apply_patch` uses `output.args.patchText` instead of `output.args.filePath`. Paths are embedded in marker lines within `patchText` and are relative to the project root (for example: `*** Add File: src/new-file.ts`, `*** Update File: src/existing.ts`, `*** Move to: src/renamed.ts`, `*** Delete File: src/obsolete.ts`). - -:::note -The `apply_patch` tool is controlled by the `edit` permission, which covers all file modifications (`edit`, `write`, `apply_patch`). -::: - ---- - -### skill - -Load a [skill](/docs/skills) (a `SKILL.md` file) and return its content in the conversation. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "skill": "allow" - } -} -``` - ---- - -### todowrite - -Manage todo lists during coding sessions. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "todowrite": "allow" - } -} -``` - -Creates and updates task lists to track progress during complex operations. The LLM uses this to organize multi-step tasks. - -:::note -This tool is disabled for subagents by default, but you can enable it manually. [Learn more](/docs/agents/#permissions) -::: - ---- - -### webfetch - -Fetch web content. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "webfetch": "allow" - } -} -``` - -Allows the LLM to fetch and read web pages. Useful for looking up documentation or researching online resources. - ---- - -### websearch - -Search the web for information. - -:::note -This tool is only available when using the OpenCode provider or when the `CODEV_ENABLE_EXA` environment variable is set to any truthy value (e.g., `true` or `1`). - -To enable when launching CoDev Code: - -```bash -CODEV_ENABLE_EXA=1 codev -``` - -::: - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "websearch": "allow" - } -} -``` - -Performs web searches using Exa AI to find relevant information online. Useful for researching topics, finding current events, or gathering information beyond the training data cutoff. - -No API key is required — the tool connects directly to Exa AI's hosted MCP service without authentication. - -:::tip -Use `websearch` when you need to find information (discovery), and `webfetch` when you need to retrieve content from a specific URL (retrieval). -::: - ---- - -### question - -Ask the user questions during execution. - -```json title="codev.json" {4} -{ - "$schema": "https://opencode.ai/config.json", - "permission": { - "question": "allow" - } -} -``` - -This tool allows the LLM to ask the user questions during a task. It's useful for: - -- Gathering user preferences or requirements -- Clarifying ambiguous instructions -- Getting decisions on implementation choices -- Offering choices about what direction to take - -Each question includes a header, the question text, and a list of options. Users can select from the provided options or type a custom answer. When there are multiple questions, users can navigate between them before submitting all answers. - ---- - -## Custom tools - -Custom tools let you define your own functions that the LLM can call. These are defined in your config file and can execute arbitrary code. - -[Learn more](/docs/custom-tools) about creating custom tools. - ---- - -## MCP servers - -MCP (Model Context Protocol) servers allow you to integrate external tools and services. This includes database access, API integrations, and third-party services. - -[Learn more](/docs/mcp-servers) about configuring MCP servers. - ---- - -## Internals - -Internally, tools like `grep` and `glob` use [ripgrep](https://github.com/BurntSushi/ripgrep) under the hood. By default, ripgrep respects `.gitignore` patterns, which means files and directories listed in your `.gitignore` will be excluded from searches and listings. - ---- - -### Ignore patterns - -To include files that would normally be ignored, create a `.ignore` file in your project root. This file can explicitly allow certain paths. - -```text title=".ignore" -!node_modules/ -!dist/ -!build/ -``` - -For example, this `.ignore` file allows ripgrep to search within `node_modules/`, `dist/`, and `build/` directories even if they're listed in `.gitignore`. diff --git a/packages/web/src/content/docs/troubleshooting.mdx b/packages/web/src/content/docs/troubleshooting.mdx deleted file mode 100644 index ce83f590ee..0000000000 --- a/packages/web/src/content/docs/troubleshooting.mdx +++ /dev/null @@ -1,314 +0,0 @@ ---- -title: Troubleshooting -description: Common issues and how to resolve them. ---- - -To debug issues with CoDev Code, start by checking the logs and local data it stores on disk. - ---- - -## Logs - -Log files are written to: - -- **macOS/Linux**: `~/.local/share/codev/log/` -- **Windows**: Press `WIN+R` and paste `%USERPROFILE%\.local\share\codev\log` - -Log files are named with timestamps (e.g., `2025-01-09T123456.log`) and the most recent 10 log files are kept. - -You can set the log level with the `--log-level` command-line option to get more detailed debug information. For example, `codev --log-level DEBUG`. - ---- - -## Storage - -CoDev Code stores session data and other application data on disk at: - -- **macOS/Linux**: `~/.local/share/codev/` -- **Windows**: Press `WIN+R` and paste `%USERPROFILE%\.local\share\codev` - -This directory contains: - -- `auth.json` - Authentication data like API keys, OAuth tokens -- `log/` - Application logs -- `project/` - Project-specific data like session and message data - - If the project is within a Git repo, it is stored in `.//storage/` - - If it is not a Git repo, it is stored in `./global/storage/` - ---- - -## Uninstall - -To uninstall the CoDev Code CLI and remove its related files, run: - -```bash -codev uninstall -``` - -The command shows what will be removed and asks for confirmation. See the [CLI reference](/docs/cli#uninstall) for options to keep your configuration or application data. - -To remove CoDev Code Desktop, uninstall the application through your operating system's app management tools. - ---- - -## Desktop app - -CoDev Code Desktop runs a local CoDev Code server (the `opencode-cli` sidecar) in the background. Most issues are caused by a misbehaving plugin, a corrupted cache, or a bad server setting. - -### Quick checks - -- Fully quit and relaunch the app. -- If the app shows an error screen, click **Restart** and copy the error details. -- macOS only: `CoDev Code` menu -> **Reload Webview** (helps if the UI is blank/frozen). - ---- - -### Disable plugins - -If the desktop app is crashing on launch, hanging, or behaving strangely, start by disabling plugins. - -#### Check the global config - -Open your global config file and look for a `plugin` key. - -- **macOS/Linux**: `~/.config/codev/codev.jsonc` (or `~/.config/codev/codev.json`) -- **macOS/Linux** (older installs): `~/.local/share/codev/codev.jsonc` -- **Windows**: Press `WIN+R` and paste `%USERPROFILE%\.config\opencode\codev.jsonc` - -If you have plugins configured, temporarily disable them by removing the key or setting it to an empty array: - -```jsonc -{ - "$schema": "https://opencode.ai/config.json", - "plugin": [], -} -``` - -#### Check plugin directories - -CoDev Code can also load local plugins from disk. Temporarily move these out of the way (or rename the folder) and restart the desktop app: - -- **Global plugins** - - **macOS/Linux**: `~/.config/codev/plugins/` - - **Windows**: Press `WIN+R` and paste `%USERPROFILE%\.config\opencode\plugins` -- **Project plugins** (only if you use per-project config) - - `/.codev/plugins/` - -If the app starts working again, re-enable plugins one at a time to find which one is causing the issue. - ---- - -### Clear the cache - -If disabling plugins doesn't help (or a plugin install is stuck), clear the cache so CoDev Code can rebuild it. - -1. Quit CoDev Code Desktop completely. -2. Delete the cache directory: - -- **macOS**: Finder -> `Cmd+Shift+G` -> paste `~/.cache/codev` -- **Linux**: delete `~/.cache/codev` (or run `rm -rf ~/.cache/codev`) -- **Windows**: Press `WIN+R` and paste `%USERPROFILE%\.cache\codev` - -3. Restart CoDev Code Desktop. - ---- - -### Fix server connection issues - -CoDev Code Desktop can either start its own local server (default) or connect to a server URL you configured. - -If you see a **"Connection Failed"** dialog (or the app never gets past the splash screen), check for a custom server URL. - -#### Clear the desktop default server URL - -From the Home screen, click the server name (with the status dot) to open the Server picker. In the **Default server** section, click **Clear**. - -#### Remove `server.port` / `server.hostname` from your config - -If your `codev.json(c)` contains a `server` section, temporarily remove it and restart the desktop app. - -#### Check environment variables - -If you have `CODEV_PORT` set in your environment, the desktop app will try to use that port for the local server. - -- Unset `CODEV_PORT` (or pick a free port) and restart. - ---- - -### Linux: Wayland / X11 issues - -On Linux, some Wayland setups can cause blank windows or compositor errors. - -- If you're on Wayland and the app is blank/crashing, try launching with `OC_ALLOW_WAYLAND=1`. -- If that makes things worse, remove it and try launching under an X11 session instead. - ---- - -### Windows: WebView2 runtime - -On Windows, CoDev Code Desktop requires the Microsoft Edge **WebView2 Runtime**. If the app opens to a blank window or won't start, install/update WebView2 and try again. - ---- - -### Windows: General performance issues - -If you're experiencing slow performance, file access issues, or terminal problems on Windows, try using [WSL (Windows Subsystem for Linux)](/docs/windows-wsl). WSL provides a Linux environment that works more seamlessly with CoDev Code's features. - ---- - -### Notifications not showing - -CoDev Code Desktop only shows system notifications when: - -- notifications are enabled for CoDev Code in your OS settings, and -- the app window is not focused. - ---- - -### Reset desktop app storage (last resort) - -If the app won't start and you can't clear settings from inside the UI, reset the desktop app's saved state. - -1. Quit CoDev Code Desktop. -2. Find and delete these files (they live in the CoDev Code Desktop app data directory): - -- `opencode.settings.dat` (desktop default server URL) -- `opencode.global.dat` and `opencode.workspace.*.dat` (UI state like recent servers/projects) - -To find the directory quickly: - -- **macOS**: Finder -> `Cmd+Shift+G` -> `~/Library/Application Support` (then search for the filenames above) -- **Linux**: search under `~/.local/share` for the filenames above -- **Windows**: Press `WIN+R` -> `%APPDATA%` (then search for the filenames above) - ---- - -## Getting help - -If you're experiencing issues with CoDev Code: - -1. **Report issues on GitHub** - - The best way to report bugs or request features is through our GitHub repository: - - [**github.com/quickbeard/codev-code/issues**](https://github.com/quickbeard/codev-code/issues) - - Before creating a new issue, search existing issues to see if your problem has already been reported. - -2. **Join our Discord** - - For real-time help and community discussion, join our Discord server: - - [**opencode.ai/discord**](https://opencode.ai/discord) - ---- - -## Common issues - -Here are some common issues and how to resolve them. - ---- - -### CoDev Code won't start - -1. Check the logs for error messages -2. Try running with `--print-logs` to see output in the terminal -3. Ensure you have the latest version with `codev upgrade` - ---- - -### Authentication issues - -1. Try re-authenticating with the `/connect` command in the TUI -2. Check that your API keys are valid -3. Ensure your network allows connections to the provider's API - ---- - -### Model not available - -1. Check that you've authenticated with the provider -2. Verify the model name in your config is correct -3. Some models may require specific access or subscriptions - -If you encounter `ProviderModelNotFoundError` you are most likely incorrectly -referencing a model somewhere. -Models should be referenced like so: `/` - -Examples: - -- `openai/gpt-4.1` -- `openrouter/google/gemini-2.5-flash` -- `opencode/kimi-k2` - -To figure out what models you have access to, run `codev models` - ---- - -### ProviderInitError - -If you encounter a ProviderInitError, you likely have an invalid or corrupted configuration. - -To resolve this: - -1. First, verify your provider is set up correctly by following the [providers guide](/docs/providers) -2. If the issue persists, try clearing your stored configuration: - - ```bash - rm -rf ~/.local/share/codev - ``` - - On Windows, press `WIN+R` and delete: `%USERPROFILE%\.local\share\codev` - -3. Re-authenticate with your provider using the `/connect` command in the TUI. - ---- - -### AI_APICallError and provider package issues - -If you encounter API call errors, this may be due to outdated provider packages. CoDev Code dynamically installs provider packages (OpenAI, Anthropic, Google, etc.) as needed and caches them locally. - -To resolve provider package issues: - -1. Clear the provider package cache: - - ```bash - rm -rf ~/.cache/codev - ``` - - On Windows, press `WIN+R` and delete: `%USERPROFILE%\.cache\codev` - -2. Restart CoDev Code to reinstall the latest provider packages - -This will force CoDev Code to download the most recent versions of provider packages, which often resolves compatibility issues with model parameters and API changes. - ---- - -### Copy/paste not working on Linux - -Linux users need to have one of the following clipboard utilities installed for copy/paste functionality to work: - -**For X11 systems:** - -```bash -apt install -y xclip -# or -apt install -y xsel -``` - -**For Wayland systems:** - -```bash -apt install -y wl-clipboard -``` - -**For headless environments:** - -```bash -apt install -y xvfb -# and run: -Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & -export DISPLAY=:99.0 -``` - -CoDev Code will detect if you're using Wayland and prefer `wl-clipboard`, otherwise it will try to find clipboard tools in order of: `xclip` and `xsel`. diff --git a/packages/web/src/content/docs/tui.mdx b/packages/web/src/content/docs/tui.mdx deleted file mode 100644 index cca3f60656..0000000000 --- a/packages/web/src/content/docs/tui.mdx +++ /dev/null @@ -1,427 +0,0 @@ ---- -title: TUI -description: Using the CoDev Code terminal user interface. ---- - -import { Tabs, TabItem } from "@astrojs/starlight/components" - -CoDev Code provides an interactive terminal interface or TUI for working on your projects with an LLM. - -Running CoDev Code starts the TUI for the current directory. - -```bash -codev -``` - -Or you can start it for a specific working directory. - -```bash -codev /path/to/project -``` - -Once you're in the TUI, you can prompt it with a message. - -```text -Give me a quick summary of the codebase. -``` - ---- - -## File references - -You can reference files in your messages using `@`. This does a fuzzy file search in the current working directory. - -:::tip -You can also use `@` to reference files in your messages. -::: - -```text "@packages/functions/src/api/index.ts" -How is auth handled in @packages/functions/src/api/index.ts? -``` - -The content of the file is added to the conversation automatically. - -Configured [references](/docs/references) also appear in `@` autocomplete. Type `@alias` to add the reference root as context, or type `@alias/` to autocomplete files inside that reference. - -```text "@docs/README.md" -Compare our setup with @docs/README.md -``` - ---- - -## Bash commands - -Start a message with `!` to run a shell command. - -```bash frame="none" -!ls -la -``` - -The output of the command is added to the conversation as a tool result. - ---- - -## Commands - -When using the CoDev Code TUI, you can type `/` followed by a command name to quickly execute actions. For example: - -```bash frame="none" -/help -``` - -Most commands also have keyboard shortcuts using `ctrl+x` as the default leader key. [Learn more](/docs/keybinds). - -Here are all available slash commands: - ---- - -### connect - -Add a provider to CoDev Code. Allows you to select from available providers and add their API keys. - -```bash frame="none" -/connect -``` - ---- - -### compact - -Compact the current session. _Alias_: `/summarize` - -```bash frame="none" -/compact -``` - -**Keybind:** `ctrl+x c` - ---- - -### details - -Toggle tool execution details. - -```bash frame="none" -/details -``` - ---- - -### editor - -Open external editor for composing messages. Uses the editor set in your `EDITOR` environment variable. [Learn more](#editor-setup). - -```bash frame="none" -/editor -``` - -**Keybind:** `ctrl+x e` - ---- - -### exit - -Exit CoDev Code. _Aliases_: `/quit`, `/q` - -```bash frame="none" -/exit -``` - -**Keybind:** `ctrl+x q` - ---- - -### export - -Export current conversation to Markdown and open in your default editor. Uses the editor set in your `EDITOR` environment variable. [Learn more](#editor-setup). - -```bash frame="none" -/export -``` - -**Keybind:** `ctrl+x x` - ---- - -### help - -Show the help dialog. - -```bash frame="none" -/help -``` - ---- - -### init - -Guided setup for creating or updating `AGENTS.md`. [Learn more](/docs/rules). - -```bash frame="none" -/init -``` - ---- - -### models - -List available models. - -```bash frame="none" -/models -``` - -**Keybind:** `ctrl+x m` - ---- - -### new - -Start a new session. _Alias_: `/clear` - -```bash frame="none" -/new -``` - -**Keybind:** `ctrl+x n` - ---- - -### redo - -Redo a previously undone message. Only available after using `/undo`. - -:::tip -Any file changes will also be restored. -::: - -Internally, this uses Git to manage the file changes. So your project **needs to -be a Git repository**. - -```bash frame="none" -/redo -``` - -**Keybind:** `ctrl+x r` - ---- - -### sessions - -List and switch between sessions. _Aliases_: `/resume`, `/continue` - -```bash frame="none" -/sessions -``` - -**Keybind:** `ctrl+x l` - ---- - -### share - -Share current session. [Learn more](/docs/share). - -```bash frame="none" -/share -``` - ---- - -### themes - -List available themes. - -```bash frame="none" -/themes -``` - -**Keybind:** `ctrl+x t` - ---- - -### thinking - -Toggle the visibility of thinking/reasoning blocks in the conversation. When enabled, you can see the model's reasoning process for models that support extended thinking. - -:::note -This command only controls whether thinking blocks are **displayed** - it does not enable or disable the model's reasoning capabilities. To toggle actual reasoning capabilities, use `ctrl+t` to cycle through model variants. -::: - -```bash frame="none" -/thinking -``` - ---- - -### undo - -Undo last message in the conversation. Removes the most recent user message, all subsequent responses, and any file changes. - -:::tip -Any file changes made will also be reverted. -::: - -Internally, this uses Git to manage the file changes. So your project **needs to -be a Git repository**. - -```bash frame="none" -/undo -``` - -**Keybind:** `ctrl+x u` - ---- - -### unshare - -Unshare current session. [Learn more](/docs/share#un-sharing). - -```bash frame="none" -/unshare -``` - ---- - -## Editor setup - -Both the `/editor` and `/export` commands use the editor specified in your `EDITOR` environment variable. - - - - ```bash - # Example for nano or vim - export EDITOR=nano - export EDITOR=vim - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - export EDITOR="code --wait" - ``` - - To make it permanent, add this to your shell profile; - `~/.bashrc`, `~/.zshrc`, etc. - - - - - ```bash - set EDITOR=notepad - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - set EDITOR=code --wait - ``` - - To make it permanent, use **System Properties** > **Environment - Variables**. - - - - - ```powershell - $env:EDITOR = "notepad" - - # For GUI editors, VS Code, Cursor, VSCodium, Windsurf, Zed, etc. - # include --wait - $env:EDITOR = "code --wait" - ``` - - To make it permanent, add this to your PowerShell profile. - - - - -Popular editor options include: - -- `code` - Visual Studio Code -- `cursor` - Cursor -- `windsurf` - Windsurf -- `nvim` - Neovim editor -- `vim` - Vim editor -- `nano` - Nano editor -- `notepad` - Windows Notepad -- `subl` - Sublime Text - -:::note -Some editors like VS Code need to be started with the `--wait` flag. -::: - -Some editors need command-line arguments to run in blocking mode. The `--wait` flag makes the editor process block until closed. - ---- - -## Configure - -You can customize TUI behavior through `tui.json` (or `tui.jsonc`). - -```json title="tui.json" -{ - "$schema": "https://opencode.ai/tui.json", - "theme": "opencode", - "leader_timeout": 2000, - "keybinds": { - "leader": "ctrl+x", - "command_list": "ctrl+p" - }, - "scroll_speed": 3, - "scroll_acceleration": { - "enabled": false - }, - "diff_style": "auto", - "mouse": true, - "attention": { - "enabled": true, - "notifications": true, - "sound": true, - "volume": 0.4, - "sound_pack": "opencode.default", - "sounds": { - "error": "./sounds/error.mp3" - } - } -} -``` - -This is separate from `codev.json`, which configures server/runtime behavior. - -`keybinds` is merged with built-in defaults, so you only need to configure the shortcuts you want to change. - -### Options - -- `theme` - Sets your UI theme. [Learn more](/docs/themes). -- `keybinds` - Customizes keyboard shortcuts. [Learn more](/docs/keybinds). -- `leader_timeout` - Controls how long CoDev Code waits after the leader key. Defaults to `2000`. -- `scroll_acceleration.enabled` - Enable macOS-style scroll acceleration for smooth, natural scrolling. When enabled, scroll speed increases with rapid scrolling gestures and stays precise for slower movements. **This setting takes precedence over `scroll_speed` and overrides it when enabled.** -- `scroll_speed` - Controls how fast the TUI scrolls when using scroll commands (minimum: `0.001`, supports decimal values). Defaults to `3`. **Note: This is ignored if `scroll_acceleration.enabled` is set to `true`.** -- `diff_style` - Controls diff rendering. `"auto"` adapts to terminal width, `"stacked"` always shows a single-column layout. -- `mouse` - Enable or disable mouse capture in the TUI (default: `true`). When disabled, the terminal's native mouse selection/scrolling behavior is preserved. -- `attention` - Configures TUI desktop notifications and sounds. Disabled by default. - -Use `CODEV_TUI_CONFIG` to load a custom TUI config path. - -### Attention - -The TUI can request attention for questions, permissions, session errors, and completed sessions. Enable it with `attention.enabled`; built-in events play sounds when triggered, and non-subagent events request desktop notifications only when the terminal is blurred. - -- `enabled` - Enable all attention notifications and sounds. Defaults to `false`. -- `notifications` - Allow terminal-mediated desktop notifications when attention is enabled. Defaults to `true`. -- `sound` - Allow attention sounds when attention is enabled. Defaults to `true`. -- `volume` - Default sound volume from `0` to `1`. Defaults to `0.4`. -- `sound_pack` - Sound pack ID to use. Defaults to `opencode.default`. -- `sounds` - Override sound files for `default`, `question`, `permission`, `error`, `done`, or `subagent_done`. Paths can be absolute, `file://` URLs, or relative to `tui.json`. - ---- - -## Customization - -You can customize various aspects of the TUI view using the command palette (`ctrl+p`). These settings persist across restarts. - ---- - -#### Username display - -Toggle whether your username appears in chat messages. Access this through: - -- Command palette: Search for "username" or "hide username" -- The setting persists automatically and will be remembered across TUI sessions diff --git a/packages/web/src/content/docs/web.mdx b/packages/web/src/content/docs/web.mdx deleted file mode 100644 index 42e7f53282..0000000000 --- a/packages/web/src/content/docs/web.mdx +++ /dev/null @@ -1,142 +0,0 @@ ---- -title: Web -description: Using CoDev Code in your browser. ---- - -CoDev Code can run as a web application in your browser, providing the same powerful AI coding experience without needing a terminal. - -![CoDev Code Web - New Session](../../assets/web/web-homepage-new-session.png) - -## Getting Started - -Start the web interface by running: - -```bash -codev web -``` - -This starts a local server on `127.0.0.1` with a random available port and automatically opens CoDev Code in your default browser. - -:::caution -If `CODEV_SERVER_PASSWORD` is not set, the server will be unsecured. This is fine for local use but should be set for network access. -::: - -:::tip[Windows Users] -For the best experience, run `codev web` from [WSL](/docs/windows-wsl) rather than PowerShell. This ensures proper file system access and terminal integration. -::: - ---- - -## Configuration - -You can configure the web server using command line flags or in your [config file](/docs/config). - -### Port - -By default, CoDev Code picks an available port. You can specify a port: - -```bash -codev web --port 4096 -``` - -### Hostname - -By default, the server binds to `127.0.0.1` (localhost only). To make CoDev Code accessible on your network: - -```bash -codev web --hostname 0.0.0.0 -``` - -When using `0.0.0.0`, CoDev Code will display both local and network addresses: - -``` - Local access: http://localhost:4096 - Network access: http://192.168.1.100:4096 -``` - -### mDNS Discovery - -Enable mDNS to make your server discoverable on the local network: - -```bash -codev web --mdns -``` - -This automatically sets the hostname to `0.0.0.0` and advertises the server as `opencode.local`. - -You can customize the mDNS domain name to run multiple instances on the same network: - -```bash -codev web --mdns --mdns-domain myproject.local -``` - -### CORS - -To allow additional domains for CORS (useful for custom frontends): - -```bash -codev web --cors https://example.com -``` - -### Authentication - -To protect access, set a password using the `CODEV_SERVER_PASSWORD` environment variable: - -```bash -CODEV_SERVER_PASSWORD=secret codev web -``` - -The username defaults to `opencode` but can be changed with `CODEV_SERVER_USERNAME`. - ---- - -## Using the Web Interface - -Once started, the web interface provides access to your CoDev Code sessions. - -### Sessions - -View and manage your sessions from the homepage. You can see active sessions and start new ones. - -![CoDev Code Web - Active Session](../../assets/web/web-homepage-active-session.png) - -### Server Status - -Click "See Servers" to view connected servers and their status. - -![CoDev Code Web - See Servers](../../assets/web/web-homepage-see-servers.png) - ---- - -## Attaching a Terminal - -You can attach a terminal TUI to a running web server: - -```bash -# Start the web server -codev web --port 4096 - -# In another terminal, attach the TUI -codev attach http://localhost:4096 -``` - -This allows you to use both the web interface and terminal simultaneously, sharing the same sessions and state. - ---- - -## Config File - -You can also configure server settings in your `codev.json` config file: - -```json -{ - "server": { - "port": 4096, - "hostname": "0.0.0.0", - "mdns": true, - "cors": ["https://example.com"] - } -} -``` - -Command line flags take precedence over config file settings. diff --git a/packages/web/src/content/docs/windows-wsl.mdx b/packages/web/src/content/docs/windows-wsl.mdx deleted file mode 100644 index d1db4c18d4..0000000000 --- a/packages/web/src/content/docs/windows-wsl.mdx +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: Windows (WSL) -description: Run CoDev Code on Windows using WSL for the best experience. ---- - -import { Steps } from "@astrojs/starlight/components" - -While CoDev Code can run directly on Windows, we recommend using [Windows Subsystem for Linux (WSL)](https://learn.microsoft.com/en-us/windows/wsl/install) for the best experience. WSL provides a Linux environment that works seamlessly with CoDev Code's features. - -:::tip[Why WSL?] -WSL offers better file system performance, full terminal support, and compatibility with development tools that CoDev Code relies on. -::: - ---- - -## Setup - - - -1. **Install WSL** - - If you haven't already, [install WSL](https://learn.microsoft.com/en-us/windows/wsl/install) using the official Microsoft guide. - -2. **Install CoDev Code in WSL** - - Once WSL is set up, open your WSL terminal and install CoDev Code using one of the [installation methods](/docs/). - - ```bash - npm install -g codev-code - ``` - -3. **Use CoDev Code from WSL** - - Navigate to your project directory (access Windows files via `/mnt/c/`, `/mnt/d/`, etc.) and run CoDev Code. - - ```bash - cd /mnt/c/Users/YourName/project - codev - ``` - - - ---- - -## Desktop App + WSL Server - -If you prefer using the CoDev Code Desktop app but want to run the server in WSL: - -1. **Start the server in WSL** with `--hostname 0.0.0.0` to allow external connections: - - ```bash - codev serve --hostname 0.0.0.0 --port 4096 - ``` - -2. **Connect the Desktop app** to `http://localhost:4096` - -:::note -If `localhost` does not work in your setup, connect using the WSL IP address instead (from WSL: `hostname -I`) and use `http://:4096`. -::: - -:::caution -When using `--hostname 0.0.0.0`, set `CODEV_SERVER_PASSWORD` to secure the server. -::: - -```bash -CODEV_SERVER_PASSWORD=your-password codev serve --hostname 0.0.0.0 -``` - ---- - -## Web Client + WSL - -For the best web experience on Windows: - -1. **Run `codev web` in the WSL terminal** rather than PowerShell: - - ```bash - codev web --hostname 0.0.0.0 - ``` - -2. **Access from your Windows browser** at `http://localhost:` (CoDev Code prints the URL) - -Running `codev web` from WSL ensures proper file system access and terminal integration while still being accessible from your Windows browser. - ---- - -## Accessing Windows Files - -WSL can access all your Windows files through the `/mnt/` directory: - -- `C:` drive → `/mnt/c/` -- `D:` drive → `/mnt/d/` -- And so on... - -Example: - -```bash -cd /mnt/c/Users/YourName/Documents/project -codev -``` - -:::tip -For the smoothest experience, consider cloning/copying your repo into the WSL filesystem (for example under `~/code/`) and running CoDev Code there. -::: - ---- - -## Tips - -- Keep CoDev Code running in WSL for projects stored on Windows drives - file access is seamless -- Use VS Code's [WSL extension](https://code.visualstudio.com/docs/remote/wsl) alongside CoDev Code for an integrated development workflow -- Your CoDev Code config and sessions are stored within the WSL environment at `~/.local/share/codev/` diff --git a/packages/web/src/content/docs/zen.mdx b/packages/web/src/content/docs/zen.mdx deleted file mode 100644 index f02a678e42..0000000000 --- a/packages/web/src/content/docs/zen.mdx +++ /dev/null @@ -1,331 +0,0 @@ ---- -title: Zen -description: Curated list of models provided by OpenCode. ---- - -import config from "../../../config.mjs" -export const console = config.console -export const email = `mailto:${config.email}` - -OpenCode Zen is a list of tested and verified models provided by the OpenCode team. - -Zen works like any other provider in CoDev Code. You login to OpenCode Zen and get -your API key. It's **completely optional** and you don't need to use it to use -CoDev Code. - ---- - -## Background - -There are a large number of models out there but only a few of -these models work well as coding agents. Additionally, most providers are -configured very differently; so you get very different performance and quality. - -:::tip -We tested a select group of models and providers that work well with CoDev Code. -::: - -So if you are using a model through something like OpenRouter, you can never be -sure if you are getting the best version of the model you want. - -To fix this, we did a couple of things: - -1. We tested a select group of models and talked to their teams about how to - best run them. -2. We then worked with a few providers to make sure these were being served - correctly. -3. Finally, we benchmarked the combination of the model/provider and came up - with a list that we feel good recommending. - -OpenCode Zen is an AI gateway that gives you access to these models. - ---- - -## How it works - -OpenCode Zen works like any other provider in CoDev Code. - -1. You sign in to **OpenCode Zen**, add your billing - details, and copy your API key. -2. You run the `/connect` command in the TUI, select OpenCode Zen, and paste your API key. -3. Run `/models` in the TUI to see the list of models we recommend. - -You are charged per request and you can add credits to your account. - ---- - -## Endpoints - -You can also access our models through the following API endpoints. - -| Model | Model ID | Endpoint | AI SDK Package | -| ---------------------- | ---------------------- | ---------------------------------------------------- | --------------------------- | -| GPT 5.6 Sol | gpt-5.6-sol | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.6 Terra | gpt-5.6-terra | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.6 Luna | gpt-5.6-luna | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.5 | gpt-5.5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.5 Pro | gpt-5.5-pro | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 | gpt-5.4 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Pro | gpt-5.4-pro | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Mini | gpt-5.4-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.4 Nano | gpt-5.4-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.3 Codex | gpt-5.3-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.3 Codex Spark | gpt-5.3-codex-spark | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.2 | gpt-5.2 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.2 Codex | gpt-5.2-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 | gpt-5.1 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex | gpt-5.1-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex Max | gpt-5.1-codex-max | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5.1 Codex Mini | gpt-5.1-codex-mini | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 | gpt-5 | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 Codex | gpt-5-codex | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| GPT 5 Nano | gpt-5-nano | `https://opencode.ai/zen/v1/responses` | `@ai-sdk/openai` | -| Claude Fable 5 | claude-fable-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.8 | claude-opus-4-8 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.7 | claude-opus-4-7 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.6 | claude-opus-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Opus 4.5 | claude-opus-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 5 | claude-sonnet-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 4.6 | claude-sonnet-4-6 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Sonnet 4.5 | claude-sonnet-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Claude Haiku 4.5 | claude-haiku-4-5 | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Gemini 3.5 Flash | gemini-3.5-flash | `https://opencode.ai/zen/v1/models/gemini-3.5-flash` | `@ai-sdk/google` | -| Gemini 3.1 Pro | gemini-3.1-pro | `https://opencode.ai/zen/v1/models/gemini-3.1-pro` | `@ai-sdk/google` | -| Gemini 3 Flash | gemini-3-flash | `https://opencode.ai/zen/v1/models/gemini-3-flash` | `@ai-sdk/google` | -| Qwen3.7 Max | qwen3.7-max | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.7 Plus | qwen3.7-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.6 Plus | qwen3.6-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| Qwen3.5 Plus | qwen3.5-plus | `https://opencode.ai/zen/v1/messages` | `@ai-sdk/anthropic` | -| DeepSeek V4 Pro | deepseek-v4-pro | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash | deepseek-v4-flash | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M3 | minimax-m3 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M2.7 | minimax-m2.7 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiniMax M2.5 | minimax-m2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5.2 | glm-5.2 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5.1 | glm-5.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| GLM 5 | glm-5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.5 | kimi-k2.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.6 | kimi-k2.6 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Kimi K2.7 Code | kimi-k2.7-code | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Grok 4.5 | grok-4.5 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Grok Build 0.1 | grok-build-0.1 | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Big Pickle | big-pickle | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| MiMo-V2.5 Free | mimo-v2.5-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| North Mini Code Free | north-mini-code-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| Nemotron 3 Ultra Free | nemotron-3-ultra-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | -| DeepSeek V4 Flash Free | deepseek-v4-flash-free | `https://opencode.ai/zen/v1/chat/completions` | `@ai-sdk/openai-compatible` | - -The [model id](/docs/config/#models) in your CoDev Code config -uses the format `opencode/`. For example, for GPT 5.5, you would -use `opencode/gpt-5.5` in your config. - ---- - -### Models - -You can fetch the full list of available models and their metadata from: - -``` -https://opencode.ai/zen/v1/models -``` - ---- - -## Pricing - -We support a pay-as-you-go model. Below are the prices **per 1M tokens**. - -| Model | Input | Output | Cached Read | Cached Write | -| --------------------------------- | ------ | ------- | ----------- | ------------ | -| Big Pickle | Free | Free | Free | - | -| DeepSeek V4 Flash Free | Free | Free | Free | - | -| MiMo-V2.5 Free | Free | Free | Free | - | -| North Mini Code Free | Free | Free | Free | - | -| Nemotron 3 Ultra Free | Free | Free | Free | - | -| MiniMax M3 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.7 | $0.30 | $1.20 | $0.06 | - | -| MiniMax M2.5 | $0.30 | $1.20 | $0.06 | - | -| GLM 5.2 | $1.40 | $4.40 | $0.26 | - | -| GLM 5.1 | $1.40 | $4.40 | $0.26 | - | -| GLM 5 | $1.00 | $3.20 | $0.20 | - | -| Kimi K2.7 Code | $0.95 | $4.00 | $0.19 | - | -| Kimi K2.6 | $0.95 | $4.00 | $0.16 | - | -| Kimi K2.5 | $0.60 | $3.00 | $0.10 | - | -| Qwen3.7 Max | $2.50 | $7.50 | $0.50 | $3.125 | -| Qwen3.7 Plus | $0.40 | $1.60 | $0.04 | $0.50 | -| Qwen3.6 Plus | $0.50 | $3.00 | $0.05 | $0.625 | -| Qwen3.5 Plus | $0.20 | $1.20 | $0.02 | $0.25 | -| DeepSeek V4 Pro | $1.74 | $3.48 | $0.145 | - | -| DeepSeek V4 Flash | $0.14 | $0.28 | $0.028 | - | -| Grok 4.5 (≤ 200K tokens) | $2.00 | $6.00 | $0.50 | - | -| Grok 4.5 (> 200K tokens) | $4.00 | $12.00 | $1.00 | - | -| Grok Build 0.1 | $1.00 | $2.00 | $0.20 | - | -| Claude Fable 5 | $10.00 | $50.00 | $1.00 | $12.50 | -| Claude Opus 4.8 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.7 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.6 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Opus 4.5 | $5.00 | $25.00 | $0.50 | $6.25 | -| Claude Sonnet 5 | $2.00 | $10.00 | $0.20 | $2.50 | -| Claude Sonnet 4.6 | $3.00 | $15.00 | $0.30 | $3.75 | -| Claude Sonnet 4.5 (≤ 200K tokens) | $3.00 | $15.00 | $0.30 | $3.75 | -| Claude Sonnet 4.5 (> 200K tokens) | $6.00 | $22.50 | $0.60 | $7.50 | -| Claude Haiku 4.5 | $1.00 | $5.00 | $0.10 | $1.25 | -| Gemini 3.5 Flash | $1.50 | $9.00 | $0.15 | - | -| Gemini 3.1 Pro (≤ 200K tokens) | $2.00 | $12.00 | $0.20 | - | -| Gemini 3.1 Pro (> 200K tokens) | $4.00 | $18.00 | $0.40 | - | -| Gemini 3 Flash | $0.50 | $3.00 | $0.05 | - | -| GPT 5.6 Sol (≤ 272K tokens) | $5.00 | $30.00 | $0.50 | $6.25 | -| GPT 5.6 Sol (> 272K tokens) | $10.00 | $45.00 | $1.00 | $12.50 | -| GPT 5.6 Terra (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | $3.125 | -| GPT 5.6 Terra (> 272K tokens) | $5.00 | $22.50 | $0.50 | $6.25 | -| GPT 5.6 Luna (≤ 272K tokens) | $1.00 | $6.00 | $0.10 | $1.25 | -| GPT 5.6 Luna (> 272K tokens) | $2.00 | $9.00 | $0.20 | $2.50 | -| GPT 5.5 (≤ 272K tokens) | $5.00 | $30.00 | $0.50 | - | -| GPT 5.5 (> 272K tokens) | $10.00 | $45.00 | $1.00 | - | -| GPT 5.5 Pro | $30.00 | $180.00 | $30.00 | - | -| GPT 5.4 (≤ 272K tokens) | $2.50 | $15.00 | $0.25 | - | -| GPT 5.4 (> 272K tokens) | $5.00 | $22.50 | $0.50 | - | -| GPT 5.4 Pro | $30.00 | $180.00 | $30.00 | - | -| GPT 5.4 Mini | $0.75 | $4.50 | $0.075 | - | -| GPT 5.4 Nano | $0.20 | $1.25 | $0.02 | - | -| GPT 5.3 Codex Spark | $1.75 | $14.00 | $0.175 | - | -| GPT 5.3 Codex | $1.75 | $14.00 | $0.175 | - | -| GPT 5.2 | $1.75 | $14.00 | $0.175 | - | -| GPT 5.2 Codex | $1.75 | $14.00 | $0.175 | - | -| GPT 5.1 | $1.07 | $8.50 | $0.107 | - | -| GPT 5.1 Codex | $1.07 | $8.50 | $0.107 | - | -| GPT 5.1 Codex Max | $1.25 | $10.00 | $0.125 | - | -| GPT 5.1 Codex Mini | $0.25 | $2.00 | $0.025 | - | -| GPT 5 | $1.07 | $8.50 | $0.107 | - | -| GPT 5 Codex | $1.07 | $8.50 | $0.107 | - | -| GPT 5 Nano | $0.05 | $0.40 | $0.005 | - | - -You might notice _Claude Haiku 3.5_ in your usage history. This is a [low cost model](/docs/config/#models) that's used to generate the titles of your sessions. - -:::note -Credit card fees are passed along at cost (4.4% + $0.30 per transaction); we don't charge anything beyond that. -::: - -The free models: - -- DeepSeek V4 Flash Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. -- MiMo-V2.5 Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. -- North Mini Code Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. -- Nemotron 3 Ultra Free is available on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. -- Big Pickle is a stealth model that's free on OpenCode for a limited time. The team is using this time to collect feedback and improve the model. - -Contact us if you have any questions. - ---- - -### Auto-reload - -If your balance goes below $5, Zen will automatically reload $20. - -You can change the auto-reload amount. You can also disable auto-reload entirely. - ---- - -### Monthly limits - -You can also set a monthly usage limit for the entire workspace and for each -member of your team. - -For example, let's say you set a monthly usage limit to $20, Zen will not use -more than $20 in a month. But if you have auto-reload enabled, Zen might end up -charging you more than $20 if your balance goes below $5. - ---- - -### Deprecated models - -| Model | Deprecation date | -| ------------------ | ----------------- | -| GPT 5.2 Codex | July 23, 2026 | -| GPT 5.1 Codex | July 23, 2026 | -| GPT 5.1 Codex Max | July 23, 2026 | -| GPT 5.1 Codex Mini | July 23, 2026 | -| GPT 5 Codex | July 23, 2026 | -| Claude Opus 4.1 | August 5, 2026 | -| Claude Sonnet 4 | June 15, 2026 | -| Claude Haiku 3.5 | February 16, 2026 | -| Gemini 3 Pro | March 9, 2026 | -| MiniMax M2.5 | August 5, 2026 | -| MiniMax M2.1 | March 15, 2026 | -| GLM 5 | May 14, 2026 | -| GLM 4.7 | March 15, 2026 | -| GLM 4.6 | March 15, 2026 | -| Kimi K2.5 | August 5, 2026 | -| Kimi K2 Thinking | March 6, 2026 | -| Kimi K2 | March 6, 2026 | -| Qwen3 Coder 480B | February 6, 2026 | - ---- - -## Privacy - -All our models are hosted in the US. Our providers follow a zero-retention policy and do not use your data for model training, with the following exceptions: - -- Big Pickle: During its free period, collected data may be used to improve the model. -- DeepSeek V4 Flash Free: During its free period, collected data may be used to improve the model. -- MiMo-V2.5 Free: During its free period, collected data may be used to improve the model. -- North Mini Code Free: During its free period, collected data may be retained and used to improve the model. Do not submit personal or confidential data. See our [Terms of Use](https://cohere.com/terms-of-use) and [Privacy Policy](https://cohere.com/privacy). -- Nemotron 3 Ultra Free (NVIDIA free endpoints): Trial use only — do not submit personal or confidential data. Your use is logged for security purposes and to improve NVIDIA products and services. The logged session data for improvement purposes is not linked to your identity or any persistent identifier. For more information about our data processing practices, see our [Privacy Policy](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). By interacting with this endpoint, you consent to our collection, recording, and use of such information and the [NVIDIA API Trial Terms of Service](https://assets.ngc.nvidia.com/products/api-catalog/legal/NVIDIA%20API%20Trial%20Terms%20of%20Service.pdf). -- OpenAI APIs: Requests are retained for 30 days in accordance with [OpenAI's Data Policies](https://platform.openai.com/docs/guides/your-data). -- Anthropic APIs: Requests are retained for 30 days in accordance with [Anthropic's Data Policies](https://docs.anthropic.com/en/docs/claude-code/data-usage). - ---- - -## For Teams - -Zen also works great for teams. You can invite teammates, assign roles, curate -the models your team uses, and more. - -:::note -Workspaces are currently free for teams as a part of the beta. -::: - -Managing your workspace is currently free for teams as a part of the beta. We'll be -sharing more details on the pricing soon. - ---- - -### Roles - -You can invite teammates to your workspace and assign roles: - -- **Admin**: Manage models, members, API keys, and billing -- **Member**: Manage only their own API keys - -Admins can also set monthly spending limits for each member to keep costs under control. - ---- - -### Model access - -Admins can enable or disable specific models for the workspace. Requests made to a disabled model will return an error. - -This is useful for cases where you want to disable the use of a model that -collects data. - ---- - -### Bring your own key - -You can use your own OpenAI or Anthropic API keys while still accessing other models in Zen. - -When you use your own keys, tokens are billed directly by the provider, not by Zen. - -For example, your organization might already have a key for OpenAI or Anthropic -and you want to use that instead of the one that Zen provides. - ---- - -## Goals - -We created OpenCode Zen to: - -1. **Benchmark** the best models/providers for coding agents. -2. Have access to the **highest quality** options and not downgrade performance or route to cheaper providers. -3. Pass along any **price drops** by selling at cost; so the only markup is to cover our processing fees. -4. Have **no lock-in** by allowing you to use it with any other coding agent. And always let you use any other provider with CoDev Code as well. diff --git a/packages/web/src/content/i18n/en.json b/packages/web/src/content/i18n/en.json deleted file mode 100644 index fedb70a6cb..0000000000 --- a/packages/web/src/content/i18n/en.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "app.head.titleSuffix": "AI coding agent built for the terminal", - "app.header.home": "Home", - "app.header.docs": "Docs", - "app.footer.issueLink": "Found a bug? Open an issue", - "app.footer.discordLink": "Join our Discord community", - "app.lander.hero.title": "The AI coding agent built for the terminal.", - "app.lander.cta.getStarted": "Get Started", - "app.lander.features.native_tui.title": "Native TUI", - "app.lander.features.native_tui.description": "A responsive, native, themeable terminal UI.", - "app.lander.features.lsp_enabled.title": "LSP enabled", - "app.lander.features.lsp_enabled.description": "Automatically loads the right LSPs for the LLM.", - "app.lander.features.multi_session.title": "Multi-session", - "app.lander.features.multi_session.description": "Start multiple agents in parallel on the same project.", - "app.lander.features.shareable_links.title": "Shareable links", - "app.lander.features.shareable_links.description": "Share a link to any sessions for reference or to debug.", - "app.lander.features.github_copilot.description": "Log in with GitHub to use your Copilot account.", - "app.lander.features.chatgpt_plus_pro.description": "Log in with OpenAI to use your ChatGPT Plus or Pro account.", - "app.lander.features.use_any_model.title": "Use any model", - "app.lander.features.use_any_model.prefix": "Supports 75+ LLM providers through", - "app.lander.features.use_any_model.suffix": "including local models.", - "app.lander.images.tui.caption": "opencode TUI with the tokyonight theme", - "app.lander.images.tui.alt": "opencode TUI with the tokyonight theme", - "app.lander.images.vscode.caption": "opencode in VS Code", - "app.lander.images.vscode.alt": "opencode in VS Code", - "app.lander.images.github.caption": "opencode in GitHub", - "app.lander.images.github.alt": "opencode in GitHub", - "share.meta_description": "opencode - The AI coding agent built for the terminal.", - "share.not_found": "Not found", - "share.link_to_message": "Link to this message", - "share.copied": "Copied!", - "share.copy": "Copy", - "share.show_more": "Show more", - "share.show_less": "Show less", - "share.show_results": "Show results", - "share.hide_results": "Hide results", - "share.show_details": "Show details", - "share.hide_details": "Hide details", - "share.show_preview": "Show preview", - "share.hide_preview": "Hide preview", - "share.show_contents": "Show contents", - "share.hide_contents": "Hide contents", - "share.show_output": "Show output", - "share.hide_output": "Hide output", - "share.error": "Error", - "share.waiting_for_messages": "Waiting for messages...", - "share.status_connected_waiting": "Connected, waiting for messages...", - "share.status_connecting": "Connecting...", - "share.status_disconnected": "Disconnected", - "share.status_reconnecting": "Reconnecting...", - "share.status_error": "Error", - "share.status_unknown": "Unknown", - "share.error_id_not_found": "id not found", - "share.error_api_url_not_found": "API URL not found", - "share.error_connection_failed": "Connection failed", - "share.opencode_version": "opencode version", - "share.opencode_name": "opencode", - "share.models": "Models", - "share.cost": "Cost", - "share.input_tokens": "Input Tokens", - "share.output_tokens": "Output Tokens", - "share.reasoning_tokens": "Reasoning Tokens", - "share.scroll_to_bottom": "Scroll to bottom", - "share.attachment": "Attachment", - "share.thinking": "Thinking", - "share.thinking_pending": "Thinking...", - "share.creating_plan": "Creating plan", - "share.completing_plan": "Completing plan", - "share.updating_plan": "Updating plan", - "share.match_one": "match", - "share.match_other": "matches", - "share.result_one": "result", - "share.result_other": "results", - "share.debug_key": "Key" -} diff --git a/packages/web/src/content/i18n/es.json b/packages/web/src/content/i18n/es.json deleted file mode 100644 index a30a7f0649..0000000000 --- a/packages/web/src/content/i18n/es.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "app.head.titleSuffix": "Agente de codificación con IA para terminal", - "app.header.home": "Inicio", - "app.header.docs": "Documentación", - "app.footer.issueLink": "¿Encontraste un error? Abre una incidencia", - "app.footer.discordLink": "Únete a nuestra comunidad de Discord", - "app.lander.hero.title": "El agente de codificación con IA hecho para terminal.", - "app.lander.cta.getStarted": "Comenzar", - "app.lander.features.native_tui.title": "Nativo TUI", - "app.lander.features.native_tui.description": "Una UI de terminal responsiva, nativa y personalizable.", - "app.lander.features.lsp_enabled.title": "LSP habilitado", - "app.lander.features.lsp_enabled.description": "Carga automáticamente los LSP correctos para LLM.", - "app.lander.features.multi_session.title": "Multisesión", - "app.lander.features.multi_session.description": "Inicia varios agentes en paralelo en el mismo proyecto.", - "app.lander.features.shareable_links.title": "Enlaces para compartir", - "app.lander.features.shareable_links.description": "Comparte un enlace a cualquier sesion para referencia o depuracion.", - "app.lander.features.github_copilot.description": "Inicia sesion con GitHub para usar tu cuenta Copilot.", - "app.lander.features.chatgpt_plus_pro.description": "Inicia sesion con OpenAI para usar tu cuenta ChatGPT Plus or Pro.", - "app.lander.features.use_any_model.title": "Usa cualquier modelo", - "app.lander.features.use_any_model.prefix": "Admite más de 75 proveedores LLM a través de", - "app.lander.features.use_any_model.suffix": "incluyendo modelos locales.", - "app.lander.images.tui.caption": "opencode TUI con el tema tokyonight", - "app.lander.images.tui.alt": "opencode TUI con el tema tokyonight", - "app.lander.images.vscode.caption": "opencode en VS Code", - "app.lander.images.vscode.alt": "opencode en VS Code", - "app.lander.images.github.caption": "opencode en GitHub", - "app.lander.images.github.alt": "opencode en GitHub", - "share.meta_description": "opencode - Agente de codificacion con IA para terminal.", - "share.not_found": "No encontrado", - "share.link_to_message": "Enlace a este mensaje", - "share.copied": "¡Copiado!", - "share.copy": "Copiar", - "share.show_more": "Mostrar más", - "share.show_less": "Mostrar menos", - "share.show_results": "Mostrar resultados", - "share.hide_results": "Ocultar resultados", - "share.show_details": "Mostrar detalles", - "share.hide_details": "Ocultar detalles", - "share.show_preview": "Mostrar vista previa", - "share.hide_preview": "Ocultar vista previa", - "share.show_contents": "Mostrar contenidos", - "share.hide_contents": "Ocultar contenidos", - "share.show_output": "Mostrar salida", - "share.hide_output": "Ocultar salida", - "share.error": "Error", - "share.waiting_for_messages": "Esperando mensajes...", - "share.status_connected_waiting": "Conectado, esperando mensajes...", - "share.status_connecting": "Conectando...", - "share.status_disconnected": "Desconectado", - "share.status_reconnecting": "Reconectando...", - "share.status_error": "Error", - "share.status_unknown": "Desconocido", - "share.error_id_not_found": "no encontrado", - "share.error_api_url_not_found": "URL de la API no encontrada", - "share.error_connection_failed": "Error de conexión", - "share.opencode_version": "Versión opencode", - "share.opencode_name": "opencode", - "share.models": "Modelos", - "share.cost": "Costo", - "share.input_tokens": "Tokens de entrada", - "share.output_tokens": "Tokens de salida", - "share.reasoning_tokens": "Tokens de razonamiento", - "share.scroll_to_bottom": "Desplazarse hacia abajo", - "share.attachment": "Adjunto", - "share.thinking": "Pensamiento", - "share.thinking_pending": "Pensando...", - "share.creating_plan": "Creando plan", - "share.completing_plan": "Completando el plan", - "share.updating_plan": "Actualizando el plan", - "share.match_one": "coincidencia", - "share.match_other": "coincidencias", - "share.result_one": "resultado", - "share.result_other": "resultados", - "share.debug_key": "Clave" -} diff --git a/packages/web/src/i18n/locales.ts b/packages/web/src/i18n/locales.ts deleted file mode 100644 index 5123f12afe..0000000000 --- a/packages/web/src/i18n/locales.ts +++ /dev/null @@ -1,52 +0,0 @@ -export const docsLocale = ["es"] as const - -export type DocsLocale = (typeof docsLocale)[number] - -export const locale = ["root", ...docsLocale] as const - -export type Locale = (typeof locale)[number] - -export const localeAlias = { - en: "root", - es: "es", - root: "root", -} as const satisfies Record - -const starts = [ - ["es", "es"], - ["en", "root"], -] as const - -function parse(input: string) { - let decoded = "" - try { - decoded = decodeURIComponent(input) - } catch { - return null - } - - const value = decoded.trim().toLowerCase() - if (!value) return null - return value -} - -export function exactLocale(input: string) { - const value = parse(input) - if (!value) return null - if (value in localeAlias) { - return localeAlias[value as keyof typeof localeAlias] - } - - return null -} - -export function matchLocale(input: string) { - const value = parse(input) - if (!value) return null - - if (value in localeAlias) { - return localeAlias[value as keyof typeof localeAlias] - } - - return starts.find((item) => value.startsWith(item[0]))?.[1] ?? null -} diff --git a/packages/web/src/middleware.ts b/packages/web/src/middleware.ts deleted file mode 100644 index cf9f97b0b1..0000000000 --- a/packages/web/src/middleware.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { defineMiddleware } from "astro:middleware" -import { exactLocale, matchLocale } from "./i18n/locales" - -function docsAlias(pathname: string) { - const hit = /^\/docs\/([^/]+)(\/.*)?$/.exec(pathname) - if (!hit) return null - - const value = hit[1] ?? "" - const tail = hit[2] ?? "" - const locale = exactLocale(value) - if (!locale) return null - - const next = locale === "root" ? `/docs${tail}` : `/docs/${locale}${tail}` - if (next === pathname) return null - return { - path: next, - locale, - } -} - -function cookie(locale: string) { - const value = locale === "root" ? "en" : locale - return `oc_locale=${encodeURIComponent(value)}; Path=/; Max-Age=31536000; SameSite=Lax` -} - -function redirect(url: URL, path: string, locale?: string) { - const next = new URL(url.toString()) - next.pathname = path - const headers = new Headers({ - Location: next.toString(), - }) - if (locale) headers.set("Set-Cookie", cookie(locale)) - return new Response(null, { - status: 302, - headers, - }) -} - -function localeFromCookie(header: string | null) { - if (!header) return null - const raw = header - .split(";") - .map((x) => x.trim()) - .find((x) => x.startsWith("oc_locale=")) - ?.slice("oc_locale=".length) - if (!raw) return null - return matchLocale(raw) -} - -function localeFromAcceptLanguage(header: string | null) { - if (!header) return "root" - - const items = header - .split(",") - .map((raw) => raw.trim()) - .filter(Boolean) - .map((raw) => { - const parts = raw.split(";").map((x) => x.trim()) - const lang = parts[0] ?? "" - const q = parts - .slice(1) - .find((x) => x.startsWith("q=")) - ?.slice(2) - return { - lang, - q: q ? Number.parseFloat(q) : 1, - } - }) - .sort((a, b) => b.q - a.q) - - const locale = items - .map((item) => item.lang) - .filter((lang) => lang && lang !== "*") - .map((lang) => matchLocale(lang)) - .find((lang) => lang) - - return locale ?? "root" -} - -export const onRequest = defineMiddleware((ctx, next) => { - const alias = docsAlias(ctx.url.pathname) - if (alias) { - return redirect(ctx.url, alias.path, alias.locale) - } - - if (ctx.url.pathname !== "/docs" && ctx.url.pathname !== "/docs/") return next() - - const locale = - localeFromCookie(ctx.request.headers.get("cookie")) ?? - localeFromAcceptLanguage(ctx.request.headers.get("accept-language")) - if (!locale || locale === "root") return next() - - return redirect(ctx.url, `/docs/${locale}/`) -}) diff --git a/packages/web/src/pages/[...slug].md.ts b/packages/web/src/pages/[...slug].md.ts deleted file mode 100644 index dbc11d78e9..0000000000 --- a/packages/web/src/pages/[...slug].md.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { APIRoute } from "astro" -import { getCollection } from "astro:content" - -function notFoundText(locals: unknown) { - if (typeof locals !== "object" || locals === null || !("t" in locals)) { - return "share.not_found" - } - const t = (locals as { t?: unknown }).t - if (typeof t !== "function") { - return "share.not_found" - } - const text = t("share.not_found") - if (typeof text === "string" && text.length > 0) { - return text - } - return "share.not_found" -} - -export const GET: APIRoute = async ({ params, locals }) => { - const slug = params.slug || "index" - const docs = await getCollection("docs") - const doc = docs.find((d) => d.id === slug) - const notFound = notFoundText(locals) - - if (!doc) { - return new Response(notFound, { status: 404, statusText: notFound }) - } - - return new Response(doc.body, { - headers: { - "Content-Type": "text/plain; charset=utf-8", - }, - }) -} diff --git a/packages/web/src/pages/s/[id].astro b/packages/web/src/pages/s/[id].astro deleted file mode 100644 index 7ea42f6916..0000000000 --- a/packages/web/src/pages/s/[id].astro +++ /dev/null @@ -1,164 +0,0 @@ ---- -import { Base64 } from "js-base64" -import StarlightPage from "@astrojs/starlight/components/StarlightPage.astro" -import type { Session } from "opencode/session/index" -import config from "../../../config.mjs" -import Share from "../../components/Share.tsx" - -const apiUrl = import.meta.env.VITE_API_URL || "" -const ta = Astro.locals.t as ((key: string) => string) & { - all?: () => Record -} -const all = typeof ta.all === "function" ? ta.all() : {} -const locale = Astro.currentLocale || Astro.locals.starlightRoute.locale || "root" -const formatLocale = locale === "root" ? "en" : locale -const t = ta - -function tx(key: string) { - const value = all[key] - if (typeof value === "string") return value - return t(key) -} - -const messages = { - locale: formatLocale, - link_to_message: tx("share.link_to_message"), - copied: tx("share.copied"), - copy: tx("share.copy"), - show_more: tx("share.show_more"), - show_less: tx("share.show_less"), - show_results: tx("share.show_results"), - hide_results: tx("share.hide_results"), - show_details: tx("share.show_details"), - hide_details: tx("share.hide_details"), - show_preview: tx("share.show_preview"), - hide_preview: tx("share.hide_preview"), - show_contents: tx("share.show_contents"), - hide_contents: tx("share.hide_contents"), - show_output: tx("share.show_output"), - hide_output: tx("share.hide_output"), - error: tx("share.error"), - waiting_for_messages: tx("share.waiting_for_messages"), - status_connected_waiting: tx("share.status_connected_waiting"), - status_connecting: tx("share.status_connecting"), - status_disconnected: tx("share.status_disconnected"), - status_reconnecting: tx("share.status_reconnecting"), - status_error: tx("share.status_error"), - status_unknown: tx("share.status_unknown"), - error_id_not_found: tx("share.error_id_not_found"), - error_api_url_not_found: tx("share.error_api_url_not_found"), - error_connection_failed: tx("share.error_connection_failed"), - opencode_version: tx("share.opencode_version"), - opencode_name: tx("share.opencode_name"), - models: tx("share.models"), - cost: tx("share.cost"), - input_tokens: tx("share.input_tokens"), - output_tokens: tx("share.output_tokens"), - reasoning_tokens: tx("share.reasoning_tokens"), - scroll_to_bottom: tx("share.scroll_to_bottom"), - attachment: tx("share.attachment"), - thinking: tx("share.thinking"), - thinking_pending: tx("share.thinking_pending"), - creating_plan: tx("share.creating_plan"), - completing_plan: tx("share.completing_plan"), - updating_plan: tx("share.updating_plan"), - match_one: tx("share.match_one"), - match_other: tx("share.match_other"), - result_one: tx("share.result_one"), - result_other: tx("share.result_other"), - debug_key: tx("share.debug_key"), -} - -const id = Astro.params.id || "" -const res = await fetch(`${apiUrl}/share_data?id=${id}`) -const data = (await res.json()) as { - info?: Session.Info - messages: Record -} - -if (!data.info) { - return new Response(null, { - status: 404, - statusText: tx("share.not_found"), - }) -} - -const models: Set = new Set() -const version = data.info.version ? `v${data.info.version}` : "v0.0.1" - -for (const d of Object.values(data.messages)) { - if (d.role === "assistant" && d.modelID) { - models.add(d.modelID) - } -} - -const encodedTitle = encodeURIComponent( - Base64.encode( - encodeURIComponent(data.info.title.substring(0, 700)), - ), -) - -const modelsArray = Array.from(models) -const modelParam = - modelsArray.length === 1 - ? modelsArray[0] - : modelsArray.length === 2 - ? encodeURIComponent(`${modelsArray[0]} & ${modelsArray[1]}`) - : encodeURIComponent(`${modelsArray[0]} & ${modelsArray.length - 1} others`) - -const ogImage = `${config.socialCard}/opencode-share/${encodedTitle}.png?model=${modelParam}&version=${version}&id=${id}` ---- - - - - - diff --git a/packages/web/src/styles/custom.css b/packages/web/src/styles/custom.css deleted file mode 100644 index 04331dd6ae..0000000000 --- a/packages/web/src/styles/custom.css +++ /dev/null @@ -1,405 +0,0 @@ -:root { - --sl-color-bg: hsl(0, 20%, 99%); - --sl-color-gray-5: hsl(0, 1%, 85%); - --sl-nav-gap: 40px; - --sl-color-text: hsl(0, 1%, 39%); - --sl-border-color: hsl(0, 1%, 85%); - --sl-color-hairline-shade: hsl(0, 1%, 85%); - - --color-background: hsl(0, 20%, 99%); - --color-background-weak: hsl(0, 8%, 97%); - --color-background-weak-hover: hsl(0, 8%, 94%); - --color-background-strong: hsl(0, 5%, 12%); - --color-background-strong-hover: hsl(0, 5%, 18%); - --color-background-interactive: hsl(62, 84%, 88%); - --color-background-interactive-weaker: hsl(64, 74%, 95%); - - --color-text: hsl(0, 1%, 39%); - --color-text-weak: hsl(0, 1%, 60%); - --color-text-weaker: hsl(0, 3%, 88%); - --color-text-strong: hsl(0, 5%, 12%); - --color-text-inverted: hsl(0, 20%, 99%); - - --color-border: hsl(30, 2%, 81%); - --color-border-weak: hsl(0, 1%, 85%); - - --color-icon: hsl(0, 1%, 55%); - - /* For the share component */ - --sl-color-bg-surface: var(--sl-color-bg-nav); - --sl-color-divider: var(--sl-color-gray-5); -} - -body { - color: var(--color-text) !important; - font-size: 14px !important; - - @media (prefers-color-scheme: dark) { - --sl-color-bg: hsl(0, 9%, 7%); - --sl-color-gray-5: hsl(0, 4%, 23%); - --sl-color-text: hsl(0, 4%, 71%); - --sl-border-color: hsl(0, 4%, 23%); - --sl-color-hairline-shade: hsl(0, 4%, 23%); - - --color-background: hsl(0, 9%, 7%); - --color-background-weak: hsl(0, 6%, 10%); - --color-background-strong: hsl(0, 15%, 94%); - --color-background-strong-hover: hsl(0, 15%, 97%); - --color-background-interactive: hsl(62, 100%, 90%); - --color-background-interactive-weaker: hsl(60, 20%, 8%); - - --color-text: hsl(0, 4%, 71%); - --color-text-weak: hsl(0, 2%, 49%); - --color-text-weaker: hsl(0, 3%, 28%); - --color-text-strong: hsl(0, 15%, 94%); - --color-text-inverted: hsl(0, 9%, 7%); - - --color-border: hsl(0, 3%, 28%); - --color-border-weak: hsl(0, 4%, 23%); - - --color-icon: hsl(10, 3%, 43%); - } -} - -.header:where(.astro-tcroauqe) { - border-bottom: 1px solid var(--color-border-weak) !important; -} - -.sl-markdown-content hr { - border-bottom: 1px solid var(--color-border-weak) !important; -} - -#starlight__on-this-page--mobile { - border-bottom: 1px solid var(--color-border-weak) !important; -} - -mobile-starlight-toc nav summary .toggle { - opacity: 60% !important; - text-decoration: none !important; -} - -nav.sidebar summary svg.caret { - color: var(--color-icon) !important; -} - -/* Search button style overrides */ -body > .page > header button[data-open-modal] > kbd { - position: relative; - display: flex; - gap: 4px; -} -body > .page > header button[data-open-modal] > kbd > kbd { - color: var(--color-icon) !important; - font-size: 15px; -} -/* Make the Cmd (⌘) keystroke bigger */ -body > .page > header button[data-open-modal][aria-keyshortcuts="Meta+K"] > kbd > kbd:first-child { - font-size: 20px; - line-height: 0.73; -} - -.starlight-aside__title { - flex: 0 0 auto; - margin-top: 3px; -} - -body > .page > .main-frame .main-pane > main > .content-panel + .content-panel { - border-top: none !important; -} - -body > .page > header a.site-title img { - height: 2rem !important; -} - -a { - color: var(--color-text-strong) !important; -} - -.page-description { - color: var(--color-text) !important; -} - -.right-sidebar { - border-inline-start: none !important; -} - -.sidebar-pane { - border-inline-end: 1px solid var(--color-border-weak) !important; -} - -.right-sidebar-panel { - padding: 24px 0 !important; - color: var(--color-text-weaker); -} - -.sidebar-content { - padding: 24px 0 !important; -} - -a[aria-current="page"] { - border-left: 2px solid var(--color-background-strong); - background: var(--color-background-weak) !important; - font-weight: 600 !important; -} - -ul.top-level a[aria-current="page"] > span { - color: var(--color-text-strong) !important; -} - -#starlight__sidebar > div > sl-sidebar-state-persist > ul > li > details > summary { - padding: 0 24px !important; - margin-top: 20px !important; -} - -#starlight__sidebar > div > sl-sidebar-state-persist > ul > li > details > summary:hover { - background: var(--color-background-weak); -} - -#starlight__sidebar > div > sl-sidebar-state-persist > ul > li > details > summary span { - color: var(--color-text-strong) !important; - font-weight: 600 !important; -} - -.top-level li a { - border-radius: 0; - width: 100%; - padding: 4px 24px !important; -} - -.top-level li a:hover { - background: var(--color-background-weak) !important; -} - -.right-group { - gap: 40px !important; -} - -.social-icons { - gap: 24px !important; -} - -.social-icons a svg { - height: 18px !important; - width: 18px !important; -} - -site-search > button { - text-transform: none !important; -} - -body > .page > header button[data-open-modal] { - gap: 12px !important; - background: var(--color-background-weak); - border: 1px solid var(--color-border-weak) !important; - padding: 6px 12px !important; - border-radius: 4px; - - @media (prefers-color-scheme: dark) { - background: var(--color-background-weak); - } -} - -body > .page > header button[data-open-modal] { - background: var(--color-background-weaker); -} - -site-search > button span { - text-decoration: none !important; -} - -.starlight-aside { - display: flex; - gap: 16px; - align-items: start; - - .starlight-aside__content { - margin-top: 0; - } - - @media (max-width: 768px) { - flex-direction: column; - gap: 6px; - } -} - -site-search > button > kbd { - font-size: 14px !important; -} - -h1 a, -h2 a, -h3 a, -h4 a, -h5 a, -h6 a { - color: var(--color-text-strong) !important; -} - -h1 { - font-size: 26px !important; - text-transform: none !important; - font-weight: 500 !important; - color: var(--color-text-strong) !important; -} - -h2 { - font-size: 22px !important; - text-transform: none !important; - font-weight: 500 !important; - color: var(--color-text-strong) !important; -} - -h3 { - font-size: 18px !important; - text-transform: none !important; - font-weight: 500 !important; - color: var(--color-text-strong) !important; -} - -h4 { - font-size: 16px !important; - text-transform: none !important; - font-weight: 500 !important; - color: var(--color-text-strong) !important; -} - -strong { - font-weight: 500 !important; -} - -ul, -ol { - list-style: none !important; - padding: 0 !important; -} - -.sl-markdown-content .tab > [role="tab"][aria-selected="true"] { - border-color: var(--color-text-strong); -} - -.social-icons a svg { - color: var(--color-text-weak) !important; -} - -.social-icons a svg:hover { - color: var(--color-text-strong) !important; -} - -body > .page > header, -:root[data-has-sidebar] body > .page > header { - background: var(--color-background) !important; - padding: 24px !important; -} - -.sl-container { - box-sizing: border-box !important; - width: 100% !important; -} - -.right-sidebar-panel nav, -.right-sidebar-panel h2, -.right-sidebar-panel ul, -.right-sidebar-panel li, -.right-sidebar-panel a { - display: block; - width: 100%; -} - -.sl-container { - max-width: 100% !important; -} - -nav.sidebar .sl-container ul li a, -div.right-sidebar .sl-container ul li a { - padding: 4px 24px !important; - width: 100% !important; - color: var(--color-text-weaker); - opacity: 50%; -} - -nav.sidebar .sl-container ul li a:hover, -div.right-sidebar .sl-container ul li a:hover { - background: var(--color-background-weak); - - @media (prefers-color-scheme: dark) { - background: var(--color-background-weak); - } -} - -nav.sidebar .sl-container ul li ul li, -div.right-sidebar .sl-container ul li ul li { - padding: 4px 12px 0 12px !important; -} - -nav.sidebar .sl-container ul li a[aria-current="true"], -div.right-sidebar .sl-container ul li a[aria-current="true"] { - color: var(--color-text-strong) !important; - opacity: 100%; -} - -h2#starlight__on-this-page { - font-size: 14px !important; - color: var(--color-text-strong) !important; - margin: 0 !important; - font-weight: 400 !important; - padding: 0 24px 12px 24px; -} - -#starlight__on-this-page ul { - color: var(--color-text-strong) !important; - font-size: 16px !important; -} - -.middle-group .links { - color: var(--color-icon); - text-decoration: none; - text-transform: none; - font-size: 16px; - display: none !important; -} - -.middle-group .links:hover { - text-decoration: underline; - text-underline-offset: 4px; - text-decoration-thickness: 1px; -} - -nav.sidebar ul.top-level > li > details > summary .group-label > span { - margin-top: 24px !important; - color: var(--color-text-strong) !important; - text-transform: none !important; - font-weight: 500 !important; -} - -.content-panel { - padding: 2rem 3rem !important; - - @media (max-width: 768px) { - padding: 1rem 1.5rem !important; - } -} - -.expressive-code { - margin: 0.75rem 0 3rem 0 !important; - border-radius: 6px; -} - -.expressive-code figure { - background: var(--color-background-weak) !important; -} - -.expressive-code .frame { - box-shadow: none; -} - -@media (prefers-color-scheme: dark) { - .shiki, - .shiki span { - color: var(--shiki-dark) !important; - background-color: var(--shiki-dark-bg) !important; - /* Optional, if you also want font styles */ - font-style: var(--shiki-dark-font-style) !important; - font-weight: var(--shiki-dark-font-weight) !important; - text-decoration: var(--shiki-dark-text-decoration) !important; - } -} diff --git a/packages/web/src/types/lang-map.d.ts b/packages/web/src/types/lang-map.d.ts deleted file mode 100644 index 6df26d6a00..0000000000 --- a/packages/web/src/types/lang-map.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -declare module "lang-map" { - /** Returned by calling `map()` */ - export interface MapReturn { - /** All extensions keyed by language name */ - extensions: Record - /** All languages keyed by file-extension */ - languages: Record - } - - /** - * Calling `map()` gives you the raw lookup tables: - * - * ```js - * const { extensions, languages } = map(); - * ``` - */ - function map(): MapReturn - - /** Static method: get extensions for a given language */ - namespace map { - function extensions(language: string): string[] - /** Static method: get languages for a given extension */ - function languages(extension: string): string[] - } - - export = map -} diff --git a/packages/web/src/types/starlight-virtual.d.ts b/packages/web/src/types/starlight-virtual.d.ts deleted file mode 100644 index ba6bfb299d..0000000000 --- a/packages/web/src/types/starlight-virtual.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -declare module "virtual:starlight/user-images" { - export const logos: { - dark?: { - src: string - width: number - height: number - } - light?: { - src: string - width: number - height: number - } - } -} diff --git a/packages/web/sst-env.d.ts b/packages/web/sst-env.d.ts deleted file mode 100644 index 64441936d7..0000000000 --- a/packages/web/sst-env.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* This file is auto-generated by SST. Do not edit. */ -/* tslint:disable */ -/* eslint-disable */ -/* deno-fmt-ignore-file */ -/* biome-ignore-all lint: auto-generated */ - -/// - -import "sst" -export {} \ No newline at end of file diff --git a/packages/web/tsconfig.json b/packages/web/tsconfig.json deleted file mode 100644 index 9736038720..0000000000 --- a/packages/web/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "astro/tsconfigs/strict", - "include": [".astro/types.d.ts", "**/*"], - "exclude": ["dist"], - "compilerOptions": { - "jsx": "preserve", - "jsxImportSource": "solid-js" - } -}