From 84e32025565266f8c7a0da4f6b81d090eb526b41 Mon Sep 17 00:00:00 2001 From: n3wr1ch <40690535+n3wr1ch@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:33:54 +0900 Subject: [PATCH 1/3] feat(integrations): add OMP client support --- .../src/content/docs/guides/integrations.md | 14 +++-- .../content/docs/ja/reference/cli/agents.md | 12 ++-- .../docs/ja/reference/management-api.md | 2 +- .../content/docs/ko/reference/cli/agents.md | 12 ++-- .../docs/ko/reference/management-api.md | 2 +- .../src/content/docs/reference/cli/agents.md | 43 ++++++++----- .../content/docs/reference/management-api.md | 2 +- .../content/docs/ru/reference/cli/agents.md | 27 ++++---- .../docs/ru/reference/management-api.md | 2 +- .../docs/zh-cn/reference/cli/agents.md | 12 ++-- .../docs/zh-cn/reference/management-api.md | 2 +- gui/src/app-routing.ts | 1 + .../client-config-clients.ts | 3 +- gui/src/i18n/de.ts | 15 +++-- gui/src/i18n/en.ts | 15 +++-- gui/src/i18n/ja.ts | 15 +++-- gui/src/i18n/ko.ts | 15 +++-- gui/src/i18n/ru.ts | 15 +++-- gui/src/i18n/zh.ts | 15 +++-- gui/src/pages/Integrations.tsx | 2 + .../integrations/FileIntegrationPage.tsx | 2 + gui/src/pages/integrations/integration-api.ts | 1 + .../pages/integrations/overview-clients.ts | 3 +- gui/tests/client-config-panel.test.tsx | 12 ++-- gui/tests/integrations-overview-rows.test.ts | 6 +- src/cli/export-command.ts | 4 +- src/cli/help.ts | 10 +-- src/clients/config-export.ts | 62 +++++++++++++++++++ src/integrations/registry.ts | 7 +++ tests/cli-export-command.test.ts | 2 +- .../client-config-export-new-clients.test.ts | 4 +- tests/client-config-export.test.ts | 44 ++++++++++++- tests/integrations-invariants.test.ts | 9 +-- tests/integrations-state.test.ts | 4 +- tests/management-client-config-route.test.ts | 17 +++++ 35 files changed, 295 insertions(+), 118 deletions(-) diff --git a/docs-site/src/content/docs/guides/integrations.md b/docs-site/src/content/docs/guides/integrations.md index c917fd273a..a11ebd2fa2 100644 --- a/docs-site/src/content/docs/guides/integrations.md +++ b/docs-site/src/content/docs/guides/integrations.md @@ -1,23 +1,25 @@ --- title: Integrations -description: Connect opencodex to OpenCode, Pi, Hermes, OpenClaw, Kimi Code and Gajae Code from the dashboard — one switch per client, with a backup taken before every write. +description: Connect opencodex to OpenCode, Pi, OMP, Hermes, OpenClaw, Kimi Code and Gajae Code from the dashboard — one switch per client, with a backup taken before every write. --- The **Integrations** tab writes opencodex's provider block into a client's own config -file, and removes it again. Six clients work this way, each with a switch: +file, and removes it again. Seven clients work this way, each with a switch: | Client | Config file | Format | When the change takes effect | Credential | |---|---|---|---|---| | OpenCode | `~/.config/opencode/opencode.json` | JSON | next direct launch | `OPENCODEX_OPENCODE_API_KEY` | -| Pi | `~/.pi/agent/models.json` | JSON | new sessions | `OPENCODEX_API_KEY` | +| Pi | `~/.pi/agent/models.json` | JSON | new sessions | loopback placeholder | +| OMP | `~/.omp/agent/models.yml` | YAML | after restarting OMP | loopback placeholder | | Hermes | `~/.hermes/config.yaml` | YAML | new sessions | `OPENCODEX_HERMES_API_KEY` | | OpenClaw | `~/.openclaw/openclaw.json` | JSON5 | immediately, on a running gateway | `OPENCODEX_OPENCLAW_API_KEY` | | Kimi Code | `~/.kimi-code/config.toml` | TOML | on restart, or `/reload` | loopback placeholder | | Gajae Code | `~/.gjc/agent/models.yml` | YAML | new sessions, or when you open `/model` |`OPENCODEX_GAJAE_API_KEY` | Paths honor each client's own environment override where it has one, so a relocated -`HERMES_HOME`, `KIMI_CODE_HOME` or `XDG_CONFIG_HOME` is followed rather than guessed -at. The table lists each client's default; an override always wins. +`HERMES_HOME`, `KIMI_CODE_HOME`, `XDG_CONFIG_HOME`, `PI_CODING_AGENT_DIR`, `PI_CONFIG_DIR` +or active `OMP_PROFILE` is followed rather than guessed at. The table lists each client's +default; an override always wins. OpenClaw has several, and they do different jobs. `OPENCLAW_CONFIG_PATH` selects the file; `OPENCLAW_STATE_DIR`, `OPENCLAW_PROFILE` and `OPENCLAW_HOME` select the state @@ -75,7 +77,7 @@ changed value and calling it success. You will see the file named and nothing on disk will have moved. Editing that file by hand still works; it is only our automatic rewrite that declines. -**Pi, Kimi Code and Gajae Code only work against a loopback bind.** None of their config +**Pi, OMP, Kimi Code and Gajae Code only work against a loopback bind.** None of their config schemas has a place for the `x-opencodex-api-key` header that a non-loopback bind requires, so a generated config would simply be rejected — and writing one by hand does not help, because there is nowhere in the file to put the header either. Reaching a diff --git a/docs-site/src/content/docs/ja/reference/cli/agents.md b/docs-site/src/content/docs/ja/reference/cli/agents.md index c970804e7b..783e274529 100644 --- a/docs-site/src/content/docs/ja/reference/cli/agents.md +++ b/docs-site/src/content/docs/ja/reference/cli/agents.md @@ -125,7 +125,7 @@ Grok Build モデル フェンスを管理および適用します。 ## クライアント設定のエクスポート -### `ocx export --client ` +### `ocx export --client ` 実行中のプロキシに接続されているクライアント設定を出力します。 opencode と [円周率](/guides/pi/) は環境変数ではなく独自の JSON 設定からプロバイダーを読み取るため、このコマンドは `opencodex` プロバイダー ブロック (ベース URL、モデル リスト、クライアントの環境参照) をシリアル化し、そのファイルにマージできるようにします。 @@ -141,23 +141,25 @@ Grok Build モデル フェンスを管理および適用します。 ```bash ocx export --client opencode # config plus destination, merge warning, and counts ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff +ocx export --client omp --json > omp-models.yml # OMP models.yml provider block ocx export --client opencode --out ~/opencodex-opencode.json ``` -`--json` がない場合、JSON が先頭に続き、正規の宛先パス、マージ警告、環境エクスポート行、およびコンテキスト制限を省略する行数を含むモデル数が続きます (クライアントはこれらに対して独自のデフォルトを適用します)。 +`--json` がない場合、JSON が先頭に続き、正規の宛先パス、マージ警告、クライアント固有の起動前ガイダンス、およびコンテキスト制限を省略する行数を含むモデル数が続きます (クライアントはこれらに対して独自のデフォルトを適用します)。 |クライアント |正規の宛先 |ダウンロードファイル名 |環境変数 | | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json` (設定すると `XDG_CONFIG_HOME` が勝ち) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | -| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | `OPENCODEX_API_KEY` | +| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | なし - ブロックにリテラル `opencodex-loopback` が入ります | +| `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | なし - loopback placeholder | -2 つの環境変数名は異なり、各クライアントは独自の名前のみを補間します。 opencode は `{env:OPENCODEX_OPENCODE_API_KEY}` を読み取ります。 Pi は `$OPENCODEX_API_KEY` を読み取ります。 +opencode は `{env:OPENCODEX_OPENCODE_API_KEY}` を補間します。opencodex が生成する Pi のエクスポートには環境変数が不要で、リテラルのプレースホルダー `opencodex-loopback` が入ります。この値は必須です。Pi はモデル リストを構築する際に `apiKey` を解決し、既存の設定に未設定の環境変数参照がある場合はプロバイダー全体を隠すためです。ループバックでは、生成されたプレースホルダーをプロキシが検査することはありません。 :::caution[マージし、決して置き換えないでください] `ocx export` は実際のクライアント設定を書き込むことはありません。宛先は手動でマージできるように出力されます。`--out` は、`--force` なしで既存のファイルを上書きすることを拒否します。これは、設定を置き換えると、その中にすでに含まれている他のプロバイダー、エージェント、および MCP エントリが破壊されるためです。 ::: -キーはシリアル化されません。設定にはクライアントの環境参照のみが含まれるため、シークレットは環境内に残ります。ループバック プロキシ (`127.0.0.1`、デフォルト) にはアドミッション キーはまったく必要ありません。参照は単に使用されないだけです。プロキシがループバックを超えてバインドする場合にのみ変数を設定します。アドミッションキーの発行方法については、[リモートアクセス](/reference/configuration/#remote-access) を参照してください。上流プロバイダー自体のキーは完全に別のものであり、[プロバイダー](/guides/providers/) ごとに構成されます。 +キーはシリアル化されません。opencode の設定には環境参照のみが含まれるためシークレットは環境内に残り、Pi の設定には認証情報ではなくプレースホルダーが入ります。ループバック プロキシ (`127.0.0.1`、デフォルト) にはアドミッション キーはまったく必要ありません。opencode の変数は、プロキシがループバックを超えてバインドする場合にのみ設定します。アドミッションキーの発行方法については、[リモートアクセス](/reference/configuration/#remote-access) を参照してください。上流プロバイダー自体のキーは完全に別のものであり、[プロバイダー](/guides/providers/) ごとに構成されます。 同じペイロードが `GET /api/client-config` によって提供され、ダッシュボードの [API] タブにレンダリングされるため、CLI、API、および GUI は同じバイトを使用します。 diff --git a/docs-site/src/content/docs/ja/reference/management-api.md b/docs-site/src/content/docs/ja/reference/management-api.md index 56f23e6146..262f2d0e54 100644 --- a/docs-site/src/content/docs/ja/reference/management-api.md +++ b/docs-site/src/content/docs/ja/reference/management-api.md @@ -130,7 +130,7 @@ Authorization: Bearer | --- | --- | --- | | `GET /api/catalog` |インストールされている Codex カタログ ドキュメントを返します | 404 カタログが見つかりません | | `GET /api/models` |ダッシュボード/CLI モデルの行を返す |収集が飽和したときの `catalog_busy` | -| `GET /api/client-config?client=...` |読み取り専用の OpenCode または Pi クライアント構成ドキュメントを作成する | 400 クライアントがサポートされていません。 503 カタログは利用できません | +| `GET /api/client-config?client=...` |サポートされているファイル連携の読み取り専用クライアント設定を作成する | 400 クライアントがサポートされていません。 503 カタログは利用できません | | `PUT /api/disabled-models` |共有の無効モデル リストを置き換える | 400 無効な JSON | | `PUT /api/model-visibility` |プロバイダーレベルまたはモデルレベルの可視性をアトミックに変更 | 400 プロバイダー、スコープ、ターゲット、または本文が無効です。 | `GET, POST /api/custom-models` |カスタム モデルをリストするか追加する | 400 個の無効なフィールド。 404 プロバイダーがありません。 409 複製モデル | diff --git a/docs-site/src/content/docs/ko/reference/cli/agents.md b/docs-site/src/content/docs/ko/reference/cli/agents.md index 13f95f948f..c45aea4674 100644 --- a/docs-site/src/content/docs/ko/reference/cli/agents.md +++ b/docs-site/src/content/docs/ko/reference/cli/agents.md @@ -131,7 +131,7 @@ Grok Build model fence를 관리하고 적용합니다. ## 클라이언트 설정 내보내기 -### `ocx export --client ` +### `ocx export --client ` 실행 중인 프록시에 연결된 client config를 출력합니다. opencode와 [Pi](/guides/pi/)는 environment variable이 아니라 각자의 JSON config에서 provider를 읽으므로, 이 명령은 `opencodex` provider block, 즉 base URL, model list, 그리고 client의 env reference를 직렬화해서 해당 파일에 병합할 수 있게 해줍니다. @@ -147,23 +147,25 @@ Grok Build model fence를 관리하고 적용합니다. ```bash ocx export --client opencode # config plus destination, merge warning, and counts ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff +ocx export --client omp --json > omp-models.yml # OMP models.yml provider block ocx export --client opencode --out ~/opencodex-opencode.json ``` -`--json`이 없으면 JSON이 먼저 나오고, 그다음 표준 대상 경로, merge 경고, env export 줄, 그리고 context limit을 생략한 row 수를 포함한 model count가 이어집니다(이 경우 client는 자체 기본값을 적용합니다). +`--json`이 없으면 JSON이 먼저 나오고, 그다음 표준 대상 경로, merge 경고, 해당 client에 env 변수가 있는 경우 env export 줄, 그리고 context limit을 생략한 row 수를 포함한 model count가 이어집니다(이 경우 client는 자체 기본값을 적용합니다). | 클라이언트 | 표준 대상 경로 | 다운로드 파일명 | 환경 변수 | | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME`이 설정되어 있으면 우선합니다) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | -| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | `OPENCODEX_API_KEY` | +| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | 없음 - 블록에 리터럴 `opencodex-loopback`이 들어갑니다 | +| `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | 없음 - loopback placeholder | -두 환경 변수 이름은 서로 다르며, 각 client는 자기 것만 보간합니다. opencode는 `{env:OPENCODEX_OPENCODE_API_KEY}`를 읽고, Pi는 `$OPENCODEX_API_KEY`를 읽습니다. +opencode는 `{env:OPENCODEX_OPENCODE_API_KEY}`를 보간합니다. opencodex가 생성한 Pi 블록에는 환경 변수가 필요 없으며, 리터럴 placeholder인 `opencodex-loopback`이 들어갑니다. 이 값은 필수입니다. Pi는 모델 목록을 만들 때 `apiKey`를 해석하고, 기존 config에 설정되지 않은 env 참조가 있으면 provider 전체를 숨기기 때문입니다. 루프백에서 proxy는 생성된 placeholder를 검사하지 않습니다. :::caution[Merge, never replace] `ocx export`는 실제 client config를 절대 쓰지 않습니다. 대상 경로는 손으로 병합하라고 출력되며, `--out`은 `--force` 없이 기존 파일을 덮어쓰지 않습니다. config를 바꾸어 덮어쓰면 이미 들어 있던 다른 provider, agent, MCP entry가 사라지기 때문입니다. ::: -어떤 key도 직렬화되지 않습니다. config에는 client의 env reference만 들어가므로 secret은 환경 변수에 남습니다. loopback proxy(`127.0.0.1`, 기본값)는 admission key가 전혀 필요하지 않습니다. reference는 단지 사용되지 않을 뿐입니다. proxy가 loopback을 넘어 바인딩할 때만 변수를 설정하십시오. admission key가 어떻게 발급되는지는 [Remote access](/reference/configuration/#remote-access)를 보십시오. upstream provider 자체의 key는 완전히 별개의 것으로, 각 [Providers](/guides/providers/)에 맞게 설정합니다. +어떤 key도 직렬화되지 않습니다. opencode config에는 env reference만 들어가므로 secret은 환경 변수에 남고, Pi config에는 인증 정보가 아니라 placeholder가 들어갑니다. loopback proxy(`127.0.0.1`, 기본값)는 admission key가 전혀 필요하지 않습니다. opencode 변수는 proxy가 loopback을 넘어 바인딩할 때만 설정하십시오. admission key가 어떻게 발급되는지는 [Remote access](/reference/configuration/#remote-access)를 보십시오. upstream provider 자체의 key는 완전히 별개의 것으로, 각 [Providers](/guides/providers/)에 맞게 설정합니다. 같은 payload는 `GET /api/client-config`로 제공되고 dashboard의 API 탭에도 렌더링되므로, CLI, API, GUI가 모두 같은 바이트를 사용합니다. diff --git a/docs-site/src/content/docs/ko/reference/management-api.md b/docs-site/src/content/docs/ko/reference/management-api.md index 334c73f094..2df6d9ccfc 100644 --- a/docs-site/src/content/docs/ko/reference/management-api.md +++ b/docs-site/src/content/docs/ko/reference/management-api.md @@ -130,7 +130,7 @@ Authorization: Bearer | --- | --- | --- | | `GET /api/catalog` | 설치된 Codex catalog 문서를 반환합니다 | 404 catalog 없음 | | `GET /api/models` | 대시보드/CLI model 행을 반환합니다 | 수집이 포화 상태이면 `catalog_busy` | -| `GET /api/client-config?client=...` | 읽기 전용 OpenCode 또는 Pi client-config 문서를 만듭니다 | 400 지원되지 않는 client; 503 catalog 사용 불가 | +| `GET /api/client-config?client=...` | 지원되는 파일 연동의 읽기 전용 client config를 만듭니다 | 400 지원되지 않는 client; 503 catalog 사용 불가 | | `PUT /api/disabled-models` | 공유 disabled-model 목록을 교체합니다 | 400 잘못된 JSON | | `PUT /api/model-visibility` | provider 또는 model 수준의 visibility를 원자적으로 변경합니다 | 400 잘못된 provider, scope, target, 또는 본문 | | `GET, POST /api/custom-models` | custom model을 나열하거나 하나를 추가합니다 | 400 잘못된 필드; 404 provider 없음; 409 중복 model | diff --git a/docs-site/src/content/docs/reference/cli/agents.md b/docs-site/src/content/docs/reference/cli/agents.md index 4944a483d2..3b23b95a2d 100644 --- a/docs-site/src/content/docs/reference/cli/agents.md +++ b/docs-site/src/content/docs/reference/cli/agents.md @@ -146,40 +146,48 @@ Manage and apply the Grok Build model fence. ## Client config export -### `ocx export --client ` +### `ocx export --client ` -Print a client config wired to the running proxy. opencode and [Pi](/guides/pi/) read providers -from their own JSON config rather than environment variables, so this command serializes the -`opencodex` provider block — base URL, model list, and the client's env reference — for you to -merge into that file. +Print a client config wired to the running proxy. The command serializes the +`opencodex` provider block — base URL, model list, and the client's credential +reference or loopback placeholder — in the selected client's native format. The proxy must be running; the command resolves its live port, reads `/api/models`, and emits only models Codex can currently see. | Flag | Action | | --- | --- | -| `--client ` | Required. Selects the client dialect: opencode's keyed `provider` object or Pi's `providers` array. | -| `--json` | Print only the config JSON on stdout, so a redirect captures byte-exact output. Every diagnostic, including the `--out` write note, goes to stderr. | +| `--client ` | Required. Selects the client config dialect. | +| `--json` | Print only the generated config bytes on stdout, so a redirect captures byte-exact output. Every diagnostic, including the `--out` write note, goes to stderr. | | `--out ` | Write the config to ``. Refuses to replace an existing file. | | `--force` | Allow `--out` to replace an existing file. | ```bash ocx export --client opencode # config plus destination, merge warning, and counts ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff +ocx export --client omp --json > omp-models.yml # OMP models.yml provider block ocx export --client opencode --out ~/opencodex-opencode.json ``` -Without `--json` the JSON leads, then the canonical destination path, the merge warning, the env -export line, and a model count with how many rows omit context limits (the client applies its own -defaults for those). +Without `--json` the generated config leads, then the canonical destination path, the merge warning, the env +export line where the client has one, and a model count with how many rows omit context limits (the +client applies its own defaults for those). | Client | Canonical destination | Download filename | Env var | | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME` wins when set) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | -| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | `OPENCODEX_API_KEY` | - -The two env var names are different, and each client only interpolates its own. opencode reads -`{env:OPENCODEX_OPENCODE_API_KEY}`; Pi reads `$OPENCODEX_API_KEY`. +| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | none — the block carries the literal `opencodex-loopback` | +| `omp` | `~/.omp/agent/models.yml` (`OMP_PROFILE`, `PI_CONFIG_DIR`, and `PI_CODING_AGENT_DIR` are honored) | `omp-models.yaml` | none — loopback placeholder | +| `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | +| `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | +| `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | none — loopback placeholder | +| `gajae` | `~/.gjc/agent/models.yml` | `gajae-models.yaml` | `OPENCODEX_GAJAE_API_KEY` | + +opencode interpolates `{env:OPENCODEX_OPENCODE_API_KEY}`. The generated Pi and OMP exports do +not require an environment variable: each carries the literal `opencodex-loopback` placeholder. +This is load-bearing because both clients resolve `apiKey` while building their model lists and +hide the whole provider when an existing config contains an unset env reference. The proxy never +checks the generated placeholder on loopback. :::caution[Merge, never replace] `ocx export` never writes your real client config. The destination is printed for you to merge by @@ -187,9 +195,10 @@ hand, and `--out` refuses to overwrite an existing file without `--force`, becau config destroys the other providers, agents, and MCP entries already in it. ::: -No key is ever serialized. The config carries only the client's env reference, so the secret stays -in your environment. A loopback proxy (`127.0.0.1`, the default) requires no admission key at all — -the reference is simply unused. Set the variable only when the proxy binds beyond loopback; see +No key is ever serialized. Configs carry either a documented environment reference or a +non-secret loopback placeholder. A loopback proxy (`127.0.0.1`, the default) requires no +admission key at all. Set a referenced variable only when the client schema supports it and +the proxy binds beyond loopback; see [Remote access](/reference/configuration/#remote-access) for how admission keys are issued. Keys for the upstream providers themselves are a separate thing entirely, configured per [Providers](/guides/providers/). diff --git a/docs-site/src/content/docs/reference/management-api.md b/docs-site/src/content/docs/reference/management-api.md index 2635b719af..49f299a621 100644 --- a/docs-site/src/content/docs/reference/management-api.md +++ b/docs-site/src/content/docs/reference/management-api.md @@ -146,7 +146,7 @@ first and submit the returned digest. Prefer quarantine when recovery may be nee | --- | --- | --- | | `GET /api/catalog` | Return the installed Codex catalog document | 404 catalog not found | | `GET /api/models` | Return the dashboard/CLI model rows | `catalog_busy` when gathering is saturated | -| `GET /api/client-config?client=...` | Build a read-only OpenCode or Pi client-config document | 400 unsupported client; 503 catalog unavailable | +| `GET /api/client-config?client=...` | Build a read-only client config for any supported file integration | 400 unsupported client; 503 catalog unavailable | | `PUT /api/disabled-models` | Replace the shared disabled-model list | 400 invalid JSON | | `PUT /api/model-visibility` | Atomically change provider- or model-level visibility | 400 invalid provider, scope, target, or body | | `GET, POST /api/custom-models` | List custom models or add one | 400 invalid fields; 404 provider missing; 409 duplicate model | diff --git a/docs-site/src/content/docs/ru/reference/cli/agents.md b/docs-site/src/content/docs/ru/reference/cli/agents.md index 2d738ab9b4..6f69806235 100644 --- a/docs-site/src/content/docs/ru/reference/cli/agents.md +++ b/docs-site/src/content/docs/ru/reference/cli/agents.md @@ -152,7 +152,7 @@ override, но файлы на диске никогда не меняются. ## Экспорт client config -### `ocx export --client ` +### `ocx export --client ` Печатает client config, направленный на работающий прокси. opencode и [Pi](/guides/pi/) читают провайдеров из собственных JSON-конфигов, а не из переменных окружения, поэтому команда @@ -172,20 +172,25 @@ override, но файлы на диске никогда не меняются. ```bash ocx export --client opencode # config plus destination, merge warning, and counts ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff +ocx export --client omp --json > omp-models.yml # OMP models.yml provider block ocx export --client opencode --out ~/opencodex-opencode.json ``` -Без `--json` сначала идёт JSON, затем канонический путь назначения, предупреждение о merge, строка -экспорта переменной окружения и количество моделей с указанием, сколько строк не имеют context -limit'а (для них клиент применяет собственные default'ы). +Без `--json` сначала идёт JSON, затем канонический путь назначения, предупреждение о merge, +клиентская подсказка перед запуском и количество моделей с указанием, сколько строк не имеют +context limit'а (для них клиент применяет собственные default'ы). | Клиент | Канонический путь | Имя скачиваемого файла | Переменная окружения | | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME` имеет приоритет, если задан) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | -| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | `OPENCODEX_API_KEY` | +| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | нет — блок несёт литерал `opencodex-loopback` | +| `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | нет — loopback placeholder | -Имена этих двух env-переменных различаются, и каждый клиент интерполирует только свою. opencode -читает `{env:OPENCODEX_OPENCODE_API_KEY}`; Pi читает `$OPENCODEX_API_KEY`. +opencode интерполирует `{env:OPENCODEX_OPENCODE_API_KEY}`. Сгенерированный opencodex экспорт для +Pi не требует переменной окружения и несёт литеральную заглушку `opencodex-loopback`. Это значение +обязательно: Pi разрешает `apiKey`, когда строит список моделей, и прячет провайдера целиком, если +существующий конфиг содержит ссылку на незаданную переменную окружения. На loopback прокси не +проверяет сгенерированную заглушку. :::caution[Сливать, а не заменять] `ocx export` никогда не пишет в ваш реальный клиентский конфиг. Путь назначения лишь @@ -194,10 +199,10 @@ limit'а (для них клиент применяет собственные d MCP-записи. ::: -Никакой ключ никогда не сериализуется. Конфиг несёт только env-reference клиента, так что секрет -остаётся в вашем окружении. Loopback-прокси (`127.0.0.1`, по умолчанию) вообще не требует -admission key — ссылка просто остаётся неиспользованной. Задавайте переменную только если прокси -слушает не на loopback; как выдаются admission key, описано в +Никакой ключ никогда не сериализуется. Конфиг opencode несёт только env-reference, так что секрет +остаётся в вашем окружении, а конфиг Pi несёт заглушку вместо учётных данных. Loopback-прокси +(`127.0.0.1`, по умолчанию) вообще не требует admission key. Задавайте переменную opencode только +если прокси слушает не на loopback; как выдаются admission key, описано в [Удалённом доступе](/reference/configuration/#remote-access). Ключи upstream-провайдеров — это совсем отдельная история и настраиваются в [Провайдерах](/guides/providers/). diff --git a/docs-site/src/content/docs/ru/reference/management-api.md b/docs-site/src/content/docs/ru/reference/management-api.md index dbd13ac09a..1479105715 100644 --- a/docs-site/src/content/docs/ru/reference/management-api.md +++ b/docs-site/src/content/docs/ru/reference/management-api.md @@ -148,7 +148,7 @@ Endpoint'ы storage cleanup могут перемещать или навсег | --- | --- | --- | | `GET /api/catalog` | Вернуть установленный документ каталога Codex | 404 catalog not found | | `GET /api/models` | Вернуть model-row'ы для дашборда и CLI | `catalog_busy`, когда сборка перегружена | -| `GET /api/client-config?client=...` | Собрать read-only client-config document для OpenCode или Pi | 400 unsupported client; 503 catalog unavailable | +| `GET /api/client-config?client=...` | Собрать read-only client config для любой поддерживаемой файловой интеграции | 400 unsupported client; 503 catalog unavailable | | `PUT /api/disabled-models` | Полностью заменить общий список disabled-models | 400 invalid JSON | | `PUT /api/model-visibility` | Атомарно изменить видимость на уровне провайдера или модели | 400 invalid provider, scope, target or body | | `GET, POST /api/custom-models` | Показать список custom-моделей или добавить одну | 400 invalid fields; 404 provider missing; 409 duplicate model | diff --git a/docs-site/src/content/docs/zh-cn/reference/cli/agents.md b/docs-site/src/content/docs/zh-cn/reference/cli/agents.md index dc1960adb3..ac29040be0 100644 --- a/docs-site/src/content/docs/zh-cn/reference/cli/agents.md +++ b/docs-site/src/content/docs/zh-cn/reference/cli/agents.md @@ -126,7 +126,7 @@ ocx claude desktop import [--apply] Validate and import JSON ## Client config export -### `ocx export --client ` +### `ocx export --client ` 输出连接到正在运行代理的客户端配置。opencode 和 [Pi](/guides/pi/) 不是从环境变量,而是从各自的 JSON 配置中读取 providers,因此此命令会序列化 `opencodex` provider 块——基础 URL、模型列表以及客户端的环境引用——供你合并进那个文件。 @@ -142,23 +142,25 @@ ocx claude desktop import [--apply] Validate and import JSON ```bash ocx export --client opencode # config plus destination, merge warning, and counts ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff +ocx export --client omp --json > omp-models.yml # OMP models.yml provider block ocx export --client opencode --out ~/opencodex-opencode.json ``` -不使用 `--json` 时,JSON 会先输出,随后是规范目标路径、合并警告、环境变量导出行,以及一个模型计数,并标明有多少行省略了上下文限制(客户端会对这些项应用自己的默认值)。 +不使用 `--json` 时,JSON 会先输出,随后是规范目标路径、合并警告、客户端专属的启动前提示,以及一个模型计数,并标明有多少行省略了上下文限制(客户端会对这些项应用自己的默认值)。 | 客户端 | 规范目标路径 | 下载文件名 | 环境变量 | | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json`(设置了 `XDG_CONFIG_HOME` 时以其为准) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | -| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | `OPENCODEX_API_KEY` | +| `pi` | `~/.pi/agent/models.json` | `pi-models.json` | 无 - 块中携带字面值 `opencodex-loopback` | +| `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | 无 - loopback placeholder | -这两个环境变量名称不同,而且每个客户端只会插入自己的那个。opencode 读取 `{env:OPENCODEX_OPENCODE_API_KEY}`;Pi 读取 `$OPENCODEX_API_KEY`。 +opencode 会插值 `{env:OPENCODEX_OPENCODE_API_KEY}`。opencodex 生成的 Pi 导出不需要环境变量,而是携带字面占位值 `opencodex-loopback`。这个值是必需的:Pi 在构建模型列表时会解析 `apiKey`,如果已有配置包含未设置的环境变量引用,它就会隐藏整个 provider。回环上的代理从不校验生成的占位值。 :::caution[合并,不要替换] `ocx export` 从不写入你的真实客户端配置。该命令只会打印目标路径供你手动合并,而 `--out` 在没有 `--force` 的情况下拒绝覆盖已有文件,因为替换配置会破坏其中已有的其他 providers、agents 和 MCP 条目。 ::: -任何密钥都不会被序列化。配置里只包含客户端的环境引用,因此密钥仍保留在你的环境中。环回代理(`127.0.0.1`,默认值)根本不需要准入密钥——该引用只是不会被使用。只有当代理绑定到环回地址之外时才设置该变量;关于准入密钥如何签发,请参见 [远程访问](/reference/configuration/#remote-access)。上游 providers 自身的密钥则完全是另一回事,需要按 [Providers](/guides/providers/) 单独配置。 +任何密钥都不会被序列化。opencode 配置里只包含环境引用,因此密钥仍保留在你的环境中;Pi 配置里携带的是占位值而不是任何凭据。环回代理(`127.0.0.1`,默认值)根本不需要准入密钥。只有当代理绑定到环回地址之外时才需要设置 opencode 的那个变量;关于准入密钥如何签发,请参见 [远程访问](/reference/configuration/#remote-access)。上游 providers 自身的密钥则完全是另一回事,需要按 [Providers](/guides/providers/) 单独配置。 同一份负载会通过 `GET /api/client-config` 提供,并在仪表盘的 API 选项卡中渲染,因此 CLI、API 和 GUI 使用的是同一字节内容。 diff --git a/docs-site/src/content/docs/zh-cn/reference/management-api.md b/docs-site/src/content/docs/zh-cn/reference/management-api.md index 8f68041943..2822dcbf32 100644 --- a/docs-site/src/content/docs/zh-cn/reference/management-api.md +++ b/docs-site/src/content/docs/zh-cn/reference/management-api.md @@ -130,7 +130,7 @@ Authorization: Bearer | --- | --- | --- | | `GET /api/catalog` | 返回已安装的 Codex 目录文档 | 404 未找到目录 | | `GET /api/models` | 返回仪表板/CLI 模型行 | 收集饱和时返回 `catalog_busy` | -| `GET /api/client-config?client=...` | 构建只读的 OpenCode 或 Pi client-config 文档 | 400 不支持的客户端;503 目录不可用 | +| `GET /api/client-config?client=...` | 为任意支持的文件集成构建只读客户端配置 | 400 不支持的客户端;503 目录不可用 | | `PUT /api/disabled-models` | 替换共享的禁用模型列表 | 400 无效 JSON | | `PUT /api/model-visibility` | 原子性地更改 provider 级或 model 级可见性 | 400 provider、scope、target 或请求体无效 | | `GET, POST /api/custom-models` | 列出自定义模型或添加一个 | 400 字段无效;404 provider 缺失;409 模型重复 | diff --git a/gui/src/app-routing.ts b/gui/src/app-routing.ts index 7fc5cfea22..0d7df41ec8 100644 --- a/gui/src/app-routing.ts +++ b/gui/src/app-routing.ts @@ -76,6 +76,7 @@ export const INTEGRATION_TAB_HASHES = [ "integrations/grok", "integrations/opencode", "integrations/pi", + "integrations/omp", "integrations/hermes", "integrations/openclaw", "integrations/kimi", diff --git a/gui/src/components/apikeys-workspace/client-config-clients.ts b/gui/src/components/apikeys-workspace/client-config-clients.ts index dca09d8566..dc98871dbf 100644 --- a/gui/src/components/apikeys-workspace/client-config-clients.ts +++ b/gui/src/components/apikeys-workspace/client-config-clients.ts @@ -8,12 +8,13 @@ * with EXPORT_CLIENT_IDS by hand; adding a client server-side renders no row * until this tuple changes. */ -export const CLIENTS = ["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"] as const; +export const CLIENTS = ["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"] as const; export type ExportClientId = (typeof CLIENTS)[number]; export const CLIENT_LABEL_KEYS = { opencode: "api.clientConfig.clientOpencode", pi: "api.clientConfig.clientPi", + omp: "api.clientConfig.clientOmp", hermes: "api.clientConfig.clientHermes", openclaw: "api.clientConfig.clientOpenclaw", kimi: "api.clientConfig.clientKimi", diff --git a/gui/src/i18n/de.ts b/gui/src/i18n/de.ts index 7703f6c09f..cb05ddc73b 100644 --- a/gui/src/i18n/de.ts +++ b/gui/src/i18n/de.ts @@ -751,6 +751,7 @@ export const de: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -860,6 +861,7 @@ export const de: Record = { "integrations.kind.restore": "Wiederhergestellt", "integrations.semantics.opencode": "Gilt nur für direkte Starts von der Festplatte; die Umgebungsinjektion von ocx opencode hat Vorrang.", "integrations.semantics.pi": "Gilt für neue Sitzungen.", + "integrations.semantics.omp": "Starten Sie OMP neu, um den Katalog zu laden.", "integrations.semantics.hermes": "Gilt für neue Sitzungen.", "integrations.semantics.openclaw": "Wird sofort auf ein laufendes Gateway angewendet.", "integrations.semantics.kimi": "Zum Anwenden neu starten oder /reload ausführen (v2 überwacht die Datei).", @@ -1121,21 +1123,22 @@ export const de: Record = { "api.clientConfig.rowsLabel": "Client verbinden", "api.clientConfig.details": "Details", "api.clientConfig.detailsAria": "Details zur {client}-Konfiguration", - "api.clientConfig.copyAria": "{client}-Konfigurations-JSON kopieren", + "api.clientConfig.copyAria": "{client}-Konfiguration kopieren", "api.clientConfig.downloadAria": "{client}-Konfiguration herunterladen", "api.clientConfig.rowMeta": "{destination} · {count} Modell(e)", "api.clientConfig.rowError": "Die {client}-Konfiguration konnte nicht erstellt werden.", - "api.clientConfig.copiedAnnounceClient": "{client}-Konfigurations-JSON in die Zwischenablage kopiert.", + "api.clientConfig.copiedAnnounceClient": "{client}-Konfiguration in die Zwischenablage kopiert.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON kopieren", + "api.clientConfig.copy": "Konfiguration kopieren", "api.clientConfig.download": "Herunterladen", "api.clientConfig.loading": "Client-Konfiguration wird erstellt…", - "api.clientConfig.jsonLabel": "{client}-Konfigurations-JSON", + "api.clientConfig.jsonLabel": "{client}-Konfiguration", "api.clientConfig.destination": "Zieldatei", "api.clientConfig.envHint": "Schlüssel vor dem Start setzen", "api.clientConfig.mergeWarning": "Führe dies in die Zieldatei ein. Ein Ersetzen würde deine anderen Provider und MCP-Einstellungen entfernen.", @@ -1143,8 +1146,8 @@ export const de: Record = { "api.clientConfig.missingLimits": "{count} von {total} Modell(en) haben kein Kontextlimit; der Client verwendet dafür seine eigenen Vorgaben.", "api.clientConfig.noKeyYet": "Für {env} existiert noch kein Schlüssel. Erzeuge oben einen Schlüssel, bevor du diese Konfiguration außerhalb von Loopback nutzt.", "api.clientConfig.loadFailed": "Die Modellliste konnte nicht gelesen werden, daher wurde keine Client-Konfiguration erzeugt.", - "api.clientConfig.copiedAnnounce": "Client-Konfigurations-JSON in die Zwischenablage kopiert.", - "api.clientConfig.copyFailed": "Client-Konfigurations-JSON konnte nicht kopiert werden.", + "api.clientConfig.copiedAnnounce": "Client-Konfiguration in die Zwischenablage kopiert.", + "api.clientConfig.copyFailed": "Client-Konfiguration konnte nicht kopiert werden.", "api.clientConfig.downloadedAnnounce": "{filename} heruntergeladen. Es hat sich noch nichts geändert — führe die Datei selbst in {destination} ein.", "api.clientConfig.whereDisclosure": "Wohin diese Datei gehört", "api.clientConfig.whereBody": "Der Pfad oben ist der globale Speicherort. Eine projektlokale Konfigurationsdatei im Arbeitsverzeichnis hat Vorrang, und der Schlüssel wird aus der in der Konfiguration genannten Umgebungsvariable gelesen — nie aus dieser Datei.", diff --git a/gui/src/i18n/en.ts b/gui/src/i18n/en.ts index 9ae8861249..173f7ec996 100644 --- a/gui/src/i18n/en.ts +++ b/gui/src/i18n/en.ts @@ -1206,6 +1206,7 @@ export const en = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1315,6 +1316,7 @@ export const en = { "integrations.kind.restore": "Restored", "integrations.semantics.opencode": "Direct disk launches only; ocx opencode environment injection takes precedence.", "integrations.semantics.pi": "Applies to new sessions.", + "integrations.semantics.omp": "Restart OMP to load the catalog.", "integrations.semantics.hermes": "Applies to new sessions.", "integrations.semantics.openclaw": "Applies immediately to a running gateway.", "integrations.semantics.kimi": "Restart or run /reload to apply it (v2 watches the file).", @@ -1584,21 +1586,22 @@ export const en = { "api.clientConfig.rowsLabel": "Connect a client", "api.clientConfig.details": "Details", "api.clientConfig.detailsAria": "{client} config details", - "api.clientConfig.copyAria": "Copy {client} config JSON", + "api.clientConfig.copyAria": "Copy {client} config", "api.clientConfig.downloadAria": "Download {client} config", "api.clientConfig.rowMeta": "{destination} · {count} model(s)", "api.clientConfig.rowError": "Could not build the {client} config.", - "api.clientConfig.copiedAnnounceClient": "{client} config JSON copied to the clipboard.", + "api.clientConfig.copiedAnnounceClient": "{client} config copied to the clipboard.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "Copy JSON", + "api.clientConfig.copy": "Copy config", "api.clientConfig.download": "Download", "api.clientConfig.loading": "Building client config…", - "api.clientConfig.jsonLabel": "{client} config JSON", + "api.clientConfig.jsonLabel": "{client} config", "api.clientConfig.destination": "Destination file", "api.clientConfig.envHint": "Set the key before launching", "api.clientConfig.mergeWarning": "Merge this into the destination file. Replacing it would drop your other providers and MCP settings.", @@ -1606,8 +1609,8 @@ export const en = { "api.clientConfig.missingLimits": "{count} of {total} model(s) ship without a context limit; the client applies its own defaults.", "api.clientConfig.noKeyYet": "{env} has no key behind it yet. Generate a key above before using this config off loopback.", "api.clientConfig.loadFailed": "Could not read the model list, so no client config was produced.", - "api.clientConfig.copiedAnnounce": "Client config JSON copied to the clipboard.", - "api.clientConfig.copyFailed": "Could not copy the client config JSON.", + "api.clientConfig.copiedAnnounce": "Client config copied to the clipboard.", + "api.clientConfig.copyFailed": "Could not copy the client config.", "api.clientConfig.downloadedAnnounce": "Downloaded {filename}. Nothing changed yet — merge it into {destination} yourself.", "api.clientConfig.whereDisclosure": "Where this file goes", "api.clientConfig.whereBody": "The destination above is the global path. A project-local config file in the working directory takes precedence over it, and the client reads the key from the environment variable named in the config — never from this file.", diff --git a/gui/src/i18n/ja.ts b/gui/src/i18n/ja.ts index d5f7a915b4..8fbef87e37 100644 --- a/gui/src/i18n/ja.ts +++ b/gui/src/i18n/ja.ts @@ -1154,6 +1154,7 @@ export const ja: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1263,6 +1264,7 @@ export const ja: Record = { "integrations.kind.restore": "復元", "integrations.semantics.opencode": "ディスクから直接起動した場合にのみ適用されます。ocx opencode の環境注入が優先されます。", "integrations.semantics.pi": "新しいセッションから適用されます。", + "integrations.semantics.omp": "カタログを読み込むには OMP を再起動してください。", "integrations.semantics.hermes": "新しいセッションから適用されます。", "integrations.semantics.openclaw": "実行中のゲートウェイにすぐ適用されます。", "integrations.semantics.kimi": "再起動するか /reload を実行すると適用されます(v2 はファイルを監視します)。", @@ -1529,21 +1531,22 @@ export const ja: Record = { "api.clientConfig.rowsLabel": "クライアントを接続", "api.clientConfig.details": "詳細", "api.clientConfig.detailsAria": "{client} 設定の詳細", - "api.clientConfig.copyAria": "{client} 設定 JSON をコピー", + "api.clientConfig.copyAria": "{client} 設定をコピー", "api.clientConfig.downloadAria": "{client} 設定をダウンロード", "api.clientConfig.rowMeta": "{destination} · モデル {count} 件", "api.clientConfig.rowError": "{client} の設定を生成できませんでした。", - "api.clientConfig.copiedAnnounceClient": "{client} の設定 JSON をクリップボードにコピーしました。", + "api.clientConfig.copiedAnnounceClient": "{client} の設定をクリップボードにコピーしました。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON をコピー", + "api.clientConfig.copy": "設定をコピー", "api.clientConfig.download": "ダウンロード", "api.clientConfig.loading": "クライアント設定を生成中…", - "api.clientConfig.jsonLabel": "{client} 設定 JSON", + "api.clientConfig.jsonLabel": "{client} 設定", "api.clientConfig.destination": "配置先ファイル", "api.clientConfig.envHint": "起動前にキーを設定", "api.clientConfig.mergeWarning": "配置先ファイルにマージしてください。置き換えると既存のプロバイダーや MCP 設定が失われます。", @@ -1551,8 +1554,8 @@ export const ja: Record = { "api.clientConfig.missingLimits": "{total} 件中 {count} 件のモデルにコンテキスト上限がないため、クライアント側の既定値が使われます。", "api.clientConfig.noKeyYet": "{env} に対応するキーがまだありません。ループバック外で使う前に上でキーを発行してください。", "api.clientConfig.loadFailed": "モデル一覧を読み取れなかったため、クライアント設定を生成できませんでした。", - "api.clientConfig.copiedAnnounce": "クライアント設定 JSON をクリップボードにコピーしました。", - "api.clientConfig.copyFailed": "クライアント設定 JSON をコピーできませんでした。", + "api.clientConfig.copiedAnnounce": "クライアント設定をクリップボードにコピーしました。", + "api.clientConfig.copyFailed": "クライアント設定をコピーできませんでした。", "api.clientConfig.downloadedAnnounce": "{filename} をダウンロードしました。まだ何も変わっていません。{destination} に自分でマージしてください。", "api.clientConfig.whereDisclosure": "このファイルの置き場所", "api.clientConfig.whereBody": "上のパスはグローバル設定の場所です。作業ディレクトリのプロジェクト設定ファイルが優先され、キーは設定に書かれた環境変数から読み込まれ、このファイルには保存されません。", diff --git a/gui/src/i18n/ko.ts b/gui/src/i18n/ko.ts index e0ee1af6a4..29b541d208 100644 --- a/gui/src/i18n/ko.ts +++ b/gui/src/i18n/ko.ts @@ -775,6 +775,7 @@ export const ko: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -884,6 +885,7 @@ export const ko: Record = { "integrations.kind.restore": "복원", "integrations.semantics.opencode": "디스크에서 직접 실행할 때만 적용됩니다. ocx opencode의 환경 주입이 우선합니다.", "integrations.semantics.pi": "새 세션부터 적용됩니다.", + "integrations.semantics.omp": "카탈로그를 불러오려면 OMP를 재시작하세요.", "integrations.semantics.hermes": "새 세션부터 적용됩니다.", "integrations.semantics.openclaw": "실행 중인 게이트웨이에 즉시 반영됩니다.", "integrations.semantics.kimi": "재시작 또는 /reload 시 적용됩니다 (v2는 파일 변경을 감지합니다).", @@ -1148,21 +1150,22 @@ export const ko: Record = { "api.clientConfig.rowsLabel": "클라이언트 연결", "api.clientConfig.details": "자세히", "api.clientConfig.detailsAria": "{client} 설정 자세히 보기", - "api.clientConfig.copyAria": "{client} 설정 JSON 복사", + "api.clientConfig.copyAria": "{client} 설정 복사", "api.clientConfig.downloadAria": "{client} 설정 다운로드", "api.clientConfig.rowMeta": "{destination} · 모델 {count}개", "api.clientConfig.rowError": "{client} 설정을 만들지 못했습니다.", - "api.clientConfig.copiedAnnounceClient": "{client} 설정 JSON을 클립보드에 복사했습니다.", + "api.clientConfig.copiedAnnounceClient": "{client} 설정을 클립보드에 복사했습니다.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "JSON 복사", + "api.clientConfig.copy": "설정 복사", "api.clientConfig.download": "다운로드", "api.clientConfig.loading": "클라이언트 설정 생성 중…", - "api.clientConfig.jsonLabel": "{client} 설정 JSON", + "api.clientConfig.jsonLabel": "{client} 설정", "api.clientConfig.destination": "대상 파일", "api.clientConfig.envHint": "실행 전 키 설정", "api.clientConfig.mergeWarning": "대상 파일에 병합하세요. 덮어쓰면 기존 프로바이더와 MCP 설정이 사라집니다.", @@ -1170,8 +1173,8 @@ export const ko: Record = { "api.clientConfig.missingLimits": "{total}개 중 {count}개 모델에 컨텍스트 한도가 없어 클라이언트 기본값이 적용됩니다.", "api.clientConfig.noKeyYet": "{env}에 연결된 키가 아직 없습니다. 루프백 밖에서 쓰려면 위에서 키를 발급하세요.", "api.clientConfig.loadFailed": "모델 목록을 읽지 못해 클라이언트 설정을 만들지 못했습니다.", - "api.clientConfig.copiedAnnounce": "클라이언트 설정 JSON을 클립보드에 복사했습니다.", - "api.clientConfig.copyFailed": "클라이언트 설정 JSON을 복사하지 못했습니다.", + "api.clientConfig.copiedAnnounce": "클라이언트 설정을 클립보드에 복사했습니다.", + "api.clientConfig.copyFailed": "클라이언트 설정을 복사하지 못했습니다.", "api.clientConfig.downloadedAnnounce": "{filename} 파일을 다운로드했습니다. 아직 아무것도 바뀌지 않았으니 {destination}에 직접 병합하세요.", "api.clientConfig.whereDisclosure": "이 파일이 들어갈 위치", "api.clientConfig.whereBody": "위 경로는 전역 설정 경로입니다. 작업 디렉터리의 프로젝트 설정 파일이 우선하며, 키는 설정에 적힌 환경 변수에서 읽고 이 파일에는 저장되지 않습니다.", diff --git a/gui/src/i18n/ru.ts b/gui/src/i18n/ru.ts index f707bb5f5e..3d2693b04f 100644 --- a/gui/src/i18n/ru.ts +++ b/gui/src/i18n/ru.ts @@ -1196,6 +1196,7 @@ export const ru: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -1305,6 +1306,7 @@ export const ru: Record = { "integrations.kind.restore": "Восстановлено", "integrations.semantics.opencode": "Действует только при прямом запуске с диска; внедрение окружения через ocx opencode имеет приоритет.", "integrations.semantics.pi": "Применяется к новым сеансам.", + "integrations.semantics.omp": "Перезапустите OMP, чтобы загрузить каталог.", "integrations.semantics.hermes": "Применяется к новым сеансам.", "integrations.semantics.openclaw": "Немедленно применяется к работающему шлюзу.", "integrations.semantics.kimi": "Чтобы применить, перезапустите клиент или выполните /reload (v2 отслеживает файл).", @@ -1571,21 +1573,22 @@ export const ru: Record = { "api.clientConfig.rowsLabel": "Подключение клиента", "api.clientConfig.details": "Подробнее", "api.clientConfig.detailsAria": "Подробности конфигурации {client}", - "api.clientConfig.copyAria": "Скопировать JSON конфигурации {client}", + "api.clientConfig.copyAria": "Скопировать конфигурацию {client}", "api.clientConfig.downloadAria": "Скачать конфигурацию {client}", "api.clientConfig.rowMeta": "{destination} · моделей: {count}", "api.clientConfig.rowError": "Не удалось собрать конфигурацию {client}.", - "api.clientConfig.copiedAnnounceClient": "JSON конфигурации {client} скопирован в буфер обмена.", + "api.clientConfig.copiedAnnounceClient": "Конфигурация {client} скопирована в буфер обмена.", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "Копировать JSON", + "api.clientConfig.copy": "Копировать конфигурацию", "api.clientConfig.download": "Скачать", "api.clientConfig.loading": "Формируется конфигурация клиента…", - "api.clientConfig.jsonLabel": "JSON конфигурации {client}", + "api.clientConfig.jsonLabel": "Конфигурация {client}", "api.clientConfig.destination": "Целевой файл", "api.clientConfig.envHint": "Задайте ключ перед запуском", "api.clientConfig.mergeWarning": "Объедините это с целевым файлом. Замена удалит ваши другие провайдеры и настройки MCP.", @@ -1593,8 +1596,8 @@ export const ru: Record = { "api.clientConfig.missingLimits": "У {count} из {total} моделей нет лимита контекста; клиент применит свои значения по умолчанию.", "api.clientConfig.noKeyYet": "Для {env} пока нет ключа. Создайте ключ выше, прежде чем использовать конфигурацию вне loopback.", "api.clientConfig.loadFailed": "Не удалось прочитать список моделей, поэтому конфигурация клиента не создана.", - "api.clientConfig.copiedAnnounce": "JSON конфигурации клиента скопирован в буфер обмена.", - "api.clientConfig.copyFailed": "Не удалось скопировать JSON конфигурации клиента.", + "api.clientConfig.copiedAnnounce": "Конфигурация клиента скопирована в буфер обмена.", + "api.clientConfig.copyFailed": "Не удалось скопировать конфигурацию клиента.", "api.clientConfig.downloadedAnnounce": "Файл {filename} скачан. Пока ничего не изменилось — объедините его с {destination} самостоятельно.", "api.clientConfig.whereDisclosure": "Куда положить этот файл", "api.clientConfig.whereBody": "Путь выше — глобальное расположение. Файл конфигурации проекта в рабочем каталоге имеет приоритет, а ключ читается из переменной окружения, указанной в конфигурации, и никогда не хранится в этом файле.", diff --git a/gui/src/i18n/zh.ts b/gui/src/i18n/zh.ts index 14113c6110..36b4217df2 100644 --- a/gui/src/i18n/zh.ts +++ b/gui/src/i18n/zh.ts @@ -768,6 +768,7 @@ export const zh: Record = { "integrations.tab.grok": "Grok Build", "integrations.tab.opencode": "OpenCode", "integrations.tab.pi": "Pi", + "integrations.tab.omp": "OMP", "integrations.tab.hermes": "Hermes", "integrations.tab.openclaw": "OpenClaw", "integrations.tab.kimi": "Kimi Code", @@ -877,6 +878,7 @@ export const zh: Record = { "integrations.kind.restore": "已恢复", "integrations.semantics.opencode": "仅适用于直接从磁盘启动;ocx opencode 的环境注入优先。", "integrations.semantics.pi": "对新会话生效。", + "integrations.semantics.omp": "重启 OMP 以加载模型目录。", "integrations.semantics.hermes": "对新会话生效。", "integrations.semantics.openclaw": "立即应用到正在运行的网关。", "integrations.semantics.kimi": "重启或运行 /reload 以应用(v2 会监视该文件)。", @@ -1141,21 +1143,22 @@ export const zh: Record = { "api.clientConfig.rowsLabel": "连接客户端", "api.clientConfig.details": "详情", "api.clientConfig.detailsAria": "{client} 配置详情", - "api.clientConfig.copyAria": "复制 {client} 配置 JSON", + "api.clientConfig.copyAria": "复制 {client} 配置", "api.clientConfig.downloadAria": "下载 {client} 配置", "api.clientConfig.rowMeta": "{destination} · {count} 个模型", "api.clientConfig.rowError": "无法生成 {client} 配置。", - "api.clientConfig.copiedAnnounceClient": "已将 {client} 配置 JSON 复制到剪贴板。", + "api.clientConfig.copiedAnnounceClient": "已将 {client} 配置复制到剪贴板。", "api.clientConfig.clientOpencode": "OpenCode", "api.clientConfig.clientPi": "Pi", + "api.clientConfig.clientOmp": "OMP", "api.clientConfig.clientHermes": "Hermes", "api.clientConfig.clientOpenclaw": "OpenClaw", "api.clientConfig.clientKimi": "Kimi Code", "api.clientConfig.clientGajae": "Gajae Code", - "api.clientConfig.copy": "复制 JSON", + "api.clientConfig.copy": "复制配置", "api.clientConfig.download": "下载", "api.clientConfig.loading": "正在生成客户端配置…", - "api.clientConfig.jsonLabel": "{client} 配置 JSON", + "api.clientConfig.jsonLabel": "{client} 配置", "api.clientConfig.destination": "目标文件", "api.clientConfig.envHint": "启动前设置密钥", "api.clientConfig.mergeWarning": "请合并到目标文件中。直接替换会丢失你已有的其他提供商和 MCP 配置。", @@ -1163,8 +1166,8 @@ export const zh: Record = { "api.clientConfig.missingLimits": "{total} 个模型中有 {count} 个没有上下文上限,客户端将使用自己的默认值。", "api.clientConfig.noKeyYet": "{env} 目前还没有对应的密钥。离开回环地址使用前,请先在上方生成密钥。", "api.clientConfig.loadFailed": "无法读取模型列表,因此没有生成客户端配置。", - "api.clientConfig.copiedAnnounce": "客户端配置 JSON 已复制到剪贴板。", - "api.clientConfig.copyFailed": "无法复制客户端配置 JSON。", + "api.clientConfig.copiedAnnounce": "客户端配置已复制到剪贴板。", + "api.clientConfig.copyFailed": "无法复制客户端配置。", "api.clientConfig.downloadedAnnounce": "已下载 {filename}。目前还没有任何改动,请自行将其合并到 {destination}。", "api.clientConfig.whereDisclosure": "该文件应放在哪里", "api.clientConfig.whereBody": "上面的路径是全局配置位置。工作目录中的项目级配置文件优先级更高;密钥由配置中指定的环境变量读取,不会写入该文件。", diff --git a/gui/src/pages/Integrations.tsx b/gui/src/pages/Integrations.tsx index 772598af26..27584595dd 100644 --- a/gui/src/pages/Integrations.tsx +++ b/gui/src/pages/Integrations.tsx @@ -31,6 +31,7 @@ const TABS: readonly TabDefinition[] = [ { id: "grok", hash: "integrations/grok", labelKey: "integrations.tab.grok" }, { id: "opencode", hash: "integrations/opencode", labelKey: "integrations.tab.opencode" }, { id: "pi", hash: "integrations/pi", labelKey: "integrations.tab.pi" }, + { id: "omp", hash: "integrations/omp", labelKey: "integrations.tab.omp" }, { id: "hermes", hash: "integrations/hermes", labelKey: "integrations.tab.hermes" }, { id: "openclaw", hash: "integrations/openclaw", labelKey: "integrations.tab.openclaw" }, { id: "kimi", hash: "integrations/kimi", labelKey: "integrations.tab.kimi" }, @@ -40,6 +41,7 @@ const TABS: readonly TabDefinition[] = [ const FILE_CLIENTS = new Set([ "opencode", "pi", + "omp", "hermes", "openclaw", "kimi", diff --git a/gui/src/pages/integrations/FileIntegrationPage.tsx b/gui/src/pages/integrations/FileIntegrationPage.tsx index 32f408d80f..4783a4ef2e 100644 --- a/gui/src/pages/integrations/FileIntegrationPage.tsx +++ b/gui/src/pages/integrations/FileIntegrationPage.tsx @@ -19,6 +19,7 @@ export type { FileIntegrationClientId }; const SEMANTICS_KEY: Record = { opencode: "integrations.semantics.opencode", pi: "integrations.semantics.pi", + omp: "integrations.semantics.omp", hermes: "integrations.semantics.hermes", openclaw: "integrations.semantics.openclaw", kimi: "integrations.semantics.kimi", @@ -28,6 +29,7 @@ const SEMANTICS_KEY: Record = { const TAB_LABEL_KEY: Record = { opencode: "integrations.tab.opencode", pi: "integrations.tab.pi", + omp: "integrations.tab.omp", hermes: "integrations.tab.hermes", openclaw: "integrations.tab.openclaw", kimi: "integrations.tab.kimi", diff --git a/gui/src/pages/integrations/integration-api.ts b/gui/src/pages/integrations/integration-api.ts index 2d6830da67..0d7b0d3ad5 100644 --- a/gui/src/pages/integrations/integration-api.ts +++ b/gui/src/pages/integrations/integration-api.ts @@ -3,6 +3,7 @@ import { readJsonIfOk } from "../../fetch-json"; export const FILE_INTEGRATION_CLIENTS = [ "opencode", "pi", + "omp", "hermes", "openclaw", "kimi", diff --git a/gui/src/pages/integrations/overview-clients.ts b/gui/src/pages/integrations/overview-clients.ts index 73811976bf..c2894c3cd1 100644 --- a/gui/src/pages/integrations/overview-clients.ts +++ b/gui/src/pages/integrations/overview-clients.ts @@ -2,7 +2,7 @@ * One row model for every client the Integrations page can reach. * * The overview used to read a single route, `/api/client-integrations`, which - * answers only for the six file-toggle clients. A user with Claude Code + * answers only for the seven file-toggle clients. A user with Claude Code * connected and a Grok fence written was told "applied: 0" while three * integrations were live one tab away. Five more sources join the grid here, * each with its own payload shape, mapped to the badge vocabulary the file @@ -136,6 +136,7 @@ export interface OverviewSources { const FILE_LABEL_KEY: Record = { opencode: "integrations.tab.opencode", pi: "integrations.tab.pi", + omp: "integrations.tab.omp", hermes: "integrations.tab.hermes", openclaw: "integrations.tab.openclaw", kimi: "integrations.tab.kimi", diff --git a/gui/tests/client-config-panel.test.tsx b/gui/tests/client-config-panel.test.tsx index ce2336c7d6..c467a20b2e 100644 --- a/gui/tests/client-config-panel.test.tsx +++ b/gui/tests/client-config-panel.test.tsx @@ -190,7 +190,7 @@ test("each row fetches its own client and its dialog renders that client's exact await act(async () => { root.unmount(); }); }); -test("the config JSON is not rendered at rest", async () => { +test("the config bytes are not rendered at rest", async () => { // The core of the request: rows carry the actions, not the payload. stubRoute(client => Response.json(client === "pi" ? PI_ENVELOPE : OPENCODE_ENVELOPE)); const { root, container } = await mountPanel(); @@ -199,7 +199,7 @@ test("the config JSON is not rendered at rest", async () => { expect(container.querySelector(".awi-clientconfig-json")).toBeNull(); expect(container.querySelector("dialog")).toBeNull(); // Both transport actions stay on the surface; only inspection is demoted. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "OpenCode", "Details").click(); }); @@ -233,7 +233,7 @@ test("row actions carry client-qualified accessible names", async () => { stubRoute(client => Response.json(client === "pi" ? PI_ENVELOPE : OPENCODE_ENVELOPE)); const { root, container } = await mountPanel(); - expect(rowButton(container, "Pi", "Copy JSON").getAttribute("aria-label")).toBe("Copy Pi config JSON"); + expect(rowButton(container, "Pi", "Copy config").getAttribute("aria-label")).toBe("Copy Pi config"); expect(rowButton(container, "Pi", "Download").getAttribute("aria-label")).toBe("Download Pi config"); expect(rowButton(container, "Pi", "Details").getAttribute("aria-label")).toBe("Pi config details"); expect(container.querySelector(".awi-clientconfig-rows")?.getAttribute("aria-label")).toBe("Connect a client"); @@ -434,14 +434,14 @@ test("one client's failure isolates to its row, with no partial JSON and the bas .toEqual(["Retry"]); // The sibling row is untouched by its neighbour's 503. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "Pi", "Retry").click(); }); expect(piAttempts).toBe(2); expect(row(container, "Pi").textContent).toContain(PI_ENVELOPE.destination); - expect(rowButton(container, "Pi", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "Pi", "Copy config").disabled).toBe(false); await act(async () => { root.unmount(); }); }); @@ -468,7 +468,7 @@ test("no-key state is informational and leaves copy and download enabled", async // Row actions never block on a missing key: an agent may legitimately want the // shape first. - expect(rowButton(container, "OpenCode", "Copy JSON").disabled).toBe(false); + expect(rowButton(container, "OpenCode", "Copy config").disabled).toBe(false); expect(rowButton(container, "OpenCode", "Download").disabled).toBe(false); await act(async () => { rowButton(container, "OpenCode", "Details").click(); }); diff --git a/gui/tests/integrations-overview-rows.test.ts b/gui/tests/integrations-overview-rows.test.ts index 5410c9fd8a..92151ff369 100644 --- a/gui/tests/integrations-overview-rows.test.ts +++ b/gui/tests/integrations-overview-rows.test.ts @@ -137,7 +137,7 @@ test("file clients keep their existing badge and applied semantics", () => { expect(counts.stale).toBe(1); }); -test("every client counts toward the summary, not just the file six", () => { +test("every client counts toward the summary, not just the file seven", () => { const rows = buildOverviewRows(sources({ clients: [fileStatus({ clientId: "opencode", state: "current" })], codex: { routingInjected: true, status: "at-risk" }, @@ -178,7 +178,8 @@ test("every client counts toward the summary, not just the file six", () => { test("an unsettled file list renders unknown rows instead of dropping them", () => { const built = buildOverviewRows(sources({ clients: [], clientsSettled: false })); - expect(built.rows).toHaveLength(10); + expect(built.rows).toHaveLength(11); + expect(rowById(built, "omp").state).toBe("unknown"); expect(rowById(built, "kimi").state).toBe("unknown"); // Once settled, a client the server omitted is genuinely gone. @@ -194,4 +195,5 @@ test("each row points at its own tab", () => { expect(rowById(rows, "claudeDesktop").hash).toBe("integrations/claude/desktop"); expect(rowById(rows, "grok").hash).toBe("integrations/grok"); expect(rowById(rows, "hermes").hash).toBe("integrations/hermes"); + expect(rowById(rows, "omp").hash).toBe("integrations/omp"); }); diff --git a/src/cli/export-command.ts b/src/cli/export-command.ts index d7d074fb5f..64e3587a95 100644 --- a/src/cli/export-command.ts +++ b/src/cli/export-command.ts @@ -1,8 +1,8 @@ /** * `ocx export --client ` — print a client config for the live proxy. * - * Six clients, four formats: opencode and Pi are JSON, Hermes and Gajae YAML, - * OpenClaw JSON5, Kimi TOML. + * Seven clients, four formats: opencode and Pi are JSON, OMP, Hermes and Gajae + * are YAML, OpenClaw JSON5, Kimi TOML. * * Two consumers, one payload (devlog 260731_client_config_export/020): * diff --git a/src/cli/help.ts b/src/cli/help.ts index f768494478..79707bed79 100644 --- a/src/cli/help.ts +++ b/src/cli/help.ts @@ -173,12 +173,12 @@ const helpEntries: Record = { }, "api-key": { usage: "ocx api-key ...", summary: "Alias of ocx access key." }, export: { - usage: "ocx export --client [--json] [--out ] [--force]", - summary: "Print a client config (opencode, Pi, Hermes, OpenClaw, Kimi Code, Gajae Code) wired to the running proxy.", + usage: "ocx export --client [--json] [--out ] [--force]", + summary: "Print a client config (opencode, Pi, OMP, Hermes, OpenClaw, Kimi Code, Gajae Code) wired to the running proxy.", details: [ - "--json prints only the config JSON on stdout, so it is safe to redirect to a file.", + "--json prints only the generated config bytes on stdout, so it is safe to redirect to a file.", "--out writes the config there and refuses to replace an existing file without --force.", - "The config never contains a key; it references the client's env var, which you export before launching. Kimi cannot hold an env reference, so it carries a loopback placeholder instead.", + "The config never contains a real key; it carries a documented env reference or a non-secret loopback placeholder.", "The destination path is printed for merging by hand — ocx never writes your real client config.", ], }, @@ -313,7 +313,7 @@ Usage: ocx agent Subagents, injection, effort caps, and sidecars ocx observe Logs, usage, storage, memory, and debug data ocx access External API keys and endpoint information - ocx export --client Print a client config wired to the running proxy (6 clients) + ocx export --client Print a client config wired to the running proxy (7 clients) ocx integration client Enable, disable, inspect or roll back a client integration ocx grok Grok Build model selection and apply ocx system Runtime settings, startup, sync, and updates diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 4d8ca366c1..065308ce0e 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -170,6 +170,49 @@ export function opencodeGlobalConfigPath( return join(xdg, "opencode", "opencode.json"); } +const OMP_PROFILE_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/; +const OMP_WINDOWS_RESERVED_PROFILE_RE = /^(?:CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9])(?:\..*)?$/i; + +function ompProfileName(env: OpencodeLaunchEnv): string | undefined { + const raw = env.OMP_PROFILE?.trim() || env.PI_PROFILE?.trim(); + const profile = raw?.trim(); + if (!profile || profile === "default") return undefined; + if ( + profile === "." + || profile === ".." + || profile.endsWith(".") + || !OMP_PROFILE_NAME_RE.test(profile) + || OMP_WINDOWS_RESERVED_PROFILE_RE.test(profile) + ) { + throw new ClientPathError(`Invalid OMP profile "${raw}"`); + } + return profile; +} + +/** Resolve the global Oh My Pi agent directory using OMP's own env precedence. */ +export function ompAgentDir(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { + const profile = ompProfileName(env); + if (!profile) { + const override = env.PI_CODING_AGENT_DIR?.trim(); + if (override) return absoluteClientPath(override, home, "PI_CODING_AGENT_DIR"); + } + const configDir = env.PI_CONFIG_DIR?.trim(); + const root = configDir + ? (isAbsolute(configDir) || configDir === "~" || configDir.startsWith("~/") || configDir.startsWith("~\\") + ? absoluteClientPath(configDir, home, "PI_CONFIG_DIR") + : join(home, configDir)) + : join(home, ".omp"); + return profile ? join(root, "profiles", profile, "agent") : join(root, "agent"); +} + +/** OMP's canonical custom-provider catalog. */ +export function ompModelsConfigPath(env: OpencodeLaunchEnv = process.env, home: string = homedir()): string { + const agentDir = ompAgentDir(env, home); + const yamlFallback = join(agentDir, "models.yaml"); + const canonical = join(agentDir, "models.yml"); + return !existsSync(canonical) && existsSync(yamlFallback) ? yamlFallback : canonical; +} + /** Compose the OpenAI-compatible proxy base URL from a live probe result. */ export function opencodeProxyBaseUrl(port: number, hostname?: string): string { return `http://${probeHostname(hostname)}:${port}/v1`; @@ -364,6 +407,7 @@ export interface ExportContext { export type ExportClientId = | "opencode" | "pi" + | "omp" | "hermes" | "openclaw" | "kimi" @@ -894,6 +938,11 @@ function buildPiContribution(ctx: ExportContext): ManagedContribution { return singleFragment("pi", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); } +function buildOmpContribution(ctx: ExportContext): ManagedContribution { + const doc = buildPiClientConfig(ctx); + return singleFragment("omp", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); +} + function buildHermesContribution(ctx: ExportContext): ManagedContribution { const doc = buildHermesClientConfig(ctx); return singleFragment("hermes", ["providers", OPENCODE_PROVIDER_ID], doc.providers[OPENCODE_PROVIDER_ID]); @@ -953,6 +1002,19 @@ export const EXPORT_CLIENTS: Record = { // dedicated admission header a remote bind requires. loopbackOnly: true, }, + omp: { + id: "omp", + filename: "omp-models.yaml", + destination: env => ompModelsConfigPath(env), + apiKeyEnv: "", + exportHint: "OMP reads credentials from models.yml; loopback needs no key.", + build: buildPiClientConfig, + format: "yaml", + summarize: summarizePi, + buildContribution: buildOmpContribution, + // OMP's provider block has no dedicated admission-header field. + loopbackOnly: true, + }, hermes: { id: "hermes", filename: "hermes-config.yaml", diff --git a/src/integrations/registry.ts b/src/integrations/registry.ts index b4c086bdd0..889909a5ad 100644 --- a/src/integrations/registry.ts +++ b/src/integrations/registry.ts @@ -18,6 +18,8 @@ import { hermesHomeDir, kimiConfigPath, kimiHomeDir, + ompAgentDir, + ompModelsConfigPath, opencodeGlobalConfigPath, openclawConfigPath, openclawHomeDir, @@ -68,6 +70,11 @@ export const INTEGRATION_CLIENTS: Record join(home, ".pi", "agent", "models.json"), detectDir: (_env = process.env, home = homedir()) => join(home, ".pi"), }, + omp: { + id: "omp", + configPath: (env = process.env, home = homedir()) => ompModelsConfigPath(env, home), + detectDir: (env = process.env, home = homedir()) => ompAgentDir(env, home), + }, hermes: { id: "hermes", configPath: (env = process.env, home = homedir()) => hermesConfigPath(env, home), diff --git a/tests/cli-export-command.test.ts b/tests/cli-export-command.test.ts index f793fc7e08..0518362fa7 100644 --- a/tests/cli-export-command.test.ts +++ b/tests/cli-export-command.test.ts @@ -206,7 +206,7 @@ describe("ocx export argument validation (accept criterion 4)", () => { const proxy = fakeProxy(); const result = await run(["--client", "cursor"], { baseUrl: proxy.baseUrl }); expect(result.code).toBe(2); - for (const id of ["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"]) { + for (const id of ["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"]) { expect(result.stderr).toContain(id); } expect(result.stdout).toBe(""); diff --git a/tests/client-config-export-new-clients.test.ts b/tests/client-config-export-new-clients.test.ts index 8f5173b14c..d509338050 100644 --- a/tests/client-config-export-new-clients.test.ts +++ b/tests/client-config-export-new-clients.test.ts @@ -63,7 +63,7 @@ describe("no secret reaches a client config", () => { // client whose schema has no header field cannot authenticate remotely at // all. Saying so beats exporting a config that 401s. const loopbackOnly = EXPORT_CLIENT_IDS.filter(id => EXPORT_CLIENTS[id].loopbackOnly); - expect(loopbackOnly).toEqual(["pi", "kimi", "gajae"]); + expect(loopbackOnly).toEqual(["pi", "omp", "kimi", "gajae"]); }); test("every client that is not loopback-only carries the header on a remote bind", () => { @@ -268,7 +268,7 @@ describe("gajae", () => { describe("contributions name every fragment we own", () => { test("single-entry clients own exactly one path", () => { - for (const id of ["opencode", "pi", "hermes", "openclaw", "gajae"] as const) { + for (const id of ["opencode", "pi", "omp", "hermes", "openclaw", "gajae"] as const) { expect(buildClientContribution(id, ctx()).fragments).toHaveLength(1); } }); diff --git a/tests/client-config-export.test.ts b/tests/client-config-export.test.ts index 3e8b8e881e..3e85040e17 100644 --- a/tests/client-config-export.test.ts +++ b/tests/client-config-export.test.ts @@ -12,6 +12,7 @@ import { buildClientConfigText, isExportClientId, normalizeExportModels, + ompModelsConfigPath, type ExportContext, type ExportModel, type OpencodeGeneratedConfig, @@ -73,6 +74,7 @@ function piConfig(context: ExportContext = ctx()): PiGeneratedConfig { return buildClientConfig("pi", context) as PiGeneratedConfig; } + describe("relocated OpenCode serializer (accept criterion 1)", () => { test("the moved builder reproduces the pre-refactor golden byte-for-byte", () => { const block = buildOpencodeProviderBlockFromCatalog(10100, FIXTURE, "127.0.0.1"); @@ -219,6 +221,23 @@ describe("Pi serializer (accept criterion 2)", () => { }); }); +describe("OMP serializer", () => { + test("writes the full routed catalog in OMP's models.yml provider shape", () => { + const built = buildClientConfigText("omp", ctx()); + expect(built.format).toBe("yaml"); + const document = buildClientConfig("omp", ctx()) as PiGeneratedConfig; + expect(document.providers.opencodex!.models.map(model => model.id)).toEqual([ + "anthropic/claude-opus-5", + "custom/no-context", + "gpt-5.6-luna", + "tiny/small-ctx", + ]); + expect(built.text).toContain("providers:"); + expect(built.text).toContain("anthropic/claude-opus-5"); + expect(built.text).toContain("apiKey: opencodex-loopback"); + }); +}); + describe("no credential ever reaches the output (accept criterion 3)", () => { const LIVE_KEY = "ocx_live_do_not_serialize_0123456789"; @@ -280,8 +299,8 @@ describe("stable ordering (accept criterion 4)", () => { }); describe("EXPORT_CLIENTS registry", () => { - test("covers exactly the six file-toggle clients", () => { - expect(EXPORT_CLIENT_IDS).toEqual(["opencode", "pi", "hermes", "openclaw", "kimi", "gajae"]); + test("covers exactly the seven file-toggle clients", () => { + expect(EXPORT_CLIENT_IDS).toEqual(["opencode", "pi", "omp", "hermes", "openclaw", "kimi", "gajae"]); for (const id of EXPORT_CLIENT_IDS) expect(isExportClientId(id)).toBe(true); // The exception clients keep their own surfaces and are not export clients. expect(isExportClientId("claude-desktop")).toBe(false); @@ -426,6 +445,7 @@ describe("EXPORT_CLIENTS registry", () => { test("filenames name the destination file, not the product", () => { expect(EXPORT_CLIENTS.opencode.filename).toBe("opencode.json"); expect(EXPORT_CLIENTS.pi.filename).toBe("pi-models.json"); + expect(EXPORT_CLIENTS.omp.filename).toBe("omp-models.yaml"); expect(EXPORT_CLIENTS.hermes.filename).toBe("hermes-config.yaml"); expect(EXPORT_CLIENTS.openclaw.filename).toBe("openclaw.json5"); expect(EXPORT_CLIENTS.kimi.filename).toBe("kimi-config.toml"); @@ -444,6 +464,26 @@ describe("EXPORT_CLIENTS registry", () => { expect(EXPORT_CLIENTS.pi.destination({} as NodeJS.ProcessEnv)).toBe(join(homedir(), ".pi", "agent", "models.json")); }); + test("the OMP destination follows its global agent directory and profile selectors", () => { + expect(EXPORT_CLIENTS.omp.destination({} as NodeJS.ProcessEnv)).toBe( + join(homedir(), ".omp", "agent", "models.yml"), + ); + const profiled = { OMP_PROFILE: "work", PI_CONFIG_DIR: ".custom-omp" } as NodeJS.ProcessEnv; + expect(EXPORT_CLIENTS.omp.destination(profiled)).toBe( + join(homedir(), ".custom-omp", "profiles", "work", "agent", "models.yml"), + ); + expect(EXPORT_CLIENTS.omp.destination(profiled)).toBe(ompModelsConfigPath(profiled)); + expect(EXPORT_CLIENTS.omp.destination({ PI_CONFIG_DIR: "/srv/omp" } as NodeJS.ProcessEnv)).toBe( + join("/srv/omp", "agent", "models.yml"), + ); + expect(EXPORT_CLIENTS.omp.destination({ + OMP_PROFILE: " ", + PI_PROFILE: "legacy", + } as NodeJS.ProcessEnv)).toBe( + join(homedir(), ".omp", "profiles", "legacy", "agent", "models.yml"), + ); + }); + test("apiKeyEnv and exportHint name the variable the config references", () => { expect(EXPORT_CLIENTS.opencode.apiKeyEnv).toBe(OPENCODE_API_KEY_ENV); expect(EXPORT_CLIENTS.opencode.exportHint).toContain(OPENCODE_API_KEY_ENV); diff --git a/tests/integrations-invariants.test.ts b/tests/integrations-invariants.test.ts index 4178b908bd..f7524214aa 100644 --- a/tests/integrations-invariants.test.ts +++ b/tests/integrations-invariants.test.ts @@ -66,9 +66,9 @@ afterEach(() => { }); describe("the client registries cannot drift apart", () => { - test("every list of clients holds exactly the same six ids", async () => { + test("every list of clients holds exactly the same seven ids", async () => { /* - * Five lists name the same six clients, and two of them are maintained by + * Five lists name the same seven clients, and two of them are maintained by * hand: the GUI cannot import the backend registry, because that would * pull node:os and node:path into the browser bundle. A client added * server-side renders no row until someone remembers the tuple, and the @@ -78,7 +78,7 @@ describe("the client registries cannot drift apart", () => { const guiIntegrations = await import("../gui/src/pages/integrations/integration-api"); const expected = [...EXPORT_CLIENT_IDS].sort(); - expect(expected).toHaveLength(6); + expect(expected).toHaveLength(7); expect([...INTEGRATION_CLIENT_IDS].sort()).toEqual(expected); expect([...gui.CLIENTS].sort()).toEqual(expected); @@ -125,6 +125,7 @@ describe("every client survives a full lifecycle", () => { const SEED: Record = { opencode: '{\n "provider": {\n "mine": { "npm": "keep-me" }\n }\n}\n', pi: '{\n "providers": {\n "mine": { "api": "http://keep-me" }\n }\n}\n', + omp: "providers:\n mine:\n api: http://keep-me\n", hermes: "providers:\n mine:\n api: http://keep-me\n", openclaw: '{\n models: {\n providers: {\n mine: { api: "http://keep-me" },\n },\n },\n}\n', kimi: '[providers.mine]\napi = "http://keep-me"\n', @@ -675,7 +676,7 @@ describe("the store's own root stays tidy", () => { describe("the CLI names every client it supports", () => { test("export help and the top-level list are not stuck on opencode and Pi", () => { /* - * The command has accepted six clients since WP1, but its help said two. + * The command has accepted several clients since WP1, but its help said two. * A user reading it concluded the feature did not support their client — * the one failure mode a help string has. * diff --git a/tests/integrations-state.test.ts b/tests/integrations-state.test.ts index 8ef851018f..ef45405827 100644 --- a/tests/integrations-state.test.ts +++ b/tests/integrations-state.test.ts @@ -381,9 +381,9 @@ describe("installation detection is independent of config state", () => { * from. Rationale and the per-client table: 020 §1 amendment. */ describe("the loopback-only set is one fact, read through one seam", () => { - test("pi, kimi and gajae are loopback-only and nobody else is", () => { + test("omp, pi, kimi and gajae are loopback-only and nobody else is", () => { const loopbackOnly = INTEGRATION_CLIENT_IDS.filter(id => isLoopbackOnly(id)); - expect(loopbackOnly).toEqual(["pi", "kimi", "gajae"]); + expect(loopbackOnly).toEqual(["pi", "omp", "kimi", "gajae"]); }); test("the registry restates nothing — it reads the export spec", () => { diff --git a/tests/management-client-config-route.test.ts b/tests/management-client-config-route.test.ts index 1e20c446ee..5b0fa3dad7 100644 --- a/tests/management-client-config-route.test.ts +++ b/tests/management-client-config-route.test.ts @@ -29,6 +29,8 @@ interface ClientConfigEnvelope { exportHint: string; modelCount: number; modelsWithoutLimits: number; + format: string; + text: string; config: unknown; } @@ -157,6 +159,21 @@ describe("GET /api/client-config", () => { expect(provider.models.map(model => model.id)).toContain("a/m1"); }, 15_000); + test("OMP returns the full routed catalog as models.yml YAML", async () => { + const response = await clientConfigApi(baseConfig(), "?client=omp"); + expect(response.status).toBe(200); + const body = await response.json() as ClientConfigEnvelope; + + expect(body.client).toBe("omp"); + expect(body.filename).toBe("omp-models.yaml"); + expect(body.format).toBe("yaml"); + expect(body.text).toContain("providers:"); + expect(body.text).toContain("a/m1"); + const provider = (body.config as PiGeneratedConfig).providers[OPENCODE_PROVIDER_ID]; + expect(provider.models.map(model => model.id)).toContain("a/m1"); + expect(provider.apiKey).toBe(LOOPBACK_API_KEY_PLACEHOLDER); + }, 15_000); + test("counts describe the emitted document, including models without limits", async () => { const config = baseConfig(); const opencode = await (await clientConfigApi(config, "?client=opencode")).json() as ClientConfigEnvelope; From 6860b6c4ac31a7d9774cdd9c5cc1b34f0c3f9464 Mon Sep 17 00:00:00 2001 From: n3wr1ch <40690535+n3wr1ch@users.noreply.github.com> Date: Thu, 6 Aug 2026 16:38:19 +0900 Subject: [PATCH 2/3] docs(gui): add OMP integration screenshot --- .../evidence/omp-dashboard.png | Bin 0 -> 185256 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 devlog/_plan/260806_omp_integration/evidence/omp-dashboard.png diff --git a/devlog/_plan/260806_omp_integration/evidence/omp-dashboard.png b/devlog/_plan/260806_omp_integration/evidence/omp-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..b132a5334b15beeaedaf59b44075d8cc8b06950b GIT binary patch literal 185256 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

2r4g)Hi7}T=$I()8{OoAxN z7~-33XF_A^0-ml(c&sI4VK*IC>gW(o*4rPj#b05Lf@k$Q{XFd{hxO!47~7rYUEVMA z7^Ue%dgBUja|(w=_L^!W`^VfQ`A~wxV>L^Zq?OP z3#RC%<8(9m<>1e1&-5aB?C#q>_mRPv?wd&$ng?!v+e@`xLZVR8XP#Kq_+fP~$8`jU z4yVJRP@v9>b2)8gLtGGZ|s>h@vuh_)Hw>Y^YB$eU*y$Rth*p zKZa|UNDzn=rB?JuKX5FJ6f2#v^c`U!Z^F!*jTi2n97qs&oiAf4{bk`0^9H&6`AJV~ zFAFbtvQ{fDT``fxr&Dg+@0J}qJO*a?n6203c(f%QX}|buz3H<*+i1kyiJxcp^&7VM zm&J;wG`1`jZ6&AWpS88zOVx($uKj+dtREZ}?N@#^CUcmquGGg6vf0l6bVa-?8K}59 zFdH%{*Eu`>@alY9Y1HL-v#*-(E~SY{$~#Z)eYT2vi;Le%ubQ>sJl&&*?S3$h6mQV# z_ANd~C=6z~SaI%}fSLO4uA}51>q?WS19VbQ=d603go06?>^2Imj<~H7M~kc{GK?Ga zYVUPD{-%rWjE_7%zJ^leCBme_Mbkg70#R+>LKS6q`qM-)84@Ve*!83Ok&^Ted2GXa zE5AqN6gKGXGjfRi8(%W{s$U%#He(WG(x}u(vDUod`I~Ke;+_9ADcf=LsK`$(@WrB# zo;I05^L)AXEV_wpEWNtMZ34;S9)DX_sNXOimdMh|qZflL#*|QS1)SKaKkva?E|^%( z0CsQ6RM68HMr1Am>hRX>9lb+l0A5M4nJ&bNRln$R;VI{8^LQDx_f<15n*~If!01k%|K6vQwItO^+L!$&)8gw-OfS|~)UHP) z6BYq+M+uXwjEHT*1dd1GTRxT@+UdJVRSGFvS9ndF$=(B=BfI0!(|Z|=YMN@xSOY%} z`O*#;-bK7J?lahO!bcc^l$(+kf2*vdonzc4&ziEknbv04S@GH`UcV?0e8)2i=8dLMGeb_)*Ol*t9Jsyr&iL6c*ojZ&i zCjnOfRD70F07xnSB9wy6^JvBA2^e#i>_S<9`{CbSJcjsx&DNd<2BeH3bjoRd(3Qi~ z9J2w9wu{@UGD{ZmV>++^rw?1~S?lFg=1`s7Uj~kdW4Aa*43j0{ zsMjP;htwAINTFaJX9ihv)s{^!=idwS@VKl0+i=jSmO8d;SS@R+G-!U>YZf>AY;h3p z1o-#ny&1X(69+gKufgUuQ*NrSt7~%HK&UfY_q$^=?&6A z1=O<6GAISL1rz#cQ2^W=yeJ$g3ws%bbs9^lVb~Oa=BRQjXm0L(CqoM&^1b1P51UGC zzRv0-xkSmz#-?9{nAp_Z-24p*6McYaxxrOBliNy>j~Fc(jR@&;mC6zKFecPklIfE6 z+fIq5{qZ9Q2~C4~Tq;{2pv`>$spatzrKT6gaV39K71#ndf}~2GY#MfnXa91+#1lmR zl5-&prH!E|f66|kpL`)lJ0YUR=XYAgkP5uHv!wFx)pu8O`4`E}|L22?FG%Gr zUR=&x2Sq;q5A1|e$~fNPrD~1^OzN-tooE$#@j-LYGzr)ShE={6iD0VZ6WHlh2O;;* z)>ogJ<$Q(7pGSzFT#5mj%8JZj(%HGWk2ylVrvKj22v|Vc&toGaf&qts%bwKKWMTazyziK^uu} z-@iCiz+mm`BO<-Q001mqRh!@RScXe}*htpY^jN=b(&e+zDCm#h`~)CRa}!Sq0~ zpU7ekSt7AT19}#kGbKT!6r$763R}spOA`e(Dkh7iAS5)oPeZo{!YX6rT2eo2kTk>H ztW?Gh$%mXG!_kSvHYmqfg?*R@dQTr+o9d=-cK^Peec_#{@PmZo`#U zg7SPY8<}OuC=w0)50abTQt^V{*vLGPamod-aUsX@DahE|>ct%cX|fqTdhaFfgk-6Z zLyT<_tOGEEii}j4qfHG*HOmLk>}}E!MuwXjhUW-f#~Gcu@-tukfQJMMoyzf_srB^& zGuhjENs22(+`m+A1o6t5$_wVEVeffqvVv%h7B#)W@K$yUV3}Q3s>RYA? znu(|9Rt&P#8U9*8JoCF$LVvgz#W&Hi-orO>5NX{hAiOp>{7U zh2~@~M@p<@nwEGC|H8y&7sBk@mxy4Ai90a%S#e9r5%xZZs#=kt_g9wcuD~0%W+LX) z;@@Jfua8;IUH5a?oA95rn@v%zQ&o!`o7yvmb&*lk`C~}=?QGc<5Ht!gL4=W({#=*^ zkRFRLN)aCjD`*H<0+cib{TPwqKLDOcZi(3xcJnCobWZkE!_y@zQ4`GX?@OA|%iK-; z_!-~y&m8rZoB247YJG1Ck&jq)J=9)j4hhpJt`AAk-o{*=IH_VbLISkt<(OjK;=hDt z8a9}ma?y1VNJEBDoXYz2w_!VrJ0zAp3P>Q_mBY%I2dXu`QqAWIiw0>`98Mj*uVNua}t^Wor%`yi_| zOu+@$?H69|TcKOKwDbi=s6IiCw@k$nj{2@+Exi2t5A;6F!4L<0Akk0iQFs--+5mGb zo_j@5Q=x)Qm`SPGDxzFr;=+Y*Xd+^E%|^Kmvq_D9=EiFV!CY~N*W_-u!bA^PZTI( zp}rCsK_W3De!wX`#g~2NQ?&re{Rgeyfk@muQ-~-97mJS$v-41g!Miuq_vT=#5geP4 zK*jsm=DqoE+VOi1wjX0X{24WeedBW5p&;iwT7>+U(B+%4TXU&nm!8Cxd}wy&@^9}4 z#xMS@S;$2u>}r6%l1_*iQ4#664putG2g3hn0nI#&QoVf`i$Iows<2_^l%$Yad@OEj zB2B@a*Zx~y{F$i$z2TgkLJfFs4u*INcH_FjJ$KlO-t0kkPGQ0m#!1$mC)QOS(4(eV zKnPq^R1_iNMNbGk`u>!t+wNu54#W2Lwo)3ieu2~=OZBNigC6%nVw#h|MvH7=cBTC% zP#Q3Z^V6(K^|T~@=+>ZD`rpK8MpYi?mAwVDvE*0)6F)(ckL6w`Q^H!}%WUw&3Tian zptdv?4t!qD-}zW`u}$&BinQ+wgQgHoO3#xhDQmqcG7vYbPO}XDj&3j}6YNO#TN)eV6uJssA3`bXsv}2 z$toF$*N%FpROIgCkxNCFQBy2)yl5d}YY$Qp>S+YtXgdZOt&s=5f&!yDb%-Pi$+*FK zxqeqb_=$5%l!{L1(B(Gga(*Q`fo8oJiOV$&JGKyCv?X;fY{kK5^pF$|+$4HYa3pc) z(z=Mxr3;Dl)^YmzjKW~8Ztlt%387B{J@d6uBSb@3+C}KG8mkTiC?h;HMD@A0g?L?% ztdDEQN+B9E9zM>?UvB*8?Mgl_kngZJ4EbW~R1zO;O4cCA>nb?q zCt~K?A13wU^ZSks_|1Zp)-GUHYlkV;hJh_LTLV3JMra1#ZJN4q*|C9=6KQl^2lF|C-JvKwF)> zP52{Ez&yJ*6Y`i3W9Dch+#XjNqtItrASm0*JP*Ka_i=tsCIJ&Iq^ou@rlc?5OOg+AT5tY!3xG;t zV6kPLs=Il{7kX{P8Iz{D;e_{9Basc88-uI&M|y_Z54MnH<5c{lPXZUt9;HsVC1lA~ z|7)k@_!sOGFMqL43Qmc%jg*+}ao7-XgE%9-`lFlkADhuAK$DR zAv}2Sxw`?m#SWp>3o|@sX~=>m{y!)=i(DQt&7ua8?5^|GVfC)5Z>A{*Mkw6Se6dJS zod8dUb8Ae;&|8AtiX|_kDU+ycTkM}#b^}05O@s%pt8LJOp~e3b0^-Xcb76@T!a>6@ z*E0*i2}M-#2gY6Z0dX`=D>N(xO@}VRi?q5C!&D3lfhRN}K|*S<8;eieKM z{%gl!JadG0{lM8{a2pnY!D283Gk!{%Sl9SgOe8BnI+9{!641{#`vQ zL=pCb_)UwGvhN?B5yb&gQ3NAqNyr6-BsZ2neb+@b+n{I`^_`}GChE4DX8;d)H;eA( z%Z4hlr8BXDqI(Lsq>V)#7r$!?ms?G*KgfZJ#4d3XpYi2yo3eXuy9*mSK(-yICQ(4Xhe9s-RPSQ99iUdC1e; zeQ}k72B{spz#|pAzGqC7so;VdT0CaB1{p7j26XiNciz6R(5#k7u!5>8&BCol?=1pO zN#y9j@=M6pq-m4b|a5`3$)dVNwTCt?yN~OeHkU$+1XBp&D8XbH)CN?w^G>Kk)enzDJi$hX6j44 zY?#b2ZMn+g0YubZV;NSZ+96ttgg-VPXs?;Bl`S3=2qo7F%L7%P+o9{oO7B;z)lPqY z{@CiHX2%utC}I$qi2MF{*Vh-vFbYvO{9vQ-&pD63{C0-oh8K7d`vnGbMg5_Mu7fMM zOhQghPDh8(Exw_FS7DAXWAHo^=I{N|XPMQ9=>lnnkGZ=DEznHF{zO(1GIlzF$`pl) z=K;;YTcK~dS`9bl2Hc?7M9jQWy0X{xBQ(9q2Pq`Qu?ow0(~xw0xI*QQCLuYp6OVse zEbc~R|I+$a6^e-72XWsXaHZK%Qc+-qM!O7FS7wUD{2$&DVlDqp7lc6xl7ecbQG=ew z#NP0hw0OY33FUteZG`)`WuFZBoZG;z69$b+X{;sTE1mvJsUtz+Pq+2oMNm?Pvrip^ zP%#AK6QDc1X<=F~Qwjr{$$NEU2eEFo@y@>C7iqW}8l%a-3Y6J`?s9kbm)*w-2-{g`at47_ z6DZ9EerVx~a9*tN?R>tY-klPEn{UqJh~0mOI++yWf#mGCxVZlrGA+Sn|As$`zdfdW zyd4j(!u+yaW47>18_I|C@7)KZ2_%3Xo7;mi{7#D)%w}7Ch^7ub!69jfQ1@HR=Mv__ z-eivOkJ3`9A8>eb-Y%@4+jxy$Z|6R~VeHW*<>b8eB2&duihkD~hejWo?B+`2$oLmO z-|`mVM`BYofsyB2Y-&%d^y{rBvjr1G?=xnumTN7XJFbQxI5Z7;(*e_65^=#t(8oc? zWzsB0X@PngT^7IN*$f({L)rA}EYGuB<>$Y^I3NRByv|nNo*!6Dx;h3KeI(x;mR4cA z)%9$@)Nn%u{BNot^0EP9zkDu2kElY~uinp8L9a6f(#Y%Q=_Y}wRZ>q1iD+hT+9l<|?V*MeA>La;J4~6KtxEbXTb}3?u zRnr#NOkJV^O!M#WrM~)~LtPP!rNUqk(Fu;%n}ep6V?wVConK9ijL0?j^78^8)e_(W zs&&qU_^~<{sNj*CJj_Mz+p8Zg)(i{G=}gjrZePdayHjF6-Xz8z* z{aM9nb?ryWkkhrnle(rGtu$VmGXg(j_b{jVgYpc;=DV{<& z?N;FH^X=tUe+&VOwMRCmSs(P)Bnj0+4Skqh%qq6s-?sQL4L^)p-Jm#i_79NIu3RpT z6q?5fM~8f{9@m9he`gCP_H5k}^o^lGHxv94SdEuGZtWgNnotkpuo;TK=E%3UOVW+G z>CrPgF1lWVWq|DW7n{&PBjPV21!E|f4UK`i^R)Ez_Px)yNARj6N|-)G>Mc=t45So5 z=jn>)sRXfSlwVa}U+xpJ=BJ;hZ1HQ(`P_ZCtL?$Pv2^U9ASl7_ zMyBW?CdL*2dfYJc2bvrU0g#eW*zdGogi808rTk#lEen_ueITBL-9|11C2Fo)LF;r{ zD2=-d8VOl4a*s=rN@;mHZ{OmZ;ejcc_OUzdUE?_J#jZxQ+BzfJ>#>N^kU_Dypu~2F zD$K)_o25Tc+y9!EQ^E*xsG$&U;xHDVDh(rT46_5hhBGl4*`|1A1c~1c zbX!g=6`z5+pTROWx9%LUaUx!)!@|y8I@N*wQi_Ux3JQ3|!_bILv)bo8+B)aWT4V?=1^R zDVTnVwm*!d>Z0Pc<%DqV{Qf6qGkHq(r6mau{1#R6kr~y4&toRotR_&&;2##Is{m~-v=nJ#~-QIfSKOkd~3#7Zof1|ft zs56E+HRwi~MOVGw&vJ$<2+xyv2}zMoGHl}Y3{1Sp_wc_zg$>7RfgY76m9QU1w4$5; z-?Oh(XJPYbQ$KdYUjMyZbPtQX2ctX<;6)Ue-aDGMrg`MAhj@X$p-MkOFV{&FOlBko z49k9^8M?9W9)ao;bbce@lsS2Gd37=3mImb-5W+#Nk%L~4Im6T!lFknP7&&oYtQTYb z?GGQ?M20Dk8sr@+m8dE7zD&y4Ogr?_4zm3gJ=H783OK%XeXLOtO z`^BLCg^-qCF=QkaI9c(+Ssy@SISVR>*zg%>A0Kxf7Rq%)KJCz}B4d$a?5#IDUtDy* zq2XC^A}k7foCc^~h($lEXA4?9L&28my8*P%l0lj3r{$-c{qvQ2VQ2(qY;i(SQL(e? ze7&tPVI*51@D*xktu#5Y%xnKp%Xzs!!ESmdzNkk$;+v;$41f#`kU=|S)jJ;T3iNW^ovmS46|koD4EnBJAJ$vh-h@@&k4GAY3d>wWW zCV)IpX1k-{M>(mpmNNaZU-Hc~{L};ZX!6+1VJwh`zJIV5R-hJRj1cBN%BFo`)@?#L zlF)!VEH(If?J^-c&{7{H9RKWm33cdz9W9rN!cC{y^1a;q4Q{k1bp((BRtJg`y2u~J z#l>Qub1AD>Vfx&b8|=h(L?4d0{P2qZtHONQW=Gn;1xjYQ7oA?1HU>+>H1OlFCJvyo z!K18D{+2*7wY@QQ{lwmIqg4b?5rgT>6GPp%uxjy)h8VigZu8Tf9fNb8*3wVJklW9? zU}m`9dfw~2+Sm!!1m^ICWwt#BLSa^v9q>p&`1pWL?0YaXzK@qU@O$-g(8w2~_YGQ98F( zgY9Cc*e-?NWz;PkV#kyD=uC0)!_6zt6aD@_G!fumj)%vMmD(M?=UbhCaU(uow8#$j zyc&LKNBS|48-m?1Eq`b!;y&IS4;Ma(;I6{ce-K*a_#6 zC~-#)$o-hs)J~#mrON~pO~|s;;%1Y;n@gDkIar1F^aQ_67MxrWdd1W;Q0v;HAM>vJ za(SGr99FbqRs2z|_KQ$On7k2rIpR{aKW%xi-|9voJDiY$bvzKO@}~X}gI1$16&*wE zE8j#jt=9WwW;`bJ<$+(om@366$?bu-!9263Q|1>#cMWM}E0=1CQ z-%B?#x&ImmOG9L&aiAvMuhp~HNN5236CR)oGl-&i647}PROq@NR4ss0Y4FqD-%W*l zlyV}IzdTtp)$ALK)>?{itbN=5*UACkX6Ij=8>kt)c4Xco$Im*<4JnW>42IxfeIvtW znhTI1yT1?bUsHHp{_E>%;7(mAuG^S0&iBOt9o9e~<~M))S5055dl z`nXcN)tv>>6Y!P!WG&Bv@u~@jvH(D&a1A`H-K_Gevb4G%^Lbwm za!rW*{QZ4cvm~$_e0D{y7w|p}-~RaMv3kYUe%TYpyH;m=$I0&Wi$J6YV>UH2v+R@Y z{#3x4kAr6tnko&i?E;K|;?2owP)huZ>0_tDw~otmCbOLuZeQ!g z+@7U+2f%F90P?KlT{2yQIk<7JXgim;^LSMy!mC4fJroTK_8 zz3#K#uKFYCO)-*}(jfu3vLJhFjX&rC;Ki^#RTj{7U61juW8lZ6YsL+dq_Mn@e8y9U zr{?v!wjIRSLgPfOBT2`_m)lqn>%DY+zT15@!m5v6vG1p(WHL~XWEaDD)>vL*f{~)V zT!X~_uObP{FMcL&NvDI->7JaLfD&93$|Bzm(_s!GA?-%Vu#Tui4nNv?3KOh zbq3*V>a`3-F}|E8{yF#s!}}DIG!T<{u;j@K83tE9`{eUphP0I}SN zs01~l7BrfK9H*$AyNN`;wHPl0EV_^9cFlv23KNKkwk7#4`=xuLhN_N=`4g)|_=_ z>_Y3BE1v$TLMB>4Zb?#x{+4~_xb?K7{0U)L>u0<}HhqGbQPOGW%i2b_r0+TYHKQ9l zQN$S_dqAs#y;A1?bpP_y7|z`Kl{^1zFYj{@3}P%IE^Igw>k^&%(-q6@9q8%<0~^3) zEI6mPTqT<9kC)=J1g+RGuTQ3Tr@MxJZ9lW1>3M`8Ue+kgK z>yk@wyuDI+$m|cn7D0JbWx|U)g`6Rb3vpa>fXk+}TR8v!McLnnJL#$(@p z^#P^uIG0?=v+7r!yDQomN8U-v(05hSB^CUnIZb4pm^E1%a(#W-^% zgV_=s_u!342~lEe@+ot~bMZwV&*1A6I{lyOo?495s2Sf-M)Z^arVxshOyH3wm$vv6 z`KJQntrOWQ^X1G%xdT}a=ZYX;{ zf>;XF3rsngs$M?#7=_3T7!e0BFCoKJZFkanq>57rHNC>oZgcd%8+e1y>F_2bh>nZq zZ{H9e`vWt98J|d<{j~iI5e>N5*T~ndb~}8I8QI0dX0ei(qwI!5#MQ04?3^x8bq>A1 zdbNGhmoIpYBJ%D2jRiW0PktKo4Gg&Ztb^1(B6Z>%XWZM2X$O{zA=~ z!JfR))SbIywoAuaJQOv`aWACh^o0v0GYNW=DP$!OCaP9n@G@g7UXyTf)D^*fi8N(a zN}uhkD>z1QXQ`5DZh4hHD@GY~ZZKO8_DYQ>Y z?C5AkfmYsCy$H__pt+l?(2&h@f%vJ2S;E~L^A9A!GjQ%D=L^ojGnfO4EaXx=O&`b$ zVDduYe`{R#4;(T@NiM!z- z_9On4C>DPZdrn9Yi(LSXjx;bnA_x)8BNx~yB1=rWgAplH#PI@oN}B>hX#gRX zQd8XxG`3DE!|BSYLMvez=}<*M`UT6BL-zdC=rCRHpNa{Cf7_Gsq?2O`K2%IKyK0#Rf*^p;h=bBdRuJv`x{ej22*KXYW$A|>>kDhFmPOePRyTz<^*?PHMrS=3qo=P;)(xJ zZIKm`J6dhL5yJu?BTAC#dWYYYQNYvH{O}hhaHwHyQb61&sWN!%biuqAovkgw zc7vZ~ER_Qurye#ecxl=nuK3~h@8=*_D~EsL6x{0njV$-n0u$ydOv@QIjC$8!DU%|e zBOMY=2tTa+q!E4FB6(Wx%ZCsvksVYL&am-CojQ#9IsL6o-~kks>dg2r(XM#Vbg=-sB+-8?%=l*DN&PvJUU>pJ%ek?zc^E^Tp zJ!GZQfFN4B;sL8b%d>xjY9c&)g0ERn^7sm+_ubqaHbT3Qm_EqIeV%aOkn-14@nF=d zXnXFVVi#~uF2MmzXejFDZuVzzS16X)Ge@&OGA)A4>v)#%JFmlXvE(fZ7Lyip=i&E< zM`=DMlNC16UPafd63qb>via*gLl>p&oAm&T-FR})ArA6+oNR`nOIEaYr<}r2Zhp~n z_q&Lj*KM?icSF=28f#qPv^?8T%j>W$SkkRFxf8y*x9y$)Y-!umwH}LJosj$E!ihoa zQi<#i28r|P-tWAFnPRd+_zw3uO z1ZPUD+A)ZX>S1|i3VGocu@YvXMP^no^)Nqvd3g|}w59yL;y*whmW-ws8?;pDrv)i) zH4LISe5Eo!+2mxJckVK+#4En(Z4tiz438}YBg!J{7n~RloMLW&V~P5VtSo6iKi8{+ zSyisDrzCK9UOQGf)U_f3Hm@{)(%Ey69i; z`J1Z4Lizun1;lorH1ASmeE_3x%k!m<` zh(Fkq$ZtyNlWkV0IWWR{q9`!` z+!$`wh)K!=r&g`1K1It)^&US!9JB%E_Xm{MOtwq1_?UmxE_PUkzcRL3{gp}J126or zB!6*idLlL~LqT_2WSRLgFZAOlfiu59zrImLP+E5N86>M5@>=Gc++A+t^NoUjA^+26 z%b|niOcRHtH!3P(okziYy=@-*B@{2u>t-VEe-OGdP=~K{zOX6@X3W*Sn+A3sp(gEQ zp;87c3DPV&1F~fj_$CpsrfV%K3&+x_+%`pA_r`vzWY3BI>i4>djfO|Q4*6i}gaA7> zNKM)6PmuV#U)Au1Nv}>;v0S%)kZ3BlYEJVOw7Za$IeFfl}1U6R$AYCoC zi=2+UHDSO@98G_V&VYwfu3CXduWUK|MJDQH|_T-tkG|KDj4))-JTsx5P!jxLnoJ+z4<8{4-xd9Z63vI#HD=G45=1! z{<)Hnqeey1s;hTAd2>^%)_yp)@qTDnW{jokzv)jLq8m&2K^z9h4pg6by~z2O1o;-o z_ESnar;qi{h>tYW&42-mMn+&2_6En#h*pv1D6^1jQ0;7)CevAq(ImQS zuKRJl1N8Q9X++|^%f^Gb(a&-3EAZByaPC7~C{g`whF+|9F5rG-=6IG@hSuI__0fCM zFQd`2n{-v&ZN~63_lHUx@R3{xH*My+num4Bd}n1kT)Sf#HmEQNGJ;Aeqg6<&mK+2O zW|q*TYHju&9MYnxyw4(N>BN>!K&oC644q_MT6<6KvEnoUY)1g=`cSU1okiYc3__g7c0U^hBs-@X^cCO^Epx$bCc%!|KjE&eoarG+-e+@ zMJ=d3l`G+Z-lXxJv#9VlM&g~Kr$=1>Ox-$CHSaHa9B8Wyi&w+SLq!V1ya4nz=7^ZQJsoV$t4GK>>zcylX*8zB3Miu)2p|P*Z+~iI z>FLuA-v=}1cMG`@jw9Ze@ZT3HeGVe}qWhCJVWazUz11&xetA7aW&Ba(PHQIUEFUXo zL{cD=tot`=jliX-jW;m&o9wSb_&zoc%#c69Y7*XYlxY#xGTS~?dGx~DzoPZ%8b~Jo zAx7TU_+};6hsp%2(i}T|3Btnk@{|E{ZN}3~Wc~PcHUYztNy6tloLdowrO$c4qPRF_ z<1OSTQt_1c@k7wBcyRJDD_oJDCvgS?*awh^UIO4~r}7ZS4qtwm1xOUm+vW?xZ@M~2 zKbW4Z$+HKVu&cxpTtdHoz*@Qu9HoJ&Z(gL8=q}`5RWfI@k@r_Y!*3ues3 zEcm zZ}a?YIBzM+Yp>mDekD&Cde$gCGIw>rJGt^xC9BQ-IDO`gW`gACcmAinM4I_kzRT&) zBA!=q9?=LLGrp`eG#4w)DP1JtFeqm|3YFHZhx5-`g^G*n;k_8+7UmU(^*`($u$Cr( zHM+I6m9PWurU&h`PN?r4$}J~y*`eG+A#d9MX1CV86QQ8^5)4eOHfP5#$00kl1N96?Mwk}TUp47SO^?|UJ(AMXdfj}#}Cu? zcZ*n+##V5xl=|&dff21=seUw^Nl%hzE6)?EN&GEH!=K)18{0o%taf;AhndR@!7^$HN$e>@hYI0JR!KTvpD6Tm=ct@h`hjC2D*i8L{ zXP6MG>qP=c=HT>(in)GkcY7lBX~+riU!l`hJIuS2J}(Ediu zE1u9RQ|>Zow$$0BYJjIq$SnzvlAiuSe~15R_ij`%rSxner<8rQ39UM8x(liL1UI&< zMFWw6(5o(t51NlqqrkFPF}X-7p0M~Erx>$_Q^quehd|0WMHYh<5qcW-w5@{LJ*Tw)XuEZIwQx1b3N&d}m@(^#>aCFYTZ;Ty5W-ZBN9XD>H1innsGD zK?zLT9Y0>K{i(h^JfrP)_||f@A?x{~ui6xhNM|bABQ(B;yA_>Z`S&wOn1<-$508Yp zn?*tJF{xP0Nlv_LQtbv$3nppMtV4t>Mn8*3MIYCROHJEy=#76OnOV%C0sd+Tc+%(Z zXy8Bpu%To$xs}U9cQ3szYk<(|k*~;K|M#^}7G#*9R6IoHv*^`I8rRSIY`}?% zA^zDcIT0?^tW5l}E$YYJtnCc05)$y!x$XRWC-o=-ZUb6I=2$YoSY$e2W22K^xd}WM zf6q1K>+Fxyf!}f{I`PTOlE|CG<8e)uV*P=Bu95oPDXqZS? zo_fmU4&ygggJDX;NBE<~_QS*9AN4(YC&2)^T({X|bdT+%>2U3Fr&7tay~GFfqxs*x zz3*p=-L+g94BKuK4jpFT0dUdb^taG#bBlv37es*Cizi@~7%m+A_|-Lf9ElLY(T{5q zvXH51Mx!^?zQW!29OuQ{)AvF89_ih89Ye)r^$D%C@-GY$k!0^Kc9#BYMI$G7f8szr z@pT08onkK{$Iui_S|COqXQe`Tg!kCPem^ z%4Mf_ST^VfLq5jc`z}reEV=DjD&~vl^)E?#dwc8aXSz2PRi~o9QN0BmJ&|~o_;6_m zO0{U~s8I;_{%B29GS<)6aTQCbU5Ju$7`}-q>AWsY&`h8pE;zd<1=Xi z^63eIw~!$zEfrRKU4yFLCp7-rg&^16@%|fq)N`+oYRubgqsA@O4<4Va75phb`8i2l zV&SH?Z+TRkp03umf~z5q)rY`qm;O4&R`-)Y^xNec&5RS_%DI)!`}0~b(q6*t0Xky) zzw3v)i;xYX%A$4nOktN64l(csYdw9)ZeSu%ty0ZJrtn?3-4=jm>-l26pZ3D|ocg7I9pfdu+(J!j#1$d9!f5@rJeHqy=rk@9`z*8Z zRySFznKY*o7_BrE&@r`sWblkFi_pqQ#J)ySjq+z2K-zXMkaVZ`4p{ozWD+^bs&zMMjnv`EpZAd7n-5rnU()utwCi#gwMed!` z);L^37XUUM*#)38VjW^A7^Q z&MYkik*iTN9XlP@H*X?5KZlm+8*NSdLV{U{ zdbLo`cDE!&ga;lvP3FpkP~$ZztwchlC2tgm!=1#|MO3hrw4&WEL>l!fqZest#x-j) zh|1otMFpid0tu6JwnzuPSZJ&WA!!m`fAvAvJ}KU+M8ngTJ=U>JgWIz*Z75vceVtvySjfKDXhWI*Zlv7<5`R< zwB%~n9j7{1YVc*MP}FT1qOs(0)H{=xS(rWRun*;C#f+kC1p|i94LO}HDjD4jhtW?I zz7L_U(ucm38x|O(^0b+hwJPK(Hajo>IdB}RN9Wr}QYomoUe?XJFDIL2B%OyK{|0$!Y6V@I1MoHKga;st&h+IJD{u~jwE z-Ta>d--Kml)w}K0I&vmcU4)!W+`4j_c|!Un>@sU>1q+^)Lhi3B{fw=uwI;t0E3_Hy z=>Y;-y*qfeD}yFSs>4UGV*#>kmq{F9jDh-0&(MUfDANcHc`fdi&>kc=*{qC&-NdBm zj0$^>cj;fqb&{n_>clNLIm0nJUQ?NM2oDYuwtK_-<9|uYQg~r-_}5hzDOJNQ`@FEf zqpTJr1?XsrG=hX2;RT5kX1*xAvu$OK_nEvUO(dfo#c9pkD|7$Fw)bSm2V=AZesYxR zv*)mZ)#oRM;6YWSL{cI+8nDv)hD6F>^kX`zD^kFT-;l0g$ah|s*)%k>H*jvj_=;W5%eebc zX54+I!W0Y{C4>GIDgqa|6YCBtgPx%zy*y}v3L154`Ye{#YrvR)J#Xs#lrnr1NV0=X zk3Exm z>O#LVlPb{p;ItO&r`7|Fgz6yhScaef2`*3He^Zax)YB~cjI#2Wv_5P(i|XcqydSsl z&I5NfX39?bh<)SaCu7x?6g@H1t7ro7QMI0mXO1-R>pKj%wpDfGURQt>koIv?{U}_s z(_`}OC84bmvT|yq5dR@>*Kz5hLA2 z>T__I44E3+cd9;^hDt9|Xx}4DP`;8^vS*P(jd(?F3 zPUw5S4C%$#5%)YgS&Y{P5*&SS!i>seruQb_-Gm4|&2TH}BMT_23E=o;{+F-)U+l!~ zA55e_!6CdvY`rp$je|ACr~_Pz2WC^w_s={Y0m-9ML0$(KY^Dt{M5$kl)_`{;?Ev6w z0qR~PoT~=oD)H6%)SOR5jKwp82}cl@Eh-{cDdN0HsuH0=s;^|Af_-XNqPw+CARpt{ zj~4%r8IKr&r&>GF9v+$H;~W%3(~s>s9^WwUG(94%hjkONAd>C>e6bUcfWH>2{Xx{# zUr-!#U|cXX5j=UlC_i;9s>I94U;pgEP4{$|wABBT$df1Nl}dz@K(ol-qOvcW*P-jsx?=p1BZX-+jV zwio_rY>cvfY@xW#thhfmQZ!~De(nr`LSiWGpYn)91TlxrLOu`)a}Obf`0zcoPAGX3 z@yHS__~Z=G+Hsw#f;>qA$w+yh(0pak=LKWCb*5N~`g3HGW7_Y|}i4IO@_9F>uYK|j1nCrqpw!BHqf1;`&J<~CLlQ9%)V<;q7(&?xhE(X&C zhbNNJb~1qo&!MhHyhCVDuI6v+*|s>U9S{rozf7zfzG-TpuhB?pX`W~NADbUR9LR*{ zJr5~umC-q(!slS$36q-EZLwiYI`crXbyYi}cETH|bA3Ef%vFEi)hD4Q!Ec|k6)F*P zq-k#b(ClV9(Q~5P|+R);xNUA=Q z5M?9wPy@3NG6k$l^(|txF(hHnvkh^=BoigReE?L)w;?7SZTsC11n40&r%}k-CHoet zd&J56A;-X5B~FsqN=r!n4K;ZeW6oXj-)@6E8aoe&KaX7J1;G`0qmfuGkqK){D$&;} z{~-$UQBgZu!DppmlISeb9|hye$}v^VqMFP^Gy!rr4~b@}X|@Fw)-Ab5w)lGz(c( zy+U$OXWealNt30@=?A&Q({-#~;~`tfh3bIgB^?#XFVrI@QC?KzOCkB53_KNL*PTC* zATH^5*yvDhd)R_x0YRR~Ukj8YBk7`}7bZ30JF()nrQvS8h+N8%$EHIiN`sRa()QMP zj0$RkIu{TxsRpi49xvR{Qthh9g~TjLK}14FC-~?<1qvARXQQSjBe|`aVaS}Tr&mLs zwv?{+-cA=46c@39H}uw{Zex|T%Kl^=>3y;Cz{gE&@3a`I0z6KQzddwj6~Lg!l<`

{whOTm(4yd=j*^4^CneEIMY~D2 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 literal 0 HcmV?d00001 From e35bc9b84dfd920dc3d912d419d73c61222612e1 Mon Sep 17 00:00:00 2001 From: n3wr1ch <40690535+n3wr1ch@users.noreply.github.com> Date: Fri, 7 Aug 2026 13:31:13 +0900 Subject: [PATCH 3/3] fix(omp): align profile and export docs --- docs-site/src/content/docs/guides/integrations.md | 9 +++++---- docs-site/src/content/docs/ja/reference/cli/agents.md | 10 +++++++--- docs-site/src/content/docs/ko/reference/cli/agents.md | 10 +++++++--- docs-site/src/content/docs/reference/cli/agents.md | 10 +++++----- docs-site/src/content/docs/ru/reference/cli/agents.md | 10 +++++++--- .../src/content/docs/zh-cn/reference/cli/agents.md | 10 +++++++--- src/cli/export-command.ts | 8 ++++---- src/cli/help.ts | 4 ++-- src/clients/config-export.ts | 4 +++- tests/client-config-export.test.ts | 4 +++- 10 files changed, 50 insertions(+), 29 deletions(-) diff --git a/docs-site/src/content/docs/guides/integrations.md b/docs-site/src/content/docs/guides/integrations.md index a11ebd2fa2..9822b186f7 100644 --- a/docs-site/src/content/docs/guides/integrations.md +++ b/docs-site/src/content/docs/guides/integrations.md @@ -16,10 +16,11 @@ file, and removes it again. Seven clients work this way, each with a switch: | Kimi Code | `~/.kimi-code/config.toml` | TOML | on restart, or `/reload` | loopback placeholder | | Gajae Code | `~/.gjc/agent/models.yml` | YAML | new sessions, or when you open `/model` |`OPENCODEX_GAJAE_API_KEY` | -Paths honor each client's own environment override where it has one, so a relocated -`HERMES_HOME`, `KIMI_CODE_HOME`, `XDG_CONFIG_HOME`, `PI_CODING_AGENT_DIR`, `PI_CONFIG_DIR` -or active `OMP_PROFILE` is followed rather than guessed at. The table lists each client's -default; an override always wins. +Paths honor each client's own environment override where it has one. For OMP, +`OMP_PROFILE` wins over `PI_PROFILE` by presence, even when explicitly empty. A named profile +uses `PI_CONFIG_DIR` as its root and ignores `PI_CODING_AGENT_DIR`; without a named profile, +`PI_CODING_AGENT_DIR` wins. Relocated `HERMES_HOME`, `KIMI_CODE_HOME`, and `XDG_CONFIG_HOME` +paths are likewise followed rather than guessed at. The table lists each client's default. OpenClaw has several, and they do different jobs. `OPENCLAW_CONFIG_PATH` selects the file; `OPENCLAW_STATE_DIR`, `OPENCLAW_PROFILE` and `OPENCLAW_HOME` select the state diff --git a/docs-site/src/content/docs/ja/reference/cli/agents.md b/docs-site/src/content/docs/ja/reference/cli/agents.md index 783e274529..224be41e8c 100644 --- a/docs-site/src/content/docs/ja/reference/cli/agents.md +++ b/docs-site/src/content/docs/ja/reference/cli/agents.md @@ -133,15 +133,15 @@ Grok Build モデル フェンスを管理および適用します。 |旗 |アクション | | --- | --- | -| `--client ` |必須。クライアント言語を選択します: opencode のキー付き `provider` オブジェクトまたは Pi の `providers` 配列。 | +| `--client ` |必須。クライアントの設定形式を選択します。 | | `--json` |構成 JSON のみを標準出力に出力するため、リダイレクトはバイト正確な出力をキャプチャします。 `--out` 書き込みメモを含むすべての診断は stderr に送られます。 | | `--out ` |設定を `` に書き込みます。既存のファイルの置き換えを拒否します。 | | `--force` | `--out` が既存のファイルを置き換えることを許可します。 | ```bash ocx export --client opencode # config plus destination, merge warning, and counts -ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff -ocx export --client omp --json > omp-models.yml # OMP models.yml provider block +ocx export --client pi --json > pi-models.json # JSON document for a pipe or a diff +ocx export --client omp --out ./omp-models.yml # native OMP YAML ocx export --client opencode --out ~/opencodex-opencode.json ``` @@ -152,6 +152,10 @@ ocx export --client opencode --out ~/opencodex-opencode.json | `opencode` | `~/.config/opencode/opencode.json` (設定すると `XDG_CONFIG_HOME` が勝ち) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | | `pi` | `~/.pi/agent/models.json` | `pi-models.json` | なし - ブロックにリテラル `opencodex-loopback` が入ります | | `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | なし - loopback placeholder | +| `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | +| `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | +| `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | なし - loopback placeholder | +| `gajae` | `~/.gjc/agent/models.yml` | `gajae-models.yaml` | `OPENCODEX_GAJAE_API_KEY` | opencode は `{env:OPENCODEX_OPENCODE_API_KEY}` を補間します。opencodex が生成する Pi のエクスポートには環境変数が不要で、リテラルのプレースホルダー `opencodex-loopback` が入ります。この値は必須です。Pi はモデル リストを構築する際に `apiKey` を解決し、既存の設定に未設定の環境変数参照がある場合はプロバイダー全体を隠すためです。ループバックでは、生成されたプレースホルダーをプロキシが検査することはありません。 diff --git a/docs-site/src/content/docs/ko/reference/cli/agents.md b/docs-site/src/content/docs/ko/reference/cli/agents.md index c45aea4674..241d4ba6f0 100644 --- a/docs-site/src/content/docs/ko/reference/cli/agents.md +++ b/docs-site/src/content/docs/ko/reference/cli/agents.md @@ -139,15 +139,15 @@ Grok Build model fence를 관리하고 적용합니다. | 플래그 | 동작 | | --- | --- | -| `--client ` | 필수입니다. 클라이언트 방식을 선택합니다. opencode의 keyed `provider` object 또는 Pi의 `providers` array입니다. | +| `--client ` | 필수입니다. 클라이언트 설정 형식을 선택합니다. | | `--json` | config JSON만 stdout에 출력하므로, redirect가 byte-exact 출력을 캡처합니다. `--out` write note를 포함한 모든 진단 메시지는 stderr로 갑니다. | | `--out ` | config를 ``에 씁니다. 기존 파일이 있으면 덮어쓰지 않습니다. | | `--force` | `--out`이 기존 파일을 덮어쓰도록 허용합니다. | ```bash ocx export --client opencode # config plus destination, merge warning, and counts -ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff -ocx export --client omp --json > omp-models.yml # OMP models.yml provider block +ocx export --client pi --json > pi-models.json # JSON document for a pipe or a diff +ocx export --client omp --out ./omp-models.yml # native OMP YAML ocx export --client opencode --out ~/opencodex-opencode.json ``` @@ -158,6 +158,10 @@ ocx export --client opencode --out ~/opencodex-opencode.json | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME`이 설정되어 있으면 우선합니다) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | | `pi` | `~/.pi/agent/models.json` | `pi-models.json` | 없음 - 블록에 리터럴 `opencodex-loopback`이 들어갑니다 | | `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | 없음 - loopback placeholder | +| `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | +| `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | +| `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | 없음 - loopback placeholder | +| `gajae` | `~/.gjc/agent/models.yml` | `gajae-models.yaml` | `OPENCODEX_GAJAE_API_KEY` | opencode는 `{env:OPENCODEX_OPENCODE_API_KEY}`를 보간합니다. opencodex가 생성한 Pi 블록에는 환경 변수가 필요 없으며, 리터럴 placeholder인 `opencodex-loopback`이 들어갑니다. 이 값은 필수입니다. Pi는 모델 목록을 만들 때 `apiKey`를 해석하고, 기존 config에 설정되지 않은 env 참조가 있으면 provider 전체를 숨기기 때문입니다. 루프백에서 proxy는 생성된 placeholder를 검사하지 않습니다. diff --git a/docs-site/src/content/docs/reference/cli/agents.md b/docs-site/src/content/docs/reference/cli/agents.md index 3b23b95a2d..cdf973bf74 100644 --- a/docs-site/src/content/docs/reference/cli/agents.md +++ b/docs-site/src/content/docs/reference/cli/agents.md @@ -158,14 +158,14 @@ models Codex can currently see. | Flag | Action | | --- | --- | | `--client ` | Required. Selects the client config dialect. | -| `--json` | Print only the generated config bytes on stdout, so a redirect captures byte-exact output. Every diagnostic, including the `--out` write note, goes to stderr. | -| `--out ` | Write the config to ``. Refuses to replace an existing file. | +| `--json` | Print the generated document as JSON on stdout for scripts. This is JSON even when the selected client's native format is YAML, TOML, or JSON5. | +| `--out ` | Write the client's native config format to ``. Refuses to replace an existing file. | | `--force` | Allow `--out` to replace an existing file. | ```bash ocx export --client opencode # config plus destination, merge warning, and counts -ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff -ocx export --client omp --json > omp-models.yml # OMP models.yml provider block +ocx export --client pi --json > pi-models.json # JSON document for a pipe or a diff +ocx export --client omp --out ./omp-models.yml # native OMP YAML ocx export --client opencode --out ~/opencodex-opencode.json ``` @@ -177,7 +177,7 @@ client applies its own defaults for those). | --- | --- | --- | --- | | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME` wins when set) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | | `pi` | `~/.pi/agent/models.json` | `pi-models.json` | none — the block carries the literal `opencodex-loopback` | -| `omp` | `~/.omp/agent/models.yml` (`OMP_PROFILE`, `PI_CONFIG_DIR`, and `PI_CODING_AGENT_DIR` are honored) | `omp-models.yaml` | none — loopback placeholder | +| `omp` | `~/.omp/agent/models.yml` (`OMP_PROFILE` wins over `PI_PROFILE`, even when empty; named profiles use `PI_CONFIG_DIR` and ignore `PI_CODING_AGENT_DIR`, while the default profile lets `PI_CODING_AGENT_DIR` win) | `omp-models.yaml` | none — loopback placeholder | | `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | | `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | | `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | none — loopback placeholder | diff --git a/docs-site/src/content/docs/ru/reference/cli/agents.md b/docs-site/src/content/docs/ru/reference/cli/agents.md index 6f69806235..a63462091f 100644 --- a/docs-site/src/content/docs/ru/reference/cli/agents.md +++ b/docs-site/src/content/docs/ru/reference/cli/agents.md @@ -164,15 +164,15 @@ override, но файлы на диске никогда не меняются. | Флаг | Действие | | --- | --- | -| `--client ` | Обязателен. Выбирает клиентский диалект: keyed-объект `provider` у opencode или массив `providers` у Pi. | +| `--client ` | Обязателен. Выбирает формат конфигурации клиента. | | `--json` | Печатать только JSON-конфиг в stdout, чтобы redirect сохранял побайтно точный вывод. Вся диагностика, включая заметку о записи через `--out`, идёт в stderr. | | `--out ` | Записать конфиг в ``. Перезаписывать существующий файл не позволит. | | `--force` | Разрешить `--out` заменить существующий файл. | ```bash ocx export --client opencode # config plus destination, merge warning, and counts -ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff -ocx export --client omp --json > omp-models.yml # OMP models.yml provider block +ocx export --client pi --json > pi-models.json # JSON document for a pipe or a diff +ocx export --client omp --out ./omp-models.yml # native OMP YAML ocx export --client opencode --out ~/opencodex-opencode.json ``` @@ -185,6 +185,10 @@ context limit'а (для них клиент применяет собствен | `opencode` | `~/.config/opencode/opencode.json` (`XDG_CONFIG_HOME` имеет приоритет, если задан) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | | `pi` | `~/.pi/agent/models.json` | `pi-models.json` | нет — блок несёт литерал `opencodex-loopback` | | `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | нет — loopback placeholder | +| `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | +| `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | +| `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | нет — loopback placeholder | +| `gajae` | `~/.gjc/agent/models.yml` | `gajae-models.yaml` | `OPENCODEX_GAJAE_API_KEY` | opencode интерполирует `{env:OPENCODEX_OPENCODE_API_KEY}`. Сгенерированный opencodex экспорт для Pi не требует переменной окружения и несёт литеральную заглушку `opencodex-loopback`. Это значение diff --git a/docs-site/src/content/docs/zh-cn/reference/cli/agents.md b/docs-site/src/content/docs/zh-cn/reference/cli/agents.md index ac29040be0..9a4ba11937 100644 --- a/docs-site/src/content/docs/zh-cn/reference/cli/agents.md +++ b/docs-site/src/content/docs/zh-cn/reference/cli/agents.md @@ -134,15 +134,15 @@ ocx claude desktop import [--apply] Validate and import JSON | 标志 | 动作 | | --- | --- | -| `--client ` | 必需。选择客户端方言:opencode 的带键 `provider` 对象或 Pi 的 `providers` 数组。 | +| `--client ` | 必需。选择客户端配置格式。 | | `--json` | 仅在 stdout 打印配置 JSON,这样重定向即可捕获字节级精确输出。包括 `--out` 写入提示在内的所有诊断信息都会输出到 stderr。 | | `--out ` | 将配置写入 ``。拒绝替换已存在的文件。 | | `--force` | 允许 `--out` 替换已存在的文件。 | ```bash ocx export --client opencode # config plus destination, merge warning, and counts -ocx export --client pi --json > pi-models.json # byte-exact JSON for a pipe or a diff -ocx export --client omp --json > omp-models.yml # OMP models.yml provider block +ocx export --client pi --json > pi-models.json # JSON document for a pipe or a diff +ocx export --client omp --out ./omp-models.yml # native OMP YAML ocx export --client opencode --out ~/opencodex-opencode.json ``` @@ -153,6 +153,10 @@ ocx export --client opencode --out ~/opencodex-opencode.json | `opencode` | `~/.config/opencode/opencode.json`(设置了 `XDG_CONFIG_HOME` 时以其为准) | `opencode.json` | `OPENCODEX_OPENCODE_API_KEY` | | `pi` | `~/.pi/agent/models.json` | `pi-models.json` | 无 - 块中携带字面值 `opencodex-loopback` | | `omp` | `~/.omp/agent/models.yml` | `omp-models.yaml` | 无 - loopback placeholder | +| `hermes` | `~/.hermes/config.yaml` | `hermes-config.yaml` | `OPENCODEX_HERMES_API_KEY` | +| `openclaw` | `~/.openclaw/openclaw.json` | `openclaw.json5` | `OPENCODEX_OPENCLAW_API_KEY` | +| `kimi` | `~/.kimi-code/config.toml` | `kimi-config.toml` | 无 - loopback placeholder | +| `gajae` | `~/.gjc/agent/models.yml` | `gajae-models.yaml` | `OPENCODEX_GAJAE_API_KEY` | opencode 会插值 `{env:OPENCODEX_OPENCODE_API_KEY}`。opencodex 生成的 Pi 导出不需要环境变量,而是携带字面占位值 `opencodex-loopback`。这个值是必需的:Pi 在构建模型列表时会解析 `apiKey`,如果已有配置包含未设置的环境变量引用,它就会隐藏整个 provider。回环上的代理从不校验生成的占位值。 diff --git a/src/cli/export-command.ts b/src/cli/export-command.ts index 64e3587a95..96efbc4c28 100644 --- a/src/cli/export-command.ts +++ b/src/cli/export-command.ts @@ -179,13 +179,13 @@ export async function handleExportCommand(argv: string[], deps: ExportCommandDep // Every serializer already ends with exactly one newline. if (out !== undefined) writeExport(out, text, force); - // stderr, so `--json` stdout stays byte-exact for a redirect. + // stderr, so `--json` stdout stays a standalone JSON document. if (out !== undefined && wantsJson) console.error(`Wrote ${out}`); const degraded = models.filter(model => !hasContextLimit(model)).length; - // `--json` keeps emitting the DOCUMENT at the top level: a script that - // pipes it into a config file must not have to unwrap an envelope we added - // for our own convenience. Format metadata rides in the human lines below. + // `--json` keeps emitting the DOCUMENT at the top level as JSON for scripts; + // `--out` is the path that writes the selected client's native format. + // Format metadata rides in the human lines below. printData(clientConfig, wantsJson, [ text.trimEnd(), "", diff --git a/src/cli/help.ts b/src/cli/help.ts index 79707bed79..4737f9515a 100644 --- a/src/cli/help.ts +++ b/src/cli/help.ts @@ -176,8 +176,8 @@ const helpEntries: Record = { usage: "ocx export --client [--json] [--out ] [--force]", summary: "Print a client config (opencode, Pi, OMP, Hermes, OpenClaw, Kimi Code, Gajae Code) wired to the running proxy.", details: [ - "--json prints only the generated config bytes on stdout, so it is safe to redirect to a file.", - "--out writes the config there and refuses to replace an existing file without --force.", + "--json prints the generated document as JSON on stdout; use --out for the client's native format.", + "--out writes the native config there and refuses to replace an existing file without --force.", "The config never contains a real key; it carries a documented env reference or a non-secret loopback placeholder.", "The destination path is printed for merging by hand — ocx never writes your real client config.", ], diff --git a/src/clients/config-export.ts b/src/clients/config-export.ts index 065308ce0e..794f4bef42 100644 --- a/src/clients/config-export.ts +++ b/src/clients/config-export.ts @@ -174,7 +174,9 @@ const OMP_PROFILE_NAME_RE = /^[a-z0-9][a-z0-9._-]{0,63}$/; const OMP_WINDOWS_RESERVED_PROFILE_RE = /^(?:CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9])(?:\..*)?$/i; function ompProfileName(env: OpencodeLaunchEnv): string | undefined { - const raw = env.OMP_PROFILE?.trim() || env.PI_PROFILE?.trim(); + // OMP_PROFILE wins by presence, even when explicitly empty; PI_PROFILE is + // only the legacy fallback when the canonical variable is undefined. + const raw = env.OMP_PROFILE !== undefined ? env.OMP_PROFILE : env.PI_PROFILE; const profile = raw?.trim(); if (!profile || profile === "default") return undefined; if ( diff --git a/tests/client-config-export.test.ts b/tests/client-config-export.test.ts index 3e85040e17..428700f1ab 100644 --- a/tests/client-config-export.test.ts +++ b/tests/client-config-export.test.ts @@ -476,11 +476,13 @@ describe("EXPORT_CLIENTS registry", () => { expect(EXPORT_CLIENTS.omp.destination({ PI_CONFIG_DIR: "/srv/omp" } as NodeJS.ProcessEnv)).toBe( join("/srv/omp", "agent", "models.yml"), ); + // OMP_PROFILE wins by presence, so an explicit blank selects the default + // profile instead of inheriting a legacy PI_PROFILE. expect(EXPORT_CLIENTS.omp.destination({ OMP_PROFILE: " ", PI_PROFILE: "legacy", } as NodeJS.ProcessEnv)).toBe( - join(homedir(), ".omp", "profiles", "legacy", "agent", "models.yml"), + join(homedir(), ".omp", "agent", "models.yml"), ); });