@thangnm.nip/arouter 0.1.12 → 0.1.13

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 (208) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +9 -8
  3. package/.next/standalone/.next/build-manifest.json +4 -4
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +4 -4
  6. package/.next/standalone/.next/routes-manifest.json +6 -0
  7. package/.next/standalone/.next/server/app/(dashboard)/mitm/page.js +2 -2
  8. package/.next/standalone/.next/server/app/(dashboard)/mitm/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/mitm/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/page.js +2 -2
  11. package/.next/standalone/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/_global-error/page.js +3 -3
  14. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/_global-error.html +2 -2
  17. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  18. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  19. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  20. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  21. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  22. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  23. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  24. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  25. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  28. package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
  29. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  30. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  31. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  32. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  33. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  34. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  35. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  36. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/console-logs/route.js +2 -2
  38. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/console-logs/route_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route.js +8 -0
  40. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route.js.nft.json +1 -0
  41. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route_client-reference-manifest.js +1 -0
  42. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  43. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/settings/route.js +2 -2
  45. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/settings/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  47. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js +3 -3
  49. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  51. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
  53. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  55. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
  57. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/keys/[id]/route.js +1 -1
  59. package/.next/standalone/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/keys/route.js +1 -1
  61. package/.next/standalone/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/locale/route.js +2 -2
  63. package/.next/standalone/.next/server/app/api/locale/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/models/alias/route.js +1 -1
  65. package/.next/standalone/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/models/route.js +1 -1
  67. package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/providers/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/settings/route.js +1 -1
  71. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/version/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/index.html +1 -1
  75. package/.next/standalone/.next/server/app/index.rsc +4 -4
  76. package/.next/standalone/.next/server/app/index.segments/!KGRhc2hib2FyZCk/__PAGE__.segment.rsc +1 -1
  77. package/.next/standalone/.next/server/app/index.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  78. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  79. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  80. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  81. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  82. package/.next/standalone/.next/server/app/mitm.html +1 -1
  83. package/.next/standalone/.next/server/app/mitm.rsc +5 -5
  84. package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk/mitm/__PAGE__.segment.rsc +2 -2
  85. package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk/mitm.segment.rsc +1 -1
  86. package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  87. package/.next/standalone/.next/server/app/mitm.segments/_full.segment.rsc +5 -5
  88. package/.next/standalone/.next/server/app/mitm.segments/_head.segment.rsc +1 -1
  89. package/.next/standalone/.next/server/app/mitm.segments/_index.segment.rsc +3 -3
  90. package/.next/standalone/.next/server/app/mitm.segments/_tree.segment.rsc +1 -1
  91. package/.next/standalone/.next/server/app-paths-manifest.json +9 -8
  92. package/.next/standalone/.next/server/chunks/138.js +1 -1
  93. package/.next/standalone/.next/server/chunks/182.js +9 -2
  94. package/.next/standalone/.next/server/chunks/219.js +1 -0
  95. package/.next/standalone/.next/server/chunks/471.js +13 -0
  96. package/.next/standalone/.next/server/chunks/741.js +2 -2
  97. package/.next/standalone/.next/server/chunks/900.js +7 -0
  98. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  99. package/.next/standalone/.next/server/middleware.js +2 -2
  100. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  101. package/.next/standalone/.next/server/next-font-manifest.json +1 -1
  102. package/.next/standalone/.next/server/pages/404.html +1 -1
  103. package/.next/standalone/.next/server/pages/500.html +2 -2
  104. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  106. package/.next/standalone/.next/static/chunks/{702-726ccbcada41f8fa.js → 702-c4610efa55dfb155.js} +1 -1
  107. package/.next/standalone/.next/static/chunks/{794-e4409998c8ba5c29.js → 794-37dad9bbc14b04b8.js} +1 -1
  108. package/.next/standalone/.next/static/chunks/{852-6b2b2eefb2d99b28.js → 852-d8cad4b0d71288a2.js} +3 -3
  109. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-579c25ca675b41ac.js +1 -0
  110. package/.next/standalone/.next/static/chunks/app/(dashboard)/mitm/page-d25cf1803f6924ee.js +7 -0
  111. package/.next/standalone/.next/static/chunks/app/(dashboard)/{page-a4e7c4e324778903.js → page-5c09ac097fc0cc9b.js} +1 -1
  112. package/.next/standalone/.next/static/chunks/app/_global-error/{page-a4e7c4e324778903.js → page-5c09ac097fc0cc9b.js} +1 -1
  113. package/.next/standalone/.next/static/chunks/app/_not-found/{page-f6a07fd1289f84a5.js → page-038730efde50428c.js} +1 -1
  114. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/{route-a4e7c4e324778903.js → route-5c09ac097fc0cc9b.js} +1 -1
  115. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/console-logs/{route-a4e7c4e324778903.js → route-5c09ac097fc0cc9b.js} +1 -1
  116. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/logs/route-5c09ac097fc0cc9b.js +1 -0
  117. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-5c09ac097fc0cc9b.js +1 -0
  118. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/settings/route-5c09ac097fc0cc9b.js +1 -0
  119. package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-5c09ac097fc0cc9b.js +1 -0
  120. package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-5c09ac097fc0cc9b.js +1 -0
  121. package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-5c09ac097fc0cc9b.js +1 -0
  122. package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-5c09ac097fc0cc9b.js +1 -0
  123. package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-5c09ac097fc0cc9b.js +1 -0
  124. package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-5c09ac097fc0cc9b.js +1 -0
  125. package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-5c09ac097fc0cc9b.js +1 -0
  126. package/.next/standalone/.next/static/chunks/app/api/keys/route-5c09ac097fc0cc9b.js +1 -0
  127. package/.next/standalone/.next/static/chunks/app/api/locale/route-5c09ac097fc0cc9b.js +1 -0
  128. package/.next/standalone/.next/static/chunks/app/api/models/alias/route-5c09ac097fc0cc9b.js +1 -0
  129. package/.next/standalone/.next/static/chunks/app/api/models/route-5c09ac097fc0cc9b.js +1 -0
  130. package/.next/standalone/.next/static/chunks/app/api/providers/route-5c09ac097fc0cc9b.js +1 -0
  131. package/.next/standalone/.next/static/chunks/app/api/settings/route-5c09ac097fc0cc9b.js +1 -0
  132. package/.next/standalone/.next/static/chunks/app/api/version/route-5c09ac097fc0cc9b.js +1 -0
  133. package/.next/standalone/.next/static/chunks/app/{layout-6de9a5310276adf9.js → layout-6e491caa4df42293.js} +1 -1
  134. package/.next/standalone/.next/static/chunks/{main-9b410d84e10d7a77.js → main-842bf1ddb8ee9ec0.js} +2 -2
  135. package/.next/standalone/.next/static/chunks/{main-app-2ed2446a2e4f75e7.js → main-app-0fea626ed7ee1281.js} +1 -1
  136. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-5c09ac097fc0cc9b.js +1 -0
  137. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-5c09ac097fc0cc9b.js +1 -0
  138. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-89d8af6ad4f69554.js +1 -0
  139. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-5c09ac097fc0cc9b.js +1 -0
  140. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5c09ac097fc0cc9b.js +1 -0
  141. package/.next/standalone/.next/static/rZAYFVGk5tWg3Az1gc9jl/_buildManifest.js +1 -0
  142. package/.next/standalone/node_modules/@next/env/package.json +1 -1
  143. package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
  144. package/.next/standalone/node_modules/next/dist/build/webpack-config.js +3 -3
  145. package/.next/standalone/node_modules/next/dist/compiled/http-proxy/index.js +5 -5
  146. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-experimental.runtime.prod.js +3 -3
  147. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +12 -12
  148. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +3 -3
  149. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js +3 -3
  150. package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js +2 -2
  151. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +2 -2
  152. package/.next/standalone/node_modules/next/dist/compiled/next-server/pages.runtime.prod.js +2 -2
  153. package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +7 -11
  154. package/.next/standalone/node_modules/next/dist/server/base-server.js +22 -8
  155. package/.next/standalone/node_modules/next/dist/server/config-schema.js +0 -1
  156. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1 -1
  157. package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
  158. package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +22 -148
  159. package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
  160. package/.next/standalone/node_modules/next/dist/server/lib/lru-cache.js +1 -2
  161. package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +6 -15
  162. package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +3 -3
  163. package/.next/standalone/node_modules/next/dist/server/lib/router-utils/{block-cross-site-dev.js → block-cross-site.js} +17 -11
  164. package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
  165. package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  166. package/.next/standalone/node_modules/next/dist/shared/lib/image-config.js +0 -1
  167. package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
  168. package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
  169. package/.next/standalone/node_modules/next/package.json +16 -16
  170. package/.next/standalone/package.json +1 -1
  171. package/.next/standalone/server.js +1 -1
  172. package/.next/standalone/src/mitm/manager.js +30 -9
  173. package/bin/arouter.js +292 -0
  174. package/bin/arouter.mjs +264 -111
  175. package/bin/paths.js +23 -0
  176. package/bin/paths.mjs +23 -0
  177. package/package.json +1 -1
  178. package/scripts/postinstall.mjs +0 -4
  179. package/.next/standalone/.next/server/chunks/411.js +0 -1
  180. package/.next/standalone/.next/server/chunks/63.js +0 -13
  181. package/.next/standalone/.next/server/chunks/724.js +0 -7
  182. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-384bfa634ec14bbe.js +0 -1
  183. package/.next/standalone/.next/static/chunks/app/(dashboard)/mitm/page-3dca1ab0735aaa0f.js +0 -7
  184. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-a4e7c4e324778903.js +0 -1
  185. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/settings/route-a4e7c4e324778903.js +0 -1
  186. package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-a4e7c4e324778903.js +0 -1
  187. package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-a4e7c4e324778903.js +0 -1
  188. package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-a4e7c4e324778903.js +0 -1
  189. package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-a4e7c4e324778903.js +0 -1
  190. package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-a4e7c4e324778903.js +0 -1
  191. package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-a4e7c4e324778903.js +0 -1
  192. package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-a4e7c4e324778903.js +0 -1
  193. package/.next/standalone/.next/static/chunks/app/api/keys/route-a4e7c4e324778903.js +0 -1
  194. package/.next/standalone/.next/static/chunks/app/api/locale/route-a4e7c4e324778903.js +0 -1
  195. package/.next/standalone/.next/static/chunks/app/api/models/alias/route-a4e7c4e324778903.js +0 -1
  196. package/.next/standalone/.next/static/chunks/app/api/models/route-a4e7c4e324778903.js +0 -1
  197. package/.next/standalone/.next/static/chunks/app/api/providers/route-a4e7c4e324778903.js +0 -1
  198. package/.next/standalone/.next/static/chunks/app/api/settings/route-a4e7c4e324778903.js +0 -1
  199. package/.next/standalone/.next/static/chunks/app/api/version/route-a4e7c4e324778903.js +0 -1
  200. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-a4e7c4e324778903.js +0 -1
  201. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-a4e7c4e324778903.js +0 -1
  202. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-a42479e2ca7868a9.js +0 -1
  203. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-a4e7c4e324778903.js +0 -1
  204. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-a4e7c4e324778903.js +0 -1
  205. package/.next/standalone/.next/static/uPrRUZ-734mcKsKT6Fb28/_buildManifest.js +0 -1
  206. package/.next/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +0 -57
  207. package/.next/standalone/node_modules/next/dist/server/lib/postponed-request-body.js +0 -64
  208. /package/.next/standalone/.next/static/{uPrRUZ-734mcKsKT6Fb28 → rZAYFVGk5tWg3Az1gc9jl}/_ssgManifest.js +0 -0
package/bin/arouter.mjs CHANGED
@@ -1,148 +1,301 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import { spawn } from 'child_process';
4
- import path from 'path';
5
- import fs from 'fs';
6
- import { fileURLToPath } from 'url';
7
- import os from 'os';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
-
12
- const args = process.argv.slice(2);
13
- const command = args[0] || 'start';
14
-
15
- let port = '20129';
16
- const portIndex = args.indexOf('--port');
17
- if (portIndex !== -1 && args[portIndex + 1]) {
18
- port = args[portIndex + 1];
19
- }
20
- // If running from node_modules after npm install -g, the standalone structure is slightly different
21
- // than running it locally in the dev repo.
22
- // Path to the Next.js standalone server
23
- // When installed globally, the structure is:
24
- // global/node_modules/@thangnm.nip/arouter/
25
- // ├── bin/arouter.mjs
26
- // └── .next/standalone/server.js
27
- const serverPath = path.join(__dirname, '..', '.next', 'standalone', 'server.js');
28
-
29
-
30
- const arouterHome = path.join(os.homedir(), '.arouter');
31
- const pidFile = path.join(arouterHome, 'server.pid');
32
- const logFile = path.join(arouterHome, 'server.log');
33
- const portFile = path.join(arouterHome, 'server.port');
34
-
35
- if (!fs.existsSync(arouterHome)) {
36
- fs.mkdirSync(arouterHome, { recursive: true });
3
+ import { spawn, execSync } from "child_process";
4
+ import { existsSync, readFileSync, writeFileSync, unlinkSync, openSync, cpSync } from "fs";
5
+ import { resolve } from "path";
6
+ import { platform } from "os";
7
+ import { createServer } from "net";
8
+ import { PROJECT_ROOT, DATA_DIR, PID_FILE, LOG_FILE, PORT, DASHBOARD_URL } from "./paths.mjs";
9
+
10
+ // ─── Helpers ────────────────────────────────────────────────────────────
11
+
12
+ const IS_WIN = platform() === "win32";
13
+ const GREEN = "\x1b[32m";
14
+ const YELLOW = "\x1b[33m";
15
+ const RED = "\x1b[31m";
16
+ const CYAN = "\x1b[36m";
17
+ const DIM = "\x1b[2m";
18
+ const BOLD = "\x1b[1m";
19
+ const RESET = "\x1b[0m";
20
+
21
+ function log(msg) { console.log(`${DIM}[arouter]${RESET} ${msg}`); }
22
+ function success(msg) { console.log(`${GREEN}✔${RESET} ${msg}`); }
23
+ function warn(msg) { console.log(`${YELLOW}⚠${RESET} ${msg}`); }
24
+ function error(msg) { console.error(`${RED}✖${RESET} ${msg}`); }
25
+
26
+ /** Cross-platform port check using Node.js net module */
27
+ function isPortInUse(port) {
28
+ return new Promise((resolve) => {
29
+ const server = createServer();
30
+ server.once("error", (err) => {
31
+ if (err.code === "EADDRINUSE") resolve(true);
32
+ else resolve(false);
33
+ });
34
+ server.once("listening", () => {
35
+ server.close(() => resolve(false));
36
+ });
37
+ server.listen(port, "0.0.0.0");
38
+ });
37
39
  }
38
40
 
39
- function checkStatus() {
40
- if (!fs.existsSync(pidFile)) {
41
- return false;
42
- }
43
- const pid = parseInt(fs.readFileSync(pidFile, 'utf8'), 10);
41
+ function getRunningPid() {
42
+ if (!existsSync(PID_FILE)) return null;
43
+ const pid = parseInt(readFileSync(PID_FILE, "utf-8").trim(), 10);
44
+ if (isNaN(pid)) return null;
44
45
  try {
45
- // process.kill(pid, 0) throws an error if the process doesn't exist
46
46
  process.kill(pid, 0);
47
47
  return pid;
48
+ } catch {
49
+ try { unlinkSync(PID_FILE); } catch { /* ignore */ }
50
+ return null;
51
+ }
52
+ }
53
+
54
+ function waitForServer(timeoutMs = 60000) {
55
+ return new Promise((resolve, reject) => {
56
+ const start = Date.now();
57
+ const check = () => {
58
+ if (Date.now() - start > timeoutMs) {
59
+ return reject(new Error("Server startup timed out"));
60
+ }
61
+ import("http").then(({ default: http }) => {
62
+ const req = http.get(`http://localhost:${PORT}`, (res) => {
63
+ res.resume();
64
+ resolve();
65
+ });
66
+ req.on("error", () => setTimeout(check, 500));
67
+ req.setTimeout(2000, () => { req.destroy(); setTimeout(check, 500); });
68
+ });
69
+ };
70
+ check();
71
+ });
72
+ }
73
+
74
+ function npmCommand() {
75
+ return IS_WIN ? "npm.cmd" : "npm";
76
+ }
77
+
78
+ // ─── Commands ───────────────────────────────────────────────────────────
79
+
80
+ async function buildIfNeeded() {
81
+ const standaloneServer = resolve(PROJECT_ROOT, ".next/standalone/server.js");
82
+ if (existsSync(standaloneServer)) return;
83
+
84
+ log("First run — building production bundle...");
85
+ log(`${DIM}This will take a minute, please wait...${RESET}`);
86
+
87
+ try {
88
+ execSync(`${npmCommand()} run build`, {
89
+ cwd: PROJECT_ROOT,
90
+ stdio: "inherit",
91
+ env: { ...process.env, NODE_ENV: "production" },
92
+ shell: true,
93
+ });
94
+ success("Build complete!");
95
+
96
+ // Next.js standalone requires static assets + public to be copied manually
97
+ const standaloneDir = resolve(PROJECT_ROOT, ".next/standalone");
98
+ const staticSrc = resolve(PROJECT_ROOT, ".next/static");
99
+ const staticDest = resolve(standaloneDir, ".next/static");
100
+ const publicSrc = resolve(PROJECT_ROOT, "public");
101
+ const publicDest = resolve(standaloneDir, "public");
102
+
103
+ if (existsSync(staticSrc) && !existsSync(staticDest)) {
104
+ log("Copying static assets...");
105
+ cpSync(staticSrc, staticDest, { recursive: true });
106
+ }
107
+ if (existsSync(publicSrc) && !existsSync(publicDest)) {
108
+ log("Copying public files...");
109
+ cpSync(publicSrc, publicDest, { recursive: true });
110
+ }
111
+ success("Assets ready!");
48
112
  } catch (e) {
49
- // Process is not running, clean up stale PID file
50
- fs.unlinkSync(pidFile);
51
- return false;
113
+ error("Build failed. Check the output above.");
114
+ process.exit(1);
52
115
  }
53
116
  }
54
117
 
55
- if (command === 'start') {
56
- const currentPid = checkStatus();
57
- if (currentPid) {
58
- const savedPort = fs.existsSync(portFile) ? fs.readFileSync(portFile, 'utf8') : port;
59
- console.log(`arouter is already running (PID: ${currentPid}). Access it at http://localhost:${savedPort}`);
60
- process.exit(0);
118
+ async function startServer() {
119
+ const pid = getRunningPid();
120
+ if (pid) {
121
+ success(`aRouter is already running ${DIM}(PID: ${pid})${RESET}`);
122
+ console.log();
123
+ console.log(` ${BOLD}Dashboard${RESET} ${CYAN}${DASHBOARD_URL}${RESET}`);
124
+ console.log();
125
+ return;
61
126
  }
62
127
 
63
- if (!fs.existsSync(serverPath)) {
64
- console.error(`Error: Could not find standalone server at ${serverPath}`);
65
- console.error('Make sure you have built the application using `npm run build`.');
128
+ const portBusy = await isPortInUse(PORT);
129
+ if (portBusy) {
130
+ error(`Port ${PORT} is already in use by another process.`);
131
+ log(`Stop the other process or change the port.`);
66
132
  process.exit(1);
67
133
  }
68
134
 
69
- console.log('Starting arouter server in the background...');
70
-
71
- // We use standard out/err redirection to a log file
72
- const out = fs.openSync(logFile, 'a');
73
- const err = fs.openSync(logFile, 'a');
135
+ await buildIfNeeded();
136
+
137
+ log("Starting aRouter...");
138
+
139
+ const logFd = openSync(LOG_FILE, "a");
74
140
 
75
- const child = spawn(process.execPath, [serverPath], {
76
- detached: true,
77
- stdio: ['ignore', out, err],
141
+ const serverScript = resolve(PROJECT_ROOT, ".next/standalone/server.js");
142
+ const child = spawn(process.execPath, [serverScript], {
143
+ cwd: PROJECT_ROOT, // Important: CWD must be PROJECT_ROOT so MITM can find src/mitm/
144
+ detached: !IS_WIN,
145
+ stdio: ["ignore", logFd, logFd],
78
146
  env: {
79
147
  ...process.env,
80
- NODE_ENV: 'production',
81
- PORT: port
82
- }
148
+ NODE_ENV: "production",
149
+ PORT: String(PORT),
150
+ HOSTNAME: "0.0.0.0",
151
+ // Tell MITM manager where the real server.js is (not the standalone bundled one)
152
+ MITM_SERVER_PATH: resolve(PROJECT_ROOT, "src/mitm/server.js"),
153
+ },
154
+ ...(IS_WIN ? { windowsHide: true } : {}),
83
155
  });
84
156
 
85
- child.unref(); // Allow the parent process to exit gracefully
86
-
87
- if (child.pid) {
88
- fs.writeFileSync(pidFile, child.pid.toString());
89
- fs.writeFileSync(portFile, port.toString());
90
- console.log(`Server started successfully in background! (PID: ${child.pid})`);
91
- console.log(`You can view logs at: ${logFile}`);
92
-
93
- // Give it a moment to bind to the port before telling the user it's ready
94
- setTimeout(() => {
95
- console.log(`\n🚀 arouter is available at http://localhost:${port}\n`);
96
- process.exit(0);
97
- }, 1000);
98
- } else {
99
- console.error('Failed to start server.');
100
- process.exit(1);
157
+ writeFileSync(PID_FILE, String(child.pid));
158
+ child.unref();
159
+
160
+ try {
161
+ process.stdout.write(` Waiting for server `);
162
+ await waitForServer(60000);
163
+ process.stdout.write(`${GREEN}ready!${RESET}\n`);
164
+ } catch {
165
+ process.stdout.write(`${YELLOW}(timeout check logs)${RESET}\n`);
101
166
  }
102
167
 
103
- } else if (command === 'stop') {
104
- const pid = checkStatus();
168
+ console.log();
169
+ console.log(` ${GREEN}${BOLD}aRouter is running!${RESET}`);
170
+ console.log();
171
+ console.log(` ${BOLD}Dashboard${RESET} ${CYAN}${DASHBOARD_URL}${RESET}`);
172
+ console.log(` ${BOLD}API${RESET} ${CYAN}${DASHBOARD_URL}/v1${RESET}`);
173
+ console.log(` ${BOLD}PID${RESET} ${DIM}${child.pid}${RESET}`);
174
+ console.log(` ${BOLD}Logs${RESET} ${DIM}${LOG_FILE}${RESET}`);
175
+ console.log();
176
+ console.log(` ${DIM}Run ${RESET}arouter stop${DIM} to stop the server.${RESET}`);
177
+ console.log();
178
+ }
179
+
180
+ function stopServer() {
181
+ const pid = getRunningPid();
105
182
  if (!pid) {
106
- console.log('arouter is not currently running.');
107
- if (fs.existsSync(portFile)) fs.unlinkSync(portFile);
108
- process.exit(0);
183
+ warn("aRouter is not running.");
184
+ return;
109
185
  }
110
186
 
111
- console.log(`Stopping arouter (PID: ${pid})...`);
187
+ log(`Stopping aRouter (PID: ${pid})...`);
112
188
  try {
113
- process.kill(pid); // Send default SIGTERM
114
- fs.unlinkSync(pidFile);
115
- if (fs.existsSync(portFile)) fs.unlinkSync(portFile);
116
- console.log('Server stopped successfully.');
189
+ if (IS_WIN) {
190
+ execSync(`taskkill /PID ${pid} /T /F`, { stdio: "ignore", shell: true });
191
+ } else {
192
+ process.kill(pid, "SIGTERM");
193
+ setTimeout(() => {
194
+ try {
195
+ process.kill(pid, 0);
196
+ process.kill(pid, "SIGKILL");
197
+ } catch { /* already dead */ }
198
+ }, 3000);
199
+ }
117
200
  } catch (e) {
118
- console.error(`Failed to stop server: ${e.message}`);
119
- process.exit(1);
201
+ warn(`Could not kill process: ${e.message}`);
120
202
  }
121
203
 
122
- } else if (command === 'status') {
123
- const pid = checkStatus();
204
+ try { unlinkSync(PID_FILE); } catch { /* ignore */ }
205
+ success("aRouter stopped.");
206
+ }
207
+
208
+ function showStatus() {
209
+ const pid = getRunningPid();
124
210
  if (pid) {
125
- const savedPort = fs.existsSync(portFile) ? fs.readFileSync(portFile, 'utf8') : port;
126
- console.log(`arouter is running (PID: ${pid}).`);
127
- console.log(`Interface: http://localhost:${savedPort}`);
128
- console.log(`Logs: ${logFile}`);
211
+ success(`aRouter is running ${DIM}(PID: ${pid})${RESET}`);
212
+ console.log(` ${BOLD}Dashboard${RESET} ${CYAN}${DASHBOARD_URL}${RESET}`);
129
213
  } else {
130
- console.log('arouter is not running.');
214
+ warn("aRouter is not running.");
131
215
  }
216
+ }
132
217
 
133
- } else if (command === 'logs') {
134
- if (fs.existsSync(logFile)) {
135
- // Simple log dump, you could use 'tail' for streaming if preferred
136
- console.log(`Reading logs from ${logFile}:`);
137
- console.log(fs.readFileSync(logFile, 'utf8'));
218
+ function showLogs() {
219
+ if (!existsSync(LOG_FILE)) {
220
+ warn("No log file found. Start the server first.");
221
+ return;
222
+ }
223
+ try {
224
+ const content = readFileSync(LOG_FILE, "utf-8");
225
+ const lines = content.split("\n").slice(-50);
226
+ console.log(lines.join("\n"));
227
+ } catch (e) {
228
+ error(`Could not read logs: ${e.message}`);
229
+ }
230
+ }
231
+
232
+ async function restartServer() {
233
+ stopServer();
234
+ await new Promise(r => setTimeout(r, 1500));
235
+ await startServer();
236
+ }
237
+
238
+ function showHelp() {
239
+ console.log();
240
+ console.log(` ${BOLD}aRouter${RESET} — AI Model Router & MITM Proxy`);
241
+ console.log();
242
+ console.log(` ${BOLD}Usage:${RESET}`);
243
+ console.log(` ${CYAN}arouter${RESET} Start the server (background)`);
244
+ console.log(` ${CYAN}arouter start${RESET} Same as above`);
245
+ console.log(` ${CYAN}arouter stop${RESET} Stop the server`);
246
+ console.log(` ${CYAN}arouter restart${RESET} Restart the server`);
247
+ console.log(` ${CYAN}arouter status${RESET} Show server status`);
248
+ console.log(` ${CYAN}arouter logs${RESET} Show recent logs`);
249
+ console.log(` ${CYAN}arouter dev${RESET} Run in foreground (dev mode)`);
250
+ console.log(` ${CYAN}arouter build${RESET} Force rebuild`);
251
+ console.log(` ${CYAN}arouter help${RESET} Show this help`);
252
+ console.log();
253
+ console.log(` ${BOLD}Data:${RESET} ${DIM}${DATA_DIR}${RESET}`);
254
+ console.log(` ${BOLD}Port:${RESET} ${DIM}${PORT}${RESET}`);
255
+ console.log();
256
+ }
257
+
258
+ function devMode() {
259
+ log("Starting in dev mode (foreground)...");
260
+ const child = spawn(npmCommand(), ["run", "dev"], {
261
+ cwd: PROJECT_ROOT,
262
+ stdio: "inherit",
263
+ env: { ...process.env },
264
+ shell: IS_WIN,
265
+ });
266
+ child.on("exit", (code) => process.exit(code || 0));
267
+ }
268
+
269
+ async function forceBuild() {
270
+ log("Force rebuilding...");
271
+ const nextDir = resolve(PROJECT_ROOT, ".next");
272
+ try {
273
+ if (IS_WIN) {
274
+ execSync(`rmdir /s /q "${nextDir}"`, { cwd: PROJECT_ROOT, shell: true, stdio: "ignore" });
138
275
  } else {
139
- console.log(`No logs found at ${logFile}`);
276
+ execSync(`rm -rf "${nextDir}"`, { cwd: PROJECT_ROOT, stdio: "ignore" });
140
277
  }
141
- } else {
142
- console.log('Usage: arouter <command>');
143
- console.log('Commands:');
144
- console.log(' start Start the server in the background');
145
- console.log(' stop Stop the running server');
146
- console.log(' status Check if the server is running');
147
- console.log(' logs View the server logs');
278
+ } catch { /* ignore */ }
279
+ await buildIfNeeded();
280
+ }
281
+
282
+ // ─── Main ───────────────────────────────────────────────────────────────
283
+
284
+ const command = process.argv[2] || "start";
285
+
286
+ switch (command) {
287
+ case "start": await startServer(); break;
288
+ case "stop": stopServer(); break;
289
+ case "restart": await restartServer(); break;
290
+ case "status": showStatus(); break;
291
+ case "logs": showLogs(); break;
292
+ case "dev": devMode(); break;
293
+ case "build": await forceBuild(); break;
294
+ case "help":
295
+ case "--help":
296
+ case "-h": showHelp(); break;
297
+ default:
298
+ error(`Unknown command: ${command}`);
299
+ showHelp();
300
+ process.exit(1);
148
301
  }
package/bin/paths.js ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { resolve, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { homedir } from "os";
6
+ import { existsSync, mkdirSync } from "fs";
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+
10
+ // Project root (where package.json lives)
11
+ export const PROJECT_ROOT = resolve(__dirname, "..");
12
+
13
+ // User data directory (~/.arouter/)
14
+ export const DATA_DIR = resolve(homedir(), ".arouter");
15
+
16
+ // Ensure data dir exists
17
+ if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
18
+
19
+ // Files in data dir
20
+ export const PID_FILE = resolve(DATA_DIR, "arouter.pid");
21
+ export const LOG_FILE = resolve(DATA_DIR, "arouter.log");
22
+ export const PORT = 20129;
23
+ export const DASHBOARD_URL = `http://localhost:${PORT}`;
package/bin/paths.mjs ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { resolve, dirname } from "path";
4
+ import { fileURLToPath } from "url";
5
+ import { homedir } from "os";
6
+ import { existsSync, mkdirSync } from "fs";
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
9
+
10
+ // Project root (where package.json lives)
11
+ export const PROJECT_ROOT = resolve(__dirname, "..");
12
+
13
+ // User data directory (~/.arouter/)
14
+ export const DATA_DIR = resolve(homedir(), ".arouter");
15
+
16
+ // Ensure data dir exists
17
+ if (!existsSync(DATA_DIR)) mkdirSync(DATA_DIR, { recursive: true });
18
+
19
+ // Files in data dir
20
+ export const PID_FILE = resolve(DATA_DIR, "arouter.pid");
21
+ export const LOG_FILE = resolve(DATA_DIR, "arouter.log");
22
+ export const PORT = 20129;
23
+ export const DASHBOARD_URL = `http://localhost:${PORT}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thangnm.nip/arouter",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "aRouter",
5
5
  "bin": {
6
6
  "arouter": "./bin/arouter.mjs"
@@ -148,8 +148,6 @@ function setupMacOS() {
148
148
  </dict>
149
149
  <key>RunAtLoad</key>
150
150
  <true/>
151
- <key>KeepAlive</key>
152
- <dict><key>SuccessfulExit</key><false/></dict>
153
151
  <key>StandardOutPath</key>
154
152
  <string>${path.join(logDir, 'mitm.startup.log')}</string>
155
153
  <key>StandardErrorPath</key>
@@ -225,8 +223,6 @@ Type=simple
225
223
  Environment="HOME=${os.homedir()}"
226
224
  Environment="DATA_DIR=${path.join(os.homedir(), '.arouter')}"
227
225
  ExecStart=${nodeBin} ${mitmServerPath}
228
- Restart=on-failure
229
- RestartSec=5
230
226
  StandardOutput=append:${path.join(logDir, 'mitm.startup.log')}
231
227
  StandardError=append:${path.join(logDir, 'mitm.startup.error.log')}
232
228
 
@@ -1 +0,0 @@
1
- exports.id=411,exports.ids=[411],exports.modules={2518:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,81921,23))},2796:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,95547,23)),Promise.resolve().then(c.t.bind(c,15098,23)),Promise.resolve().then(c.t.bind(c,47644,23)),Promise.resolve().then(c.t.bind(c,33859,23)),Promise.resolve().then(c.t.bind(c,98099,23)),Promise.resolve().then(c.t.bind(c,16237,23)),Promise.resolve().then(c.t.bind(c,98562,23)),Promise.resolve().then(c.t.bind(c,36675,23))},5211:(a,b,c)=>{"use strict";c.d(b,{RuntimeI18nProvider:()=>f});var d=c(48249);c(67484);var e=c(19099);function f({children:a}){return(0,e.usePathname)(),(0,d.jsx)(d.Fragment,{children:a})}c(99258)},12020:(a,b,c)=>{"use strict";c.d(b,{fg:()=>d.fg,vQ:()=>e,zN:()=>d.zN,B2:()=>f});var d=c(96919);c(69974);let e={name:"aRouter",description:"AI Infrastructure Management",version:"0.1.12"},f={storageKey:"theme",defaultTheme:"system"}},13033:(a,b,c)=>{"use strict";c.d(b,{A:()=>g});var d=c(31417),e=c(300),f=c(12020);let g=(0,d.v)((0,e.Zr)((a,b)=>({theme:f.B2.defaultTheme,setTheme:b=>{a({theme:b})},toggleTheme:()=>{let c="dark"===b().theme?"light":"dark";a({theme:c})},initTheme:()=>{b().theme}}),{name:f.B2.storageKey}))},19308:(a,b,c)=>{"use strict";c.d(b,{ThemeProvider:()=>f});var d=c(48249);c(67484);var e=c(13033);function f({children:a}){let{initTheme:b}=(0,e.A)();return(0,d.jsx)(d.Fragment,{children:a})}},26892:(a,b,c)=>{"use strict";c.d(b,{fO:()=>k,up:()=>l,wJ:()=>j});var d=c(94735);let e=["log","info","warn","error","debug"];global._consoleLogBufferState||(global._consoleLogBufferState={logs:[],patched:!1,originals:{},emitter:new d.EventEmitter},global._consoleLogBufferState.emitter.setMaxListeners(50));let f=global._consoleLogBufferState;f.emitter||(f.emitter=new d.EventEmitter,f.emitter.setMaxListeners(50));let g=/\x1b\[[0-9;]*m/g;function h(a){return a.replace(g,"")}function i(a){if("string"==typeof a)return h(a);if(a instanceof Error)return h(a.stack||a.message||String(a));try{return h(JSON.stringify(a))}catch{return h(String(a))}}function j(){if(!f.patched){for(let a of e)f.originals[a]=console[a],console[a]=(...b)=>{var c;c=b.map(i).join(" "),f.logs.push(c),f.logs.length>200&&(f.logs=f.logs.slice(-200)),f.emitter.emit("line",c),f.originals[a](...b)};f.patched=!0}}function k(){return f.logs}function l(){return f.emitter}},34426:(a,b,c)=>{Promise.resolve().then(c.bind(c,5211)),Promise.resolve().then(c.bind(c,19308))},39470:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,95547,23))},49996:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,81921,23)),Promise.resolve().then(c.t.bind(c,60440,23)),Promise.resolve().then(c.t.bind(c,84342,23)),Promise.resolve().then(c.t.bind(c,82265,23)),Promise.resolve().then(c.t.bind(c,35421,23)),Promise.resolve().then(c.t.bind(c,61335,23)),Promise.resolve().then(c.t.bind(c,70664,23)),Promise.resolve().then(c.bind(c,74661))},51126:(a,b,c)=>{"use strict";c.d(b,{CL:()=>f,QC:()=>g,Xn:()=>e,YZ:()=>d});let d=["en","vi","zh-CN"],e="en",f="locale";function g(a){return"zh"===a||"zh-CN"===a?"zh-CN":"en"===a?"en":"vi"===a?"vi":e}},60317:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>ae,metadata:()=>ac,viewport:()=>ad});var d=c(5735),e=c(75329),f=c.n(e);c(61135);var g=c(89886),h=c(89718),i=c(55511),j=c.n(i),k=c(29021),l=c.n(k),m=c(33873),n=c.n(m),o=c(21820),p=c.n(o);let q=n().join(p().homedir(),".arouter","tunnel"),r=n().join(q,"state.json"),s=n().join(q,"cloudflared.pid");function t(){l().existsSync(q)||l().mkdirSync(q,{recursive:!0})}function u(){try{if(l().existsSync(s))return parseInt(l().readFileSync(s,"utf8"))}catch(a){}return null}function v(){try{l().existsSync(s)&&l().unlinkSync(s)}catch(a){}}var w=c(55591),x=c.n(w),y=c(79646);let z=n().join(p().homedir(),".arouter","bin"),A="cloudflared",B="win32"===p().platform(),C=B?`${A}.exe`:A,D=n().join(z,C),E={darwin:{x64:"cloudflared-darwin-amd64.tgz",arm64:"cloudflared-darwin-amd64.tgz"},win32:{x64:"cloudflared-windows-amd64.exe"},linux:{x64:"cloudflared-linux-amd64",arm64:"cloudflared-linux-arm64"}};async function F(){if(l().existsSync(z)||l().mkdirSync(z,{recursive:!0}),l().existsSync(D))return B||l().chmodSync(D,"755"),D;let a=function(){let a=p().platform(),b=p().arch(),c=E[a];if(!c)throw Error(`Unsupported platform: ${a}`);let d=c[b];if(!d)throw Error(`Unsupported architecture: ${b} for platform ${a}`);return`https://github.com/cloudflare/cloudflared/releases/latest/download/${d}`}(),b=a.endsWith(".tgz"),c=b?n().join(z,"cloudflared.tgz"):D;return await function a(b,c){return new Promise((d,e)=>{let f=l().createWriteStream(c);x().get(b,b=>{if([301,302].includes(b.statusCode)){f.close(),l().unlinkSync(c),a(b.headers.location,c).then(d).catch(e);return}if(200!==b.statusCode){f.close(),l().unlinkSync(c),e(Error(`Download failed with status ${b.statusCode}`));return}b.pipe(f),f.on("finish",()=>{f.close(()=>d(c))}),f.on("error",a=>{f.close(),l().unlinkSync(c),e(a)})}).on("error",a=>{f.close(),l().existsSync(c)&&l().unlinkSync(c),e(a)})})}(a,c),b&&((0,y.execSync)(`tar -xzf "${c}" -C "${z}"`,{stdio:"pipe"}),l().unlinkSync(c)),B||l().chmodSync(D,"755"),D}let G=null,H=null;async function I(a){var b;let c=await F(),d=(0,y.spawn)(c,["tunnel","run","--dns-resolver-addrs","1.1.1.1:53","--token",a],{detached:!1,windowsHide:!0,stdio:["ignore","pipe","pipe"]});return G=d,b=d.pid,t(),l().writeFileSync(s,b.toString()),new Promise((a,b)=>{let c=0,e=!1,f=setTimeout(()=>{e=!0,a(d)},9e4),g=b=>{let g=b.toString().match(/Registered tunnel connection/g);g&&(c+=g.length)>=4&&!e&&(e=!0,clearTimeout(f),a(d))};d.stdout.on("data",g),d.stderr.on("data",g),d.on("error",a=>{e||(e=!0,clearTimeout(f),b(a))}),d.on("exit",a=>{G=null,v();let d=e;e||(e=!0,clearTimeout(f),0!==c)?d&&H&&H():b(Error(`cloudflared exited with code ${a}`))})})}function J(){if(G){try{G.kill()}catch(a){}G=null}let a=u();if(a){try{process.kill(a)}catch(a){}v()}try{(0,y.execSync)("pkill -f cloudflared 2>/dev/null || true",{stdio:"ignore"})}catch(a){}}function K(){let a=u();if(!a)return!1;try{return process.kill(a,0),!0}catch(a){return!1}}let L=process.env.TUNNEL_WORKER_URL||"https://tunnel.9router.com",M="abcdefghijklmnpqrstuvwxyz23456789",N=[5e3,1e4,2e4,3e4,6e4],O=N.length,P=!1;async function Q(a,b={}){let c=`${L}${a}`;return(await fetch(c,{...b,headers:{"Content-Type":"application/json",...b.headers}})).json()}async function R(){var a;let b=function(){try{if(l().existsSync(r))return JSON.parse(l().readFileSync(r,"utf8"))}catch(a){}return null}();if(b&&b.tunnelUrl&&K())return{success:!0,tunnelUrl:b.tunnelUrl,shortId:b.shortId,alreadyRunning:!0};J();let d=function(){try{let{machineIdSync:a}=c(19713),b=a();return j().createHash("sha256").update(b+"9router-tunnel-salt").digest("hex").substring(0,16)}catch(a){return j().randomUUID().replace(/-/g,"").substring(0,16)}}(),e=b?.shortId||function(){let a="";for(let b=0;b<6;b++)a+=M.charAt(Math.floor(Math.random()*M.length));return a}(),f=b?.apiKey||function(a){let b="abcdefghijklmnopqrstuvwxyz0123456789",c="";for(let a=0;a<6;a++)c+=b.charAt(Math.floor(Math.random()*b.length));let d=j().createHmac("sha256","9router-tunnel-api-key-secret").update(a+c).digest("hex").slice(0,8);return`sk-${a}-${c}-${d}`}(d);await Q("/api/session/create",{method:"POST",body:JSON.stringify({apiKey:f,shortId:e})});let g=await Q("/api/tunnel/create",{method:"POST",body:JSON.stringify({apiKey:f})});if(g.error)throw Error(g.error);let{token:i,hostname:k}=g;return await I(i),a={shortId:e,apiKey:f,tunnelUrl:k,machineId:d},t(),l().writeFileSync(r,JSON.stringify(a,null,2)),await (0,h.Xx)({tunnelEnabled:!0,tunnelUrl:k}),H=()=>{P||S(0)},{success:!0,tunnelUrl:k,shortId:e}}async function S(a){if(P)return;P=!0;let b=N[Math.min(a,N.length-1)];console.log(`[Tunnel] Unexpected exit detected, reconnecting in ${b/1e3}s (attempt ${a+1})...`),await new Promise(a=>setTimeout(a,b));try{if(!(await (0,h.mt)()).tunnelEnabled){console.log("[Tunnel] Tunnel disabled, skipping reconnect"),P=!1;return}await R(),console.log("[Tunnel] Reconnected successfully"),P=!1}catch(c){console.log(`[Tunnel] Reconnect attempt ${a+1} failed:`,c.message),P=!1;let b=a+1;b<O?S(b):console.log("[Tunnel] All reconnect attempts exhausted")}}var T=c(96182),U=c(1932);if(!process.env.MITM_SERVER_PATH)try{let a=(0,U.fileURLToPath)("file:///Users/nip/WORKSPACE/02.SOURCE/ICHECK/01.%20PROJECT/AI%20CENTER/arouter/src/shared/services/initializeApp.js"),b=(0,m.dirname)((0,m.dirname)(a)),c=(0,m.join)(b,"mitm","server.js");(0,k.existsSync)(c)&&(process.env.MITM_SERVER_PATH=c)}catch{}try{(0,T.initDbHooks)(h.mt,h.Xx)}catch{}process.setMaxListeners(20);let V=global.__appSingleton??={signalHandlersRegistered:!1,watchdogInterval:null,networkMonitorInterval:null,lastNetworkFingerprint:null,lastWatchdogTick:Date.now(),lastTunnelRestartAt:0,tunnelRestartInProgress:!1};async function W(){try{if(await (0,h.bI)(),(await (0,h.mt)()).tunnelEnabled&&!K()){console.log("[InitApp] Tunnel was enabled, auto-reconnecting...");try{await R(),console.log("[InitApp] Tunnel reconnected")}catch(a){console.log("[InitApp] Tunnel reconnect failed:",a.message)}}if(!V.signalHandlersRegistered){let a=()=>{J(),process.exit()};process.on("SIGINT",a),process.on("SIGTERM",a),V.signalHandlersRegistered=!0}F().catch(()=>{}),!V.watchdogInterval&&(V.watchdogInterval=setInterval(async()=>{try{if(!(await (0,h.mt)()).tunnelEnabled||K())return;console.log("[Watchdog] Tunnel process is down, attempting recovery..."),await R(),console.log("[Watchdog] Tunnel recovered")}catch(a){console.log("[Watchdog] Recovery failed:",a.message)}},6e4),V.watchdogInterval.unref&&V.watchdogInterval.unref()),!V.networkMonitorInterval&&(V.lastNetworkFingerprint=Y(),V.lastWatchdogTick=Date.now(),V.networkMonitorInterval=setInterval(async()=>{try{if(!(await (0,h.mt)()).tunnelEnabled)return;let a=Date.now(),b=a-V.lastWatchdogTick;V.lastWatchdogTick=a;let c=Y(),d=c!==V.lastNetworkFingerprint,e=b>15e3;if(d&&(V.lastNetworkFingerprint=c),!d&&!e||V.tunnelRestartInProgress||a-V.lastTunnelRestartAt<3e4)return;console.log(`[NetworkMonitor] ${e&&d?"sleep/wake + network change":e?"sleep/wake":"network change"} detected, restarting tunnel...`),V.tunnelRestartInProgress=!0,V.lastTunnelRestartAt=a;try{J(),await new Promise(a=>setTimeout(a,2e3)),await R(),console.log("[NetworkMonitor] Tunnel restarted"),V.lastNetworkFingerprint=Y()}finally{V.tunnelRestartInProgress=!1}}catch(a){console.log("[NetworkMonitor] Tunnel restart failed:",a.message)}},5e3),V.networkMonitorInterval.unref&&V.networkMonitorInterval.unref()),X()}catch(a){console.error("[InitApp] Error:",a)}}async function X(){try{if(!(await (0,h.mt)()).mitmEnabled||(await (0,T.getMitmStatus)()).running)return;let a=await (0,T.loadEncryptedPassword)();if(!a&&"win32"!==process.platform)return void console.log("[InitApp] MITM was enabled but no saved password found, skipping auto-start");let b=(await (0,h.PX)()).find(a=>!1!==a.isActive);if(!b)return void console.log("[InitApp] MITM auto-start skipped: no active API key");console.log("[InitApp] MITM was enabled, auto-starting..."),await (0,T.startMitm)(b.key,a||""),console.log("[InitApp] MITM auto-started")}catch(a){console.log("[InitApp] MITM auto-start failed:",a.message)}}function Y(){let a=p().networkInterfaces(),b=[];for(let[c,d]of Object.entries(a))if(d)for(let a of d)a.internal||"IPv4"!==a.family||b.push(`${c}:${a.address}`);return b.sort().join("|")}let Z=!1;function $(a){return null==a?"":String(a).trim()}(async function(){if(!Z)try{await W(),Z=!0}catch(a){console.error("[ServerInit] Error initializing app:",a)}return Z})().catch(console.log);let _=!1;(async function(){if(_)return!0;try{let a=await (0,h.mt)();!function({outboundProxyEnabled:a,outboundProxyUrl:b,outboundNoProxy:c}={}){if("u"<typeof process||!process.env)return;let d=$(b),e=$(c);if(!a){"1"===process.env.NINE_ROUTER_PROXY_MANAGED&&(delete process.env.HTTP_PROXY,delete process.env.HTTPS_PROXY,delete process.env.ALL_PROXY,delete process.env.NO_PROXY,delete process.env.NINE_ROUTER_PROXY_MANAGED,delete process.env.NINE_ROUTER_PROXY_URL,delete process.env.NINE_ROUTER_NO_PROXY);return}let f="1"===process.env.NINE_ROUTER_PROXY_MANAGED,g=!1;f&&(d||(delete process.env.HTTP_PROXY,delete process.env.HTTPS_PROXY,delete process.env.ALL_PROXY,delete process.env.NINE_ROUTER_PROXY_URL),e||(delete process.env.NO_PROXY,delete process.env.NINE_ROUTER_NO_PROXY)),d&&(process.env.HTTP_PROXY=d,process.env.HTTPS_PROXY=d,process.env.ALL_PROXY=d,process.env.NINE_ROUTER_PROXY_URL=d,g=!0),e&&(process.env.NO_PROXY=e,process.env.NINE_ROUTER_NO_PROXY=e,g=!0),g?process.env.NINE_ROUTER_PROXY_MANAGED="1":f&&delete process.env.NINE_ROUTER_PROXY_MANAGED}(a),_=!0}catch(a){console.error("[ServerInit] Error initializing outbound proxy:",a)}return _})().catch(console.log);var aa=c(26892),ab=c(85117);(0,aa.wJ)();let ac={title:"aRouter - Power by C' Jay Nguyen",description:"One endpoint for all your AI providers. Manage keys, monitor usage, and scale effortlessly.",icons:{icon:"/favicon.svg"}},ad={themeColor:"#0a0a0a"};function ae({children:a}){return(0,d.jsxs)("html",{lang:"en",suppressHydrationWarning:!0,children:[(0,d.jsxs)("head",{children:[(0,d.jsx)("link",{rel:"preconnect",href:"https://fonts.googleapis.com"}),(0,d.jsx)("link",{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:"anonymous"}),(0,d.jsx)("link",{href:"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap",rel:"stylesheet"})]}),(0,d.jsx)("body",{className:`${f().variable} font-sans antialiased`,children:(0,d.jsx)(g.ThemeProvider,{children:(0,d.jsx)(ab.RuntimeI18nProvider,{children:a})})})]})}},61135:()=>{},69974:(a,b,c)=>{"use strict";c.d(b,{Xg:()=>j,KC:()=>k});var d=c(21820);let e={"Anthropic-Version":"2023-06-01","Anthropic-Beta":"claude-code-20250219,interleaved-thinking-2025-05-14"},f="https://api.kimi.com/coding/v1/messages",g={claude:{baseUrl:"https://api.anthropic.com/v1/messages",format:"claude",headers:{"Anthropic-Version":"2023-06-01","Anthropic-Beta":"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14,context-management-2025-06-27,prompt-caching-scope-2026-01-05","Anthropic-Dangerous-Direct-Browser-Access":"true","User-Agent":"claude-cli/2.1.63 (external, cli)","X-App":"cli","X-Stainless-Helper-Method":"stream","X-Stainless-Retry-Count":"0","X-Stainless-Runtime-Version":"v24.3.0","X-Stainless-Package-Version":"0.74.0","X-Stainless-Runtime":"node","X-Stainless-Lang":"js","X-Stainless-Arch":function(){switch((0,d.arch)()){case"x64":return"x64";case"arm64":return"arm64";case"ia32":return"x86";default:return`other::${(0,d.arch)()}`}}(),"X-Stainless-Os":function(){switch((0,d.platform)()){case"darwin":return"MacOS";case"win32":return"Windows";case"linux":return"Linux";case"freebsd":return"FreeBSD";default:return`Other::${(0,d.platform)()}`}}(),"X-Stainless-Timeout":"600"},clientId:"9d1c250a-e61b-44d9-88ed-5944d1962f5e",tokenUrl:"https://api.anthropic.com/v1/oauth/token"},gemini:{baseUrl:"https://generativelanguage.googleapis.com/v1beta/models",format:"gemini",clientId:"681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com",clientSecret:"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"},"gemini-cli":{baseUrl:"https://cloudcode-pa.googleapis.com/v1internal",format:"gemini-cli",clientId:"681255809395-oo8ft2oprdrnp9e3aqf6av3hmdib135j.apps.googleusercontent.com",clientSecret:"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"},codex:{baseUrl:"https://chatgpt.com/backend-api/codex/responses",format:"openai-responses",headers:{originator:"codex-cli","User-Agent":"codex-cli/1.0.18 (macOS; arm64)"},clientId:"app_EMoamEEZ73f0CkXaXp7hrann",clientSecret:"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",tokenUrl:"https://auth.openai.com/oauth/token"},qwen:{baseUrl:"https://portal.qwen.ai/v1/chat/completions",format:"openai",headers:{"User-Agent":"google-api-nodejs-client/9.15.1","X-Goog-Api-Client":"gl-node/22.17.0"},clientId:"f0304373b74a44d2b584a3fb70ca9e56",tokenUrl:"https://chat.qwen.ai/api/v1/oauth2/token",authUrl:"https://chat.qwen.ai/api/v1/oauth2/device/code"},iflow:{baseUrl:"https://apis.iflow.cn/v1/chat/completions",format:"openai",headers:{"User-Agent":"iFlow-Cli"},clientId:"10009311001",clientSecret:"4Z3YjXycVsQvyGF1etiNlIBB4RsqSDtW",tokenUrl:"https://iflow.cn/oauth/token",authUrl:"https://iflow.cn/oauth"},antigravity:{baseUrls:["https://daily-cloudcode-pa.googleapis.com","https://daily-cloudcode-pa.sandbox.googleapis.com"],format:"antigravity",headers:{"User-Agent":`antigravity/1.107.0 ${(0,d.platform)()}/${(0,d.arch)()}`},clientId:"1071006060591-tmhssin2h21lcre235vtolojh4g403ep.apps.googleusercontent.com",clientSecret:"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"},openrouter:{baseUrl:"https://openrouter.ai/api/v1/chat/completions",format:"openai",headers:{"HTTP-Referer":"https://endpoint-proxy.local","X-Title":"Endpoint Proxy"}},openai:{baseUrl:"https://api.openai.com/v1/chat/completions",format:"openai"},glm:{baseUrl:"https://api.z.ai/api/anthropic/v1/messages",format:"claude",headers:{...e}},"glm-cn":{baseUrl:"https://open.bigmodel.cn/api/coding/paas/v4/chat/completions",format:"openai",headers:{}},kimi:{baseUrl:f,format:"claude",headers:{...e}},minimax:{baseUrl:"https://api.minimax.io/anthropic/v1/messages",format:"claude",headers:{...e}},"minimax-cn":{baseUrl:"https://api.minimaxi.com/anthropic/v1/messages",format:"claude",headers:{...e}},alicode:{baseUrl:"https://coding.dashscope.aliyuncs.com/v1/chat/completions",format:"openai",headers:{}},"alicode-intl":{baseUrl:"https://coding-intl.dashscope.aliyuncs.com/v1/chat/completions",format:"openai",headers:{}},github:{baseUrl:"https://api.githubcopilot.com/chat/completions",responsesUrl:"https://api.githubcopilot.com/responses",format:"openai",headers:{"copilot-integration-id":"vscode-chat","editor-version":"vscode/1.110.0","editor-plugin-version":"copilot-chat/0.38.0","user-agent":"GitHubCopilotChat/0.38.0","openai-intent":"conversation-panel","x-github-api-version":"2025-04-01","x-vscode-user-agent-library-version":"electron-fetch","X-Initiator":"user",Accept:"application/json","Content-Type":"application/json"}},kiro:{baseUrl:"https://codewhisperer.us-east-1.amazonaws.com/generateAssistantResponse",format:"kiro",headers:{"Content-Type":"application/json",Accept:"application/vnd.amazon.eventstream","X-Amz-Target":"AmazonCodeWhispererStreamingService.GenerateAssistantResponse","User-Agent":"AWS-SDK-JS/3.0.0 kiro-ide/1.0.0","X-Amz-User-Agent":"aws-sdk-js/3.0.0 kiro-ide/1.0.0"},tokenUrl:"https://prod.us-east-1.auth.desktop.kiro.dev/refreshToken",authUrl:"https://prod.us-east-1.auth.desktop.kiro.dev"},cursor:{baseUrl:"https://api2.cursor.sh",chatPath:"/aiserver.v1.ChatService/StreamUnifiedChatWithTools",format:"cursor",headers:{"connect-accept-encoding":"gzip","connect-protocol-version":"1","Content-Type":"application/connect+proto","User-Agent":"connect-es/1.6.1"},clientVersion:"1.1.3"},"kimi-coding":{baseUrl:f,format:"claude",headers:{...e},clientId:"17e5f671-d194-4dfb-9706-5516cb48c098",tokenUrl:"https://auth.kimi.com/api/oauth/token",refreshUrl:"https://auth.kimi.com/api/oauth/token"},kilocode:{baseUrl:"https://api.kilo.ai/api/openrouter/chat/completions",format:"openai",headers:{}},cline:{baseUrl:"https://api.cline.bot/api/v1/chat/completions",format:"openai",headers:{"HTTP-Referer":"https://cline.bot","X-Title":"Cline"},tokenUrl:"https://api.cline.bot/api/v1/auth/token",refreshUrl:"https://api.cline.bot/api/v1/auth/refresh"},nvidia:{baseUrl:"https://integrate.api.nvidia.com/v1/chat/completions",format:"openai"},anthropic:{baseUrl:"https://api.anthropic.com/v1/messages",format:"claude",headers:{...e}},deepseek:{baseUrl:"https://api.deepseek.com/chat/completions",format:"openai"},groq:{baseUrl:"https://api.groq.com/openai/v1/chat/completions",format:"openai"},xai:{baseUrl:"https://api.x.ai/v1/chat/completions",format:"openai"},mistral:{baseUrl:"https://api.mistral.ai/v1/chat/completions",format:"openai"},perplexity:{baseUrl:"https://api.perplexity.ai/chat/completions",format:"openai"},together:{baseUrl:"https://api.together.xyz/v1/chat/completions",format:"openai"},fireworks:{baseUrl:"https://api.fireworks.ai/inference/v1/chat/completions",format:"openai"},cerebras:{baseUrl:"https://api.cerebras.ai/v1/chat/completions",format:"openai"},cohere:{baseUrl:"https://api.cohere.ai/v1/chat/completions",format:"openai"},nebius:{baseUrl:"https://api.studio.nebius.ai/v1/chat/completions",format:"openai"},siliconflow:{baseUrl:"https://api.siliconflow.cn/v1/chat/completions",format:"openai"},hyperbolic:{baseUrl:"https://api.hyperbolic.xyz/v1/chat/completions",format:"openai"},deepgram:{baseUrl:"https://api.deepgram.com/v1/listen",format:"openai"},assemblyai:{baseUrl:"https://api.assemblyai.com/v1/audio/transcriptions",format:"openai"},nanobanana:{baseUrl:"https://api.nanobananaapi.ai/v1/chat/completions",format:"openai"},chutes:{baseUrl:"https://llm.chutes.ai/v1/chat/completions",format:"openai"},ollama:{baseUrl:"https://ollama.com/api/chat",format:"ollama"},"ollama-local":{baseUrl:"http://localhost:11434/api/chat",format:"ollama"},vertex:{baseUrl:"https://aiplatform.googleapis.com",format:"gemini"},"vertex-partner":{baseUrl:"https://aiplatform.googleapis.com",format:"openai"}},h={cc:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4-5-20251101",name:"Claude 4.5 Opus"},{id:"claude-sonnet-4-5-20250929",name:"Claude 4.5 Sonnet"},{id:"claude-haiku-4-5-20251001",name:"Claude 4.5 Haiku"}],cx:[{id:"gpt-5.4",name:"GPT 5.4"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"},{id:"gpt-5.3-codex-xhigh",name:"GPT 5.3 Codex (xHigh)"},{id:"gpt-5.3-codex-high",name:"GPT 5.3 Codex (High)"},{id:"gpt-5.3-codex-low",name:"GPT 5.3 Codex (Low)"},{id:"gpt-5.3-codex-none",name:"GPT 5.3 Codex (None)"},{id:"gpt-5.3-codex-spark",name:"GPT 5.3 Codex Spark"},{id:"gpt-5.1-codex-mini",name:"GPT 5.1 Codex Mini"},{id:"gpt-5.1-codex-mini-high",name:"GPT 5.1 Codex Mini (High)"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.1-codex-max",name:"GPT 5.1 Codex Max"},{id:"gpt-5.1-codex",name:"GPT 5.1 Codex"},{id:"gpt-5.1",name:"GPT 5.1"},{id:"gpt-5-codex",name:"GPT 5 Codex"},{id:"gpt-5-codex-mini",name:"GPT 5 Codex Mini"}],gc:[{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"}],qw:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-coder-flash",name:"Qwen3 Coder Flash"},{id:"vision-model",name:"Qwen3 Vision Model"},{id:"coder-model",name:"Qwen3.5 Coder Model"}],if:[{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"qwen3-max",name:"Qwen3 Max"},{id:"qwen3-vl-plus",name:"Qwen3 VL Plus"},{id:"qwen3-max-preview",name:"Qwen3 Max Preview"},{id:"qwen3-235b",name:"Qwen3 235B A22B"},{id:"qwen3-235b-a22b-instruct",name:"Qwen3 235B A22B Instruct"},{id:"qwen3-235b-a22b-thinking-2507",name:"Qwen3 235B A22B Thinking"},{id:"qwen3-32b",name:"Qwen3 32B"},{id:"kimi-k2",name:"Kimi K2"},{id:"deepseek-v3.2",name:"DeepSeek V3.2 Exp"},{id:"deepseek-v3.1",name:"DeepSeek V3.1 Terminus"},{id:"deepseek-v3",name:"DeepSeek V3 671B"},{id:"deepseek-r1",name:"DeepSeek R1"},{id:"glm-4.7",name:"GLM 4.7"},{id:"iflow-rome-30ba3b",name:"iFlow ROME"}],ag:[{id:"gemini-3.1-pro-high",name:"Gemini 3 Pro High"},{id:"gemini-3.1-pro-low",name:"Gemini 3 Pro Low"},{id:"gemini-3-flash",name:"Gemini 3 Flash"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4-6-thinking",name:"Claude Opus 4.6 Thinking"},{id:"gpt-oss-120b-medium",name:"GPT OSS 120B Medium"}],gh:[{id:"gpt-3.5-turbo",name:"GPT-3.5 Turbo"},{id:"gpt-4",name:"GPT-4"},{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-4o-mini",name:"GPT-4o mini"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-5",name:"GPT-5"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-5-codex",name:"GPT-5 Codex"},{id:"gpt-5.1",name:"GPT-5.1"},{id:"gpt-5.1-codex",name:"GPT-5.1 Codex"},{id:"gpt-5.1-codex-mini",name:"GPT-5.1 Codex Mini"},{id:"gpt-5.1-codex-max",name:"GPT-5.1 Codex Max"},{id:"gpt-5.2",name:"GPT-5.2"},{id:"gpt-5.2-codex",name:"GPT-5.2 Codex"},{id:"gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"gpt-5.4",name:"GPT-5.4"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"claude-opus-4.1",name:"Claude Opus 4.1"},{id:"claude-opus-4.5",name:"Claude Opus 4.5"},{id:"claude-sonnet-4",name:"Claude Sonnet 4"},{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"claude-opus-4.6",name:"Claude Opus 4.6"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro"},{id:"grok-code-fast-1",name:"Grok Code Fast 1"},{id:"oswe-vscode-prime",name:"Raptor Mini"}],kr:[{id:"claude-sonnet-4.5",name:"Claude Sonnet 4.5"},{id:"claude-haiku-4.5",name:"Claude Haiku 4.5"},{id:"deepseek-3.2",name:"DeepSeek 3.2"},{id:"deepseek-3.1",name:"DeepSeek 3.1"},{id:"qwen3-coder-next",name:"Qwen3 Coder Next"}],cu:[{id:"default",name:"Auto (Server Picks)"},{id:"claude-4.5-opus-high-thinking",name:"Claude 4.5 Opus High Thinking"},{id:"claude-4.5-opus-high",name:"Claude 4.5 Opus High"},{id:"claude-4.5-sonnet-thinking",name:"Claude 4.5 Sonnet Thinking"},{id:"claude-4.5-sonnet",name:"Claude 4.5 Sonnet"},{id:"claude-4.5-haiku",name:"Claude 4.5 Haiku"},{id:"claude-4.5-opus",name:"Claude 4.5 Opus"},{id:"gpt-5.2-codex",name:"GPT 5.2 Codex"},{id:"claude-4.6-opus-max",name:"Claude 4.6 Opus Max"},{id:"claude-4.6-sonnet-medium-thinking",name:"Claude 4.6 Sonnet Medium Thinking"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gpt-5.2",name:"GPT 5.2"},{id:"gpt-5.3-codex",name:"GPT 5.3 Codex"}],kmc:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],kc:[{id:"anthropic/claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"anthropic/claude-opus-4-20250514",name:"Claude Opus 4"},{id:"google/gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"google/gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"openai/gpt-4.1",name:"GPT-4.1"},{id:"openai/o3",name:"o3"},{id:"deepseek/deepseek-chat",name:"DeepSeek Chat"},{id:"deepseek/deepseek-reasoner",name:"DeepSeek Reasoner"}],cl:[{id:"anthropic/claude-sonnet-4.6",name:"Claude Sonnet 4.6"},{id:"anthropic/claude-opus-4.6",name:"Claude Opus 4.6"},{id:"openai/gpt-5.3-codex",name:"GPT-5.3 Codex"},{id:"openai/gpt-5.4",name:"GPT-5.4"},{id:"google/gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"google/gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"kwaipilot/kat-coder-pro",name:"KAT Coder Pro"}],openai:[{id:"gpt-4o",name:"GPT-4o"},{id:"gpt-5-mini",name:"GPT-5 Mini"},{id:"gpt-4-turbo",name:"GPT-4 Turbo"},{id:"o1",name:"O1"},{id:"o1-mini",name:"O1 Mini"}],anthropic:[{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4"},{id:"claude-opus-4-20250514",name:"Claude Opus 4"},{id:"claude-3-5-sonnet-20241022",name:"Claude 3.5 Sonnet"}],gemini:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"gemini-3-pro-preview",name:"Gemini 3 Pro Preview"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"},{id:"gemini-2.5-flash-lite",name:"Gemini 2.5 Flash Lite"},{id:"gemini-embedding-001",name:"Gemini Embedding 001",type:"embedding"},{id:"text-embedding-005",name:"Text Embedding 005",type:"embedding"},{id:"text-embedding-004",name:"Text Embedding 004 (Legacy)",type:"embedding"}],openrouter:[{id:"auto",name:"Auto (Best Available)"}],glm:[{id:"glm-5",name:"GLM 5"},{id:"glm-4.7",name:"GLM 4.7"},{id:"glm-4.6v",name:"GLM 4.6V (Vision)"}],"glm-cn":[{id:"glm-5",name:"GLM 5"},{id:"glm-4.7",name:"GLM-4.7"},{id:"glm-4.6",name:"GLM-4.6"},{id:"glm-4.5-air",name:"GLM-4.5-Air"}],kimi:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2.5-thinking",name:"Kimi K2.5 Thinking"},{id:"kimi-latest",name:"Kimi Latest"}],minimax:[{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"MiniMax-M2.1",name:"MiniMax M2.1"}],"minimax-cn":[{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"MiniMax-M2.1",name:"MiniMax M2.1"}],alicode:[{id:"qwen3.5-plus",name:"Qwen3.5 Plus"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"qwen3-max-2026-01-23",name:"Qwen3 Max"},{id:"qwen3-coder-next",name:"Qwen3 Coder Next"},{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"glm-4.7",name:"GLM 4.7"}],"alicode-intl":[{id:"qwen3.5-plus",name:"Qwen3.5 Plus"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"},{id:"qwen3-coder-next",name:"Qwen3 Coder Next"},{id:"qwen3-coder-plus",name:"Qwen3 Coder Plus"},{id:"glm-4.7",name:"GLM 4.7"}],deepseek:[{id:"deepseek-chat",name:"DeepSeek V3.2 Chat"},{id:"deepseek-reasoner",name:"DeepSeek V3.2 Reasoner"}],groq:[{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B"},{id:"meta-llama/llama-4-maverick-17b-128e-instruct",name:"Llama 4 Maverick"},{id:"qwen/qwen3-32b",name:"Qwen3 32B"},{id:"openai/gpt-oss-120b",name:"GPT-OSS 120B"}],xai:[{id:"grok-4",name:"Grok 4"},{id:"grok-4-fast-reasoning",name:"Grok 4 Fast Reasoning"},{id:"grok-code-fast-1",name:"Grok Code Fast"},{id:"grok-3",name:"Grok 3"}],mistral:[{id:"mistral-large-latest",name:"Mistral Large 3"},{id:"codestral-latest",name:"Codestral"},{id:"mistral-medium-latest",name:"Mistral Medium 3"}],perplexity:[{id:"sonar-pro",name:"Sonar Pro"},{id:"sonar",name:"Sonar"}],together:[{id:"meta-llama/Llama-3.3-70B-Instruct-Turbo",name:"Llama 3.3 70B Turbo"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"Qwen/Qwen3-235B-A22B",name:"Qwen3 235B"},{id:"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",name:"Llama 4 Maverick"}],fireworks:[{id:"accounts/fireworks/models/deepseek-v3p1",name:"DeepSeek V3.1"},{id:"accounts/fireworks/models/llama-v3p3-70b-instruct",name:"Llama 3.3 70B"},{id:"accounts/fireworks/models/qwen3-235b-a22b",name:"Qwen3 235B"}],cerebras:[{id:"gpt-oss-120b",name:"GPT OSS 120B"},{id:"zai-glm-4.7",name:"ZAI GLM 4.7"},{id:"llama-3.3-70b",name:"Llama 3.3 70B"},{id:"llama-4-scout-17b-16e-instruct",name:"Llama 4 Scout"},{id:"qwen-3-235b-a22b-instruct-2507",name:"Qwen3 235B A22B"},{id:"qwen-3-32b",name:"Qwen3 32B"}],cohere:[{id:"command-r-plus-08-2024",name:"Command R+ (Aug 2024)"},{id:"command-r-08-2024",name:"Command R (Aug 2024)"},{id:"command-a-03-2025",name:"Command A (Mar 2025)"}],nvidia:[{id:"moonshotai/kimi-k2.5",name:"Kimi K2.5"},{id:"z-ai/glm4.7",name:"GLM 4.7"},{id:"deepseek-ai/deepseek-v3.2",name:"DeepSeek V3.2"},{id:"nvidia/llama-3.3-70b-instruct",name:"Llama 3.3 70B"},{id:"meta/llama-4-maverick-17b-128e-instruct",name:"Llama 4 Maverick"},{id:"deepseek/deepseek-r1",name:"DeepSeek R1"}],nebius:[{id:"meta-llama/Llama-3.3-70B-Instruct",name:"Llama 3.3 70B Instruct"}],siliconflow:[{id:"deepseek-ai/DeepSeek-V3.2",name:"DeepSeek V3.2"},{id:"deepseek-ai/DeepSeek-V3.1",name:"DeepSeek V3.1"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"Qwen/Qwen3-235B-A22B-Instruct-2507",name:"Qwen3 235B"},{id:"Qwen/Qwen3-Coder-480B-A35B-Instruct",name:"Qwen3 Coder 480B"},{id:"Qwen/Qwen3-32B",name:"Qwen3 32B"},{id:"moonshotai/Kimi-K2.5",name:"Kimi K2.5"},{id:"zai-org/GLM-4.7",name:"GLM 4.7"},{id:"openai/gpt-oss-120b",name:"GPT OSS 120B"},{id:"baidu/ERNIE-4.5-300B-A47B",name:"ERNIE 4.5 300B"}],hyperbolic:[{id:"Qwen/QwQ-32B",name:"QwQ 32B"},{id:"deepseek-ai/DeepSeek-R1",name:"DeepSeek R1"},{id:"deepseek-ai/DeepSeek-V3",name:"DeepSeek V3"},{id:"meta-llama/Llama-3.3-70B-Instruct",name:"Llama 3.3 70B"},{id:"meta-llama/Llama-3.2-3B-Instruct",name:"Llama 3.2 3B"},{id:"Qwen/Qwen2.5-72B-Instruct",name:"Qwen 2.5 72B"},{id:"Qwen/Qwen2.5-Coder-32B-Instruct",name:"Qwen 2.5 Coder 32B"},{id:"NousResearch/Hermes-3-Llama-3.1-70B",name:"Hermes 3 70B"}],ollama:[{id:"gpt-oss:120b",name:"GPT OSS 120B"},{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"glm-5",name:"GLM 5"},{id:"minimax-m2.5",name:"MiniMax M2.5"},{id:"glm-4.7-flash",name:"GLM 4.7 Flash"},{id:"qwen3.5",name:"Qwen3.5"}],vertex:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro Preview"},{id:"gemini-3.1-flash-lite-preview",name:"Gemini 3.1 Flash Lite Preview"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}],"vertex-partner":[{id:"deepseek-ai/deepseek-v3.2-maas",name:"DeepSeek V3.2 (Vertex)"},{id:"qwen/qwen3-next-80b-a3b-thinking-maas",name:"Qwen3 Next 80B Thinking (Vertex)"},{id:"qwen/qwen3-next-80b-a3b-instruct-maas",name:"Qwen3 Next 80B Instruct (Vertex)"},{id:"zai-org/glm-5-maas",name:"GLM-5 (Vertex)"}]},i={claude:"cc",codex:"cx","gemini-cli":"gc",qwen:"qw",iflow:"if",antigravity:"ag",github:"gh",kiro:"kr",cursor:"cu","kimi-coding":"kmc",kilocode:"kc",cline:"cl",vertex:"vertex","vertex-partner":"vertex-partner"},j=Object.fromEntries(Object.keys(g).map(a=>[a,i[a]||a]));function k(a){return h[j[a]||a]||[]}Object.entries(c(96919).Q2).filter(([,a])=>a.passthroughModels).map(([a])=>a),Object.entries(h).flatMap(([a,b])=>b.map(b=>({provider:a,model:b.id,name:b.name})))},85117:(a,b,c)=>{"use strict";c.d(b,{RuntimeI18nProvider:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call RuntimeI18nProvider() from the server but RuntimeI18nProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/nip/WORKSPACE/02.SOURCE/ICHECK/01. PROJECT/AI CENTER/arouter/src/i18n/RuntimeI18nProvider.js","RuntimeI18nProvider")},87570:(a,b,c)=>{Promise.resolve().then(c.bind(c,85117)),Promise.resolve().then(c.bind(c,89886))},89886:(a,b,c)=>{"use strict";c.d(b,{ThemeProvider:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call ThemeProvider() from the server but ThemeProvider is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/nip/WORKSPACE/02.SOURCE/ICHECK/01. PROJECT/AI CENTER/arouter/src/shared/components/ThemeProvider.js","ThemeProvider")},96919:(a,b,c)=>{"use strict";c.d(b,{Q2:()=>h,fg:()=>e,gb:()=>g,mq:()=>f,zN:()=>d});let d={claude:{id:"claude",alias:"cc",name:"Claude Code",icon:"smart_toy",color:"#D97757"},antigravity:{id:"antigravity",alias:"ag",name:"Antigravity",icon:"rocket_launch",color:"#F59E0B"},codex:{id:"codex",alias:"cx",name:"OpenAI Codex",icon:"code",color:"#3B82F6"},github:{id:"github",alias:"gh",name:"GitHub Copilot",icon:"code",color:"#333333"},cursor:{id:"cursor",alias:"cu",name:"Cursor IDE",icon:"edit_note",color:"#00D4AA"},kilocode:{id:"kilocode",alias:"kc",name:"Kilo Code",icon:"code",color:"#FF6B35",textIcon:"KC"},cline:{id:"cline",alias:"cl",name:"Cline",icon:"smart_toy",color:"#5B9BD5",textIcon:"CL"}},e={openrouter:{id:"openrouter",alias:"openrouter",name:"OpenRouter",icon:"router",color:"#F97316",textIcon:"OR",passthroughModels:!0,website:"https://openrouter.ai"},glm:{id:"glm",alias:"glm",name:"GLM Coding",icon:"code",color:"#2563EB",textIcon:"GL",website:"https://open.bigmodel.cn"},"glm-cn":{id:"glm-cn",alias:"glm-cn",name:"GLM (China)",icon:"code",color:"#DC2626",textIcon:"GC",website:"https://open.bigmodel.cn"},kimi:{id:"kimi",alias:"kimi",name:"Kimi",icon:"psychology",color:"#1E3A8A",textIcon:"KM",website:"https://kimi.moonshot.cn"},minimax:{id:"minimax",alias:"minimax",name:"Minimax Coding",icon:"memory",color:"#7C3AED",textIcon:"MM",website:"https://www.minimaxi.com"},"minimax-cn":{id:"minimax-cn",alias:"minimax-cn",name:"Minimax (China)",icon:"memory",color:"#DC2626",textIcon:"MC",website:"https://www.minimaxi.com"},alicode:{id:"alicode",alias:"alicode",name:"Alibaba",icon:"cloud",color:"#FF6A00",textIcon:"ALi"},"alicode-intl":{id:"alicode-intl",alias:"alicode-intl",name:"Alibaba Intl",icon:"cloud",color:"#FF6A00",textIcon:"ALi"},openai:{id:"openai",alias:"openai",name:"OpenAI",icon:"auto_awesome",color:"#10A37F",textIcon:"OA",website:"https://platform.openai.com"},anthropic:{id:"anthropic",alias:"anthropic",name:"Anthropic",icon:"smart_toy",color:"#D97757",textIcon:"AN",website:"https://console.anthropic.com"},gemini:{id:"gemini",alias:"gemini",name:"Gemini",icon:"diamond",color:"#4285F4",textIcon:"GE",website:"https://ai.google.dev"},deepseek:{id:"deepseek",alias:"ds",name:"DeepSeek",icon:"bolt",color:"#4D6BFE",textIcon:"DS",website:"https://deepseek.com"},groq:{id:"groq",alias:"groq",name:"Groq",icon:"speed",color:"#F55036",textIcon:"GQ",website:"https://groq.com"},xai:{id:"xai",alias:"xai",name:"xAI (Grok)",icon:"auto_awesome",color:"#1DA1F2",textIcon:"XA",website:"https://x.ai"},mistral:{id:"mistral",alias:"mistral",name:"Mistral",icon:"air",color:"#FF7000",textIcon:"MI",website:"https://mistral.ai"},perplexity:{id:"perplexity",alias:"pplx",name:"Perplexity",icon:"search",color:"#20808D",textIcon:"PP",website:"https://www.perplexity.ai"},together:{id:"together",alias:"together",name:"Together AI",icon:"group_work",color:"#0F6FFF",textIcon:"TG",website:"https://www.together.ai"},fireworks:{id:"fireworks",alias:"fireworks",name:"Fireworks AI",icon:"local_fire_department",color:"#7B2EF2",textIcon:"FW",website:"https://fireworks.ai"},cerebras:{id:"cerebras",alias:"cerebras",name:"Cerebras",icon:"memory",color:"#FF4F00",textIcon:"CB",website:"https://www.cerebras.ai"},cohere:{id:"cohere",alias:"cohere",name:"Cohere",icon:"hub",color:"#39594D",textIcon:"CO",website:"https://cohere.com"},nvidia:{id:"nvidia",alias:"nvidia",name:"NVIDIA NIM",icon:"developer_board",color:"#76B900",textIcon:"NV",website:"https://developer.nvidia.com/nim"},nebius:{id:"nebius",alias:"nebius",name:"Nebius AI",icon:"cloud",color:"#6C5CE7",textIcon:"NB",website:"https://nebius.com"},siliconflow:{id:"siliconflow",alias:"siliconflow",name:"SiliconFlow",icon:"cloud_queue",color:"#5B6EF5",textIcon:"SF",website:"https://cloud.siliconflow.com"},hyperbolic:{id:"hyperbolic",alias:"hyp",name:"Hyperbolic",icon:"bolt",color:"#00D4FF",textIcon:"HY",website:"https://hyperbolic.xyz"},deepgram:{id:"deepgram",alias:"dg",name:"Deepgram",icon:"mic",color:"#13EF93",textIcon:"DG",website:"https://deepgram.com"},assemblyai:{id:"assemblyai",alias:"aai",name:"AssemblyAI",icon:"record_voice_over",color:"#0062FF",textIcon:"AA",website:"https://assemblyai.com"},nanobanana:{id:"nanobanana",alias:"nb",name:"NanoBanana",icon:"image",color:"#FFD700",textIcon:"NB",website:"https://nanobananaapi.ai"},chutes:{id:"chutes",alias:"ch",name:"Chutes AI",icon:"water_drop",color:"#ffffffff",textIcon:"CH",website:"https://chutes.ai"},ollama:{id:"ollama",alias:"ollama",name:"Ollama Cloud",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com"},"ollama-local":{id:"ollama-local",alias:"ollama-local",name:"Ollama Local",icon:"cloud",color:"#ffffffff",textIcon:"OL",website:"https://ollama.com"},vertex:{id:"vertex",alias:"vx",name:"Vertex AI",icon:"cloud",color:"#4285F4",textIcon:"VX",website:"https://cloud.google.com/vertex-ai"},"vertex-partner":{id:"vertex-partner",alias:"vxp",name:"Vertex Partner",icon:"cloud",color:"#34A853",textIcon:"VP",website:"https://cloud.google.com/vertex-ai/generative-ai/docs/partner-models/use-partner-models"}};function f(a){return"string"==typeof a&&a.startsWith("openai-compatible-")}function g(a){return"string"==typeof a&&a.startsWith("anthropic-compatible-")}let h={iflow:{id:"iflow",alias:"if",name:"iFlow AI",icon:"water_drop",color:"#6366F1"},qwen:{id:"qwen",alias:"qw",name:"Qwen Code",icon:"psychology",color:"#10B981"},"gemini-cli":{id:"gemini-cli",alias:"gc",name:"Gemini CLI",icon:"terminal",color:"#4285F4"},kiro:{id:"kiro",alias:"kr",name:"Kiro AI",icon:"psychology_alt",color:"#FF6B35"},...d,...e};Object.values(h).reduce((a,b)=>(a[b.alias]=b.id,a),{}),Object.values(h).reduce((a,b)=>(a[b.id]=b.alias,a),{})},99258:(a,b,c)=>{"use strict";c.d(b,{FE:()=>k,Tl:()=>i,wn:()=>l});var d=c(51126);let e={},f=d.Xn,g=[];async function h(a){if("en"===a){e={};return}try{let b=await fetch(`/i18n/literals/${a}.json`);e=await b.json()}catch(a){console.error("Failed to load translations:",a),e={}}}function i(a){if(!a||"string"!=typeof a)return a;let b=a.trim();return b&&"en"!==f&&e[b]||a}function j(a){if(!a.nodeValue||!a.nodeValue.trim())return;let b=a.parentElement;if(!b)return;let c=b;for(;c;){if(c.hasAttribute&&c.hasAttribute("data-i18n-skip"))return;c=c.parentElement}if(["script","style","code","pre","colgroup","table","thead","tbody","tfoot","tr","select","datalist","optgroup"].includes(b.tagName?.toLowerCase()))return;a._originalText||(a._originalText=a.nodeValue);let d=i(a._originalText);d!==a.nodeValue&&(a.nodeValue=d)}async function k(){}async function l(){f=function(){if("u"<typeof document)return d.Xn;let a=document.cookie.split(";").find(a=>a.trim().startsWith(`${d.CL}=`)),b=a?decodeURIComponent(a.split("=")[1]):d.Xn;return(0,d.QC)(b)}(),await h(f),g.forEach(a=>a()),function(a){let b;if(!a)return;let c=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1),d=[];for(;b=c.nextNode();)d.push(b);d.forEach(j)}(document.body)}}};