ompgui 0.7.9 → 0.7.12

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.
Files changed (304) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +7 -6
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +5 -5
  5. package/.next/react-loadable-manifest.json +5 -5
  6. package/.next/required-server-files.js +3 -3
  7. package/.next/required-server-files.json +3 -3
  8. package/.next/routes-manifest.json +6 -0
  9. package/.next/server/app/_global-error/page.js +1 -1
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +2 -2
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +2 -2
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +2 -2
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +2 -2
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  23. package/.next/server/app/api/agent/[id]/bash-output/route.js +1 -1
  24. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  25. package/.next/server/app/api/agent/[id]/route.js +1 -1
  26. package/.next/server/app/api/agent/new/route.js +1 -1
  27. package/.next/server/app/api/agent/running/events/route.js +2 -2
  28. package/.next/server/app/api/agents/[name]/route.js +1 -1
  29. package/.next/server/app/api/agents/route.js +1 -1
  30. package/.next/server/app/api/agents/unpack/route.js +1 -1
  31. package/.next/server/app/api/app-update/route.js +1 -1
  32. package/.next/server/app/api/auth/all-providers/route.js +1 -1
  33. package/.next/server/app/api/auth/api-key/[provider]/route.js +1 -1
  34. package/.next/server/app/api/auth/login/[provider]/route.js +2 -2
  35. package/.next/server/app/api/auth/logout/[provider]/route.js +1 -1
  36. package/.next/server/app/api/auth/providers/route.js +1 -1
  37. package/.next/server/app/api/cwd/browse/route.js +1 -1
  38. package/.next/server/app/api/cwd/validate/route.js +1 -1
  39. package/.next/server/app/api/daemon/route.js +1 -1
  40. package/.next/server/app/api/daemon/route.js.nft.json +1 -1
  41. package/.next/server/app/api/default-cwd/route.js +1 -1
  42. package/.next/server/app/api/file-index/route.js +1 -1
  43. package/.next/server/app/api/files/[...path]/route.js +1 -1
  44. package/.next/server/app/api/git/diff/route.js +2 -2
  45. package/.next/server/app/api/git/status/route.js +1 -1
  46. package/.next/server/app/api/home/route.js +1 -1
  47. package/.next/server/app/api/mcp/route.js +2 -2
  48. package/.next/server/app/api/model-roles/route.js +1 -1
  49. package/.next/server/app/api/models/route.js +1 -1
  50. package/.next/server/app/api/models-config/catalog/route.js +1 -1
  51. package/.next/server/app/api/models-config/connectivity/route.js +1 -1
  52. package/.next/server/app/api/models-config/connectivity/route.js.nft.json +1 -1
  53. package/.next/server/app/api/models-config/route.js +1 -1
  54. package/.next/server/app/api/models-config/test/route.js +1 -1
  55. package/.next/server/app/api/omp-settings/route.js +1 -1
  56. package/.next/server/app/api/omp-update/route.js +2 -2
  57. package/.next/server/app/api/omp-version/route.js +1 -1
  58. package/.next/server/app/api/plugins/route.js +1 -1
  59. package/.next/server/app/api/projects/route.js +2 -2
  60. package/.next/server/app/api/providers/enable/route.js +1 -1
  61. package/.next/server/app/api/relay/devices/[id]/route.js +1 -1
  62. package/.next/server/app/api/relay/devices/[id]/route.js.nft.json +1 -1
  63. package/.next/server/app/api/relay/devices/route.js +1 -1
  64. package/.next/server/app/api/relay/devices/route.js.nft.json +1 -1
  65. package/.next/server/app/api/relay/pair/route.js +1 -1
  66. package/.next/server/app/api/relay/pair/route.js.nft.json +1 -1
  67. package/.next/server/app/api/sessions/[id]/archive/route.js +1 -1
  68. package/.next/server/app/api/sessions/[id]/auto-name/route.js +1 -1
  69. package/.next/server/app/api/sessions/[id]/context/route.js +1 -1
  70. package/.next/server/app/api/sessions/[id]/entries/[entryId]/media/route.js +1 -1
  71. package/.next/server/app/api/sessions/[id]/entries/[entryId]/thinking/route.js +1 -1
  72. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  73. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  74. package/.next/server/app/api/sessions/[id]/state/route.js +1 -1
  75. package/.next/server/app/api/sessions/[id]/subagents/[subagentId]/route.js +1 -1
  76. package/.next/server/app/api/sessions/[id]/subagents/route.js +1 -1
  77. package/.next/server/app/api/sessions/archive/route.js +1 -1
  78. package/.next/server/app/api/sessions/import/route.js +1 -1
  79. package/.next/server/app/api/sessions/route.js +1 -1
  80. package/.next/server/app/api/sessions/search/route.js +1 -1
  81. package/.next/server/app/api/skills/check/route.js +1 -1
  82. package/.next/server/app/api/skills/install/route.js +1 -1
  83. package/.next/server/app/api/skills/route.js +1 -1
  84. package/.next/server/app/api/skills/search/route.js +1 -1
  85. package/.next/server/app/api/skills/update/route.js +1 -1
  86. package/.next/server/app/api/usage/route.js +1 -1
  87. package/.next/server/app/api/web-auth/pair/route.js +1 -0
  88. package/.next/server/app/api/web-auth/pair/route.js.nft.json +1 -0
  89. package/.next/server/app/api/web-auth/pair/route_client-reference-manifest.js +1 -0
  90. package/.next/server/app/api/web-auth/session/route.js +1 -1
  91. package/.next/server/app/api/web-auth/session/route.js.nft.json +1 -1
  92. package/.next/server/app/api/worktrees/route.js +1 -1
  93. package/.next/server/app/apple-icon.png/route.js +1 -1
  94. package/.next/server/app/favicon.ico/route.js +1 -1
  95. package/.next/server/app/icon.svg/route.js +1 -1
  96. package/.next/server/app/index.html +1 -1
  97. package/.next/server/app/index.rsc +3 -3
  98. package/.next/server/app/index.segments/__PAGE__.segment.rsc +3 -3
  99. package/.next/server/app/index.segments/_full.segment.rsc +3 -3
  100. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  101. package/.next/server/app/login/page.js +1 -1
  102. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  103. package/.next/server/app/login.html +1 -1
  104. package/.next/server/app/login.rsc +3 -3
  105. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  106. package/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  107. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
  108. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  109. package/.next/server/app/page.js +2 -2
  110. package/.next/server/app/page_client-reference-manifest.js +1 -1
  111. package/.next/server/app/pair/page.js +1 -1
  112. package/.next/server/app/pair/page_client-reference-manifest.js +1 -1
  113. package/.next/server/app/pair.html +1 -1
  114. package/.next/server/app/pair.rsc +3 -3
  115. package/.next/server/app/pair.segments/_full.segment.rsc +3 -3
  116. package/.next/server/app/pair.segments/_tree.segment.rsc +1 -1
  117. package/.next/server/app/pair.segments/pair/__PAGE__.segment.rsc +3 -3
  118. package/.next/server/app/relay/route.js +1 -1
  119. package/.next/server/app-paths-manifest.json +7 -6
  120. package/.next/server/chunks/3100.js +1 -1
  121. package/.next/server/chunks/4008.js +2 -2
  122. package/.next/server/chunks/4395.js +2 -0
  123. package/.next/server/chunks/474.js +1 -1
  124. package/.next/server/chunks/4980.js +1 -1
  125. package/.next/server/chunks/6337.js +1 -1
  126. package/.next/server/chunks/7077.js +1 -1
  127. package/.next/server/chunks/8015.js +13 -13
  128. package/.next/server/chunks/8501.js +1 -1
  129. package/.next/server/chunks/933.js +1 -1
  130. package/.next/server/chunks/9848.js +1 -1
  131. package/.next/server/functions-config-manifest.json +2 -2
  132. package/.next/server/instrumentation.js +1 -1
  133. package/.next/server/middleware-build-manifest.js +1 -1
  134. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  135. package/.next/server/middleware.js +6 -5
  136. package/.next/server/pages/404.html +1 -1
  137. package/.next/server/pages/500.html +1 -1
  138. package/.next/server/server-reference-manifest.json +1 -1
  139. package/.next/static/chunks/3274.f8f023fd73e607bc.js +2 -0
  140. package/.next/static/chunks/3944.2debfbacfd5e255f.js +1 -0
  141. package/.next/static/chunks/4315-ea1c0b248e80933c.js +1 -0
  142. package/.next/static/chunks/4996.c5525823b73ac947.js +1 -0
  143. package/.next/static/chunks/{6268.294dd515c545712d.js → 6268.be519bbc5c4347fe.js} +3 -3
  144. package/.next/static/chunks/{9668.a6deba4ff5761bbb.js → 9668.6c511d3f22a0d3ad.js} +1 -1
  145. package/.next/static/chunks/app/_global-error/page-ef9cf0833e5e0b87.js +1 -0
  146. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-ef9cf0833e5e0b87.js +1 -0
  147. package/.next/static/chunks/app/api/agent/[id]/events/route-ef9cf0833e5e0b87.js +1 -0
  148. package/.next/static/chunks/app/api/agent/[id]/route-ef9cf0833e5e0b87.js +1 -0
  149. package/.next/static/chunks/app/api/agent/new/route-ef9cf0833e5e0b87.js +1 -0
  150. package/.next/static/chunks/app/api/agent/running/events/route-ef9cf0833e5e0b87.js +1 -0
  151. package/.next/static/chunks/app/api/agents/[name]/route-ef9cf0833e5e0b87.js +1 -0
  152. package/.next/static/chunks/app/api/agents/route-ef9cf0833e5e0b87.js +1 -0
  153. package/.next/static/chunks/app/api/agents/unpack/route-ef9cf0833e5e0b87.js +1 -0
  154. package/.next/static/chunks/app/api/app-update/route-ef9cf0833e5e0b87.js +1 -0
  155. package/.next/static/chunks/app/api/auth/all-providers/route-ef9cf0833e5e0b87.js +1 -0
  156. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-ef9cf0833e5e0b87.js +1 -0
  157. package/.next/static/chunks/app/api/auth/login/[provider]/route-ef9cf0833e5e0b87.js +1 -0
  158. package/.next/static/chunks/app/api/auth/logout/[provider]/route-ef9cf0833e5e0b87.js +1 -0
  159. package/.next/static/chunks/app/api/auth/providers/route-ef9cf0833e5e0b87.js +1 -0
  160. package/.next/static/chunks/app/api/cwd/browse/route-ef9cf0833e5e0b87.js +1 -0
  161. package/.next/static/chunks/app/api/cwd/validate/route-ef9cf0833e5e0b87.js +1 -0
  162. package/.next/static/chunks/app/api/daemon/route-ef9cf0833e5e0b87.js +1 -0
  163. package/.next/static/chunks/app/api/default-cwd/route-ef9cf0833e5e0b87.js +1 -0
  164. package/.next/static/chunks/app/api/file-index/route-ef9cf0833e5e0b87.js +1 -0
  165. package/.next/static/chunks/app/api/files/[...path]/route-ef9cf0833e5e0b87.js +1 -0
  166. package/.next/static/chunks/app/api/git/diff/route-ef9cf0833e5e0b87.js +1 -0
  167. package/.next/static/chunks/app/api/git/status/route-ef9cf0833e5e0b87.js +1 -0
  168. package/.next/static/chunks/app/api/home/route-ef9cf0833e5e0b87.js +1 -0
  169. package/.next/static/chunks/app/api/mcp/route-ef9cf0833e5e0b87.js +1 -0
  170. package/.next/static/chunks/app/api/model-roles/route-ef9cf0833e5e0b87.js +1 -0
  171. package/.next/static/chunks/app/api/models/route-ef9cf0833e5e0b87.js +1 -0
  172. package/.next/static/chunks/app/api/models-config/catalog/route-ef9cf0833e5e0b87.js +1 -0
  173. package/.next/static/chunks/app/api/models-config/connectivity/route-ef9cf0833e5e0b87.js +1 -0
  174. package/.next/static/chunks/app/api/models-config/route-ef9cf0833e5e0b87.js +1 -0
  175. package/.next/static/chunks/app/api/models-config/test/route-ef9cf0833e5e0b87.js +1 -0
  176. package/.next/static/chunks/app/api/omp-settings/route-ef9cf0833e5e0b87.js +1 -0
  177. package/.next/static/chunks/app/api/omp-update/route-ef9cf0833e5e0b87.js +1 -0
  178. package/.next/static/chunks/app/api/omp-version/route-ef9cf0833e5e0b87.js +1 -0
  179. package/.next/static/chunks/app/api/plugins/route-ef9cf0833e5e0b87.js +1 -0
  180. package/.next/static/chunks/app/api/projects/route-ef9cf0833e5e0b87.js +1 -0
  181. package/.next/static/chunks/app/api/providers/enable/route-ef9cf0833e5e0b87.js +1 -0
  182. package/.next/static/chunks/app/api/relay/devices/[id]/route-ef9cf0833e5e0b87.js +1 -0
  183. package/.next/static/chunks/app/api/relay/devices/route-ef9cf0833e5e0b87.js +1 -0
  184. package/.next/static/chunks/app/api/relay/pair/route-ef9cf0833e5e0b87.js +1 -0
  185. package/.next/static/chunks/app/api/sessions/[id]/archive/route-ef9cf0833e5e0b87.js +1 -0
  186. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-ef9cf0833e5e0b87.js +1 -0
  187. package/.next/static/chunks/app/api/sessions/[id]/context/route-ef9cf0833e5e0b87.js +1 -0
  188. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/media/route-ef9cf0833e5e0b87.js +1 -0
  189. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-ef9cf0833e5e0b87.js +1 -0
  190. package/.next/static/chunks/app/api/sessions/[id]/export/route-ef9cf0833e5e0b87.js +1 -0
  191. package/.next/static/chunks/app/api/sessions/[id]/route-ef9cf0833e5e0b87.js +1 -0
  192. package/.next/static/chunks/app/api/sessions/[id]/state/route-ef9cf0833e5e0b87.js +1 -0
  193. package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-ef9cf0833e5e0b87.js +1 -0
  194. package/.next/static/chunks/app/api/sessions/[id]/subagents/route-ef9cf0833e5e0b87.js +1 -0
  195. package/.next/static/chunks/app/api/sessions/archive/route-ef9cf0833e5e0b87.js +1 -0
  196. package/.next/static/chunks/app/api/sessions/import/route-ef9cf0833e5e0b87.js +1 -0
  197. package/.next/static/chunks/app/api/sessions/route-ef9cf0833e5e0b87.js +1 -0
  198. package/.next/static/chunks/app/api/sessions/search/route-ef9cf0833e5e0b87.js +1 -0
  199. package/.next/static/chunks/app/api/skills/check/route-ef9cf0833e5e0b87.js +1 -0
  200. package/.next/static/chunks/app/api/skills/install/route-ef9cf0833e5e0b87.js +1 -0
  201. package/.next/static/chunks/app/api/skills/route-ef9cf0833e5e0b87.js +1 -0
  202. package/.next/static/chunks/app/api/skills/search/route-ef9cf0833e5e0b87.js +1 -0
  203. package/.next/static/chunks/app/api/skills/update/route-ef9cf0833e5e0b87.js +1 -0
  204. package/.next/static/chunks/app/api/usage/route-ef9cf0833e5e0b87.js +1 -0
  205. package/.next/static/chunks/app/api/web-auth/pair/route-ef9cf0833e5e0b87.js +1 -0
  206. package/.next/static/chunks/app/api/web-auth/session/route-ef9cf0833e5e0b87.js +1 -0
  207. package/.next/static/chunks/app/api/worktrees/route-ef9cf0833e5e0b87.js +1 -0
  208. package/.next/static/chunks/app/login/page-7bf6a8dff8d8ec8a.js +1 -0
  209. package/.next/static/chunks/app/manifest.webmanifest/route-ef9cf0833e5e0b87.js +1 -0
  210. package/.next/static/chunks/app/{page-305a0dd341ec102d.js → page-8ddabaf903ef7161.js} +1 -1
  211. package/.next/static/chunks/app/pair/page-b038d0301aa512a0.js +1 -0
  212. package/.next/static/chunks/app/relay/route-ef9cf0833e5e0b87.js +1 -0
  213. package/.next/static/chunks/{main-354b27ede3eb835a.js → main-07954eb1fcf84ef7.js} +1 -1
  214. package/.next/static/chunks/next/dist/client/components/builtin/app-error-ef9cf0833e5e0b87.js +1 -0
  215. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-ef9cf0833e5e0b87.js +1 -0
  216. package/.next/static/chunks/next/dist/client/components/builtin/not-found-ef9cf0833e5e0b87.js +1 -0
  217. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-ef9cf0833e5e0b87.js +1 -0
  218. package/.next/static/chunks/{webpack-76f14942c1d852d7.js → webpack-6bfb3928a1f4ac15.js} +1 -1
  219. package/.next/static/u7dbGv9ZBD6miViUAEmi7/_buildManifest.js +1 -0
  220. package/README.ja.md +14 -13
  221. package/README.ko.md +14 -13
  222. package/README.md +14 -13
  223. package/README.zh-CN.md +14 -13
  224. package/bin/ompgui-options.js +2 -2
  225. package/bin/ompgui-pair.js +1 -0
  226. package/next.config.ts +3 -0
  227. package/package.json +1 -1
  228. package/.next/server/chunks/9145.js +0 -2
  229. package/.next/static/SAMSH7hMTmFI9vfMyiguw/_buildManifest.js +0 -1
  230. package/.next/static/chunks/3274.52c14cafa7f8a3ef.js +0 -2
  231. package/.next/static/chunks/3944.6215b78f025077b3.js +0 -1
  232. package/.next/static/chunks/4315-8575b9eecf54f2bb.js +0 -1
  233. package/.next/static/chunks/4996.5e04c050b0523d42.js +0 -1
  234. package/.next/static/chunks/app/_global-error/page-08a33f204a956c10.js +0 -1
  235. package/.next/static/chunks/app/api/agent/[id]/bash-output/route-08a33f204a956c10.js +0 -1
  236. package/.next/static/chunks/app/api/agent/[id]/events/route-08a33f204a956c10.js +0 -1
  237. package/.next/static/chunks/app/api/agent/[id]/route-08a33f204a956c10.js +0 -1
  238. package/.next/static/chunks/app/api/agent/new/route-08a33f204a956c10.js +0 -1
  239. package/.next/static/chunks/app/api/agent/running/events/route-08a33f204a956c10.js +0 -1
  240. package/.next/static/chunks/app/api/agents/[name]/route-08a33f204a956c10.js +0 -1
  241. package/.next/static/chunks/app/api/agents/route-08a33f204a956c10.js +0 -1
  242. package/.next/static/chunks/app/api/agents/unpack/route-08a33f204a956c10.js +0 -1
  243. package/.next/static/chunks/app/api/app-update/route-08a33f204a956c10.js +0 -1
  244. package/.next/static/chunks/app/api/auth/all-providers/route-08a33f204a956c10.js +0 -1
  245. package/.next/static/chunks/app/api/auth/api-key/[provider]/route-08a33f204a956c10.js +0 -1
  246. package/.next/static/chunks/app/api/auth/login/[provider]/route-08a33f204a956c10.js +0 -1
  247. package/.next/static/chunks/app/api/auth/logout/[provider]/route-08a33f204a956c10.js +0 -1
  248. package/.next/static/chunks/app/api/auth/providers/route-08a33f204a956c10.js +0 -1
  249. package/.next/static/chunks/app/api/cwd/browse/route-08a33f204a956c10.js +0 -1
  250. package/.next/static/chunks/app/api/cwd/validate/route-08a33f204a956c10.js +0 -1
  251. package/.next/static/chunks/app/api/daemon/route-08a33f204a956c10.js +0 -1
  252. package/.next/static/chunks/app/api/default-cwd/route-08a33f204a956c10.js +0 -1
  253. package/.next/static/chunks/app/api/file-index/route-08a33f204a956c10.js +0 -1
  254. package/.next/static/chunks/app/api/files/[...path]/route-08a33f204a956c10.js +0 -1
  255. package/.next/static/chunks/app/api/git/diff/route-08a33f204a956c10.js +0 -1
  256. package/.next/static/chunks/app/api/git/status/route-08a33f204a956c10.js +0 -1
  257. package/.next/static/chunks/app/api/home/route-08a33f204a956c10.js +0 -1
  258. package/.next/static/chunks/app/api/mcp/route-08a33f204a956c10.js +0 -1
  259. package/.next/static/chunks/app/api/model-roles/route-08a33f204a956c10.js +0 -1
  260. package/.next/static/chunks/app/api/models/route-08a33f204a956c10.js +0 -1
  261. package/.next/static/chunks/app/api/models-config/catalog/route-08a33f204a956c10.js +0 -1
  262. package/.next/static/chunks/app/api/models-config/connectivity/route-08a33f204a956c10.js +0 -1
  263. package/.next/static/chunks/app/api/models-config/route-08a33f204a956c10.js +0 -1
  264. package/.next/static/chunks/app/api/models-config/test/route-08a33f204a956c10.js +0 -1
  265. package/.next/static/chunks/app/api/omp-settings/route-08a33f204a956c10.js +0 -1
  266. package/.next/static/chunks/app/api/omp-update/route-08a33f204a956c10.js +0 -1
  267. package/.next/static/chunks/app/api/omp-version/route-08a33f204a956c10.js +0 -1
  268. package/.next/static/chunks/app/api/plugins/route-08a33f204a956c10.js +0 -1
  269. package/.next/static/chunks/app/api/projects/route-08a33f204a956c10.js +0 -1
  270. package/.next/static/chunks/app/api/providers/enable/route-08a33f204a956c10.js +0 -1
  271. package/.next/static/chunks/app/api/relay/devices/[id]/route-08a33f204a956c10.js +0 -1
  272. package/.next/static/chunks/app/api/relay/devices/route-08a33f204a956c10.js +0 -1
  273. package/.next/static/chunks/app/api/relay/pair/route-08a33f204a956c10.js +0 -1
  274. package/.next/static/chunks/app/api/sessions/[id]/archive/route-08a33f204a956c10.js +0 -1
  275. package/.next/static/chunks/app/api/sessions/[id]/auto-name/route-08a33f204a956c10.js +0 -1
  276. package/.next/static/chunks/app/api/sessions/[id]/context/route-08a33f204a956c10.js +0 -1
  277. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/media/route-08a33f204a956c10.js +0 -1
  278. package/.next/static/chunks/app/api/sessions/[id]/entries/[entryId]/thinking/route-08a33f204a956c10.js +0 -1
  279. package/.next/static/chunks/app/api/sessions/[id]/export/route-08a33f204a956c10.js +0 -1
  280. package/.next/static/chunks/app/api/sessions/[id]/route-08a33f204a956c10.js +0 -1
  281. package/.next/static/chunks/app/api/sessions/[id]/state/route-08a33f204a956c10.js +0 -1
  282. package/.next/static/chunks/app/api/sessions/[id]/subagents/[subagentId]/route-08a33f204a956c10.js +0 -1
  283. package/.next/static/chunks/app/api/sessions/[id]/subagents/route-08a33f204a956c10.js +0 -1
  284. package/.next/static/chunks/app/api/sessions/archive/route-08a33f204a956c10.js +0 -1
  285. package/.next/static/chunks/app/api/sessions/import/route-08a33f204a956c10.js +0 -1
  286. package/.next/static/chunks/app/api/sessions/route-08a33f204a956c10.js +0 -1
  287. package/.next/static/chunks/app/api/sessions/search/route-08a33f204a956c10.js +0 -1
  288. package/.next/static/chunks/app/api/skills/check/route-08a33f204a956c10.js +0 -1
  289. package/.next/static/chunks/app/api/skills/install/route-08a33f204a956c10.js +0 -1
  290. package/.next/static/chunks/app/api/skills/route-08a33f204a956c10.js +0 -1
  291. package/.next/static/chunks/app/api/skills/search/route-08a33f204a956c10.js +0 -1
  292. package/.next/static/chunks/app/api/skills/update/route-08a33f204a956c10.js +0 -1
  293. package/.next/static/chunks/app/api/usage/route-08a33f204a956c10.js +0 -1
  294. package/.next/static/chunks/app/api/web-auth/session/route-08a33f204a956c10.js +0 -1
  295. package/.next/static/chunks/app/api/worktrees/route-08a33f204a956c10.js +0 -1
  296. package/.next/static/chunks/app/login/page-a54174ed920300f7.js +0 -1
  297. package/.next/static/chunks/app/manifest.webmanifest/route-08a33f204a956c10.js +0 -1
  298. package/.next/static/chunks/app/pair/page-d72423ffc5654e29.js +0 -1
  299. package/.next/static/chunks/app/relay/route-08a33f204a956c10.js +0 -1
  300. package/.next/static/chunks/next/dist/client/components/builtin/app-error-08a33f204a956c10.js +0 -1
  301. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-08a33f204a956c10.js +0 -1
  302. package/.next/static/chunks/next/dist/client/components/builtin/not-found-08a33f204a956c10.js +0 -1
  303. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-08a33f204a956c10.js +0 -1
  304. /package/.next/static/{SAMSH7hMTmFI9vfMyiguw → u7dbGv9ZBD6miViUAEmi7}/_ssgManifest.js +0 -0
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.8](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.8/ompgui-remote-v0.7.8.apk) · [发行说明](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.8)
5
+ > **Android APK(Android 12+)** — 使用 Kotlin 配套应用连接远程 ompgui 服务器,并查看最新会话的只读离线快照。[下载 ompgui Remote v0.7.12](https://github.com/dbc-hbin/ompgui/releases/download/v0.7.12/ompgui-remote-v0.7.12.apk) · [发行说明](https://github.com/dbc-hbin/ompgui/releases/tag/v0.7.12)
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
- > 此客户端不会替代已发布的 v0.7.2 APK,也不会添加托管式/E2E 中继。构建时使用 JDK 21,先在仓库根目录运行 `npm install`,再在 `android/` 中运行 `./gradlew :app:assembleDebug`;离线资源从已安装的 npm 依赖生成。输出文件为 `android/app/build/outputs/apk/debug/app-debug.apk`。服务器禁用的更新、退出登录以及已存储 API 密钥的修改操作仍不可用。
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
 
@@ -53,7 +53,7 @@ ompgui --hostname 0.0.0.0 # 在可信网络中暴露服务
53
53
  ompgui -p 8080 -H 0.0.0.0 # 组合使用
54
54
  ompgui --no-open # 不自动打开浏览器
55
55
 
56
- ompgui --password "a-long-random-password" # 启用仅密码登录(Windows 同样适用)
56
+ ompgui --password "a-long-random-password" # 本地登录及设备注册时的额外验证
57
57
 
58
58
  PORT=8080 ompgui # 也支持环境变量
59
59
  OMP_WEB_HOSTNAME=0.0.0.0 ompgui # 显式暴露到网络
@@ -62,7 +62,7 @@ OMP_WEB_PASSWORD='a-long-random-password' ompgui # 环境变量形式(POSIX)
62
62
  OMP_WEB_NO_OPEN=1 ompgui # 作为后台服务运行时很有用
63
63
  ```
64
64
 
65
- 设置 `OMP_WEB_PASSWORD` 可通过与主题集成的仅密码登录页面保护界面和所有 API 端点。登录成功后,会创建有效期为 30 天的 HTTP-only 签名会话 Cookie;留空则关闭认证。远程访问仍需通过受信任反向代理或 VPN 提供 HTTPS,以保护密码和会话 Cookie。默认仅监听 `127.0.0.1`;不要将 ompgui 直接暴露到互联网。
65
+ `OMP_WEB_PASSWORD` 或 `--password` 用于保护直接 localhost 访问,并在设备注册时额外验证密码。本地会话有效期为 30 天,修改密码会使其失效。无论是否设置密码,远程 Web 访问都必须使用已注册设备;仅凭密码或旧密码会话 Cookie 无法访问。远程连接请使用 HTTPS。
66
66
 
67
67
  ### macOS 后台服务
68
68
 
@@ -93,9 +93,9 @@ macOS 浏览器 GUI 的 **Settings → System & Updates → Background service**
93
93
 
94
94
  从移动设备(iPhone、iPad、Android)或外部笔记本访问 `ompgui` 时,**强烈推荐使用 [Tailscale](https://tailscale.com/) 虚拟专用网(VPN)**。它通过端到端加密的点对点 Mesh 网络连接设备,无需端口转发或暴露公网 IP。
95
95
 
96
- ### 1. 配置访问密码(远程访问必备)
96
+ ### 1. 配置设备注册的额外密码
97
97
 
98
- 当绑定到外部网络接口时,必须配置密码以保护工作区:
98
+ CLI 在绑定外部接口时要求密码。通过 Tailscale Serve/Funnel 访问时请保留默认回环绑定;密码仅是注册时的额外验证,不能替代设备注册:
99
99
 
100
100
  ```bash
101
101
  # CLI 选项:绑定到所有网络接口并设置密码
@@ -110,16 +110,17 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
110
110
  1. **安装 Tailscale**:在宿主电脑和移动设备上安装 [Tailscale](https://tailscale.com/download) 并登录同一账户。
111
111
  2. **在宿主电脑上启动 ompgui**:
112
112
  ```bash
113
- ompgui --hostname 0.0.0.0 --password "your-strong-password"
113
+ ompgui --password "your-strong-password"
114
114
  ```
115
115
  3. **在移动端浏览器中访问**:
116
- - 访问宿主电脑的 Tailscale IP(如 `100.x.y.z`)或 MagicDNS 机器名:
116
+ - 使用已连接到 ompgui 的 HTTPS Serve/Funnel 地址:
117
117
  ```text
118
- http://100.x.y.z:30177
119
- # 或启用 MagicDNS 时
120
- http://my-macbook:30177
118
+ https://host.ts.net:8443
121
119
  ```
122
- 4. **登录**:输入设置的密码即可在移动设备上安全地与编程智能体进行实时交互与操作。
120
+ 4. **注册浏览器**:在宿主电脑的 Settings → Connect Devices 创建链接,或运行 `ompgui pair --url wss://host.ts.net:8443/relay` 并指定实际 ompgui HTTPS/Funnel 地址。在远程浏览器打开输出的 **Browser** 链接,若设置了密码则输入,然后选择配对浏览器。直接 tailnet 访问也应先配置 HTTPS。浏览器与手机链接共享同一个十分钟一次性注册请求,只能由其中一个使用;为下一台设备重新生成链接。
121
+ 5. **撤销访问**:使用 `ompgui devices`、`ompgui devices revoke <id>` 或 Settings → Connect Devices。它们与 Android APK 共享设备列表和撤销逻辑;撤销会关闭活动 Web 流及中继连接,并拒绝后续请求。
122
+
123
+ 反向代理必须保留外部 Host 和 forwarding/Funnel 头。删除这些头并把 Host 改为 localhost,会使远程请求无法与直接本地请求区分。浏览器复用 APK 中继认证及 `~/.omp/agent/ompgui-relay.json`,持有有效期为 30 天、仅限当前主机的 HttpOnly 设备 Cookie;服务器只保存令牌哈希。这是凭据注册而非物理设备证明:复制令牌或 Cookie 即可在撤销前获得相同权限。
123
124
 
124
125
  ## 功能特性
125
126
 
@@ -142,7 +143,7 @@ OMP_WEB_HOSTNAME=0.0.0.0 OMP_WEB_PASSWORD="your-strong-password" ompgui
142
143
  | --- | --- |
143
144
  | `PORT` | 服务器端口(默认 `30177`;`-p/--port` 优先) |
144
145
  | `OMP_WEB_HOSTNAME` | 绑定主机名(默认 `127.0.0.1`;`-H/--hostname` 优先) |
145
- | `OMP_WEB_PASSWORD` | 登录页面使用的可选密码 |
146
+ | `OMP_WEB_PASSWORD` | 本地登录及设备注册时的额外验证密码;远程仍需已注册设备 |
146
147
  | `OMP_WEB_NO_OPEN` | 设为 `1`/`true` 可跳过自动打开浏览器 |
147
148
  | `OMP_WEB_OMP_BIN` | `omp` 不在 `PATH` 中时,指向其二进制文件的绝对路径 |
148
149
  | `PI_CODING_AGENT_DIR` | 指向其他 omp agent 目录(默认 `~/.omp/agent`) |
@@ -28,8 +28,8 @@ Commands:
28
28
  service enable | disable Toggle login auto-start without stopping or removing config
29
29
  service uninstall Stop service and remove its configuration
30
30
  update Update ompgui to the latest version
31
- pair Create a one-time phone pairing link
32
- devices List or revoke paired phone devices`);
31
+ pair Create one-time phone and browser pairing links
32
+ devices List or revoke paired devices`);
33
33
  }
34
34
  function parseLaunchOptions(args = process.argv.slice(2), env = process.env) {
35
35
  const { values: cliArgs, positionals } = parseArgs({ args, options: { port:{type:"string",short:"p"}, hostname:{type:"string",short:"H"}, password:{type:"string"}, help:{type:"boolean",short:"h"}, version:{type:"boolean"}, "no-open":{type:"boolean"}, url:{type:"string"}, json:{type:"boolean"}, defer:{type:"boolean"} }, strict:false, allowPositionals:true });
@@ -65,6 +65,7 @@ async function runPair(options) {
65
65
  body: JSON.stringify(body),
66
66
  });
67
67
  console.log(offer.uri);
68
+ console.log("Browser: " + offer.browserUrl);
68
69
  console.log(`Relay: ${offer.relayUrl}`);
69
70
  console.log(`Expires: ${new Date(offer.expiresAt).toISOString()}`);
70
71
  if (openBrowser) openPairPage(`${base}/pair`);
package/next.config.ts CHANGED
@@ -36,6 +36,9 @@ const nextConfig = (phase: string): NextConfig => {
36
36
  return config;
37
37
  },
38
38
  allowedDevOrigins: ["127.0.0.1", "192.168.*.*"],
39
+ // Keep dev RSC data self-contained: unregistered browsers cannot open HMR
40
+ // sockets, so a separate React debug stream would block login hydration.
41
+ experimental: { reactDebugChannel: false },
39
42
  // Security: stop advertising the runtime, and surface dev-mode problems
40
43
  // earlier. Source maps in the browser bundle leak server path layout and
41
44
  // bloat downloads without helping end users of a published app.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ompgui",
3
- "version": "0.7.9",
3
+ "version": "0.7.12",
4
4
  "description": "Web UI & Browser GUI for the oh-my-pi (omp) coding agent",
5
5
  "homepage": "https://github.com/dbc-hbin/ompgui#readme",
6
6
  "repository": {
@@ -1,2 +0,0 @@
1
- exports.id=9145,exports.ids=[9145],exports.modules={20565:(a,b,c)=>{"use strict";function d(a){return"object"==typeof a&&null!==a&&!Array.isArray(a)}function e(a){return"string"==typeof a?a:void 0}function f(a){return"number"==typeof a&&Number.isFinite(a)?a:void 0}c.d(b,{i:()=>f,oJ:()=>e,u4:()=>d})},49621:(a,b,c)=>{"use strict";c.d(b,{f4:()=>i,xR:()=>q,mx:()=>t,Rm:()=>r,AY:()=>s});var d=c(77598),e=c(73024),f=c(76760),g=c(85887),h=c(20565);c(78970);let i=6e5;function j(a,b=16){return`${a}${(0,d.randomBytes)(b).toString("base64url")}`}function k(){return(0,f.resolve)((0,g.$M)(),"ompgui-relay.json")}function l(){return{version:1,serverId:j("s_"),devices:[],pairing:null}}function m(a){let b=k(),c=`${b}.lock`;(0,e.mkdirSync)((0,f.dirname)(c),{recursive:!0});let d=Date.now()+3e3;for(;;){let b=null;try{b=(0,e.openSync)(c,"wx")}catch(a){if("EEXIST"!==a.code)throw a;try{if(Date.now()-(0,e.statSync)(c).mtimeMs>1e4){(0,e.unlinkSync)(c);continue}}catch{continue}if(Date.now()>=d)throw Error("Timed out waiting for the ompgui relay device registry lock");!function(){let a=new SharedArrayBuffer(4);Atomics.wait(new Int32Array(a),0,0,25)}();continue}try{(0,e.writeSync)(b,String(process.pid))}finally{(0,e.closeSync)(b)}try{return a()}finally{try{(0,e.unlinkSync)(c)}catch{}}}}function n(){let a=k();if(!(0,e.existsSync)(a)){let a=l();return o(a),a}try{return function(a){try{let b=JSON.parse(a);if(!(0,h.u4)(b)||1!==b.version)return l();let c="string"==typeof b.serverId&&/^[A-Za-z0-9_-]{16,64}$/.test(b.serverId)?b.serverId:j("s_"),d=[];if(Array.isArray(b.devices))for(let a of b.devices)(0,h.u4)(a)&&"string"==typeof a.id&&a.id.startsWith("d_")&&"string"==typeof a.tokenHash&&64===a.tokenHash.length&&d.push({id:a.id,label:(("string"==typeof a.label?a.label:"")??"").replace(/[\u0000-\u001f\u007f]/g,"").trim().slice(0,64),tokenHash:a.tokenHash,createdAt:"string"==typeof a.createdAt?a.createdAt:new Date(0).toISOString(),lastSeenAt:"string"==typeof a.lastSeenAt?a.lastSeenAt:new Date(0).toISOString()});let e=null;if((0,h.u4)(b.pairing)){let a="string"==typeof b.pairing.secretHash?b.pairing.secretHash:"",c="number"==typeof b.pairing.expiresAt?b.pairing.expiresAt:0,d="string"==typeof b.pairing.relayUrl?b.pairing.relayUrl:"",f="string"==typeof b.pairing.createdAt?b.pairing.createdAt:new Date(0).toISOString();64===a.length&&c>0&&d&&(e={secretHash:a,expiresAt:c,relayUrl:d,createdAt:f})}let f="string"==typeof b.relayUrl?b.relayUrl:void 0;return{version:1,serverId:c,...f?{relayUrl:f}:{},devices:d,pairing:e}}catch{return l()}}((0,e.readFileSync)(a,"utf8"))}catch{return l()}}function o(a){let b=k();(0,e.mkdirSync)((0,f.dirname)(b),{recursive:!0});let c=`${b}.tmp-${process.pid}-${Date.now()}`;try{(0,e.writeFileSync)(c,`${JSON.stringify(a,null,2)}
2
- `,"utf8"),(0,e.renameSync)(c,b)}catch(a){try{(0,e.existsSync)(c)&&(0,e.unlinkSync)(c)}catch{}throw a}}function p(){return m(()=>n())}function q(a){let b=a.now??Date.now(),c=a.ttlMs??i,e=(0,d.randomBytes)(32).toString("base64url");return m(()=>{let f=n();return f.relayUrl=a.relayUrl,f.pairing={secretHash:(0,d.createHash)("sha256").update(e,"utf8").digest("hex"),expiresAt:b+c,relayUrl:a.relayUrl,createdAt:new Date(b).toISOString()},o(f),{secret:e,serverId:f.serverId,expiresAt:f.pairing.expiresAt,relayUrl:a.relayUrl}})}function r(){return p().devices.map(({id:a,label:b,createdAt:c,lastSeenAt:d})=>({id:a,label:b,createdAt:c,lastSeenAt:d}))}function s(a){return m(()=>{let b=n(),c=b.devices.filter(b=>b.id!==a);return c.length!==b.devices.length&&(b.devices=c,o(b),!0)})}function t(a=Date.now()){let b=p(),c=b.pairing&&b.pairing.expiresAt>a?b.pairing:null;return{serverId:b.serverId,...b.relayUrl?{relayUrl:b.relayUrl}:{},pairingExpiresAt:c?.expiresAt??null,deviceCount:b.devices.length}}},78335:()=>{},78970:(a,b,c)=>{"use strict";function d(a){if(!a||a.length%4!=0)return null;let b=a.endsWith("==")?2:+!!a.endsWith("="),c=a.length-b;for(let b=0;b<c;b+=1){var d;if(!((d=a.charCodeAt(b))>=65&&d<=90||d>=97&&d<=122||d>=48&&d<=57||43===d||47===d))return null}for(let b=c;b<a.length;b+=1)if("="!==a[b])return null;return a.length/4*3-b}function e(a){if(void 0===a)return null;if(!Array.isArray(a))return"images must be an array";if(a.length>10)return"A message can include at most 10 images";for(let b of a){if(!b||"object"!=typeof b||"image"!==b.type)return"Each attachment must be an image";if(!function(a){if(!a||"object"!=typeof a||"string"!=typeof a.data||"string"!=typeof a.mimeType||!a.mimeType.startsWith("image/"))return!1;let b=d(a.data);return null!==b&&b<=0xa00000}(b))return"Each image must be valid base64 image data of 10MB or smaller"}return null}function f(a){if("object"!=typeof a||null===a||Array.isArray(a))return null;let b=a.source;if("object"==typeof b&&null!==b&&!Array.isArray(b)&&"base64"===b.type&&"string"==typeof b.data){let a="string"==typeof b.media_type?b.media_type:"";return a.toLowerCase().startsWith("image/")?{type:"image",data:b.data,mimeType:a}:null}return"string"==typeof a.data&&"string"==typeof a.mimeType?a.mimeType.toLowerCase().startsWith("image/")?{type:"image",data:a.data,mimeType:a.mimeType}:null:null}c.d(b,{K8:()=>j,Si:()=>d,gy:()=>i,kc:()=>e,x:()=>h,zJ:()=>g});class g extends Error{constructor(a){super("count"===a?"Tool result images exceed the limit of 10 images":"per_image"===a?"Tool result image exceeds the per-image limit of 10MB":"Tool result images exceed the total limit of 25MB"),this.code="tool_result_images_too_large",this.name="ToolResultImagesTooLargeError",this.reason=a}}function h(a){return d(a)??Math.floor(3*a.length/4)}function i(a){if(a.length>10)throw new g("count");for(let b of a)if(b>0xa00000)throw new g("per_image");let b=0;for(let c of a)b+=c;if(b>0x1900000)throw new g("total")}function j(a){let b=new Set,c=[],d=a=>{if(!a||"string"!=typeof a.data||"string"!=typeof a.mimeType)return;let d=`${a.mimeType}\0${a.data}`;b.has(d)||(b.add(d),c.push(a))};try{if(a&&"object"==typeof a&&Array.isArray(a.content))for(let b of a.content)"object"!=typeof b||null===b||Array.isArray(b)||"image"===b.type&&d(f(b));let b=a&&"object"==typeof a?a.details:void 0;if("object"==typeof b&&null!==b&&!Array.isArray(b)){let a=b.images;if(Array.isArray(a))for(let b of a)d(f(b))}}catch{}return c}},85887:(a,b,c)=>{"use strict";c.d(b,{$M:()=>l,OK:()=>r,_8:()=>u,ny:()=>o,oy:()=>j,pA:()=>q,tE:()=>n,yG:()=>p});var d=c(29021),e=c(21820),f=c(33873);let g=/^[a-z0-9][a-z0-9._-]{0,63}$/,h=/^(?:CON|PRN|AUX|NUL|COM[0-9]|LPT[0-9])(?:\..*)?$/i;function i(a){let b=a?.trim();if(b&&"default"!==b){if("."===b||".."===b||b.endsWith(".")||!g.test(b)||h.test(b))throw Error(`Invalid OMP profile "${a}". Profile names must match ${g.source}, cannot be "." or "..", cannot end with ".", and cannot be a Windows reserved device name (CON, PRN, AUX, NUL, COM0-9, LPT0-9, or any of those with an extension).`);return b}}function j(){return void 0!==process.env.OMP_PROFILE?i(process.env.OMP_PROFILE):i(process.env.PI_PROFILE)}function k(){let a=f.join((0,e.homedir)(),process.env.PI_CONFIG_DIR||".omp"),b=j();return b?f.join(a,"profiles",b):a}function l(){let a=j(),b=process.env.PI_CODING_AGENT_DIR;return b&&!a?f.resolve(b):f.join(k(),"agent")}function m(a){let b=function(){let a,b;if("linux"!==process.platform&&"darwin"!==process.platform||(a=j(),(b=process.env.PI_CODING_AGENT_DIR)&&!a&&f.resolve(b)!==f.join(k(),"agent")))return;let c=process.env.XDG_DATA_HOME;if(c)try{let a=f.join(c,"omp"),b=j();if(b){let c=f.join(a,"profiles",b);return(0,d.existsSync)(c)?c:void 0}return(0,d.existsSync)(a)?a:void 0}catch{return}}();return f.join(b??l(),a)}function n(){return m("sessions")}function o(){return f.join(f.dirname(n()),"archive","sessions")}function p(){return m("blobs")}function q(){let a=l(),b=f.join(a,"config.yml");if((0,d.existsSync)(b))return b;let c=f.join(a,"config.yaml");return(0,d.existsSync)(c)?c:b}function r(){let a=l(),b=f.join(a,"models.yml");if((0,d.existsSync)(b))return b;let c=f.join(a,"models.yaml");return(0,d.existsSync)(c)?c:b}function s(a){try{return d.realpathSync.native(a)}catch{return a}}function t(a,b){let c=b.replace(/[/\\:]/g,"-");return c?a.endsWith("-")?`${a}${c}`:`${a}-${c}`:a}function u(a){let b,c=s(f.resolve(a)),d=s((0,e.homedir)()),g=s((0,e.tmpdir)()),h=f.relative(d,c),i=f.relative(g,c);return""!==h&&(h.startsWith("..")||f.isAbsolute(h))?""!==i&&(i.startsWith("..")||f.isAbsolute(i))?(b=f.resolve(c),`--${b.replace(/^[/\\]/,"").replace(/[/\\:]/g,"-")}--`):t("-tmp",i):t("-",h)}},96487:()=>{}};
@@ -1 +0,0 @@
1
- self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},__routerFilterStatic:{numItems:52,errorRate:1e-4,numBits:997,numHashes:14,bitArray:[1,0,0,1,0,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,0,1,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,0,1,1,1,0,1,0,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,1,1,0,1,1,1,0,0,1,0,0,1,1,1,1,0,1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,1,0,1,1,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,0,1,1,0,0,0,1,0,1,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,1,1,1,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,0,0,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,1,1,0,1,1,0,1,0,1,0,1,1,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,1,1,0,1,1,0,1,1,1,0,1,1,0,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,0,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1,0,1,0,1,1,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,1,0,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,1,0,0,0,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,1,1,0,1,0,0,1,1,1,1,0,1,1,1,0,1,0,1,0,1,0,0,1,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,1,1,1,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,1,1,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,1,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,1,1,0,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,0,1,1,0,1,0,1,0,1,1,1,1,0,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,0,1,1,1]},__routerFilterDynamic:{numItems:8,errorRate:1e-4,numBits:154,numHashes:14,bitArray:[1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,0,0,1,1,0,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,0,1,0,1,1,0,0,0,1,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1,0,1,1,0,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1,0,0,0,1,1,0,0,0,1,0]},sortedPages:["/_app"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
@@ -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}}}]);
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3944],{63944:(e,r,t)=>{t.r(r),t.d(r,{RelayPairPanel:()=>d});var a=t(95155),i=t(51128),l=t(12115),n=t(34906),s=t(4315),o=t(28594);function d({embedded:e=!1}){let{t:r}=(0,s.s9)(),[t,c]=(0,l.useState)(""),[y,h]=(0,l.useState)(),[x,u]=(0,l.useState)(null),[v,p]=(0,l.useState)([]),[g,f]=(0,l.useState)(null),[m,b]=(0,l.useState)(!1),[j,w]=(0,l.useState)(!1),S=(0,l.useMemo)(()=>x?function(e){let r=function(e){let r=e.trim();if(!r||r.length>2048)return null;try{let{data:e}=(0,o.lF)(r,{ecc:"M"});if(!Array.isArray(e)||e.length<21)return null;return e}catch{return null}}(e);if(!r)return null;let t=r.length,a=[];for(let e=0;e<t;e+=1){let i=r[e];if(!i||i.length!==t)return null;for(let r=0;r<t;r+=1)i[r]&&a.push(`M${r} ${e}h1v1h-1z`)}let i=a.join("");return`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${t} ${t}" width="100%" height="100%" shape-rendering="crispEdges" role="img"><rect width="${t}" height="${t}" fill="#fff"/><path fill="#000" d="${i}"/></svg>`}(x.uri):null,[x]),P=(0,l.useCallback)(async()=>{try{let[e,r]=await Promise.all([fetch("/api/relay/pair"),fetch("/api/relay/devices")]);if(e.ok){let r=await e.json(),t=null!==r&&"object"==typeof r&&"relayUrl"in r&&"string"==typeof r.relayUrl?r.relayUrl:void 0;t&&c(e=>e||t),h(t)}if(r.ok){let e=await r.json();p(e.devices??[])}}catch{}},[]);async function k(){b(!0),f(null),w(!1);try{let e=await fetch("/api/relay/pair",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.trim()?{url:t.trim()}:{})}),a=await e.json();if(!e.ok)return void f(a.error??r("relayPair.createFailed"));u(a),c(a.relayUrl),await P()}catch{f(r("relayPair.createFailed"))}finally{b(!1)}}async function z(){if(x)try{await navigator.clipboard.writeText(x.uri),w(!0)}catch{w(!1)}}async function C(e){f(null);try{if(!(await fetch(`/api/relay/devices/${encodeURIComponent(e)}`,{method:"DELETE"})).ok)return void f(r("relayPair.revokeFailed"));await P()}catch{f(r("relayPair.revokeFailed"))}}(0,l.useEffect)(()=>{P()},[P]);let $=(0,a.jsxs)(a.Fragment,{children:[e?null:(0,a.jsx)("div",{style:{width:40,height:40,display:"grid",placeItems:"center",borderRadius:"50%",background:"var(--user-bg)",color:"var(--accent)",marginBottom:20},children:(0,a.jsx)(i.A,{size:19,"aria-hidden":"true"})}),e?(0,a.jsx)("h3",{style:{margin:0,fontSize:"var(--text-base)",fontWeight:600,color:"var(--text)"},children:r("relayPair.title")}):(0,a.jsx)("h1",{className:"display-serif",style:{margin:0,fontSize:"calc(var(--text-xl) + var(--space-5) - var(--space-1))",color:"var(--text)"},children:r("relayPair.title")}),(0,a.jsx)("p",{style:{margin:e?"4px 0 16px":"10px 0 24px",color:"var(--text-muted)",fontSize:"var(--text-base)",lineHeight:1.5},children:r("relayPair.description")}),(0,a.jsx)("p",{style:{margin:"0 0 16px",color:"var(--text-dim)",fontSize:"var(--text-sm)",lineHeight:1.45},children:r("relayPair.steps")}),(0,a.jsxs)("div",{style:{display:"grid",gap:14},children:[(0,a.jsx)(n.D0,{label:r("relayPair.urlLabel"),hint:y&&!t?y:void 0,children:(0,a.jsx)(n.ks,{value:t,onChange:c,placeholder:"wss://machine.tailnet.ts.net/relay",autoComplete:"off",spellCheck:!1,mono:!0})}),(0,a.jsx)(n.$n,{type:"button",variant:"primary",busy:m,disabled:m,onClick:()=>void k(),children:m?r("relayPair.creating"):r("relayPair.create")}),g?(0,a.jsx)("p",{style:{margin:0,color:"var(--danger, #c44)",fontSize:"var(--text-sm)"},children:g}):null,x?(0,a.jsxs)("div",{style:{display:"grid",gap:8},children:[S?(0,a.jsxs)("div",{style:{display:"grid",justifyItems:"center",gap:8},children:[(0,a.jsx)("div",{role:"img","aria-label":r("relayPair.qrHint"),className:"relay-pair-qr",style:{width:212,height:212,boxSizing:"border-box",background:"#fff",color:"#000",padding:12,borderRadius:"var(--radius-control)",border:"1px solid var(--border)",isolation:"isolate"},dangerouslySetInnerHTML:{__html:S}}),(0,a.jsx)("p",{style:{margin:0,color:"var(--text-dim)",fontSize:"var(--text-sm)",textAlign:"center"},children:r("relayPair.qrHint")})]}):null,(0,a.jsx)("label",{style:{color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:r("relayPair.linkLabel")}),(0,a.jsx)("textarea",{readOnly:!0,value:x.uri,rows:4,style:{width:"100%",resize:"vertical",fontFamily:"var(--font-mono)",fontSize:"var(--text-sm)",padding:10,borderRadius:"var(--radius-control)",border:"1px solid var(--border)",background:"var(--bg)",color:"var(--text)"}}),(0,a.jsx)(n.$n,{type:"button",variant:"secondary",onClick:()=>void z(),children:j?r("relayPair.copied"):r("relayPair.copy")}),(0,a.jsx)("p",{style:{margin:0,color:"var(--text-dim)",fontSize:"var(--text-sm)"},children:r("relayPair.expires",{time:new Date(x.expiresAt).toLocaleTimeString()})})]}):null,(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{style:{margin:"16px 0 8px",fontSize:"var(--text-base)",color:"var(--text)"},children:r("relayPair.devicesTitle")}),0===v.length?(0,a.jsx)("p",{style:{margin:0,color:"var(--text-muted)",fontSize:"var(--text-sm)"},children:r("relayPair.noDevices")}):(0,a.jsx)("ul",{style:{listStyle:"none",margin:0,padding:0,display:"grid",gap:8},children:v.map(e=>(0,a.jsxs)("li",{style:{display:"flex",justifyContent:"space-between",gap:12,alignItems:"center"},children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("div",{style:{color:"var(--text)",fontSize:"var(--text-sm)"},children:e.label||e.id}),(0,a.jsx)("div",{style:{color:"var(--text-dim)",fontSize:"var(--text-sm)",fontFamily:"var(--font-mono)"},children:e.id})]}),(0,a.jsx)(n.$n,{type:"button",variant:"secondary",onClick:()=>void C(e.id),children:r("relayPair.revoke")})]},e.id))})]})]})]});return e?(0,a.jsx)("div",{style:{display:"flex",flexDirection:"column",gap:0,maxWidth:520},children:$}):(0,a.jsx)("main",{style:{flex:1,display:"grid",placeItems:"center",padding:20,background:"var(--bg)"},children:(0,a.jsx)("section",{style:{width:"min(100%, 520px)",padding:32,background:"var(--bg-panel)",border:"1px solid var(--border)",borderRadius:"var(--radius-modal)",boxShadow:"var(--shadow-modal)"},children:$})})}}}]);