ompgui 0.7.9 → 0.7.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +6 -6
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/react-loadable-manifest.json +4 -4
- package/.next/required-server-files.js +2 -2
- package/.next/required-server-files.json +2 -2
- package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_global-error.html +1 -1
- package/.next/server/app/_global-error.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/api/app-update/route.js +1 -1
- package/.next/server/app/api/model-roles/route.js +1 -1
- package/.next/server/app/api/models/route.js +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +3 -3
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/server/app/login.html +1 -1
- package/.next/server/app/login.rsc +2 -2
- package/.next/server/app/login.segments/_full.segment.rsc +2 -2
- package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/page.js +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair/page_client-reference-manifest.js +1 -1
- package/.next/server/app/pair.html +1 -1
- package/.next/server/app/pair.rsc +3 -3
- package/.next/server/app/pair.segments/_full.segment.rsc +3 -3
- package/.next/server/app/pair.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/pair.segments/pair/__PAGE__.segment.rsc +3 -3
- package/.next/server/app-paths-manifest.json +6 -6
- package/.next/server/chunks/3100.js +1 -1
- package/.next/server/chunks/4008.js +1 -1
- package/.next/server/chunks/8015.js +7 -7
- package/.next/server/chunks/8501.js +1 -1
- package/.next/server/chunks/933.js +1 -1
- package/.next/server/chunks/9848.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/3274.f8f023fd73e607bc.js +2 -0
- package/.next/static/chunks/4315-fad7ccd6e548e08e.js +1 -0
- package/.next/static/chunks/4996.c5525823b73ac947.js +1 -0
- package/.next/static/chunks/{6268.294dd515c545712d.js → 6268.c8711c205efe98a6.js} +3 -3
- package/.next/static/chunks/{9668.a6deba4ff5761bbb.js → 9668.6c511d3f22a0d3ad.js} +1 -1
- package/.next/static/chunks/app/{page-305a0dd341ec102d.js → page-66dfb84af2e0fea1.js} +1 -1
- package/.next/static/chunks/{webpack-76f14942c1d852d7.js → webpack-7f93c1ded461bdcd.js} +1 -1
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/package.json +1 -1
- package/.next/static/chunks/3274.52c14cafa7f8a3ef.js +0 -2
- package/.next/static/chunks/4315-8575b9eecf54f2bb.js +0 -1
- package/.next/static/chunks/4996.5e04c050b0523d42.js +0 -1
- /package/.next/static/{SAMSH7hMTmFI9vfMyiguw → RCJWKG4f3VN3XnWbJ4581}/_buildManifest.js +0 -0
- /package/.next/static/{SAMSH7hMTmFI9vfMyiguw → RCJWKG4f3VN3XnWbJ4581}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{"use strict";var e,t,a,d,
|
|
1
|
+
(()=>{"use strict";var e,t,a,c,d,r,f,b,o,n={},i={};function l(e){var t=i[e];if(void 0!==t)return t.exports;var a=i[e]={exports:{}},c=!0;try{n[e].call(a.exports,a,a.exports,l),c=!1}finally{c&&delete i[e]}return a.exports}l.m=n,e=[],l.O=(t,a,c,d)=>{if(a){d=d||0;for(var r=e.length;r>0&&e[r-1][2]>d;r--)e[r]=e[r-1];e[r]=[a,c,d];return}for(var f=1/0,r=0;r<e.length;r++){for(var[a,c,d]=e[r],b=!0,o=0;o<a.length;o++)(!1&d||f>=d)&&Object.keys(l.O).every(e=>l.O[e](a[o]))?a.splice(o--,1):(b=!1,d<f&&(f=d));if(b){e.splice(r--,1);var n=c();void 0!==n&&(t=n)}}return t},l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,l.t=function(e,c){if(1&c&&(e=this(e)),8&c||"object"==typeof e&&e&&(4&c&&e.__esModule||16&c&&"function"==typeof e.then))return e;var d=Object.create(null);l.r(d);var r={};t=t||[null,a({}),a([]),a(a)];for(var f=2&c&&e;"object"==typeof f&&!~t.indexOf(f);f=a(f))Object.getOwnPropertyNames(f).forEach(t=>r[t]=()=>e[t]);return r.default=()=>e,l.d(d,r),d},l.d=(e,t)=>{for(var a in t)l.o(t,a)&&!l.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},l.f={},l.e=e=>Promise.all(Object.keys(l.f).reduce((t,a)=>(l.f[a](e,t),t),[])),l.u=e=>4906===e?"static/chunks/4906-3ebc61b9b2c31745.js":587===e?"static/chunks/587-c973123b3c9a5b80.js":"static/chunks/"+(({988:"993e5495",1048:"db9d41be",7330:"d3ac728e",8133:"1ba63609",8747:"90542734",8924:"da12927c",9425:"bf2ff291"})[e]||e)+"."+({103:"23142a67b02246a8",268:"ec500965c1761e26",370:"8e8f3cf8eb0e29dd",398:"ffa02af9062a3950",484:"761e1ff01f663fb2",869:"7152372b662e31af",918:"6a9bbe564e4a2d0f",934:"9006461bd0548660",973:"9efc01efd9d768a5",988:"598a97aa1337298f",1032:"d9a9179233599785",1048:"27ee8fcc7bf00d70",1063:"775c442bdbeef08b",1133:"bea8503e209b9e2c",1327:"09252bb80616cc3a",1441:"83552e2540b12edf",1708:"c3a1896e4cc9f8d9",1781:"9072b4c9586df549",2081:"47b6e9391094055f",2181:"ba21239d3ac39f81",2201:"46326eb058826eb2",2258:"4defa30121ef44a5",2325:"23caf22075e51aa5",2356:"523277bb8c6bf72a",2418:"b5d9e177e10a686e",2480:"cf27ca02e5b19761",2539:"c5a4f2fd8e421c70",2619:"9431a3f48da8eef4",2695:"b732ef1965253b3f",2703:"495a65ed14b2f094",2821:"934bcf60fbdc28c6",3251:"408c817adb161919",3274:"f8f023fd73e607bc",3308:"8e27b5c43a478f0d",3336:"a76f9485fe7cb762",3688:"77dd9e68a61af45e",3716:"72bf4c9d7325debd",3944:"6215b78f025077b3",3995:"eca0f5bef1fc3ae5",4004:"74b9bcf5478b1663",4202:"8440832386f023c7",4238:"6f102dcbcf2ae339",4405:"7a19458960a1058e",4424:"fd0c93a807a333e1",4473:"c9bdafcdd251e4db",4559:"2e7ed39ea2757280",4854:"b64a1daa15899219",4866:"d1060b4faf2ae1e2",4970:"8a63b4953b0e4946",4996:"c5525823b73ac947",5020:"9ac8d0dc8390bb6e",5137:"f163e94c74a94d01",5242:"7b643c6b3394cac1",5361:"afc00ab2626bacbf",5521:"cfdf2cfc6db31407",5526:"ff46471041fdcb79",5658:"0fe2642c815aea9a",5681:"dd0e66b0de16e54b",5806:"06789869309659d0",6121:"eb9023b1cbc78ee2",6161:"4836cd7d031026bf",6195:"8710aa41b2319dff",6202:"f4317cf0a48876f9",6268:"c8711c205efe98a6",6294:"24f510c0c3e3714c",6604:"4ad489ec0e9e8985",6654:"41440ef667144967",6794:"57bf1aff78682f3a",7256:"e07cf52d87d40252",7268:"2f59c671f26160f3",7330:"7964f816a1ca64e5",7331:"2add3c4e125a2dba",7543:"89f7b805ed0f2901",8133:"b2ae90f43319a29e",8200:"a36b9f8c983c6b9e",8717:"4e20eedf9544e286",8747:"ae439f2382f58c51",8863:"fa0320ea586efb3b",8885:"d9308c756376780b",8901:"e117d206a917bda0",8924:"476aa688a637649c",9365:"a3e0e5ac101ccd02",9425:"244c8a7c1c14966a",9448:"b6c5eb8f1356d5fd",9522:"c7c6e9c330f9ba6b",9614:"3221013d7f0af27f",9668:"6c511d3f22a0d3ad",9698:"4d09a99b9d99f3e5",9705:"40a82b97f214e28b",9754:"d67dec946fc871d4",9764:"2669775c6e107a01",9793:"4567af813117ad25",9974:"9a0f79beca65e8c4",9981:"ba92f0b30bbf53e4"})[e]+".js",l.miniCssF=e=>"static/css/2f46e0db0d4a3aed.css",l.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),c={},l.l=(e,t,a,d)=>{if(c[e])return void c[e].push(t);if(void 0!==a)for(var r,f,b=document.getElementsByTagName("script"),o=0;o<b.length;o++){var n=b[o];if(n.getAttribute("src")==e||n.getAttribute("data-webpack")=="_N_E:"+a){r=n;break}}r||(f=!0,(r=document.createElement("script")).charset="utf-8",r.timeout=120,l.nc&&r.setAttribute("nonce",l.nc),r.setAttribute("data-webpack","_N_E:"+a),r.src=l.tu(e)),c[e]=[t];var i=(t,a)=>{r.onerror=r.onload=null,clearTimeout(s);var d=c[e];if(delete c[e],r.parentNode&&r.parentNode.removeChild(r),d&&d.forEach(e=>e(a)),t)return t(a)},s=setTimeout(i.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=i.bind(null,r.onerror),r.onload=i.bind(null,r.onload),f&&document.head.appendChild(r)},l.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.tt=()=>(void 0===d&&(d={createScriptURL:e=>e},"u">typeof trustedTypes&&trustedTypes.createPolicy&&(d=trustedTypes.createPolicy("nextjs#bundler",d))),d),l.tu=e=>l.tt().createScriptURL(e),l.p="/_next/",r={8068:0},l.f.miniCss=(e,t)=>{if(r[e])t.push(r[e]);else 0!==r[e]&&({5846:1})[e]&&t.push(r[e]=new Promise((t,a)=>{var c=l.miniCssF(e),d=l.p+c;if(((e,t)=>{for(var a=document.getElementsByTagName("link"),c=0;c<a.length;c++){var d=a[c],r=d.getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(r===e||r===t))return d}for(var f=document.getElementsByTagName("style"),c=0;c<f.length;c++){var d=f[c],r=d.getAttribute("data-href");if(r===e||r===t)return d}})(c,d))return t();((e,t,a,c)=>{var d=document.createElement("link");d.rel="stylesheet",d.type="text/css",d.onerror=d.onload=r=>{if(d.onerror=d.onload=null,"load"===r.type)a();else{var f=r&&("load"===r.type?"missing":r.type),b=r&&r.target&&r.target.href||t,o=Error("Loading CSS chunk "+e+" failed.\n("+b+")");o.code="CSS_CHUNK_LOAD_FAILED",o.type=f,o.request=b,d.parentNode.removeChild(d),c(o)}},d.href=t;if("function"==typeof _N_E_STYLE_LOAD){var r=d.href,f=d.onload,b=d.onerror;_N_E_STYLE_LOAD(0===r.indexOf(window.location.origin)?new URL(r).pathname:r).then(function(){f&&f.call(d,{type:"load"})},function(){b&&b.call(d,{})})}else document.head.appendChild(d)})(e,d,t,a)}).then(()=>{r[e]=0},t=>{throw delete r[e],t}))},f={8068:0,6577:0},l.f.j=(e,t)=>{var a=l.o(f,e)?f[e]:void 0;if(0!==a)if(a)t.push(a[2]);else if(/^(5846|6577|8068)$/.test(e))f[e]=0;else{var c=new Promise((t,c)=>a=f[e]=[t,c]);t.push(a[2]=c);var d=l.p+l.u(e),r=Error();l.l(d,t=>{if(l.o(f,e)&&(0!==(a=f[e])&&(f[e]=void 0),a)){var c=t&&("load"===t.type?"missing":t.type),d=t&&t.target&&t.target.src;r.message="Loading chunk "+e+" failed.\n("+c+": "+d+")",r.name="ChunkLoadError",r.type=c,r.request=d,a[1](r)}},"chunk-"+e,e)}},l.O.j=e=>0===f[e],b=(e,t)=>{var a,c,[d,r,b]=t,o=0;if(d.some(e=>0!==f[e])){for(a in r)l.o(r,a)&&(l.m[a]=r[a]);if(b)var n=b(l)}for(e&&e(t);o<d.length;o++)c=d[o],l.o(f,c)&&f[c]&&f[c][0](),f[c]=0;return l.O(n)},(o=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(b.bind(null,0)),o.push=b.bind(null,o.push.bind(o)),l.nc=void 0})();
|
package/README.ja.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Kotlin 製のコンパニオンアプリでリモートの ompgui サーバーに接続し、最新セッションの読み取り専用オフラインスナップショットを利用できます。[ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Kotlin 製のコンパニオンアプリでリモートの ompgui サーバーに接続し、最新セッションの読み取り専用オフラインスナップショットを利用できます。[ompgui Remote v0.7.11 をダウンロード](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [リリースノート](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/` の実験的なネイティブ Compose クライアントは、認証済みの `/relay` WebSocket を使用し、セッション・履歴の操作、リンク付きメッセージ、オフラインの Mermaid 図とコードの構文強調、画像/PDF/音声/HTML/Markdown/DOCX のインラインプレビューを提供します。ファイルの自動更新は表示中のみ動作し、未保存の編集を保持します。許可された隠しファイルの閲覧とアーカイブ検索にも対応します。モデル・設定には公開 models.dev カタログ、高度な OMP 設定、構成とは別に表示されるセッションごとの実際の MCP 実行状態が含まれます。添付ファイルは端末上で巨大な単一 JSON にまとめず、ストリーミングでステージングします。画像は各 10 MiB で最大 10 件、テキスト添付は独立した枠で各 256 KiB、最大 10 件です。OMP 自体の画像正規化とプロバイダーごとの画像数制限は引き続き適用されます。
|
|
8
8
|
>
|
|
9
9
|
> **現在の設定機能:** Web と Android APK は、スコープ、継承、リセット、検証、保護されたシークレット/管理者操作を含む同一の検索・カテゴリ対応 OMP 設定カタログを使用します。端末ローカルの思考表示設定は会話の描画だけを変え、最終回答は隠しません。
|
|
10
10
|
>
|
|
11
|
-
>
|
|
11
|
+
> このクライアントはホスト型/E2E リレーを追加するものではありません。JDK 21 を使用し、リポジトリのルートで `npm install` を実行してから、`android/` で `./gradlew :app:assembleDebug` を実行します。オフラインアセットはインストール済みの npm 依存パッケージから生成されます。出力先は `android/app/build/outputs/apk/debug/app-debug.apk` です。サーバーで無効化されている更新、ログアウト、保存済み API キーの変更操作は引き続き利用できません。
|
|
12
12
|
|
|
13
13
|
[oh-my-pi (omp) コーディングエージェント](https://github.com/can1357/oh-my-pi)のローカル Web UI です。ompgui はローカルの omp セッションファイルを読み込み、セッションの閲覧、リアルタイムチャット、モデル設定、スキル管理、プロジェクトファイルのプレビューを行えるブラウザワークスペースを提供します。
|
|
14
14
|
|
package/README.ko.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Kotlin 보조 앱으로 원격 ompgui 서버에 연결하고, 최신 세션의 읽기 전용 오프라인 스냅샷을 이용할 수 있습니다. [ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Kotlin 보조 앱으로 원격 ompgui 서버에 연결하고, 최신 세션의 읽기 전용 오프라인 스냅샷을 이용할 수 있습니다. [ompgui Remote v0.7.11 다운로드](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [릴리스 노트](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/`의 실험용 네이티브 Compose 클라이언트는 인증된 `/relay` WebSocket을 사용하며, 세션/기록 제어와 링크·도구 호출·결과·오류·미디어 참조를 포함하는 풍부한 온라인 대화 기록, 오프라인 Mermaid 다이어그램 및 코드 구문 강조, 이미지/PDF/오디오/HTML/Markdown/DOCX 인라인 미리보기를 제공합니다. 온라인 기록은 보호된 오프라인 스냅샷과 별개입니다. 크기가 제한된 미리보기에서 `sessions.content`로 전체 텍스트를 나누어 가져오고 미디어 참조도 페이지 단위로 조회하므로 대화 기록을 4,000자로 잘라내지 않습니다. 오프라인 캐시의 개인정보 보호 제한은 그대로 유지됩니다. 파일 자동 새로고침은 화면에 보일 때만 동작하며 저장하지 않은 편집 내용을 보존합니다. 허용된 숨김 파일 탐색과 아카이브 검색도 지원합니다. 모델/설정에서는 공개 models.dev 카탈로그, 고급 OMP 설정, 구성 상태와 구분되는 세션별 실제 MCP 실행 상태를 확인할 수 있습니다. 첨부 파일은 휴대폰에서 하나의 거대한 JSON으로 묶지 않고 스트리밍으로 스테이징하며, 이미지는 개당 10 MiB로 최대 10개, 텍스트 첨부는 별도로 개당 256 KiB로 최대 10개까지 지원합니다. OMP 자체의 이미지 정규화와 제공자별 이미지 개수 제한은 계속 적용됩니다.
|
|
8
8
|
>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
>
|
|
11
11
|
> 네이티브 인터페이스는 웹 앱의 Warm 및 OMP 색상 팔레트를 따르며, 간결한 프로젝트/세션 트리와 설정/사용량 하단 메뉴, 도구 모음을 한 줄로 정리한 메시지 입력창을 제공합니다. 기록, 세션 정보, 명령 및 런타임 제어는 세션 메뉴에 모았고, 보조 워크스페이스 작업은 더보기 메뉴에 유지했습니다. 런타임 제어는 펼칠 수 있는 트리 카테고리로 구성하고 현재 값을 일정한 열에 맞춰 표시합니다. 설정은 간결한 행 단위 선택 컨트롤을 사용하며, 드롭다운 메뉴는 해당 컨트롤에 붙어 열립니다. Android 네이티브 컨트롤, 파일 선택기, 시트 탐색 방식과 서로 겹치지 않는 최소 48dp 터치 영역을 유지합니다.
|
|
12
12
|
>
|
|
13
|
-
> 이 클라이언트는
|
|
13
|
+
> 이 클라이언트는 호스팅형/E2E 릴레이를 추가하지 않습니다. JDK 21을 사용하여 저장소 루트에서 `npm install`을 실행한 뒤, `android/`에서 `./gradlew :app:assembleDebug`로 빌드합니다. 오프라인 에셋은 설치된 npm 의존성에서 생성되며, 출력 경로는 `android/app/build/outputs/apk/debug/app-debug.apk`입니다. 서버에서 비활성화된 업데이트, 로그아웃, 저장된 API 키 변경 작업은 여전히 사용할 수 없습니다.
|
|
14
14
|
|
|
15
15
|
[oh-my-pi (omp) 코딩 에이전트](https://github.com/can1357/oh-my-pi)를 위한 로컬 웹 UI입니다. ompgui은 로컬 omp 세션 파일을 읽어 브라우저에서 세션 탐색, 실시간 채팅, 모델 설정, 스킬 관리, 프로젝트 파일 미리보기를 제공하는 워크스페이스를 엽니다.
|
|
16
16
|
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK (Android 12+)** — Use the Kotlin companion app to connect to a remote ompgui server, with a read-only offline snapshot of the latest session. [Download ompgui Remote v0.7.
|
|
5
|
+
> **Android APK (Android 12+)** — Use the Kotlin companion app to connect to a remote ompgui server, with a read-only offline snapshot of the latest session. [Download ompgui Remote v0.7.11](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [Release notes](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> The Kotlin companion app in `android/` uses authenticated `/relay` WebSockets for session/history controls and rich online transcripts with linked messages, tool calls/results/errors, and media references, plus offline Mermaid diagrams and code highlighting and inline image/PDF/audio/HTML/Markdown/DOCX previews. Online history is independent of the protected offline snapshot: bounded previews fetch full text through `sessions.content` and paginate media references, rather than truncating the transcript at 4,000 characters. Offline cache privacy restrictions remain unchanged. Visible-only file auto-refresh preserves unsaved edits; browsing supports allowed hidden files and archive search. Models/settings include the public models.dev catalog, advanced OMP settings, and actual per-session MCP runtime status shown separately from configuration. Attachments are streamed into staging rather than packed into one giant phone JSON payload: up to 10 images at 10 MiB each and, independently, 10 text attachments at 256 KiB each. OMP's own image normalization and provider-specific image-count limi…
|
|
8
8
|
>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
>
|
|
11
11
|
> Its native interface follows the web app’s Warm and OMP palettes, with a compact project/session tree, a Settings/Usage footer, and a compact composer with a single-row toolbar. History, session information, commands, and runtime controls live in the session menu; secondary workspace actions remain in overflow menus. Runtime controls use expandable tree categories with aligned current values. Settings use compact row selectors, and dropdown menus are anchored to their triggers. Native Android controls, file pickers, sheet navigation, and distinct touch regions of at least 48 dp are retained.
|
|
12
12
|
>
|
|
13
|
-
> This companion client does not
|
|
13
|
+
> This companion client does not add a hosted/E2E relay. To build, use JDK 21, run `npm install` at the repository root, then run `./gradlew :app:assembleDebug` from `android/`; offline assets are generated from the installed npm dependencies. Output: `android/app/build/outputs/apk/debug/app-debug.apk`. Server-disabled update, logout, and stored API-key mutations remain unavailable.
|
|
14
14
|
|
|
15
15
|
Local web UI for the [oh-my-pi (omp) coding agent](https://github.com/can1357/oh-my-pi). ompgui reads your local omp session files and gives you a browser workspace for session browsing, real-time chat, model configuration, skill management, and project file preview.
|
|
16
16
|
|
package/README.zh-CN.md
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
[English](./README.md) | [한국어](./README.ko.md) | [日本語](./README.ja.md) | [简体中文](./README.zh-CN.md)
|
|
4
4
|
|
|
5
|
-
> **Android APK(Android 12+)** — 使用 Kotlin 配套应用连接远程 ompgui 服务器,并查看最新会话的只读离线快照。[下载 ompgui Remote v0.7.
|
|
5
|
+
> **Android APK(Android 12+)** — 使用 Kotlin 配套应用连接远程 ompgui 服务器,并查看最新会话的只读离线快照。[下载 ompgui Remote v0.7.11](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.11/ompgui-remote-v0.7.11.apk) · [发行说明](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.11)
|
|
6
6
|
|
|
7
7
|
> `android/` 中的实验性原生 Compose 客户端使用经过身份验证的 `/relay` WebSocket,提供会话/历史记录控制、带链接的消息、离线 Mermaid 图表与代码语法高亮,以及图片/PDF/音频/HTML/Markdown/DOCX 内联预览。文件仅在界面可见时自动刷新,并保留未保存的编辑;支持浏览允许访问的隐藏文件和搜索归档。模型与设置包括公开的 models.dev 目录、高级 OMP 设置,以及与配置状态分开显示的各会话实际 MCP 运行状态。附件通过流式传输暂存,而不是在手机端打包成一个巨大的 JSON:图片最多 10 个,每个 10 MiB;文本附件独立计数,最多 10 个,每个 256 KiB。OMP 自身的图像规范化处理和各提供商的图片数量限制仍然适用。
|
|
8
8
|
>
|
|
9
9
|
> **当前设置功能:** Web 与 Android APK 使用同一套可搜索、分类的 OMP 设置目录,包括作用域、继承、重置、校验以及受保护的机密/管理员操作。设备本地的思考可见性开关只改变对话渲染,不会隐藏最终答案。
|
|
10
10
|
>
|
|
11
|
-
>
|
|
11
|
+
> 此客户端不会添加托管式/E2E 中继。构建时使用 JDK 21,先在仓库根目录运行 `npm install`,再在 `android/` 中运行 `./gradlew :app:assembleDebug`;离线资源从已安装的 npm 依赖生成。输出文件为 `android/app/build/outputs/apk/debug/app-debug.apk`。服务器禁用的更新、退出登录以及已存储 API 密钥的修改操作仍不可用。
|
|
12
12
|
|
|
13
13
|
[oh-my-pi (omp) 编程智能体](https://github.com/can1357/oh-my-pi)的本地 Web UI。ompgui 读取本机的 omp 会话文件,在浏览器中提供一个工作区,支持会话浏览、实时对话、模型配置、技能管理和项目文件预览。
|
|
14
14
|
|
package/package.json
CHANGED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3274],{33274:(e,r,t)=>{t.r(r),t.d(r,{ModelsConfig:()=>eA,modelsConfigFingerprint:()=>eI});var o=t(95155),n=t(12115),i=t(31590),a=t(4315);function s(e){if("string"!=typeof e)return!1;let r=e.trim();if(!r||r.startsWith("//"))return!1;try{let e=new URL(r);return"http:"===e.protocol||"https:"===e.protocol||"mailto:"===e.protocol}catch{return!1}}function l(e){return Object.entries(e).every(([e,r])=>"id"===e?"string"==typeof r&&""===r.trim():void 0===r)}var d=t(18136),c=t(90071),p=t(30808),u=t(34906),x=t(38158),g=t(19805),v=t(88074),h=t(65738),m=t(12651),f=t(86272),y=t(82749),b=t(64577),j=t(35484),C=t(2125),k=t(19707),S=t(40557),w=t(80846),z=t(51087),T=t(84111);function I({open:e,providerName:r,providerBaseUrl:t,existingIds:i,onAdd:s,onClose:l}){let{t:d}=(0,a.s9)(),[c,u]=(0,n.useState)(""),[x,g]=(0,n.useState)(null),[v,h]=(0,n.useState)(!1),[m,f]=(0,n.useState)(null),y=(0,n.useRef)(null),b=(0,n.useRef)(0);(0,n.useEffect)(()=>{if(!e)return;y.current?.focus();let o=c.trim();if(!o){b.current+=1,g(null),f(null),h(!1);return}let n=new URLSearchParams({q:o,limit:String(30)});r&&n.set("provider",r),t&&n.set("baseUrl",t);let i=new AbortController,a=b.current+1;b.current=a,h(!0);let s=setTimeout(async()=>{try{let e=await fetch(`/api/models-config/catalog?${n.toString()}`,{signal:i.signal}),r=await e.json();if(b.current!==a)return;if(!e.ok)throw Error(r.error??`HTTP ${e.status}`);g(r.models??[]),f(null)}catch(e){if(b.current!==a)return;"AbortError"!==e.name&&f(e instanceof Error?e.message:String(e))}finally{b.current===a&&h(!1)}},250);return()=>{clearTimeout(s),i.abort()}},[c,e,r,t]);let j={display:"flex",flexDirection:"row",alignItems:"center",gap:10,padding:"9px 12px",background:"var(--bg-panel)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",marginBottom:"var(--space-3)",minWidth:0};return(0,o.jsx)(p.lG,{open:!0,onOpenChange:e=>{e||l()},children:(0,o.jsxs)(p.Cf,{ariaLabel:d("modelsConfig.catalogTitle"),style:{width:720,maxWidth:"min(92vw, 720px)",maxHeight:"min(72dvh, calc(100dvh - 32px))",padding:0,display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,o.jsx)(p.L3,{style:{margin:"14px 18px 8px",fontSize:18},children:d("modelsConfig.catalogTitle")}),(0,o.jsx)("div",{style:{padding:"8px 14px 12px",flexShrink:0},children:(0,o.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"6px 10px",background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)"},children:(0,o.jsx)("input",{ref:y,value:c,onChange:e=>u(e.target.value),"aria-label":d("modelsConfig.catalogSearchPlaceholder"),placeholder:d("modelsConfig.catalogSearchPlaceholder"),style:{flex:1,background:"none",border:"none",outline:"none",color:"var(--text)",fontSize:"var(--text-base)",boxSizing:"border-box",minWidth:0}})})}),(0,o.jsx)("div",{style:{flex:1,overflowY:"auto",padding:"4px 14px 14px"},children:m?(0,o.jsx)("div",{role:"alert",style:{padding:"20px 0",fontSize:"var(--text-md)",color:"var(--status-error)",textAlign:"center"},children:d("modelsConfig.catalogError",{error:m})}):v?(0,o.jsx)("div",{role:"status","aria-live":"polite",style:{padding:"20px 0",fontSize:"var(--text-md)",color:"var(--text-dim)",textAlign:"center"},children:d("modelsConfig.catalogLoading")}):null===x?(0,o.jsx)("div",{style:{padding:"20px 0",fontSize:"var(--text-md)",color:"var(--text-dim)",textAlign:"center"},children:d("modelsConfig.catalogSearchPlaceholder")}):0===x.length?(0,o.jsx)("div",{style:{padding:"20px 0",fontSize:"var(--text-md)",color:"var(--text-dim)",textAlign:"center"},children:d("modelsConfig.catalogNoResults")}):x.map(e=>{var r;let n=i.has(e.id),a=!!e.providerBaseUrl&&!t;return(0,o.jsxs)("div",{style:j,children:[(0,o.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",minWidth:0},children:[(0,o.jsx)("span",{style:{fontSize:"var(--text-md)",fontFamily:"var(--font-mono)",color:"var(--text)",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.id}),e.reasoning&&(0,o.jsx)("span",{style:{fontSize:9,padding:"1px 4px",background:"var(--accent-subtle)",color:"var(--accent)",borderRadius:3,flexShrink:0},children:"T"})]}),(0,o.jsxs)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-dim)",marginTop:2,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:[e.providerName,void 0!==e.contextWindow?` \xb7 ${d("modelsConfig.catalogContext",{n:(r=e.contextWindow,(0,T.wk)(r))})}`:"",void 0!==e.cost.input&&void 0!==e.cost.output?` \xb7 ${d("modelsConfig.catalogPrice",{input:e.cost.input,output:e.cost.output})}`:"",a?` \xb7 ${d("modelsConfig.catalogSetBaseUrl")}`:""]})]}),n?(0,o.jsx)("span",{style:{flexShrink:0,padding:"5px 12px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-dim)",fontSize:12},children:d("modelsConfig.catalogAdded")}):(0,o.jsx)("button",{type:"button","aria-label":"Add "+e.id+" ("+e.providerName+")",onClick:()=>{let r;return s((r=void 0!==e.cost.input&&void 0!==e.cost.output,{id:e.id,...e.name&&e.name!==e.id?{name:e.name}:{},...void 0!==e.reasoning?{reasoning:e.reasoning}:{},...e.input?{input:e.input}:{},...void 0!==e.contextWindow?{contextWindow:e.contextWindow}:{},...void 0!==e.maxTokens?{maxTokens:e.maxTokens}:{},...r?{cost:{input:e.cost.input,output:e.cost.output,cacheRead:e.cost.cacheRead??0,cacheWrite:e.cost.cacheWrite??0}}:{}}),e.providerBaseUrl)},style:{flexShrink:0,padding:"5px 12px",background:"var(--accent)",border:"none",borderRadius:"var(--radius-control)",color:"var(--on-accent)",cursor:"pointer",fontSize:"var(--text-md)",fontWeight:600},children:d("modelsConfig.catalogAdd")})]},e.key)})})]})})}var A=t(67381),R=t(64433),M=t(70350),P=t(88195),O=t(9312),$=t(87275),W=t(22008),E=t(95476),N=t(35029),L=t(14489),U=t(78728),D=t(19872),F=t(7751),H=t(92526),K=t(48238),B=t(57794),_=t(41098),J=t(84604),q=t(15315),G=t(74278),Y=t(55457),V=t(71437),X=t(29167),Q=t(97283),Z=t(34166),ee=t(33889),er=t(85486),et=t(74068),eo=t(83546),en=t(83709);let ei={anthropic:{Icon:A.A,hasColor:!1},openai:{Icon:R.A,hasColor:!1},"openai-codex":{Icon:R.A,hasColor:!1},google:{Icon:M.A,hasColor:!0},"google-vertex":{Icon:M.A,hasColor:!0},"ant-ling":{Icon:ee.A,hasColor:!0},deepseek:{Icon:P.A,hasColor:!0},groq:{Icon:O.A,hasColor:!1},mistral:{Icon:$.A,hasColor:!0},moonshotai:{Icon:W.A,hasColor:!1},"moonshotai-cn":{Icon:W.A,hasColor:!1},moonshot:{Icon:W.A,hasColor:!1},minimax:{Icon:E.A,hasColor:!0},"minimax-cn":{Icon:E.A,hasColor:!0},fireworks:{Icon:N.A,hasColor:!0},huggingface:{Icon:L.A,hasColor:!0},cerebras:{Icon:U.A,hasColor:!0},openrouter:{Icon:D.A,hasColor:!1},xai:{Icon:F.A,hasColor:!1},"cloudflare-ai-gateway":{Icon:H.A,hasColor:!0},"cloudflare-workers-ai":{Icon:H.A,hasColor:!0},"vercel-ai-gateway":{Icon:K.A,hasColor:!1},"github-copilot":{Icon:B.A,hasColor:!1},"amazon-bedrock":{Icon:_.A,hasColor:!0},"azure-openai-responses":{Icon:J.A,hasColor:!0},"kimi-coding":{Icon:q.A,hasColor:!0},nvidia:{Icon:er.A,hasColor:!0},opencode:{Icon:et.A,hasColor:!1},"opencode-go":{Icon:et.A,hasColor:!1},qwen:{Icon:G.A,hasColor:!0},xiaomi:{Icon:eo.A,hasColor:!1},"xiaomi-token-plan-ams":{Icon:eo.A,hasColor:!1},"xiaomi-token-plan-cn":{Icon:eo.A,hasColor:!1},"xiaomi-token-plan-sgp":{Icon:eo.A,hasColor:!1},zai:{Icon:en.A,hasColor:!1},"zai-coding-cn":{Icon:en.A,hasColor:!1},zhipu:{Icon:Y.A,hasColor:!0},cohere:{Icon:V.A,hasColor:!0},perplexity:{Icon:X.A,hasColor:!0},together:{Icon:Q.A,hasColor:!0},grok:{Icon:Z.A,hasColor:!1}};function ea({models:e,connectedProviders:r,onChanged:t}){let[i,a]=(0,n.useState)(null),[s,l]=(0,n.useState)(null),[d,c]=(0,n.useState)(!1);(0,n.useEffect)(()=>{fetch("/api/omp-settings").then(e=>e.ok?e.json():Promise.reject(Error(`HTTP ${e.status}`))).then(e=>a(e.settings??{})).catch(e=>l(e instanceof Error?e.message:String(e)))},[]);let p=(0,n.useRef)(null),u=(0,n.useRef)(!1),v=e=>{a(e),c(!0),l(null),p.current=e,u.current||(u.current=!0,(async()=>{try{for(;null!==p.current;){let e=p.current;p.current=null;try{let r=await fetch("/api/omp-settings",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({settings:e})}),o=await r.json();if(!r.ok||o.error)throw Error(o.error||`HTTP ${r.status}`);null===p.current&&a(o.settings??e),await t()}catch(e){l(e instanceof Error?e.message:String(e));break}}}finally{u.current=!1,c(!1)}})())};if(!i)return(0,o.jsx)("div",{style:{color:"var(--text-muted)",fontSize:"var(--text-md)"},children:"Loading native OMP registry settings..."});let h=!0===i.registryHasScopedEntries,m=e.map(e=>`${e.provider}/${e.id}`),f=(i.enabledModels?.length??0)>0,y=new Set(i.enabledModels??m),b=[...new Set([...e.map(e=>e.provider),...r.map(e=>e.id),...i.disabledProviders??[]])].sort(),j=new Set(i.disabledProviders??[]),C=i.modelProviderOrder??[],k=[...C,...b.filter(e=>!C.includes(e))];return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:14},children:[(0,o.jsxs)("div",{children:[(0,o.jsx)(eu,{children:"Native OMP Model Registry"}),(0,o.jsxs)("p",{style:{margin:"4px 0 0",color:"var(--text-muted)",fontSize:"var(--text-md)",lineHeight:1.5},children:["These settings affect the models OMP itself can resolve. They are saved in ",(0,o.jsx)("code",{children:"~/.omp/agent/config.yml"}),", unlike the Composer picker."]})]}),(0,o.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:"var(--radius-card)",overflow:"hidden"},children:[(0,o.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"10px 12px",background:"var(--bg-panel)",color:"var(--text)",fontSize:"var(--text-md)",fontWeight:600},children:[(0,o.jsx)("input",{type:"checkbox",checked:f,disabled:d||h,onChange:e=>void v({...i,enabledModels:e.target.checked?m:[]})})," Restrict OMP to selected models"]}),(0,o.jsx)("p",{style:{margin:0,padding:"8px 12px",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.45},children:f?"Unchecked models are unavailable to every OMP session.":"All currently available OMP models are allowed."}),f&&(0,o.jsx)("div",{style:{maxHeight:260,overflowY:"auto",borderTop:"1px solid var(--border)"},children:e.map(e=>{let r=`${e.provider}/${e.id}`;return(0,o.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"6px 12px",color:"var(--text-muted)",fontSize:"var(--text-md)"},children:[(0,o.jsx)("input",{type:"checkbox",checked:y.has(r),disabled:d||h,onChange:e=>{let t=new Set(y);e.target.checked?t.add(r):t.delete(r),v({...i,enabledModels:[...t]})}}),(0,o.jsx)("code",{children:r})]},r)})})]}),(0,o.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:"var(--radius-card)",overflow:"hidden"},children:[(0,o.jsx)("div",{style:{padding:"10px 12px",background:"var(--bg-panel)",color:"var(--text)",fontSize:"var(--text-md)",fontWeight:600},children:"Disabled Providers"}),(0,o.jsx)("p",{style:{margin:0,padding:"8px 12px",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.45},children:"Disabling a provider removes it from OMP's model registry, even if it has credentials."}),(0,o.jsx)("div",{style:{borderTop:"1px solid var(--border)"},children:b.map(e=>(0,o.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"7px 12px",color:"var(--text-muted)",fontSize:"var(--text-md)"},children:[(0,o.jsx)("input",{type:"checkbox",checked:j.has(e),disabled:d||h,onChange:r=>{let t=new Set(j);r.target.checked?t.add(e):t.delete(e),v({...i,disabledProviders:[...t]})}}),(0,o.jsx)(ez,{id:e,size:14}),(0,o.jsx)("code",{children:e})]},e))})]}),(0,o.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:"var(--radius-card)",overflow:"hidden"},children:[(0,o.jsx)("div",{style:{padding:"10px 12px",background:"var(--bg-panel)",color:"var(--text)",fontSize:"var(--text-md)",fontWeight:600},children:"Provider Preference"}),(0,o.jsx)("p",{style:{margin:0,padding:"8px 12px",color:"var(--text-muted)",fontSize:"var(--text-sm)",lineHeight:1.45},children:"Sets OMP's provider order when a model id is ambiguous."}),(0,o.jsx)("div",{style:{borderTop:"1px solid var(--border)"},children:k.map((e,r)=>(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"7px 12px",color:"var(--text-muted)",fontSize:"var(--text-md)"},children:[(0,o.jsx)(ez,{id:e,size:14}),(0,o.jsx)("code",{style:{flex:1},children:e}),(0,o.jsx)("button",{type:"button",disabled:d||h||0===r,onClick:()=>{let e=[...k];[e[r-1],e[r]]=[e[r],e[r-1]],v({...i,modelProviderOrder:e})},title:"Move provider up","aria-label":`Move provider ${e} up`,className:"ui-focus-ring",style:{width:24,height:24,padding:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",borderRadius:4,background:"transparent",color:"var(--text-muted)",cursor:"pointer"},children:(0,o.jsx)(x.A,{size:14})}),(0,o.jsx)("button",{type:"button",disabled:d||h||r===k.length-1,onClick:()=>{let e=[...k];[e[r+1],e[r]]=[e[r],e[r+1]],v({...i,modelProviderOrder:e})},title:"Move provider down","aria-label":`Move provider ${e} down`,className:"ui-focus-ring",style:{width:24,height:24,padding:0,display:"inline-flex",alignItems:"center",justifyContent:"center",border:"none",borderRadius:4,background:"transparent",color:"var(--text-muted)",cursor:"pointer"},children:(0,o.jsx)(g.A,{size:14})})]},e))})]}),h&&(0,o.jsxs)("div",{role:"status",style:{padding:"9px 11px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",fontSize:"var(--text-md)",lineHeight:1.45},children:["OMP path-scoped registry entries are configured. Edit ",(0,o.jsx)("code",{children:"config.yml"})," directly to preserve their path rules."]}),s&&(0,o.jsx)("div",{role:"alert",style:{color:"var(--status-error)",fontSize:"var(--text-md)"},children:s})]})}let es="omp-composer-models",el=["default","smol","slow","vision","plan","designer","commit","tiny","task","advisor"];function ed({models:e}){let[r,t]=(0,n.useState)({}),[i,a]=(0,n.useState)(!0),[s,l]=(0,n.useState)(!1),[d,c]=(0,n.useState)(null);(0,n.useEffect)(()=>{fetch("/api/model-roles").then(e=>e.ok?e.json():Promise.reject(Error(`HTTP ${e.status}`))).then(e=>t(e.roles??{})).catch(e=>c(e instanceof Error?e.message:String(e))).finally(()=>a(!1))},[]);let p=async()=>{l(!0),c(null);try{let e=await fetch("/api/model-roles",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({roles:r})}),t=await e.json();if(!e.ok||t.error)throw Error(t.error||`HTTP ${e.status}`);z.oR.success("OMP model roles saved")}catch(e){c(e instanceof Error?e.message:String(e))}finally{l(!1)}};return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:14},children:[(0,o.jsxs)("div",{children:[(0,o.jsx)(eu,{children:"OMP Model Roles"}),(0,o.jsxs)("p",{style:{margin:"4px 0 0",fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:["Saved natively in ",(0,o.jsx)("code",{children:"~/.omp/agent/config.yml"}),". Choose an OMP model and its supported reasoning level for each role."]})]}),i?(0,o.jsx)("div",{style:{color:"var(--text-muted)",fontSize:"var(--text-md)"},children:"Loading roles..."}):el.map(n=>{let i,a,s,l,d;return(0,o.jsxs)("div",{className:"model-role-row",style:{display:"grid",gridTemplateColumns:"82px minmax(0, 1fr) minmax(110px, 0.35fr)",alignItems:"center",gap:10,fontSize:"var(--text-md)"},children:[(0,o.jsx)("code",{style:{color:"var(--text-muted)"},children:n}),(a=(i=r[n]??"").replace(/:([^,:]+)$/,""),s=i.match(/:([^,:]+)$/)?.[1]??"",l=e.find(e=>`${e.provider}/${e.id}`===a),d=!a||!!l,(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("select",{"aria-label":`Model override for ${n}`,value:a,onChange:e=>{var o;let i,a;return o=e.target.value,i=r[n]??"",a=i.match(/:([^,:]+)$/)?.[1]??"",void t(e=>({...e,[n]:o?`${o}${a?`:${a}`:""}`:""}))},style:{minWidth:0,padding:"7px 9px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",color:"var(--text)",fontSize:"var(--text-md)"},children:[(0,o.jsx)("option",{value:"",children:"No override"}),!d&&(0,o.jsxs)("option",{value:a,children:[a," (not currently available)"]}),e.map(e=>(0,o.jsxs)("option",{value:`${e.provider}/${e.id}`,children:[e.name||e.id," (",e.provider,"/",e.id,")"]},`${e.provider}:${e.id}`))]}),(0,o.jsxs)("select",{"aria-label":`Thinking level for ${n}`,value:s,disabled:!l,onChange:e=>{var o;let i;return o=e.target.value,i=(r[n]??"").replace(/:([^,:]+)$/,""),void t(e=>({...e,[n]:i?`${i}${o?`:${o}`:""}`:""}))},style:{minWidth:0,padding:"7px 9px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",color:"var(--text)",fontSize:"var(--text-md)",opacity:l?1:.55},children:[(0,o.jsx)("option",{value:"",children:"Model default"}),(l?.thinkingLevels??[]).filter(e=>"off"!==e).map(e=>(0,o.jsx)("option",{value:e,children:e},e))]})]}))]},n)}),d&&(0,o.jsx)("div",{role:"alert",style:{color:"var(--status-error)",fontSize:"var(--text-md)"},children:d}),(0,o.jsx)("button",{type:"button",onClick:()=>void p(),disabled:i||s,style:{alignSelf:"flex-start",padding:"7px 12px",border:"none",borderRadius:"var(--radius-control)",background:"var(--accent)",color:"var(--on-accent)",cursor:s?"wait":"pointer",fontSize:"var(--text-md)",fontWeight:600},children:s?"Saving...":"Save OMP roles"})]})}let ec=["openai-completions","openai-responses","openai-codex-responses","azure-openai-responses","anthropic-messages","bedrock-converse-stream","google-generative-ai","google-gemini-cli","google-vertex"];function ep({text:e}){let r=e.split("`");return 1===r.length?(0,o.jsx)(o.Fragment,{children:e}):(0,o.jsx)(o.Fragment,{children:r.map((e,r)=>r%2==1?(0,o.jsx)("code",{style:{fontFamily:"var(--font-mono)"},children:e},r):e)})}function eu({children:e}){return(0,o.jsx)("div",{style:{fontSize:"var(--text-sm)",fontWeight:600,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.06em",marginBottom:2},children:e})}function ex({icon:e,label:r,selected:t,onClick:n}){return(0,o.jsxs)("button",{type:"button",onClick:n,style:{width:"100%",padding:"8px 10px",border:"none",borderRadius:"var(--radius-control)",background:t?"var(--bg-selected)":"none",color:t?"var(--text)":"var(--text-muted)",cursor:"pointer",fontSize:"var(--text-md)",textAlign:"left",display:"flex",alignItems:"center",gap:"var(--space-4)",fontWeight:t?600:400},children:[(0,o.jsx)(e,{size:14,style:{color:t?"var(--accent)":"currentColor",flexShrink:0}}),r]})}let eg=e=>({onMouseEnter:r=>{e||(r.currentTarget.style.background="var(--bg-hover)")},onMouseLeave:r=>{e||(r.currentTarget.style.background="none")}}),ev={onMouseEnter:e=>{e.currentTarget.style.color="var(--accent)",e.currentTarget.style.borderColor="var(--accent)"},onMouseLeave:e=>{e.currentTarget.style.color="var(--text-muted)",e.currentTarget.style.borderColor="var(--border)"}},eh=[{label:"\uD83E\uDD99 Ollama",baseUrl:"http://localhost:11434/v1",auth:"none"},{label:"⚡ LM Studio / vLLM",baseUrl:"http://localhost:1234/v1",auth:"none"},{label:"\uD83C\uDF10 OpenRouter",baseUrl:"https://openrouter.ai/api/v1",auth:"apiKey"},{label:"\uD83E\uDD16 Local Proxy (:2455)",baseUrl:"http://127.0.0.1:2455/v1",auth:"keep"}],em={padding:"4px 8px",fontSize:"var(--text-sm)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"var(--bg)",color:"var(--text)",cursor:"pointer"};function ef({name:e,provider:r,onChange:t,onRename:i,onDelete:s}){let{t:l}=(0,a.s9)(),[d,c]=(0,n.useState)(e),[p,x]=(0,n.useState)(!1);(0,n.useEffect)(()=>c(e),[e]);let g=(e,o)=>t({...r,[e]:o}),m=(0,u.JT)(()=>d.trim()?null:l("modelsConfig.errorNameRequired")),f=(0,u.JT)(()=>{let e=r.baseUrl??"";if(!e.trim())return null;try{let r=new URL(e);if("http:"!==r.protocol&&"https:"!==r.protocol)return l("modelsConfig.errorUrlInvalid");return null}catch{return l("modelsConfig.errorUrlInvalid")}}),y=!0===r.apiKeyConfigured,b=y&&void 0===r.apiKey,j=(0,u.JT)(()=>"none"===r.auth||"oauth"===r.auth||!r.models?.length||b||"string"==typeof r.apiKey&&r.apiKey.trim()?null:l("modelsConfig.errorApiKeyRequired")),C=d.trim(),k=r.baseUrl?r.baseUrl.replace(/^https?:\/\//,"").split("/")[0]||r.baseUrl:"Default endpoint";return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-6)"},children:[(0,o.jsxs)("div",{style:{padding:"14px 16px",border:"1px solid var(--border)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",flexDirection:"column",gap:10,boxShadow:"var(--shadow-card)"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-5)"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:10},children:[(0,o.jsx)("div",{style:{width:"var(--control-height-lg)",height:"var(--control-height-lg)",borderRadius:"var(--radius-control)",background:"var(--bg-subtle)",border:"1px solid var(--border)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:(0,o.jsx)(ez,{id:e,size:20})}),(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:2},children:[(0,o.jsx)("div",{style:{fontSize:15,fontWeight:700,fontFamily:"var(--font-mono)",color:"var(--text)"},children:e}),(0,o.jsx)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",fontFamily:"var(--font-mono)"},children:k})]})]}),(0,o.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:"none"===r.auth?(0,o.jsx)("span",{style:{fontSize:"var(--text-xs)",padding:"2px 7px",borderRadius:4,background:"var(--bg-subtle)",color:"var(--text-muted)",fontWeight:500},children:"Auth: None"}):b||"string"==typeof r.apiKey&&r.apiKey.length>0?(0,o.jsx)("span",{style:{fontSize:"var(--text-xs)",padding:"2px 7px",borderRadius:4,background:"color-mix(in srgb, var(--accent) 15%, transparent)",color:"var(--accent)",fontWeight:600},children:"Key Set"}):null===r.apiKey?(0,o.jsx)("span",{style:{fontSize:"var(--text-xs)",padding:"2px 7px",borderRadius:4,background:"color-mix(in srgb, var(--status-warning) 15%, transparent)",color:"var(--status-warning)",fontWeight:600},children:"Key Will Clear"}):(0,o.jsx)("span",{style:{fontSize:"var(--text-xs)",padding:"2px 7px",borderRadius:4,background:"color-mix(in srgb, var(--status-error) 15%, transparent)",color:"var(--status-error)",fontWeight:600},children:"Key Missing"})})]}),(0,o.jsxs)("div",{style:{borderTop:"1px solid var(--border)",paddingTop:10,marginTop:4},children:[(0,o.jsx)("div",{style:{fontSize:"var(--text-xs)",fontWeight:700,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.06em",marginBottom:6},children:"Quick Endpoint Presets"}),(0,o.jsx)("div",{style:{display:"flex",flexWrap:"wrap",gap:"var(--space-3)"},children:eh.map(e=>(0,o.jsx)("button",{type:"button",onClick:()=>{t({...r,baseUrl:e.baseUrl,api:"openai-completions",auth:"keep"===e.auth?r.auth:e.auth}),z.oR.success(`Applied ${e.baseUrl} endpoint preset`)},style:em,children:e.label},e.baseUrl))})]})]}),(0,o.jsxs)(u.M_,{label:(0,o.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:"var(--space-3)"},children:[(0,o.jsx)(v.A,{size:12,"aria-hidden":"true"})," Configuration Details"]}),children:[(0,o.jsx)(u.D0,{label:l("modelsConfig.providerName"),required:!0,error:m.error,children:(0,o.jsx)(u.ks,{value:d,onChange:e=>{c(e),m.onChange()},placeholder:"provider-name",mono:!0,invalid:!!m.error,error:m.error,onBlurValidate:m.onBlur})}),C!==e&&(0,o.jsx)("button",{type:"button",onClick:()=>{m.onSubmit()||i(C)},style:{alignSelf:"flex-start",padding:"5px 12px",background:"var(--accent)",border:"none",borderRadius:"var(--radius-control)",color:"var(--on-accent)",cursor:"pointer",fontSize:"var(--text-sm)",fontWeight:600},children:l("modelsConfig.rename")}),(0,o.jsx)(u.D0,{label:l("modelsConfig.baseUrl"),error:f.error,children:(0,o.jsx)(u.ks,{value:r.baseUrl??"",onChange:e=>{g("baseUrl",e||void 0),f.onChange()},placeholder:"https://api.example.com/v1",mono:!0,invalid:!!f.error,error:f.error,onBlurValidate:f.onBlur})}),(0,o.jsxs)(u.D0,{label:l("modelsConfig.apiKey"),hint:(0,o.jsxs)("span",{children:[(0,o.jsx)(ep,{text:l("modelsConfig.apiKeyHint")}),b&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("br",{}),"A configured key is retained unless you replace it or explicitly clear it."]})]}),error:j.error,children:[(0,o.jsx)(u.L4,{value:"string"==typeof r.apiKey?r.apiKey:"",onChange:e=>{g("apiKey",e||(y?null:void 0)),j.onChange()},placeholder:l("modelsConfig.apiKeyPlaceholder"),invalid:!!j.error,error:j.error,onBlurValidate:j.onBlur,showLabel:l("modelsConfig.showApiKey"),hideLabel:l("modelsConfig.hideApiKey")}),y&&(0,o.jsx)("button",{type:"button",onClick:()=>{g("apiKey",null),j.onChange(),j.onBlur()},style:{alignSelf:"flex-start",padding:"4px 9px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"none",color:"var(--text-muted)",cursor:"pointer",fontSize:"var(--text-sm)"},children:"Clear stored API key"})]}),(0,o.jsx)(u.Jl,{label:l("modelsConfig.noApiKeyRequired"),checked:"none"===r.auth,onChange:e=>{g("auth",e?"none":void 0),e&&j.onChange(),j.onBlur()}}),(0,o.jsx)(u.D0,{label:l("modelsConfig.api"),children:(0,o.jsx)(u.l6,{value:r.api??"openai-completions",onChange:e=>g("api",e),options:r.api&&!ec.includes(r.api)?[r.api,...ec]:ec,required:!0,placeholder:l("modelsConfig.inheritNone")})})]}),(0,o.jsxs)("section",{style:{padding:"14px 16px",border:"1px solid color-mix(in srgb, var(--status-error) 25%, transparent)",borderRadius:"var(--radius-card)",background:"var(--bg-panel)",display:"flex",alignItems:"center",justifyContent:"space-between",gap:"var(--space-5)"},children:[(0,o.jsxs)("div",{children:[(0,o.jsx)("div",{style:{fontSize:12.5,fontWeight:600,color:"var(--text)"},children:"Remove Provider"}),(0,o.jsxs)("div",{style:{fontSize:"var(--text-sm)",color:"var(--text-muted)",marginTop:2},children:["Delete ",e," and remove its models from models.yml configuration."]})]}),(0,o.jsxs)("button",{type:"button",onClick:()=>x(!0),style:{padding:"6px 12px",background:"none",border:"1px solid var(--status-error)",borderRadius:"var(--radius-control)",color:"var(--status-error)",cursor:"pointer",fontSize:"var(--text-md)",display:"inline-flex",alignItems:"center",gap:5,fontWeight:500,flexShrink:0},children:[(0,o.jsx)(h.A,{size:13,"aria-hidden":"true"})," ",l("modelsConfig.delete")]})]}),(0,o.jsx)(u.TM,{open:p,onOpenChange:x,title:l("modelsConfig.deleteProviderTitle",{name:e}),description:l("modelsConfig.deleteProviderBody",{name:e}),confirmLabel:l("modelsConfig.delete"),cancelLabel:l("modelsConfig.cancel"),danger:!0,onConfirm:()=>{x(!1),s()}})]})}let ey=["minimal","low","medium","high","xhigh","max"],eb={minimal:"var(--text-dim)",low:"color-mix(in srgb, var(--accent) 45%, var(--text-muted))",medium:"var(--accent)",high:"var(--accent-hover)",xhigh:"var(--status-warning)",max:"var(--status-error)"};function ej({value:e,onChange:r}){let{t}=(0,a.s9)(),n=e?.efforts,i=e?.effortMap??{},s=(t,o)=>{let a=new Set(n??[...ey]),s={...i};null===o?(a.delete(t),delete s[t]):(a.add(t),"omit"===o?delete s[t]:s[t]=o);let l=ey.filter(e=>a.has(e));0===l.length||l.length===ey.length&&0===Object.keys(s).length?r(void 0):r({...e??{},mode:e?.mode??"effort",efforts:l,effortMap:Object.keys(s).length?s:void 0})};return(0,o.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:2},children:ey.map(e=>{let r=void 0!==n&&!n.includes(e),a=r?null:i[e],l=r?"null":"string"==typeof a?"string":"omit",d="string"==typeof a?a:"",c=eb[e],p={padding:"4px 10px",fontSize:"var(--text-xs)",border:"none",cursor:"pointer",fontWeight:400,transition:"background var(--dur-fast) var(--ease-out-warm), color var(--dur-fast) var(--ease-out-warm)",whiteSpace:"nowrap",background:"var(--bg-panel)",color:"var(--text-dim)"},u={background:"var(--accent)",color:"var(--on-accent)",fontWeight:600};return(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"5px 4px",borderRadius:"var(--radius-control)",background:"transparent",border:"1px solid transparent"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:5,width:68,flexShrink:0},children:[(0,o.jsx)("span",{style:{width:6,height:6,borderRadius:"50%",background:c,flexShrink:0,opacity:"null"===l?.3:1}}),(0,o.jsx)("span",{style:{fontSize:"var(--text-sm)",fontFamily:"var(--font-mono)",color:"null"===l?"var(--text-dim)":"var(--text-muted)",textDecoration:"null"===l?"line-through":"none"},children:e})]}),(0,o.jsxs)("div",{style:{display:"flex",borderRadius:"var(--radius-control)",border:"1px solid var(--border)",overflow:"hidden",flexShrink:0},children:[(0,o.jsx)("button",{onClick:()=>s(e,"omit"),style:{...p,..."omit"===l?u:{}},children:t("modelsConfig.default")}),(0,o.jsx)("button",{onClick:()=>s(e,null),style:{...p,borderLeft:"1px solid var(--border)",..."null"===l?{background:"var(--status-error)",color:"var(--on-accent)",fontWeight:600}:{}},children:t("modelsConfig.disabled")})]}),(0,o.jsxs)("div",{style:{display:"flex",borderRadius:"var(--radius-control)",border:`1px solid ${"string"===l?"var(--accent)":"var(--border)"}`,overflow:"hidden",transition:"border-color var(--dur-fast) var(--ease-out-warm)"},children:[(0,o.jsx)("button",{onClick:()=>s(e,d||e),style:{...p,..."string"===l?u:{},borderRight:"1px solid var(--border)",flexShrink:0},children:t("modelsConfig.custom")}),(0,o.jsx)("input",{value:d,onChange:r=>s(e,r.target.value),onFocus:()=>{"string"!==l&&s(e,d||e)},placeholder:e,maxLength:10,style:{width:"12ch",background:"string"===l?"var(--bg)":"var(--bg-panel)",border:"none",outline:"none",color:"string"===l?"var(--text)":"var(--text-dim)",fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)",padding:"4px 7px",transition:"background var(--dur-fast) var(--ease-out-warm), color var(--dur-fast) var(--ease-out-warm)"}})]})]},e)})})}let eC={input:"modelsConfig.costInput",output:"modelsConfig.costOutput",cacheRead:"modelsConfig.costCacheRead",cacheWrite:"modelsConfig.costCacheWrite"};function ek({providerName:e,provider:r,model:t,onChange:i,onDelete:s}){let{t:l}=(0,a.s9)(),[c,p]=(0,n.useState)({phase:"idle"}),[x,g]=(0,n.useState)(!1),[v,C]=(0,n.useState)(null),[k,S]=(0,n.useState)({phase:"idle"}),[w,z]=(0,n.useState)(""),T=(0,n.useRef)(!1),I=async()=>{if(v&&!T.current){T.current=!0,C(null),z(`${v.providerName} / ${v.modelId}`),S({phase:"testing"});try{let e=await fetch("/api/models-config/connectivity",{method:"POST",headers:{"Content-Type":"application/json"},body:v.body}),r=await e.json();if("object"!=typeof r||null===r)throw Error();let t="latencyMs"in r&&"number"==typeof r.latencyMs&&Number.isFinite(r.latencyMs)?r.latencyMs:void 0;if(!e.ok||!("ok"in r)||!0!==r.ok||!("responseText"in r)||"string"!=typeof r.responseText||!r.responseText.trim()){let e=(0,d.v)(r);S(null===e?{phase:"idle"}:{phase:"error",latencyMs:t,message:e});return}S({phase:"success",latencyMs:t,responseText:r.responseText.slice(0,1e3)})}catch(e){S(e instanceof Error&&"AbortError"===e.name?{phase:"idle"}:{phase:"error",message:l("modelsConfig.connectionFailed")})}finally{T.current=!1}}},A=(e,r)=>i({...t,[e]:r}),R=(0,u.JT)(()=>t.id.trim()?null:l("modelsConfig.errorIdRequired")),M=(()=>{if("idle"===c.phase)return null;if("testing"===c.phase)return l("modelsConfig.validatingConfig");let e=[void 0!==c.latencyMs?`${c.latencyMs}ms`:null,void 0!==c.status?`HTTP ${c.status}`:null].filter(Boolean);return"success"===c.phase?[l("modelsConfig.ok"),...e,c.responseText||null].filter(Boolean).join(" \xb7 "):[l("modelsConfig.failed"),...e,c.message].filter(Boolean).join(" \xb7 ")})();(0,n.useEffect)(()=>{p({phase:"idle"})},[e,r.baseUrl,r.api,r.apiKey,t.id,t.api]);let P=(0,n.useCallback)(async()=>{if(t.id.trim()&&"testing"!==c.phase){p({phase:"testing"});try{let o=await fetch("/api/models-config/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerName:e,provider:r,model:t})}),n=await o.json();if(!o.ok||!n.ok)return void p({phase:"error",message:n.error||n.code?(0,d.K)(n):`HTTP ${o.status}`,latencyMs:n.latencyMs,status:n.status});p({phase:"success",latencyMs:n.latencyMs,status:n.status,responseText:n.responseText})}catch(e){p({phase:"error",message:e instanceof Error?e.message:String(e)})}}},[t,r,e,c.phase]);return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:14},children:[(0,o.jsxs)(u.M_,{label:(0,o.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:5},children:[(0,o.jsx)(m.A,{size:11,"aria-hidden":"true"})," ",l("modelsConfig.model")]}),children:[(0,o.jsxs)("div",{className:"model-detail-grid-2",style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10},children:[(0,o.jsx)(u.D0,{label:l("modelsConfig.idRequired"),required:!0,error:R.error,children:(0,o.jsx)(u.ks,{value:t.id,onChange:e=>{A("id",e),R.onChange()},placeholder:"model-id",mono:!0,invalid:!!R.error,error:R.error,onBlurValidate:R.onBlur})}),(0,o.jsx)(u.D0,{label:l("modelsConfig.name"),children:(0,o.jsx)(u.ks,{value:t.name??"",onChange:e=>A("name",e||void 0),placeholder:l("modelsConfig.displayNamePlaceholder")})})]}),(0,o.jsx)(u.D0,{label:l("modelsConfig.apiOverride"),children:(0,o.jsx)(u.l6,{value:t.api??"",onChange:e=>A("api",e||void 0),options:t.api&&!ec.includes(t.api)?[t.api,...ec]:ec,placeholder:l("modelsConfig.inheritNone")})}),(0,o.jsxs)("div",{style:{display:"flex",gap:20,flexWrap:"wrap"},children:[(0,o.jsx)(u.Jl,{label:l("modelsConfig.reasoningThinking"),checked:t.reasoning??!1,onChange:e=>A("reasoning",e||void 0)}),(0,o.jsx)(u.Jl,{label:l("modelsConfig.imageInput"),checked:t.input?.includes("image")??!1,onChange:e=>A("input",e?["text","image"]:void 0)})]})]}),t.reasoning&&(0,o.jsxs)(u.M_,{label:(0,o.jsxs)("span",{style:{display:"inline-flex",alignItems:"center",gap:5},children:[(0,o.jsx)(f.A,{size:11,"aria-hidden":"true"})," ",l("modelsConfig.thinkingLevels")]}),children:[(0,o.jsx)("div",{style:{display:"flex",justifyContent:"flex-end"},children:t.thinking&&(0,o.jsxs)("button",{type:"button",onClick:()=>A("thinking",void 0),style:{fontSize:"var(--text-xs)",padding:"3px 9px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-dim)",cursor:"pointer",display:"inline-flex",alignItems:"center",gap:"var(--space-2)"},children:[(0,o.jsx)(y.A,{size:10,"aria-hidden":"true"})," ",l("modelsConfig.resetToAuto")]})}),(0,o.jsx)(ej,{value:t.thinking,onChange:e=>A("thinking",e)})]}),(0,o.jsx)(u.M_,{label:l("modelsConfig.tokenLimits"),children:(0,o.jsxs)("div",{className:"model-detail-grid-2",style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:10},children:[(0,o.jsx)(u.D0,{label:l("modelsConfig.contextWindowTokens"),children:(0,o.jsx)(u.XZ,{value:void 0!==t.contextWindow?String(t.contextWindow):"",onChange:e=>A("contextWindow",e?parseInt(e):void 0),placeholder:"128000"})}),(0,o.jsx)(u.D0,{label:l("modelsConfig.maxOutputTokens"),children:(0,o.jsx)(u.XZ,{value:void 0!==t.maxTokens?String(t.maxTokens):"",onChange:e=>A("maxTokens",e?parseInt(e):void 0),placeholder:"16384"})})]})}),(0,o.jsx)(u.M_,{label:l("modelsConfig.costPerMillion"),children:(0,o.jsx)("div",{className:"model-detail-grid-4",style:{display:"grid",gridTemplateColumns:"1fr 1fr 1fr 1fr",gap:10},children:["input","output","cacheRead","cacheWrite"].map(e=>(0,o.jsx)(u.D0,{label:l(eC[e]),children:(0,o.jsx)(u.XZ,{value:t.cost?.[e]!==void 0?String(t.cost[e]):"",onChange:r=>{let o;return o=parseFloat(r),void i({...t,cost:{...t.cost??{},[e]:isNaN(o)?void 0:o}})},placeholder:"0"})},e))})}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",gap:"var(--space-4)"},children:[M&&(0,o.jsxs)("span",{title:M,style:{maxWidth:360,padding:"4px 10px",border:`1px solid ${"error"===c.phase?"color-mix(in srgb, var(--accent) 30%, transparent)":"success"===c.phase?"color-mix(in srgb, var(--accent) 25%, transparent)":"var(--border)"}`,borderRadius:"var(--radius-control)",background:"error"===c.phase?"color-mix(in srgb, var(--accent) 10%, var(--bg-panel))":"success"===c.phase?"color-mix(in srgb, var(--accent) 8%, var(--bg-panel))":"var(--bg-panel)",color:"error"===c.phase||"success"===c.phase?"var(--text)":"var(--text-muted)",fontSize:"var(--text-sm)",display:"inline-flex",alignItems:"center",gap:"var(--space-3)",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:["success"===c.phase?(0,o.jsx)(b.A,{size:11,"aria-hidden":"true"}):null,"error"===c.phase?(0,o.jsx)(j.A,{size:11,"aria-hidden":"true"}):null,M]}),(0,o.jsxs)("div",{style:{display:"flex",gap:"var(--space-4)",marginLeft:"auto"},children:[(0,o.jsxs)("button",{type:"button",onClick:P,disabled:!t.id.trim()||"testing"===c.phase,title:l("modelsConfig.testTitle"),style:{padding:"5px 12px",background:"success"===c.phase?"color-mix(in srgb, var(--accent) 18%, var(--bg-panel))":"none",border:`1px solid ${"success"===c.phase?"color-mix(in srgb, var(--accent) 30%, transparent)":"var(--border)"}`,borderRadius:"var(--radius-control)",color:"success"===c.phase?"var(--accent)":t.id.trim()&&"testing"!==c.phase?"var(--text-muted)":"var(--text-dim)",cursor:t.id.trim()&&"testing"!==c.phase?"pointer":"not-allowed",fontSize:"var(--text-sm)",display:"inline-flex",alignItems:"center",justifyContent:"center",gap:5},children:["success"===c.phase&&(0,o.jsx)(b.A,{size:11,"aria-hidden":"true"}),"testing"===c.phase?l("modelsConfig.testing"):"success"===c.phase?l("modelsConfig.ok"):l("modelsConfig.test")]}),(0,o.jsxs)("button",{type:"button",onClick:()=>g(!0),style:{padding:"5px 12px",background:"none",border:"1px solid color-mix(in srgb, var(--accent) 30%, transparent)",borderRadius:"var(--radius-control)",color:"var(--accent)",cursor:"pointer",fontSize:"var(--text-sm)",display:"inline-flex",alignItems:"center",gap:"var(--space-2)"},children:[(0,o.jsx)(h.A,{size:11,"aria-hidden":"true"})," ",l("modelsConfig.remove")]})]})]}),(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",alignItems:"flex-start",gap:"var(--space-3)"},children:[(0,o.jsx)("button",{type:"button",disabled:!t.id.trim()||"testing"===k.phase||null!==v,onClick:()=>{T.current||C({providerName:e,modelId:t.id,body:JSON.stringify({providerName:e,provider:r,model:t,confirm:!0})})},style:{padding:"5px 12px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text)",fontSize:"var(--text-sm)"},children:l("testing"===k.phase?"modelsConfig.connectionTesting":"modelsConfig.connectionTest")}),(0,o.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:l("modelsConfig.connectionIsolation")}),"idle"!==k.phase&&(0,o.jsxs)("div",{role:"status","aria-live":"polite",style:{fontSize:"var(--text-sm)",color:"var(--text)",whiteSpace:"pre-wrap",overflowWrap:"anywhere",maxWidth:"100%"},children:[w," \xb7 ","testing"===k.phase?l("modelsConfig.connectionTesting"):(0,o.jsxs)(o.Fragment,{children:["success"===k.phase?l("modelsConfig.connectionSuccess"):k.message,void 0!==k.latencyMs?` \xb7 ${k.latencyMs}ms`:"","success"===k.phase?`
|
|
2
|
-
${k.responseText}`:""]})]})]}),(0,o.jsx)(u.TM,{open:null!==v,onOpenChange:e=>{e||C(null)},title:l("modelsConfig.connectionConfirmTitle"),description:l("modelsConfig.connectionConfirmBody",{provider:v?.providerName??"",model:v?.modelId??""}),confirmLabel:l("modelsConfig.connectionTest"),cancelLabel:l("modelsConfig.cancel"),onConfirm:I}),(0,o.jsx)(u.TM,{open:x,onOpenChange:g,title:l("modelsConfig.removeModelTitle",{id:t.id}),description:l("modelsConfig.removeModelBody",{id:t.id}),confirmLabel:l("modelsConfig.remove"),cancelLabel:l("modelsConfig.cancel"),danger:!0,onConfirm:()=>{g(!1),s()}})]})}function eS({provider:e,onRefresh:r}){let{t,tn:i}=(0,a.s9)(),[l,c]=(0,n.useState)({phase:"idle"}),[p,u]=(0,n.useState)(""),x=(0,n.useRef)(null),g=(0,n.useRef)(null);(0,n.useEffect)(()=>{("auth"===l.phase||"prompt"===l.phase)&&setTimeout(()=>g.current?.focus(),50)},[l.phase]),(0,n.useEffect)(()=>{c({phase:"idle"}),u(""),x.current?.close(),x.current=null},[e.id]),(0,n.useEffect)(()=>()=>{x.current?.close()},[]);let v=(0,n.useCallback)(()=>{x.current?.close(),c({phase:"connecting"}),u("");let o=new EventSource(`/api/auth/login/${encodeURIComponent(e.id)}`);x.current=o,o.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}"auth"===t.type?(c({phase:"auth",url:t.url,instructions:t.instructions??null,token:t.token}),s(t.url)&&window.open(t.url,"_blank","noopener,noreferrer")):"device_code"===t.type?(c({phase:"device_code",userCode:t.userCode,verificationUri:t.verificationUri,intervalSeconds:t.intervalSeconds??null,expiresInSeconds:t.expiresInSeconds??null}),s(t.verificationUri)&&window.open(t.verificationUri,"_blank","noopener,noreferrer")):"prompt_request"===t.type?c({phase:"prompt",message:t.message,placeholder:t.placeholder??null,token:t.token}):"select_request"===t.type?c({phase:"select",message:t.message,options:t.options??[],token:t.token}):"progress"===t.type?c({phase:"progress",message:t.message}):"success"===t.type?(o.close(),c({phase:"success"}),r()):"error"===t.type?(o.close(),c({phase:"error",message:t.message})):"cancelled"===t.type&&(o.close(),c({phase:"idle"}))},o.onerror=()=>{o.close(),c(e=>"success"===e.phase?e:{phase:"error",message:t("modelsConfig.connectionLost")})}},[e.id,r,t]),h=(0,n.useCallback)(async(r,o)=>{if(o.trim()){c({phase:"progress",message:t("modelsConfig.verifying")});try{let n=await fetch(`/api/auth/login/${encodeURIComponent(e.id)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r,code:o.trim()})});if(!n.ok){let e=await n.json().catch(()=>({}));c({phase:"error",message:e.error||e.code?(0,d.K)(e):t("modelsConfig.serverError",{status:n.status})});return}u("")}catch(e){c({phase:"error",message:e instanceof Error?e.message:t("modelsConfig.networkError")})}}},[e.id,t]),m=(0,n.useCallback)(async(r,o)=>{c({phase:"progress",message:t("modelsConfig.continuing")});try{let n=await fetch(`/api/auth/login/${encodeURIComponent(e.id)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({token:r,code:o})});if(!n.ok){let e=await n.json().catch(()=>({}));c({phase:"error",message:e.error||e.code?(0,d.K)(e):t("modelsConfig.serverError",{status:n.status})})}}catch(e){c({phase:"error",message:e instanceof Error?e.message:t("modelsConfig.networkError")})}},[e.id,t]),f="connecting"===l.phase||"progress"===l.phase||"auth"===l.phase||"device_code"===l.phase||"prompt"===l.phase||"select"===l.phase;return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-6)"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[(0,o.jsx)(eu,{children:t("modelsConfig.subscription")}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[(0,o.jsx)("span",{style:{width:7,height:7,borderRadius:"50%",background:e.loggedIn?"var(--status-success)":"var(--border)",display:"inline-block"}}),(0,o.jsx)("span",{style:{fontSize:"var(--text-sm)",color:e.loggedIn?"var(--status-success)":"var(--text-dim)"},children:e.loggedIn?t("modelsConfig.connected"):t("modelsConfig.notConnected")})]})]}),(0,o.jsxs)("div",{style:{minHeight:48},children:["idle"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:e.loggedIn?t("modelsConfig.alreadyConnected"):t("modelsConfig.connectAccount",{name:e.name})}),"connecting"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)"},children:t("modelsConfig.openingBrowser")}),"select"===l.phase&&(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:l.message}),(0,o.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-3)"},children:l.options.map(e=>(0,o.jsx)("button",{onClick:()=>m(l.token,e.id),style:{padding:"6px 9px",background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text)",cursor:"pointer",fontSize:"var(--text-md)",textAlign:"left"},children:e.label},e.id))})]}),("auth"===l.phase||"prompt"===l.phase)&&(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:"auth"===l.phase?t("modelsConfig.completeSignIn"):l.message}),"auth"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-sm)",color:"var(--text-dim)",lineHeight:1.5},children:(0,o.jsx)("a",{href:l.url,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--accent)",wordBreak:"break-all"},children:t("modelsConfig.browserNotOpened")})}),(0,o.jsxs)("div",{style:{display:"flex",gap:"var(--space-3)"},children:[(0,o.jsx)("input",{ref:g,value:p,onChange:e=>u(e.target.value),onKeyDown:e=>{"Enter"===e.key&&h(l.token,p)},placeholder:"auth"===l.phase?"http://localhost:1455/auth/callback?code=…":l.placeholder??t("modelsConfig.enterValue"),style:{flex:1,padding:"6px 9px",background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text)",fontSize:"var(--text-md)",outline:"none",fontFamily:"var(--font-mono)",boxSizing:"border-box"}}),(0,o.jsx)("button",{onClick:()=>h(l.token,p),disabled:!p.trim(),style:{padding:"6px 12px",background:p.trim()?"var(--accent)":"var(--bg-panel)",border:"none",borderRadius:"var(--radius-control)",color:p.trim()?"var(--on-accent)":"var(--text-dim)",cursor:p.trim()?"pointer":"not-allowed",fontSize:"var(--text-md)",fontWeight:600,flexShrink:0},children:t("modelsConfig.submit")})]})]}),"device_code"===l.phase&&(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:t("modelsConfig.deviceCodeInstructions")}),(0,o.jsx)("div",{style:{padding:"8px 10px",background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text)",fontSize:16,fontWeight:700,fontFamily:"var(--font-mono)",letterSpacing:0},children:l.userCode}),(0,o.jsxs)("p",{style:{margin:0,fontSize:"var(--text-sm)",color:"var(--text-dim)",lineHeight:1.5},children:[(0,o.jsx)("a",{href:l.verificationUri,target:"_blank",rel:"noopener noreferrer",style:{color:"var(--accent)",wordBreak:"break-all"},children:l.verificationUri}),l.expiresInSeconds?" "+i("modelsConfig.expiresInMinutes",Math.ceil(l.expiresInSeconds/60)):""]})]}),"progress"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)"},children:l.message}),"success"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--status-success)"},children:t("modelsConfig.connectedSuccessfully")}),"error"===l.phase&&(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--status-error)"},children:l.message})]}),(0,o.jsx)("div",{style:{display:"flex",gap:"var(--space-4)"},children:f?(0,o.jsx)("button",{onClick:()=>{x.current?.close(),c({phase:"idle"})},style:{padding:"5px 12px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",cursor:"pointer",fontSize:"var(--text-md)"},children:t("modelsConfig.cancel")}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("button",{onClick:v,style:{padding:"5px 14px",background:"var(--accent)",border:"none",borderRadius:"var(--radius-control)",color:"var(--on-accent)",cursor:"pointer",fontSize:"var(--text-md)",fontWeight:600},children:e.loggedIn?t("modelsConfig.relogin"):t("modelsConfig.login")}),e.loggedIn&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("button",{type:"button",disabled:!0,title:"Disconnect this OMP account from the OMP terminal",style:{padding:"5px 12px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-dim)",cursor:"not-allowed",fontSize:"var(--text-md)",opacity:.7},children:t("modelsConfig.disconnect")}),(0,o.jsx)("span",{style:{alignSelf:"center",color:"var(--text-dim)",fontSize:"var(--text-sm)"},children:"Use the OMP terminal to disconnect this account."})]})]})})]})}function ew({provider:e}){let{t:r,tn:t}=(0,a.s9)();return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:"var(--space-6)"},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between"},children:[(0,o.jsx)(eu,{children:r("modelsConfig.apiKey")}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)"},children:[(0,o.jsx)("span",{style:{width:7,height:7,borderRadius:"50%",background:e.configured?"var(--status-success)":"var(--border)",display:"inline-block"}}),(0,o.jsx)("span",{style:{fontSize:"var(--text-sm)",color:e.configured?"var(--status-success)":"var(--text-dim)"},children:r(e.configured?"modelsConfig.configured":"modelsConfig.notConfigured")})]})]}),(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.5},children:e.configured?t("modelsConfig.providerConfigured",e.modelCount,{name:e.displayName}):r("modelsConfig.providerNotConfigured",{name:e.displayName})}),(0,o.jsx)("p",{style:{margin:0,fontSize:"var(--text-sm)",color:"var(--text-dim)",lineHeight:1.5},children:(0,o.jsx)(ep,{text:r("modelsConfig.apiKeyManageHint")})})]})}function ez({id:e,size:r}){let t=ei[e];if(!t){let t=e.split(/[-_]/).filter(Boolean).slice(0,2).map(e=>e[0]).join("").toUpperCase()||"?";return(0,o.jsx)("span",{"aria-hidden":"true",style:{width:r,height:r,border:"1px solid var(--border)",borderRadius:4,color:"var(--text-dim)",display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0,fontSize:Math.max(8,Math.floor(.42*r)),fontWeight:700,lineHeight:1},children:t})}return t.hasColor?(0,o.jsx)(t.Icon,{size:r}):(0,o.jsx)(t.Icon,{size:r,style:{color:"var(--text-muted)"}})}function eT({oauthProviders:e,apiKeyProviders:r,onSelectOAuth:t,onSelectApiKey:i,onAddCustom:s,onClose:l}){let{t:d,tn:c}=(0,a.s9)(),[u,x]=(0,n.useState)(""),g=(0,n.useRef)(null),v=u.trim().toLowerCase(),h=e.filter(e=>!e.loggedIn&&(!v||e.name.toLowerCase().includes(v))),m=r.filter(e=>!e.configured&&(!v||e.displayName.toLowerCase().includes(v)||e.id.toLowerCase().includes(v))),f=!v||"custom".includes(v)||"openai-compatible".includes(v)||"anthropic-compatible".includes(v),y=h.length+m.length+ +!!f,b={display:"flex",flexDirection:"row",alignItems:"center",gap:"var(--space-4)",padding:"10px 12px",background:"var(--bg-panel)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",boxSizing:"border-box",cursor:"pointer",minWidth:0,textAlign:"left",transition:"border-color var(--dur-fast) var(--ease-out-warm), background var(--dur-fast) var(--ease-out-warm)",width:"100%"};return(0,o.jsx)(p.lG,{open:!0,onOpenChange:e=>{e||l()},children:(0,o.jsxs)(p.Cf,{ariaLabel:d("modelsConfig.addProvider"),style:{width:820,maxWidth:"min(92vw, 820px)",maxHeight:"min(72dvh, calc(100dvh - 32px))",padding:0,display:"flex",flexDirection:"column",overflow:"hidden"},children:[(0,o.jsx)(p.L3,{style:{margin:"14px 18px 8px",fontSize:18},children:d("modelsConfig.addProvider")}),(0,o.jsx)("div",{style:{padding:"8px 14px 12px",flexShrink:0},children:(0,o.jsx)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"6px 10px",background:"var(--bg)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)"},children:(0,o.jsx)("input",{ref:g,value:u,onChange:e=>x(e.target.value),placeholder:d("modelsConfig.searchProviders"),style:{flex:1,background:"none",border:"none",outline:"none",color:"var(--text)",fontSize:"var(--text-base)",boxSizing:"border-box",minWidth:0}})})}),(0,o.jsx)("div",{style:{flex:1,overflowY:"auto",padding:"4px 14px 14px"},children:0===y?(0,o.jsx)("div",{style:{padding:"20px 0",fontSize:"var(--text-md)",color:"var(--text-dim)",textAlign:"center"},children:d("modelsConfig.noProvidersMatch")}):(0,o.jsxs)("div",{style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(min(240px, 100%), 1fr))",gap:"var(--space-4)"},children:[f&&(0,o.jsx)("div",{style:{gridColumn:"1 / -1",fontSize:"var(--text-xs)",fontWeight:600,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.07em"},children:d("modelsConfig.customSection")}),f&&(0,o.jsxs)("button",{type:"button",onClick:()=>{s(),l()},style:b,onMouseEnter:e=>{e.currentTarget.style.borderColor="var(--accent)",e.currentTarget.style.background="var(--bg-hover)"},onMouseLeave:e=>{e.currentTarget.style.borderColor="var(--border)",e.currentTarget.style.background="var(--bg-panel)"},children:[(0,o.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,o.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600,color:"var(--text)",lineHeight:1.3,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:d("modelsConfig.openaiAnthropicCompatible")}),(0,o.jsx)("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-dim)",marginTop:2},children:d("modelsConfig.customEndpointFormat")})]}),(0,o.jsx)("span",{style:{width:26,height:26,borderRadius:"var(--radius-control)",background:"var(--bg-hover)",border:"1px dashed var(--border)",display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:(0,o.jsx)(C.A,{size:13,"aria-hidden":"true"})})]}),h.length>0&&(0,o.jsx)("div",{style:{gridColumn:"1 / -1",paddingTop:6*!!f,fontSize:"var(--text-xs)",fontWeight:600,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.07em"},children:d("modelsConfig.subscriptions")}),h.map(e=>(0,o.jsxs)("button",{type:"button",onClick:()=>{t(e.id),l()},style:b,onMouseEnter:e=>{e.currentTarget.style.borderColor="var(--accent)",e.currentTarget.style.background="var(--bg-hover)"},onMouseLeave:e=>{e.currentTarget.style.borderColor="var(--border)",e.currentTarget.style.background="var(--bg-panel)"},children:[(0,o.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,o.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600,color:"var(--text)",lineHeight:1.3,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),(0,o.jsx)("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-dim)",marginTop:2},children:"OAuth"})]}),(0,o.jsx)(ez,{id:e.id,size:28})]},e.id)),m.length>0&&(0,o.jsx)("div",{style:{gridColumn:"1 / -1",paddingTop:6*(h.length>0),fontSize:"var(--text-xs)",fontWeight:600,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.07em"},children:d("modelsConfig.apiKey")}),m.map(e=>(0,o.jsxs)("button",{type:"button",onClick:()=>{i(e.id),l()},style:b,onMouseEnter:e=>{e.currentTarget.style.borderColor="var(--accent)",e.currentTarget.style.background="var(--bg-hover)"},onMouseLeave:e=>{e.currentTarget.style.borderColor="var(--border)",e.currentTarget.style.background="var(--bg-panel)"},children:[(0,o.jsxs)("div",{style:{flex:1,minWidth:0},children:[(0,o.jsx)("div",{style:{fontSize:"var(--text-md)",fontWeight:600,color:"var(--text)",lineHeight:1.3,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.displayName}),(0,o.jsx)("div",{style:{fontSize:"var(--text-xs)",color:"var(--text-dim)",marginTop:2},children:c("modelsConfig.modelCount",e.modelCount)})]}),(0,o.jsx)(ez,{id:e.id,size:28})]},e.id))]})})]})})}function eI(e){return Array.isArray(e)?`[${e.map(eI).join(",")}]`:e&&"object"==typeof e?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${eI(e[r])}`).join(",")}}`:JSON.stringify(e)??"undefined"}function eA({onSaved:e,onDirtyChange:r}){let{t}=(0,a.s9)(),s=(0,i.a)(),[p,u]=(0,n.useState)({providers:{}}),x=(0,n.useRef)(p),g=(0,n.useCallback)(e=>{let r=x.current,t="function"==typeof e?e(r):e;t!==r&&(x.current=t,u(t))},[]),v=(0,n.useRef)(eI({providers:{}})),[h,m]=(0,n.useState)(!0),[f,b]=(0,n.useState)(!1),[j,T]=(0,n.useState)(null),[A,R]=(0,n.useState)([]),[M,P]=(0,n.useState)(!1),[O,$]=(0,n.useState)(null),[W,E]=(0,n.useState)([]),[N,L]=(0,n.useState)([]),[U,D]=(0,n.useState)([]),[F,H]=(0,n.useState)([]),[K,B]=(0,n.useState)(!0),[_,J]=(0,n.useState)(null),[q,G]=(0,n.useState)(!1),[Y,V]=(0,n.useState)(null),[X,Q]=(0,n.useState)(null),Z=(0,n.useCallback)(()=>{fetch("/api/auth/providers").then(e=>e.json()).then(e=>{Array.isArray(e.providers)&&E(e.providers)}).catch(()=>{})},[]),ee=(0,n.useCallback)(()=>{fetch("/api/auth/all-providers").then(e=>e.json()).then(e=>{Array.isArray(e.providers)&&L(e.providers)}).catch(()=>{})},[]),er=(0,n.useCallback)(async e=>{B(!0);try{e?.force&&(0,c.dU)();let r=await (0,c.aQ)("",{force:e?.force});D(r.modelList??[]),H(r.connectedProviders??[])}catch{}finally{B(!1)}},[]),et=(0,n.useCallback)(async(e=eI(x.current))=>{m(!0);try{let r=await fetch("/api/models-config"),t=await r.json();if(eI(x.current)!==e)return;if(t.parseError){Q({message:t.parseError,path:t.path}),g({providers:{}}),$(null);return}if(!r.ok)throw Error(`HTTP ${r.status}`);Q(null),T(null),R([]);let o=t.providers?t:{...t,providers:{}};v.current=eI(o),g(o);let n=Object.keys(o.providers??{});n.length>0?$({type:"provider",name:n[0]}):$(null)}catch{}finally{m(!1)}},[g]);(0,n.useEffect)(()=>{et(),Z(),ee(),er()},[et,Z,ee,er]),(0,n.useEffect)(()=>{r?.(v.current!==eI(p))},[p,r]),(0,n.useEffect)(()=>{try{let e=JSON.parse(localStorage.getItem(es)??"null");Array.isArray(e)&&J(new Set(e.filter(e=>"string"==typeof e)))}catch{}},[]);let eo=(0,n.useCallback)((e,r)=>{J(t=>{let o=new Set(t??U.map(e=>`${e.provider}:${e.id}`)),n=`${e.provider}:${e.id}`;return r?o.add(n):o.delete(n),localStorage.setItem(es,JSON.stringify([...o])),window.dispatchEvent(new Event("omp-composer-models-change")),o})},[U]),en=(0,n.useCallback)((e,r)=>{J(t=>{let o=new Set(t??U.map(e=>`${e.provider}:${e.id}`));for(let t of U){if(t.provider!==e)continue;let n=`${t.provider}:${t.id}`;r?o.add(n):o.delete(n)}return localStorage.setItem(es,JSON.stringify([...o])),window.dispatchEvent(new Event("omp-composer-models-change")),o})},[U]),ei=(0,n.useCallback)(async e=>{let r=await fetch("/api/providers/enable",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e})}),t=await r.json();if(!r.ok||t.error)throw Error(t.error||`HTTP ${r.status}`);await er({force:!0})},[er]),el=(0,n.useCallback)(()=>{let e="new-provider",r=1;for(;p.providers?.[e];)e=`new-provider-${r++}`;g(r=>({...r,providers:{...r.providers??{},[e]:{api:"openai-completions"}}})),$({type:"provider",name:e})},[p.providers,g]),ec=(0,n.useCallback)((e,r)=>{g(t=>({...t,providers:{...t.providers??{},[e]:r}}))},[g]),ep=(0,n.useCallback)((e,r)=>{g(t=>{let o=Object.entries(t.providers??{}),n=o.findIndex(([r])=>r===e);return -1===n?t:(o[n]=[r,o[n][1]],{...t,providers:Object.fromEntries(o)})}),$(t=>t?"provider"===t.type&&t.name===e?{type:"provider",name:r}:"model"===t.type&&t.providerName===e?{...t,providerName:r}:t:t)},[g]),eh=(0,n.useCallback)(e=>{g(r=>{let t={...r.providers??{}};return delete t[e],{...r,providers:t}}),g(e=>{let r=Object.keys(e.providers??{});return $(r.length>0?{type:"provider",name:r[0]}:null),e})},[g]),em=(0,n.useCallback)(e=>{g(r=>{let t=r.providers?.[e]??{},o=[...t.models??[],{id:""}];return{...r,providers:{...r.providers??{},[e]:{...t,models:o}}}}),g(r=>{let t=(r.providers?.[e]?.models?.length??1)-1;return $({type:"model",providerName:e,index:t}),r})},[g]),ey=(0,n.useCallback)((e,r,t)=>{let o,n=(o={...r,id:r.id,...void 0!==r.cost?{cost:{...r.cost}}:{}},delete o.originalId,o);g(r=>{let o=r.providers?.[e]??{},i=[...o.models??[],n],a={...o,models:i};return t&&!o.baseUrl&&(a.baseUrl=t),{...r,providers:{...r.providers??{},[e]:a}}}),g(r=>{let t=(r.providers?.[e]?.models?.length??1)-1;return $({type:"model",providerName:e,index:t}),r}),V(null)},[g]),eb=(0,n.useCallback)((e,r,t)=>{g(o=>{let n=o.providers?.[e]??{},i=[...n.models??[]];return i[r]=t,{...o,providers:{...o.providers??{},[e]:{...n,models:i}}}})},[g]),ej=(0,n.useCallback)((e,r)=>{g(t=>{let o=t.providers?.[e]??{},n=[...o.models??[]];return n.splice(r,1),{...t,providers:{...t.providers??{},[e]:{...o,models:n.length?n:void 0}}}}),$({type:"provider",name:e})},[g]),eC=(0,n.useCallback)(async()=>{if(X)return;let o=x.current,n=function(e){if(!e.providers)return e;let r=!1,t={};for(let[o,n]of Object.entries(e.providers)){let e=n.models;if(!e?.some(l)){t[o]=n;continue}r=!0;let i=e.filter(e=>!l(e));t[o]={...n,models:i.length>0?i:void 0}}return r?{...e,providers:t}:e}(o),i=eI(o),a=eI(n);b(!0),T(null),R([]),P(!1);try{let o=await fetch("/api/models-config?mode=full",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)}),s=await o.json();if(!o.ok||s.error){let e=Array.isArray(s.issues)?s.issues.filter(e=>"string"==typeof e.path&&"string"==typeof e.message):[],r=e.map(e=>e.path?`${e.path}: ${e.message}`:e.message).join("; ");R(e);let n=s.error||s.code?(0,d.K)(s):`HTTP ${o.status}`;T(n),z.oR.error(t("modelsConfig.saveErrorTitle"),r?`${n}: ${r}`:n),"models_config_unparseable"===s.code&&Q({message:s.error??(0,d.K)(s)})}else{v.current=a;let o=eI(x.current)!==i;o&&r?.(!0),o||(g(n),r?.(!1),await et(a)),await er({force:!0}),ee(),e?.(),o&&r?.(!0),P(!0),setTimeout(()=>P(!1),2e3),z.oR.success(t("modelsConfig.saveSuccessTitle"))}}catch(r){let e=r instanceof Error?r.message:String(r);T(e),z.oR.error(t("modelsConfig.saveErrorTitle"),e)}finally{b(!1)}},[ee,et,er,r,e,X,g,t]),eR=Object.entries(p.providers??{}),eM=W.filter(e=>e.loggedIn),eP=N.filter(e=>e.configured),eO=U.reduce((e,r)=>((e[r.provider]??=[]).push(r),e),{}),e$=(()=>{if(!O)return null;if("oauth"===O.type){let e=W.find(e=>e.id===O.providerId);return e?(0,o.jsx)(eS,{provider:e,onRefresh:()=>{Z(),ee(),er({force:!0})}},e.id):null}if("apikey"===O.type){let e=N.find(e=>e.id===O.providerId);return e?(0,o.jsx)(ew,{provider:e},e.id):null}if("roles"===O.type)return(0,o.jsx)(ed,{models:U});if("registry"===O.type)return(0,o.jsx)(ea,{models:U,connectedProviders:F,onChanged:()=>er({force:!0})});if("picker"===O.type)return(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:14},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"flex-start",justifyContent:"space-between",gap:"var(--space-5)"},children:[(0,o.jsxs)("div",{children:[(0,o.jsx)(eu,{children:"Composer Model Picker"}),(0,o.jsx)("p",{style:{margin:"4px 0 0",color:"var(--text-muted)",fontSize:"var(--text-md)",lineHeight:1.5},children:"Choose which native OMP models are available in the composer. This changes only omp-web's picker, not OMP's model registry."})]}),(0,o.jsx)("button",{type:"button",onClick:()=>void er({force:!0}),disabled:K,title:"Refresh OMP runtime models",style:{padding:7,border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"transparent",color:"var(--text-muted)",cursor:K?"wait":"pointer"},children:(0,o.jsx)(y.A,{size:14,"aria-hidden":"true"})})]}),K?(0,o.jsx)("div",{style:{color:"var(--text-muted)",fontSize:"var(--text-md)"},children:"Loading OMP runtime models..."}):Object.entries(eO).map(([e,r])=>{let t=r.every(e=>null===_||_.has(`${e.provider}:${e.id}`)),n=r.some(e=>null===_||_.has(`${e.provider}:${e.id}`));return(0,o.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:"var(--radius-card)",overflow:"hidden"},children:[(0,o.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"9px 11px",background:"var(--bg-panel)",color:"var(--text)",fontSize:"var(--text-md)",fontWeight:600},children:[(0,o.jsx)("input",{type:"checkbox",checked:t,ref:e=>{e&&(e.indeterminate=n&&!t)},onChange:r=>en(e,r.target.checked),"aria-label":`Show all ${e} models in composer`}),(0,o.jsx)(ez,{id:e,size:15}),(0,o.jsx)("span",{children:e}),(0,o.jsxs)("span",{style:{marginLeft:"auto",color:"var(--text-dim)",fontSize:"var(--text-sm)",fontWeight:400},children:[r.length," model",1===r.length?"":"s"]})]}),(0,o.jsx)("div",{style:{padding:"4px 0"},children:r.map(e=>(0,o.jsxs)("label",{style:{display:"flex",alignItems:"center",gap:9,padding:"7px 11px",color:"var(--text-muted)",cursor:"pointer"},children:[(0,o.jsx)("input",{type:"checkbox",checked:null===_||_.has(`${e.provider}:${e.id}`),onChange:r=>eo(e,r.target.checked),"aria-label":`Show ${e.provider}/${e.id} in composer`}),(0,o.jsx)("span",{style:{minWidth:0,flex:1,fontSize:"var(--text-md)"},children:e.name||e.id}),(0,o.jsxs)("code",{style:{color:"var(--text-dim)",fontSize:"var(--text-sm)",fontFamily:"var(--font-mono)",whiteSpace:"nowrap"},children:[e.provider,"/",e.id]})]},`${e.provider}:${e.id}`))})]},e)}),!K&&0===U.length&&(0,o.jsx)("div",{style:{color:"var(--text-muted)",fontSize:"var(--text-md)"},children:"OMP did not report any configured models."}),F.filter(e=>!eO[e.id]).map(e=>(0,o.jsxs)("section",{style:{border:"1px solid var(--border)",borderRadius:"var(--radius-card)",padding:12},children:[(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-4)",color:"var(--text)",fontSize:"var(--text-md)",fontWeight:600},children:[(0,o.jsx)(ez,{id:e.id,size:15}),e.name]}),(0,o.jsx)("p",{style:{margin:"6px 0 0",color:"var(--text-muted)",fontSize:"var(--text-md)",lineHeight:1.5},children:e.disabled?"Connected, but disabled in OMP. Enable it to discover its models.":"Connected, but OMP has not reported models for this provider yet."}),e.disabled&&(0,o.jsx)("button",{type:"button",onClick:()=>void ei(e.id).catch(e=>z.oR.error("Could not enable provider",e instanceof Error?e.message:String(e))),style:{marginTop:8,padding:"6px 10px",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",background:"transparent",color:"var(--text)",cursor:"pointer",fontSize:"var(--text-md)"},children:"Enable in OMP"})]},e.id))]});if("provider"===O.type){let e=p.providers?.[O.name];return e?(0,o.jsx)(ef,{name:O.name,provider:e,onChange:e=>ec(O.name,e),onRename:e=>ep(O.name,e),onDelete:()=>eh(O.name)},O.name):null}let e=p.providers?.[O.providerName],r=e?.models?.[O.index];return r?(0,o.jsx)(ek,{providerName:O.providerName,provider:e,model:r,onChange:e=>eb(O.providerName,O.index,e),onDelete:()=>ej(O.providerName,O.index)},`${O.providerName}-${O.index}`):null})();return(0,o.jsxs)(o.Fragment,{children:[X?(0,o.jsxs)("div",{style:{flex:1,overflowY:"auto",padding:"var(--space-8)",display:"flex",flexDirection:"column",gap:"var(--space-5)"},children:[(0,o.jsx)("div",{style:{fontSize:"var(--text-base)",fontWeight:600,color:"var(--status-error)"},children:t("modelsConfig.parseErrorTitle")}),(0,o.jsx)("div",{style:{fontSize:"var(--text-md)",color:"var(--text-muted)",lineHeight:1.6},children:t("modelsConfig.parseErrorBody")}),X.path&&(0,o.jsx)("code",{style:{fontSize:"var(--text-sm)",color:"var(--text-dim)",fontFamily:"var(--font-mono)",wordBreak:"break-all"},children:X.path}),(0,o.jsx)("pre",{style:{margin:0,padding:"10px 12px",background:"var(--bg-panel)",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",fontSize:"var(--text-sm)",fontFamily:"var(--font-mono)",whiteSpace:"pre-wrap",wordBreak:"break-word",overflowX:"auto"},children:X.message}),(0,o.jsx)("button",{onClick:()=>{et()},disabled:h,style:{alignSelf:"flex-start",padding:"5px 12px",background:"none",border:"1px solid var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",cursor:h?"default":"pointer",fontSize:"var(--text-md)"},children:h?t("modelsConfig.loading"):t("modelsConfig.reload")})]}):(0,o.jsxs)("div",{style:{flex:1,display:"flex",flexDirection:s?"column":"row",overflow:"hidden"},children:[(0,o.jsxs)("div",{style:{width:s?"100%":235,maxHeight:s?"40vh":void 0,borderRight:s?"none":"1px solid var(--border)",borderBottom:s?"1px solid var(--border)":"none",display:"flex",flexDirection:"column",flexShrink:0,background:"var(--bg-panel)"},children:[(0,o.jsxs)("div",{style:{flex:1,overflowY:"auto",padding:"8px 6px"},children:[(0,o.jsx)(ex,{icon:k.A,label:"Native OMP registry",selected:O?.type==="registry",onClick:()=>$({type:"registry"})}),(0,o.jsx)(ex,{icon:S.A,label:"Composer model picker",selected:O?.type==="picker",onClick:()=>$({type:"picker"})}),(0,o.jsx)(ex,{icon:w.A,label:"OMP model roles",selected:O?.type==="roles",onClick:()=>$({type:"roles"})}),(eM.length>0||eP.length>0)&&(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",padding:"14px 10px 6px",color:"var(--text-dim)",fontSize:"var(--text-xs)",fontWeight:700,letterSpacing:"0.06em",textTransform:"uppercase"},children:[(0,o.jsx)("span",{"aria-hidden":"true",style:{width:6,height:6,borderRadius:"50%",background:"var(--accent)",flexShrink:0}}),"Connected through OMP"]}),eM.map(e=>{let r=O?.type==="oauth"&&O.providerId===e.id;return(0,o.jsxs)("button",{type:"button",onClick:()=>$({type:"oauth",providerId:e.id}),style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"7px 10px",borderRadius:"var(--radius-control)",cursor:"pointer",width:"100%",border:"none",textAlign:"left",fontFamily:"inherit",background:r?"var(--bg-selected)":"none",fontWeight:r?600:400},...eg(r),children:[(0,o.jsx)(ez,{id:e.id,size:16}),(0,o.jsx)("span",{style:{fontSize:"var(--text-md)",color:"var(--text)",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.name}),(0,o.jsx)("span",{title:`OMP OAuth provider: ${e.id}`,style:{padding:"2px 5px",borderRadius:4,background:"var(--bg-subtle)",color:"var(--text-muted)",fontSize:9,fontWeight:500,flexShrink:0},children:"OAuth"})]},e.id)}),eP.map(e=>{let r=O?.type==="apikey"&&O.providerId===e.id;return(0,o.jsxs)("button",{type:"button",onClick:()=>$({type:"apikey",providerId:e.id}),style:{display:"flex",alignItems:"center",gap:"var(--space-4)",padding:"7px 10px",borderRadius:"var(--radius-control)",cursor:"pointer",width:"100%",border:"none",textAlign:"left",fontFamily:"inherit",background:r?"var(--bg-selected)":"none",fontWeight:r?600:400},...eg(r),children:[(0,o.jsx)(ez,{id:e.id,size:16}),(0,o.jsx)("span",{style:{fontSize:"var(--text-md)",color:"var(--text)",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.displayName}),(0,o.jsx)("span",{title:`OMP API-key provider: ${e.id}`,style:{padding:"2px 5px",borderRadius:4,background:"var(--bg-subtle)",color:"var(--text-muted)",fontSize:9,fontWeight:500,flexShrink:0},children:"API key"})]},e.id)}),(eM.length>0||eP.length>0)&&eR.length>0&&(0,o.jsx)("div",{style:{margin:"8px 10px",borderTop:"1px solid var(--border)"}}),eR.length>0&&(0,o.jsx)("div",{style:{padding:"10px 10px 4px",fontSize:"var(--text-xs)",fontWeight:700,color:"var(--text-dim)",textTransform:"uppercase",letterSpacing:"0.06em"},children:"Configured Providers"}),h?(0,o.jsx)("div",{style:{padding:"10px 8px",fontSize:"var(--text-md)",color:"var(--text-muted)"},children:t("modelsConfig.loading")}):eR.map(([e,r])=>{let n=O?.type==="provider"&&O.name===e,i=r.models??[];return(0,o.jsxs)("div",{style:{marginBottom:6,padding:"4px 6px",borderRadius:"var(--radius-control)",background:n?"var(--bg-panel)":"transparent",border:n?"1px solid var(--border)":"1px solid transparent"},children:[(0,o.jsxs)("button",{type:"button",onClick:()=>$({type:"provider",name:e}),style:{display:"flex",alignItems:"center",gap:7,padding:"6px 8px",borderRadius:"var(--radius-control)",cursor:"pointer",width:"100%",border:"none",textAlign:"left",fontFamily:"inherit",background:n?"var(--bg-selected)":"none"},...eg(n),children:[(0,o.jsx)(ez,{id:e,size:15}),(0,o.jsx)("span",{style:{fontSize:"var(--text-md)",fontWeight:n?600:500,color:"var(--text)",fontFamily:"var(--font-mono)",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e}),(0,o.jsxs)("span",{style:{fontSize:"var(--text-xs)",color:"var(--text-dim)",padding:"1px 5px",borderRadius:4,background:"var(--bg-subtle)"},children:[i.length," model",1===i.length?"":"s"]})]}),i.map((r,n)=>{let i=O?.type==="model"&&O.providerName===e&&O.index===n;return(0,o.jsxs)("button",{type:"button",onClick:()=>$({type:"model",providerName:e,index:n}),style:{display:"flex",alignItems:"center",gap:"var(--space-3)",padding:"5px 8px 5px 28px",borderRadius:"var(--radius-control)",cursor:"pointer",width:"100%",border:"none",textAlign:"left",fontFamily:"inherit",background:i?"var(--bg-selected)":"none",marginTop:1},...eg(i),children:[(0,o.jsx)("span",{style:{fontSize:"var(--text-sm)",fontFamily:"var(--font-mono)",color:r.id?"var(--text-muted)":"var(--text-dim)",flex:1,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:r.id||t("modelsConfig.newModel")}),r.reasoning&&(0,o.jsx)("span",{style:{fontSize:9,padding:"1px 4px",background:"var(--accent-subtle)",color:"var(--accent)",borderRadius:3,flexShrink:0},children:"T"})]},n)}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",gap:"var(--space-3)",padding:"6px 8px 4px 10px",marginTop:2,flexWrap:"nowrap"},children:[(0,o.jsxs)("button",{type:"button",onClick:r=>{r.stopPropagation(),em(e)},style:{display:"inline-flex",alignItems:"center",gap:"var(--space-2)",padding:"3px 8px",borderRadius:"var(--radius-control)",cursor:"pointer",color:"var(--text-muted)",border:"1px solid var(--border)",background:"var(--bg-subtle)",fontFamily:"inherit",fontSize:"var(--text-sm)",whiteSpace:"nowrap",flexShrink:0},...ev,children:[(0,o.jsx)(C.A,{size:11,"aria-hidden":"true"}),(0,o.jsx)("span",{children:t("modelsConfig.addModel")})]}),(0,o.jsxs)("button",{type:"button",onClick:r=>{r.stopPropagation(),V(e)},style:{display:"inline-flex",alignItems:"center",gap:"var(--space-2)",padding:"3px 8px",borderRadius:"var(--radius-control)",cursor:"pointer",color:"var(--text-muted)",border:"1px solid var(--border)",background:"var(--bg-subtle)",fontFamily:"inherit",fontSize:"var(--text-sm)",whiteSpace:"nowrap",flexShrink:0},...ev,children:[(0,o.jsx)(S.A,{size:11,"aria-hidden":"true"}),(0,o.jsx)("span",{children:t("modelsConfig.addFromCatalog")})]})]})]},e)})]}),(0,o.jsx)("div",{style:{borderTop:"1px solid var(--border)",padding:"8px 6px"},children:(0,o.jsx)("button",{onClick:()=>G(!0),style:{display:"flex",alignItems:"center",justifyContent:"center",gap:5,width:"100%",padding:"6px 0",background:"none",border:"1px dashed var(--border)",borderRadius:"var(--radius-control)",color:"var(--text-muted)",cursor:"pointer",fontSize:"var(--text-md)"},onMouseEnter:e=>{e.currentTarget.style.borderColor="var(--accent)",e.currentTarget.style.color="var(--accent)"},onMouseLeave:e=>{e.currentTarget.style.borderColor="var(--border)",e.currentTarget.style.color="var(--text-muted)"},children:t("modelsConfig.addProvider")})})]}),(0,o.jsx)("div",{style:{flex:1,overflowY:"auto",padding:20},children:h?(0,o.jsxs)("div",{style:{display:"flex",flexDirection:"column",gap:10},children:[(0,o.jsx)("div",{className:"skeleton",style:{height:18,width:"40%"}}),(0,o.jsx)("div",{className:"skeleton",style:{height:12,width:"70%"}}),(0,o.jsx)("div",{className:"skeleton",style:{height:12,width:"55%"}}),(0,o.jsx)("div",{className:"skeleton",style:{height:90,width:"100%"}})]}):e$??(0,o.jsx)("div",{style:{height:"100%",display:"flex",alignItems:"center",justifyContent:"center",color:"var(--text-dim)",fontSize:"var(--text-base)"},children:t("modelsConfig.selectProviderOrModel")})})]}),(0,o.jsxs)("div",{style:{display:"flex",alignItems:"center",justifyContent:"flex-end",gap:10,padding:"10px 18px",borderTop:"1px solid var(--border)",flexShrink:0},children:[(j||A.length>0)&&(0,o.jsxs)("div",{role:"alert",style:{fontSize:"var(--text-md)",color:"var(--status-error)",flex:1,minWidth:0},children:[j,A.length>0&&(0,o.jsx)("ul",{style:{margin:"4px 0 0",paddingLeft:18},children:A.map((e,r)=>(0,o.jsxs)("li",{children:[e.path?`${e.path}: `:"",e.message]},`${e.path}-${r}`))})]}),(0,o.jsxs)("button",{onClick:eC,disabled:f||M||null!==X,style:{position:"relative",padding:"6px 16px",minWidth:92,background:M?"var(--status-success)":f||X?"var(--bg-panel)":"var(--accent)",border:"none",borderRadius:"var(--radius-control)",color:M?"var(--on-accent)":f||X?"var(--text-muted)":"var(--on-accent)",cursor:f||M||X?"default":"pointer",fontSize:"var(--text-base)",fontWeight:600,display:"inline-flex",alignItems:"center",justifyContent:"center",gap:"var(--space-3)",transition:"background-color var(--dur-med) var(--ease-out-warm), color var(--dur-med) var(--ease-out-warm)",animation:M?"saved-pop var(--dur-theme) var(--ease-out-warm)":void 0},children:[M&&(0,o.jsx)("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round",strokeLinejoin:"round",style:{strokeDasharray:18,animation:"saved-check-draw 0.35s ease forwards",flexShrink:0},children:(0,o.jsx)("polyline",{points:"20 6 9 17 4 12"})}),(0,o.jsx)("span",{children:M?t("modelsConfig.saved"):f?t("modelsConfig.saving"):t("modelsConfig.save")})]})]}),q&&(0,o.jsx)(eT,{oauthProviders:W,apiKeyProviders:N,onSelectOAuth:e=>$({type:"oauth",providerId:e}),onSelectApiKey:e=>$({type:"apikey",providerId:e}),onAddCustom:el,onClose:()=>G(!1)}),null!==Y&&(0,o.jsx)(I,{open:!0,providerName:Y,providerBaseUrl:p.providers?.[Y]?.baseUrl??"",existingIds:new Set((p.providers?.[Y]?.models??[]).map(e=>e.id)),onAdd:(e,r)=>ey(Y,e,r),onClose:()=>V(null)})]})}},90071:(e,r,t)=>{function o(){return globalThis.__ompClientModelStore||(globalThis.__ompClientModelStore={globalGeneration:0,entries:new Map,inFlight:new Map,listeners:new Map}),globalThis.__ompClientModelStore}t.d(r,{aQ:()=>s,dU:()=>a});function n(e,r){r.snapshot={status:r.status,data:r.data,error:r.error,cwd:e,expiresAt:r.expiresAt};let t=o().listeners.get(e);if(t)for(let e of[...t])try{e(r.snapshot)}catch{}return r.snapshot}function i(e,r){let t=e.entries.get(r);if(t)return t;let o={data:null,error:null,status:"idle",expiresAt:null,generation:0,snapshot:{status:"idle",data:null,error:null,cwd:r,expiresAt:null}};return e.entries.set(r,o),o}function a(e){let r=o();if(void 0===e){for(let[e,t]of(r.globalGeneration+=1,r.entries))t.generation+=1,t.data=null,t.error=null,t.status="idle",t.expiresAt=null,n(e,t);r.inFlight.clear();return}let t=e??"",a=i(r,t);a.generation+=1,a.data=null,a.error=null,a.status="idle",a.expiresAt=null,r.inFlight.delete(t),n(t,a)}function s(e,r){let t=e??"";r?.force&&a(t);let s=o(),l=i(s,t),d=Date.now();if(l.data&&null!==l.expiresAt&&l.expiresAt>d&&!r?.force)return Promise.resolve(l.data);let c=s.inFlight.get(t);if(c)return c;let p=l.generation,u=s.globalGeneration;"ready"!==l.status&&(l.status="loading",l.error=null,n(t,l));let x=(async()=>{let e=await fetch(t?`/api/models?cwd=${encodeURIComponent(t)}`:"/api/models",{cache:"no-store"});if(!e.ok)throw Error(`HTTP ${e.status}`);var r=await e.json();if(!r||"object"!=typeof r)throw Error("invalid models response");return{models:r.models&&"object"==typeof r.models?r.models:{},modelList:Array.isArray(r.modelList)?r.modelList:[],defaultModel:r.defaultModel??null,thinkingLevels:r.thinkingLevels&&"object"==typeof r.thinkingLevels?r.thinkingLevels:{},...r.thinkingLevelMaps?{thinkingLevelMaps:r.thinkingLevelMaps}:{},...r.connectedProviders?{connectedProviders:r.connectedProviders}:{},..."string"==typeof r.modelError?{modelError:r.modelError}:{}}})().then(e=>{let r=o(),i=r.entries.get(t);return i&&i.generation===p&&r.globalGeneration===u&&(i.data=e,i.error=null,i.status="ready",i.expiresAt=Date.now()+3e4,n(t,i)),e}).catch(e=>{let r=o(),i=r.entries.get(t);throw i&&i.generation===p&&r.globalGeneration===u&&(i.status="error",i.error=e instanceof Error?e.message:String(e),i.expiresAt=null,n(t,i)),e}).finally(()=>{let e=o();e.inFlight.get(t)===x&&e.inFlight.delete(t)});return s.inFlight.set(t,x),x}}}]);
|