zevairouter 1.0.104 → 1.0.106
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/CHANGELOG.md +44 -0
- package/README.md +6 -2
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +11 -11
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +11 -11
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/{3702-71ea2cb15f471160.js → 3702-5f034d6da865ad7a.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/5497-cd29d71de5a0d443.js +7 -0
- package/cli/app/.next-cli-build/static/chunks/9126-2efa8985d72b10b7.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/{page-16cab1ed7e707419.js → page-a2d55f0103564e42.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-a5bcf36367dce737.js +1 -0
- package/cli/app/.next-cli-build/static/css/b2b993ebf3c2ebd5.css +1 -0
- package/cli/app/CHANGELOG.md +44 -0
- package/cli/app/package.json +7 -2
- package/cli/package.json +1 -1
- package/open-sse/handlers/embeddingProviders/gemini.js +4 -1
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +4 -1
- package/open-sse/handlers/imageProviders/blackForestLabs.js +4 -1
- package/open-sse/handlers/imageProviders/cloudflareAi.js +4 -1
- package/open-sse/handlers/imageProviders/codex.js +4 -1
- package/open-sse/handlers/imageProviders/comfyui.js +4 -1
- package/open-sse/handlers/imageProviders/falAi.js +4 -1
- package/open-sse/handlers/imageProviders/gemini.js +4 -1
- package/open-sse/handlers/imageProviders/huggingface.js +4 -1
- package/open-sse/handlers/imageProviders/nanobanana.js +4 -1
- package/open-sse/handlers/imageProviders/runwayml.js +4 -1
- package/open-sse/handlers/imageProviders/sdwebui.js +4 -1
- package/open-sse/handlers/imageProviders/stabilityAi.js +4 -1
- package/open-sse/handlers/ttsProviders/edgeTts.js +4 -1
- package/open-sse/handlers/ttsProviders/elevenlabs.js +4 -1
- package/open-sse/handlers/ttsProviders/gemini.js +4 -1
- package/open-sse/handlers/ttsProviders/googleTts.js +4 -1
- package/open-sse/handlers/ttsProviders/localDevice.js +4 -1
- package/open-sse/handlers/ttsProviders/openai.js +4 -1
- package/open-sse/handlers/ttsProviders/openrouter.js +4 -1
- package/open-sse/utils/cursorChecksum.js +4 -1
- package/open-sse/utils/cursorProtobuf.js +4 -1
- package/package.json +7 -2
- package/src/app/(dashboard)/dashboard/automation/page.js +3 -0
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +8 -1
- package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +2 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +7 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +7 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +1 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +5 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +2 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +6 -0
- package/src/app/(dashboard)/dashboard/combos/page.js +3 -0
- package/src/app/(dashboard)/dashboard/context/page.js +1 -0
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +7 -0
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +10 -0
- package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -0
- package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +4 -0
- package/src/app/(dashboard)/dashboard/profile/page.js +2 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +4 -0
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +8 -6
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +2 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +1 -0
- package/src/app/(dashboard)/dashboard/providers/page.js +9 -1
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +4 -1
- package/src/app/(dashboard)/dashboard/pxpipe/PxpipeClient.js +1 -0
- package/src/app/(dashboard)/dashboard/terminal/TerminalPageClient.js +1 -0
- package/src/app/(dashboard)/dashboard/token-saver/TokenSaverClient.js +3 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +2 -0
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +11 -6
- package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +2 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +1 -0
- package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +1 -0
- package/src/app/api/oauth/cursor/auto-import/route.js +0 -1
- package/src/app/callback/page.js +1 -0
- package/src/app/dashboard/settings/pricing/page.js +1 -0
- package/src/lib/db/migrations/001-initial.js +4 -1
- package/src/shared/components/AddCustomEmbeddingModal.js +1 -0
- package/src/shared/components/BulkAccountAutomationModal.js +3 -1
- package/src/shared/components/ChangelogModal.js +1 -0
- package/src/shared/components/CursorAuthModal.js +1 -0
- package/src/shared/components/EditConnectionModal.js +1 -0
- package/src/shared/components/HeaderLanguage.js +1 -0
- package/src/shared/components/KiroAuthModal.js +1 -0
- package/src/shared/components/KiroOAuthWrapper.js +1 -0
- package/src/shared/components/LanguageSwitcher.js +2 -0
- package/src/shared/components/McpMarketplaceModal.js +1 -1
- package/src/shared/components/ModelSelectModal.js +10 -6
- package/src/shared/components/OAuthModal.js +3 -1
- package/src/shared/components/PricingModal.js +1 -0
- package/src/shared/components/ProviderIcon.js +8 -3
- package/src/shared/components/RequestLogger.js +1 -0
- package/src/shared/components/Sidebar.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/5497-667e14237552c864.js +0 -7
- package/cli/app/.next-cli-build/static/chunks/9126-5dc2ccda07a8c55e.js +0 -1
- package/cli/app/.next-cli-build/static/chunks/app/landing/page-6621ec8b157e77cc.js +0 -1
- package/cli/app/.next-cli-build/static/css/c7077ef89735a356.css +0 -1
- /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{CsjKSx0C8GBhUjd-ob2F9 → cfUGr8kYmZvImlaBuzL9m}/_ssgManifest.js +0 -0
|
@@ -22,19 +22,24 @@ export default function KiloToolCard({ tool, isExpanded, onToggle, baseUrl, apiK
|
|
|
22
22
|
const [customBaseUrl, setCustomBaseUrl] = useState("");
|
|
23
23
|
|
|
24
24
|
useEffect(() => {
|
|
25
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
25
26
|
if (apiKeys?.length > 0 && !selectedApiKey) setSelectedApiKey(apiKeys[0].key);
|
|
26
27
|
}, [apiKeys, selectedApiKey]);
|
|
27
28
|
|
|
28
29
|
useEffect(() => {
|
|
30
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
29
31
|
if (initialStatus) setStatus(initialStatus);
|
|
30
32
|
}, [initialStatus]);
|
|
31
33
|
|
|
32
34
|
useEffect(() => {
|
|
33
35
|
if (isExpanded && !status) {
|
|
36
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
34
37
|
checkStatus();
|
|
38
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
35
39
|
fetchModelAliases();
|
|
36
40
|
}
|
|
37
41
|
if (isExpanded) fetchModelAliases();
|
|
42
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
38
43
|
}, [isExpanded]);
|
|
39
44
|
|
|
40
45
|
const fetchModelAliases = async () => {
|
|
@@ -41,7 +41,9 @@ export default function MitmToolCard({
|
|
|
41
41
|
const canRunWithoutPassword = isWin || hasCachedPassword || needsSudoPassword === false;
|
|
42
42
|
|
|
43
43
|
useEffect(() => {
|
|
44
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
44
45
|
if (isExpanded) loadSavedMappings();
|
|
46
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest loadSavedMappings (adding it would re-trigger on every change)
|
|
45
47
|
}, [isExpanded]);
|
|
46
48
|
|
|
47
49
|
const loadSavedMappings = async () => {
|
|
@@ -48,20 +48,25 @@ export default function OpenClawToolCard({
|
|
|
48
48
|
|
|
49
49
|
useEffect(() => {
|
|
50
50
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
51
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
51
52
|
setSelectedApiKey(apiKeys[0].key);
|
|
52
53
|
}
|
|
53
54
|
}, [apiKeys, selectedApiKey]);
|
|
54
55
|
|
|
55
56
|
useEffect(() => {
|
|
57
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but openclawStatus is also updated independently by fetch/user actions
|
|
56
58
|
if (initialStatus) setOpenclawStatus(initialStatus);
|
|
57
59
|
}, [initialStatus]);
|
|
58
60
|
|
|
59
61
|
useEffect(() => {
|
|
60
62
|
if (isExpanded && !openclawStatus) {
|
|
63
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
61
64
|
checkOpenclawStatus();
|
|
65
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
62
66
|
fetchModelAliases();
|
|
63
67
|
}
|
|
64
68
|
if (isExpanded) fetchModelAliases();
|
|
69
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest openclawStatus (adding it would re-trigger on every change)
|
|
65
70
|
}, [isExpanded]);
|
|
66
71
|
|
|
67
72
|
const fetchModelAliases = async () => {
|
|
@@ -80,6 +85,7 @@ export default function OpenClawToolCard({
|
|
|
80
85
|
const provider = openclawStatus.settings?.models?.providers?.["zevai"];
|
|
81
86
|
if (provider) {
|
|
82
87
|
const primaryModel = openclawStatus.settings?.agents?.defaults?.model?.primary;
|
|
88
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time pre-fill from fetched tool config, guarded by hasInitializedModel ref
|
|
83
89
|
if (primaryModel) setSelectedModel(primaryModel.replace("zevai/", ""));
|
|
84
90
|
if (provider.apiKey && apiKeys?.some(k => k.key === provider.apiKey)) {
|
|
85
91
|
setSelectedApiKey(provider.apiKey);
|
|
@@ -37,25 +37,31 @@ export default function OpenCodeToolCard({ tool, isExpanded, onToggle, baseUrl,
|
|
|
37
37
|
|
|
38
38
|
useEffect(() => {
|
|
39
39
|
if (apiKeys?.length > 0 && !selectedApiKey) {
|
|
40
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- controlled/uncontrolled hybrid: default selection from apiKeys prop, user can change it independently
|
|
40
41
|
setSelectedApiKey(apiKeys[0].key);
|
|
41
42
|
}
|
|
42
43
|
}, [apiKeys, selectedApiKey]);
|
|
43
44
|
|
|
44
45
|
useEffect(() => {
|
|
46
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: mirrors initialStatus prop, but status is also updated independently by fetch/user actions
|
|
45
47
|
if (initialStatus) setStatus(initialStatus);
|
|
46
48
|
}, [initialStatus]);
|
|
47
49
|
|
|
48
50
|
useEffect(() => {
|
|
49
51
|
if (isExpanded && !status) {
|
|
52
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
50
53
|
checkStatus();
|
|
54
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
51
55
|
fetchModelAliases();
|
|
52
56
|
}
|
|
53
57
|
if (isExpanded) fetchModelAliases();
|
|
58
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [isExpanded]; read latest status (adding it would re-trigger on every change)
|
|
54
59
|
}, [isExpanded]);
|
|
55
60
|
|
|
56
61
|
// Sync models from existing config
|
|
57
62
|
useEffect(() => {
|
|
58
63
|
if (status?.opencode?.models) {
|
|
64
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync from fetched tool config: pre-fills selectedModels, which the user can also edit independently
|
|
59
65
|
setSelectedModels(status.opencode.models);
|
|
60
66
|
}
|
|
61
67
|
if (status?.opencode?.activeModel) {
|
|
@@ -26,6 +26,7 @@ export default function CombosPage() {
|
|
|
26
26
|
const { copied, copy } = useCopyToClipboard();
|
|
27
27
|
|
|
28
28
|
useEffect(() => {
|
|
29
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
29
30
|
fetchData();
|
|
30
31
|
}, []);
|
|
31
32
|
|
|
@@ -131,6 +132,7 @@ export default function CombosPage() {
|
|
|
131
132
|
};
|
|
132
133
|
|
|
133
134
|
useEffect(() => {
|
|
135
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination clamp: keeps page within range when the filtered list shrinks
|
|
134
136
|
setPage((current) => Math.min(current, Math.max(1, Math.ceil(combos.length / pageSize))));
|
|
135
137
|
}, [combos.length, pageSize]);
|
|
136
138
|
|
|
@@ -449,6 +451,7 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders, kindF
|
|
|
449
451
|
};
|
|
450
452
|
|
|
451
453
|
useEffect(() => {
|
|
454
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- fetch-on-open: fetchModalData sets state only after await, which the rule flags conservatively
|
|
452
455
|
if (isOpen) fetchModalData();
|
|
453
456
|
}, [isOpen]);
|
|
454
457
|
|
|
@@ -38,6 +38,7 @@ export default function ContextPage() {
|
|
|
38
38
|
}
|
|
39
39
|
}, []);
|
|
40
40
|
|
|
41
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; load() sets state only after await, which the rule flags conservatively
|
|
41
42
|
useEffect(() => { load(); }, [load]);
|
|
42
43
|
|
|
43
44
|
const toggleGlobal = async (val) => {
|
|
@@ -114,6 +114,7 @@ export default function APIPageClient({ machineId }) {
|
|
|
114
114
|
const [isRemoteHost, setIsRemoteHost] = useState(false);
|
|
115
115
|
useEffect(() => {
|
|
116
116
|
if (typeof window !== "undefined")
|
|
117
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
117
118
|
setIsRemoteHost(!["localhost", "127.0.0.1", "::1"].includes(window.location.hostname));
|
|
118
119
|
}, []);
|
|
119
120
|
|
|
@@ -131,8 +132,11 @@ export default function APIPageClient({ machineId }) {
|
|
|
131
132
|
}, [tsInstallLog]);
|
|
132
133
|
|
|
133
134
|
useEffect(() => {
|
|
135
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
134
136
|
fetchData();
|
|
137
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
135
138
|
loadSettings();
|
|
139
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- mount-only initial load; fetchData/loadSettings are stable fetch+setState helpers
|
|
136
140
|
}, []);
|
|
137
141
|
|
|
138
142
|
// Status poll: only while degraded (not yet reachable). Stop once healthy to avoid spam.
|
|
@@ -143,6 +147,7 @@ export default function APIPageClient({ machineId }) {
|
|
|
143
147
|
const tunnelHealthy = !tunnelEnabled || tunnelReachable;
|
|
144
148
|
const tsHealthy = !tsEnabled || tsReachable;
|
|
145
149
|
const allHealthy = tunnelHealthy && tsHealthy;
|
|
150
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
146
151
|
const onVisible = () => { if (!document.hidden) syncTunnelStatus(); };
|
|
147
152
|
document.addEventListener("visibilitychange", onVisible);
|
|
148
153
|
if (allHealthy) return () => document.removeEventListener("visibilitychange", onVisible);
|
|
@@ -151,6 +156,7 @@ export default function APIPageClient({ machineId }) {
|
|
|
151
156
|
clearInterval(timer);
|
|
152
157
|
document.removeEventListener("visibilitychange", onVisible);
|
|
153
158
|
};
|
|
159
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- syncTunnelStatus is a stable fetch+setState helper (reads via refs/setters, no stale state)
|
|
154
160
|
}, [tunnelEnabled, tsEnabled, tunnelReachable, tsReachable]);
|
|
155
161
|
|
|
156
162
|
// Browser-side periodic ping: probes tunnel/tailscale URLs directly so UI stays
|
|
@@ -735,6 +741,7 @@ export default function APIPageClient({ machineId }) {
|
|
|
735
741
|
// Hydration fix: Only access window on client side
|
|
736
742
|
useEffect(() => {
|
|
737
743
|
if (typeof window !== "undefined") {
|
|
744
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
738
745
|
setBaseUrl(`${window.location.origin}/v1`);
|
|
739
746
|
}
|
|
740
747
|
}, []);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
/* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
|
|
2
3
|
|
|
3
4
|
import { useParams, notFound, useRouter } from "next/navigation";
|
|
4
5
|
import Link from "next/link";
|
|
@@ -150,6 +151,7 @@ function EmbeddingExampleCard({ providerId, customAlias }) {
|
|
|
150
151
|
const { copied: copiedRes, copy: copyRes } = useCopyToClipboard();
|
|
151
152
|
|
|
152
153
|
useEffect(() => {
|
|
154
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
153
155
|
setLocalEndpoint(window.location.origin);
|
|
154
156
|
fetch("/api/keys")
|
|
155
157
|
.then((r) => r.json())
|
|
@@ -413,6 +415,7 @@ function TtsExampleCard({ providerId }) {
|
|
|
413
415
|
const [languageHint, setLanguageHint] = useState("");
|
|
414
416
|
|
|
415
417
|
useEffect(() => {
|
|
418
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
416
419
|
setLocalEndpoint(window.location.origin);
|
|
417
420
|
fetch("/api/keys")
|
|
418
421
|
.then((r) => r.json())
|
|
@@ -451,17 +454,20 @@ function TtsExampleCard({ providerId }) {
|
|
|
451
454
|
// api-language (edge-tts, local-device, elevenlabs): NO default load, wait for user to pick language
|
|
452
455
|
// config (nvidia, hyperbolic, deepgram, huggingface, cartesia, playht, coqui, tortoise, inworld, qwen):
|
|
453
456
|
// use ttsConfig.models for model selector; voice is empty by default (backend uses provider default)
|
|
457
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [providerId]; read latest latest values (adding it would re-trigger on every change)
|
|
454
458
|
}, [providerId]);
|
|
455
459
|
|
|
456
460
|
// Update voices when model changes (voicesPerModel providers)
|
|
457
461
|
useEffect(() => {
|
|
458
462
|
if (!config.voicesPerModel || !selectedModel) return;
|
|
459
463
|
const voices = getTtsVoicesForModel(providerId, selectedModel) || [];
|
|
464
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync derived voice list when selectedModel changes; voices come from a static config map and also drive selectedVoice reset below
|
|
460
465
|
setCountryVoices(voices);
|
|
461
466
|
if (voices.length) {
|
|
462
467
|
setSelectedVoice(voices[0].id);
|
|
463
468
|
setSelectedVoiceName(voices[0].name || voices[0].id);
|
|
464
469
|
}
|
|
470
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [selectedModel]; read latest config.voicesPerModel (adding it would re-trigger on every change)
|
|
465
471
|
}, [selectedModel]);
|
|
466
472
|
|
|
467
473
|
// Open modal — load language list
|
|
@@ -957,6 +963,7 @@ function GenericExampleCard({ providerId, kind }) {
|
|
|
957
963
|
const { copied: copiedRes, copy: copyRes } = useCopyToClipboard();
|
|
958
964
|
|
|
959
965
|
useEffect(() => {
|
|
966
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
960
967
|
setLocalEndpoint(window.location.origin);
|
|
961
968
|
fetch("/api/keys")
|
|
962
969
|
.then((r) => r.json())
|
|
@@ -1453,6 +1460,7 @@ function SttExampleCard({ providerId }) {
|
|
|
1453
1460
|
const { copied: copiedRes, copy: copyRes } = useCopyToClipboard();
|
|
1454
1461
|
|
|
1455
1462
|
useEffect(() => {
|
|
1463
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
1456
1464
|
setLocalEndpoint(window.location.origin);
|
|
1457
1465
|
fetch("/api/keys")
|
|
1458
1466
|
.then((r) => r.json())
|
|
@@ -1493,6 +1501,7 @@ function SttExampleCard({ providerId }) {
|
|
|
1493
1501
|
setRunning(true);
|
|
1494
1502
|
setError("");
|
|
1495
1503
|
setResult(null);
|
|
1504
|
+
// eslint-disable-next-line react-hooks/purity -- Date.now() runs inside the handleRun click handler, not during render; needed to measure request latency
|
|
1496
1505
|
const start = Date.now();
|
|
1497
1506
|
try {
|
|
1498
1507
|
const fd = new FormData();
|
|
@@ -1506,6 +1515,7 @@ function SttExampleCard({ providerId }) {
|
|
|
1506
1515
|
const headers = {};
|
|
1507
1516
|
if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
|
|
1508
1517
|
const res = await fetch("/api/v1/audio/transcriptions", { method: "POST", headers, body: fd });
|
|
1518
|
+
// eslint-disable-next-line react-hooks/purity -- Date.now() runs inside the handleRun click handler after fetch resolves, not during render; computes request latency
|
|
1509
1519
|
setLatency(Date.now() - start);
|
|
1510
1520
|
const ct = res.headers.get("content-type") || "";
|
|
1511
1521
|
const data = ct.includes("application/json") ? await res.json() : await res.text();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
/* eslint-disable @next/next/no-img-element -- dynamic/blob/external image src with onError fallback; next/image requires static dims + domain allowlist */
|
|
2
3
|
|
|
3
4
|
import { useParams, notFound, useRouter } from "next/navigation";
|
|
4
5
|
import { useEffect, useState } from "react";
|
|
@@ -175,6 +176,7 @@ export default function ComboDetailPage() {
|
|
|
175
176
|
setTestError("");
|
|
176
177
|
if (testResult?.audioUrl) { try { URL.revokeObjectURL(testResult.audioUrl); } catch {} }
|
|
177
178
|
if (testResult?.imageUrl?.startsWith("blob:")) { try { URL.revokeObjectURL(testResult.imageUrl); } catch {} }
|
|
179
|
+
// eslint-disable-next-line react-hooks/purity -- Date.now() runs inside the handleTest click handler, not during render; needed to measure request latency
|
|
178
180
|
const start = Date.now();
|
|
179
181
|
try {
|
|
180
182
|
const path = EXAMPLE_PATHS[combo.kind];
|
|
@@ -182,6 +184,7 @@ export default function ComboDetailPage() {
|
|
|
182
184
|
const headers = { "Content-Type": "application/json" };
|
|
183
185
|
if (apiKey) headers["Authorization"] = `Bearer ${apiKey}`;
|
|
184
186
|
const res = await fetch(`/api${path}`, { method: "POST", headers, body: JSON.stringify(body) });
|
|
187
|
+
// eslint-disable-next-line react-hooks/purity -- Date.now() runs inside the handleTest click handler after fetch resolves, not during render; computes request latency
|
|
185
188
|
const latencyMs = Date.now() - start;
|
|
186
189
|
if (!res.ok) {
|
|
187
190
|
const d = await res.json().catch(() => ({}));
|
|
@@ -15,9 +15,13 @@ export default function MitmPageClient() {
|
|
|
15
15
|
const [mitmStatus, setMitmStatus] = useState({ running: false, certExists: false, dnsStatus: {}, hasCachedPassword: false });
|
|
16
16
|
|
|
17
17
|
useEffect(() => {
|
|
18
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
18
19
|
fetchConnections();
|
|
20
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
19
21
|
fetchApiKeys();
|
|
22
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
20
23
|
fetchAliases();
|
|
24
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
21
25
|
fetchCloudSettings();
|
|
22
26
|
}, []);
|
|
23
27
|
|
|
@@ -59,6 +59,7 @@ export default function ProfilePage() {
|
|
|
59
59
|
const [proxyTestLoading, setProxyTestLoading] = useState(false);
|
|
60
60
|
|
|
61
61
|
useEffect(() => {
|
|
62
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- syncs locale from cookie (external store) on mount and whenever the language modal closes
|
|
62
63
|
setLocale(getLocaleFromCookie());
|
|
63
64
|
}, [langOpen]);
|
|
64
65
|
|
|
@@ -91,6 +92,7 @@ export default function ProfilePage() {
|
|
|
91
92
|
|
|
92
93
|
useEffect(() => {
|
|
93
94
|
if (typeof window !== "undefined") {
|
|
95
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- one-time mount initialization from window.location (external source, client-only, avoids hydration mismatch)
|
|
94
96
|
setOidcRedirectUri(`${window.location.origin}/api/auth/oidc/callback`);
|
|
95
97
|
}
|
|
96
98
|
}, []);
|
|
@@ -12,6 +12,7 @@ export default function AddCustomModelModal({ isOpen, providerAlias, providerDis
|
|
|
12
12
|
|
|
13
13
|
// Reset state when modal opens
|
|
14
14
|
useEffect(() => {
|
|
15
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- reset-on-open: clears form state each time the modal is reopened
|
|
15
16
|
if (isOpen) { setModelId(""); setTestStatus(null); setTestError(""); }
|
|
16
17
|
}, [isOpen]);
|
|
17
18
|
|
|
@@ -101,6 +101,7 @@ export default function ConnectionRow({ connection, proxyPools, isOAuth, isFirst
|
|
|
101
101
|
return () => {
|
|
102
102
|
if (interval) clearInterval(interval);
|
|
103
103
|
};
|
|
104
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [modelLockUntil]; read latest connection (adding it would re-trigger on every change)
|
|
104
105
|
}, [modelLockUntil]);
|
|
105
106
|
|
|
106
107
|
// Determine effective status (override unavailable if cooldown expired)
|
|
@@ -19,6 +19,7 @@ export default function EditCompatibleNodeModal({ isOpen, node, onSave, onClose,
|
|
|
19
19
|
|
|
20
20
|
useEffect(() => {
|
|
21
21
|
if (node) {
|
|
22
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: pre-fills form from the node being edited; user edits fields independently afterwards
|
|
22
23
|
setFormData({
|
|
23
24
|
name: node.name || "",
|
|
24
25
|
prefix: node.prefix || "",
|
|
@@ -467,12 +467,14 @@ export default function ProviderDetailPage() {
|
|
|
467
467
|
};
|
|
468
468
|
|
|
469
469
|
useEffect(() => {
|
|
470
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; these set state only after await, which the rule flags conservatively
|
|
470
471
|
fetchConnections();
|
|
471
472
|
fetchAliases();
|
|
472
473
|
fetchDisabledModels();
|
|
473
474
|
}, [fetchConnections, fetchAliases, fetchDisabledModels]);
|
|
474
475
|
|
|
475
476
|
useEffect(() => {
|
|
477
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- reset-on-prop-change: clears paging/filters when switching provider pages
|
|
476
478
|
setConnectionsPage(1);
|
|
477
479
|
setModelsPage(1);
|
|
478
480
|
setConnectionStatusFilter("all");
|
|
@@ -480,10 +482,12 @@ export default function ProviderDetailPage() {
|
|
|
480
482
|
}, [providerId]);
|
|
481
483
|
|
|
482
484
|
useEffect(() => {
|
|
485
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when filters/page size change
|
|
483
486
|
setConnectionsPage(1);
|
|
484
487
|
}, [connectionStatusFilter, connectionsPageSize, connectionQuery]);
|
|
485
488
|
|
|
486
489
|
useEffect(() => {
|
|
490
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when the model lists change
|
|
487
491
|
setModelsPage(1);
|
|
488
492
|
}, [modelsPageSize, disabledModelIds.length, models.length, kiloFreeModels.length]);
|
|
489
493
|
|
|
@@ -178,6 +178,7 @@ export default function ProviderDetailPage() {
|
|
|
178
178
|
};
|
|
179
179
|
|
|
180
180
|
useEffect(() => {
|
|
181
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; these set state only after await, which the rule flags conservatively
|
|
181
182
|
fetchConnections();
|
|
182
183
|
fetchAliases();
|
|
183
184
|
}, [fetchConnections, fetchAliases]);
|
|
@@ -187,6 +188,7 @@ export default function ProviderDetailPage() {
|
|
|
187
188
|
? []
|
|
188
189
|
: savedEnabledModels;
|
|
189
190
|
|
|
191
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- syncs selection from server-saved enabled models; functional update with deep-equality bail-out avoids loops
|
|
190
192
|
setSelectedModelIds((prev) => {
|
|
191
193
|
if (
|
|
192
194
|
prev.length === nextSelectedModelIds.length
|
|
@@ -246,6 +248,7 @@ export default function ProviderDetailPage() {
|
|
|
246
248
|
}, [activeConnection, isCompatible, models.length, providerInfo?.passthroughModels]);
|
|
247
249
|
|
|
248
250
|
useEffect(() => {
|
|
251
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- data fetch effect; fetchRemoteModels sets state only after await, which the rule flags conservatively
|
|
249
252
|
fetchRemoteModels();
|
|
250
253
|
}, [fetchRemoteModels]);
|
|
251
254
|
|
|
@@ -1143,12 +1146,7 @@ function ConnectionRow({ connection, isOAuth, isFirst, isLast, onMoveUp, onMoveD
|
|
|
1143
1146
|
|
|
1144
1147
|
// Use useState + useEffect for impure Date.now() to avoid calling during render
|
|
1145
1148
|
const [isCooldown, setIsCooldown] = useState(false);
|
|
1146
|
-
|
|
1147
|
-
const modelLockUntil = Object.entries(connection)
|
|
1148
|
-
.filter(([k]) => k.startsWith("modelLock_"))
|
|
1149
|
-
.map(([, v]) => v)
|
|
1150
|
-
.filter(v => v && new Date(v).getTime() > Date.now())
|
|
1151
|
-
.sort()[0] || null;
|
|
1149
|
+
const [modelLockUntil, setModelLockUntil] = useState(null);
|
|
1152
1150
|
|
|
1153
1151
|
useEffect(() => {
|
|
1154
1152
|
const checkCooldown = () => {
|
|
@@ -1158,6 +1156,7 @@ function ConnectionRow({ connection, isOAuth, isFirst, isLast, onMoveUp, onMoveD
|
|
|
1158
1156
|
.filter(v => v && new Date(v).getTime() > Date.now())
|
|
1159
1157
|
.sort()[0] || null;
|
|
1160
1158
|
setIsCooldown(!!until);
|
|
1159
|
+
setModelLockUntil((prev) => (prev === until ? prev : until));
|
|
1161
1160
|
};
|
|
1162
1161
|
|
|
1163
1162
|
checkCooldown();
|
|
@@ -1165,6 +1164,7 @@ function ConnectionRow({ connection, isOAuth, isFirst, isLast, onMoveUp, onMoveD
|
|
|
1165
1164
|
return () => {
|
|
1166
1165
|
if (interval) clearInterval(interval);
|
|
1167
1166
|
};
|
|
1167
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [modelLockUntil]; read latest connection (adding it would re-trigger on every change)
|
|
1168
1168
|
}, [modelLockUntil]);
|
|
1169
1169
|
|
|
1170
1170
|
// Determine effective status (override unavailable if cooldown expired)
|
|
@@ -1406,6 +1406,7 @@ function EditConnectionModal({ isOpen, connection, onSave, onClose }) {
|
|
|
1406
1406
|
|
|
1407
1407
|
useEffect(() => {
|
|
1408
1408
|
if (connection) {
|
|
1409
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: pre-fills form from the connection being edited; user edits fields independently afterwards
|
|
1409
1410
|
setFormData({
|
|
1410
1411
|
name: connection.name || "",
|
|
1411
1412
|
priority: connection.priority || 1,
|
|
@@ -1590,6 +1591,7 @@ function EditCompatibleNodeModal({ isOpen, node, onSave, onClose, isAnthropic })
|
|
|
1590
1591
|
|
|
1591
1592
|
useEffect(() => {
|
|
1592
1593
|
if (node) {
|
|
1594
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- sync-from-props hybrid: pre-fills form from the node being edited; user edits fields independently afterwards
|
|
1593
1595
|
setFormData({
|
|
1594
1596
|
name: node.name || "",
|
|
1595
1597
|
prefix: node.prefix || "",
|
|
@@ -72,6 +72,7 @@ function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMov
|
|
|
72
72
|
check();
|
|
73
73
|
const t = modelLockUntil ? setInterval(check, 1000) : null;
|
|
74
74
|
return () => { if (t) clearInterval(t); };
|
|
75
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- intentional: react only to [modelLockUntil]; read latest connection (adding it would re-trigger on every change)
|
|
75
76
|
}, [modelLockUntil]);
|
|
76
77
|
|
|
77
78
|
useEffect(() => {
|
|
@@ -329,6 +330,7 @@ export default function ConnectionsCard({ providerId, isOAuth }) {
|
|
|
329
330
|
finally { setLoading(false); }
|
|
330
331
|
}, [providerId]);
|
|
331
332
|
|
|
333
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- data fetch effect; fetch_ sets state only after await, which the rule flags conservatively
|
|
332
334
|
useEffect(() => { fetch_(); }, [fetch_]);
|
|
333
335
|
|
|
334
336
|
const saveStrategy = async (strategy, stickyLimit) => {
|
|
@@ -41,6 +41,7 @@ export default function ModelAvailabilityBadge() {
|
|
|
41
41
|
}, []);
|
|
42
42
|
|
|
43
43
|
useEffect(() => {
|
|
44
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- polling data fetch; fetchStatus sets state only after await, which the rule flags conservatively
|
|
44
45
|
fetchStatus();
|
|
45
46
|
const interval = setInterval(fetchStatus, 30000);
|
|
46
47
|
return () => clearInterval(interval);
|
|
@@ -137,6 +137,7 @@ export default function ModelsCard({ providerId, kindFilter, providerAliasOverri
|
|
|
137
137
|
} catch (e) { console.log("ModelsCard fetch error:", e); }
|
|
138
138
|
}, [providerId]);
|
|
139
139
|
|
|
140
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- data fetch effect; fetchData sets state only after await, which the rule flags conservatively
|
|
140
141
|
useEffect(() => { fetchData(); }, [fetchData]);
|
|
141
142
|
|
|
142
143
|
const handleSetAlias = async (modelId, alias) => {
|
|
@@ -142,6 +142,7 @@ export default function ProvidersPage() {
|
|
|
142
142
|
}, [registerSearch, unregisterSearch]);
|
|
143
143
|
|
|
144
144
|
useEffect(() => {
|
|
145
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when search query or page size changes
|
|
145
146
|
setApikeyPage(1);
|
|
146
147
|
}, [searchQuery, apikeyPageSize]);
|
|
147
148
|
|
|
@@ -947,7 +948,13 @@ function AddOpenAICompatibleModal({ isOpen, onClose, onCreated }) {
|
|
|
947
948
|
|
|
948
949
|
useEffect(() => {
|
|
949
950
|
const defaultBaseUrl = "https://api.openai.com/v1";
|
|
950
|
-
|
|
951
|
+
// Only reset baseUrl when it was not customized — the previous effect body
|
|
952
|
+
// stomped user input on every apiType change.
|
|
953
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- syncs baseUrl default when apiType changes; functional update bails out (returns prev) when the user customized the URL
|
|
954
|
+
setFormData((prev) => {
|
|
955
|
+
if (prev.baseUrl && prev.baseUrl !== defaultBaseUrl) return prev;
|
|
956
|
+
return { ...prev, baseUrl: defaultBaseUrl };
|
|
957
|
+
});
|
|
951
958
|
}, [formData.apiType]);
|
|
952
959
|
|
|
953
960
|
const handleSubmit = async () => {
|
|
@@ -1136,6 +1143,7 @@ function AddAnthropicCompatibleModal({ isOpen, onClose, onCreated }) {
|
|
|
1136
1143
|
|
|
1137
1144
|
useEffect(() => {
|
|
1138
1145
|
if (isOpen) {
|
|
1146
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- reset-on-open: clears validation state each time the modal is reopened
|
|
1139
1147
|
setValidationResult(null);
|
|
1140
1148
|
setCheckKey("");
|
|
1141
1149
|
setCheckModelId("");
|
|
@@ -85,6 +85,7 @@ export default function ProxyPoolsPage() {
|
|
|
85
85
|
}, []);
|
|
86
86
|
|
|
87
87
|
useEffect(() => {
|
|
88
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; fetchProxyPools sets state only after await, which the rule flags conservatively
|
|
88
89
|
fetchProxyPools();
|
|
89
90
|
}, [fetchProxyPools]);
|
|
90
91
|
|
|
@@ -342,10 +343,12 @@ export default function ProxyPoolsPage() {
|
|
|
342
343
|
|
|
343
344
|
// Cleanup selectedIds when pools change
|
|
344
345
|
useEffect(() => {
|
|
346
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- selection pruning: drops selected ids that no longer exist after pools refresh
|
|
345
347
|
setSelectedIds((prev) => prev.filter((id) => proxyPools.some((p) => p.id === id)));
|
|
346
348
|
}, [proxyPools]);
|
|
347
349
|
|
|
348
350
|
useEffect(() => {
|
|
351
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination clamp: keeps page within range when the pool list shrinks
|
|
349
352
|
setPage((current) => Math.min(current, Math.max(1, Math.ceil(proxyPools.length / pageSize))));
|
|
350
353
|
}, [proxyPools.length, pageSize]);
|
|
351
354
|
|
|
@@ -924,7 +927,7 @@ export default function ProxyPoolsPage() {
|
|
|
924
927
|
value={cloudflareForm.apiToken}
|
|
925
928
|
onChange={(e) => setCloudflareForm((prev) => ({ ...prev, apiToken: e.target.value }))}
|
|
926
929
|
placeholder="your-cloudflare-api-token"
|
|
927
|
-
hint={<>Requires
|
|
930
|
+
hint={<>Requires "Workers Scripts: Edit" permission. <a href="https://dash.cloudflare.com/profile/api-tokens" target="_blank" rel="noopener noreferrer" className="text-primary hover:underline">Get token →</a></>}
|
|
928
931
|
type="password"
|
|
929
932
|
/>
|
|
930
933
|
<Input
|
|
@@ -87,6 +87,7 @@ export default function PxpipeClient() {
|
|
|
87
87
|
}, []);
|
|
88
88
|
|
|
89
89
|
useEffect(() => {
|
|
90
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount data fetch; refresh() sets state only after await, which the rule flags conservatively
|
|
90
91
|
refresh();
|
|
91
92
|
}, [refresh]);
|
|
92
93
|
|
|
@@ -65,6 +65,7 @@ export default function TerminalPageClient() {
|
|
|
65
65
|
}, []);
|
|
66
66
|
|
|
67
67
|
useEffect(() => {
|
|
68
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount gate check; checkGate sets state only after await, which the rule flags conservatively
|
|
68
69
|
checkGate();
|
|
69
70
|
}, [checkGate]);
|
|
70
71
|
|
|
@@ -62,6 +62,7 @@ export default function TokenSaverClient() {
|
|
|
62
62
|
const { copied, copy } = useCopyToClipboard();
|
|
63
63
|
|
|
64
64
|
useEffect(() => {
|
|
65
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- mount init from locale cookie (external store) + subscription to locale-change events
|
|
65
66
|
setLocale(getCurrentLocale());
|
|
66
67
|
return onLocaleChange(() => setLocale(getCurrentLocale()));
|
|
67
68
|
}, []);
|
|
@@ -74,7 +75,9 @@ export default function TokenSaverClient() {
|
|
|
74
75
|
useEffect(() => {
|
|
75
76
|
const current = CAVEMAN_LEVELS.find((lvl) => lvl.id === cavemanLevel);
|
|
76
77
|
if (current?.wenyan && !isWenyanLocale) {
|
|
78
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- syncs persisted setting to a valid value: wenyan-only level is invalid after switching to a non-wenyan locale
|
|
77
79
|
setCavemanLevel("ultra");
|
|
80
|
+
// eslint-disable-next-line react-hooks/immutability -- false positive: these are local fetch+setState helpers invoked once on effect fire (not during render); defined with const below because all invocations are deferred (effects/events), so no TDZ issue at runtime
|
|
78
81
|
patchSetting({ cavemanLevel: "ultra" });
|
|
79
82
|
}
|
|
80
83
|
}, [isWenyanLocale, cavemanLevel]);
|
|
@@ -109,10 +109,12 @@ export default function QuotaTable({
|
|
|
109
109
|
const totalPages = Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE));
|
|
110
110
|
|
|
111
111
|
useEffect(() => {
|
|
112
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when sort mode or data changes
|
|
112
113
|
setPage(1);
|
|
113
114
|
}, [sortMode, quotas]);
|
|
114
115
|
|
|
115
116
|
useEffect(() => {
|
|
117
|
+
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination clamp: keeps page within range when total pages shrink
|
|
116
118
|
setPage((currentPage) => Math.min(currentPage, totalPages));
|
|
117
119
|
}, [totalPages]);
|
|
118
120
|
|