@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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +9 -8
- package/.next/standalone/.next/build-manifest.json +4 -4
- package/.next/standalone/.next/prerender-manifest.json +3 -3
- package/.next/standalone/.next/required-server-files.json +4 -4
- package/.next/standalone/.next/routes-manifest.json +6 -0
- package/.next/standalone/.next/server/app/(dashboard)/mitm/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/mitm/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/mitm/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js +3 -3
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +2 -2
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/console-logs/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/console-logs/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route.js +8 -0
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/logs/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/settings/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js +3 -3
- package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/keys/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/keys/route.js +1 -1
- package/.next/standalone/.next/server/app/api/keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/locale/route.js +2 -2
- package/.next/standalone/.next/server/app/api/locale/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/models/alias/route.js +1 -1
- package/.next/standalone/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/models/route.js +1 -1
- package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/providers/route.js +1 -1
- package/.next/standalone/.next/server/app/api/providers/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/version/route.js +1 -1
- package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/!KGRhc2hib2FyZCk/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/mitm.html +1 -1
- package/.next/standalone/.next/server/app/mitm.rsc +5 -5
- package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk/mitm/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk/mitm.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/mitm.segments/_full.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/mitm.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/mitm.segments/_index.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/mitm.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +9 -8
- package/.next/standalone/.next/server/chunks/138.js +1 -1
- package/.next/standalone/.next/server/chunks/182.js +9 -2
- package/.next/standalone/.next/server/chunks/219.js +1 -0
- package/.next/standalone/.next/server/chunks/471.js +13 -0
- package/.next/standalone/.next/server/chunks/741.js +2 -2
- package/.next/standalone/.next/server/chunks/900.js +7 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware.js +2 -2
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +2 -2
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{702-726ccbcada41f8fa.js → 702-c4610efa55dfb155.js} +1 -1
- package/.next/standalone/.next/static/chunks/{794-e4409998c8ba5c29.js → 794-37dad9bbc14b04b8.js} +1 -1
- package/.next/standalone/.next/static/chunks/{852-6b2b2eefb2d99b28.js → 852-d8cad4b0d71288a2.js} +3 -3
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-579c25ca675b41ac.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/mitm/page-d25cf1803f6924ee.js +7 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{page-a4e7c4e324778903.js → page-5c09ac097fc0cc9b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/_global-error/{page-a4e7c4e324778903.js → page-5c09ac097fc0cc9b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/_not-found/{page-f6a07fd1289f84a5.js → page-038730efde50428c.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/{route-a4e7c4e324778903.js → route-5c09ac097fc0cc9b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/console-logs/{route-a4e7c4e324778903.js → route-5c09ac097fc0cc9b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/logs/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/keys/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/locale/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/models/alias/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/models/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/providers/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/settings/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/version/route-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/{layout-6de9a5310276adf9.js → layout-6e491caa4df42293.js} +1 -1
- package/.next/standalone/.next/static/chunks/{main-9b410d84e10d7a77.js → main-842bf1ddb8ee9ec0.js} +2 -2
- package/.next/standalone/.next/static/chunks/{main-app-2ed2446a2e4f75e7.js → main-app-0fea626ed7ee1281.js} +1 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-89d8af6ad4f69554.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5c09ac097fc0cc9b.js +1 -0
- package/.next/standalone/.next/static/rZAYFVGk5tWg3Az1gc9jl/_buildManifest.js +1 -0
- package/.next/standalone/node_modules/@next/env/package.json +1 -1
- package/.next/standalone/node_modules/next/dist/build/swc/index.js +1 -1
- package/.next/standalone/node_modules/next/dist/build/webpack-config.js +3 -3
- package/.next/standalone/node_modules/next/dist/compiled/http-proxy/index.js +5 -5
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-experimental.runtime.prod.js +3 -3
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo-experimental.runtime.prod.js +12 -12
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page-turbo.runtime.prod.js +3 -3
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-page.runtime.prod.js +3 -3
- package/.next/standalone/node_modules/next/dist/compiled/next-server/app-route.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages-turbo.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/compiled/next-server/pages.runtime.prod.js +2 -2
- package/.next/standalone/node_modules/next/dist/server/app-render/action-handler.js +7 -11
- package/.next/standalone/node_modules/next/dist/server/base-server.js +22 -8
- package/.next/standalone/node_modules/next/dist/server/config-schema.js +0 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-turbopack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/image-optimizer.js +22 -148
- package/.next/standalone/node_modules/next/dist/server/lib/app-info-log.js +1 -1
- package/.next/standalone/node_modules/next/dist/server/lib/lru-cache.js +1 -2
- package/.next/standalone/node_modules/next/dist/server/lib/patch-fetch.js +6 -15
- package/.next/standalone/node_modules/next/dist/server/lib/router-server.js +3 -3
- package/.next/standalone/node_modules/next/dist/server/lib/router-utils/{block-cross-site-dev.js → block-cross-site.js} +17 -11
- package/.next/standalone/node_modules/next/dist/server/lib/start-server.js +1 -1
- package/.next/standalone/node_modules/next/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/.next/standalone/node_modules/next/dist/shared/lib/image-config.js +0 -1
- package/.next/standalone/node_modules/next/dist/telemetry/anonymous-meta.js +1 -1
- package/.next/standalone/node_modules/next/dist/telemetry/events/version.js +2 -2
- package/.next/standalone/node_modules/next/package.json +16 -16
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/src/mitm/manager.js +30 -9
- package/bin/arouter.js +292 -0
- package/bin/arouter.mjs +264 -111
- package/bin/paths.js +23 -0
- package/bin/paths.mjs +23 -0
- package/package.json +1 -1
- package/scripts/postinstall.mjs +0 -4
- package/.next/standalone/.next/server/chunks/411.js +0 -1
- package/.next/standalone/.next/server/chunks/63.js +0 -13
- package/.next/standalone/.next/server/chunks/724.js +0 -7
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-384bfa634ec14bbe.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/mitm/page-3dca1ab0735aaa0f.js +0 -7
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/keys/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/locale/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/models/alias/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/models/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/providers/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/settings/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/version/route-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-a42479e2ca7868a9.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-a4e7c4e324778903.js +0 -1
- package/.next/standalone/.next/static/uPrRUZ-734mcKsKT6Fb28/_buildManifest.js +0 -1
- package/.next/standalone/node_modules/next/dist/server/lib/disk-lru-cache.external.js +0 -57
- package/.next/standalone/node_modules/next/dist/server/lib/postponed-request-body.js +0 -64
- /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
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
|
40
|
-
if (!
|
|
41
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
return false;
|
|
113
|
+
error("Build failed. Check the output above.");
|
|
114
|
+
process.exit(1);
|
|
52
115
|
}
|
|
53
116
|
}
|
|
54
117
|
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
if (
|
|
58
|
-
|
|
59
|
-
console.log(
|
|
60
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
const
|
|
135
|
+
await buildIfNeeded();
|
|
136
|
+
|
|
137
|
+
log("Starting aRouter...");
|
|
138
|
+
|
|
139
|
+
const logFd = openSync(LOG_FILE, "a");
|
|
74
140
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
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:
|
|
81
|
-
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.
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
104
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
process.exit(0);
|
|
183
|
+
warn("aRouter is not running.");
|
|
184
|
+
return;
|
|
109
185
|
}
|
|
110
186
|
|
|
111
|
-
|
|
187
|
+
log(`Stopping aRouter (PID: ${pid})...`);
|
|
112
188
|
try {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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
|
-
|
|
119
|
-
process.exit(1);
|
|
201
|
+
warn(`Could not kill process: ${e.message}`);
|
|
120
202
|
}
|
|
121
203
|
|
|
122
|
-
}
|
|
123
|
-
|
|
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
|
-
|
|
126
|
-
console.log(`
|
|
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
|
-
|
|
214
|
+
warn("aRouter is not running.");
|
|
131
215
|
}
|
|
216
|
+
}
|
|
132
217
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
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
|
-
|
|
276
|
+
execSync(`rm -rf "${nextDir}"`, { cwd: PROJECT_ROOT, stdio: "ignore" });
|
|
140
277
|
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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
package/scripts/postinstall.mjs
CHANGED
|
@@ -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)}}};
|