aigetwey 1.3.8 → 1.4.0

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 (299) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +125 -211
  3. package/assets/screenshot-accesskey.png +0 -0
  4. package/assets/screenshot-budgets.png +0 -0
  5. package/assets/screenshot-endpoint.png +0 -0
  6. package/dashboard/.next/BUILD_ID +1 -1
  7. package/dashboard/.next/app-path-routes-manifest.json +1 -0
  8. package/dashboard/.next/build-manifest.json +3 -3
  9. package/dashboard/.next/diagnostics/route-bundle-stats.json +55 -38
  10. package/dashboard/.next/fallback-build-manifest.json +3 -3
  11. package/dashboard/.next/prerender-manifest.json +24 -0
  12. package/dashboard/.next/routes-manifest.json +6 -0
  13. package/dashboard/.next/server/app/(console)/combos/page.js.nft.json +1 -1
  14. package/dashboard/.next/server/app/(console)/combos/page_client-reference-manifest.js +1 -1
  15. package/dashboard/.next/server/app/(console)/config/page.js.nft.json +1 -1
  16. package/dashboard/.next/server/app/(console)/config/page_client-reference-manifest.js +1 -1
  17. package/dashboard/.next/server/app/(console)/console/page.js.nft.json +1 -1
  18. package/dashboard/.next/server/app/(console)/console/page_client-reference-manifest.js +1 -1
  19. package/dashboard/.next/server/app/(console)/endpoint/page.js.nft.json +1 -1
  20. package/dashboard/.next/server/app/(console)/endpoint/page_client-reference-manifest.js +1 -1
  21. package/dashboard/.next/server/app/(console)/keys/page/app-paths-manifest.json +3 -0
  22. package/dashboard/.next/server/app/(console)/keys/page/build-manifest.json +18 -0
  23. package/dashboard/.next/server/app/(console)/keys/page/next-font-manifest.json +11 -0
  24. package/dashboard/.next/server/app/(console)/keys/page/react-loadable-manifest.json +1 -0
  25. package/dashboard/.next/server/app/(console)/keys/page/server-reference-manifest.json +4 -0
  26. package/dashboard/.next/server/app/(console)/keys/page.js +15 -0
  27. package/dashboard/.next/server/app/(console)/keys/page.js.map +5 -0
  28. package/dashboard/.next/server/app/(console)/keys/page.js.nft.json +1 -0
  29. package/dashboard/.next/server/app/(console)/keys/page_client-reference-manifest.js +3 -0
  30. package/dashboard/.next/server/app/(console)/page.js.nft.json +1 -1
  31. package/dashboard/.next/server/app/(console)/page_client-reference-manifest.js +1 -1
  32. package/dashboard/.next/server/app/(console)/providers/[id]/page.js.nft.json +1 -1
  33. package/dashboard/.next/server/app/(console)/providers/[id]/page_client-reference-manifest.js +1 -1
  34. package/dashboard/.next/server/app/(console)/providers/page.js.nft.json +1 -1
  35. package/dashboard/.next/server/app/(console)/providers/page_client-reference-manifest.js +1 -1
  36. package/dashboard/.next/server/app/(console)/quota/page.js.nft.json +1 -1
  37. package/dashboard/.next/server/app/(console)/quota/page_client-reference-manifest.js +1 -1
  38. package/dashboard/.next/server/app/(console)/tools/[id]/page.js.nft.json +1 -1
  39. package/dashboard/.next/server/app/(console)/tools/[id]/page_client-reference-manifest.js +1 -1
  40. package/dashboard/.next/server/app/(console)/tools/page.js.nft.json +1 -1
  41. package/dashboard/.next/server/app/(console)/tools/page_client-reference-manifest.js +1 -1
  42. package/dashboard/.next/server/app/(console)/usage/page.js.nft.json +1 -1
  43. package/dashboard/.next/server/app/(console)/usage/page_client-reference-manifest.js +1 -1
  44. package/dashboard/.next/server/app/_global-error/page.js.nft.json +1 -1
  45. package/dashboard/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  46. package/dashboard/.next/server/app/_global-error.html +1 -1
  47. package/dashboard/.next/server/app/_global-error.rsc +1 -1
  48. package/dashboard/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  49. package/dashboard/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  50. package/dashboard/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  51. package/dashboard/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  52. package/dashboard/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  53. package/dashboard/.next/server/app/_not-found/page.js.nft.json +1 -1
  54. package/dashboard/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  55. package/dashboard/.next/server/app/_not-found.html +1 -1
  56. package/dashboard/.next/server/app/_not-found.rsc +2 -2
  57. package/dashboard/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  58. package/dashboard/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  59. package/dashboard/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  60. package/dashboard/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  61. package/dashboard/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  62. package/dashboard/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  63. package/dashboard/.next/server/app/combos.html +1 -1
  64. package/dashboard/.next/server/app/combos.rsc +5 -5
  65. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos/__PAGE__.segment.rsc +2 -2
  66. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp/combos.segment.rsc +1 -1
  67. package/dashboard/.next/server/app/combos.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  68. package/dashboard/.next/server/app/combos.segments/_full.segment.rsc +5 -5
  69. package/dashboard/.next/server/app/combos.segments/_head.segment.rsc +1 -1
  70. package/dashboard/.next/server/app/combos.segments/_index.segment.rsc +2 -2
  71. package/dashboard/.next/server/app/combos.segments/_tree.segment.rsc +2 -2
  72. package/dashboard/.next/server/app/config.html +1 -1
  73. package/dashboard/.next/server/app/config.rsc +5 -5
  74. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config/__PAGE__.segment.rsc +2 -2
  75. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp/config.segment.rsc +1 -1
  76. package/dashboard/.next/server/app/config.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  77. package/dashboard/.next/server/app/config.segments/_full.segment.rsc +5 -5
  78. package/dashboard/.next/server/app/config.segments/_head.segment.rsc +1 -1
  79. package/dashboard/.next/server/app/config.segments/_index.segment.rsc +2 -2
  80. package/dashboard/.next/server/app/config.segments/_tree.segment.rsc +2 -2
  81. package/dashboard/.next/server/app/console.html +1 -1
  82. package/dashboard/.next/server/app/console.rsc +5 -5
  83. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console/__PAGE__.segment.rsc +2 -2
  84. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp/console.segment.rsc +1 -1
  85. package/dashboard/.next/server/app/console.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  86. package/dashboard/.next/server/app/console.segments/_full.segment.rsc +5 -5
  87. package/dashboard/.next/server/app/console.segments/_head.segment.rsc +1 -1
  88. package/dashboard/.next/server/app/console.segments/_index.segment.rsc +2 -2
  89. package/dashboard/.next/server/app/console.segments/_tree.segment.rsc +2 -2
  90. package/dashboard/.next/server/app/endpoint.html +1 -1
  91. package/dashboard/.next/server/app/endpoint.rsc +5 -5
  92. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint/__PAGE__.segment.rsc +2 -2
  93. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp/endpoint.segment.rsc +1 -1
  94. package/dashboard/.next/server/app/endpoint.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  95. package/dashboard/.next/server/app/endpoint.segments/_full.segment.rsc +5 -5
  96. package/dashboard/.next/server/app/endpoint.segments/_head.segment.rsc +1 -1
  97. package/dashboard/.next/server/app/endpoint.segments/_index.segment.rsc +2 -2
  98. package/dashboard/.next/server/app/endpoint.segments/_tree.segment.rsc +2 -2
  99. package/dashboard/.next/server/app/index.html +1 -1
  100. package/dashboard/.next/server/app/index.rsc +5 -5
  101. package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp/__PAGE__.segment.rsc +2 -2
  102. package/dashboard/.next/server/app/index.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  103. package/dashboard/.next/server/app/index.segments/_full.segment.rsc +5 -5
  104. package/dashboard/.next/server/app/index.segments/_head.segment.rsc +1 -1
  105. package/dashboard/.next/server/app/index.segments/_index.segment.rsc +2 -2
  106. package/dashboard/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  107. package/dashboard/.next/server/app/keys.html +1 -0
  108. package/dashboard/.next/server/app/keys.meta +16 -0
  109. package/dashboard/.next/server/app/keys.rsc +25 -0
  110. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys/__PAGE__.segment.rsc +6 -0
  111. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp/keys.segment.rsc +5 -0
  112. package/dashboard/.next/server/app/keys.segments/!KGNvbnNvbGUp.segment.rsc +6 -0
  113. package/dashboard/.next/server/app/keys.segments/_full.segment.rsc +25 -0
  114. package/dashboard/.next/server/app/keys.segments/_head.segment.rsc +6 -0
  115. package/dashboard/.next/server/app/keys.segments/_index.segment.rsc +9 -0
  116. package/dashboard/.next/server/app/keys.segments/_tree.segment.rsc +5 -0
  117. package/dashboard/.next/server/app/login/page.js.nft.json +1 -1
  118. package/dashboard/.next/server/app/login/page_client-reference-manifest.js +1 -1
  119. package/dashboard/.next/server/app/login.html +1 -1
  120. package/dashboard/.next/server/app/login.rsc +2 -2
  121. package/dashboard/.next/server/app/login.segments/_full.segment.rsc +2 -2
  122. package/dashboard/.next/server/app/login.segments/_head.segment.rsc +1 -1
  123. package/dashboard/.next/server/app/login.segments/_index.segment.rsc +2 -2
  124. package/dashboard/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  125. package/dashboard/.next/server/app/login.segments/login/__PAGE__.segment.rsc +1 -1
  126. package/dashboard/.next/server/app/login.segments/login.segment.rsc +1 -1
  127. package/dashboard/.next/server/app/providers.html +1 -1
  128. package/dashboard/.next/server/app/providers.rsc +5 -5
  129. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers/__PAGE__.segment.rsc +2 -2
  130. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp/providers.segment.rsc +1 -1
  131. package/dashboard/.next/server/app/providers.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  132. package/dashboard/.next/server/app/providers.segments/_full.segment.rsc +5 -5
  133. package/dashboard/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  134. package/dashboard/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  135. package/dashboard/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  136. package/dashboard/.next/server/app/quota.html +1 -1
  137. package/dashboard/.next/server/app/quota.rsc +5 -5
  138. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota/__PAGE__.segment.rsc +2 -2
  139. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp/quota.segment.rsc +1 -1
  140. package/dashboard/.next/server/app/quota.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  141. package/dashboard/.next/server/app/quota.segments/_full.segment.rsc +5 -5
  142. package/dashboard/.next/server/app/quota.segments/_head.segment.rsc +1 -1
  143. package/dashboard/.next/server/app/quota.segments/_index.segment.rsc +2 -2
  144. package/dashboard/.next/server/app/quota.segments/_tree.segment.rsc +2 -2
  145. package/dashboard/.next/server/app/tools.html +1 -1
  146. package/dashboard/.next/server/app/tools.rsc +5 -5
  147. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools/__PAGE__.segment.rsc +2 -2
  148. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp/tools.segment.rsc +1 -1
  149. package/dashboard/.next/server/app/tools.segments/!KGNvbnNvbGUp.segment.rsc +3 -3
  150. package/dashboard/.next/server/app/tools.segments/_full.segment.rsc +5 -5
  151. package/dashboard/.next/server/app/tools.segments/_head.segment.rsc +1 -1
  152. package/dashboard/.next/server/app/tools.segments/_index.segment.rsc +2 -2
  153. package/dashboard/.next/server/app/tools.segments/_tree.segment.rsc +2 -2
  154. package/dashboard/.next/server/app-paths-manifest.json +1 -0
  155. package/dashboard/.next/server/chunks/[root-of-the-server]__0das32e._.js +1 -1
  156. package/dashboard/.next/server/chunks/[root-of-the-server]__0das32e._.js.map +1 -1
  157. package/dashboard/.next/server/chunks/ssr/[root-of-the-server]__006jvp_._.js +3 -0
  158. package/dashboard/.next/server/chunks/ssr/[root-of-the-server]__006jvp_._.js.map +1 -0
  159. package/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__0x-617o._.js → [root-of-the-server]__1eeunp8._.js} +2 -2
  160. package/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__0x-617o._.js.map → [root-of-the-server]__1eeunp8._.js.map} +1 -1
  161. package/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__09pxn-h._.js → [root-of-the-server]__1t7z0yw._.js} +2 -2
  162. package/dashboard/.next/server/chunks/ssr/{[root-of-the-server]__09pxn-h._.js.map → [root-of-the-server]__1t7z0yw._.js.map} +1 -1
  163. package/dashboard/.next/server/chunks/ssr/_0p90gyy._.js +3 -0
  164. package/dashboard/.next/server/chunks/ssr/_0p90gyy._.js.map +1 -0
  165. package/dashboard/.next/server/chunks/ssr/_next-internal_server_app_(console)_keys_page_actions_1--ho2b.js +3 -0
  166. package/dashboard/.next/server/chunks/ssr/_next-internal_server_app_(console)_keys_page_actions_1--ho2b.js.map +1 -0
  167. package/dashboard/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-auga4.js +4 -0
  168. package/dashboard/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0-auga4.js.map +1 -0
  169. package/dashboard/.next/server/chunks/ssr/src_13mfqac._.js +3 -0
  170. package/dashboard/.next/server/chunks/ssr/src_13mfqac._.js.map +1 -0
  171. package/dashboard/.next/server/chunks/ssr/src_16zsfd3._.js +3 -0
  172. package/dashboard/.next/server/chunks/ssr/src_16zsfd3._.js.map +1 -0
  173. package/dashboard/.next/server/chunks/ssr/src_components_0-kkrr9._.js +3 -0
  174. package/dashboard/.next/server/chunks/ssr/src_components_0-kkrr9._.js.map +1 -0
  175. package/dashboard/.next/server/chunks/ssr/src_components_0dgasfb._.js +3 -0
  176. package/dashboard/.next/server/chunks/ssr/src_components_0dgasfb._.js.map +1 -0
  177. package/dashboard/.next/server/chunks/ssr/src_components_0q5pldo._.js +3 -0
  178. package/dashboard/.next/server/chunks/ssr/src_components_0q5pldo._.js.map +1 -0
  179. package/dashboard/.next/server/chunks/ssr/src_components_10h9ide._.js +1 -1
  180. package/dashboard/.next/server/chunks/ssr/src_components_10h9ide._.js.map +1 -1
  181. package/dashboard/.next/server/chunks/ssr/src_components_11ckzq_._.js +1 -1
  182. package/dashboard/.next/server/chunks/ssr/src_components_11ckzq_._.js.map +1 -1
  183. package/dashboard/.next/server/chunks/ssr/src_components_11dtfns._.js +3 -0
  184. package/dashboard/.next/server/chunks/ssr/src_components_11dtfns._.js.map +1 -0
  185. package/dashboard/.next/server/chunks/ssr/src_components_1e6kjgr._.js +3 -0
  186. package/dashboard/.next/server/chunks/ssr/src_components_1e6kjgr._.js.map +1 -0
  187. package/dashboard/.next/server/chunks/ssr/src_components_1eg_jit._.js +3 -0
  188. package/dashboard/.next/server/chunks/ssr/src_components_1eg_jit._.js.map +1 -0
  189. package/dashboard/.next/server/chunks/ssr/src_components_1pu8z89._.js +3 -0
  190. package/dashboard/.next/server/chunks/ssr/src_components_1pu8z89._.js.map +1 -0
  191. package/dashboard/.next/server/chunks/ssr/src_components_1z4akp5._.js +3 -0
  192. package/dashboard/.next/server/chunks/ssr/src_components_1z4akp5._.js.map +1 -0
  193. package/dashboard/.next/server/chunks/ssr/src_components_KeyManager_tsx_0r7iyz8._.js +3 -0
  194. package/dashboard/.next/server/chunks/ssr/src_components_KeyManager_tsx_0r7iyz8._.js.map +1 -0
  195. package/dashboard/.next/server/chunks/ssr/src_components_ProviderManager_tsx_09d2dzw._.js +3 -0
  196. package/dashboard/.next/server/chunks/ssr/src_components_ProviderManager_tsx_09d2dzw._.js.map +1 -0
  197. package/dashboard/.next/server/chunks/ssr/src_components_ToolDetail_tsx_0qperd-._.js +1 -1
  198. package/dashboard/.next/server/chunks/ssr/src_components_ToolDetail_tsx_0qperd-._.js.map +1 -1
  199. package/dashboard/.next/server/middleware-build-manifest.js +3 -3
  200. package/dashboard/.next/server/next-font-manifest.js +1 -1
  201. package/dashboard/.next/server/next-font-manifest.json +4 -0
  202. package/dashboard/.next/server/pages/404.html +1 -1
  203. package/dashboard/.next/server/pages/500.html +1 -1
  204. package/dashboard/.next/static/chunks/0-qqj0_fg6ef0.js +1 -0
  205. package/dashboard/.next/static/chunks/0347y27liw05t.js +1 -0
  206. package/dashboard/.next/static/chunks/0iv69e64f1ywa.css +3 -0
  207. package/dashboard/.next/static/chunks/0mou1p6uwiu19.js +1 -0
  208. package/dashboard/.next/static/chunks/0pf-u__m67vld.js +1 -0
  209. package/dashboard/.next/static/chunks/0zdns9uijk264.js +1 -0
  210. package/dashboard/.next/static/chunks/19nfww990cvv7.js +1 -0
  211. package/dashboard/.next/static/chunks/1t87-rpltg53e.js +1 -0
  212. package/dashboard/.next/static/chunks/1wn1c2w4ibyg_.js +1 -0
  213. package/dashboard/.next/static/chunks/29bgf5j_v6h2z.js +1 -0
  214. package/dashboard/.next/static/chunks/2uvgdots59tjl.js +1 -0
  215. package/dashboard/.next/static/chunks/3chs_cdkdx2h9.js +1 -0
  216. package/dashboard/.next/static/chunks/3y0b8yet0vgwr.js +1 -0
  217. package/dashboard/.next/trace +1 -1
  218. package/dashboard/.next/trace-build +1 -1
  219. package/dashboard/.next/types/routes.d.ts +2 -1
  220. package/dashboard/.next/types/validator.ts +9 -0
  221. package/dashboard/package-lock.json +56 -0
  222. package/dashboard/package.json +3 -0
  223. package/dashboard/src/app/(console)/keys/page.tsx +5 -0
  224. package/dashboard/src/app/api/cli-detect/[tool]/route.ts +0 -1
  225. package/dashboard/src/app/globals.css +1 -0
  226. package/dashboard/src/components/Badge.tsx +2 -1
  227. package/dashboard/src/components/EndpointView.tsx +49 -373
  228. package/dashboard/src/components/KeyManager.tsx +252 -0
  229. package/dashboard/src/components/KeyReveal.tsx +11 -11
  230. package/dashboard/src/components/KeyScopeModal.tsx +184 -0
  231. package/dashboard/src/components/LogTable.tsx +1 -1
  232. package/dashboard/src/components/ProviderManager.tsx +136 -44
  233. package/dashboard/src/components/Rail.tsx +2 -1
  234. package/dashboard/src/components/ToolDetail.tsx +0 -1
  235. package/dashboard/src/components/TopBar.tsx +102 -28
  236. package/dashboard/src/lib/client.ts +2 -0
  237. package/dist/appDirs.js +11 -0
  238. package/dist/appDirs.js.map +1 -0
  239. package/dist/cli.js +35 -7
  240. package/dist/cli.js.map +1 -1
  241. package/dist/config.js +14 -0
  242. package/dist/config.js.map +1 -1
  243. package/dist/core/handler.js +3 -3
  244. package/dist/core/handler.js.map +1 -1
  245. package/dist/db.js +18 -11
  246. package/dist/db.js.map +1 -1
  247. package/dist/headroom/process.js +2 -1
  248. package/dist/headroom/process.js.map +1 -1
  249. package/dist/routes/admin.js +8 -1
  250. package/dist/routes/admin.js.map +1 -1
  251. package/dist/server.js +4 -4
  252. package/dist/server.js.map +1 -1
  253. package/dist/stream/anthropic-stream.js +6 -3
  254. package/dist/stream/anthropic-stream.js.map +1 -1
  255. package/package.json +1 -1
  256. package/src/appDirs.ts +12 -0
  257. package/src/cli.ts +36 -7
  258. package/src/config.ts +12 -0
  259. package/src/core/handler.ts +3 -3
  260. package/src/db.ts +27 -9
  261. package/src/headroom/process.ts +2 -1
  262. package/src/routes/admin.ts +9 -0
  263. package/src/server.ts +3 -3
  264. package/src/stream/anthropic-stream.ts +6 -3
  265. package/assets/screenshot.png +0 -0
  266. package/dashboard/.next/server/chunks/ssr/_1jt-_lv._.js +0 -3
  267. package/dashboard/.next/server/chunks/ssr/_1jt-_lv._.js.map +0 -1
  268. package/dashboard/.next/server/chunks/ssr/src_02ocd5c._.js +0 -3
  269. package/dashboard/.next/server/chunks/ssr/src_02ocd5c._.js.map +0 -1
  270. package/dashboard/.next/server/chunks/ssr/src_0az41dg._.js +0 -3
  271. package/dashboard/.next/server/chunks/ssr/src_0az41dg._.js.map +0 -1
  272. package/dashboard/.next/server/chunks/ssr/src_components_0nuo5yx._.js +0 -3
  273. package/dashboard/.next/server/chunks/ssr/src_components_0nuo5yx._.js.map +0 -1
  274. package/dashboard/.next/server/chunks/ssr/src_components_12gk6sc._.js +0 -3
  275. package/dashboard/.next/server/chunks/ssr/src_components_12gk6sc._.js.map +0 -1
  276. package/dashboard/.next/server/chunks/ssr/src_components_17nnhsa._.js +0 -3
  277. package/dashboard/.next/server/chunks/ssr/src_components_17nnhsa._.js.map +0 -1
  278. package/dashboard/.next/server/chunks/ssr/src_components_1kc5vh2._.js +0 -3
  279. package/dashboard/.next/server/chunks/ssr/src_components_1kc5vh2._.js.map +0 -1
  280. package/dashboard/.next/server/chunks/ssr/src_components_1zwow63._.js +0 -3
  281. package/dashboard/.next/server/chunks/ssr/src_components_1zwow63._.js.map +0 -1
  282. package/dashboard/.next/server/chunks/ssr/src_components_EndpointView_tsx_0awdzb5._.js +0 -3
  283. package/dashboard/.next/server/chunks/ssr/src_components_EndpointView_tsx_0awdzb5._.js.map +0 -1
  284. package/dashboard/.next/server/chunks/ssr/src_components_ModelPicker_tsx_1jisxh6._.js +0 -3
  285. package/dashboard/.next/server/chunks/ssr/src_components_ModelPicker_tsx_1jisxh6._.js.map +0 -1
  286. package/dashboard/.next/static/chunks/063d_vdu_m-g_.js +0 -1
  287. package/dashboard/.next/static/chunks/0tq5u12liycmg.js +0 -1
  288. package/dashboard/.next/static/chunks/1-r9spn081_wo.js +0 -1
  289. package/dashboard/.next/static/chunks/13824732j7-dk.js +0 -1
  290. package/dashboard/.next/static/chunks/16vbdc0g5xea0.js +0 -1
  291. package/dashboard/.next/static/chunks/22r7w355mazs8.js +0 -1
  292. package/dashboard/.next/static/chunks/2zho1fpijk0fu.js +0 -1
  293. package/dashboard/.next/static/chunks/30uw-uiehs39o.js +0 -1
  294. package/dashboard/.next/static/chunks/3mhsmb2ks1vev.js +0 -1
  295. package/dashboard/.next/static/chunks/3nrz6v06gppob.js +0 -1
  296. package/dashboard/.next/static/chunks/452cgglyyo7hp.css +0 -3
  297. /package/dashboard/.next/static/{l0QkSM6jT0jiUc4m4dh6K → WxqdtupTIrBh47rvaXxLB}/_buildManifest.js +0 -0
  298. /package/dashboard/.next/static/{l0QkSM6jT0jiUc4m4dh6K → WxqdtupTIrBh47rvaXxLB}/_clientMiddlewareManifest.js +0 -0
  299. /package/dashboard/.next/static/{l0QkSM6jT0jiUc4m4dh6K → WxqdtupTIrBh47rvaXxLB}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -26,11 +26,14 @@ export async function* streamToCanonical(events) {
26
26
  state.model = message?.model ?? "";
27
27
  const u = message?.usage;
28
28
  if (u) {
29
- state.promptTokens = u.input_tokens ?? 0;
29
+ const cacheRead = u.cache_read_input_tokens ?? 0;
30
+ const cacheCreate = u.cache_creation_input_tokens ?? 0;
31
+ // total input = non-cached + cache_read + cache_creation (all tokens model processed)
32
+ state.promptTokens = (u.input_tokens ?? 0) + cacheRead + cacheCreate;
30
33
  state.completionTokens = u.output_tokens ?? 0;
31
34
  state.reasoningTokens = u.thinking_tokens ?? 0;
32
- state.cachedTokens = u.cache_read_input_tokens;
33
- state.cacheCreationTokens = u.cache_creation_input_tokens;
35
+ state.cachedTokens = cacheRead || undefined;
36
+ state.cacheCreationTokens = cacheCreate || undefined;
34
37
  }
35
38
  const startChunk = baseChunk(state, { role: "assistant", content: "" }, null);
36
39
  startChunk.usage = {
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-stream.js","sourceRoot":"","sources":["../../src/stream/anthropic-stream.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CAAC,MAA+B;IACtE,MAAM,KAAK,GAAoB;QAC7B,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;QACT,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;KACpB,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QACzC,IAAI,GAA4B,CAAC;QACjC,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,IAAK,GAAG,CAAC,IAA2B,CAAC;QAE1D,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,OAAO,GAAG,GAAG,CAAC,OAEP,CAAC;gBACd,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC7B,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC;gBACzB,IAAI,CAAC,EAAE,CAAC;oBACN,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;oBACzC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;oBAC9C,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;oBAC/C,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,uBAAuB,CAAC;oBAC/C,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC,2BAA2B,CAAC;gBAC5D,CAAC;gBACD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC9E,UAAU,CAAC,KAAK,GAAG;oBACjB,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,iBAAiB,EAAE,KAAK,CAAC,gBAAgB;oBACzC,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,KAAK,CAAC,eAAe;iBACxC,CAAC;gBACF,MAAM,UAAU,CAAC;gBACjB,MAAM;YACR,CAAC;YAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,aAA0E,CAAC;gBAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,KAAe,CAAC;gBAClC,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;oBACxC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC7C,MAAM,EAAE,GAA2B;wBACjC,KAAK,EAAE,SAAS;wBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;qBAC9C,CAAC;oBACF,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACrD,CAAC;gBACD,2DAA2D;gBAC3D,MAAM;YACR,CAAC;YAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAEL,CAAC;gBACd,MAAM,KAAK,GAAG,GAAG,CAAC,KAAe,CAAC;gBAClC,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;oBACjC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,KAAK,EAAE,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAC5C,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBACzD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,KAAK,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC5B,MAAM,EAAE,GAA2B;4BACjC,KAAK,EAAE,SAAS;4BAChB,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE;yBAClD,CAAC;wBACF,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAoD,CAAC;gBACvE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAyE,CAAC;gBAC5F,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC3C,KAAK,CAAC,KAAK,GAAG;oBACZ,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,iBAAiB,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC;oBAC5C,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,KAAK,EAAE,eAAe,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC;iBACvE,CAAC;gBACF,MAAM,KAAK,CAAC;gBACZ,MAAM;YACR,CAAC;YAED,gEAAgE;YAChE;gBACE,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,KAAsB,EACtB,KAA4C,EAC5C,MAAyB;IAEzB,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,iBAAiB;QACjC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAiC;IACtD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAsBD,SAAS,EAAE,CAAC,KAAa,EAAE,IAA6B;IACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CAAC,MAAqC;IAC9E,MAAM,CAAC,GAAe;QACpB,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,CAAC,CAAC;QACb,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,QAAQ,CAAC,CAAC,SAAS;QACjB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,YAAY,CAAC;YAChC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;YACjD,MAAM,EAAE,CAAC,eAAe,EAAE;gBACxB,OAAO,EAAE;oBACP,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,IAAI;oBACjB,aAAa,EAAE,IAAI;oBACnB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC,EAAE;iBAC1D;aACF,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,8BAA8B;QAC9B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC9B,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBACjC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC;gBACxB,MAAM,EAAE,CAAC,qBAAqB,EAAE;oBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;oBAClB,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAClD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,CAAC,qBAAqB,EAAE;gBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;gBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBACjC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,EAAE,CAAC,qBAAqB,EAAE;gBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;gBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE;oBAC9B,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC7G,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YACpC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,aAAa;YAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1D,IAAI,KAAK,CAAC,KAAK,EAAE,iBAAiB;YAAE,CAAC,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACzF,CAAC;IAED,WAAW;IACX,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,eAAe,EAAE;QACxB,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE;QAClE,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,gBAAgB,EAAE;KAC7C,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"anthropic-stream.js","sourceRoot":"","sources":["../../src/stream/anthropic-stream.ts"],"names":[],"mappings":"AAiCA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,iBAAiB,CAAC,MAA+B;IACtE,MAAM,KAAK,GAAoB;QAC7B,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;QACT,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;KACpB,CAAC;IAEF,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,QAAQ;YAAE,SAAS;QACzC,IAAI,GAA4B,CAAC;QACjC,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,KAAK,IAAK,GAAG,CAAC,IAA2B,CAAC;QAE1D,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,OAAO,GAAG,GAAG,CAAC,OAEP,CAAC;gBACd,KAAK,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC7B,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;gBACnC,MAAM,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC;gBACzB,IAAI,CAAC,EAAE,CAAC;oBACN,MAAM,SAAS,GAAG,CAAC,CAAC,uBAAuB,IAAI,CAAC,CAAC;oBACjD,MAAM,WAAW,GAAG,CAAC,CAAC,2BAA2B,IAAI,CAAC,CAAC;oBACvD,sFAAsF;oBACtF,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,WAAW,CAAC;oBACrE,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC;oBAC9C,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;oBAC/C,KAAK,CAAC,YAAY,GAAG,SAAS,IAAI,SAAS,CAAC;oBAC5C,KAAK,CAAC,mBAAmB,GAAG,WAAW,IAAI,SAAS,CAAC;gBACvD,CAAC;gBACD,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC9E,UAAU,CAAC,KAAK,GAAG;oBACjB,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,iBAAiB,EAAE,KAAK,CAAC,gBAAgB;oBACzC,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,KAAK,CAAC,eAAe;iBACxC,CAAC;gBACF,MAAM,UAAU,CAAC;gBACjB,MAAM;YACR,CAAC;YAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,aAA0E,CAAC;gBAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,KAAe,CAAC;gBAClC,IAAI,KAAK,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;oBAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,EAAE,CAAC;oBACxC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;oBAC7C,MAAM,EAAE,GAA2B;wBACjC,KAAK,EAAE,SAAS;wBAChB,EAAE,EAAE,KAAK,CAAC,EAAE;wBACZ,IAAI,EAAE,UAAU;wBAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE;qBAC9C,CAAC;oBACF,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;gBACrD,CAAC;gBACD,2DAA2D;gBAC3D,MAAM;YACR,CAAC;YAED,KAAK,qBAAqB,CAAC,CAAC,CAAC;gBAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,KAEL,CAAC;gBACd,MAAM,KAAK,GAAG,GAAG,CAAC,KAAe,CAAC;gBAClC,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;oBACjC,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBAC9D,CAAC;qBAAM,IAAI,KAAK,EAAE,IAAI,KAAK,gBAAgB,EAAE,CAAC;oBAC5C,KAAK,CAAC,eAAe,GAAG,CAAC,KAAK,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBACzD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;gBACpE,CAAC;qBAAM,IAAI,KAAK,EAAE,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBAC9C,MAAM,SAAS,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBACpD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;wBAC5B,MAAM,EAAE,GAA2B;4BACjC,KAAK,EAAE,SAAS;4BAChB,QAAQ,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE;yBAClD,CAAC;wBACF,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACrD,CAAC;gBACH,CAAC;gBACD,MAAM;YACR,CAAC;YAED,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAoD,CAAC;gBACvE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAyE,CAAC;gBAC5F,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;gBACjD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC3C,KAAK,CAAC,KAAK,GAAG;oBACZ,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,iBAAiB,EAAE,KAAK,EAAE,aAAa,IAAI,CAAC;oBAC5C,aAAa,EAAE,KAAK,CAAC,YAAY;oBACjC,qBAAqB,EAAE,KAAK,CAAC,mBAAmB;oBAChD,gBAAgB,EAAE,KAAK,EAAE,eAAe,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC;iBACvE,CAAC;gBACF,MAAM,KAAK,CAAC;gBACZ,MAAM;YACR,CAAC;YAED,gEAAgE;YAChE;gBACE,MAAM;QACV,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAChB,KAAsB,EACtB,KAA4C,EAC5C,MAAyB;IAEzB,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE,IAAI,iBAAiB;QACjC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAiC;IACtD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU,CAAC;QAChB,KAAK,eAAe;YAClB,OAAO,MAAM,CAAC;QAChB,KAAK,YAAY;YACf,OAAO,QAAQ,CAAC;QAClB,KAAK,UAAU;YACb,OAAO,YAAY,CAAC;QACtB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAsBD,SAAS,EAAE,CAAC,KAAa,EAAE,IAA6B;IACtD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CAAC,MAAqC;IAC9E,MAAM,CAAC,GAAe;QACpB,EAAE,EAAE,EAAE;QACN,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,KAAK;QACd,SAAS,EAAE,CAAC,CAAC;QACb,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,CAAC;QACjB,gBAAgB,EAAE,IAAI,GAAG,EAAE;QAC3B,YAAY,EAAE,CAAC;QACf,gBAAgB,EAAE,CAAC;QACnB,MAAM,EAAE,IAAI;KACb,CAAC;IAEF,QAAQ,CAAC,CAAC,SAAS;QACjB,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACjB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YACf,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,YAAY,CAAC;YAChC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5B,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC,CAAC;YACjD,MAAM,EAAE,CAAC,eAAe,EAAE;gBACxB,OAAO,EAAE;oBACP,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,IAAI;oBACjB,aAAa,EAAE,IAAI;oBACnB,KAAK,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,aAAa,EAAE,CAAC,EAAE;iBAC1D;aACF,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QAEjC,8BAA8B;QAC9B,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC9B,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBACjC,CAAC,CAAC,QAAQ,GAAG,UAAU,CAAC;gBACxB,MAAM,EAAE,CAAC,qBAAqB,EAAE;oBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;oBAClB,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAClD,CAAC,CAAC;YACL,CAAC;YACD,MAAM,EAAE,CAAC,qBAAqB,EAAE;gBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;gBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,EAAE;aAC7D,CAAC,CAAC;QACL,CAAC;QAED,qBAAqB;QACrB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClE,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC1B,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBACjC,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,MAAM,EAAE,CAAC,qBAAqB,EAAE;gBAC9B,KAAK,EAAE,CAAC,CAAC,SAAS;gBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;aACnD,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,KAAK,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;gBACnB,KAAK,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC;gBAC3B,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBACxC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC;gBACpB,CAAC,CAAC,QAAQ,GAAG,MAAM,CAAC;gBACpB,MAAM,EAAE,CAAC,qBAAqB,EAAE;oBAC9B,KAAK,EAAE,KAAK;oBACZ,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,QAAQ,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBAC7G,CAAC,CAAC;YACL,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC;YACpC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,EAAE,CAAC,qBAAqB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7G,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,aAAa;YAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;QAC1D,IAAI,KAAK,CAAC,KAAK,EAAE,iBAAiB;YAAE,CAAC,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACzF,CAAC;IAED,WAAW;IACX,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACnB,MAAM,EAAE,CAAC,eAAe,EAAE;QACxB,KAAK,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE;QAClE,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,gBAAgB,EAAE;KAC7C,CAAC,CAAC;IACH,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,WAAW,CAAC,MAAqB;IACxC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,UAAU,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,YAAY;YACf,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aigetwey",
3
- "version": "1.3.8",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "description": "Personal AI gateway — route, translate and track requests across Anthropic and OpenAI-compatible providers, with a built-in dashboard.",
6
6
  "keywords": [
package/src/appDirs.ts ADDED
@@ -0,0 +1,12 @@
1
+ import { homedir } from "node:os";
2
+ import { join, resolve } from "node:path";
3
+
4
+ export function getDataDir(): string {
5
+ const env = process.env.AIGETWEY_DATA_DIR;
6
+ return env ? resolve(env) : join(homedir(), ".aigetwey");
7
+ }
8
+
9
+ export function getConfigPath(): string {
10
+ const env = process.env.AIGETWEY_CONFIG;
11
+ return env ? resolve(env) : join(getDataDir(), "config.yaml");
12
+ }
package/src/cli.ts CHANGED
@@ -21,6 +21,7 @@ import { createInterface } from "node:readline";
21
21
  import { ensureTrayRuntime } from "./cli/tray/trayRuntime.js";
22
22
  import { initTray, killTray } from "./cli/tray/tray.js";
23
23
  import { enableAutoStart } from "./cli/tray/autostart.js";
24
+ import { getDataDir, getConfigPath } from "./appDirs.js";
24
25
 
25
26
  const root = resolve(dirname(fileURLToPath(import.meta.url)), "..");
26
27
  const dashboardDir = join(root, "dashboard");
@@ -79,7 +80,7 @@ const generatedPw = !process.env.AIGETWEY_ADMIN_PASSWORD;
79
80
  */
80
81
  function loadOrCreateSessionSecret(): string {
81
82
  if (process.env.SESSION_SECRET) return process.env.SESSION_SECRET;
82
- const dataDir = resolve(process.env.AIGETWEY_DATA_DIR ?? join(root, "data"));
83
+ const dataDir = getDataDir();
83
84
  const file = join(dataDir, "session-secret");
84
85
  try {
85
86
  const existing = readFileSync(file, "utf8").trim();
@@ -232,8 +233,8 @@ function spawnGateway(): ChildProcess {
232
233
  ...process.env,
233
234
  AIGETWEY_ADMIN_PASSWORD: adminPassword,
234
235
  AIGETWEY_PORT: String(GATEWAY_PORT),
235
- // single-URL mode: the gateway reverse-proxies the dashboard, so the whole
236
- // app lives on the gateway port.
236
+ AIGETWEY_DATA_DIR: getDataDir(),
237
+ AIGETWEY_CONFIG: getConfigPath(),
237
238
  AIGETWEY_DASHBOARD_PORT: String(DASHBOARD_PORT),
238
239
  },
239
240
  });
@@ -265,10 +266,32 @@ function spawnDashboard(): ChildProcess {
265
266
  * normal runs pay nothing.
266
267
  */
267
268
  function ensureSetup(): void {
268
- if (!existsSync(join(root, "config.yaml")) && existsSync(join(root, "config.example.yaml"))) {
269
- copyFileSync(join(root, "config.example.yaml"), join(root, "config.yaml"));
270
- console.log(" seeded config.yaml from the example — add providers via the dashboard or edit it directly.");
269
+ const configPath = getConfigPath();
270
+ const dataDir = getDataDir();
271
+ mkdirSync(dataDir, { recursive: true });
272
+
273
+ // migrate: copy old config + auth from inside the npm package dir on first run
274
+ if (!existsSync(configPath)) {
275
+ const oldConfig = join(root, "config.yaml");
276
+ const src = existsSync(oldConfig) ? oldConfig : join(root, "config.example.yaml");
277
+ if (existsSync(src)) {
278
+ copyFileSync(src, configPath);
279
+ if (existsSync(oldConfig)) {
280
+ console.log(` migrated config.yaml → ${configPath}`);
281
+ } else {
282
+ console.log(" seeded config.yaml — add providers via the dashboard or edit it directly.");
283
+ }
284
+ }
285
+ }
286
+ // migrate auth.json + session-secret from old data/ dir if present
287
+ for (const f of ["auth.json", "session-secret"]) {
288
+ const dest = join(dataDir, f);
289
+ const old = join(root, "data", f);
290
+ if (!existsSync(dest) && existsSync(old)) {
291
+ copyFileSync(old, dest);
292
+ }
271
293
  }
294
+
272
295
  if (!existsSync(join(root, "node_modules"))) {
273
296
  console.log(" installing gateway dependencies (first run)…");
274
297
  execSync("npm install --omit=dev --no-fund --no-audit", { cwd: root, stdio: "inherit" });
@@ -327,7 +350,13 @@ function hideToTray(): void {
327
350
  const bg = spawn(cmd, args, {
328
351
  detached: true,
329
352
  stdio: "ignore",
330
- env: { ...process.env, AIGETWEY_ADMIN_PASSWORD: adminPassword, SESSION_SECRET: sessionSecret },
353
+ env: {
354
+ ...process.env,
355
+ AIGETWEY_ADMIN_PASSWORD: adminPassword,
356
+ SESSION_SECRET: sessionSecret,
357
+ AIGETWEY_DATA_DIR: getDataDir(),
358
+ AIGETWEY_CONFIG: getConfigPath(),
359
+ },
331
360
  });
332
361
  bg.unref();
333
362
  console.log(` aigetwey now running in the background (pid ${bg.pid}).`);
package/src/config.ts CHANGED
@@ -558,6 +558,18 @@ export function editProviderKey(
558
558
  return next;
559
559
  }
560
560
 
561
+ /** Move a provider from one position to another in the providers array. */
562
+ export function reorderProvider(config: Config, from: number, to: number): Config {
563
+ const next = cloneConfig(config);
564
+ const n = next.providers.length;
565
+ if (from < 0 || from >= n) throw new Error(`from index ${from} out of range`);
566
+ if (to < 0 || to >= n) throw new Error(`to index ${to} out of range`);
567
+ if (from === to) return next;
568
+ const [moved] = next.providers.splice(from, 1);
569
+ next.providers.splice(to, 0, moved!);
570
+ return next;
571
+ }
572
+
561
573
  /** Swap a provider key from one index to another, preserving names. */
562
574
  export function reorderProviderKey(config: Config, id: string, from: number, to: number): Config {
563
575
  const next = cloneConfig(config);
@@ -72,14 +72,14 @@ function recordUsage(
72
72
  const tokensOut = usage?.completion_tokens ?? 0;
73
73
  const reasoningTokens = usage?.reasoning_tokens ?? 0;
74
74
  const cachedTokens = usage?.cached_tokens ?? 0;
75
+ const cacheCreationTokens = usage?.cache_creation_tokens ?? 0;
75
76
  if (!deps.db) return;
76
- // Cost: a combo/route may set explicit prices; otherwise fall back to the ported
77
- // aigetwey pricing table so cost auto-resolves per model instead of showing $0.
78
77
  const pricing = getPricingForModel(route.provider.id, route.model);
79
78
  const priceIn = route.price_in ?? pricing?.input;
80
79
  const priceOut = route.price_out ?? pricing?.output;
81
80
  const priceCachedRead = pricing?.cached;
82
81
  const priceReasoning = pricing?.reasoning;
82
+ const priceCacheCreation = pricing?.cache_creation;
83
83
  deps.db.record({
84
84
  alias: route.alias,
85
85
  provider: route.provider.id,
@@ -88,7 +88,7 @@ function recordUsage(
88
88
  tokens_out: tokensOut,
89
89
  reasoning_tokens: reasoningTokens,
90
90
  cached_tokens: cachedTokens,
91
- cost: computeCost(tokensIn, tokensOut, priceIn, priceOut, priceReasoning, priceCachedRead, cachedTokens, reasoningTokens),
91
+ cost: computeCost(tokensIn, tokensOut, priceIn, priceOut, priceReasoning, priceCachedRead, cachedTokens, reasoningTokens, cacheCreationTokens, priceCacheCreation),
92
92
  status,
93
93
  latency_ms: latencyMs,
94
94
  stream: stream ? 1 : 0,
package/src/db.ts CHANGED
@@ -302,27 +302,45 @@ export class UsageDB {
302
302
  }
303
303
 
304
304
  /** Compute USD cost from token counts and per-1M prices. Separate rates for input (non-cache), cache_read, output, reasoning. */
305
- export function computeCost(tokensIn: number, tokensOut: number, priceIn?: number, priceOut?: number, priceReasoning?: number, priceCachedRead?: number, cachedTokens?: number, reasoningTokens?: number): number {
305
+ export function computeCost(
306
+ tokensIn: number,
307
+ tokensOut: number,
308
+ priceIn?: number,
309
+ priceOut?: number,
310
+ priceReasoning?: number,
311
+ priceCachedRead?: number,
312
+ cachedTokens?: number,
313
+ reasoningTokens?: number,
314
+ cacheCreationTokens?: number,
315
+ priceCacheCreation?: number,
316
+ ): number {
306
317
  let cost = 0;
307
318
 
308
- // Non-cached input (input minus cache_read)
319
+ // Non-cached input (input minus cache_read; cache_creation is billed separately)
309
320
  const nonCachedInput = Math.max(0, tokensIn - (cachedTokens ?? 0));
310
321
  if (priceIn) cost += (nonCachedInput / 1_000_000) * priceIn;
311
322
 
312
- // Cached read — uses separate rate or falls back to input rate
323
+ // Cache read — cheaper rate
313
324
  if (cachedTokens && priceCachedRead) {
314
325
  cost += (cachedTokens / 1_000_000) * priceCachedRead;
315
326
  } else if (cachedTokens && priceIn) {
316
327
  cost += (cachedTokens / 1_000_000) * priceIn;
317
328
  }
318
329
 
319
- // Output completion
320
- if (priceOut) cost += (tokensOut / 1_000_000) * priceOut;
330
+ // Cache creation — typically 1.25x regular input rate
331
+ if (cacheCreationTokens) {
332
+ const rate = priceCacheCreation ?? priceIn;
333
+ if (rate) cost += (cacheCreationTokens / 1_000_000) * rate;
334
+ }
321
335
 
322
- // Reasoning tokens uses dedicated rate or falls back to output rate
323
- if (reasoningTokens) {
324
- if (priceReasoning) cost += (reasoningTokens / 1_000_000) * priceReasoning;
325
- else if (priceOut) cost += (reasoningTokens / 1_000_000) * priceOut;
336
+ // Output: reasoning tokens are a subset of completion_tokens (providers include them).
337
+ // Bill non-reasoning at priceOut, reasoning at priceReasoning to avoid double-count.
338
+ const reasoning = reasoningTokens ?? 0;
339
+ const nonReasoningOut = Math.max(0, tokensOut - reasoning);
340
+ if (priceOut) cost += (nonReasoningOut / 1_000_000) * priceOut;
341
+ if (reasoning) {
342
+ const rate = priceReasoning ?? priceOut;
343
+ if (rate) cost += (reasoning / 1_000_000) * rate;
326
344
  }
327
345
 
328
346
  return cost;
@@ -8,8 +8,9 @@ import fs from "node:fs";
8
8
  import path from "node:path";
9
9
  import { spawn } from "node:child_process";
10
10
  import { findHeadroomBinary } from "./detect.js";
11
+ import { getDataDir } from "../appDirs.js";
11
12
 
12
- const DATA_DIR = path.resolve(process.env.AIGETWEY_DATA_DIR ?? "data");
13
+ const DATA_DIR = getDataDir();
13
14
  const HEADROOM_DIR = path.join(DATA_DIR, "headroom");
14
15
  const PID_FILE = path.join(HEADROOM_DIR, "proxy.pid");
15
16
  const LOG_FILE = path.join(HEADROOM_DIR, "proxy.log");
@@ -27,6 +27,7 @@ import {
27
27
  addProviderKey,
28
28
  removeProviderKey,
29
29
  editProviderKey,
30
+ reorderProvider,
30
31
  reorderProviderKey,
31
32
  toggleProviderKey,
32
33
  setProviderStrategy,
@@ -305,6 +306,14 @@ export function registerAdminRoutes(app: FastifyInstance, deps: AdminDeps): void
305
306
  applyMutation(reply, (c) => removeProviderKey(c, id, i));
306
307
  });
307
308
 
309
+ app.put("/admin/providers/reorder", requireAdmin, (req, reply) => {
310
+ const b = req.body as { from?: number; to?: number };
311
+ if (!Number.isInteger(b?.from) || !Number.isInteger(b?.to)) {
312
+ return reply.code(400).send({ error: "from and to must be integers" });
313
+ }
314
+ applyMutation(reply, (c) => reorderProvider(c, b.from!, b.to!));
315
+ });
316
+
308
317
  app.put("/admin/providers/:id/keys/reorder", requireAdmin, (req, reply) => {
309
318
  const { id } = req.params as { id: string };
310
319
  const b = req.body as { from?: number; to?: number };
package/src/server.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import Fastify from "fastify";
2
2
  import { resolve, join } from "node:path";
3
3
  import { loadConfig } from "./config.js";
4
+ import { getDataDir, getConfigPath } from "./appDirs.js";
4
5
  import { registerRoutes } from "./routes/index.js";
5
6
  import { GatewayState } from "./core/state.js";
6
7
  import { UsageDB } from "./db.js";
@@ -8,7 +9,7 @@ import { AuthStore } from "./core/authStore.js";
8
9
  import { consoleBuffer } from "./core/console-buffer.js";
9
10
 
10
11
  async function main(): Promise<void> {
11
- const configPath = resolve(process.env.AIGETWEY_CONFIG ?? "config.yaml");
12
+ const configPath = getConfigPath();
12
13
 
13
14
  let config;
14
15
  try {
@@ -47,8 +48,7 @@ async function main(): Promise<void> {
47
48
  bodyLimit: 32 * 1024 * 1024,
48
49
  });
49
50
 
50
- // unified data dir (default ./data); usage tracking lives here.
51
- const dataDir = resolve(process.env.AIGETWEY_DATA_DIR ?? "data");
51
+ const dataDir = getDataDir();
52
52
  const db = new UsageDB(join(dataDir, "usage.sqlite"));
53
53
 
54
54
  // holder enables runtime config edits (hot-reload) from the dashboard.
@@ -62,11 +62,14 @@ export async function* streamToCanonical(events: AsyncIterable<SSEEvent>): Async
62
62
  state.model = message?.model ?? "";
63
63
  const u = message?.usage;
64
64
  if (u) {
65
- state.promptTokens = u.input_tokens ?? 0;
65
+ const cacheRead = u.cache_read_input_tokens ?? 0;
66
+ const cacheCreate = u.cache_creation_input_tokens ?? 0;
67
+ // total input = non-cached + cache_read + cache_creation (all tokens model processed)
68
+ state.promptTokens = (u.input_tokens ?? 0) + cacheRead + cacheCreate;
66
69
  state.completionTokens = u.output_tokens ?? 0;
67
70
  state.reasoningTokens = u.thinking_tokens ?? 0;
68
- state.cachedTokens = u.cache_read_input_tokens;
69
- state.cacheCreationTokens = u.cache_creation_input_tokens;
71
+ state.cachedTokens = cacheRead || undefined;
72
+ state.cacheCreationTokens = cacheCreate || undefined;
70
73
  }
71
74
  const startChunk = baseChunk(state, { role: "assistant", content: "" }, null);
72
75
  startChunk.usage = {
Binary file
@@ -1,3 +0,0 @@
1
- module.exports=[88644,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"InvariantError",{enumerable:!0,get:function(){return d}});class d extends Error{constructor(a,b){super(`Invariant: ${a.endsWith(".")?a:a+"."} This is a bug in Next.js.`,b),this.name="InvariantError"}}},39118,(a,b,c)=>{"use strict";Object.defineProperty(c,"__esModule",{value:!0});var d={DEFAULT_SEGMENT_KEY:function(){return l},NOT_FOUND_SEGMENT_KEY:function(){return m},PAGE_SEGMENT_KEY:function(){return k},addSearchParamsIfPageSegment:function(){return i},computeSelectedLayoutSegment:function(){return j},getSegmentValue:function(){return f},getSelectedLayoutSegmentPath:function(){return function a(b,c,d=!0,e=[]){let g;if(d)g=b[1][c];else{let a=b[1];g=a.children??Object.values(a)[0]}if(!g)return e;let h=f(g[0]);return!h||h.startsWith(k)?e:(e.push(h),a(g,c,!1,e))}},isGroupSegment:function(){return g},isParallelRouteSegment:function(){return h}};for(var e in d)Object.defineProperty(c,e,{enumerable:!0,get:d[e]});function f(a){return Array.isArray(a)?a[1]:a}function g(a){return"("===a[0]&&a.endsWith(")")}function h(a){return a.startsWith("@")&&"@children"!==a}function i(a,b){if(a.includes(k)){let a=JSON.stringify(b);return"{}"!==a?k+"?"+a:k}return a}function j(a,b){if(!a||0===a.length)return null;let c="children"===b?a[0]:a[a.length-1];return c===l?null:c}let k="__PAGE__",l="__DEFAULT__",m="/_not-found"},54427,(a,b,c)=>{"use strict";function d(){let a,b,c=new Promise((c,d)=>{a=c,b=d});return{resolve:a,reject:b,promise:c}}Object.defineProperty(c,"__esModule",{value:!0}),Object.defineProperty(c,"createPromiseWithResolvers",{enumerable:!0,get:function(){return d}})},7078,a=>{"use strict";var b=a.i(87924);let c={primary:"bg-accent text-accent-ink shadow-warm hover:bg-accent-hover border border-transparent font-semibold",ghost:"bg-transparent text-text-muted border border-border hover:text-text hover:border-text-subtle",danger:"bg-transparent text-text-muted border border-border hover:text-danger hover:border-danger/50"};a.s(["Button",0,function({variant:a="primary",className:d,...e}){return(0,b.jsx)("button",{className:`inline-flex items-center justify-center gap-1.5 rounded-brand px-3.5 py-2 text-[13px] font-medium transition-colors duration-150 cursor-pointer disabled:opacity-45 disabled:cursor-not-allowed ${c[a]}${d?` ${d}`:""}`,...e})},"Field",0,function({label:a,hint:c,children:d}){return(0,b.jsxs)("label",{className:"flex flex-col gap-1.5",children:[(0,b.jsxs)("span",{className:"text-[11px] font-medium uppercase tracking-wider text-text-subtle",children:[a,c&&(0,b.jsxs)("span",{className:"ml-1.5 lowercase tracking-normal text-text-subtle/70",children:["· ",c]})]}),d]})},"Input",0,function({className:a,...c}){return(0,b.jsx)("input",{className:`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text placeholder:text-text-subtle focus:border-accent focus:outline-none transition-colors${a?` ${a}`:""}`,...c})},"Select",0,function({className:a,...c}){return(0,b.jsx)("select",{className:`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text focus:border-accent focus:outline-none transition-colors${a?` ${a}`:""}`,...c})}])},56173,a=>{"use strict";async function b(a,b,c){let d;try{d=await fetch(`/api/gw${b}`,{method:a,headers:void 0!==c?{"content-type":"application/json"}:{},body:void 0!==c?JSON.stringify(c):void 0})}catch(a){return{ok:!1,status:0,data:null,error:a.message}}let e=await d.text(),f=null;try{f=e?JSON.parse(e):null}catch{f=null}if(!d.ok){let a=f?.error??`request failed (${d.status})`;return{ok:!1,status:d.status,data:f,error:a}}return{ok:!0,status:d.status,data:f}}async function c(a,b,c){let d;try{d=await fetch(b,{method:a,headers:void 0!==c?{"content-type":"application/json"}:{},body:void 0!==c?JSON.stringify(c):void 0})}catch(a){return{ok:!1,status:0,data:null,error:a.message}}let e=await d.text(),f=e?JSON.parse(e):null;if(!d.ok){let a=f?.error??`request failed (${d.status})`;return{ok:!1,status:d.status,data:f,error:a}}return{ok:!0,status:d.status,data:f}}a.s(["account",0,{changePassword:(a,b)=>c("POST","/api/password",{current:a,next:b})},"adminApi",0,{providers:()=>b("GET","/admin/providers"),budgets:()=>b("GET","/admin/budgets"),models:()=>b("GET","/admin/models"),keys:()=>b("GET","/admin/keys"),keysUsage:()=>b("GET","/admin/keys/usage"),setBudget:a=>b("PUT","/admin/budgets",a),clearBudget:a=>b("DELETE",`/admin/budgets/${encodeURIComponent(a)}`),addProvider:a=>b("POST","/admin/providers",a),editProvider:(a,c)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}`,c),renameProvider:(a,c)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/rename`,{id:c}),removeProvider:a=>b("DELETE",`/admin/providers/${encodeURIComponent(a)}`),addKey:(a,c,d)=>b("POST",`/admin/providers/${encodeURIComponent(a)}/keys`,{key:c,name:d}),editKey:(a,c,d)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/keys/${c}`,d),removeKey:(a,c)=>b("DELETE",`/admin/providers/${encodeURIComponent(a)}/keys/${c}`),revealKey:(a,c)=>b("GET",`/admin/providers/${encodeURIComponent(a)}/keys/${c}/reveal`),addModel:(a,c,d)=>b("POST",`/admin/providers/${encodeURIComponent(a)}/models`,{model:c,...d}),addModels:(a,c)=>b("POST",`/admin/providers/${encodeURIComponent(a)}/models`,{models:c}),removeModel:(a,c)=>b("DELETE",`/admin/providers/${encodeURIComponent(a)}/models?model=${encodeURIComponent(c)}`),clearModels:a=>b("DELETE",`/admin/providers/${encodeURIComponent(a)}/models`),pricing:()=>b("GET","/admin/pricing"),setModelPrice:(a,c,d)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/models/price`,{model:c,...d}),testProvider:a=>b("POST",`/admin/providers/${encodeURIComponent(a)}/test`),testKey:(a,c)=>b("POST",`/admin/providers/${encodeURIComponent(a)}/keys/${c}/test`),testModel:(a,c)=>b("POST",`/admin/providers/${encodeURIComponent(a)}/models/test?model=${encodeURIComponent(c)}`),validateProvider:a=>b("POST","/admin/providers/validate",a),discoverModels:a=>b("POST",`/admin/providers/${encodeURIComponent(a)}/connect`),reorderKey:(a,c,d)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/keys/reorder`,{from:c,to:d}),toggleKey:(a,c,d)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/keys/${c}/toggle`,{enabled:d}),setProviderStrategy:(a,c,d)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/strategy`,{strategy:c,sticky:d}),setProviderDisabled:(a,c)=>b("PUT",`/admin/providers/${encodeURIComponent(a)}/disabled`,{disabled:c}),setRoute:(a,c)=>b("PUT",`/admin/routes/${encodeURIComponent(a)}`,c),removeRoute:a=>b("DELETE",`/admin/routes/${encodeURIComponent(a)}`),endpoint:()=>b("GET","/admin/endpoint"),setRtk:a=>b("PUT","/admin/endpoint/rtk",{enabled:a}),setCaveman:a=>b("PUT","/admin/endpoint/caveman",{level:a}),setPonytail:a=>b("PUT","/admin/endpoint/ponytail",{level:a}),addServerKey:(a,c)=>b("POST","/admin/endpoint/keys",{key:a,name:c}),editServerKey:(a,c)=>b("PUT",`/admin/endpoint/keys/${a}`,{name:c}),setServerKeyScope:(a,c)=>b("PUT",`/admin/endpoint/keys/${a}/scope`,c),removeServerKey:a=>b("DELETE",`/admin/endpoint/keys/${a}`),revealServerKey:a=>b("GET",`/admin/endpoint/keys/${a}/reveal`),setHeadroom:a=>b("PUT","/admin/endpoint/headroom",a),headroomStatus:()=>b("GET","/admin/headroom/status"),headroomStart:()=>b("POST","/admin/headroom/start"),headroomStop:()=>b("POST","/admin/headroom/stop"),putConfig:a=>b("PUT","/admin/config",{text:a}),version:()=>b("GET","/admin/version"),shutdown:()=>b("POST","/admin/shutdown")},"cliConfig",0,{status:a=>c("GET",`/api/cli-detect/${encodeURIComponent(a)}`),apply:(a,b)=>c("POST",`/api/cli-detect/${encodeURIComponent(a)}`,b),reset:a=>c("DELETE",`/api/cli-detect/${encodeURIComponent(a)}`)}])},73858,a=>{"use strict";var b=a.i(87924),c=a.i(7078),d=a.i(93026);a.s(["ConfirmModal",0,function({title:a,message:e,confirmLabel:f="Delete",onConfirm:g,onCancel:h,busy:i}){return(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6",onClick:h,children:(0,b.jsxs)("div",{className:"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated",onClick:a=>a.stopPropagation(),children:[(0,b.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,b.jsx)("span",{className:"flex h-7 w-7 items-center justify-center rounded-full bg-danger/10 text-danger",children:(0,b.jsx)(d.Icon,{name:"warning",size:16})}),(0,b.jsx)("h2",{className:"text-[15px] font-semibold text-text",children:a})]}),(0,b.jsx)("p",{className:"mb-4 text-[12.5px] text-text-muted",children:e}),(0,b.jsxs)("div",{className:"flex justify-end gap-2",children:[(0,b.jsx)(c.Button,{variant:"ghost",onClick:h,children:"Cancel"}),(0,b.jsx)(c.Button,{variant:"danger",disabled:i,onClick:g,children:f})]})]})})}])},68862,a=>{"use strict";var b=a.i(87924),c=a.i(38246),d=a.i(50944),e=a.i(93026);let f=[{href:"/",label:"Endpoint & Key",icon:"api"},{href:"/providers",label:"Providers",icon:"dns"},{href:"/combos",label:"Combos",icon:"layers"},{href:"/usage",label:"Usage",icon:"bar_chart"},{href:"/quota",label:"Budgets",icon:"data_usage"},{href:"/tools",label:"CLI Tools",icon:"terminal"}],g=[{href:"/console",label:"Server Console",icon:"terminal"},{href:"/config",label:"Settings",icon:"settings"}];a.s(["Rail",0,function(){let a=(0,d.usePathname)(),h=(0,d.useRouter)();async function i(){await fetch("/api/logout",{method:"POST"}),h.replace("/login"),h.refresh()}let j=d=>{let f,g="/"===(f=d.href)?"/"===a||a.startsWith("/endpoint"):a===f||a.startsWith(`${f}/`);return(0,b.jsx)(c.default,{href:d.href,"data-label":d.label,className:`rail-icon${g?" rail-icon-active":""}`,"aria-label":d.label,children:(0,b.jsx)(e.Icon,{name:d.icon,size:20,fill:g})},d.href)};return(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(c.default,{href:"/",className:"rail-brand","aria-label":"aigetwey",children:(0,b.jsxs)("svg",{viewBox:"0 0 512 512",width:"26",height:"26","aria-hidden":!0,children:[(0,b.jsx)("text",{x:"120",y:"338",fontFamily:"ui-sans-serif, Arial, sans-serif",fontSize:"260",fontWeight:"800",textAnchor:"middle",fill:"#14140f",children:"a"}),(0,b.jsxs)("g",{fill:"none",stroke:"#14140f",strokeWidth:"34",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,b.jsx)("polyline",{points:"276,182 352,256 276,330"}),(0,b.jsx)("polyline",{points:"346,182 422,256 346,330"})]})]})}),(0,b.jsxs)("nav",{className:"flex flex-col items-center gap-3",children:[f.map(j),(0,b.jsx)("div",{className:"rail-divider"}),g.map(j)]}),(0,b.jsx)("button",{onClick:i,"data-label":"Disconnect",className:"rail-icon","aria-label":"Disconnect",children:(0,b.jsx)(e.Icon,{name:"logout",size:19})})]})}])},8255,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(50944),e=a.i(93026),f=a.i(1221),g=a.i(73858),h=a.i(56173);let i={"":"Endpoint & Key",endpoint:"Endpoint & Key",providers:"Providers",combos:"Combos",usage:"Usage",quota:"Budgets",tools:"CLI Tools",console:"Server Console",config:"Settings"};function j({version:a}){let[d,f]=(0,c.useState)(!1),g=`npm install -g aigetwey@${a}`;return(0,b.jsx)("button",{onClick:()=>{navigator.clipboard.writeText(g).then(()=>{f(!0),setTimeout(()=>f(!1),1800)})},className:"flex h-6 w-6 items-center justify-center rounded-full text-warning/70 transition-colors hover:bg-warning/10 hover:text-warning",title:`Copy: ${g}`,children:(0,b.jsx)(e.Icon,{name:d?"check":"content_copy",size:13})})}a.s(["TopBar",0,function(){let a=(0,d.usePathname)(),{theme:k,toggle:l}=(0,f.useTheme)(),m="/"===a?"":a.split("/")[1]??"",n=i[m]??m,[o,p]=(0,c.useState)(null),[q,r]=(0,c.useState)(!1),[s,t]=(0,c.useState)(!1),[u,v]=(0,c.useState)(!1);async function w(){v(!0),await h.adminApi.shutdown(),t(!0),r(!1),v(!1)}return(0,c.useEffect)(()=>{h.adminApi.version().then(a=>{a.ok&&a.data&&p(a.data)})},[]),(0,b.jsxs)("header",{className:"console-topbar",children:[(0,b.jsxs)("div",{className:"flex items-center gap-2 text-[13px]",children:[(0,b.jsx)("span",{className:"text-text-subtle",children:"aigetwey"}),(0,b.jsx)("span",{className:"text-text-subtle",children:"/"}),(0,b.jsx)("span",{className:"font-medium text-text",children:n})]}),(0,b.jsxs)("div",{className:"ml-auto flex items-center gap-2.5",children:[o&&(o.updateAvailable?(0,b.jsxs)("div",{className:"flex items-center gap-1",children:[(0,b.jsxs)("a",{href:"https://github.com/xk1ko/aigetwey/releases",target:"_blank",rel:"noopener noreferrer",className:"flex items-center gap-1.5 rounded-full border border-warning/30 bg-warning/10 px-2.5 py-1 text-[11px] font-medium text-warning transition-colors hover:bg-warning/20",title:`Update available — v${o.latest} is out (you have v${o.current})`,children:[(0,b.jsx)(e.Icon,{name:"arrow_upward",size:12}),"v",o.latest," available"]}),(0,b.jsx)(j,{version:o.latest})]}):(0,b.jsxs)("span",{className:"text-[11px] text-text-subtle",title:"You're on the latest version",children:["v",o.current]})),(0,b.jsx)("button",{onClick:l,className:"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-text","aria-label":"Toggle theme",title:"dark"===k?"Switch to light mode":"Switch to dark mode",children:(0,b.jsx)(e.Icon,{name:"dark"===k?"light_mode":"dark_mode",size:18})}),(0,b.jsx)("button",{onClick:()=>r(!0),className:"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-danger","aria-label":"Shut down gateway",title:"Shut down the gateway",children:(0,b.jsx)(e.Icon,{name:"power_settings_new",size:18})}),(0,b.jsxs)("div",{className:"flex items-center gap-2 rounded-full border border-border bg-surface py-1 pl-1 pr-3",children:[(0,b.jsx)("span",{className:"flex h-6 w-6 items-center justify-center rounded-full bg-accent text-[11px] font-bold text-accent-ink",children:"A"}),(0,b.jsx)("span",{className:"text-[12px] text-text-muted",children:"admin"})]})]}),q&&(0,b.jsx)(g.ConfirmModal,{title:"Shut down gateway?",message:"The gateway process will stop and all requests will fail until you restart it (run.sh). The dashboard stays up but can't reach the gateway.",confirmLabel:"Shut down",busy:u,onConfirm:w,onCancel:()=>r(!1)}),s&&(0,b.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/70 p-6",children:(0,b.jsxs)("div",{className:"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 text-center shadow-elevated",children:[(0,b.jsx)("span",{className:"mx-auto mb-2 flex h-9 w-9 items-center justify-center rounded-full bg-danger/10 text-danger",children:(0,b.jsx)(e.Icon,{name:"power_settings_new",size:20})}),(0,b.jsx)("h2",{className:"text-[15px] font-semibold text-text",children:"Gateway stopped"}),(0,b.jsxs)("p",{className:"mt-1 text-[12.5px] text-text-muted",children:["Restart it with ",(0,b.jsx)("code",{className:"rounded bg-surface-2 px-1",children:"run.sh"}),", then reload this page."]})]})})]})}])}];
2
-
3
- //# sourceMappingURL=_1jt-_lv._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../node_modules/next/src/shared/lib/invariant-error.ts","../../../../node_modules/next/src/shared/lib/segment.ts","../../../../node_modules/next/src/shared/lib/promise-with-resolvers.ts","../../../../src/components/Button.tsx","../../../../src/lib/client.ts","../../../../src/components/ConfirmModal.tsx","../../../../src/components/Rail.tsx","../../../../src/components/TopBar.tsx"],"sourcesContent":["export class InvariantError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(\n `Invariant: ${message.endsWith('.') ? message : message + '.'} This is a bug in Next.js.`,\n options\n )\n this.name = 'InvariantError'\n }\n}\n","import type { FlightRouterState, Segment } from './app-router-types'\n\nexport function getSegmentValue(segment: Segment) {\n return Array.isArray(segment) ? segment[1] : segment\n}\n\nexport function isGroupSegment(segment: string) {\n // Use array[0] for performant purpose\n return segment[0] === '(' && segment.endsWith(')')\n}\n\nexport function isParallelRouteSegment(segment: string) {\n return segment.startsWith('@') && segment !== '@children'\n}\n\nexport function addSearchParamsIfPageSegment(\n segment: Segment,\n searchParams: Record<string, string | string[] | undefined>\n) {\n const isPageSegment = segment.includes(PAGE_SEGMENT_KEY)\n\n if (isPageSegment) {\n const stringifiedQuery = JSON.stringify(searchParams)\n return stringifiedQuery !== '{}'\n ? PAGE_SEGMENT_KEY + '?' + stringifiedQuery\n : PAGE_SEGMENT_KEY\n }\n\n return segment\n}\n\nexport function computeSelectedLayoutSegment(\n segments: string[] | null,\n parallelRouteKey: string\n): string | null {\n if (!segments || segments.length === 0) {\n return null\n }\n\n // For 'children', use first segment; for other parallel routes, use last segment\n const rawSegment =\n parallelRouteKey === 'children'\n ? segments[0]\n : segments[segments.length - 1]\n\n // If the default slot is showing, return null since it's not technically \"selected\" (it's a fallback)\n // Returning an internal value like `__DEFAULT__` would be confusing\n return rawSegment === DEFAULT_SEGMENT_KEY ? null : rawSegment\n}\n\n/** Get the canonical parameters from the current level to the leaf node. */\nexport function getSelectedLayoutSegmentPath(\n tree: FlightRouterState,\n parallelRouteKey: string,\n first = true,\n segmentPath: string[] = []\n): string[] {\n let node: FlightRouterState\n if (first) {\n // Use the provided parallel route key on the first parallel route\n node = tree[1][parallelRouteKey]\n } else {\n // After first parallel route prefer children, if there's no children pick the first parallel route.\n const parallelRoutes = tree[1]\n node = parallelRoutes.children ?? Object.values(parallelRoutes)[0]\n }\n\n if (!node) return segmentPath\n const segment = node[0]\n\n let segmentValue = getSegmentValue(segment)\n\n if (!segmentValue || segmentValue.startsWith(PAGE_SEGMENT_KEY)) {\n return segmentPath\n }\n\n segmentPath.push(segmentValue)\n\n return getSelectedLayoutSegmentPath(\n node,\n parallelRouteKey,\n false,\n segmentPath\n )\n}\n\nexport const PAGE_SEGMENT_KEY = '__PAGE__'\nexport const DEFAULT_SEGMENT_KEY = '__DEFAULT__'\nexport const NOT_FOUND_SEGMENT_KEY = '/_not-found'\n","export function createPromiseWithResolvers<T>(): PromiseWithResolvers<T> {\n // Shim of Stage 4 Promise.withResolvers proposal\n let resolve: (value: T | PromiseLike<T>) => void\n let reject: (reason: any) => void\n const promise = new Promise<T>((res, rej) => {\n resolve = res\n reject = rej\n })\n return { resolve: resolve!, reject: reject!, promise }\n}\n","import type { ButtonHTMLAttributes } from \"react\";\n\ntype Variant = \"primary\" | \"ghost\" | \"danger\";\n\nconst VARIANTS: Record<Variant, string> = {\n primary: \"bg-accent text-accent-ink shadow-warm hover:bg-accent-hover border border-transparent font-semibold\",\n ghost: \"bg-transparent text-text-muted border border-border hover:text-text hover:border-text-subtle\",\n danger: \"bg-transparent text-text-muted border border-border hover:text-danger hover:border-danger/50\",\n};\n\nexport function Button({\n variant = \"primary\",\n className,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { variant?: Variant }) {\n return (\n <button\n className={`inline-flex items-center justify-center gap-1.5 rounded-brand px-3.5 py-2 text-[13px] font-medium transition-colors duration-150 cursor-pointer disabled:opacity-45 disabled:cursor-not-allowed ${VARIANTS[variant]}${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Input({ className, ...props }: React.InputHTMLAttributes<HTMLInputElement>) {\n return (\n <input\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text placeholder:text-text-subtle focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Select({ className, ...props }: React.SelectHTMLAttributes<HTMLSelectElement>) {\n return (\n <select\n className={`w-full rounded-brand border border-border bg-bg px-3 py-2 text-[13px] text-text focus:border-accent focus:outline-none transition-colors${className ? ` ${className}` : \"\"}`}\n {...props}\n />\n );\n}\n\nexport function Field({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <label className=\"flex flex-col gap-1.5\">\n <span className=\"text-[11px] font-medium uppercase tracking-wider text-text-subtle\">\n {label}\n {hint && <span className=\"ml-1.5 lowercase tracking-normal text-text-subtle/70\">· {hint}</span>}\n </span>\n {children}\n </label>\n );\n}\n","\"use client\";\n\n/**\n * Browser-side admin client. Talks to the gateway THROUGH the same-origin proxy\n * (`/api/gw/admin/...`), which injects the admin Bearer server-side — so the\n * password never reaches the browser. Server components read initial data via\n * lib/gateway.ts directly; client components mutate through here.\n */\nimport type {\n BudgetStatus,\n ConfigReply,\n EndpointPayload,\n HeadroomStatusReply,\n InjectLevel,\n KeyUsageRow,\n ModelsPayload,\n PingResult,\n PricingPayload,\n ProviderSnapshot,\n WireFormat,\n} from \"./gateway\";\n\nexport interface ApiResult<T> {\n ok: boolean;\n status: number;\n data: T | null;\n error?: string;\n}\n\nasync function api<T>(method: string, path: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(`/api/gw${path}`, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n let data: T | null = null;\n try {\n data = text ? (JSON.parse(text) as T) : null;\n } catch {\n data = null;\n }\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\nexport const adminApi = {\n providers: () => api<{ providers: ProviderSnapshot[] }>(\"GET\", \"/admin/providers\"),\n budgets: () => api<{ budgets: BudgetStatus[] }>(\"GET\", \"/admin/budgets\"),\n models: () => api<ModelsPayload>(\"GET\", \"/admin/models\"),\n keys: () => api<Array<{ fingerprint: string; name: string; masked: string }>>(\"GET\", \"/admin/keys\"),\n keysUsage: () => api<{ keys: KeyUsageRow[] }>(\"GET\", \"/admin/keys/usage\"),\n\n setBudget: (body: {\n scope: { type: \"global\" } | { type: \"provider\"; id: string } | { type: \"model\"; id: string } | { type: \"key\"; id: string };\n unit: \"usd\" | \"tokens\";\n limit: number;\n window: \"5h\" | \"24h\" | \"7day\" | \"30day\";\n alert_at?: number;\n note?: string;\n }) => api<ConfigReply>(\"PUT\", \"/admin/budgets\", body),\n clearBudget: (key: string) => api<ConfigReply>(\"DELETE\", `/admin/budgets/${encodeURIComponent(key)}`),\n\n addProvider: (p: {\n id: string;\n format: WireFormat;\n base_url: string;\n api_key?: string;\n free?: boolean;\n auto_models?: boolean;\n service_account?: string;\n }) => api<ConfigReply>(\"POST\", \"/admin/providers\", p),\n editProvider: (id: string, patch: { base_url?: string; format?: WireFormat; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}`, patch),\n renameProvider: (id: string, newId: string) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/rename`, { id: newId }),\n removeProvider: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}`),\n addKey: (id: string, key: string, name?: string) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys`, { key, name }),\n editKey: (id: string, index: number, patch: { key?: string; name?: string }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`, patch),\n removeKey: (id: string, index: number) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}`),\n revealKey: (id: string, index: number) =>\n api<{ key: string }>(\"GET\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/reveal`),\n addModel: (id: string, model: string, price?: { price_in?: number; price_out?: number }) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { model, ...price }),\n addModels: (id: string, models: string[]) =>\n api<ConfigReply>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/models`, { models }),\n // model id can hold a slash (provider/model); send it as a query param so the\n // proxy's path split doesn't mangle it.\n removeModel: (id: string, model: string) =>\n api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models?model=${encodeURIComponent(model)}`),\n clearModels: (id: string) => api<ConfigReply>(\"DELETE\", `/admin/providers/${encodeURIComponent(id)}/models`),\n pricing: () => api<PricingPayload>(\"GET\", \"/admin/pricing\"),\n setModelPrice: (id: string, model: string, price: { price_in?: number | null; price_out?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/models/price`, { model, ...price }),\n testProvider: (id: string) => api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/test`),\n testKey: (id: string, index: number) =>\n api<PingResult>(\"POST\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/test`),\n testModel: (id: string, model: string) =>\n api<{ ok: boolean; status?: number; error?: string }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/models/test?model=${encodeURIComponent(model)}`,\n ),\n validateProvider: (b: { format: WireFormat; base_url: string; api_key?: string }) =>\n api<PingResult>(\"POST\", \"/admin/providers/validate\", b),\n // discover: returns the upstream catalog flagged with which ids are in config.\n discoverModels: (id: string) =>\n api<{ ok: boolean; models: Array<{ id: string; added: boolean }> }>(\n \"POST\",\n `/admin/providers/${encodeURIComponent(id)}/connect`,\n ),\n\n reorderKey: (id: string, from: number, to: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/reorder`, { from, to }),\n toggleKey: (id: string, index: number, enabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/keys/${index}/toggle`, { enabled }),\n setProviderStrategy: (id: string, strategy: \"fallback\" | \"round-robin\" | null, sticky?: number) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/strategy`, { strategy, sticky }),\n setProviderDisabled: (id: string, disabled: boolean) =>\n api<ConfigReply>(\"PUT\", `/admin/providers/${encodeURIComponent(id)}/disabled`, { disabled }),\n\n setRoute: (\n alias: string,\n body: { target: string[]; model?: string | string[]; strategy?: \"fallback\" | \"round-robin\"; price_in?: number; price_out?: number },\n ) => api<ConfigReply>(\"PUT\", `/admin/routes/${encodeURIComponent(alias)}`, body),\n removeRoute: (alias: string) => api<ConfigReply>(\"DELETE\", `/admin/routes/${encodeURIComponent(alias)}`),\n\n endpoint: () => api<EndpointPayload>(\"GET\", \"/admin/endpoint\"),\n setRtk: (enabled: boolean) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/rtk\", { enabled }),\n setCaveman: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/caveman\", { level }),\n setPonytail: (level: InjectLevel) => api<ConfigReply>(\"PUT\", \"/admin/endpoint/ponytail\", { level }),\n addServerKey: (key: string, name?: string) => api<ConfigReply>(\"POST\", \"/admin/endpoint/keys\", { key, name }),\n editServerKey: (index: number, name: string) => api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}`, { name }),\n setServerKeyScope: (index: number, body: { models?: string[]; rpm?: number | null; expires?: number | null }) =>\n api<ConfigReply>(\"PUT\", `/admin/endpoint/keys/${index}/scope`, body),\n removeServerKey: (index: number) => api<ConfigReply>(\"DELETE\", `/admin/endpoint/keys/${index}`),\n revealServerKey: (index: number) => api<{ key: string }>(\"GET\", `/admin/endpoint/keys/${index}/reveal`),\n\n setHeadroom: (patch: { enabled?: boolean; url?: string; compress_user_messages?: boolean }) =>\n api<ConfigReply>(\"PUT\", \"/admin/endpoint/headroom\", patch),\n headroomStatus: () => api<HeadroomStatusReply>(\"GET\", \"/admin/headroom/status\"),\n headroomStart: () => api<{ success?: boolean; pid?: number; alreadyRunning?: boolean }>(\"POST\", \"/admin/headroom/start\"),\n headroomStop: () => api<{ stopped: boolean; reason?: string; pid?: number }>(\"POST\", \"/admin/headroom/stop\"),\n\n putConfig: (text: string) => api<{ ok: boolean }>(\"PUT\", \"/admin/config\", { text }),\n\n version: () => api<{ current: string; latest: string | null; updateAvailable: boolean }>(\"GET\", \"/admin/version\"),\n shutdown: () => api<{ ok: boolean; message: string }>(\"POST\", \"/admin/shutdown\"),\n};\n\n// Local CLI-tool detection/auto-config. These hit the dashboard's OWN server\n// routes (/api/cli-detect/*), not the gateway proxy — they read/write the tool's\n// config file on this machine. Session-gated by middleware like everything else.\nexport interface CliStatus {\n auto: boolean;\n installed: boolean;\n configured?: boolean;\n path?: string;\n baseUrl?: string | null;\n models?: string[];\n activeModel?: string | null;\n // claude returns its three slot defaults instead of a flat list\n modelSlots?: { opus?: string | null; sonnet?: string | null; haiku?: string | null };\n}\n\nasync function appApi<T>(method: string, url: string, body?: unknown): Promise<ApiResult<T>> {\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers: body !== undefined ? { \"content-type\": \"application/json\" } : {},\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n } catch (e) {\n return { ok: false, status: 0, data: null, error: (e as Error).message };\n }\n const text = await res.text();\n const data = text ? (JSON.parse(text) as T) : null;\n if (!res.ok) {\n const err = (data as { error?: string } | null)?.error ?? `request failed (${res.status})`;\n return { ok: false, status: res.status, data, error: err };\n }\n return { ok: true, status: res.status, data };\n}\n\n/** Admin account actions that hit the dashboard's OWN routes (not the gw proxy). */\nexport const account = {\n changePassword: (current: string, next: string) =>\n appApi<{ ok: boolean }>(\"POST\", \"/api/password\", { current, next }),\n};\n\nexport const cliConfig = {\n status: (tool: string) => appApi<CliStatus>(\"GET\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n apply: (tool: string, body: { base: string; key?: string; models?: string[] | Record<string, string>; active?: string }) =>\n appApi<{ success?: boolean; path?: string }>(\"POST\", `/api/cli-detect/${encodeURIComponent(tool)}`, body),\n reset: (tool: string) => appApi<{ success?: boolean }>(\"DELETE\", `/api/cli-detect/${encodeURIComponent(tool)}`),\n};\n","\"use client\";\n\nimport { Button } from \"@/components/Button\";\nimport { Icon } from \"@/components/Icon\";\n\ninterface ConfirmModalProps {\n title: string;\n message: string;\n confirmLabel?: string;\n onConfirm: () => void;\n onCancel: () => void;\n busy?: boolean;\n}\n\nexport function ConfirmModal({ title, message, confirmLabel = \"Delete\", onConfirm, onCancel, busy }: ConfirmModalProps) {\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-6\" onClick={onCancel}>\n <div\n className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 shadow-elevated\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"mb-2 flex items-center gap-2\">\n <span className=\"flex h-7 w-7 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"warning\" size={16} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">{title}</h2>\n </div>\n <p className=\"mb-4 text-[12.5px] text-text-muted\">{message}</p>\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"ghost\" onClick={onCancel}>Cancel</Button>\n <Button variant=\"danger\" disabled={busy} onClick={onConfirm}>{confirmLabel}</Button>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport Link from \"next/link\";\nimport { usePathname, useRouter } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\n\n// Floating icon-rail (user's preferred chrome), carrying aigetwey's IA: Endpoint\n// is the landing, routing lives in Combos, and operational pages sit below a\n// divider. Labels surface as hover tooltips (data-label).\ntype NavItem = { href: string; label: string; icon: string };\n\nconst MAIN: NavItem[] = [\n { href: \"/\", label: \"Endpoint & Key\", icon: \"api\" },\n { href: \"/providers\", label: \"Providers\", icon: \"dns\" },\n { href: \"/combos\", label: \"Combos\", icon: \"layers\" },\n { href: \"/usage\", label: \"Usage\", icon: \"bar_chart\" },\n { href: \"/quota\", label: \"Budgets\", icon: \"data_usage\" },\n { href: \"/tools\", label: \"CLI Tools\", icon: \"terminal\" },\n];\n\nconst SYSTEM: NavItem[] = [\n { href: \"/console\", label: \"Server Console\", icon: \"terminal\" },\n { href: \"/config\", label: \"Settings\", icon: \"settings\" },\n];\n\nexport function Rail() {\n const path = usePathname();\n const router = useRouter();\n\n async function logout() {\n await fetch(\"/api/logout\", { method: \"POST\" });\n router.replace(\"/login\");\n router.refresh();\n }\n\n // Endpoint owns both \"/\" (landing) and \"/endpoint\"; others match the segment\n // and its sub-routes (e.g. /providers/[id]).\n const isActive = (href: string) =>\n href === \"/\"\n ? path === \"/\" || path.startsWith(\"/endpoint\")\n : path === href || path.startsWith(`${href}/`);\n\n const link = (item: NavItem) => {\n const active = isActive(item.href);\n return (\n <Link\n key={item.href}\n href={item.href}\n data-label={item.label}\n className={`rail-icon${active ? \" rail-icon-active\" : \"\"}`}\n aria-label={item.label}\n >\n <Icon name={item.icon} size={20} fill={active} />\n </Link>\n );\n };\n\n return (\n <>\n <Link href=\"/\" className=\"rail-brand\" aria-label=\"aigetwey\">\n {/* \"a»\" mark — ink on the lime tile (CSS provides the tile) */}\n <svg viewBox=\"0 0 512 512\" width=\"26\" height=\"26\" aria-hidden>\n <text x=\"120\" y=\"338\" fontFamily=\"ui-sans-serif, Arial, sans-serif\" fontSize=\"260\" fontWeight=\"800\" textAnchor=\"middle\" fill=\"#14140f\">a</text>\n <g fill=\"none\" stroke=\"#14140f\" strokeWidth=\"34\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"276,182 352,256 276,330\" />\n <polyline points=\"346,182 422,256 346,330\" />\n </g>\n </svg>\n </Link>\n\n <nav className=\"flex flex-col items-center gap-3\">\n {MAIN.map(link)}\n <div className=\"rail-divider\" />\n {SYSTEM.map(link)}\n </nav>\n\n <button onClick={logout} data-label=\"Disconnect\" className=\"rail-icon\" aria-label=\"Disconnect\">\n <Icon name=\"logout\" size={19} />\n </button>\n </>\n );\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { usePathname } from \"next/navigation\";\nimport { Icon } from \"./Icon\";\nimport { useTheme } from \"./ThemeProvider\";\nimport { ConfirmModal } from \"./ConfirmModal\";\nimport { adminApi } from \"@/lib/client\";\n\nconst LABELS: Record<string, string> = {\n \"\": \"Endpoint & Key\",\n endpoint: \"Endpoint & Key\",\n providers: \"Providers\",\n combos: \"Combos\",\n usage: \"Usage\",\n quota: \"Budgets\",\n tools: \"CLI Tools\",\n console: \"Server Console\",\n config: \"Settings\",\n};\n\nfunction CopyUpdateCmd({ version }: { version: string }) {\n const [copied, setCopied] = useState(false);\n const cmd = `npm install -g aigetwey@${version}`;\n return (\n <button\n onClick={() => { void navigator.clipboard.writeText(cmd).then(() => { setCopied(true); setTimeout(() => setCopied(false), 1800); }); }}\n className=\"flex h-6 w-6 items-center justify-center rounded-full text-warning/70 transition-colors hover:bg-warning/10 hover:text-warning\"\n title={`Copy: ${cmd}`}\n >\n <Icon name={copied ? \"check\" : \"content_copy\"} size={13} />\n </button>\n );\n}\n\nexport function TopBar() {\n const path = usePathname();\n const { theme, toggle } = useTheme();\n const seg = path === \"/\" ? \"\" : (path.split(\"/\")[1] ?? \"\");\n const current = LABELS[seg] ?? seg;\n\n const [version, setVersion] = useState<{ current: string; latest: string | null; updateAvailable: boolean } | null>(null);\n const [confirmShutdown, setConfirmShutdown] = useState(false);\n const [stopped, setStopped] = useState(false);\n const [busy, setBusy] = useState(false);\n\n // version + update check on mount, via aigetwey's sidebar npm poll.\n useEffect(() => {\n void adminApi.version().then((r) => {\n if (r.ok && r.data) setVersion(r.data);\n });\n }, []);\n\n async function doShutdown() {\n setBusy(true);\n await adminApi.shutdown();\n // the gateway exits ~300ms after replying; reflect it in the UI.\n setStopped(true);\n setConfirmShutdown(false);\n setBusy(false);\n }\n\n return (\n <header className=\"console-topbar\">\n <div className=\"flex items-center gap-2 text-[13px]\">\n <span className=\"text-text-subtle\">aigetwey</span>\n <span className=\"text-text-subtle\">/</span>\n <span className=\"font-medium text-text\">{current}</span>\n </div>\n\n <div className=\"ml-auto flex items-center gap-2.5\">\n {version && (\n version.updateAvailable ? (\n <div className=\"flex items-center gap-1\">\n <a\n href=\"https://github.com/xk1ko/aigetwey/releases\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1.5 rounded-full border border-warning/30 bg-warning/10 px-2.5 py-1 text-[11px] font-medium text-warning transition-colors hover:bg-warning/20\"\n title={`Update available — v${version.latest} is out (you have v${version.current})`}\n >\n <Icon name=\"arrow_upward\" size={12} />\n v{version.latest} available\n </a>\n <CopyUpdateCmd version={version.latest!} />\n </div>\n ) : (\n <span className=\"text-[11px] text-text-subtle\" title=\"You're on the latest version\">\n v{version.current}\n </span>\n )\n )}\n\n <button\n onClick={toggle}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-text\"\n aria-label=\"Toggle theme\"\n title={theme === \"dark\" ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n <Icon name={theme === \"dark\" ? \"light_mode\" : \"dark_mode\"} size={18} />\n </button>\n\n <button\n onClick={() => setConfirmShutdown(true)}\n className=\"flex h-8 w-8 items-center justify-center rounded-full text-text-subtle transition-colors hover:text-danger\"\n aria-label=\"Shut down gateway\"\n title=\"Shut down the gateway\"\n >\n <Icon name=\"power_settings_new\" size={18} />\n </button>\n\n <div className=\"flex items-center gap-2 rounded-full border border-border bg-surface py-1 pl-1 pr-3\">\n <span className=\"flex h-6 w-6 items-center justify-center rounded-full bg-accent text-[11px] font-bold text-accent-ink\">\n A\n </span>\n <span className=\"text-[12px] text-text-muted\">admin</span>\n </div>\n </div>\n\n {confirmShutdown && (\n <ConfirmModal\n title=\"Shut down gateway?\"\n message=\"The gateway process will stop and all requests will fail until you restart it (run.sh). The dashboard stays up but can't reach the gateway.\"\n confirmLabel=\"Shut down\"\n busy={busy}\n onConfirm={doShutdown}\n onCancel={() => setConfirmShutdown(false)}\n />\n )}\n\n {stopped && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 p-6\">\n <div className=\"w-full max-w-sm rounded-brand-lg border border-border bg-surface p-5 text-center shadow-elevated\">\n <span className=\"mx-auto mb-2 flex h-9 w-9 items-center justify-center rounded-full bg-danger/10 text-danger\">\n <Icon name=\"power_settings_new\" size={20} />\n </span>\n <h2 className=\"text-[15px] font-semibold text-text\">Gateway stopped</h2>\n <p className=\"mt-1 text-[12.5px] text-text-muted\">\n Restart it with <code className=\"rounded bg-surface-2 px-1\">run.sh</code>, then reload this page.\n </p>\n </div>\n </div>\n )}\n </header>\n );\n}\n"],"names":["InvariantError","Error","constructor","message","options","endsWith","name","DEFAULT_SEGMENT_KEY","NOT_FOUND_SEGMENT_KEY","PAGE_SEGMENT_KEY","addSearchParamsIfPageSegment","computeSelectedLayoutSegment","getSegmentValue","getSelectedLayoutSegmentPath","isGroupSegment","isParallelRouteSegment","segment","Array","isArray","startsWith","searchParams","isPageSegment","includes","stringifiedQuery","JSON","stringify","segments","parallelRouteKey","length","rawSegment","tree","first","segmentPath","node","parallelRoutes","children","Object","values","segmentValue","push","createPromiseWithResolvers","resolve","reject","promise","Promise","res","rej","VARIANTS","primary","ghost","danger","Button","variant","className","props","Input","Select","Field","label","hint","api","method","path","body","fetch","headers","undefined","e","ok","status","data","error","text","parse","err","adminApi","providers","budgets","models","keys","keysUsage","setBudget","clearBudget","key","encodeURIComponent","addProvider","p","editProvider","id","patch","renameProvider","newId","removeProvider","addKey","editKey","index","removeKey","revealKey","addModel","model","price","addModels","removeModel","clearModels","pricing","setModelPrice","testProvider","testKey","testModel","validateProvider","b","discoverModels","reorderKey","from","to","toggleKey","enabled","setProviderStrategy","strategy","sticky","setProviderDisabled","disabled","setRoute","alias","removeRoute","endpoint","setRtk","setCaveman","level","setPonytail","addServerKey","editServerKey","setServerKeyScope","removeServerKey","revealServerKey","setHeadroom","headroomStatus","headroomStart","headroomStop","putConfig","version","shutdown","appApi","url","account","changePassword","current","next","cliConfig","tool","apply","reset","ConfirmModal","title","confirmLabel","onConfirm","onCancel","busy","onClick","stopPropagation","size","MAIN","href","icon","SYSTEM","Rail","router","logout","replace","refresh","isActive","link","item","active","fill","viewBox","width","height","x","y","fontFamily","fontSize","fontWeight","textAnchor","stroke","strokeWidth","strokeLinecap","strokeLinejoin","points","map","LABELS","combos","usage","quota","tools","console","config","CopyUpdateCmd","copied","setCopied","cmd","navigator","clipboard","writeText","then","setTimeout","TopBar","theme","toggle","seg","split","setVersion","confirmShutdown","setConfirmShutdown","stopped","setStopped","setBusy","r","doShutdown","updateAvailable","target","rel","latest"],"mappings":"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","ignoreList":[0,1,2]}
@@ -1,3 +0,0 @@
1
- module.exports=[2693,a=>{"use strict";var b=a.i(87924);let c={live:"bg-success/12 text-success",down:"bg-danger/12 text-danger",warn:"bg-warning/12 text-warning",info:"bg-info/12 text-info",neutral:"bg-surface-2 text-text-muted"};function d({tone:a="neutral",children:e,className:f}){return(0,b.jsx)("span",{className:`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium ${c[a]}${f?` ${f}`:""}`,children:e})}a.s(["Badge",0,d,"FormatBadge",0,function({format:a}){return(0,b.jsx)(d,{tone:"info",children:a})}])},58918,a=>{"use strict";var b=a.i(87924);a.s(["Empty",0,function({children:a}){return(0,b.jsx)("div",{className:"px-1 py-8 text-center text-[13px] text-text-muted",children:a})},"Stat",0,function({label:a,value:c,sub:d}){return(0,b.jsxs)("div",{className:"rounded-brand-lg border border-border bg-surface px-4 py-3.5 shadow-soft",children:[(0,b.jsx)("div",{className:"text-[11px] font-medium uppercase tracking-wider text-text-subtle",children:a}),(0,b.jsx)("div",{className:"mt-1 tnum text-[22px] font-semibold tracking-tight text-text",children:c}),d&&(0,b.jsx)("div",{className:"mt-0.5 text-[12px] text-text-muted",children:d})]})},"fmt",0,{int:a=>a.toLocaleString("en-US"),compact:a=>Math.abs(a)>=1e6?`${(a/1e6).toFixed(1)}M`:Math.abs(a)>=1e3?`${(a/1e3).toFixed(1)}K`:String(Math.round(a)),cost:a=>0===a?"$0":a<.01?`$${a.toFixed(4)}`:`$${a.toFixed(2)}`,time:a=>new Date(a).toLocaleString("en-US",{hour12:!1}),date(a){let b=new Date(a);return`${String(b.getDate()).padStart(2,"0")}/${String(b.getMonth()+1).padStart(2,"0")}/${b.getFullYear()}`},ago(a){let b=Math.max(0,Math.round((Date.now()-a)/1e3));return b<60?`${b}s`:b<3600?`${Math.floor(b/60)}m`:b<86400?`${Math.floor(b/3600)}h`:`${Math.floor(b/86400)}d`},duration(a){let b=Math.max(0,Math.round(a/1e3));if(b<60)return`${b}s`;if(b<3600)return`${Math.floor(b/60)}m ${b%60}s`;let c=Math.floor(b/3600),d=Math.floor(b%3600/60);if(c<24)return`${c}h ${d}m`;let e=Math.floor(c/24);return`${e}d ${c%24}h`}}])},70200,a=>{"use strict";let b=[{id:"claude-code",name:"Claude Code",icon:"smart_toy",format:"anthropic",blurb:"Anthropic CLI. Point its base URL + key at the gateway.",autoConfig:!0,install:"npm i -g @anthropic-ai/claude-code",slots:[{label:"Opus · heavy",alias:"claude-opus-4-1"},{label:"Sonnet · default",alias:"claude-sonnet-4-6"},{label:"Haiku · fast",alias:"claude-haiku-4-5"}],env:(a,b)=>[{name:"ANTHROPIC_BASE_URL",value:a},{name:"ANTHROPIC_API_KEY",value:b||"<your-gateway-key>"}],steps:["Export the two variables in the shell you run `claude` from.","Create a combo named like each slot above so Claude Code's model ids resolve.","The gateway translates Anthropic ↔ provider format, so any provider works behind it."]},{id:"opencode",name:"opencode",icon:"code_blocks",format:"openai",blurb:"OpenAI-compatible provider. Set base_url to /v1.",autoConfig:!0,install:"curl -fsSL https://opencode.ai/install | bash",slots:[{label:"Model",alias:"gpt-5"}],env:(a,b)=>[{name:"OPENAI_BASE_URL",value:`${a}/v1`},{name:"OPENAI_API_KEY",value:b||"<your-gateway-key>"}],steps:["Add an OpenAI-compatible provider with the gateway /v1 base URL.","Pick a combo alias as the model."]}];a.s(["CLI_TOOLS",0,b,"toolById",0,function(a){return b.find(b=>b.id===a)}])},90976,a=>{"use strict";var b=a.i(87924),c=a.i(72131),d=a.i(38246),e=a.i(2693),f=a.i(93026),g=a.i(58918),h=a.i(70200);a.s(["CliToolConfig",0,function(){let[a,i]=(0,c.useState)(null),[j,k]=(0,c.useState)("");return((0,c.useEffect)(()=>{(async()=>{let a=await fetch("/api/gw/admin/endpoint");if(!a.ok)return k("could not reach the gateway");i((await a.json()).port)})()},[]),j)?(0,b.jsx)(g.Empty,{children:j}):(0,b.jsxs)("div",{children:[(0,b.jsxs)("div",{className:"mb-6",children:[(0,b.jsx)("h1",{className:"text-[22px] font-semibold tracking-tight text-text",children:"CLI Tools"}),(0,b.jsxs)("p",{className:"mt-1 text-[13px] text-text-muted",children:["Point your coding tools at the gateway. ",a?`Listening on port ${a}.`:""]})]}),(0,b.jsx)("div",{className:"grid gap-3 sm:grid-cols-2 lg:grid-cols-3",children:h.CLI_TOOLS.map(a=>(0,b.jsxs)(d.default,{href:`/tools/${a.id}`,className:"group rounded-brand-lg border border-border bg-surface p-4 shadow-soft transition-colors hover:border-text-subtle",children:[(0,b.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,b.jsxs)("span",{className:"flex items-center gap-2.5",children:[(0,b.jsx)("span",{className:"flex h-8 w-8 items-center justify-center rounded-brand bg-surface-2 text-text-muted group-hover:text-text",children:(0,b.jsx)(f.Icon,{name:a.icon,size:18})}),(0,b.jsx)("span",{className:"text-[14px] font-semibold text-text",children:a.name})]}),(0,b.jsx)(e.Badge,{tone:"info",children:a.format})]}),(0,b.jsx)("p",{className:"mt-2 text-[12.5px] text-text-muted",children:a.blurb}),(0,b.jsxs)("span",{className:"mt-3 inline-flex items-center gap-1 text-[12px] text-text-subtle group-hover:text-text",children:["Setup ",(0,b.jsx)(f.Icon,{name:"arrow_forward",size:14})]})]},a.id))})]})}])}];
2
-
3
- //# sourceMappingURL=src_02ocd5c._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/Badge.tsx","../../../../src/components/ui.tsx","../../../../src/lib/cliTools.ts","../../../../src/components/CliToolConfig.tsx"],"sourcesContent":["type Tone = \"live\" | \"down\" | \"warn\" | \"info\" | \"neutral\";\n\nconst TONES: Record<Tone, string> = {\n live: \"bg-success/12 text-success\",\n down: \"bg-danger/12 text-danger\",\n warn: \"bg-warning/12 text-warning\",\n info: \"bg-info/12 text-info\",\n neutral: \"bg-surface-2 text-text-muted\",\n};\n\nexport function Badge({\n tone = \"neutral\",\n children,\n className,\n}: {\n tone?: Tone;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <span\n className={`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium ${TONES[tone]}${className ? ` ${className}` : \"\"}`}\n >\n {children}\n </span>\n );\n}\n\n/** Format badge for a provider's wire format. */\nexport function FormatBadge({ format }: { format: \"openai\" | \"anthropic\" | \"gemini\" }) {\n return <Badge tone=\"info\">{format}</Badge>;\n}\n","/** Small formatting helpers shared across the console. */\nexport const fmt = {\n int(n: number): string {\n return n.toLocaleString(\"en-US\");\n },\n /** compact number: 1.2K, 3.4M */\n compact(n: number): string {\n if (Math.abs(n) >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (Math.abs(n) >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return String(Math.round(n));\n },\n cost(n: number): string {\n if (n === 0) return \"$0\";\n return n < 0.01 ? `$${n.toFixed(4)}` : `$${n.toFixed(2)}`;\n },\n time(ts: number): string {\n return new Date(ts).toLocaleString(\"en-US\", { hour12: false });\n },\n /** DD/MM/YYYY (local) */\n date(ts: number): string {\n const d = new Date(ts);\n return `${String(d.getDate()).padStart(2, \"0\")}/${String(d.getMonth() + 1).padStart(2, \"0\")}/${d.getFullYear()}`;\n },\n /** \"3m\", \"2h\", \"5d\" — coarse relative age */\n ago(ts: number): string {\n const s = Math.max(0, Math.round((Date.now() - ts) / 1000));\n if (s < 60) return `${s}s`;\n if (s < 3600) return `${Math.floor(s / 60)}m`;\n if (s < 86400) return `${Math.floor(s / 3600)}h`;\n return `${Math.floor(s / 86400)}d`;\n },\n /** ms duration -> \"Xs\", \"Xm Ys\", \"Xh Ym\" for budget/cooldown countdowns */\n duration(ms: number): string {\n const s = Math.max(0, Math.round(ms / 1000));\n if (s < 60) return `${s}s`;\n if (s < 3600) return `${Math.floor(s / 60)}m ${s % 60}s`;\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n if (h < 24) return `${h}h ${m}m`;\n const d = Math.floor(h / 24);\n return `${d}d ${h % 24}h`;\n },\n};\n\n/** A labelled stat block — number over a caption. */\nexport function Stat({ label, value, sub }: { label: string; value: React.ReactNode; sub?: string }) {\n return (\n <div className=\"rounded-brand-lg border border-border bg-surface px-4 py-3.5 shadow-soft\">\n <div className=\"text-[11px] font-medium uppercase tracking-wider text-text-subtle\">{label}</div>\n <div className=\"mt-1 tnum text-[22px] font-semibold tracking-tight text-text\">{value}</div>\n {sub && <div className=\"mt-0.5 text-[12px] text-text-muted\">{sub}</div>}\n </div>\n );\n}\n\n/** Empty-state hint inside a card body. */\nexport function Empty({ children }: { children: React.ReactNode }) {\n return <div className=\"px-1 py-8 text-center text-[13px] text-text-muted\">{children}</div>;\n}\n","/**\n * CLI tool setup definitions. Each tool talks to the gateway in either OpenAI or\n * Anthropic wire format; the gateway exposes both on the same port, so setup is\n * just pointing the tool's base_url + key at us. `env` builders take the live\n * gateway base URL + a gateway key and return ready-to-copy environment lines.\n *\n * `slots` are the model names this tool calls. Because our gateway routes by the\n * combo alias (the alias IS the model name), the detail page checks whether a\n * combo with each slot's alias exists, and prompts to create the missing ones.\n */\nexport type ToolFormat = \"openai\" | \"anthropic\";\n\nexport interface CliTool {\n id: string;\n name: string;\n /** Material Symbols ligature shown on the tool card + detail header. */\n icon: string;\n format: ToolFormat;\n blurb: string;\n /** true when the dashboard can detect + write this tool's local config file. */\n autoConfig?: boolean;\n /** one-line install command, when the tool ships via a package manager. */\n install?: string;\n /** model names the tool sends — pair each with a combo of the same name. */\n slots: { label: string; alias: string }[];\n /** environment variables to set, given the gateway base + a key. */\n env: (base: string, key: string) => Array<{ name: string; value: string }>;\n /** extra free-form steps shown on the detail page. */\n steps: string[];\n}\n\nconst KEY = (k: string) => k || \"<your-gateway-key>\";\n\nexport const CLI_TOOLS: CliTool[] = [\n {\n id: \"claude-code\",\n name: \"Claude Code\",\n icon: \"smart_toy\",\n format: \"anthropic\",\n blurb: \"Anthropic CLI. Point its base URL + key at the gateway.\",\n autoConfig: true,\n install: \"npm i -g @anthropic-ai/claude-code\",\n slots: [\n { label: \"Opus · heavy\", alias: \"claude-opus-4-1\" },\n { label: \"Sonnet · default\", alias: \"claude-sonnet-4-6\" },\n { label: \"Haiku · fast\", alias: \"claude-haiku-4-5\" },\n ],\n env: (base, key) => [\n { name: \"ANTHROPIC_BASE_URL\", value: base },\n { name: \"ANTHROPIC_API_KEY\", value: KEY(key) },\n ],\n steps: [\n \"Export the two variables in the shell you run `claude` from.\",\n \"Create a combo named like each slot above so Claude Code's model ids resolve.\",\n \"The gateway translates Anthropic ↔ provider format, so any provider works behind it.\",\n ],\n },\n {\n id: \"opencode\",\n name: \"opencode\",\n icon: \"code_blocks\",\n format: \"openai\",\n blurb: \"OpenAI-compatible provider. Set base_url to /v1.\",\n autoConfig: true,\n install: \"curl -fsSL https://opencode.ai/install | bash\",\n slots: [{ label: \"Model\", alias: \"gpt-5\" }],\n env: (base, key) => [\n { name: \"OPENAI_BASE_URL\", value: `${base}/v1` },\n { name: \"OPENAI_API_KEY\", value: KEY(key) },\n ],\n steps: [\"Add an OpenAI-compatible provider with the gateway /v1 base URL.\", \"Pick a combo alias as the model.\"],\n },\n];\n\nexport function toolById(id: string): CliTool | undefined {\n return CLI_TOOLS.find((t) => t.id === id);\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport Link from \"next/link\";\nimport { Badge } from \"@/components/Badge\";\nimport { Icon } from \"@/components/Icon\";\nimport { Empty } from \"@/components/ui\";\nimport { CLI_TOOLS } from \"@/lib/cliTools\";\nimport type { EndpointPayload } from \"@/lib/gateway\";\n\n/** Grid of CLI tool setup cards. Each links to a step-by-step detail page. */\nexport function CliToolConfig() {\n const [port, setPort] = useState<number | null>(null);\n const [error, setError] = useState(\"\");\n\n useEffect(() => {\n void (async () => {\n const res = await fetch(\"/api/gw/admin/endpoint\");\n if (!res.ok) {\n setError(\"could not reach the gateway\");\n return;\n }\n setPort(((await res.json()) as EndpointPayload).port);\n })();\n }, []);\n\n if (error) return <Empty>{error}</Empty>;\n\n return (\n <div>\n <div className=\"mb-6\">\n <h1 className=\"text-[22px] font-semibold tracking-tight text-text\">CLI Tools</h1>\n <p className=\"mt-1 text-[13px] text-text-muted\">\n Point your coding tools at the gateway. {port ? `Listening on port ${port}.` : \"\"}\n </p>\n </div>\n\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3\">\n {CLI_TOOLS.map((t) => (\n <Link\n key={t.id}\n href={`/tools/${t.id}`}\n className=\"group rounded-brand-lg border border-border bg-surface p-4 shadow-soft transition-colors hover:border-text-subtle\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex items-center gap-2.5\">\n <span className=\"flex h-8 w-8 items-center justify-center rounded-brand bg-surface-2 text-text-muted group-hover:text-text\">\n <Icon name={t.icon} size={18} />\n </span>\n <span className=\"text-[14px] font-semibold text-text\">{t.name}</span>\n </span>\n <Badge tone=\"info\">{t.format}</Badge>\n </div>\n <p className=\"mt-2 text-[12.5px] text-text-muted\">{t.blurb}</p>\n <span className=\"mt-3 inline-flex items-center gap-1 text-[12px] text-text-subtle group-hover:text-text\">\n Setup <Icon name=\"arrow_forward\" size={14} />\n </span>\n </Link>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["TONES","live","down","warn","info","neutral","Badge","tone","children","className","FormatBadge","format","fmt","int","n","toLocaleString","compact","Math","abs","toFixed","String","round","cost","time","ts","Date","hour12","date","d","getDate","padStart","getMonth","getFullYear","ago","s","max","now","floor","duration","ms","h","m","Stat","label","value","sub","Empty","KEY","k","CLI_TOOLS","id","name","icon","blurb","autoConfig","install","slots","alias","env","base","key","steps","toolById","find","t","CliToolConfig","port","setPort","error","setError","res","fetch","ok","json","map","href","size"],"mappings":"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"}