67router 1.0.5 → 1.0.7
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/README.md +139 -190
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +2 -2
- package/app/.next-cli-build/build-manifest.json +3 -3
- package/app/.next-cli-build/react-loadable-manifest.json +20 -29
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +4 -4
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/reset-password/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codewhale-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/crush-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/devin-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/forge-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/omp-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/smelt-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/presets/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/catalog-sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/api-key/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/overrides/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/netlify-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[...model]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/systemone/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +4 -4
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +4 -4
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +4 -4
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +4 -4
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +2 -2
- package/app/.next-cli-build/server/chunks/3449.js +1 -1
- package/app/.next-cli-build/server/chunks/412.js +1 -1
- package/app/.next-cli-build/server/chunks/4190.js +1 -1
- package/app/.next-cli-build/server/chunks/4254.js +1 -0
- package/app/.next-cli-build/server/chunks/6540.js +1 -1
- package/app/.next-cli-build/server/chunks/7037.js +1 -1
- package/app/.next-cli-build/server/chunks/7066.js +1 -1
- package/app/.next-cli-build/server/chunks/827.js +1 -1
- package/app/.next-cli-build/server/chunks/869.js +1 -1
- package/app/.next-cli-build/server/chunks/9604.js +1 -1
- package/app/.next-cli-build/server/instrumentation.js.nft.json +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware-react-loadable-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js.nft.json +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/124.c1b5af11afe50408.js +1 -0
- package/app/.next-cli-build/static/chunks/{1321-a966036b7e3ae8c3.js → 1321-6630b5aa23e3ec0e.js} +1 -1
- package/app/.next-cli-build/static/chunks/2435.73c540d31dae9ecf.js +1 -0
- package/app/.next-cli-build/static/chunks/3521.f0ac0c88103b9f6c.js +1 -0
- package/app/.next-cli-build/static/chunks/5497-1681f72f0e82b863.js +7 -0
- package/app/.next-cli-build/static/chunks/5524.fca1db6352c39218.js +1 -0
- package/app/.next-cli-build/static/chunks/6808-b6550a28721e71e1.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/{page-1f79ed13b16582ef.js → page-be90b4d4a94a121d.js} +1 -1
- package/app/.next-cli-build/static/chunks/webpack-396894770603fee1.js +1 -0
- package/app/.next-cli-build/static/css/2388dd0fafaf8266.css +1 -0
- package/app/cli/.build-home/AppData/Roaming/67router/db/data.sqlite-shm +0 -0
- package/app/cli/.build-home/AppData/Roaming/67router/db/data.sqlite-wal +0 -0
- package/app/package.json +1 -1
- package/cli.js +54 -54
- package/package.json +1 -1
- package/src/cli/tray/tray.ps1 +64 -10
- package/src/cli/tray/trayWin.js +38 -15
- package/app/.next-cli-build/server/chunks/6708.js +0 -1
- package/app/.next-cli-build/server/chunks/7121.js +0 -1
- package/app/.next-cli-build/static/chunks/124.c092990b4bdb9713.js +0 -1
- package/app/.next-cli-build/static/chunks/2435.8a5a02e626c780d0.js +0 -1
- package/app/.next-cli-build/static/chunks/3521.a9e2daf685420cc7.js +0 -1
- package/app/.next-cli-build/static/chunks/5497-3cf29976f188352b.js +0 -7
- package/app/.next-cli-build/static/chunks/6808-9540d7ac65c3e6a0.js +0 -1
- package/app/.next-cli-build/static/chunks/webpack-97b250ee703d0d92.js +0 -1
- package/app/.next-cli-build/static/css/d9ba36d87937fec6.css +0 -1
- /package/app/.next-cli-build/static/{RC_KHxUynSqU7uk0euJap → ZSFfwWCBng6VPk2-0itNU}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{RC_KHxUynSqU7uk0euJap → ZSFfwWCBng6VPk2-0itNU}/_ssgManifest.js +0 -0
package/cli.js
CHANGED
|
@@ -660,6 +660,60 @@ function startServer(updatePromise) {
|
|
|
660
660
|
|
|
661
661
|
let server = spawnServer();
|
|
662
662
|
|
|
663
|
+
function attachServerEvents() {
|
|
664
|
+
server.on("error", (err) => {
|
|
665
|
+
console.error("Failed to start server:", err.message);
|
|
666
|
+
if (!isShuttingDown) tryRestart();
|
|
667
|
+
else { cleanup(); process.exit(1); }
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
server.on("close", (code) => {
|
|
671
|
+
if (isShuttingDown) {
|
|
672
|
+
process.exit(code || 0);
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
tryRestart(code);
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function tryRestart(code) {
|
|
680
|
+
const aliveMs = Date.now() - serverStartTime;
|
|
681
|
+
// Reset counter if last run was stable
|
|
682
|
+
if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
|
|
683
|
+
|
|
684
|
+
if (restartCount >= MAX_RESTARTS) {
|
|
685
|
+
console.error(`\n⚠️ Server crashed ${MAX_RESTARTS} times. Disabling MIT and restarting...`);
|
|
686
|
+
try {
|
|
687
|
+
const dbPath = path.join(getAppDataDir(), "db.json");
|
|
688
|
+
if (fs.existsSync(dbPath)) {
|
|
689
|
+
const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
|
|
690
|
+
if (db.settings) db.settings.mitmEnabled = false;
|
|
691
|
+
fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
|
|
692
|
+
}
|
|
693
|
+
} catch { /* best effort */ }
|
|
694
|
+
restartCount = 0;
|
|
695
|
+
server = spawnServer();
|
|
696
|
+
attachServerEvents();
|
|
697
|
+
return;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
restartCount++;
|
|
701
|
+
const delay = Math.min(1000 * restartCount, 10000);
|
|
702
|
+
console.error(`\n⚠️ Server exited (code=${code ?? "unknown"}). Restarting in ${delay / 1000}s... (${restartCount}/${MAX_RESTARTS})`);
|
|
703
|
+
if (crashLog.length) {
|
|
704
|
+
console.error("\n--- Server crash log ---");
|
|
705
|
+
crashLog.forEach(l => console.error(l));
|
|
706
|
+
console.error("--- End crash log ---\n");
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
setTimeout(() => {
|
|
710
|
+
server = spawnServer();
|
|
711
|
+
attachServerEvents();
|
|
712
|
+
}, delay);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
attachServerEvents();
|
|
716
|
+
|
|
663
717
|
// Cleanup function - force kill server process
|
|
664
718
|
let isCleaningUp = false;
|
|
665
719
|
function cleanup() {
|
|
@@ -838,58 +892,4 @@ function startServer(updatePromise) {
|
|
|
838
892
|
process.exit(1);
|
|
839
893
|
}
|
|
840
894
|
});
|
|
841
|
-
|
|
842
|
-
function attachServerEvents() {
|
|
843
|
-
server.on("error", (err) => {
|
|
844
|
-
console.error("Failed to start server:", err.message);
|
|
845
|
-
if (!isShuttingDown) tryRestart();
|
|
846
|
-
else { cleanup(); process.exit(1); }
|
|
847
|
-
});
|
|
848
|
-
|
|
849
|
-
server.on("close", (code) => {
|
|
850
|
-
if (isShuttingDown || code === 0) {
|
|
851
|
-
process.exit(code || 0);
|
|
852
|
-
return;
|
|
853
|
-
}
|
|
854
|
-
tryRestart(code);
|
|
855
|
-
});
|
|
856
|
-
}
|
|
857
|
-
|
|
858
|
-
function tryRestart(code) {
|
|
859
|
-
const aliveMs = Date.now() - serverStartTime;
|
|
860
|
-
// Reset counter if last run was stable
|
|
861
|
-
if (aliveMs >= RESTART_RESET_MS) restartCount = 0;
|
|
862
|
-
|
|
863
|
-
if (restartCount >= MAX_RESTARTS) {
|
|
864
|
-
console.error(`\n⚠️ Server crashed ${MAX_RESTARTS} times. Disabling MIT and restarting...`);
|
|
865
|
-
try {
|
|
866
|
-
const dbPath = path.join(getAppDataDir(), "db.json");
|
|
867
|
-
if (fs.existsSync(dbPath)) {
|
|
868
|
-
const db = JSON.parse(fs.readFileSync(dbPath, "utf-8"));
|
|
869
|
-
if (db.settings) db.settings.mitmEnabled = false;
|
|
870
|
-
fs.writeFileSync(dbPath, JSON.stringify(db, null, 2));
|
|
871
|
-
}
|
|
872
|
-
} catch { /* best effort */ }
|
|
873
|
-
restartCount = 0;
|
|
874
|
-
server = spawnServer();
|
|
875
|
-
attachServerEvents();
|
|
876
|
-
return;
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
restartCount++;
|
|
880
|
-
const delay = Math.min(1000 * restartCount, 10000);
|
|
881
|
-
console.error(`\n⚠️ Server exited (code=${code ?? "unknown"}). Restarting in ${delay / 1000}s... (${restartCount}/${MAX_RESTARTS})`);
|
|
882
|
-
if (crashLog.length) {
|
|
883
|
-
console.error("\n--- Server crash log ---");
|
|
884
|
-
crashLog.forEach(l => console.error(l));
|
|
885
|
-
console.error("--- End crash log ---\n");
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
setTimeout(() => {
|
|
889
|
-
server = spawnServer();
|
|
890
|
-
attachServerEvents();
|
|
891
|
-
}, delay);
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
attachServerEvents();
|
|
895
895
|
}
|
package/package.json
CHANGED
package/src/cli/tray/tray.ps1
CHANGED
|
@@ -6,6 +6,9 @@ $ErrorActionPreference = "Stop"
|
|
|
6
6
|
|
|
7
7
|
Add-Type @"
|
|
8
8
|
using System;
|
|
9
|
+
using System.IO;
|
|
10
|
+
using System.Collections.Concurrent;
|
|
11
|
+
using System.Threading;
|
|
9
12
|
using System.Runtime.InteropServices;
|
|
10
13
|
|
|
11
14
|
public static class WinDpiAwareness {
|
|
@@ -24,6 +27,45 @@ public static class WinDpiAwareness {
|
|
|
24
27
|
[DllImport("user32.dll")]
|
|
25
28
|
public static extern bool SetProcessDPIAware();
|
|
26
29
|
}
|
|
30
|
+
|
|
31
|
+
public static class StdinReader {
|
|
32
|
+
private static readonly ConcurrentQueue<string> _queue = new ConcurrentQueue<string>();
|
|
33
|
+
private static Thread _thread;
|
|
34
|
+
private static volatile bool _running = false;
|
|
35
|
+
|
|
36
|
+
public static void Start() {
|
|
37
|
+
if (_running) return;
|
|
38
|
+
_running = true;
|
|
39
|
+
_thread = new Thread(Run) {
|
|
40
|
+
IsBackground = true,
|
|
41
|
+
Name = "StdinReaderThread"
|
|
42
|
+
};
|
|
43
|
+
_thread.Start();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public static void Stop() {
|
|
47
|
+
_running = false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
private static void Run() {
|
|
51
|
+
try {
|
|
52
|
+
string line;
|
|
53
|
+
while (_running && (line = Console.ReadLine()) != null) {
|
|
54
|
+
if (!string.IsNullOrWhiteSpace(line)) {
|
|
55
|
+
_queue.Enqueue(line);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
} catch { }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public static string TryReadLine() {
|
|
62
|
+
string line;
|
|
63
|
+
if (_queue.TryDequeue(out line)) {
|
|
64
|
+
return line;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
27
69
|
"@
|
|
28
70
|
|
|
29
71
|
function Enable-HighDpiAwareness {
|
|
@@ -61,8 +103,17 @@ $OutputEncoding = [System.Text.Encoding]::UTF8
|
|
|
61
103
|
[System.Windows.Forms.Application]::EnableVisualStyles()
|
|
62
104
|
[System.Windows.Forms.Application]::SetCompatibleTextRenderingDefault($false)
|
|
63
105
|
|
|
106
|
+
# Safe tooltip truncation (Win32 NotifyIcon.Text max 63 characters)
|
|
107
|
+
if ($Tooltip -and $Tooltip.Length -gt 63) {
|
|
108
|
+
$Tooltip = $Tooltip.Substring(0, 63)
|
|
109
|
+
}
|
|
110
|
+
|
|
64
111
|
$script:notifyIcon = New-Object System.Windows.Forms.NotifyIcon
|
|
65
|
-
|
|
112
|
+
try {
|
|
113
|
+
$script:notifyIcon.Icon = New-Object System.Drawing.Icon($IconPath)
|
|
114
|
+
} catch {
|
|
115
|
+
$script:notifyIcon.Icon = [System.Drawing.SystemIcons]::Application
|
|
116
|
+
}
|
|
66
117
|
$script:notifyIcon.Text = $Tooltip
|
|
67
118
|
$script:notifyIcon.Visible = $true
|
|
68
119
|
|
|
@@ -71,9 +122,11 @@ $script:notifyIcon.ContextMenuStrip = $script:menu
|
|
|
71
122
|
$script:items = @()
|
|
72
123
|
|
|
73
124
|
function Write-Event($obj) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
125
|
+
try {
|
|
126
|
+
$json = $obj | ConvertTo-Json -Compress
|
|
127
|
+
[Console]::Out.WriteLine($json)
|
|
128
|
+
[Console]::Out.Flush()
|
|
129
|
+
} catch {}
|
|
77
130
|
}
|
|
78
131
|
|
|
79
132
|
function Add-MenuItem($index, $title, $enabled) {
|
|
@@ -94,19 +147,19 @@ function Update-MenuItem($index, $title, $enabled) {
|
|
|
94
147
|
}
|
|
95
148
|
|
|
96
149
|
function Set-Tooltip($text) {
|
|
97
|
-
|
|
98
|
-
if ($text.Length -gt 63) { $text = $text.Substring(0, 63) }
|
|
150
|
+
if ($text -and $text.Length -gt 63) { $text = $text.Substring(0, 63) }
|
|
99
151
|
$script:notifyIcon.Text = $text
|
|
100
152
|
}
|
|
101
153
|
|
|
102
|
-
#
|
|
154
|
+
# Start non-blocking background stdin reader thread
|
|
155
|
+
[StdinReader]::Start()
|
|
156
|
+
|
|
157
|
+
# UI thread timer polls thread-safe queue without blocking message loop
|
|
103
158
|
$script:timer = New-Object System.Windows.Forms.Timer
|
|
104
159
|
$script:timer.Interval = 100
|
|
105
160
|
$script:timer.Add_Tick({
|
|
106
161
|
try {
|
|
107
|
-
while ([
|
|
108
|
-
$line = [Console]::In.ReadLine()
|
|
109
|
-
if ([string]::IsNullOrWhiteSpace($line)) { continue }
|
|
162
|
+
while ($null -ne ($line = [StdinReader]::TryReadLine())) {
|
|
110
163
|
$cmd = $line | ConvertFrom-Json
|
|
111
164
|
switch ($cmd.action) {
|
|
112
165
|
"add-item" { Add-MenuItem $cmd.index $cmd.title $cmd.enabled }
|
|
@@ -114,6 +167,7 @@ $script:timer.Add_Tick({
|
|
|
114
167
|
"set-tooltip" { Set-Tooltip $cmd.text }
|
|
115
168
|
"ready" { Write-Event @{ type = "ready" } }
|
|
116
169
|
"kill" {
|
|
170
|
+
[StdinReader]::Stop()
|
|
117
171
|
$script:notifyIcon.Visible = $false
|
|
118
172
|
$script:notifyIcon.Dispose()
|
|
119
173
|
[System.Windows.Forms.Application]::Exit()
|
package/src/cli/tray/trayWin.js
CHANGED
|
@@ -2,27 +2,21 @@ const { spawn } = require("child_process");
|
|
|
2
2
|
const path = require("path");
|
|
3
3
|
const readline = require("readline");
|
|
4
4
|
|
|
5
|
-
// PowerShell-based tray for Windows (AV-safe, zero binary deps)
|
|
6
|
-
|
|
7
5
|
let psProcess = null;
|
|
8
6
|
let clickHandler = null;
|
|
7
|
+
let activeOptions = null;
|
|
8
|
+
let isKilled = false;
|
|
9
9
|
|
|
10
|
-
/**
|
|
11
|
-
* Send JSON command to PowerShell tray process via stdin
|
|
12
|
-
*/
|
|
13
10
|
function sendCommand(cmd) {
|
|
14
|
-
if (psProcess && psProcess.stdin.writable) {
|
|
15
|
-
|
|
11
|
+
if (psProcess && psProcess.stdin && psProcess.stdin.writable) {
|
|
12
|
+
try {
|
|
13
|
+
psProcess.stdin.write(`${JSON.stringify(cmd)}\n`, "utf8");
|
|
14
|
+
} catch (e) {}
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
* @param {Object} options - { iconPath, tooltip, items, onClick }
|
|
22
|
-
* items: [{ title, enabled }]
|
|
23
|
-
* @returns {Object|null} controller with sendAction/kill
|
|
24
|
-
*/
|
|
25
|
-
function initWinTray(options) {
|
|
18
|
+
function spawnTray(options) {
|
|
19
|
+
if (isKilled) return null;
|
|
26
20
|
const { iconPath, tooltip, items, onClick } = options;
|
|
27
21
|
clickHandler = onClick;
|
|
28
22
|
|
|
@@ -60,19 +54,48 @@ function initWinTray(options) {
|
|
|
60
54
|
psProcess.on("error", () => {});
|
|
61
55
|
psProcess.stderr.on("data", () => {});
|
|
62
56
|
|
|
63
|
-
|
|
57
|
+
psProcess.on("close", () => {
|
|
58
|
+
psProcess = null;
|
|
59
|
+
if (!isKilled && activeOptions) {
|
|
60
|
+
setTimeout(() => {
|
|
61
|
+
if (!isKilled && activeOptions) {
|
|
62
|
+
spawnTray(activeOptions);
|
|
63
|
+
}
|
|
64
|
+
}, 1500);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
64
68
|
items.forEach((item, index) => {
|
|
65
69
|
sendCommand({ action: "add-item", index, title: item.title, enabled: item.enabled });
|
|
66
70
|
});
|
|
67
71
|
|
|
72
|
+
return psProcess;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function initWinTray(options) {
|
|
76
|
+
isKilled = false;
|
|
77
|
+
activeOptions = {
|
|
78
|
+
...options,
|
|
79
|
+
items: options.items.map((it) => ({ ...it }))
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const proc = spawnTray(activeOptions);
|
|
83
|
+
if (!proc) return null;
|
|
84
|
+
|
|
68
85
|
return {
|
|
69
86
|
updateItem(index, title, enabled) {
|
|
87
|
+
if (activeOptions && activeOptions.items && activeOptions.items[index]) {
|
|
88
|
+
activeOptions.items[index] = { title, enabled };
|
|
89
|
+
}
|
|
70
90
|
sendCommand({ action: "update-item", index, title, enabled });
|
|
71
91
|
},
|
|
72
92
|
setTooltip(text) {
|
|
93
|
+
if (activeOptions) activeOptions.tooltip = text;
|
|
73
94
|
sendCommand({ action: "set-tooltip", text });
|
|
74
95
|
},
|
|
75
96
|
kill() {
|
|
97
|
+
isKilled = true;
|
|
98
|
+
activeOptions = null;
|
|
76
99
|
try {
|
|
77
100
|
sendCommand({ action: "kill" });
|
|
78
101
|
} catch (e) {}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=6708,exports.ids=[6708],exports.modules={46708:(a,b,c)=>{c.r(b),c.d(b,{default:()=>s});var d=c(48249),e=c(67484),f=c(49885),g=c.n(f),h=c(48679),i=c(33503),j=c(5277),k=c(22393),l=c(54206),m=c(48121),n=c(3807),o=c(93237),p=c(17660);let q=["#6366f1","#14b8a6","#f59e0b","#ef4444","#8b5cf6"],r=a=>a>=1e6?`${(a/1e6).toFixed(1)}M`:a>=1e3?`${(a/1e3).toFixed(1)}K`:String(a||0);function s({byModel:a}){let[b,c]=(0,e.useState)("tokens"),f=(0,e.useMemo)(()=>a?Object.values(a).map(a=>({name:((a,b=22)=>a&&a.length>b?a.slice(0,b)+"…":a||"")(a.rawModel||"Unknown"),tokens:(a.promptTokens||0)+(a.completionTokens||0),requests:a.requests||0})).filter(a=>a[b]>0).sort((a,c)=>c[b]-a[b]).slice(0,5):[],[a,b]),g="tokens"===b?r:String,t="tokens"===b?"Tokens":"Requests";return(0,d.jsxs)(p.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,d.jsx)("span",{className:"text-sm font-semibold text-text-muted uppercase tracking-wide",children:"Top Models"}),(0,d.jsxs)("div",{className:"grid grid-cols-2 items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1",children:[(0,d.jsx)("button",{onClick:()=>c("tokens"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"tokens"===b?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Tokens"}),(0,d.jsx)("button",{onClick:()=>c("requests"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"requests"===b?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Requests"})]})]}),f.length?(0,d.jsx)(h.u,{width:"100%",height:180,children:(0,d.jsxs)(i.E,{data:f,layout:"vertical",margin:{top:4,right:40,left:4,bottom:4},children:[(0,d.jsx)(j.d,{strokeDasharray:"3 3",strokeOpacity:.1,horizontal:!1}),(0,d.jsx)(k.W,{type:"number",tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:g}),(0,d.jsx)(l.h,{type:"category",dataKey:"name",tick:{fontSize:10,fill:"currentColor",fillOpacity:.7},tickLine:!1,axisLine:!1,width:90}),(0,d.jsx)(m.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:a=>[g(a),t]}),(0,d.jsx)(n.yP,{dataKey:b,radius:[0,4,4,0],children:f.map((a,b)=>(0,d.jsx)(o.f,{fill:q[b%q.length],fillOpacity:.85},b))})]})}):(0,d.jsx)("div",{className:"h-44 flex items-center justify-center text-text-muted text-sm",children:"No model usage yet"})]})}s.propTypes={byModel:g().object}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=7121,exports.ids=[7121],exports.modules={3807:(a,b,c)=>{c.d(b,{yP:()=>aK,LP:()=>aJ});var d=c(67484),e=c(99314),f=c(40948),g=c(93237),h=c(47459),i=c(1791),j=c(21480),k=c(16216),l=c(64635),m=c(73976),n=c(61368),o=["option"],p=m.M;function q(a){var b=a.option,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,o);return d.createElement(n.y,{option:b,DefaultShape:p,shapeProps:c,activeClassName:"recharts-active-bar",inActiveClassName:"recharts-inactive-bar"})}var r=function(a){var b=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return(c,d)=>{if((0,i.Et)(a))return a;var e=(0,i.Et)(c)||(0,i.uy)(c);return e?a(c,d):(e||function(a,b){if(!a)throw Error("Invariant failed")}(!1,"minPointSize callback function received a value with type of ".concat(typeof c,". Currently only numbers or null/undefined are supported.")),b)}},s=c(32671),t=c(3672),u=(a,b,c)=>{var d=(0,s.j)();return(e,f)=>g=>{null==a||a(e,f,g),d((0,t.RD)({activeIndex:String(f),activeDataKey:b,activeCoordinate:e.tooltipPosition,activeGraphicalItemId:c}))}},v=a=>{var b=(0,s.j)();return(c,d)=>e=>{null==a||a(c,d,e),b((0,t.oP)())}},w=(a,b,c)=>{var d=(0,s.j)();return(e,f)=>g=>{null==a||a(e,f,g),d((0,t.ML)({activeIndex:String(f),activeDataKey:b,activeCoordinate:e.tooltipPosition,activeGraphicalItemId:c}))}},x=c(443),y=["children"],z=(0,d.createContext)({data:[],xAxisId:"xAxis-0",yAxisId:"yAxis-0",dataPointFormatter:()=>({x:0,y:0,value:0}),errorBarOffset:0});function A(a){var b=a.children,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,y);return d.createElement(z.Provider,{value:c},b)}var B=c(10059),C=c(55644),D=c(32362),E=c(27382),F=c(25644),G=c(23510),H=c(80852),I=c(16776);function J(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}var K=(a,b,c)=>{var d=null!=c?c:a;if(!(0,i.uy)(d))return(0,i.F4)(d,b,0)},L=c(9434);function M(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function N(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?M(Object(c),!0).forEach(function(b){var d,e,f;d=a,e=b,f=c[b],(e=function(a){var b=function(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}(a,"string");return"symbol"==typeof b?b:b+""}(e))in d?Object.defineProperty(d,e,{value:f,enumerable:!0,configurable:!0,writable:!0}):d[e]=f}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):M(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}var O=c(28222),P=c(27660),Q=(0,D.Mz)([E.ld,(a,b)=>b],(a,b)=>a.filter(a=>"bar"===a.type).find(a=>a.id===b)),R=(0,D.Mz)([Q],a=>null==a?void 0:a.maxBarSize),S=(0,D.Mz)([C.fz,E.ld,P.W,P.B,(a,b,c)=>c],(a,b,c,d,e)=>b.filter(b=>"horizontal"===a?b.xAxisId===c:b.yAxisId===d).filter(a=>a.isPanorama===e).filter(a=>!1===a.hide).filter(a=>"bar"===a.type)),T=(0,D.Mz)([S,H.x3,(a,b)=>{var c=(0,C.fz)(a),d=(0,P.W)(a,b),e=(0,P.B)(a,b);if(null!=d&&null!=e)return"horizontal"===c?(0,E.BQ)(a,"xAxis",d):(0,E.BQ)(a,"yAxis",e)}],(a,b,c)=>{var d=a.filter(I.g),e=a.filter(a=>null==a.stackId);return[...Object.entries(d.reduce((a,b)=>{var c=a[b.stackId];return null==c&&(c=[]),c.push(b),a[b.stackId]=c,a},{})).map(a=>{var d,e=function(a){if(Array.isArray(a))return a}(a)||function(a){var b=null==a?null:"u">typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(null!=b){var c,d,e,f,g=[],h=!0,i=!1;try{e=(b=b.call(a)).next,!1;for(;!(h=(c=e.call(b)).done)&&(g.push(c.value),2!==g.length);h=!0);}catch(a){i=!0,d=a}finally{try{if(!h&&null!=b.return&&(f=b.return(),Object(f)!==f))return}finally{if(i)throw d}}return g}}(a)||function(a){if(a){if("string"==typeof a)return J(a,2);var b=({}).toString.call(a).slice(8,-1);return"Object"===b&&a.constructor&&(b=a.constructor.name),"Map"===b||"Set"===b?Array.from(a):"Arguments"===b||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(b)?J(a,2):void 0}}(a)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),f=e[0],g=e[1];return{stackId:f,dataKeys:g.map(a=>a.dataKey),barSize:K(b,c,null==(d=g[0])?void 0:d.barSize)}}),...e.map(a=>({stackId:void 0,dataKeys:[a.dataKey].filter(a=>null!=a),barSize:K(b,c,a.barSize)}))]}),U=(a,b,c)=>{var d,e,f=(0,C.fz)(a),g=(0,P.W)(a,b),h=(0,P.B)(a,b);if(null!=g&&null!=h)return"horizontal"===f?(d=(0,E.Gx)(a,"xAxis",g,c),e=(0,E.CR)(a,"xAxis",g,c)):(d=(0,E.Gx)(a,"yAxis",h,c),e=(0,E.CR)(a,"yAxis",h,c)),(0,k.Hj)(d,e)},V=(0,D.Mz)([T,H.JN,H._5,H.gY,(a,b,c)=>{var d,e,f,g,h=Q(a,b);if(null==h)return 0;var j=(0,P.W)(a,b),l=(0,P.B)(a,b);if(null==j||null==l)return 0;var m=(0,C.fz)(a),n=(0,H.JN)(a),o=h.maxBarSize,p=(0,i.uy)(o)?n:o;return"horizontal"===m?(f=(0,E.Gx)(a,"xAxis",j,c),g=(0,E.CR)(a,"xAxis",j,c)):(f=(0,E.Gx)(a,"yAxis",l,c),g=(0,E.CR)(a,"yAxis",l,c)),null!=(d=null!=(e=(0,k.Hj)(f,g,!0))?e:p)?d:0},U,R],(a,b,c,d,e,f,g)=>{var h=function(a,b,c,d,e){var f,g,h=d.length;if(!(h<1)){var j=(0,i.F4)(a,c,0,!0),k=[];if((0,L.H)(null==(f=d[0])?void 0:f.barSize)){var l=!1,m=c/h,n=d.reduce((a,b)=>a+(b.barSize||0),0);(n+=(h-1)*j)>=c&&(n-=(h-1)*j,j=0),n>=c&&m>0&&(l=!0,m*=.9,n=h*m);var o={offset:Math.round((c-n)/2)-j,size:0};g=d.reduce((a,b)=>{var c,d={stackId:b.stackId,dataKeys:b.dataKeys,position:{offset:o.offset+o.size+j,size:l?m:null!=(c=b.barSize)?c:0}},e=[...a,d];return o=d.position,e},k)}else{var p=(0,i.F4)(b,c,0,!0);c-2*p-(h-1)*j<=0&&(j=0);var q=(c-2*p-(h-1)*j)/h;q>1&&(q=Math.round(q));var r=(0,L.H)(e)?Math.min(q,e):q;g=d.reduce((a,b,c)=>[...a,{stackId:b.stackId,dataKeys:b.dataKeys,position:{offset:p+h*(q-r)/2+(r+j)*c,size:r}}],k)}return g}}(c,d,e!==f?e:f,a,(0,i.uy)(g)?b:g);return e!==f&&null!=h&&(h=h.map(a=>N(N({},a),{},{position:N(N({},a.position),{},{offset:a.position.offset-e/2})}))),h}),W=(0,D.Mz)([V,Q],(a,b)=>{if(null!=a&&null!=b){var c=a.find(a=>a.stackId===b.stackId&&null!=b.dataKey&&a.dataKeys.includes(b.dataKey));if(null!=c)return c.position}}),X=(0,D.Mz)([(a,b,c)=>{var d=(0,C.fz)(a),e=(0,P.W)(a,b),f=(0,P.B)(a,b);if(null!=e&&null!=f)return"horizontal"===d?(0,E.TC)(a,"yAxis",f,c):(0,E.TC)(a,"xAxis",e,c)},Q],(a,b)=>{var c=(0,O.x)(b);if(!a||null==c||null==b)return;var d=b.stackId;if(null!=d){var e=a[d];if(e){var f=e.stackedData;if(f)return f.find(a=>a.key===c)}}}),Y=(0,D.Mz)([G.HZ,G.c2,(a,b,c)=>{var d=(0,P.W)(a,b);if(null!=d)return(0,E.Gx)(a,"xAxis",d,c)},(a,b,c)=>{var d=(0,P.B)(a,b);if(null!=d)return(0,E.Gx)(a,"yAxis",d,c)},(a,b,c)=>{var d=(0,P.W)(a,b);if(null!=d)return(0,E.CR)(a,"xAxis",d,c)},(a,b,c)=>{var d=(0,P.B)(a,b);if(null!=d)return(0,E.CR)(a,"yAxis",d,c)},W,C.fz,F.rN,U,X,Q,(a,b,c,d)=>d],(a,b,c,d,e,f,g,h,i,j,k,l,m)=>{var n,o=i.chartData,p=i.dataStartIndex,q=i.dataEndIndex;if(null!=l&&null!=g&&null!=b&&("horizontal"===h||"vertical"===h)&&null!=c&&null!=d&&null!=e&&null!=f&&null!=j){var r=l.data;if(null!=(n=null!=r&&r.length>0?r:null==o?void 0:o.slice(p,q+1)))return aJ({layout:h,barSettings:l,pos:g,parentViewBox:b,bandSize:j,xAxis:c,yAxis:d,xAxisTicks:e,yAxisTicks:f,stackedData:k,displayedData:n,offset:a,cells:m,dataStartIndex:p})}}),Z=c(70383),$=c(83881),_=c(82118),aa=c(69599),ab=c(26674),ac=c(93021),ad=c(70719),ae=c(99659),af=c(64644),ag=c(17947),ah=c(6859),ai=c(66762),aj=["index"];function ak(){return(ak=Object.assign?Object.assign.bind():function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)({}).hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a}).apply(null,arguments)}var al=(0,d.createContext)(void 0),am=a=>{var b=a.index,c=function(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}(a,aj),e=(a=>{var b=(0,d.useContext)(al);if(null!=b){var c=b.stackId;return"url(#".concat("recharts-bar-stack-clip-path-".concat(c,"-").concat(a),")")}})(b);return d.createElement(f.W,ak({className:"recharts-bar-stack-layer",clipPath:e},c))},an=["onMouseEnter","onMouseLeave","onClick"],ao=["value","background","tooltipPosition"],ap=["id"],aq=["onMouseEnter","onClick","onMouseLeave"];function ar(a,b){return function(a){if(Array.isArray(a))return a}(a)||function(a,b){var c=null==a?null:"u">typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(null!=c){var d,e,f,g,h=[],i=!0,j=!1;try{if(f=(c=c.call(a)).next,0===b){if(Object(c)!==c)return;i=!1}else for(;!(i=(d=f.call(c)).done)&&(h.push(d.value),h.length!==b);i=!0);}catch(a){j=!0,e=a}finally{try{if(!i&&null!=c.return&&(g=c.return(),Object(g)!==g))return}finally{if(j)throw e}}return h}}(a,b)||function(a,b){if(a){if("string"==typeof a)return as(a,b);var c=({}).toString.call(a).slice(8,-1);return"Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c?Array.from(a):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?as(a,b):void 0}}(a,b)||function(){throw TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function as(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);c<b;c++)d[c]=a[c];return d}function at(){return(at=Object.assign?Object.assign.bind():function(a){for(var b=1;b<arguments.length;b++){var c=arguments[b];for(var d in c)({}).hasOwnProperty.call(c,d)&&(a[d]=c[d])}return a}).apply(null,arguments)}function au(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function av(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{};b%2?au(Object(c),!0).forEach(function(b){var d,e,f;d=a,e=b,f=c[b],(e=function(a){var b=function(a,b){if("object"!=typeof a||!a)return a;var c=a[Symbol.toPrimitive];if(void 0!==c){var d=c.call(a,b||"default");if("object"!=typeof d)return d;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===b?String:Number)(a)}(a,"string");return"symbol"==typeof b?b:b+""}(e))in d?Object.defineProperty(d,e,{value:f,enumerable:!0,configurable:!0,writable:!0}):d[e]=f}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(c)):au(Object(c)).forEach(function(b){Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(c,b))})}return a}function aw(a,b){if(null==a)return{};var c,d,e=function(a,b){if(null==a)return{};var c={};for(var d in a)if(({}).hasOwnProperty.call(a,d)){if(-1!==b.indexOf(d))continue;c[d]=a[d]}return c}(a,b);if(Object.getOwnPropertySymbols){var f=Object.getOwnPropertySymbols(a);for(d=0;d<f.length;d++)c=f[d],-1===b.indexOf(c)&&({}).propertyIsEnumerable.call(a,c)&&(e[c]=a[c])}return e}var ax=d.memo(a=>{var b=a.dataKey,c=a.stroke,e=a.strokeWidth,f=a.fill,g=a.name,h=a.hide,j=a.unit,l=a.formatter,m=a.tooltipType,n=a.id,o={dataDefinedOnItem:void 0,getPosition:i.lQ,settings:{stroke:c,strokeWidth:e,fill:f,dataKey:b,nameKey:void 0,name:(0,k.uM)(g,b),hide:h,type:m,color:f,unit:j,formatter:l,graphicalItemId:n}};return d.createElement(x.r,{tooltipEntrySettings:o})});function ay(a){var b,c=(0,s.G)($.A2),e=a.data,f=a.dataKey,g=a.background,h=a.allOtherBarProps,i=h.onMouseEnter,j=h.onMouseLeave,k=h.onClick,m=aw(h,an),n=u(i,f,h.id),o=v(j),p=w(k,f,h.id);if(!g||null==e)return null;var r=(0,ad.ic)(g);return d.createElement(ag.g,{zIndex:(b=ah.I.barBackground,g&&"object"==typeof g&&"zIndex"in g&&"number"==typeof g.zIndex&&(0,L.H)(g.zIndex)?g.zIndex:b)},e.map((a,b)=>{a.value;var e=a.background,h=(a.tooltipPosition,aw(a,ao));if(!e)return null;var i=n(a,a.originalDataIndex),j=o(a,a.originalDataIndex),k=p(a,a.originalDataIndex),s=av(av(av(av(av({option:g,isActive:String(a.originalDataIndex)===c},h),{},{fill:"#eee"},e),r),(0,l.XC)(m,a,b)),{},{onMouseEnter:i,onMouseLeave:j,onClick:k,dataKey:f,index:b,className:"recharts-bar-background-rectangle"});return d.createElement(q,at({key:"background-bar-".concat(b)},s))}))}function az(a){var b=a.showLabels,c=a.children,e=a.rects,f=null==e?void 0:e.map(a=>{var b={x:a.x,y:a.y,width:a.width,lowerWidth:a.width,upperWidth:a.width,height:a.height};return av(av({},b),{},{value:a.value,payload:a.payload,parentViewBox:a.parentViewBox,viewBox:b,fill:a.fill})});return d.createElement(h.h8,{value:b?f:void 0},c)}function aA(a){var b,c=a.shape,e=a.activeBar,f=a.baseProps,g=a.entry,h=a.index,i=a.dataKey,j=(0,s.G)($.A2),k=(0,s.G)($.Xb),l=e&&String(g.originalDataIndex)===j&&(null==k||i===k);null!=j&&String(g.originalDataIndex);var m=ar((0,d.useState)(!1),2),n=m[0],o=m[1],p=ar((0,d.useState)(!1),2),r=p[0];p[1];var t=(0,d.useCallback)(()=>{l||o(!1)},[l]),u=l&&r,v=l||n;b=l?!0===e?c:e:c;var w=d.createElement(q,at({},f,{name:String(f.name)},g,{isActive:u,option:b,index:h,dataKey:i,animationElapsedTime:a.animationElapsedTime,isAnimating:a.isAnimating,isEntrance:a.isEntrance,onTransitionEnd:t}));return v?d.createElement(ag.g,{zIndex:ah.I.activeBar},d.createElement(am,{index:g.originalDataIndex},w)):w}function aB(a){var b=a.shape,c=a.baseProps,e=a.entry,f=a.index,g=a.dataKey;return d.createElement(q,at({},c,{name:String(c.name)},e,{isActive:!1,option:b,index:f,dataKey:g,animationElapsedTime:a.animationElapsedTime,isAnimating:a.isAnimating,isEntrance:a.isEntrance}))}function aC(a){var b,c=a.data,e=a.props,f=a.animationElapsedTime,g=a.isAnimating,h=a.isEntrance,i=null!=(b=(0,ad.uZ)(e))?b:{},j=i.id,k=aw(i,ap),m=e.shape,n=e.dataKey,o=e.activeBar,p=e.onMouseEnter,q=e.onClick,r=e.onMouseLeave,s=aw(e,aq),t=u(p,n,j),x=v(r),y=w(q,n,j);return c?d.createElement(d.Fragment,null,c.map((a,b)=>d.createElement(am,at({index:a.originalDataIndex,key:"rectangle-".concat(null==a?void 0:a.x,"-").concat(null==a?void 0:a.y,"-").concat(null==a?void 0:a.value,"-").concat(b),className:"recharts-bar-rectangle"},(0,l.XC)(s,a,b),{onMouseEnter:t(a,a.originalDataIndex),onMouseLeave:x(a,a.originalDataIndex),onClick:y(a,a.originalDataIndex)}),o?d.createElement(aA,{shape:m,activeBar:o,baseProps:k,entry:a,index:b,dataKey:n,animationElapsedTime:f,isAnimating:g,isEntrance:h}):d.createElement(aB,{shape:m,baseProps:k,entry:a,index:b,dataKey:n,animationElapsedTime:f,isAnimating:g,isEntrance:h})))):null}function aD(a){var b=a.props,c=a.previousRectanglesRef,e=b.data,g=b.isAnimationActive,i=b.animationBegin,j=b.animationDuration,k=b.animationEasing,l=b.animationInterpolateFn,m=b.layout,n=(0,ae.I)(b.onAnimationStart,b.onAnimationEnd),o=n.isAnimating,p=n.handleAnimationStart,q=n.handleAnimationEnd;return d.createElement(az,{showLabels:!o,rects:e},d.createElement(ae.U,{animationInput:e,animationIdPrefix:"recharts-bar-",items:e,previousItemsRef:c,isAnimationActive:g,animationBegin:i,animationDuration:j,animationEasing:k,onAnimationStart:p,onAnimationEnd:q,animationInterpolateFn:l,animationMatchBy:b.animationMatchBy,layout:m},(a,c,e)=>d.createElement(f.W,null,d.createElement(aC,{props:b,data:a,animationElapsedTime:c,isAnimating:o||c<1,isEntrance:e}))),d.createElement(h.qY,{label:b.label}),b.children)}function aE(a){var b=(0,d.useRef)(null);return d.createElement(aD,{previousRectanglesRef:b,props:a})}var aF=(a,b)=>{var c=Array.isArray(a.value)?a.value[1]:a.value;return{x:a.x,y:a.y,value:c,errorVal:(0,k.kr)(a,b)}};class aG extends d.PureComponent{render(){var a=this.props,b=a.hide,c=a.data,g=a.dataKey,h=a.className,i=a.xAxisId,j=a.yAxisId,k=a.needClip,l=a.background,m=a.id;if(b||null==c)return null;var n=(0,e.$)("recharts-bar",h);return d.createElement(f.W,{className:n,id:m},k&&d.createElement("defs",null,d.createElement(B.Q,{clipPathId:m,xAxisId:i,yAxisId:j})),d.createElement(f.W,{className:"recharts-bar-rectangles",clipPath:k?"url(#clipPath-".concat(m,")"):void 0},d.createElement(ay,{data:c,dataKey:g,background:l,allOtherBarProps:this.props}),d.createElement(aE,this.props)))}}var aH={activeBar:!1,animationBegin:0,animationDuration:400,animationEasing:"ease",animationInterpolateFn:(a,b,c)=>null==a?[]:1===b?a.flatMap(a=>"removed"===a.status?[]:[a.next]):a.flatMap(a=>{if("removed"===a.status)return"horizontal"===c?[av(av({},a.prev),{},{height:(0,i.GW)(a.prev.height,0,b),y:(0,i.GW)(a.prev.y,a.prev.y+a.prev.height,b)})]:[av(av({},a.prev),{},{width:(0,i.GW)(a.prev.width,0,b)})];if("matched"===a.status)return[av(av({},a.next),{},{x:(0,i.GW)(a.prev.x,a.next.x,b),y:(0,i.GW)(a.prev.y,a.next.y,b),width:(0,i.GW)(a.prev.width,a.next.width,b),height:(0,i.GW)(a.prev.height,a.next.height,b)})];var d=a.next;return"horizontal"===c?[av(av({},d),{},{height:(0,i.GW)(0,d.height,b),y:(0,i.GW)(d.stackedBarStart,d.y,b)})]:[av(av({},d),{},{width:(0,i.GW)(0,d.width,b),x:(0,i.GW)(d.stackedBarStart,d.x,b)})]}),animationMatchBy:af.Um,background:!1,hide:!1,isAnimationActive:"auto",label:!1,legendType:"rect",minPointSize:0,shape:p,xAxisId:0,yAxisId:0,zIndex:ah.I.bar};function aI(a){var b,c=a.xAxisId,e=a.yAxisId,f=a.hide,h=a.legendType,i=a.minPointSize,k=a.activeBar,l=a.animationBegin,m=a.animationDuration,n=a.animationEasing,o=a.isAnimationActive,p=(0,B.l)(c,e).needClip,q=(0,C.WX)(),r=(0,Z.r)(),t=(0,j.aS)(a.children,g.f),u=(0,s.G)(b=>Y(b,a.id,r,t));if("vertical"!==q&&"horizontal"!==q)return null;var v=null==u?void 0:u[0];return b=null==v||null==v.height||null==v.width?0:"vertical"===q?v.height/2:v.width/2,d.createElement(A,{xAxisId:c,yAxisId:e,data:u,dataPointFormatter:aF,errorBarOffset:b},d.createElement(aG,at({},a,{layout:q,needClip:p,data:u,xAxisId:c,yAxisId:e,hide:f,legendType:h,minPointSize:i,activeBar:k,animationBegin:l,animationDuration:m,animationEasing:n,isAnimationActive:o})))}function aJ(a){var b=a.layout,c=a.barSettings,d=c.dataKey,e=c.minPointSize,f=c.hasCustomShape,g=a.pos,h=a.bandSize,j=a.xAxis,l=a.yAxis,m=a.xAxisTicks,n=a.yAxisTicks,o=a.stackedData,p=a.displayedData,q=a.offset,s=a.cells,t=a.parentViewBox,u=a.dataStartIndex,v="horizontal"===b?l:j,w=o?v.scale.domain():null,x=(0,k.DW)({numericAxis:v}),y=v.scale.map(x);return p.map((a,c)=>{if(o){var p=o[c+u];if(null==p)return null;z=(0,k._f)(p,w)}else Array.isArray(z=(0,k.kr)(a,d))||(z=[x,z]);var v=r(e,0)(z[1],c);if("horizontal"===b){var z,A,B,C,D,E,F,G=l.scale.map(z[0]),H=l.scale.map(z[1]);if(null==G||null==H)return null;A=(0,k.y2)({axis:j,ticks:m,bandSize:h,offset:g.offset,entry:a,index:c}),B=null!=(F=null!=H?H:G)?F:void 0,C=g.size;var I=G-H;if(D=(0,i.M8)(I)?0:I,E={x:A,y:q.top,width:C,height:q.height},Math.abs(v)>0&&Math.abs(D)<Math.abs(v)){var J=(0,i.sA)(D||v)*(Math.abs(v)-Math.abs(D));B-=J,D+=J}}else{var K=j.scale.map(z[0]),L=j.scale.map(z[1]);if(null==K||null==L)return null;if(A=K,B=(0,k.y2)({axis:l,ticks:n,bandSize:h,offset:g.offset,entry:a,index:c}),C=L-K,D=g.size,E={x:q.left,y:B,width:q.width,height:D},Math.abs(v)>0&&Math.abs(C)<Math.abs(v)){var M=(0,i.sA)(C||v)*(Math.abs(v)-Math.abs(C));C+=M}}return null!=A&&null!=B&&null!=C&&null!=D&&(f||0!==C&&0!==D)?av(av({},a),{},{stackedBarStart:y,x:A,y:B,width:C,height:D,value:o?z:z[1],payload:a,background:E,tooltipPosition:{x:A+C/2,y:B+D/2},parentViewBox:t,originalDataIndex:c},s&&s[c]&&s[c].props):null}).filter(Boolean)}var aK=d.memo(function(a){var b,c,e=(0,aa.e)(a,aH),f=(b=e.stackId,null!=(c=(0,d.useContext)(al))?c.stackId:null!=b?(0,k.$8)(b):void 0),g=(0,Z.r)();return d.createElement(ab.x,{id:e.id,type:"bar"},a=>{var b,c,h,i;return d.createElement(d.Fragment,null,d.createElement(_.A,{legendPayload:(b=e.dataKey,c=e.name,h=e.fill,i=e.legendType,[{inactive:e.hide,dataKey:b,type:i,color:h,value:(0,k.uM)(c,b),payload:e}])}),d.createElement(ax,{dataKey:e.dataKey,stroke:e.stroke,strokeWidth:e.strokeWidth,fill:e.fill,name:e.name,hide:e.hide,unit:e.unit,formatter:e.formatter,tooltipType:e.tooltipType,id:a}),d.createElement(ac.p,{type:"bar",id:a,data:void 0,xAxisId:e.xAxisId,yAxisId:e.yAxisId,zAxisId:0,dataKey:e.dataKey,stackId:f,hide:e.hide,barSize:e.barSize,minPointSize:e.minPointSize,maxBarSize:e.maxBarSize,isPanorama:g,hasCustomShape:null!=e.shape&&e.shape!==p}),d.createElement(ag.g,{zIndex:e.zIndex},d.createElement(aI,at({},e,{id:a}))))})},ai.P);aK.displayName="Bar"},33503:(a,b,c)=>{c.d(b,{E:()=>h});var d=c(67484),e=c(53935),f=c(29967),g=["axis","item"],h=(0,d.forwardRef)((a,b)=>d.createElement(f.P,{chartName:"BarChart",defaultTooltipEventType:"axis",validateTooltipEventTypes:g,tooltipPayloadSearcher:e.uN,categoricalChartProps:a,ref:b}))},93237:(a,b,c)=>{c.d(b,{f:()=>d});var d=a=>null;d.displayName="Cell"}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[124],{10124:(e,t,s)=>{s.r(t),s.d(t,{default:()=>b});var o=s(95155),r=s(12115),a=s(14051),l=s.n(a),i=s(21742),d=s(90639),n=s(77496),c=s(32539),f=s(59656),p=s(97944),x=s(97779),u=s(84588);let m=[{value:"tokens",label:"Tokens"},{value:"requests",label:"Requests"},{value:"cost",label:"Cost"}],h={tokens:{dataKey:"tokens",color:"#6366f1",gradId:"gradTokens",formatter:e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0),label:"Tokens"},requests:{dataKey:"requests",color:"#14b8a6",gradId:"gradRequests",formatter:e=>String(e||0),label:"Requests"},cost:{dataKey:"cost",color:"#f59e0b",gradId:"gradCost",formatter:e=>`$${(e||0).toFixed(4)}`,label:"Cost"}};function b({period:e="7d"}){let[t,s]=(0,r.useState)([]),[a,l]=(0,r.useState)(!0),[y,g]=(0,r.useState)("tokens"),k=(0,r.useCallback)(async()=>{l(!0);try{let t=await fetch(`/api/usage/chart?period=${e}`);if(t.ok){let e=await t.json();s(e)}}catch(e){console.error("Failed to fetch chart data:",e)}finally{l(!1)}},[e]);(0,r.useEffect)(()=>{k()},[k]);let j=h[y],v=t.some(e=>(e[j.dataKey]||0)>0);return(0,o.jsxs)(u.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,o.jsx)("div",{className:"grid w-full items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1 sm:w-auto sm:self-start",style:{gridTemplateColumns:`repeat(${m.length}, minmax(0, 1fr))`},children:m.map(e=>(0,o.jsx)("button",{onClick:()=>g(e.value),className:`px-3 py-1 rounded-md text-sm font-medium transition-colors ${y===e.value?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:e.label},e.value))}),a?(0,o.jsx)("div",{className:"h-48 flex items-center justify-center text-text-muted text-sm",children:"Loading..."}):v?(0,o.jsx)(i.u,{width:"100%",height:220,children:(0,o.jsxs)(d.Q,{data:t,margin:{top:4,right:8,left:0,bottom:0},children:[(0,o.jsxs)("defs",{children:[(0,o.jsxs)("linearGradient",{id:"gradTokens",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#6366f1",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#6366f1",stopOpacity:0})]}),(0,o.jsxs)("linearGradient",{id:"gradRequests",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#14b8a6",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#14b8a6",stopOpacity:0})]}),(0,o.jsxs)("linearGradient",{id:"gradCost",x1:"0",y1:"0",x2:"0",y2:"1",children:[(0,o.jsx)("stop",{offset:"5%",stopColor:"#f59e0b",stopOpacity:.25}),(0,o.jsx)("stop",{offset:"95%",stopColor:"#f59e0b",stopOpacity:0})]})]}),(0,o.jsx)(n.d,{strokeDasharray:"3 3",strokeOpacity:.1}),(0,o.jsx)(c.W,{dataKey:"label",tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,interval:"preserveStartEnd"}),(0,o.jsx)(f.h,{tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:j.formatter,width:50}),(0,o.jsx)(p.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:e=>[j.formatter(e),j.label]}),(0,o.jsx)(x.Gk,{type:"monotone",dataKey:j.dataKey,stroke:j.color,strokeWidth:2,fill:`url(#${j.gradId})`,dot:!1,activeDot:{r:4}})]})}):(0,o.jsx)("div",{className:"h-48 flex items-center justify-center text-text-muted text-sm",children:"No data for this period"})]})}b.propTypes={period:l().string}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2435],{82435:(e,t,s)=>{s.r(t),s.d(t,{default:()=>g});var r=s(95155),i=s(12115),o=s(14051),n=s.n(o),a=s(21742),l=s(48035),d=s(77496),c=s(32539),x=s(59656),m=s(97944),u=s(45639),p=s(67389),h=s(84588);let b=["#6366f1","#14b8a6","#f59e0b","#ef4444","#8b5cf6","#06b6d4","#10b981","#f97316"],f=e=>e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e||0);function g({byProvider:e}){let[t,s]=(0,i.useState)("tokens"),o=(0,i.useMemo)(()=>e?Object.entries(e).map(([e,t])=>({name:e,tokens:(t.promptTokens||0)+(t.completionTokens||0),requests:t.requests||0})).filter(e=>e[t]>0).sort((e,s)=>s[t]-e[t]):[],[e,t]),n="tokens"===t?f:String,k="tokens"===t?"Tokens":"Requests";return(0,r.jsxs)(h.default,{className:"flex min-w-0 flex-col gap-3 p-3 sm:p-4",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,r.jsx)("span",{className:"text-sm font-semibold text-text-muted uppercase tracking-wide",children:"By Provider"}),(0,r.jsxs)("div",{className:"grid grid-cols-2 items-center gap-1 rounded-lg border border-border bg-bg-subtle p-1",children:[(0,r.jsx)("button",{onClick:()=>s("tokens"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"tokens"===t?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Tokens"}),(0,r.jsx)("button",{onClick:()=>s("requests"),className:`px-2.5 py-0.5 rounded-md text-xs font-medium transition-colors ${"requests"===t?"bg-primary text-white shadow-sm":"text-text-muted hover:text-text hover:bg-bg-hover"}`,children:"Requests"})]})]}),o.length?(0,r.jsx)(a.u,{width:"100%",height:180,children:(0,r.jsxs)(l.E,{data:o,margin:{top:4,right:8,left:0,bottom:4},children:[(0,r.jsx)(d.d,{strokeDasharray:"3 3",strokeOpacity:.1,vertical:!1}),(0,r.jsx)(c.W,{dataKey:"name",tick:{fontSize:10,fill:"currentColor",fillOpacity:.6},tickLine:!1,axisLine:!1,interval:0,tickFormatter:e=>e.length>10?e.slice(0,10)+"…":e}),(0,r.jsx)(x.h,{tick:{fontSize:10,fill:"currentColor",fillOpacity:.5},tickLine:!1,axisLine:!1,tickFormatter:n,width:44}),(0,r.jsx)(m.m,{contentStyle:{backgroundColor:"var(--color-bg)",border:"1px solid var(--color-border)",borderRadius:"8px",fontSize:"12px"},formatter:e=>[n(e),k]}),(0,r.jsx)(u.yP,{dataKey:t,radius:[4,4,0,0],children:o.map((e,t)=>(0,r.jsx)(p.f,{fill:b[t%b.length],fillOpacity:.85},t))})]})}):(0,r.jsx)("div",{className:"h-44 flex items-center justify-center text-text-muted text-sm",children:"No provider usage yet"})]})}g.propTypes={byProvider:n().object}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3521],{63521:(e,t,r)=>{r.r(t),r.d(t,{default:()=>g});var o=r(95155),s=r(12115),a=r(14051),i=r.n(a),n=r(81750),l=r(6793);r(53255);var d=r(88105),c=r(8247);function p({data:e}){let{label:t,color:r,imageUrl:a,textIcon:i,active:d}=e,[u,h]=(0,s.useState)(!1);return(0,o.jsxs)("div",{className:"flex items-center gap-2.5 px-4 py-2.5 rounded-lg border-2 transition-all duration-300 bg-bg",style:{borderColor:d?r:"var(--color-border)",boxShadow:d?`0 0 16px ${r}40`:"none",minWidth:"150px"},children:[(0,o.jsx)(n.h7,{type:"target",position:l.yX.Top,id:"top",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Bottom,id:"bottom",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Left,id:"left",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"target",position:l.yX.Right,id:"right",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)("div",{className:"w-8 h-8 rounded-md flex items-center justify-center shrink-0",style:{backgroundColor:`${r}15`},children:a&&!u?(0,o.jsx)("img",{src:a,alt:t,className:"w-6 h-6 rounded-sm object-contain",loading:"lazy",decoding:"async",onError:()=>{let e=a?.match(/^\/providers\/([^/]+)\.png$/i);e&&(0,c.Kw)(e[1]),h(!0)}}):(0,o.jsx)("span",{className:"text-sm font-bold",style:{color:r},children:i})}),(0,o.jsx)("span",{className:"text-base font-medium truncate",style:{color:d?r:"var(--color-text)"},children:t}),d&&(0,o.jsxs)("span",{className:"relative flex h-2 w-2 shrink-0",children:[(0,o.jsx)("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full opacity-75",style:{backgroundColor:r}}),(0,o.jsx)("span",{className:"relative inline-flex rounded-full h-2 w-2",style:{backgroundColor:r}})]})]})}function u({data:e}){let t=(e.activeCount||0)>0;return(0,o.jsxs)("div",{className:`relative z-[1] flex items-center justify-center px-5 py-3 rounded-xl border-2 min-w-[130px] ${t?"topology-router-core border-yellow-300 bg-gradient-to-br from-primary/30 via-yellow-400/20 to-cyan-400/25":"border-primary bg-primary/5 shadow-md"}`,children:[(0,o.jsx)(n.h7,{type:"source",position:l.yX.Top,id:"top",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Bottom,id:"bottom",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Left,id:"left",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)(n.h7,{type:"source",position:l.yX.Right,id:"right",className:"!bg-transparent !border-0 !w-0 !h-0"}),(0,o.jsx)("img",{src:"/favicon.svg",alt:"9Router",className:`w-6 h-6 mr-2 ${t?"topology-router-icon":""}`,loading:"lazy",decoding:"async"}),(0,o.jsx)("span",{className:`text-sm font-bold ${t?"topology-router-label text-yellow-300":"text-primary"}`,children:"9Router"}),e.activeCount>0&&(0,o.jsx)("span",{className:"ml-2 px-1.5 py-0.5 rounded-full bg-yellow-400 text-black text-xs font-bold topology-router-badge",children:e.activeCount})]})}function h({id:e,sourceX:t,sourceY:r,targetX:s,targetY:a,sourcePosition:i,targetPosition:d,style:c={},data:p}){let[u]=(0,l.Fp)({sourceX:t,sourceY:r,sourcePosition:i,targetX:s,targetY:a,targetPosition:d}),m=!!p?.active,f=c.stroke||"var(--color-border)",g=`topo-electric-${e}`;return m?(0,o.jsxs)("g",{className:"topology-edge-electric",children:[(0,o.jsx)("defs",{children:(0,o.jsxs)("filter",{id:g,x:"-40%",y:"-40%",width:"180%",height:"180%",children:[(0,o.jsx)("feTurbulence",{type:"fractalNoise",baseFrequency:"0.9",numOctaves:"2",seed:"2",result:"noise",children:(0,o.jsx)("animate",{attributeName:"baseFrequency",values:"0.8;1.4;0.8",dur:"0.25s",repeatCount:"indefinite"})}),(0,o.jsx)("feDisplacementMap",{in:"SourceGraphic",in2:"noise",scale:"3.5",xChannelSelector:"R",yChannelSelector:"G"})]})}),(0,o.jsx)("path",{d:u,fill:"none",stroke:"#22d3ee",strokeWidth:10,strokeOpacity:.35,strokeLinecap:"round",filter:`url(#${g})`,className:"topology-edge-halo"}),(0,o.jsx)("path",{d:u,fill:"none",stroke:"#4ade80",strokeWidth:5,strokeOpacity:.85,strokeLinecap:"round",filter:`url(#${g})`,className:"topology-edge-plasma"}),(0,o.jsx)(n.tE,{id:e,path:u,style:{stroke:"#f8fafc",strokeWidth:2.2,opacity:1},className:"topology-edge-kame"}),Array.from({length:6},(t,r)=>(0,o.jsx)("circle",{r:r%2==0?4:2.5,fill:r%3==0?"#fde047":r%3==1?"#67e8f9":"#fff",opacity:.95,style:{filter:"drop-shadow(0 0 4px #22d3ee)"},children:(0,o.jsx)("animateMotion",{dur:`${.4+.08*r}s`,repeatCount:"indefinite",path:u,begin:`${.09*r}s`})},`${e}-p-${r}`)),Array.from({length:5},(t,r)=>(0,o.jsxs)("circle",{r:1.8,fill:"#e0f2fe",opacity:0,children:[(0,o.jsx)("animate",{attributeName:"opacity",values:"0;1;0;0;1;0",dur:`${.35+r%3*.1}s`,begin:`${.07*r}s`,repeatCount:"indefinite"}),(0,o.jsx)("animateMotion",{dur:`${.28+.05*r}s`,repeatCount:"indefinite",path:u,begin:`${.11*r}s`})]},`${e}-s-${r}`))]}):(0,o.jsx)(n.tE,{id:e,path:u,style:{...c,stroke:f}})}p.propTypes={data:i().object.isRequired},u.propTypes={data:i().object.isRequired},h.propTypes={id:i().string,sourceX:i().number,sourceY:i().number,targetX:i().number,targetY:i().number,sourcePosition:i().string,targetPosition:i().string,style:i().object,data:i().object};let m={provider:p,router:u},f={topology:h};function g({providers:e=[],activeRequests:t=[],lastProvider:r="",errorProvider:a=""}){let i=(0,s.useMemo)(()=>t.map(e=>e.provider?.toLowerCase()).filter(Boolean).sort().join(","),[t]),l=r?.toLowerCase()||"",p=a?.toLowerCase()||"",u=(0,s.useMemo)(()=>new Set(i?i.split(","):[]),[i]),h=(0,s.useMemo)(()=>new Set(l?[l]:[]),[l]),b=(0,s.useMemo)(()=>new Set(p?[p]:[]),[p]),y=(0,s.useRef)({}),[x,v]=(0,s.useState)(0);(0,s.useEffect)(()=>{let e=y.current,t=Date.now();for(let r of u)e[r]||(e[r]=t);for(let t of Object.keys(e))u.has(t)||delete e[t]},[u]),(0,s.useEffect)(()=>{if(0===u.size)return;let e=setInterval(()=>v(e=>e+1),1e3);return()=>clearInterval(e)},[u]);let j=(0,s.useMemo)(()=>{let e=Date.now(),t=new Set;for(let r of u){let o=y.current[r];(!o||e-o<6e4)&&t.add(r)}return t},[u,x]),{nodes:w,edges:N}=(0,s.useMemo)(()=>(function(e,t,r,o){let s=e.length,a=Math.max(320,204*s/(2*Math.PI)),i=Math.max(200,.55*a);if(0===s)return{nodes:[{id:"router",type:"router",position:{x:0,y:0},data:{activeCount:0},draggable:!1}],edges:[]};let n=[],l=[];return n.push({id:"router",type:"router",position:{x:-60,y:-22},data:{activeCount:t.size},draggable:!1}),e.forEach((e,p)=>{var u,h;let m,f,g=(u=e.provider,d.Q2[u]||{color:"#6b7280",name:u}),b=t.has(e.provider?.toLowerCase()),y=!b&&r.has(e.provider?.toLowerCase()),x=!b&&o.has(e.provider?.toLowerCase()),v=`provider-${e.provider}`,j={label:(g.name!==e.provider?g.name:null)||e.nodeName||e.name||e.provider,color:g.color||"#6b7280",imageUrl:(h=e.provider,(0,c.HY)(h)),textIcon:g.textIcon||(e.provider||"?").slice(0,2).toUpperCase(),active:b},w=-Math.PI/2+2*Math.PI*p/s,N=a*Math.cos(w),k=i*Math.sin(w);Math.abs(w+Math.PI/2)<Math.PI/4||Math.abs(w-3*Math.PI/2)<Math.PI/4?(m="top",f="bottom"):Math.abs(w-Math.PI/2)<Math.PI/4?(m="bottom",f="top"):N>0?(m="right",f="left"):(m="left",f="right"),n.push({id:v,type:"provider",position:{x:N-90,y:k-15},data:j,draggable:!1}),l.push({id:`e-${v}`,type:"topology",source:"router",sourceHandle:m,target:v,targetHandle:f,animated:!1,data:{active:b},style:x?{stroke:"#ef4444",strokeWidth:2.5,opacity:.9}:b?{stroke:"#22d3ee",strokeWidth:3.5,opacity:1}:y?{stroke:"#f59e0b",strokeWidth:2,opacity:.7}:{stroke:"var(--color-border)",strokeWidth:1,opacity:.3}})}),{nodes:n,edges:l}})(e,j,h,b),[e,j,h,b]),k=(0,s.useMemo)(()=>e.map(e=>e.provider).sort().join(","),[e]),C=(0,s.useRef)(null),M=(0,s.useRef)(null),$={padding:.2,duration:200},I=(0,s.useCallback)(e=>{C.current=e,setTimeout(()=>e.fitView($),50)},[]);return(0,s.useEffect)(()=>{let e=M.current;if(!e)return;let t=new ResizeObserver(()=>{C.current&&C.current.fitView($)});return t.observe(e),()=>t.disconnect()},[]),(0,s.useEffect)(()=>{if(C.current){let e=setTimeout(()=>C.current.fitView($),50);return()=>clearTimeout(e)}},[w.length]),(0,o.jsx)("div",{ref:M,className:"h-[320px] w-full min-w-0 rounded-lg border border-border bg-bg-subtle/30 sm:h-[480px]",children:0===e.length?(0,o.jsx)("div",{className:"h-full flex items-center justify-center text-text-muted text-sm",children:"No providers connected"}):(0,o.jsx)(n.Gc,{nodes:w,edges:N,nodeTypes:m,edgeTypes:f,fitView:!0,fitViewOptions:$,minZoom:.1,maxZoom:2,onInit:I,proOptions:{hideAttribution:!0},panOnDrag:!0,zoomOnScroll:!0,zoomOnPinch:!0,zoomOnDoubleClick:!0,preventScrolling:!1,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!1,children:(0,o.jsx)(n.H2,{showInteractive:!1,className:"react-flow-controls-custom"})},k)})}g.propTypes={providers:i().arrayOf(i().shape({id:i().string,provider:i().string,name:i().string})),activeRequests:i().arrayOf(i().shape({provider:i().string,model:i().string,account:i().string})),lastProvider:i().string,errorProvider:i().string}}}]);
|