Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion docs-site/src/content/docs/guides/integrations.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: Connect opencodex to OpenCode, Pi, OMP, Hermes, OpenClaw, Kimi Code
---

The **Connect** page writes opencodex's provider block into a client's own config
file, and removes it again. Eighteen clients work this way, each with a switch:
file, and removes it again. Nineteen clients work this way, each with a switch:

| Client | Config file | Format | When the change takes effect | Credential |
|---|---|---|---|---|
Expand All @@ -22,6 +22,7 @@ file, and removes it again. Eighteen clients work this way, each with a switch:
| Aside | `~/.aside/u/<account>/models.json` | JSON | after fully quitting and reopening Aside | loopback placeholder |
| Raycast | `~/.config/raycast/ai/providers.yaml` | YAML | immediately on save — Raycast watches the file | none — loopback only |
| omo (Pi / senpi) | `~/.omo/agent/models.json` | JSON | new sessions | loopback placeholder |
| Qoder | `settings.json` in `$QODER_CONFIG_DIR`, default `~/.qoder` | JSON | new sessions | loopback placeholder |
| Cline CLI | `~/.cline/data/settings/providers.json` and sibling `models.json` | JSON pair | after stopping and restarting Cline | loopback placeholder |
| Kilo | first existing `kilo.jsonc`, `kilo.json`, `opencode.jsonc`, `opencode.json`, or `config.json` under `~/.config/kilo` | JSONC | new sessions | `OPENCODEX_KILO_API_KEY` |
| Command Code | `~/.commandcode/providers.json` (on Windows with the default home: use `HOME ?? USERPROFILE` only if nonblank and Windows-absolute, otherwise `homedir()`; a separately supplied home is preserved; append `.commandcode\providers.json`) | JSON | next launch of Command Code | none — keyless loopback (`apiKey: false`) |
Expand All @@ -33,6 +34,25 @@ file, and removes it again. Eighteen clients work this way, each with a switch:
[omo (Codex / LazyCodex) role models](#omo-codex--lazycodex-role-models). OpenCode-based omo
(oh-my-opencode) keeps its own config under OpenCode; opencodex does not read or write it.

Qoder IDE / qodercli supports export and managed configuration through the Dashboard and CLI:

```bash
ocx export --client qoder --json
ocx integration client enable --client qoder
ocx integration client disable --client qoder
```

Qoder uses `settings.json` in `QODER_CONFIG_DIR` when that variable is set, and
`~/.qoder/settings.json` otherwise; a relative `QODER_CONFIG_DIR` is refused. Enable merges `providers.opencodex` and
OpenCodex entries in `modelConfigs.customModels`, preserving other providers, custom models,
and settings. Disable removes the recorded OpenCodex entries; restore uses the existing
snapshot workflow. The provider's default model is the first model in the sorted export.
Custom models use their catalog context window, falling back to 128000 input tokens.
The generated API key is a non-secret placeholder: Qoder integration requires loopback
access and refuses an authenticated non-loopback bind. When the dedicated unauthenticated
loopback listener is enabled, exports point Qoder at that listener. `ocx sync` and catalog
changes refresh an already enabled Qoder integration like the other managed clients.

Generated catalogs include only enabled models from each provider selection. This applies to both
downloads and managed integrations, including Pi and Aside. The management model list still shows
the full roster so you can enable additional models.
Expand Down
1 change: 1 addition & 0 deletions gui/src/app-routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ export const INTEGRATION_TAB_HASHES = [
"integrations/cline",
"integrations/kilo",
"integrations/droid",
"integrations/qoder",
] as const;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
* with EXPORT_CLIENT_IDS by hand; adding a client server-side renders no row
* until this tuple changes.
*/
export const CLIENTS = ["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid"] as const;
export const CLIENTS = ["qoder", "opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid"] as const;
export type ExportClientId = (typeof CLIENTS)[number];

export const CLIENT_LABEL_KEYS = {
qoder: "api.clientConfig.clientQoder",
opencode: "api.clientConfig.clientOpencode",
pi: "api.clientConfig.clientPi",
omp: "api.clientConfig.clientOmp",
Expand Down Expand Up @@ -64,6 +65,7 @@ export const CLIENT_LABEL_KEYS = {
* names them.
*/
export const CLIENT_MARKS: Partial<Record<ExportClientId, string>> = {
qoder: "/provider-icons/qoder.svg",
opencode: "/provider-icons/opencode.svg",
pi: "/provider-icons/pi.svg",
omp: "/provider-icons/oh-my-pi.svg",
Expand Down
1 change: 1 addition & 0 deletions gui/src/components/integration-marks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ export const INTEGRATION_MARKS: Record<OverviewClientId, string | null> = {
commandcode: CLIENT_MARKS.commandcode ?? null,
kilo: CLIENT_MARKS.kilo ?? null,
droid: CLIENT_MARKS.droid ?? null,
qoder: CLIENT_MARKS.qoder ?? null,
};

/**
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1567,6 +1567,9 @@ export const de: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "Verwaltet OpenCodex-Anbieter und eigene Modelle in ~/.qoder/settings.json. Erfordert Loopback-Zugriff. Andere Einstellungen bleiben erhalten; Rückgängig stellt den Snapshot wieder her.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2135,6 +2135,9 @@ export const en = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "Manages OpenCodex providers and custom models in ~/.qoder/settings.json. Requires loopback access. Other settings are preserved; Undo restores the snapshot.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2107,6 +2107,9 @@ export const fr: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "Gère les fournisseurs OpenCodex et les modèles personnalisés dans ~/.qoder/settings.json. Nécessite qu’opencodex soit joignable sur une adresse de bouclage. Les autres paramètres sont conservés ; Annuler restaure la sauvegarde.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2002,6 +2002,9 @@ export const ja: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "~/.qoder/settings.json の OpenCodex プロバイダーとカスタムモデルを管理します。ループバック接続が必要です。他の設定は保持され、元に戻すとスナップショットが復元されます。",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1611,6 +1611,9 @@ export const ko: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "~/.qoder/settings.json의 OpenCodex 공급자와 사용자 지정 모델을 관리합니다. 루프백 접근이 필요합니다. 다른 설정은 유지되며 실행 취소 시 스냅샷을 복원합니다.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2121,6 +2121,7 @@ export const pt: Record<TKey, string> = {
"integrations.tab.cline": "Cline CLI",
"integrations.tab.commandcode": "Command Code",
"integrations.tab.kilo": "Kilo",
"integrations.tab.qoder": "Qoder",
"integrations.tab.droid": "Factory Droid",
"integrations.aside.profilesTitle": "Perfis do Aside",
"integrations.aside.profilesHint": "Escolha quais perfis recebem os modelos selecionados. O perfil ativo do Aside permanece inalterado.",
Expand Down Expand Up @@ -2425,6 +2426,7 @@ export const pt: Record<TKey, string> = {
"integrations.lazycodexRoles.auto.moveUp": "Suba de nível se: {text}",
"integrations.lazycodexRoles.auto.moveDown": "Desça de nível se: {text}",
"integrations.semantics.cline": "Gerencia o OpenCodex no providers.json e no models.json do Cline CLI. Pare o Cline antes de alterar ou sincronizar esses arquivos e reinicie depois. Desfazer restaura os dois originais. Seu provedor padrão permanece inalterado; selecione o OpenCodex no Cline.",
"integrations.semantics.qoder": "Gerencia os provedores e modelos personalizados do OpenCodex em ~/.qoder/settings.json. Requer acesso por loopback. As demais configurações são preservadas; Desfazer restaura o snapshot.",
"integrations.semantics.commandcode": "Gerencia apenas a entrada do provedor OpenCodex em ~/.commandcode/providers.json. Seus outros provedores e configurações permanecem inalterados.",
"integrations.semantics.kilo": "Gerencia apenas provider.opencodex na configuração global do Kilo — o primeiro arquivo existente entre kilo.jsonc, kilo.json, opencode.jsonc, opencode.json ou config.json em ~/.config/kilo (XDG_CONFIG_HOME realoca esse diretório; kilo.jsonc é criado quando nenhum existe). As demais chaves permanecem inalteradas. Aplicar reescreve o arquivo inteiro, então comentários e vírgulas finais não são preservados. Selecione opencodex/<model> no Kilo.",
"integrations.semantics.droid": "Adiciona modelos personalizados do OpenCodex ao settings.json do Factory Droid. Desativar remove apenas as linhas gerenciadas; desfazer restaura o arquivo salvo.",
Expand Down Expand Up @@ -2975,6 +2977,7 @@ export const pt: Record<TKey, string> = {
"api.clientConfig.clientCline": "Cline CLI",
"api.clientConfig.clientCommandCode": "Command Code",
"api.clientConfig.clientKilo": "Kilo",
"api.clientConfig.clientQoder": "Qoder",
"api.clientConfig.clientDroid": "Factory Droid",
"api.clientConfig.clineBundle": "Este é um pacote de dois arquivos, não um arquivo de configurações do Cline. Mescle settings em providers.json e catalog no models.json vizinho. Use o interruptor de integração para uma gravação com backup.",
"api.clientConfig.clineDownloaded": "{filename} baixado. Nada foi alterado ainda; settings e catalog pertencem a dois arquivos separados do Cline.",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2093,6 +2093,9 @@ export const ru: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "Управляет провайдерами OpenCodex и пользовательскими моделями в ~/.qoder/settings.json. Требуется доступ через loopback. Остальные настройки сохраняются; отмена восстанавливает снимок.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/tr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2120,6 +2120,9 @@ export const tr: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "~/.qoder/settings.json içindeki OpenCodex sağlayıcılarını ve özel modelleri yönetir. Loopback erişimi gerektirir. Diğer ayarlar korunur; Geri al, anlık görüntüyü geri yükler.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/vi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2083,6 +2083,9 @@ export const vi: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "Quản lý nhà cung cấp OpenCodex và mô hình tùy chỉnh trong ~/.qoder/settings.json. Yêu cầu truy cập loopback. Giữ nguyên các cài đặt khác; Hoàn tác khôi phục bản chụp.",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/zh-TW.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3019,6 +3019,9 @@ export const zhTW: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "管理 ~/.qoder/settings.json 中的 OpenCodex 供應商和自訂模型。需要回環存取。保留其他設定;復原會還原快照。",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
3 changes: 3 additions & 0 deletions gui/src/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1584,6 +1584,9 @@ export const zh: Record<TKey, string> = {
"integrations.tab.aside": "Aside",
"integrations.tab.raycast": "Raycast",
"integrations.tab.omo": "omo",
"integrations.tab.qoder": "Qoder",
"api.clientConfig.clientQoder": "Qoder",
"integrations.semantics.qoder": "管理 ~/.qoder/settings.json 中的 OpenCodex 提供商和自定义模型。需要回环访问。保留其他设置;撤销会恢复快照。",
"integrations.tab.cline": "Cline CLI",
"integrations.tab.kilo": "Kilo",
"integrations.tab.droid": "Factory Droid",
Expand Down
2 changes: 2 additions & 0 deletions gui/src/pages/integrations/FileIntegrationPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ const SEMANTICS_KEY: Record<FileIntegrationClientId, TKey> = {
cline: "integrations.semantics.cline",
kilo: "integrations.semantics.kilo",
droid: "integrations.semantics.droid",
qoder: "integrations.semantics.qoder",
};

const TAB_LABEL_KEY: Record<FileIntegrationClientId, TKey> = {
Expand All @@ -109,6 +110,7 @@ const TAB_LABEL_KEY: Record<FileIntegrationClientId, TKey> = {
cline: "integrations.tab.cline",
kilo: "integrations.tab.kilo",
droid: "integrations.tab.droid",
qoder: "integrations.tab.qoder",
};

type FileIntegrationPageProps = {
Expand Down
2 changes: 2 additions & 0 deletions gui/src/pages/integrations/integration-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { readJsonIfOk } from "../../fetch-json";
import { parseAsideProfileStatus, parseAsideProfileOutcomes, type AsideProfileOutcome } from "./aside-profile-contract";

export const FILE_INTEGRATION_CLIENTS = [
"qoder",
"opencode",
"pi",
"omp",
Expand Down Expand Up @@ -276,6 +277,7 @@ const PLAN_SCHEMA_PATHS = new Set([
"providers.opencodex",
"models.providers.opencodex",
"models.*",
"modelConfigs.customModels.*",
"llm-pi-ai.providers.opencodex",
"custom_provider.opencodex",
"providers.[id=opencodex]",
Expand Down
2 changes: 2 additions & 0 deletions gui/src/pages/integrations/integration-tabs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export const TABS: readonly TabDefinition[] = [
{ id: "aside", hash: "integrations/aside", labelKey: "integrations.tab.aside" },
{ id: "raycast", hash: "integrations/raycast", labelKey: "integrations.tab.raycast" },
{ id: "omo", hash: "integrations/omo", labelKey: "integrations.tab.omo" },
{ id: "qoder", hash: "integrations/qoder", labelKey: "integrations.tab.qoder" },
{ id: "cline", hash: "integrations/cline", labelKey: "integrations.tab.cline" },
{ id: "kilo", hash: "integrations/kilo", labelKey: "integrations.tab.kilo" },
{ id: "droid", hash: "integrations/droid", labelKey: "integrations.tab.droid" },
Expand All @@ -77,4 +78,5 @@ export const FILE_CLIENTS = new Set<FileIntegrationClientId>([
"cline",
"kilo",
"droid",
"qoder",
]);
1 change: 1 addition & 0 deletions gui/src/pages/integrations/overview-clients.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ const FILE_LABEL_KEY: Record<FileIntegrationClientId, TKey> = {
cline: "integrations.tab.cline",
kilo: "integrations.tab.kilo",
droid: "integrations.tab.droid",
qoder: "integrations.tab.qoder",
};

/** A file client's block is in the file for both `current` and `stale`. */
Expand Down
4 changes: 2 additions & 2 deletions gui/tests/client-config-panel.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ function rowButton(container: HTMLElement, name: string, label: string): HTMLBut
}

test("the API download surface includes DSH, MiniMax Code, Aside, Raycast and omo as clients", () => {
expect(CLIENTS).toEqual(["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid"]);
expect(CLIENTS).toEqual(["qoder", "opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid"]);
expect(CLIENT_LABEL_KEYS.dsh).toBe("api.clientConfig.clientDsh");
expect(CLIENT_LABEL_KEYS.mcode).toBe("api.clientConfig.clientMcode");
expect(CLIENT_LABEL_KEYS.zcode).toBe("api.clientConfig.clientZcode");
Expand Down Expand Up @@ -251,7 +251,7 @@ test("clients render as rows, not a switch", async () => {
expect(container.querySelector(".awi-clientconfig-segmented")).toBeNull();
const names = [...container.querySelectorAll(".awi-clientconfig-name")].map(el => el.textContent);
// Row order follows the registry, so a new client appears without a code change here.
expect(names?.slice(0, 2)).toEqual(["OpenCode", "Pi"]);
expect(names?.slice(0, 2)).toEqual(["Qoder", "OpenCode"]);
expect(names).toHaveLength(CLIENTS.length);
// Each row states where its file goes; a Download with no destination is the
// ambiguity the announcement text works to prevent.
Expand Down
3 changes: 3 additions & 0 deletions gui/tests/fr-localization.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,9 @@ const INTENTIONAL_ENGLISH = new Set<TKey>([
// Factory Droid is a product name, identical in every locale.
"integrations.tab.droid",
"api.clientConfig.clientDroid",
// Qoder is a product name, identical in every locale.
"integrations.tab.qoder",
"api.clientConfig.clientQoder",
"models.reasoningEffort.minimal",
"models.reasoningEffort.max",
"models.reasoningEffort.ultra",
Expand Down
2 changes: 1 addition & 1 deletion gui/tests/integrations-api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const originalFetch = globalThis.fetch;

test("all registered export clients include Cline in file integrations", () => {
expect(FILE_INTEGRATION_CLIENTS).toEqual([
"opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid",
"qoder", "opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae", "dsh", "mcode", "zcode", "commandcode", "prime", "aside", "raycast", "omo", "cline", "kilo", "droid",
]);
});

Expand Down
3 changes: 3 additions & 0 deletions gui/tests/locale-parity.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,9 @@ const ZH_TW_KEEP_ENGLISH: ReadonlySet<string> = new Set([
"integrations.tab.kilo",
"api.clientConfig.clientKilo",
"api.clientConfig.clientDroid",
// Qoder is a product name, identical in every locale.
"integrations.tab.qoder",
"api.clientConfig.clientQoder",
// Command Code is a product name, identical in every locale.
"integrations.tab.commandcode",
"api.clientConfig.clientCommandCode",
Expand Down
2 changes: 1 addition & 1 deletion scripts/test-layout/layout.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@
"cli-kiro-auto-selection.test.ts": "cli", "codebuddy-live-models.test.ts": "providers", "kiro-auto-selection.test.ts": "providers/kiro", "kiro-quota-metrics.test.ts": "providers/kiro", "management-provider-request-pacing.test.ts": "server",
"cli-restart-handoff.test.ts": "cli",
"restart-replacement.test.ts": "server", "deepseek-artifact-tool-schema.test.ts": "providers",
"client-config-export-output-limit.test.ts": "config", "responses-skills-snapshot.test.ts": "responses", "responses-code-mode-mcp-direct.test.ts": "responses", "local-read-response-proof.test.ts": "server",
"client-config-export-output-limit.test.ts": "config", "qoder-client.test.ts": "clients", "responses-skills-snapshot.test.ts": "responses", "responses-code-mode-mcp-direct.test.ts": "responses", "local-read-response-proof.test.ts": "server",
"claude-desktop-system-proxy.test.ts": "claude-integration", "codex-config-drift-heal.test.ts": "codex-integration",
"openai-chat-serialized-tool-call-scaling.test.ts": "adapters/openai",
"openai-chat-tool-call-id-remint.test.ts": "adapters/openai",
Expand Down
Loading
Loading