ai-agent-router 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-path-routes-manifest.json +4 -1
- package/.next/build/chunks/{[root-of-the-server]__6d51cb5d._.js → [root-of-the-server]__0iv9ksq._.js} +1 -1
- package/.next/build/chunks/[root-of-the-server]__0iv9ksq._.js.map +8 -0
- package/.next/build/chunks/{[root-of-the-server]__44695d76._.js → [root-of-the-server]__0rua-~2._.js} +30 -30
- package/.next/build/chunks/[root-of-the-server]__0rua-~2._.js.map +11 -0
- package/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_df7a5b11._.js → [turbopack-node]_transforms_postcss_ts_0nnejqq._.js} +2 -2
- package/.next/build/chunks/[turbopack]_runtime.js +155 -60
- package/.next/build/chunks/[turbopack]_runtime.js.map +6 -5
- package/.next/build/chunks/{node_modules_fe693df6._.js → node_modules_13sb.px._.js} +1 -1
- package/.next/build/chunks/{node_modules_fe693df6._.js.map → node_modules_13sb.px._.js.map} +42 -42
- package/.next/build/postcss.js +5 -5
- package/.next/build-manifest.json +8 -7
- package/.next/diagnostics/framework.json +1 -1
- package/.next/diagnostics/route-bundle-stats.json +93 -0
- package/.next/fallback-build-manifest.json +3 -2
- package/.next/images-manifest.json +1 -0
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +33 -9
- package/.next/required-server-files.js +18 -6
- package/.next/required-server-files.json +18 -6
- package/.next/routes-manifest.json +19 -0
- package/.next/server/app/_global-error/page/build-manifest.json +5 -5
- package/.next/server/app/_global-error/page.js +8 -9
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error/page_client-reference-manifest.js +2 -1
- package/.next/server/app/_global-error.html +1 -2
- package/.next/server/app/_global-error.rsc +11 -9
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_global-error.segments/_full.segment.rsc +11 -9
- package/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
- package/.next/server/app/_global-error.segments/_index.segment.rsc +4 -3
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page/build-manifest.json +5 -5
- package/.next/server/app/_not-found/page.js +11 -12
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +2 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +13 -11
- package/.next/server/app/_not-found.segments/_full.segment.rsc +13 -11
- package/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
- package/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -3
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/config/route/build-manifest.json +1 -3
- package/.next/server/app/api/config/route.js +4 -4
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/config/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/gateway/[...path]/route/build-manifest.json +1 -3
- package/.next/server/app/api/gateway/[...path]/route.js +5 -5
- package/.next/server/app/api/gateway/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/[...path]/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/gateway/models/route/build-manifest.json +1 -3
- package/.next/server/app/api/gateway/models/route.js +4 -4
- package/.next/server/app/api/gateway/models/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/models/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/gateway/route/build-manifest.json +1 -3
- package/.next/server/app/api/gateway/route.js +5 -5
- package/.next/server/app/api/gateway/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/apply/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/apply/route.js +4 -4
- package/.next/server/app/api/ide/claude/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/apply/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/available-models/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/available-models/route.js +4 -4
- package/.next/server/app/api/ide/claude/available-models/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/available-models/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/restore/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/restore/route.js +3 -3
- package/.next/server/app/api/ide/claude/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/restore/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/save/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/save/route.js +4 -4
- package/.next/server/app/api/ide/claude/save/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/save/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/status/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/status/route.js +4 -4
- package/.next/server/app/api/ide/claude/status/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/status/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/claude/test/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/claude/test/route.js +5 -5
- package/.next/server/app/api/ide/claude/test/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/test/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/apply/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/apply/route.js +4 -4
- package/.next/server/app/api/ide/openclaw/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/apply/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/available-models/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/available-models/route.js +4 -4
- package/.next/server/app/api/ide/openclaw/available-models/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/available-models/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/preview/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/preview/route.js +4 -4
- package/.next/server/app/api/ide/openclaw/preview/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/preview/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/restore/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/restore/route.js +3 -3
- package/.next/server/app/api/ide/openclaw/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/restore/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/save/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/save/route.js +4 -4
- package/.next/server/app/api/ide/openclaw/save/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/save/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/status/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/status/route.js +4 -4
- package/.next/server/app/api/ide/openclaw/status/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/status/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/openclaw/test/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/openclaw/test/route.js +3 -3
- package/.next/server/app/api/ide/openclaw/test/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/test/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/apply/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/apply/route.js +4 -4
- package/.next/server/app/api/ide/opencode/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/apply/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/available-models/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/available-models/route.js +4 -4
- package/.next/server/app/api/ide/opencode/available-models/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/available-models/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/preview/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/preview/route.js +4 -4
- package/.next/server/app/api/ide/opencode/preview/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/preview/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/restore/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/restore/route.js +3 -3
- package/.next/server/app/api/ide/opencode/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/restore/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/save/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/save/route.js +4 -4
- package/.next/server/app/api/ide/opencode/save/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/save/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/status/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/status/route.js +4 -4
- package/.next/server/app/api/ide/opencode/status/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/status/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/ide/opencode/test/route/build-manifest.json +1 -3
- package/.next/server/app/api/ide/opencode/test/route.js +3 -3
- package/.next/server/app/api/ide/opencode/test/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/opencode/test/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/logs/route/build-manifest.json +1 -3
- package/.next/server/app/api/logs/route.js +4 -4
- package/.next/server/app/api/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/logs/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/models/route/build-manifest.json +1 -3
- package/.next/server/app/api/models/route.js +5 -5
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/providers/route/build-manifest.json +1 -3
- package/.next/server/app/api/providers/route.js +5 -5
- package/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/.next/server/app/api/providers/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/providers/test/route/build-manifest.json +1 -3
- package/.next/server/app/api/providers/test/route.js +5 -5
- package/.next/server/app/api/providers/test/route.js.nft.json +1 -1
- package/.next/server/app/api/providers/test/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/service/force-stop/route/build-manifest.json +1 -3
- package/.next/server/app/api/service/force-stop/route.js +4 -4
- package/.next/server/app/api/service/force-stop/route.js.nft.json +1 -1
- package/.next/server/app/api/service/force-stop/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/service/start/route/build-manifest.json +1 -3
- package/.next/server/app/api/service/start/route.js +4 -4
- package/.next/server/app/api/service/start/route.js.nft.json +1 -1
- package/.next/server/app/api/service/start/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/service/status/route/build-manifest.json +1 -3
- package/.next/server/app/api/service/status/route.js +4 -4
- package/.next/server/app/api/service/status/route.js.nft.json +1 -1
- package/.next/server/app/api/service/status/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/service/stop/route/build-manifest.json +1 -3
- package/.next/server/app/api/service/stop/route.js +4 -4
- package/.next/server/app/api/service/stop/route.js.nft.json +1 -1
- package/.next/server/app/api/service/stop/route_client-reference-manifest.js +2 -1
- package/.next/server/app/api/tokenizer/history/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tokenizer/history/route/build-manifest.json +9 -0
- package/.next/server/app/api/tokenizer/history/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tokenizer/history/route.js +7 -0
- package/.next/server/app/api/tokenizer/history/route.js.map +5 -0
- package/.next/server/app/api/tokenizer/history/route.js.nft.json +1 -0
- package/.next/server/app/api/tokenizer/history/route_client-reference-manifest.js +3 -0
- package/.next/server/app/api/tokenizer/test/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/tokenizer/test/route/build-manifest.json +9 -0
- package/.next/server/app/api/tokenizer/test/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/tokenizer/test/route.js +8 -0
- package/.next/server/app/api/tokenizer/test/route.js.map +5 -0
- package/.next/server/app/api/tokenizer/test/route.js.nft.json +1 -0
- package/.next/server/app/api/tokenizer/test/route_client-reference-manifest.js +3 -0
- package/.next/server/app/ide/page/build-manifest.json +5 -5
- package/.next/server/app/ide/page.js +12 -14
- package/.next/server/app/ide/page.js.nft.json +1 -1
- package/.next/server/app/ide/page_client-reference-manifest.js +2 -1
- package/.next/server/app/ide.html +1 -1
- package/.next/server/app/ide.rsc +15 -13
- package/.next/server/app/ide.segments/_full.segment.rsc +15 -13
- package/.next/server/app/ide.segments/_head.segment.rsc +3 -3
- package/.next/server/app/ide.segments/_index.segment.rsc +5 -5
- package/.next/server/app/ide.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/ide.segments/ide/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/ide.segments/ide.segment.rsc +4 -3
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +11 -11
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/index.segments/_full.segment.rsc +11 -11
- package/.next/server/app/index.segments/_head.segment.rsc +3 -3
- package/.next/server/app/index.segments/_index.segment.rsc +5 -5
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs/page/build-manifest.json +5 -5
- package/.next/server/app/logs/page.js +12 -14
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +2 -1
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +15 -13
- package/.next/server/app/logs.segments/_full.segment.rsc +15 -13
- package/.next/server/app/logs.segments/_head.segment.rsc +3 -3
- package/.next/server/app/logs.segments/_index.segment.rsc +5 -5
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/logs.segments/logs.segment.rsc +4 -3
- package/.next/server/app/models/page/build-manifest.json +5 -5
- package/.next/server/app/models/page.js +12 -14
- package/.next/server/app/models/page.js.nft.json +1 -1
- package/.next/server/app/models/page_client-reference-manifest.js +2 -1
- package/.next/server/app/models.html +1 -1
- package/.next/server/app/models.rsc +15 -13
- package/.next/server/app/models.segments/_full.segment.rsc +15 -13
- package/.next/server/app/models.segments/_head.segment.rsc +3 -3
- package/.next/server/app/models.segments/_index.segment.rsc +5 -5
- package/.next/server/app/models.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/models.segments/models/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/models.segments/models.segment.rsc +4 -3
- package/.next/server/app/page/build-manifest.json +5 -5
- package/.next/server/app/page.js +12 -14
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +2 -1
- package/.next/server/app/providers/page/build-manifest.json +5 -5
- package/.next/server/app/providers/page.js +12 -14
- package/.next/server/app/providers/page.js.nft.json +1 -1
- package/.next/server/app/providers/page_client-reference-manifest.js +2 -1
- package/.next/server/app/providers.html +1 -1
- package/.next/server/app/providers.rsc +15 -13
- package/.next/server/app/providers.segments/_full.segment.rsc +15 -13
- package/.next/server/app/providers.segments/_head.segment.rsc +3 -3
- package/.next/server/app/providers.segments/_index.segment.rsc +5 -5
- package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +4 -4
- package/.next/server/app/providers.segments/providers.segment.rsc +4 -3
- package/.next/server/app/tokenizer/page/app-paths-manifest.json +3 -0
- package/.next/server/app/tokenizer/page/build-manifest.json +16 -0
- package/.next/server/app/tokenizer/page/next-font-manifest.json +6 -0
- package/.next/server/app/tokenizer/page/react-loadable-manifest.json +1 -0
- package/.next/server/app/tokenizer/page/server-reference-manifest.json +4 -0
- package/.next/server/app/tokenizer/page.js +13 -0
- package/.next/server/app/tokenizer/page.js.map +5 -0
- package/.next/server/app/tokenizer/page.js.nft.json +1 -0
- package/.next/server/app/tokenizer/page_client-reference-manifest.js +3 -0
- package/.next/server/app/tokenizer.html +1 -0
- package/.next/server/app/tokenizer.meta +15 -0
- package/.next/server/app/tokenizer.rsc +20 -0
- package/.next/server/app/tokenizer.segments/_full.segment.rsc +20 -0
- package/.next/server/app/tokenizer.segments/_head.segment.rsc +5 -0
- package/.next/server/app/tokenizer.segments/_index.segment.rsc +6 -0
- package/.next/server/app/tokenizer.segments/_tree.segment.rsc +2 -0
- package/.next/server/app/tokenizer.segments/tokenizer/__PAGE__.segment.rsc +9 -0
- package/.next/server/app/tokenizer.segments/tokenizer.segment.rsc +5 -0
- package/.next/server/app-paths-manifest.json +4 -1
- package/.next/server/chunks/0zjb_server_app_api_ide_openclaw_available-models_route_actions_0.gjr6a.js +3 -0
- package/.next/server/chunks/0zjb_server_app_api_ide_opencode_available-models_route_actions_0poyhyk.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-_5z3v._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0-_5z3v._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__012ucp~._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__012ucp~._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__01atdgx._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__01atdgx._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__01~ft76._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__01~ft76._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__04sfkei._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__04sfkei._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__065r.wp._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__065r.wp._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__07pm7px._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__07pm7px._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__07vosna._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__07vosna._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__083j1v0._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__083j1v0._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08_ekvs._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08_ekvs._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08ftz8n._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08ftz8n._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__08oq8ma._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__08oq8ma._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__099b1my._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__099b1my._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0aw-~h8._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0aw-~h8._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0dj43ut._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0dj43ut._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0efv_yh._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0efv_yh._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0el37wu._.js +7 -0
- package/.next/server/chunks/[root-of-the-server]__0el37wu._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0g.1w-q._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0g.1w-q._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0im~-m7._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0im~-m7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0jf1q27._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0jf1q27._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0kldv62._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0kldv62._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0lr16iw._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0lr16iw._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0m62mql._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0m62mql._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0qp1t_m._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0qp1t_m._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0qz-m.u._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0qz-m.u._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0r235yd._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0r235yd._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0rjkw2y._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0rjkw2y._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0uaqs.r._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0uaqs.r._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0vktxod._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vktxod._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0vlh9um._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0vlh9um._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__c1b4b601._.js → [root-of-the-server]__0xb5i_t._.js} +21 -9
- package/.next/server/chunks/[root-of-the-server]__0xb5i_t._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0xsal5d._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0xsal5d._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0yo.c6n._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__0yo.c6n._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__0yz0y4l._.js +13 -0
- package/.next/server/chunks/[root-of-the-server]__0yz0y4l._.js.map +1 -0
- package/.next/server/chunks/{[root-of-the-server]__e7623a6c._.js → [root-of-the-server]__11srlmi._.js} +2 -2
- package/.next/server/chunks/{[root-of-the-server]__e7623a6c._.js.map → [root-of-the-server]__11srlmi._.js.map} +1 -1
- package/.next/server/chunks/[root-of-the-server]__12d44rt._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__12d44rt._.js.map +1 -0
- package/.next/server/chunks/[turbopack]_runtime.js +168 -60
- package/.next/server/chunks/[turbopack]_runtime.js.map +6 -5
- package/.next/server/chunks/_0v0oe6c._.js +3 -0
- package/.next/server/chunks/{_b48847f5._.js.map → _0v0oe6c._.js.map} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_config_route_actions_308a9f33.js → _next-internal_server_app_api_config_route_actions_08dm.dx.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_gateway_[___path]_route_actions_835b2379.js → _next-internal_server_app_api_gateway_[___path]_route_actions_0mmqyo7.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_gateway_models_route_actions_302c9983.js → _next-internal_server_app_api_gateway_models_route_actions_08b214z.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_gateway_route_actions_e5e7405d.js → _next-internal_server_app_api_gateway_route_actions_0.jzdw1.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_apply_route_actions_5056516c.js → _next-internal_server_app_api_ide_claude_apply_route_actions_0dw2_pf.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_available-models_route_actions_94d710a0.js → _next-internal_server_app_api_ide_claude_available-models_route_actions_0pmwy75.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_restore_route_actions_f37acc94.js → _next-internal_server_app_api_ide_claude_restore_route_actions_11x77hl.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_save_route_actions_407c55f5.js → _next-internal_server_app_api_ide_claude_save_route_actions_0b35ro_.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_status_route_actions_5ac73db8.js → _next-internal_server_app_api_ide_claude_status_route_actions_0fnw-w7.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_test_route_actions_70587902.js → _next-internal_server_app_api_ide_claude_test_route_actions_0jc1czy.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js → _next-internal_server_app_api_ide_openclaw_apply_route_actions_07re971.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js → _next-internal_server_app_api_ide_openclaw_preview_route_actions_0q53p05.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js → _next-internal_server_app_api_ide_openclaw_restore_route_actions_02yog9-.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js → _next-internal_server_app_api_ide_openclaw_save_route_actions_00tjxsz.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js → _next-internal_server_app_api_ide_openclaw_status_route_actions_10wsun4.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js → _next-internal_server_app_api_ide_openclaw_test_route_actions_0zgwyon.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js → _next-internal_server_app_api_ide_opencode_apply_route_actions_0in-w.g.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js → _next-internal_server_app_api_ide_opencode_preview_route_actions_06h6.w~.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js → _next-internal_server_app_api_ide_opencode_restore_route_actions_09ipt-l.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js → _next-internal_server_app_api_ide_opencode_save_route_actions_0i-~x79.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js → _next-internal_server_app_api_ide_opencode_status_route_actions_0cpf6rv.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js → _next-internal_server_app_api_ide_opencode_test_route_actions_0y8aq8h.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_logs_route_actions_30a87f47.js → _next-internal_server_app_api_logs_route_actions_08ef2j7.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_models_route_actions_b6abdc83.js → _next-internal_server_app_api_models_route_actions_0vfccm4.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_providers_route_actions_5388b373.js → _next-internal_server_app_api_providers_route_actions_0ee1p_m.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_providers_test_route_actions_b97ab15a.js → _next-internal_server_app_api_providers_test_route_actions_0vyo652.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_service_force-stop_route_actions_95eba80b.js → _next-internal_server_app_api_service_force-stop_route_actions_0pu9xrq.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_service_start_route_actions_d50efb77.js → _next-internal_server_app_api_service_start_route_actions_0_o53a2.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_service_status_route_actions_30149042.js → _next-internal_server_app_api_service_status_route_actions_08ag8v4.js} +1 -1
- package/.next/server/chunks/{_next-internal_server_app_api_service_stop_route_actions_19443941.js → _next-internal_server_app_api_service_stop_route_actions_04dp83p.js} +1 -1
- package/.next/server/chunks/_next-internal_server_app_api_tokenizer_history_route_actions_09~nqtd.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_tokenizer_test_route_actions_0t2swp-.js +3 -0
- package/.next/server/chunks/{node_modules_next_dist_esm_build_templates_app-route_4be65264.js → node_modules_next_dist_esm_build_templates_app-route_0d1n5~u.js} +6 -6
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0d1n5~u.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0.zquoa._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0.zquoa._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__01dqyhh._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__01dqyhh._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__04qwc64._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__04qwc64._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__06r_ug4._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__06r_ug4._.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__f92001a5._.js → [root-of-the-server]__0814l01._.js} +2 -2
- package/.next/server/chunks/ssr/[root-of-the-server]__0814l01._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0gb1hlj._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0gb1hlj._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0p8tmu2._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0p8tmu2._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0rf3.7n._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0rf3.7n._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0~6rwng._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__0~6rwng._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js +33 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__10xgshr._.js.map +1 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__11i~7lq._.js +3 -0
- package/.next/server/chunks/ssr/[root-of-the-server]__11i~7lq._.js.map +1 -0
- package/.next/server/chunks/ssr/[turbopack]_runtime.js +168 -60
- package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +6 -5
- package/.next/server/chunks/ssr/_0k83omg._.js +6 -0
- package/.next/server/chunks/ssr/_0k83omg._.js.map +1 -0
- package/.next/server/chunks/ssr/_0yyi5po._.js +3 -0
- package/.next/server/chunks/ssr/_0yyi5po._.js.map +1 -0
- package/.next/server/chunks/ssr/{_next-internal_server_app__global-error_page_actions_75761787.js → _next-internal_server_app__global-error_page_actions_0k77kol.js} +1 -1
- package/.next/server/chunks/ssr/{_next-internal_server_app__not-found_page_actions_554ec2bf.js → _next-internal_server_app__not-found_page_actions_0eq97pa.js} +1 -1
- package/.next/server/chunks/ssr/{_next-internal_server_app_ide_page_actions_d521d6ae.js → _next-internal_server_app_ide_page_actions_0_opd4~.js} +1 -1
- package/.next/server/chunks/ssr/{_next-internal_server_app_logs_page_actions_a1c69041.js → _next-internal_server_app_logs_page_actions_0rvsl~d.js} +1 -1
- package/.next/server/chunks/ssr/{_next-internal_server_app_models_page_actions_543cf22f.js → _next-internal_server_app_models_page_actions_0eiz7f7.js} +1 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js.map +1 -0
- package/.next/server/chunks/ssr/{_next-internal_server_app_providers_page_actions_c75f6cb3.js → _next-internal_server_app_providers_page_actions_0ya36nw.js} +1 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_providers_page_actions_0ya36nw.js.map +1 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_tokenizer_page_actions_0imc_ya.js +3 -0
- package/.next/server/chunks/ssr/_next-internal_server_app_tokenizer_page_actions_0imc_ya.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
- package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_06hehg4._.js +19 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_06hehg4._.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js +6 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_0e1izl_._.js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js → node_modules_next_dist_client_components_0inhx6q._.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_45780354.js → node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js} +2 -2
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_global-error_ece394eb.js → node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js} +2 -2
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
- package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_15817684.js → node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js} +2 -2
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_05u.ff5.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_05u.ff5.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06a5k-w.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_06a5k-w.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_rrdx6.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0_rrdx6.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a7b~p7.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0a7b~p7.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bj8dkg.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bj8dkg.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0cvrgh7.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0cvrgh7.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nkcfme.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0nkcfme.js.map +1 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +4 -0
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_components_ConfirmDialog_tsx_0mm3plr._.js +3 -0
- package/.next/server/chunks/ssr/src_app_components_ConfirmDialog_tsx_0mm3plr._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_ide_page_tsx_0no40dj._.js +3 -0
- package/.next/server/chunks/ssr/{src_app_ide_page_tsx_8962793b._.js.map → src_app_ide_page_tsx_0no40dj._.js.map} +1 -1
- package/.next/server/chunks/ssr/src_app_logs_page_tsx_0l8mmxe._.js +3 -0
- package/.next/server/chunks/ssr/{src_app_logs_page_tsx_7b7b7b83._.js.map → src_app_logs_page_tsx_0l8mmxe._.js.map} +1 -1
- package/.next/server/chunks/ssr/src_app_models_page_tsx_10vsbc1._.js +3 -0
- package/.next/server/chunks/ssr/{src_app_models_page_tsx_ed71d32e._.js.map → src_app_models_page_tsx_10vsbc1._.js.map} +1 -1
- package/.next/server/chunks/ssr/src_app_page_tsx_0ss2.w7._.js +3 -0
- package/.next/server/chunks/ssr/src_app_page_tsx_0ss2.w7._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_providers_page_tsx_10ipz~8._.js +3 -0
- package/.next/server/chunks/ssr/{src_app_providers_page_tsx_eb8b5137._.js.map → src_app_providers_page_tsx_10ipz~8._.js.map} +1 -1
- package/.next/server/chunks/ssr/src_app_tokenizer_page_tsx_0eqhpbs._.js +3 -0
- package/.next/server/chunks/ssr/src_app_tokenizer_page_tsx_0eqhpbs._.js.map +1 -0
- package/.next/server/functions-config-manifest.json +3 -1
- package/.next/server/middleware-build-manifest.js +10 -10
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -2
- package/.next/server/prefetch-hints.json +1 -0
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/XHnu7Z1vWSrgmneps8rX4/_clientMiddlewareManifest.js +1 -0
- package/.next/static/chunks/01xlw8hd842-c.js +1 -0
- package/.next/static/chunks/0bzupvr5gt3k9.js +31 -0
- package/.next/static/chunks/0d3shmwh5_nmn.js +1 -0
- package/.next/static/chunks/0h7-_zr5_nt.5.js +1 -0
- package/.next/static/chunks/0mjx90nkvhsot.js +1 -0
- package/.next/static/chunks/0ntp1qkrtsgn0.js +1 -0
- package/.next/static/chunks/0tc5l6c1zalyc.css +1 -0
- package/.next/static/chunks/0v7.1nc4jyaet.js +1 -0
- package/.next/static/chunks/0vlwn301rv7dw.js +1 -0
- package/.next/static/chunks/0y3~cortx~or~.js +5 -0
- package/.next/static/chunks/0~c9fm3-3-f41.js +1 -0
- package/.next/static/chunks/11-7_fybhp2~y.js +1 -0
- package/.next/static/chunks/121-ofr4.6_5t.js +1 -0
- package/.next/static/chunks/16g.ca89g7fib.js +1 -0
- package/.next/static/chunks/turbopack-0griofc2i3wvs.js +1 -0
- package/.next/types/routes.d.ts +5 -2
- package/.next/types/validator.ts +27 -0
- package/CHANGELOG.md +15 -0
- package/README.md +6 -0
- package/dist/.next/dev/types/validator.js +12 -0
- package/dist/.next/types/validator.js +12 -0
- package/dist/package.json +3 -2
- package/dist/src/app/api/tokenizer/history/route.js +60 -0
- package/dist/src/app/api/tokenizer/test/route.js +97 -0
- package/dist/src/app/components/Nav.js +2 -1
- package/dist/src/app/tokenizer/page.js +318 -0
- package/dist/src/cli/index.js +3 -3
- package/dist/src/db/database.js +19 -21
- package/dist/src/db/queries.js +21 -0
- package/dist/src/server/tokenizer.js +215 -0
- package/package.json +3 -2
- package/src/app/api/tokenizer/history/route.ts +63 -0
- package/src/app/api/tokenizer/test/route.ts +151 -0
- package/src/app/components/Nav.tsx +2 -2
- package/src/app/tokenizer/page.tsx +813 -0
- package/src/cli/index.ts +4 -4
- package/src/db/database.ts +18 -25
- package/src/db/queries.ts +22 -0
- package/src/server/tokenizer.ts +285 -0
- package/.next/build/chunks/[root-of-the-server]__44695d76._.js.map +0 -11
- package/.next/build/chunks/[root-of-the-server]__6d51cb5d._.js.map +0 -8
- package/.next/server/chunks/[root-of-the-server]__001d5756._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__001d5756._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__05f8578b._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__05f8578b._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1480f018._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1480f018._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1909f3aa._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1909f3aa._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__1d4b7fc5._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__1d4b7fc5._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__33fec899._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__33fec899._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__372ef2bf._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__372ef2bf._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__3a204d25._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__3a204d25._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__3aaf963c._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__3aaf963c._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__43810962._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__43810962._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__59aacd30._.js +0 -21
- package/.next/server/chunks/[root-of-the-server]__59aacd30._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__64356cb2._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__64356cb2._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__6ce199d2._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__6ce199d2._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__760eaa16._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__760eaa16._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__772134c6._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__772134c6._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__7b77f523._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7b77f523._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__7c298a19._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__7c298a19._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__85540228._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__85540228._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__97622908._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__97622908._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a02e6618._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__a02e6618._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__a719d045._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__a719d045._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__af5b556a._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__af5b556a._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__cafe113e._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__cafe113e._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__ccfc7f1d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__ccfc7f1d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js.map +0 -1
- package/.next/server/chunks/[root-of-the-server]__f8949f88._.js +0 -3
- package/.next/server/chunks/[root-of-the-server]__f8949f88._.js.map +0 -1
- package/.next/server/chunks/_b48847f5._.js +0 -3
- package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js +0 -3
- package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js +0 -3
- package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_4be65264.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__083d944d._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__083d944d._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__15600e29._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__15600e29._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__1836f866._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__1836f866._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__256a03fe._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__256a03fe._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__31fde618._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__31fde618._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__523c120c._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__523c120c._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__70a81394._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__70a81394._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__81937253._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__81937253._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__976ad963._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__976ad963._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__af2ad6aa._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__af2ad6aa._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__b9356576._.js +0 -4
- package/.next/server/chunks/ssr/[root-of-the-server]__b9356576._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__ccb6a4da._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__ccb6a4da._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__cfa2d991._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__cfa2d991._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__f437da88._.js +0 -3
- package/.next/server/chunks/ssr/[root-of-the-server]__f437da88._.js.map +0 -1
- package/.next/server/chunks/ssr/[root-of-the-server]__f92001a5._.js.map +0 -1
- package/.next/server/chunks/ssr/_06262cbd._.js +0 -4
- package/.next/server/chunks/ssr/_06262cbd._.js.map +0 -1
- package/.next/server/chunks/ssr/_0cd72da5._.js +0 -4
- package/.next/server/chunks/ssr/_0cd72da5._.js.map +0 -1
- package/.next/server/chunks/ssr/_4828a6d2._.js +0 -4
- package/.next/server/chunks/ssr/_4828a6d2._.js.map +0 -1
- package/.next/server/chunks/ssr/_69468f4c._.js +0 -3
- package/.next/server/chunks/ssr/_69468f4c._.js.map +0 -1
- package/.next/server/chunks/ssr/_93850476._.js +0 -6
- package/.next/server/chunks/ssr/_93850476._.js.map +0 -1
- package/.next/server/chunks/ssr/_c1309523._.js +0 -4
- package/.next/server/chunks/ssr/_c1309523._.js.map +0 -1
- package/.next/server/chunks/ssr/_f7d273e3._.js +0 -4
- package/.next/server/chunks/ssr/_f7d273e3._.js.map +0 -1
- package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_39d4fc33.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_08570d7f._.js +0 -4
- package/.next/server/chunks/ssr/node_modules_next_dist_08570d7f._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_174ae28d._.js +0 -10
- package/.next/server/chunks/ssr/node_modules_next_dist_174ae28d._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_27457240._.js +0 -6
- package/.next/server/chunks/ssr/node_modules_next_dist_27457240._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_4b63a0e1._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_4b63a0e1._.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_ece394eb.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_65a7265e.js +0 -4
- package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_65a7265e.js.map +0 -1
- package/.next/server/chunks/ssr/node_modules_next_dist_f9713a08._.js +0 -3
- package/.next/server/chunks/ssr/node_modules_next_dist_f9713a08._.js.map +0 -1
- package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js +0 -3
- package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js +0 -3
- package/.next/server/chunks/ssr/src_app_models_page_tsx_ed71d32e._.js +0 -3
- package/.next/server/chunks/ssr/src_app_providers_page_tsx_eb8b5137._.js +0 -3
- package/.next/static/cf2SWIkI5HVbnDjLExI42/_clientMiddlewareManifest.json +0 -1
- package/.next/static/chunks/5663c8696095f277.js +0 -1
- package/.next/static/chunks/64f547b3bcd3aef4.js +0 -1
- package/.next/static/chunks/6992685fe009e8fd.css +0 -1
- package/.next/static/chunks/6e0dee5b6681763c.js +0 -1
- package/.next/static/chunks/6f7efe5271343778.js +0 -1
- package/.next/static/chunks/75f76753fd97c8fd.js +0 -1
- package/.next/static/chunks/7c8b7cbb3339f139.js +0 -1
- package/.next/static/chunks/8ccc14e022ff6de3.js +0 -1
- package/.next/static/chunks/8cf1e5f00ebaea52.js +0 -1
- package/.next/static/chunks/a6dad97d9634a72d.js.map +0 -1
- package/.next/static/chunks/a7f539bf6487f4ff.js +0 -5
- package/.next/static/chunks/a89fdf03c5b0dfbd.js +0 -1
- package/.next/static/chunks/d2be314c3ece3fbe.js +0 -1
- package/.next/static/chunks/f2f58a7e93290fbb.js +0 -1
- package/.next/static/chunks/ff1a16fafef87110.js +0 -1
- package/.next/static/chunks/turbopack-fdb839c72e10c2ea.js +0 -4
- /package/.next/build/chunks/{[turbopack-node]_transforms_postcss_ts_df7a5b11._.js.map → [turbopack-node]_transforms_postcss_ts_0nnejqq._.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_config_route_actions_308a9f33.js.map → 0zjb_server_app_api_ide_openclaw_available-models_route_actions_0.gjr6a.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_gateway_[___path]_route_actions_835b2379.js.map → 0zjb_server_app_api_ide_opencode_available-models_route_actions_0poyhyk.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_gateway_models_route_actions_302c9983.js.map → _next-internal_server_app_api_config_route_actions_08dm.dx.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_gateway_route_actions_e5e7405d.js.map → _next-internal_server_app_api_gateway_[___path]_route_actions_0mmqyo7.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_apply_route_actions_5056516c.js.map → _next-internal_server_app_api_gateway_models_route_actions_08b214z.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_available-models_route_actions_94d710a0.js.map → _next-internal_server_app_api_gateway_route_actions_0.jzdw1.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_restore_route_actions_f37acc94.js.map → _next-internal_server_app_api_ide_claude_apply_route_actions_0dw2_pf.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_save_route_actions_407c55f5.js.map → _next-internal_server_app_api_ide_claude_available-models_route_actions_0pmwy75.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_status_route_actions_5ac73db8.js.map → _next-internal_server_app_api_ide_claude_restore_route_actions_11x77hl.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_claude_test_route_actions_70587902.js.map → _next-internal_server_app_api_ide_claude_save_route_actions_0b35ro_.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js.map → _next-internal_server_app_api_ide_claude_status_route_actions_0fnw-w7.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js.map → _next-internal_server_app_api_ide_claude_test_route_actions_0jc1czy.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js.map → _next-internal_server_app_api_ide_openclaw_apply_route_actions_07re971.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js.map → _next-internal_server_app_api_ide_openclaw_preview_route_actions_0q53p05.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js.map → _next-internal_server_app_api_ide_openclaw_restore_route_actions_02yog9-.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js.map → _next-internal_server_app_api_ide_openclaw_save_route_actions_00tjxsz.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js.map → _next-internal_server_app_api_ide_openclaw_status_route_actions_10wsun4.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js.map → _next-internal_server_app_api_ide_openclaw_test_route_actions_0zgwyon.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js.map → _next-internal_server_app_api_ide_opencode_apply_route_actions_0in-w.g.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js.map → _next-internal_server_app_api_ide_opencode_preview_route_actions_06h6.w~.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js.map → _next-internal_server_app_api_ide_opencode_restore_route_actions_09ipt-l.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js.map → _next-internal_server_app_api_ide_opencode_save_route_actions_0i-~x79.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_logs_route_actions_30a87f47.js.map → _next-internal_server_app_api_ide_opencode_status_route_actions_0cpf6rv.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_models_route_actions_b6abdc83.js.map → _next-internal_server_app_api_ide_opencode_test_route_actions_0y8aq8h.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_providers_route_actions_5388b373.js.map → _next-internal_server_app_api_logs_route_actions_08ef2j7.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_providers_test_route_actions_b97ab15a.js.map → _next-internal_server_app_api_models_route_actions_0vfccm4.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_service_force-stop_route_actions_95eba80b.js.map → _next-internal_server_app_api_providers_route_actions_0ee1p_m.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_service_start_route_actions_d50efb77.js.map → _next-internal_server_app_api_providers_test_route_actions_0vyo652.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_service_status_route_actions_30149042.js.map → _next-internal_server_app_api_service_force-stop_route_actions_0pu9xrq.js.map} +0 -0
- /package/.next/server/chunks/{_next-internal_server_app_api_service_stop_route_actions_19443941.js.map → _next-internal_server_app_api_service_start_route_actions_0_o53a2.js.map} +0 -0
- /package/.next/server/chunks/{ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js.map → _next-internal_server_app_api_service_status_route_actions_08ag8v4.js.map} +0 -0
- /package/.next/server/chunks/{ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js.map → _next-internal_server_app_api_service_stop_route_actions_04dp83p.js.map} +0 -0
- /package/.next/server/chunks/{ssr/_next-internal_server_app__global-error_page_actions_75761787.js.map → _next-internal_server_app_api_tokenizer_history_route_actions_09~nqtd.js.map} +0 -0
- /package/.next/server/chunks/{ssr/_next-internal_server_app__not-found_page_actions_554ec2bf.js.map → _next-internal_server_app_api_tokenizer_test_route_actions_0t2swp-.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_ide_page_actions_d521d6ae.js.map → _next-internal_server_app__global-error_page_actions_0k77kol.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_logs_page_actions_a1c69041.js.map → _next-internal_server_app__not-found_page_actions_0eq97pa.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_models_page_actions_543cf22f.js.map → _next-internal_server_app_ide_page_actions_0_opd4~.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_page_actions_39d4fc33.js.map → _next-internal_server_app_logs_page_actions_0rvsl~d.js.map} +0 -0
- /package/.next/server/chunks/ssr/{_next-internal_server_app_providers_page_actions_c75f6cb3.js.map → _next-internal_server_app_models_page_actions_0eiz7f7.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_9774470f._.js.map → node_modules_next_dist_client_components_0inhx6q._.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_forbidden_45780354.js.map → node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js.map} +0 -0
- /package/.next/server/chunks/ssr/{node_modules_next_dist_client_components_builtin_unauthorized_15817684.js.map → node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map} +0 -0
- /package/.next/static/{cf2SWIkI5HVbnDjLExI42 → XHnu7Z1vWSrgmneps8rX4}/_buildManifest.js +0 -0
- /package/.next/static/{cf2SWIkI5HVbnDjLExI42 → XHnu7Z1vWSrgmneps8rX4}/_ssgManifest.js +0 -0
- /package/.next/static/chunks/{a6dad97d9634a72d.js → 03~yq9q893hmn.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/app/ide/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef, useMemo } from 'react';\nimport Nav from '../components/Nav';\nimport { useToast } from '../components/ToastProvider';\n\ninterface Model {\n id: number;\n name: string;\n model_id: string;\n}\n\ninterface ConfigStatus {\n applied: boolean;\n modelMapping: {\n haiku?: string;\n sonnet?: string;\n opus?: string;\n default?: string;\n reasoning?: string;\n };\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string; // 路由提供者标识,'aar' 表示配置来自当前工具\n tempMapping?: {\n haiku?: string;\n sonnet?: string;\n opus?: string;\n default?: string;\n reasoning?: string;\n };\n config?: Record<string, unknown>; // 当前配置文件完整内容,非 AAR 时用于展示\n /** 当前网关地址(来自数据库),用于预览 */\n currentGatewayAddress?: string;\n /** 当前网关 API Key(来自数据库,未脱敏),用于预览 */\n currentGatewayApiKey?: string;\n}\n\ninterface OpenCodeStatus {\n applied: boolean;\n defaultModel?: string;\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string | null;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string;\n tempDefaultModel?: string;\n providerName?: string;\n modelsCount?: number;\n /** 当前磁盘上 opencode.json 的完整内容,用于「生效中」展示 */\n config?: Record<string, unknown> | null;\n}\n\ninterface OpenClawStatus {\n applied: boolean;\n defaultModel?: string;\n defaultFallbacks?: string[];\n imageModel?: string;\n imageFallbacks?: string[];\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string | null;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string;\n tempDefaultModel?: string;\n tempDefaultFallbacks?: string[];\n tempImageModel?: string;\n tempImageFallbacks?: string[];\n providerName?: string;\n modelsCount?: number;\n /** 当前磁盘上 openclaw.json 的完整内容,用于「生效中」展示 */\n config?: Record<string, unknown> | null;\n}\n\ninterface ModelMappingInput {\n key: string;\n label: string;\n envKey: string;\n description: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nexport default function IDEConfigPage() {\n const [activeTab, setActiveTab] = useState('claude');\n const [haikuModel, setHaikuModel] = useState('GLM-4.5-air');\n const [sonnetModel, setSonnetModel] = useState('MiniMax-M2.1');\n const [opusModel, setOpusModel] = useState('GLM-4.7');\n const [defaultModel, setDefaultModel] = useState('GLM-4.7');\n const [reasoningModel, setReasoningModel] = useState('GLM-4.7');\n const [enabled, setEnabled] = useState(false);\n const [showPreview, setShowPreview] = useState(false);\n const [claudeConfigSubTab, setClaudeConfigSubTab] = useState<'current' | 'preview'>('preview');\n const [applying, setApplying] = useState(false);\n const [restoring, setRestoring] = useState(false);\n const [testing, setTesting] = useState(false);\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<ConfigStatus | null>(null);\n const [models, setModels] = useState<Record<string, Model[]>>({});\n const [loading, setLoading] = useState(true);\n const [testResult, setTestResult] = useState<null | any>(null);\n \n // OpenCode\n const [opencodeDefaultModel, setOpencodeDefaultModel] = useState('GLM-4.7');\n const [opencodeStatus, setOpencodeStatus] = useState<OpenCodeStatus | null>(null);\n const [opencodeApplying, setOpencodeApplying] = useState(false);\n const [opencodeRestoring, setOpencodeRestoring] = useState(false);\n const [opencodeTesting, setOpencodeTesting] = useState(false);\n const [opencodeSaving, setOpencodeSaving] = useState(false);\n const [opencodeTestResult, setOpencodeTestResult] = useState<null | any>(null);\n const [opencodeModels, setOpencodeModels] = useState<Record<string, Model[]>>({});\n const [opencodePreviewConfig, setOpencodePreviewConfig] = useState<Record<string, unknown> | null>(null);\n const [opencodePreviewText, setOpencodePreviewText] = useState<string>('');\n const [opencodePreviewLoading, setOpencodePreviewLoading] = useState(false);\n const [opencodeConfigSubTab, setOpencodeConfigSubTab] = useState<'current' | 'preview'>('current');\n\n // OpenClaw\n const [openclawDefaultModel, setOpenclawDefaultModel] = useState('GLM-4.7');\n const [openclawDefaultFallbacks, setOpenclawDefaultFallbacks] = useState<string[]>([]);\n const [openclawImageModel, setOpenclawImageModel] = useState('');\n const [openclawImageFallbacks, setOpenclawImageFallbacks] = useState<string[]>([]);\n const [openclawStatus, setOpenclawStatus] = useState<OpenClawStatus | null>(null);\n const [openclawApplying, setOpenclawApplying] = useState(false);\n const [openclawRestoring, setOpenclawRestoring] = useState(false);\n const [openclawTesting, setOpenclawTesting] = useState(false);\n const [openclawSaving, setOpenclawSaving] = useState(false);\n const [openclawTestResult, setOpenclawTestResult] = useState<null | any>(null);\n const [openclawModels, setOpenclawModels] = useState<Record<string, Model[]>>({});\n const [openclawPreviewConfig, setOpenclawPreviewConfig] = useState<Record<string, unknown> | null>(null);\n const [openclawPreviewText, setOpenclawPreviewText] = useState<string>('');\n const [openclawPreviewLoading, setOpenclawPreviewLoading] = useState(false);\n const [openClawDropdown, setOpenClawDropdown] = useState<'default' | 'defaultFallbacks' | 'image' | 'imageFallbacks' | null>(null);\n const [openClawSearch, setOpenClawSearch] = useState('');\n const [openclawConfigSubTab, setOpenclawConfigSubTab] = useState<'current' | 'preview'>('preview');\n const openClawDropdownRef = useRef<HTMLDivElement | null>(null);\n\n const { showToast } = useToast();\n\n const openclawModelsFlat = useMemo(() =>\n Object.entries(openclawModels).flatMap(([provider, arr]) =>\n arr.map((m) => ({ ...m, provider } as Model & { provider: string }))\n ),\n [openclawModels]\n );\n const openclawModelsFiltered = useMemo(() => {\n const q = openClawSearch.trim().toLowerCase();\n if (!q) return openclawModelsFlat;\n return openclawModelsFlat.filter(\n (m) =>\n m.name.toLowerCase().includes(q) || m.model_id.toLowerCase().includes(q)\n );\n }, [openclawModelsFlat, openClawSearch]);\n\n // Abort controller for cancelling test\n const abortControllerRef = useRef<AbortController | null>(null);\n const opencodeAbortRef = useRef<AbortController | null>(null);\n const openclawAbortRef = useRef<AbortController | null>(null);\n\n const loadStatus = async () => {\n try {\n const res = await fetch('/api/ide/claude/status');\n const data: ConfigStatus = await res.json();\n setStatus(data);\n // 优先使用临时配置(如果存在),否则使用已应用的配置\n const mappingToUse = (data.matchCurrentGateway === false && data.tempMapping)\n ? data.tempMapping\n : data.modelMapping;\n if (mappingToUse) {\n setHaikuModel(mappingToUse.haiku || 'GLM-4.5-air');\n setSonnetModel(mappingToUse.sonnet || 'MiniMax-M2.1');\n setOpusModel(mappingToUse.opus || 'GLM-4.7');\n setDefaultModel(mappingToUse.default || 'GLM-4.7');\n setReasoningModel(mappingToUse.reasoning || 'GLM-4.7');\n }\n // 只有当配置来自当前工具(routerProvider === 'aar')时才设置为 enabled\n setEnabled(data.applied && data.routerProvider === 'aar');\n } catch (error) {\n console.error('Failed to load status:', error);\n } finally {\n setLoading(false);\n }\n };\n\n const loadModels = async () => {\n try {\n const res = await fetch('/api/ide/claude/available-models');\n const data = await res.json();\n setModels(data.models || {});\n } catch (error) {\n console.error('Failed to load models:', error);\n }\n };\n\n const loadOpenCodeStatus = async () => {\n try {\n const res = await fetch('/api/ide/opencode/status');\n const data: OpenCodeStatus = await res.json();\n setOpencodeStatus(data);\n const toUse = (data.matchCurrentGateway === false && data.tempDefaultModel)\n ? data.tempDefaultModel\n : data.defaultModel;\n if (toUse) setOpencodeDefaultModel(toUse);\n else if (data.defaultModel) setOpencodeDefaultModel(data.defaultModel);\n } catch (error) {\n console.error('Failed to load OpenCode status:', error);\n }\n };\n\n const loadOpenCodeModels = async () => {\n try {\n const res = await fetch('/api/ide/opencode/available-models');\n const data = await res.json();\n setOpencodeModels(data.models || {});\n } catch (error) {\n console.error('Failed to load OpenCode models:', error);\n }\n };\n\n const loadOpenClawStatus = async () => {\n try {\n const res = await fetch('/api/ide/openclaw/status');\n const data: OpenClawStatus = await res.json();\n setOpenclawStatus(data);\n\n // Determine which values to use (temp or applied)\n const useTemp = data.matchCurrentGateway === false && data.tempDefaultModel;\n\n if (useTemp) {\n setOpenclawDefaultModel(data.tempDefaultModel || 'GLM-4.7');\n setOpenclawDefaultFallbacks(data.tempDefaultFallbacks || []);\n setOpenclawImageModel(data.tempImageModel || '');\n setOpenclawImageFallbacks(data.tempImageFallbacks || []);\n } else {\n setOpenclawDefaultModel(data.defaultModel || 'GLM-4.7');\n setOpenclawDefaultFallbacks(data.defaultFallbacks || []);\n setOpenclawImageModel(data.imageModel || '');\n setOpenclawImageFallbacks(data.imageFallbacks || []);\n }\n } catch (error) {\n console.error('Failed to load OpenClaw status:', error);\n }\n };\n\n const loadOpenClawModels = async () => {\n try {\n const res = await fetch('/api/ide/openclaw/available-models');\n const data = await res.json();\n setOpenclawModels(data.models || {});\n } catch (error) {\n console.error('Failed to load OpenClaw models:', error);\n }\n };\n\n useEffect(() => {\n loadStatus();\n loadModels();\n loadOpenCodeStatus();\n loadOpenCodeModels();\n loadOpenClawStatus();\n loadOpenClawModels();\n }, []);\n\n // OpenCode Preview\n useEffect(() => {\n if (activeTab !== 'opencode' || !opencodeDefaultModel) {\n setOpencodePreviewConfig(null);\n setOpencodePreviewText('');\n return;\n }\n let cancelled = false;\n setOpencodePreviewLoading(true);\n setOpencodePreviewConfig(null);\n setOpencodePreviewText('');\n fetch(`/api/ide/opencode/preview?default_model=${encodeURIComponent(opencodeDefaultModel)}`)\n .then((res) => res.json())\n .then((data) => {\n if (!cancelled && data.config) {\n setOpencodePreviewConfig(data.config);\n setOpencodePreviewText(JSON.stringify(data.config, null, 2));\n }\n })\n .catch(() => {\n if (!cancelled) setOpencodePreviewConfig(null);\n if (!cancelled) setOpencodePreviewText('');\n })\n .finally(() => {\n if (!cancelled) setOpencodePreviewLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [activeTab, opencodeDefaultModel]);\n\n // OpenClaw Preview\n useEffect(() => {\n if (activeTab !== 'openclaw' || !openclawDefaultModel) {\n setOpenclawPreviewConfig(null);\n setOpenclawPreviewText('');\n return;\n }\n let cancelled = false;\n setOpenclawPreviewLoading(true);\n setOpenclawPreviewConfig(null);\n setOpenclawPreviewText('');\n\n const params = new URLSearchParams({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks.join(','),\n });\n if (openclawImageModel) {\n params.set('image_model', openclawImageModel);\n if (openclawImageFallbacks.length > 0) {\n params.set('image_fallbacks', openclawImageFallbacks.join(','));\n }\n }\n fetch(`/api/ide/openclaw/preview?${params.toString()}`)\n .then((res) => res.json())\n .then((data) => {\n if (!cancelled && data.config) {\n setOpenclawPreviewConfig(data.config);\n setOpenclawPreviewText(JSON.stringify(data.config, null, 2));\n }\n })\n .catch(() => {\n if (!cancelled) setOpenclawPreviewConfig(null);\n if (!cancelled) setOpenclawPreviewText('');\n })\n .finally(() => {\n if (!cancelled) setOpenclawPreviewLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [activeTab, openclawDefaultModel, openclawDefaultFallbacks, openclawImageModel, openclawImageFallbacks]);\n\n useEffect(() => {\n if (openClawDropdown == null) return;\n const onDocClick = (e: MouseEvent) => {\n if (openClawDropdownRef.current && !openClawDropdownRef.current.contains(e.target as Node)) {\n setOpenClawDropdown(null);\n }\n };\n document.addEventListener('mousedown', onDocClick);\n return () => document.removeEventListener('mousedown', onDocClick);\n }, [openClawDropdown]);\n\n // 同步 Claude 下拉框默认值:确保状态值在可用模型列表中\n useEffect(() => {\n const allModels = Object.values(models).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n // 如果当前状态值不在可用模型列表中,更新为第一个可用模型\n if (!modelIds.includes(haikuModel)) {\n setHaikuModel(firstModelId);\n }\n if (!modelIds.includes(sonnetModel)) {\n setSonnetModel(firstModelId);\n }\n if (!modelIds.includes(opusModel)) {\n setOpusModel(firstModelId);\n }\n if (!modelIds.includes(defaultModel)) {\n setDefaultModel(firstModelId);\n }\n if (!modelIds.includes(reasoningModel)) {\n setReasoningModel(firstModelId);\n }\n }, [models]);\n\n // 同步 OpenCode 下拉框默认值\n useEffect(() => {\n const allModels = Object.values(opencodeModels).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n if (!modelIds.includes(opencodeDefaultModel)) {\n setOpencodeDefaultModel(firstModelId);\n }\n }, [opencodeModels]);\n\n // 同步 OpenClaw 下拉框默认值\n useEffect(() => {\n const allModels = Object.values(openclawModels).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n if (!modelIds.includes(openclawDefaultModel)) {\n setOpenclawDefaultModel(firstModelId);\n }\n // 过滤无效的 fallback 模型\n const validFallbacks = openclawDefaultFallbacks.filter(id => modelIds.includes(id));\n if (validFallbacks.length !== openclawDefaultFallbacks.length) {\n setOpenclawDefaultFallbacks(validFallbacks);\n }\n // 检查 image model\n if (openclawImageModel && !modelIds.includes(openclawImageModel)) {\n setOpenclawImageModel('');\n }\n // 过滤无效的 image fallback 模型\n const validImageFallbacks = openclawImageFallbacks.filter(id => modelIds.includes(id));\n if (validImageFallbacks.length !== openclawImageFallbacks.length) {\n setOpenclawImageFallbacks(validImageFallbacks);\n }\n }, [openclawModels]);\n\n // Claude Handlers\n const handleApply = async () => {\n setApplying(true);\n try {\n const res = await fetch('/api/ide/claude/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n haiku: haikuModel,\n sonnet: sonnetModel,\n opus: opusModel,\n default: defaultModel,\n reasoning: reasoningModel,\n }),\n });\n const data = await res.json();\n\n if (data.success) {\n showToast('配置应用成功', 'success');\n await loadStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setApplying(false);\n }\n };\n\n const handleRestore = async () => {\n setRestoring(true);\n try {\n const res = await fetch('/api/ide/claude/restore', {\n method: 'POST',\n });\n const data = await res.json();\n \n if (data.success) {\n showToast('配置已还原', 'success');\n setClaudeConfigSubTab('current');\n await loadStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setRestoring(false);\n }\n };\n\n const handleTest = async () => {\n // Cancel any ongoing test\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n abortControllerRef.current = new AbortController();\n setTesting(true);\n setTestResult(null);\n try {\n const res = await fetch('/api/ide/claude/test', {\n signal: abortControllerRef.current.signal,\n });\n const data = await res.json();\n\n setTestResult(data);\n\n if (data.success) {\n showToast('配置测试通过', 'success');\n } else {\n showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n }\n } catch (error: any) {\n console.error('Failed to test config:', error);\n if (error.name === 'AbortError') {\n showToast('测试已取消', 'info');\n } else {\n showToast('测试失败: 网络错误', 'error');\n setTestResult({ error: 'Network error' });\n }\n } finally {\n if (abortControllerRef.current?.signal.aborted === false) {\n abortControllerRef.current = null;\n }\n setTesting(false);\n }\n };\n\n const handleCancelTest = () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const res = await fetch('/api/ide/claude/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n haiku: haikuModel,\n sonnet: sonnetModel,\n opus: opusModel,\n default: defaultModel,\n reasoning: reasoningModel,\n }),\n });\n const data = await res.json();\n\n if (data.success) {\n const isTemp = data.saveType === 'temp';\n showToast(isTemp ? '配置已保存(临时)' : '配置已更新到 Claude Code', 'success');\n await loadStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setSaving(false);\n }\n };\n\n // OpenCode Handlers\n const opencodeEnabled = opencodeStatus?.applied && opencodeStatus?.routerProvider === 'aar';\n\n const handleOpenCodeApply = async () => {\n setOpencodeApplying(true);\n try {\n const res = await fetch('/api/ide/opencode/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: opencodeDefaultModel,\n ...(opencodePreviewText.trim() ? { config: opencodePreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.message || 'OpenCode 配置应用成功', 'success');\n await loadOpenCodeStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply OpenCode config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setOpencodeApplying(false);\n }\n };\n\n const handleOpenCodeRestore = async () => {\n setOpencodeRestoring(true);\n try {\n const res = await fetch('/api/ide/opencode/restore', { method: 'POST' });\n const data = await res.json();\n if (data.success) {\n showToast('OpenCode 配置已还原', 'success');\n setOpencodeConfigSubTab('current');\n await loadOpenCodeStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore OpenCode config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setOpencodeRestoring(false);\n }\n };\n\n const handleOpenCodeTest = async () => {\n if (opencodeAbortRef.current) {\n opencodeAbortRef.current.abort();\n opencodeAbortRef.current = null;\n }\n opencodeAbortRef.current = new AbortController();\n setOpencodeTesting(true);\n setOpencodeTestResult(null);\n try {\n const res = await fetch('/api/ide/opencode/test', { signal: opencodeAbortRef.current.signal });\n const data = await res.json();\n setOpencodeTestResult(data);\n if (data.success) showToast('OpenCode 配置测试通过', 'success');\n else showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n } catch (err: any) {\n if (err.name === 'AbortError') showToast('测试已取消', 'info');\n else {\n showToast('测试失败: 网络错误', 'error');\n setOpencodeTestResult({ error: 'Network error' });\n }\n } finally {\n if (opencodeAbortRef.current?.signal.aborted === false) opencodeAbortRef.current = null;\n setOpencodeTesting(false);\n }\n };\n\n const handleOpenCodeSave = async () => {\n setOpencodeSaving(true);\n try {\n const res = await fetch('/api/ide/opencode/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: opencodeDefaultModel,\n ...(opencodePreviewText.trim() ? { config: opencodePreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.saveType === 'temp' ? '配置已保存(临时)' : '配置已更新到 OpenCode', 'success');\n await loadOpenCodeStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save OpenCode config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setOpencodeSaving(false);\n }\n };\n\n const handleOpenCodeCancelTest = () => {\n if (opencodeAbortRef.current) {\n opencodeAbortRef.current.abort();\n opencodeAbortRef.current = null;\n }\n };\n\n // OpenClaw Handlers\n const openclawEnabled = openclawStatus?.applied && openclawStatus?.routerProvider === 'aar';\n\n const handleOpenClawApply = async () => {\n setOpenclawApplying(true);\n try {\n const res = await fetch('/api/ide/openclaw/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks,\n image_model: openclawImageModel || undefined,\n image_fallbacks: openclawImageFallbacks,\n ...(openclawPreviewText.trim() ? { config: openclawPreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.message || 'OpenClaw 配置应用成功', 'success');\n await loadOpenClawStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply OpenClaw config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setOpenclawApplying(false);\n }\n };\n\n const handleOpenClawRestore = async () => {\n setOpenclawRestoring(true);\n try {\n const res = await fetch('/api/ide/openclaw/restore', { method: 'POST' });\n const data = await res.json();\n if (data.success) {\n showToast('OpenClaw 配置已还原', 'success');\n setOpenclawConfigSubTab('current');\n await loadOpenClawStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore OpenClaw config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setOpenclawRestoring(false);\n }\n };\n\n const handleOpenClawTest = async () => {\n if (openclawAbortRef.current) {\n openclawAbortRef.current.abort();\n openclawAbortRef.current = null;\n }\n openclawAbortRef.current = new AbortController();\n setOpenclawTesting(true);\n setOpenclawTestResult(null);\n try {\n const res = await fetch('/api/ide/openclaw/test', { signal: openclawAbortRef.current.signal });\n const data = await res.json();\n setOpenclawTestResult(data);\n if (data.success) showToast('OpenClaw 配置测试通过', 'success');\n else showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n } catch (err: any) {\n if (err.name === 'AbortError') showToast('测试已取消', 'info');\n else {\n showToast('测试失败: 网络错误', 'error');\n setOpenclawTestResult({ error: 'Network error' });\n }\n } finally {\n if (openclawAbortRef.current?.signal.aborted === false) openclawAbortRef.current = null;\n setOpenclawTesting(false);\n }\n };\n\n const handleOpenClawSave = async () => {\n setOpenclawSaving(true);\n try {\n const res = await fetch('/api/ide/openclaw/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks,\n image_model: openclawImageModel || undefined,\n image_fallbacks: openclawImageFallbacks,\n ...(openclawPreviewText.trim() ? { config: openclawPreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.saveType === 'temp' ? '配置已保存(临时)' : '配置已更新到 OpenClaw', 'success');\n await loadOpenClawStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save OpenClaw config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setOpenclawSaving(false);\n }\n };\n\n const handleOpenClawCancelTest = () => {\n if (openclawAbortRef.current) {\n openclawAbortRef.current.abort();\n openclawAbortRef.current = null;\n }\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-slate-50/80\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-slate-200 border-t-slate-900 rounded-full animate-spin\"></div>\n <div className=\"text-xs font-medium text-slate-500\">加载中...</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-slate-50/80\">\n <Nav />\n\n <main className=\"max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12\">\n <div className=\"mb-10\">\n <div className=\"flex items-center justify-between mb-2\">\n <h1 className=\"text-2xl font-semibold text-slate-900 tracking-tight\">IDE 配置</h1>\n <span className=\"px-2.5 py-0.5 text-xs font-medium text-slate-600 bg-slate-100/80 rounded-full border border-slate-200/50\">\n v1.0\n </span>\n </div>\n <p className=\"text-sm text-slate-500\">配置 Claude Code、OpenCode 和 OpenClaw 的模型代理设置</p>\n </div>\n\n <div className=\"bg-white/60 backdrop-blur-md rounded-xl border border-slate-200/50 shadow-sm\">\n <div className=\"border-b border-slate-200/50 bg-white/40\">\n <nav className=\"flex gap-1 px-5\" aria-label=\"Tabs\">\n <button\n onClick={() => setActiveTab('claude')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'claude'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n Claude Code\n {activeTab === 'claude' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('opencode')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'opencode'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n OpenCode\n {activeTab === 'opencode' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('openclaw')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'openclaw'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n OpenClaw\n {activeTab === 'openclaw' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('picoclaw')}\n disabled\n className=\"relative px-4 py-3.5 text-sm font-medium text-slate-300 disabled:cursor-not-allowed\"\n >\n <div className=\"flex items-center gap-2\">\n PicoClaw\n <span className=\"px-2 py-0.5 text-[10px] font-medium text-slate-400 bg-slate-100/60 rounded-full border border-slate-200/50\">\n 即将推出\n </span>\n </div>\n </button>\n </nav>\n </div>\n\n <div className=\"p-5 sm:p-6\">\n {activeTab === 'claude' && (\n <div className=\"space-y-6\">\n {status && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n status.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {status.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {status.applied ? '已配置' : '未配置'}\n </span>\n {status.applied && status.routerProvider === 'aar' && status.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n status.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {status.matchCurrentGateway ? '匹配配置' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {status.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(status.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div>\n <h2 className=\"text-[11px] font-medium text-slate-400 mb-5\">模型映射</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {[\n {\n key: 'haiku',\n label: 'Haiku',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n ),\n description: '快速响应',\n value: haikuModel,\n onChange: setHaikuModel,\n },\n {\n key: 'sonnet',\n label: 'Sonnet',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n ),\n description: '平衡性能',\n value: sonnetModel,\n onChange: setSonnetModel,\n },\n {\n key: 'opus',\n label: 'Opus',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9.663 17h4.673M12 3v1m6.364 5.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n ),\n description: '深度思考',\n value: opusModel,\n onChange: setOpusModel,\n },\n {\n key: 'default',\n label: '默认',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n ),\n description: '主要模型',\n value: defaultModel,\n onChange: setDefaultModel,\n },\n {\n key: 'reasoning',\n label: '推理',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 14.9a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 1.414l-5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n ),\n description: '复杂推理',\n value: reasoningModel,\n onChange: setReasoningModel,\n },\n ].map((config) => (\n <div\n key={config.key}\n className=\"group relative bg-gradient-to-br from-white/50 to-transparent hover:from-slate-50/60 rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\"\n >\n <label\n htmlFor={config.key}\n className=\"cursor-pointer\"\n >\n <div className=\"flex items-center gap-2.5 mb-2.5 relative group/tip\">\n <div className=\"w-7 h-7 rounded-lg bg-slate-100/80 text-slate-600 flex items-center justify-center\">\n {config.icon}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-[11px] font-medium text-slate-700\">{config.label}</span>\n </div>\n <div className=\"absolute left-9 top-0 mt-8 w-28 rounded-lg bg-slate-900/95 backdrop-blur-md px-3 py-2 text-[10px] text-slate-200 shadow-xl opacity-0 invisible group-hover/tip:opacity-100 group-hover/tip:visible transition-all duration-200 z-10\">\n {config.description}\n </div>\n </div>\n\n <div className=\"relative\">\n <select\n id={config.key}\n value={config.value}\n onChange={(e) => config.onChange(e.target.value)}\n className=\"w-full appearance-none rounded-lg border border-slate-200/80 bg-white/90 backdrop-blur-sm px-3 py-2 pr-7 text-[11px] font-medium text-slate-700 shadow-sm transition-all duration-200 hover:border-slate-300/80 hover:bg-white focus:border-slate-400/80 focus:ring-2 focus:ring-slate-200/50 focus:outline-none cursor-pointer\"\n >\n {Object.entries(models).map(([provider, providerModels]) => (\n <optgroup key={provider} label={provider}>\n {providerModels.map((model) => (\n <option key={model.id} value={model.model_id}>\n {model.name}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <div className=\"absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg className=\"w-3 h-3 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n\n <p className=\"text-[10px] text-slate-500 mt-2.5 group-hover:text-slate-600 transition-colors\">\n {config.description}\n </p>\n </label>\n </div>\n ))}\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${status?.backupExists ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleApply}\n disabled={applying}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-900 bg-slate-900 text-white hover:bg-slate-800 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {applying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {enabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {status?.backupExists && (\n <button\n onClick={handleRestore}\n disabled={restoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {restoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {testing ? (\n <button\n onClick={handleCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {testResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n testResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n testResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {testResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {testResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${testResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {testResult.success ? 'Claude Code 可以正常工作' : '请检查配置'}\n </p>\n\n {testResult.checks && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n <div className=\"grid grid-cols-3 gap-2\">\n {Object.entries(testResult.checks).map(([key, value]) => {\n const labels: Record<string, string> = {\n hasBaseUrl: '网关',\n hasApiKey: 'API Key',\n hasHaikuModel: 'Haiku',\n hasSonnetModel: 'Sonnet',\n hasOpusModel: 'Opus',\n hasDefaultModel: '默认模型',\n hasReasoningModel: '推理模型',\n isFromAar: '来源'\n };\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {value ? (\n <svg className=\"w-3 h-3 text-emerald-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-rose-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n <span className=\"text-[10px] text-slate-600\">{labels[key] || key}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {testResult.claudeTest && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n {testResult.claudeTest.success ? (\n <p className=\"text-[10px] text-emerald-700\">\n {testResult.claudeTest.message}\n {testResult.claudeTest.output && (\n <span className=\"text-[10px] text-slate-500 ml-1.5\">输出: {testResult.claudeTest.output}</span>\n )}\n </p>\n ) : (\n <p className=\"text-[10px] text-rose-700 font-mono bg-rose-100/50 px-2 py-1 rounded inline-block\">\n {testResult.claudeTest.error}\n </p>\n )}\n </div>\n )}\n\n {testResult.configSummary && (\n <details className=\"mt-3 group\">\n <summary className=\"cursor-pointer text-[10px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n 配置详情\n </summary>\n <div className=\"mt-2 space-y-1.5 text-[10px]\">\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">网关</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.baseUrl}</span>\n </div>\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">API Key</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.apiKey}</span>\n </div>\n {testResult.configSummary.routerProvider && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">来源</span>\n <span className=\"text-slate-700\">\n {testResult.configSummary.routerProvider === 'aar' ? '当前工具' : testResult.configSummary.routerProvider}\n </span>\n </div>\n )}\n {testResult.configSummary.haikuModel !== 'not set' && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">Haiku</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.haikuModel}</span>\n </div>\n )}\n {testResult.configSummary.sonnetModel !== 'not set' && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">Sonnet</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.sonnetModel}</span>\n </div>\n )}\n {testResult.configSummary.opusModel !== 'not set' && (\n <div className=\"flex justify-between py-1\">\n <span className=\"text-slate-500\">Opus</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.opusModel}</span>\n </div>\n )}\n </div>\n </details>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setClaudeConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n claudeConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setClaudeConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n claudeConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {claudeConfigSubTab === 'preview' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">settings.json(仅当前网关相关,应用时会合并进现有配置)</span>\n </div>\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto bg-slate-950 max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(\n {\n router_provider: 'aar',\n env: {\n ANTHROPIC_AUTH_TOKEN: status?.currentGatewayApiKey ?? 'your-gateway-api-key',\n ANTHROPIC_BASE_URL: status?.currentGatewayAddress ?? 'http://localhost:1357',\n ANTHROPIC_DEFAULT_HAIKU_MODEL: haikuModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: sonnetModel,\n ANTHROPIC_DEFAULT_OPUS_MODEL: opusModel,\n ANTHROPIC_MODEL: defaultModel,\n ANTHROPIC_REASONING_MODEL: reasoningModel,\n API_TIMEOUT_MS: '3000000',\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1,\n hasCompletedOnboarding: true,\n },\n },\n null,\n 2\n )}\n </pre>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">settings.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {status?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto bg-slate-950 max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(status.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 settings.json;「预览」为应用后将写入的内容</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>为每个模型类别选择路由模型后,在「预览」中查看,点击「应用配置」或「更新配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.claude/settings.json</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>若已应用过 AAR,会显示「更新配置」;有备份时「还原配置」可恢复,还原后请在「生效中」查看</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'opencode' && (\n <div className=\"space-y-6\">\n {opencodeStatus && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n opencodeStatus.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {opencodeStatus.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {opencodeStatus.applied ? '已配置' : '未配置'}\n </span>\n {opencodeStatus.applied && opencodeStatus.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n opencodeStatus.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {opencodeStatus.matchCurrentGateway ? '匹配当前网关' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {opencodeStatus.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(opencodeStatus.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div>\n <h2 className=\"text-[11px] font-medium text-slate-400 mb-5\">默认模型</h2>\n <div className=\"group relative bg-gradient-to-br from-white/50 to-transparent hover:from-slate-50/60 rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <label htmlFor=\"opencode-default-model\" className=\"cursor-pointer\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-slate-100/80 text-slate-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">OpenCode 使用的默认模型</span>\n </div>\n <div className=\"relative\">\n <select\n id=\"opencode-default-model\"\n value={opencodeDefaultModel}\n onChange={(e) => setOpencodeDefaultModel(e.target.value)}\n className=\"w-full appearance-none rounded-lg border border-slate-200/80 bg-white/90 backdrop-blur-sm px-3 py-2 pr-7 text-[11px] font-medium text-slate-700 shadow-sm transition-all duration-200 hover:border-slate-300/80 hover:bg-white focus:border-slate-400/80 focus:ring-2 focus:ring-slate-200/50 focus:outline-none cursor-pointer\"\n >\n {Object.entries(opencodeModels).map(([provider, providerModels]) => (\n <optgroup key={provider} label={provider}>\n {providerModels.map((model) => (\n <option key={model.id} value={model.model_id}>\n {model.name}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <div className=\"absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg className=\"w-3 h-3 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n </label>\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${opencodeEnabled ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleOpenCodeApply}\n disabled={opencodeApplying}\n className={`w-full px-4 py-2.5 text-xs font-medium rounded-lg border transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 ${\n opencodeEnabled\n ? 'bg-white border-slate-200/80 text-slate-700 hover:border-slate-300 hover:bg-slate-50'\n : 'bg-slate-900 border-slate-900 text-white hover:bg-slate-800'\n }`}\n >\n {opencodeApplying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {opencodeEnabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {opencodeEnabled && (\n <button\n onClick={handleOpenCodeRestore}\n disabled={opencodeRestoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {opencodeRestoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {opencodeTesting ? (\n <button\n onClick={handleOpenCodeCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleOpenCodeTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {opencodeTestResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n opencodeTestResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n opencodeTestResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {opencodeTestResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {opencodeTestResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${opencodeTestResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {opencodeTestResult.success\n ? (opencodeTestResult.opencodeTest?.message || 'OpenCode 可以正常工作')\n : (opencodeTestResult.opencodeTest?.error || opencodeTestResult.error || opencodeTestResult.suggestion || '请检查配置')}\n </p>\n {opencodeTestResult.checks && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n <div className=\"grid grid-cols-3 gap-2\">\n {Object.entries(opencodeTestResult.checks).map(([key, value]) => {\n const labels: Record<string, string> = {\n hasBaseUrl: '网关',\n hasApiKey: 'API Key',\n hasDefaultModel: '默认模型',\n hasModels: '模型列表',\n };\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {value ? (\n <svg className=\"w-3 h-3 text-emerald-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-rose-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n <span className=\"text-[10px] text-slate-600\">{labels[key] || key}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setOpencodeConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n opencodeConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setOpencodeConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n opencodeConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {opencodeConfigSubTab === 'current' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">opencode.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {opencodeStatus?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(opencodeStatus.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">opencode.json(应用后将写入的合并结果)</span>\n </div>\n {opencodePreviewLoading ? (\n <div className=\"p-3.5 text-[10px] text-slate-400 font-mono\">加载中...</div>\n ) : (\n <textarea\n className=\"opencode-preview-textarea w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono bg-slate-950 border-0 focus:ring-0 focus:ring-offset-0 focus:outline-none resize-y max-h-96 overflow-y-auto placeholder:text-slate-500\n [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\"\n placeholder=\"暂无预览\"\n spellCheck={false}\n value={opencodePreviewText}\n onChange={(e) => setOpencodePreviewText(e.target.value)}\n />\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 opencode.json;「预览」为点击应用后将写入的合并结果(含 AAR 网关)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>选择默认模型后,在「预览」中查看合并结果,点击「应用配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.config/opencode/opencode.json(或 Windows %APPDATA%/opencode)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>「还原配置」恢复为应用前的备份;还原后请在「生效中」查看当前内容</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'openclaw' && (\n <div className=\"space-y-6\">\n {openclawStatus && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n openclawStatus.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {openclawStatus.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {openclawStatus.applied ? '已配置' : '未配置'}\n </span>\n {openclawStatus.applied && openclawStatus.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n openclawStatus.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {openclawStatus.matchCurrentGateway ? '匹配当前网关' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {openclawStatus.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(openclawStatus.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\" ref={openClawDropdownRef}>\n {/* 默认模型 - 可搜索单选 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-indigo-100/80 text-indigo-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">默认模型</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'default' ? null : 'default'); }}\n className=\"w-full text-left appearance-none rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 pr-8 text-[11px] font-medium text-slate-700 shadow-sm focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200/50 focus:outline-none cursor-pointer flex items-center justify-between\"\n >\n <span className=\"truncate\">\n {openclawModelsFlat.find((m) => m.model_id === openclawDefaultModel)?.name || openclawDefaultModel || '选择模型'}\n </span>\n <svg className=\"w-3 h-3 text-slate-400 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {openClawDropdown === 'default' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-indigo-200 focus:border-indigo-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered.map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawDefaultModel(model.model_id);\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-indigo-50 ${model.model_id === openclawDefaultModel ? 'bg-indigo-100 text-indigo-700 font-medium' : 'text-slate-700'}`}\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">主要使用的模型</p>\n </div>\n\n {/* 默认 Fallback - 可搜索多选,芯片展示,不可重复 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-amber-100/80 text-amber-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">默认 Fallback</span>\n </div>\n <div className=\"relative\">\n <div className=\"min-h-[38px] rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 flex flex-wrap gap-1.5 items-center\">\n {openclawDefaultFallbacks.length === 0 ? (\n <span className=\"text-[11px] text-slate-400\">从下方搜索并添加备用模型</span>\n ) : (\n openclawDefaultFallbacks.map((modelId) => {\n const m = openclawModelsFlat.find((x) => x.model_id === modelId);\n return (\n <span\n key={modelId}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md bg-amber-100 text-amber-800 text-[10px] font-medium\"\n >\n {m?.name || modelId}\n <button\n type=\"button\"\n onClick={() => setOpenclawDefaultFallbacks((prev) => prev.filter((id) => id !== modelId))}\n className=\"hover:bg-amber-200 rounded p-0.5\"\n aria-label=\"移除\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n );\n })\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'defaultFallbacks' ? null : 'defaultFallbacks'); }}\n className=\"mt-1.5 w-full text-left px-3 py-1.5 text-[11px] text-slate-500 border border-dashed border-slate-200 rounded-md hover:border-amber-300 hover:text-amber-700 hover:bg-amber-50/50\"\n >\n + 搜索并添加 Fallback 模型\n </button>\n {openClawDropdown === 'defaultFallbacks' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-amber-200 focus:border-amber-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered\n .filter((m) => !openclawDefaultFallbacks.includes(m.model_id))\n .map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawDefaultFallbacks((prev) => (prev.includes(model.model_id) ? prev : [...prev, model.model_id]));\n setOpenClawSearch('');\n }}\n className=\"w-full text-left px-3 py-2 text-[11px] text-slate-700 hover:bg-amber-50\"\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n {openclawModelsFiltered.filter((m) => !openclawDefaultFallbacks.includes(m.model_id)).length === 0 && (\n <li className=\"px-3 py-2 text-[11px] text-slate-400\">无更多可选或已全部添加</li>\n )}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">默认模型的备用模型,可多选,不可重复</p>\n </div>\n\n {/* 视觉模型 - 可搜索单选 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-rose-100/80 text-rose-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">视觉模型</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'image' ? null : 'image'); }}\n className=\"w-full text-left appearance-none rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 pr-8 text-[11px] font-medium text-slate-700 shadow-sm focus:border-rose-400 focus:ring-2 focus:ring-rose-200/50 focus:outline-none cursor-pointer flex items-center justify-between\"\n >\n <span className=\"truncate\">\n {openclawImageModel\n ? (openclawModelsFlat.find((m) => m.model_id === openclawImageModel)?.name || openclawImageModel)\n : '未设置'}\n </span>\n <svg className=\"w-3 h-3 text-slate-400 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {openClawDropdown === 'image' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-rose-200 focus:border-rose-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n <li>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageModel('');\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-rose-50 ${!openclawImageModel ? 'bg-rose-100 text-rose-700 font-medium' : 'text-slate-500'}`}\n >\n 未设置\n </button>\n </li>\n {openclawModelsFiltered.map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageModel(model.model_id);\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-rose-50 ${model.model_id === openclawImageModel ? 'bg-rose-100 text-rose-700 font-medium' : 'text-slate-700'}`}\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">用于图像理解(可选)</p>\n </div>\n\n {/* 视觉 Fallback - 可搜索多选,芯片展示,不可重复 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-emerald-100/80 text-emerald-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">视觉 Fallback</span>\n </div>\n <div className=\"relative\">\n <div className=\"min-h-[38px] rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 flex flex-wrap gap-1.5 items-center\">\n {openclawImageFallbacks.length === 0 ? (\n <span className=\"text-[11px] text-slate-400\">从下方搜索并添加备用模型</span>\n ) : (\n openclawImageFallbacks.map((modelId) => {\n const m = openclawModelsFlat.find((x) => x.model_id === modelId);\n return (\n <span\n key={modelId}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md bg-emerald-100 text-emerald-800 text-[10px] font-medium\"\n >\n {m?.name || modelId}\n <button\n type=\"button\"\n onClick={() => setOpenclawImageFallbacks((prev) => prev.filter((id) => id !== modelId))}\n className=\"hover:bg-emerald-200 rounded p-0.5\"\n aria-label=\"移除\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n );\n })\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'imageFallbacks' ? null : 'imageFallbacks'); }}\n className=\"mt-1.5 w-full text-left px-3 py-1.5 text-[11px] text-slate-500 border border-dashed border-slate-200 rounded-md hover:border-emerald-300 hover:text-emerald-700 hover:bg-emerald-50/50\"\n >\n + 搜索并添加 Fallback 模型\n </button>\n {openClawDropdown === 'imageFallbacks' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-emerald-200 focus:border-emerald-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered\n .filter((m) => !openclawImageFallbacks.includes(m.model_id))\n .map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageFallbacks((prev) => (prev.includes(model.model_id) ? prev : [...prev, model.model_id]));\n setOpenClawSearch('');\n }}\n className=\"w-full text-left px-3 py-2 text-[11px] text-slate-700 hover:bg-emerald-50\"\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n {openclawModelsFiltered.filter((m) => !openclawImageFallbacks.includes(m.model_id)).length === 0 && (\n <li className=\"px-3 py-2 text-[11px] text-slate-400\">无更多可选或已全部添加</li>\n )}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">视觉模型的备用模型,可多选,不可重复</p>\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${openclawEnabled ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleOpenClawApply}\n disabled={openclawApplying}\n className={`w-full px-4 py-2.5 text-xs font-medium rounded-lg border transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 ${\n openclawEnabled\n ? 'bg-white border-slate-200/80 text-slate-700 hover:border-slate-300 hover:bg-slate-50'\n : 'bg-slate-900 border-slate-900 text-white hover:bg-slate-800'\n }`}\n >\n {openclawApplying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {openclawEnabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {openclawEnabled && (\n <button\n onClick={handleOpenClawRestore}\n disabled={openclawRestoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {openclawRestoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {openclawTesting ? (\n <button\n onClick={handleOpenClawCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleOpenClawTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {openclawTestResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n openclawTestResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n openclawTestResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {openclawTestResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {openclawTestResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${openclawTestResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {openclawTestResult.success\n ? (openclawTestResult.openclawTest?.message || 'OpenClaw 可以正常工作')\n : (openclawTestResult.openclawTest?.error || openclawTestResult.error || openclawTestResult.suggestion || '请检查配置')}\n </p>\n {openclawTestResult.openclawTest?.stdout && (\n <div className=\"mt-2 text-[10px] text-slate-500 font-mono bg-white/50 p-2 rounded\">\n {openclawTestResult.openclawTest.stdout}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setOpenclawConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n openclawConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setOpenclawConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n openclawConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {openclawConfigSubTab === 'preview' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">openclaw.json(应用后将写入的合并结果)</span>\n </div>\n {openclawPreviewLoading ? (\n <div className=\"p-3.5 text-[10px] text-slate-400 font-mono\">加载中...</div>\n ) : (\n <textarea\n className=\"openclaw-preview-textarea w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono bg-slate-950 border-0 focus:ring-0 focus:ring-offset-0 focus:outline-none resize-y max-h-96 overflow-y-auto placeholder:text-slate-500\n [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\"\n placeholder=\"暂无预览\"\n spellCheck={false}\n value={openclawPreviewText}\n onChange={(e) => setOpenclawPreviewText(e.target.value)}\n />\n )}\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">openclaw.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {openclawStatus?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(openclawStatus.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 openclaw.json;「预览」为应用后将写入的合并结果(含 AAR 网关)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>选择默认模型等后,在「预览」中查看合并结果,点击「应用配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.openclaw/openclaw.json</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>「还原配置」恢复为应用前的备份;还原后请在「生效中」查看当前内容</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'picoclaw' && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"w-16 h-16 bg-slate-100 rounded-full flex items-center justify-center mb-4\">\n <svg className=\"w-8 h-8 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n </div>\n <h3 className=\"text-sm font-medium text-slate-900 mb-1\">PicoClaw 支持即将推出</h3>\n <p className=\"text-xs text-slate-500 max-w-xs\">\n 我们将很快添加对 PicoClaw 的支持,敬请期待。\n </p>\n </div>\n )}\n </div>\n </div>\n </main>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/app/ide/page.tsx"],"sourcesContent":["'use client';\n\nimport { useState, useEffect, useRef, useMemo } from 'react';\nimport Nav from '../components/Nav';\nimport { useToast } from '../components/ToastProvider';\n\ninterface Model {\n id: number;\n name: string;\n model_id: string;\n}\n\ninterface ConfigStatus {\n applied: boolean;\n modelMapping: {\n haiku?: string;\n sonnet?: string;\n opus?: string;\n default?: string;\n reasoning?: string;\n };\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string; // 路由提供者标识,'aar' 表示配置来自当前工具\n tempMapping?: {\n haiku?: string;\n sonnet?: string;\n opus?: string;\n default?: string;\n reasoning?: string;\n };\n config?: Record<string, unknown>; // 当前配置文件完整内容,非 AAR 时用于展示\n /** 当前网关地址(来自数据库),用于预览 */\n currentGatewayAddress?: string;\n /** 当前网关 API Key(来自数据库,未脱敏),用于预览 */\n currentGatewayApiKey?: string;\n}\n\ninterface OpenCodeStatus {\n applied: boolean;\n defaultModel?: string;\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string | null;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string;\n tempDefaultModel?: string;\n providerName?: string;\n modelsCount?: number;\n /** 当前磁盘上 opencode.json 的完整内容,用于「生效中」展示 */\n config?: Record<string, unknown> | null;\n}\n\ninterface OpenClawStatus {\n applied: boolean;\n defaultModel?: string;\n defaultFallbacks?: string[];\n imageModel?: string;\n imageFallbacks?: string[];\n gatewayAddress?: string;\n apiKey?: string;\n lastUpdated?: string | null;\n backupExists: boolean;\n matchCurrentGateway?: boolean;\n routerProvider?: string;\n tempDefaultModel?: string;\n tempDefaultFallbacks?: string[];\n tempImageModel?: string;\n tempImageFallbacks?: string[];\n providerName?: string;\n modelsCount?: number;\n /** 当前磁盘上 openclaw.json 的完整内容,用于「生效中」展示 */\n config?: Record<string, unknown> | null;\n}\n\ninterface ModelMappingInput {\n key: string;\n label: string;\n envKey: string;\n description: string;\n value: string;\n onChange: (value: string) => void;\n}\n\nexport default function IDEConfigPage() {\n const [activeTab, setActiveTab] = useState('claude');\n const [haikuModel, setHaikuModel] = useState('GLM-4.5-air');\n const [sonnetModel, setSonnetModel] = useState('MiniMax-M2.1');\n const [opusModel, setOpusModel] = useState('GLM-4.7');\n const [defaultModel, setDefaultModel] = useState('GLM-4.7');\n const [reasoningModel, setReasoningModel] = useState('GLM-4.7');\n const [enabled, setEnabled] = useState(false);\n const [showPreview, setShowPreview] = useState(false);\n const [claudeConfigSubTab, setClaudeConfigSubTab] = useState<'current' | 'preview'>('preview');\n const [applying, setApplying] = useState(false);\n const [restoring, setRestoring] = useState(false);\n const [testing, setTesting] = useState(false);\n const [saving, setSaving] = useState(false);\n const [status, setStatus] = useState<ConfigStatus | null>(null);\n const [models, setModels] = useState<Record<string, Model[]>>({});\n const [loading, setLoading] = useState(true);\n const [testResult, setTestResult] = useState<null | any>(null);\n \n // OpenCode\n const [opencodeDefaultModel, setOpencodeDefaultModel] = useState('GLM-4.7');\n const [opencodeStatus, setOpencodeStatus] = useState<OpenCodeStatus | null>(null);\n const [opencodeApplying, setOpencodeApplying] = useState(false);\n const [opencodeRestoring, setOpencodeRestoring] = useState(false);\n const [opencodeTesting, setOpencodeTesting] = useState(false);\n const [opencodeSaving, setOpencodeSaving] = useState(false);\n const [opencodeTestResult, setOpencodeTestResult] = useState<null | any>(null);\n const [opencodeModels, setOpencodeModels] = useState<Record<string, Model[]>>({});\n const [opencodePreviewConfig, setOpencodePreviewConfig] = useState<Record<string, unknown> | null>(null);\n const [opencodePreviewText, setOpencodePreviewText] = useState<string>('');\n const [opencodePreviewLoading, setOpencodePreviewLoading] = useState(false);\n const [opencodeConfigSubTab, setOpencodeConfigSubTab] = useState<'current' | 'preview'>('current');\n\n // OpenClaw\n const [openclawDefaultModel, setOpenclawDefaultModel] = useState('GLM-4.7');\n const [openclawDefaultFallbacks, setOpenclawDefaultFallbacks] = useState<string[]>([]);\n const [openclawImageModel, setOpenclawImageModel] = useState('');\n const [openclawImageFallbacks, setOpenclawImageFallbacks] = useState<string[]>([]);\n const [openclawStatus, setOpenclawStatus] = useState<OpenClawStatus | null>(null);\n const [openclawApplying, setOpenclawApplying] = useState(false);\n const [openclawRestoring, setOpenclawRestoring] = useState(false);\n const [openclawTesting, setOpenclawTesting] = useState(false);\n const [openclawSaving, setOpenclawSaving] = useState(false);\n const [openclawTestResult, setOpenclawTestResult] = useState<null | any>(null);\n const [openclawModels, setOpenclawModels] = useState<Record<string, Model[]>>({});\n const [openclawPreviewConfig, setOpenclawPreviewConfig] = useState<Record<string, unknown> | null>(null);\n const [openclawPreviewText, setOpenclawPreviewText] = useState<string>('');\n const [openclawPreviewLoading, setOpenclawPreviewLoading] = useState(false);\n const [openClawDropdown, setOpenClawDropdown] = useState<'default' | 'defaultFallbacks' | 'image' | 'imageFallbacks' | null>(null);\n const [openClawSearch, setOpenClawSearch] = useState('');\n const [openclawConfigSubTab, setOpenclawConfigSubTab] = useState<'current' | 'preview'>('preview');\n const openClawDropdownRef = useRef<HTMLDivElement | null>(null);\n\n const { showToast } = useToast();\n\n const openclawModelsFlat = useMemo(() =>\n Object.entries(openclawModels).flatMap(([provider, arr]) =>\n arr.map((m) => ({ ...m, provider } as Model & { provider: string }))\n ),\n [openclawModels]\n );\n const openclawModelsFiltered = useMemo(() => {\n const q = openClawSearch.trim().toLowerCase();\n if (!q) return openclawModelsFlat;\n return openclawModelsFlat.filter(\n (m) =>\n m.name.toLowerCase().includes(q) || m.model_id.toLowerCase().includes(q)\n );\n }, [openclawModelsFlat, openClawSearch]);\n\n // Abort controller for cancelling test\n const abortControllerRef = useRef<AbortController | null>(null);\n const opencodeAbortRef = useRef<AbortController | null>(null);\n const openclawAbortRef = useRef<AbortController | null>(null);\n\n const loadStatus = async () => {\n try {\n const res = await fetch('/api/ide/claude/status');\n const data: ConfigStatus = await res.json();\n setStatus(data);\n // 优先使用临时配置(如果存在),否则使用已应用的配置\n const mappingToUse = (data.matchCurrentGateway === false && data.tempMapping)\n ? data.tempMapping\n : data.modelMapping;\n if (mappingToUse) {\n setHaikuModel(mappingToUse.haiku || 'GLM-4.5-air');\n setSonnetModel(mappingToUse.sonnet || 'MiniMax-M2.1');\n setOpusModel(mappingToUse.opus || 'GLM-4.7');\n setDefaultModel(mappingToUse.default || 'GLM-4.7');\n setReasoningModel(mappingToUse.reasoning || 'GLM-4.7');\n }\n // 只有当配置来自当前工具(routerProvider === 'aar')时才设置为 enabled\n setEnabled(data.applied && data.routerProvider === 'aar');\n } catch (error) {\n console.error('Failed to load status:', error);\n } finally {\n setLoading(false);\n }\n };\n\n const loadModels = async () => {\n try {\n const res = await fetch('/api/ide/claude/available-models');\n const data = await res.json();\n setModels(data.models || {});\n } catch (error) {\n console.error('Failed to load models:', error);\n }\n };\n\n const loadOpenCodeStatus = async () => {\n try {\n const res = await fetch('/api/ide/opencode/status');\n const data: OpenCodeStatus = await res.json();\n setOpencodeStatus(data);\n const toUse = (data.matchCurrentGateway === false && data.tempDefaultModel)\n ? data.tempDefaultModel\n : data.defaultModel;\n if (toUse) setOpencodeDefaultModel(toUse);\n else if (data.defaultModel) setOpencodeDefaultModel(data.defaultModel);\n } catch (error) {\n console.error('Failed to load OpenCode status:', error);\n }\n };\n\n const loadOpenCodeModels = async () => {\n try {\n const res = await fetch('/api/ide/opencode/available-models');\n const data = await res.json();\n setOpencodeModels(data.models || {});\n } catch (error) {\n console.error('Failed to load OpenCode models:', error);\n }\n };\n\n const loadOpenClawStatus = async () => {\n try {\n const res = await fetch('/api/ide/openclaw/status');\n const data: OpenClawStatus = await res.json();\n setOpenclawStatus(data);\n\n // Determine which values to use (temp or applied)\n const useTemp = data.matchCurrentGateway === false && data.tempDefaultModel;\n\n if (useTemp) {\n setOpenclawDefaultModel(data.tempDefaultModel || 'GLM-4.7');\n setOpenclawDefaultFallbacks(data.tempDefaultFallbacks || []);\n setOpenclawImageModel(data.tempImageModel || '');\n setOpenclawImageFallbacks(data.tempImageFallbacks || []);\n } else {\n setOpenclawDefaultModel(data.defaultModel || 'GLM-4.7');\n setOpenclawDefaultFallbacks(data.defaultFallbacks || []);\n setOpenclawImageModel(data.imageModel || '');\n setOpenclawImageFallbacks(data.imageFallbacks || []);\n }\n } catch (error) {\n console.error('Failed to load OpenClaw status:', error);\n }\n };\n\n const loadOpenClawModels = async () => {\n try {\n const res = await fetch('/api/ide/openclaw/available-models');\n const data = await res.json();\n setOpenclawModels(data.models || {});\n } catch (error) {\n console.error('Failed to load OpenClaw models:', error);\n }\n };\n\n useEffect(() => {\n loadStatus();\n loadModels();\n loadOpenCodeStatus();\n loadOpenCodeModels();\n loadOpenClawStatus();\n loadOpenClawModels();\n }, []);\n\n // OpenCode Preview\n useEffect(() => {\n if (activeTab !== 'opencode' || !opencodeDefaultModel) {\n setOpencodePreviewConfig(null);\n setOpencodePreviewText('');\n return;\n }\n let cancelled = false;\n setOpencodePreviewLoading(true);\n setOpencodePreviewConfig(null);\n setOpencodePreviewText('');\n fetch(`/api/ide/opencode/preview?default_model=${encodeURIComponent(opencodeDefaultModel)}`)\n .then((res) => res.json())\n .then((data) => {\n if (!cancelled && data.config) {\n setOpencodePreviewConfig(data.config);\n setOpencodePreviewText(JSON.stringify(data.config, null, 2));\n }\n })\n .catch(() => {\n if (!cancelled) setOpencodePreviewConfig(null);\n if (!cancelled) setOpencodePreviewText('');\n })\n .finally(() => {\n if (!cancelled) setOpencodePreviewLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [activeTab, opencodeDefaultModel]);\n\n // OpenClaw Preview\n useEffect(() => {\n if (activeTab !== 'openclaw' || !openclawDefaultModel) {\n setOpenclawPreviewConfig(null);\n setOpenclawPreviewText('');\n return;\n }\n let cancelled = false;\n setOpenclawPreviewLoading(true);\n setOpenclawPreviewConfig(null);\n setOpenclawPreviewText('');\n\n const params = new URLSearchParams({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks.join(','),\n });\n if (openclawImageModel) {\n params.set('image_model', openclawImageModel);\n if (openclawImageFallbacks.length > 0) {\n params.set('image_fallbacks', openclawImageFallbacks.join(','));\n }\n }\n fetch(`/api/ide/openclaw/preview?${params.toString()}`)\n .then((res) => res.json())\n .then((data) => {\n if (!cancelled && data.config) {\n setOpenclawPreviewConfig(data.config);\n setOpenclawPreviewText(JSON.stringify(data.config, null, 2));\n }\n })\n .catch(() => {\n if (!cancelled) setOpenclawPreviewConfig(null);\n if (!cancelled) setOpenclawPreviewText('');\n })\n .finally(() => {\n if (!cancelled) setOpenclawPreviewLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [activeTab, openclawDefaultModel, openclawDefaultFallbacks, openclawImageModel, openclawImageFallbacks]);\n\n useEffect(() => {\n if (openClawDropdown == null) return;\n const onDocClick = (e: MouseEvent) => {\n if (openClawDropdownRef.current && !openClawDropdownRef.current.contains(e.target as Node)) {\n setOpenClawDropdown(null);\n }\n };\n document.addEventListener('mousedown', onDocClick);\n return () => document.removeEventListener('mousedown', onDocClick);\n }, [openClawDropdown]);\n\n // 同步 Claude 下拉框默认值:确保状态值在可用模型列表中\n useEffect(() => {\n const allModels = Object.values(models).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n // 如果当前状态值不在可用模型列表中,更新为第一个可用模型\n if (!modelIds.includes(haikuModel)) {\n setHaikuModel(firstModelId);\n }\n if (!modelIds.includes(sonnetModel)) {\n setSonnetModel(firstModelId);\n }\n if (!modelIds.includes(opusModel)) {\n setOpusModel(firstModelId);\n }\n if (!modelIds.includes(defaultModel)) {\n setDefaultModel(firstModelId);\n }\n if (!modelIds.includes(reasoningModel)) {\n setReasoningModel(firstModelId);\n }\n }, [models]);\n\n // 同步 OpenCode 下拉框默认值\n useEffect(() => {\n const allModels = Object.values(opencodeModels).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n if (!modelIds.includes(opencodeDefaultModel)) {\n setOpencodeDefaultModel(firstModelId);\n }\n }, [opencodeModels]);\n\n // 同步 OpenClaw 下拉框默认值\n useEffect(() => {\n const allModels = Object.values(openclawModels).flat();\n if (allModels.length === 0) return;\n \n const modelIds = allModels.map(m => m.model_id);\n const firstModelId = allModels[0].model_id;\n \n if (!modelIds.includes(openclawDefaultModel)) {\n setOpenclawDefaultModel(firstModelId);\n }\n // 过滤无效的 fallback 模型\n const validFallbacks = openclawDefaultFallbacks.filter(id => modelIds.includes(id));\n if (validFallbacks.length !== openclawDefaultFallbacks.length) {\n setOpenclawDefaultFallbacks(validFallbacks);\n }\n // 检查 image model\n if (openclawImageModel && !modelIds.includes(openclawImageModel)) {\n setOpenclawImageModel('');\n }\n // 过滤无效的 image fallback 模型\n const validImageFallbacks = openclawImageFallbacks.filter(id => modelIds.includes(id));\n if (validImageFallbacks.length !== openclawImageFallbacks.length) {\n setOpenclawImageFallbacks(validImageFallbacks);\n }\n }, [openclawModels]);\n\n // Claude Handlers\n const handleApply = async () => {\n setApplying(true);\n try {\n const res = await fetch('/api/ide/claude/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n haiku: haikuModel,\n sonnet: sonnetModel,\n opus: opusModel,\n default: defaultModel,\n reasoning: reasoningModel,\n }),\n });\n const data = await res.json();\n\n if (data.success) {\n showToast('配置应用成功', 'success');\n await loadStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setApplying(false);\n }\n };\n\n const handleRestore = async () => {\n setRestoring(true);\n try {\n const res = await fetch('/api/ide/claude/restore', {\n method: 'POST',\n });\n const data = await res.json();\n \n if (data.success) {\n showToast('配置已还原', 'success');\n setClaudeConfigSubTab('current');\n await loadStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setRestoring(false);\n }\n };\n\n const handleTest = async () => {\n // Cancel any ongoing test\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n\n abortControllerRef.current = new AbortController();\n setTesting(true);\n setTestResult(null);\n try {\n const res = await fetch('/api/ide/claude/test', {\n signal: abortControllerRef.current.signal,\n });\n const data = await res.json();\n\n setTestResult(data);\n\n if (data.success) {\n showToast('配置测试通过', 'success');\n } else {\n showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n }\n } catch (error: any) {\n console.error('Failed to test config:', error);\n if (error.name === 'AbortError') {\n showToast('测试已取消', 'info');\n } else {\n showToast('测试失败: 网络错误', 'error');\n setTestResult({ error: 'Network error' });\n }\n } finally {\n if (abortControllerRef.current?.signal.aborted === false) {\n abortControllerRef.current = null;\n }\n setTesting(false);\n }\n };\n\n const handleCancelTest = () => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n };\n\n const handleSave = async () => {\n setSaving(true);\n try {\n const res = await fetch('/api/ide/claude/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n haiku: haikuModel,\n sonnet: sonnetModel,\n opus: opusModel,\n default: defaultModel,\n reasoning: reasoningModel,\n }),\n });\n const data = await res.json();\n\n if (data.success) {\n const isTemp = data.saveType === 'temp';\n showToast(isTemp ? '配置已保存(临时)' : '配置已更新到 Claude Code', 'success');\n await loadStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setSaving(false);\n }\n };\n\n // OpenCode Handlers\n const opencodeEnabled = opencodeStatus?.applied && opencodeStatus?.routerProvider === 'aar';\n\n const handleOpenCodeApply = async () => {\n setOpencodeApplying(true);\n try {\n const res = await fetch('/api/ide/opencode/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: opencodeDefaultModel,\n ...(opencodePreviewText.trim() ? { config: opencodePreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.message || 'OpenCode 配置应用成功', 'success');\n await loadOpenCodeStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply OpenCode config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setOpencodeApplying(false);\n }\n };\n\n const handleOpenCodeRestore = async () => {\n setOpencodeRestoring(true);\n try {\n const res = await fetch('/api/ide/opencode/restore', { method: 'POST' });\n const data = await res.json();\n if (data.success) {\n showToast('OpenCode 配置已还原', 'success');\n setOpencodeConfigSubTab('current');\n await loadOpenCodeStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore OpenCode config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setOpencodeRestoring(false);\n }\n };\n\n const handleOpenCodeTest = async () => {\n if (opencodeAbortRef.current) {\n opencodeAbortRef.current.abort();\n opencodeAbortRef.current = null;\n }\n opencodeAbortRef.current = new AbortController();\n setOpencodeTesting(true);\n setOpencodeTestResult(null);\n try {\n const res = await fetch('/api/ide/opencode/test', { signal: opencodeAbortRef.current.signal });\n const data = await res.json();\n setOpencodeTestResult(data);\n if (data.success) showToast('OpenCode 配置测试通过', 'success');\n else showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n } catch (err: any) {\n if (err.name === 'AbortError') showToast('测试已取消', 'info');\n else {\n showToast('测试失败: 网络错误', 'error');\n setOpencodeTestResult({ error: 'Network error' });\n }\n } finally {\n if (opencodeAbortRef.current?.signal.aborted === false) opencodeAbortRef.current = null;\n setOpencodeTesting(false);\n }\n };\n\n const handleOpenCodeSave = async () => {\n setOpencodeSaving(true);\n try {\n const res = await fetch('/api/ide/opencode/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: opencodeDefaultModel,\n ...(opencodePreviewText.trim() ? { config: opencodePreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.saveType === 'temp' ? '配置已保存(临时)' : '配置已更新到 OpenCode', 'success');\n await loadOpenCodeStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save OpenCode config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setOpencodeSaving(false);\n }\n };\n\n const handleOpenCodeCancelTest = () => {\n if (opencodeAbortRef.current) {\n opencodeAbortRef.current.abort();\n opencodeAbortRef.current = null;\n }\n };\n\n // OpenClaw Handlers\n const openclawEnabled = openclawStatus?.applied && openclawStatus?.routerProvider === 'aar';\n\n const handleOpenClawApply = async () => {\n setOpenclawApplying(true);\n try {\n const res = await fetch('/api/ide/openclaw/apply', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks,\n image_model: openclawImageModel || undefined,\n image_fallbacks: openclawImageFallbacks,\n ...(openclawPreviewText.trim() ? { config: openclawPreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.message || 'OpenClaw 配置应用成功', 'success');\n await loadOpenClawStatus();\n } else {\n showToast('应用失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to apply OpenClaw config:', error);\n showToast('应用失败: 网络错误', 'error');\n } finally {\n setOpenclawApplying(false);\n }\n };\n\n const handleOpenClawRestore = async () => {\n setOpenclawRestoring(true);\n try {\n const res = await fetch('/api/ide/openclaw/restore', { method: 'POST' });\n const data = await res.json();\n if (data.success) {\n showToast('OpenClaw 配置已还原', 'success');\n setOpenclawConfigSubTab('current');\n await loadOpenClawStatus();\n } else {\n showToast('还原失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to restore OpenClaw config:', error);\n showToast('还原失败: 网络错误', 'error');\n } finally {\n setOpenclawRestoring(false);\n }\n };\n\n const handleOpenClawTest = async () => {\n if (openclawAbortRef.current) {\n openclawAbortRef.current.abort();\n openclawAbortRef.current = null;\n }\n openclawAbortRef.current = new AbortController();\n setOpenclawTesting(true);\n setOpenclawTestResult(null);\n try {\n const res = await fetch('/api/ide/openclaw/test', { signal: openclawAbortRef.current.signal });\n const data = await res.json();\n setOpenclawTestResult(data);\n if (data.success) showToast('OpenClaw 配置测试通过', 'success');\n else showToast('配置验证失败: ' + (data.error || data.suggestion || '请检查配置'), 'error');\n } catch (err: any) {\n if (err.name === 'AbortError') showToast('测试已取消', 'info');\n else {\n showToast('测试失败: 网络错误', 'error');\n setOpenclawTestResult({ error: 'Network error' });\n }\n } finally {\n if (openclawAbortRef.current?.signal.aborted === false) openclawAbortRef.current = null;\n setOpenclawTesting(false);\n }\n };\n\n const handleOpenClawSave = async () => {\n setOpenclawSaving(true);\n try {\n const res = await fetch('/api/ide/openclaw/save', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n default_model: openclawDefaultModel,\n default_fallbacks: openclawDefaultFallbacks,\n image_model: openclawImageModel || undefined,\n image_fallbacks: openclawImageFallbacks,\n ...(openclawPreviewText.trim() ? { config: openclawPreviewText } : {}),\n }),\n });\n const data = await res.json();\n if (data.success) {\n showToast(data.saveType === 'temp' ? '配置已保存(临时)' : '配置已更新到 OpenClaw', 'success');\n await loadOpenClawStatus();\n } else {\n showToast('保存失败: ' + (data.error || '未知错误'), 'error');\n }\n } catch (error) {\n console.error('Failed to save OpenClaw config:', error);\n showToast('保存失败: 网络错误', 'error');\n } finally {\n setOpenclawSaving(false);\n }\n };\n\n const handleOpenClawCancelTest = () => {\n if (openclawAbortRef.current) {\n openclawAbortRef.current.abort();\n openclawAbortRef.current = null;\n }\n };\n\n if (loading) {\n return (\n <div className=\"min-h-screen flex items-center justify-center bg-slate-50/80\">\n <div className=\"flex flex-col items-center gap-3\">\n <div className=\"w-8 h-8 border-2 border-slate-200 border-t-slate-900 rounded-full animate-spin\"></div>\n <div className=\"text-xs font-medium text-slate-500\">加载中...</div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-screen bg-slate-50/80\">\n <Nav />\n\n <main className=\"max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12\">\n <div className=\"mb-10\">\n <div className=\"flex items-center justify-between mb-2\">\n <h1 className=\"text-2xl font-semibold text-slate-900 tracking-tight\">IDE 配置</h1>\n <span className=\"px-2.5 py-0.5 text-xs font-medium text-slate-600 bg-slate-100/80 rounded-full border border-slate-200/50\">\n v1.0\n </span>\n </div>\n <p className=\"text-sm text-slate-500\">配置 Claude Code、OpenCode 和 OpenClaw 的模型代理设置</p>\n </div>\n\n <div className=\"bg-white/60 backdrop-blur-md rounded-xl border border-slate-200/50 shadow-sm\">\n <div className=\"border-b border-slate-200/50 bg-white/40\">\n <nav className=\"flex gap-1 px-5\" aria-label=\"Tabs\">\n <button\n onClick={() => setActiveTab('claude')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'claude'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n Claude Code\n {activeTab === 'claude' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('opencode')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'opencode'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n OpenCode\n {activeTab === 'opencode' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('openclaw')}\n className={`relative px-4 py-3.5 text-sm font-medium transition-all duration-200 ${\n activeTab === 'openclaw'\n ? 'text-slate-900'\n : 'text-slate-400 hover:text-slate-600'\n }`}\n >\n OpenClaw\n {activeTab === 'openclaw' && (\n <span className=\"absolute bottom-0 left-4 right-4 h-[2px] bg-slate-900 rounded-full\"></span>\n )}\n </button>\n <button\n onClick={() => setActiveTab('picoclaw')}\n disabled\n className=\"relative px-4 py-3.5 text-sm font-medium text-slate-300 disabled:cursor-not-allowed\"\n >\n <div className=\"flex items-center gap-2\">\n PicoClaw\n <span className=\"px-2 py-0.5 text-[10px] font-medium text-slate-400 bg-slate-100/60 rounded-full border border-slate-200/50\">\n 即将推出\n </span>\n </div>\n </button>\n </nav>\n </div>\n\n <div className=\"p-5 sm:p-6\">\n {activeTab === 'claude' && (\n <div className=\"space-y-6\">\n {status && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n status.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {status.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {status.applied ? '已配置' : '未配置'}\n </span>\n {status.applied && status.routerProvider === 'aar' && status.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n status.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {status.matchCurrentGateway ? '匹配配置' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {status.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(status.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div>\n <h2 className=\"text-[11px] font-medium text-slate-400 mb-5\">模型映射</h2>\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n {[\n {\n key: 'haiku',\n label: 'Haiku',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n ),\n description: '快速响应',\n value: haikuModel,\n onChange: setHaikuModel,\n },\n {\n key: 'sonnet',\n label: 'Sonnet',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9.75 17L9 20l-1 1h8l-1-1-.75-3M3 13h18M5 17h14a2 2 0 002-2V5a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z\" />\n </svg>\n ),\n description: '平衡性能',\n value: sonnetModel,\n onChange: setSonnetModel,\n },\n {\n key: 'opus',\n label: 'Opus',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M9.663 17h4.673M12 3v1m6.364 5.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n ),\n description: '深度思考',\n value: opusModel,\n onChange: setOpusModel,\n },\n {\n key: 'default',\n label: '默认',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n ),\n description: '主要模型',\n value: defaultModel,\n onChange: setDefaultModel,\n },\n {\n key: 'reasoning',\n label: '推理',\n icon: (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M19.428 15.428a2 2 0 00-1.022-.547l-2.387-.477a6 6 0 00-3.86.517l-.318.158a6 6 0 01-3.86.517L6.05 14.9a2 2 0 00-1.806.547M8 4h8l-1 1v5.172a2 2 0 00.586 1.414l5 5c1.26 1.26.367 3.414-1.415 1.414l-5-5A2 2 0 009 10.172V5L8 4z\" />\n </svg>\n ),\n description: '复杂推理',\n value: reasoningModel,\n onChange: setReasoningModel,\n },\n ].map((config) => (\n <div\n key={config.key}\n className=\"group relative bg-gradient-to-br from-white/50 to-transparent hover:from-slate-50/60 rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\"\n >\n <label\n htmlFor={config.key}\n className=\"cursor-pointer\"\n >\n <div className=\"flex items-center gap-2.5 mb-2.5 relative group/tip\">\n <div className=\"w-7 h-7 rounded-lg bg-slate-100/80 text-slate-600 flex items-center justify-center\">\n {config.icon}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-[11px] font-medium text-slate-700\">{config.label}</span>\n </div>\n <div className=\"absolute left-9 top-0 mt-8 w-28 rounded-lg bg-slate-900/95 backdrop-blur-md px-3 py-2 text-[10px] text-slate-200 shadow-xl opacity-0 invisible group-hover/tip:opacity-100 group-hover/tip:visible transition-all duration-200 z-10\">\n {config.description}\n </div>\n </div>\n\n <div className=\"relative\">\n <select\n id={config.key}\n value={config.value}\n onChange={(e) => config.onChange(e.target.value)}\n className=\"w-full appearance-none rounded-lg border border-slate-200/80 bg-white/90 backdrop-blur-sm px-3 py-2 pr-7 text-[11px] font-medium text-slate-700 shadow-sm transition-all duration-200 hover:border-slate-300/80 hover:bg-white focus:border-slate-400/80 focus:ring-2 focus:ring-slate-200/50 focus:outline-none cursor-pointer\"\n >\n {Object.entries(models).map(([provider, providerModels]) => (\n <optgroup key={provider} label={provider}>\n {providerModels.map((model) => (\n <option key={model.id} value={model.model_id}>\n {model.name}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <div className=\"absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg className=\"w-3 h-3 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n\n <p className=\"text-[10px] text-slate-500 mt-2.5 group-hover:text-slate-600 transition-colors\">\n {config.description}\n </p>\n </label>\n </div>\n ))}\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${status?.backupExists ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleApply}\n disabled={applying}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-900 bg-slate-900 text-white hover:bg-slate-800 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {applying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {enabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {status?.backupExists && (\n <button\n onClick={handleRestore}\n disabled={restoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {restoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {testing ? (\n <button\n onClick={handleCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {testResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n testResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n testResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {testResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {testResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${testResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {testResult.success ? 'Claude Code 可以正常工作' : '请检查配置'}\n </p>\n\n {testResult.checks && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n <div className=\"grid grid-cols-3 gap-2\">\n {Object.entries(testResult.checks).map(([key, value]) => {\n const labels: Record<string, string> = {\n hasBaseUrl: '网关',\n hasApiKey: 'API Key',\n hasHaikuModel: 'Haiku',\n hasSonnetModel: 'Sonnet',\n hasOpusModel: 'Opus',\n hasDefaultModel: '默认模型',\n hasReasoningModel: '推理模型',\n isFromAar: '来源'\n };\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {value ? (\n <svg className=\"w-3 h-3 text-emerald-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-rose-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n <span className=\"text-[10px] text-slate-600\">{labels[key] || key}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {testResult.claudeTest && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n {testResult.claudeTest.success ? (\n <p className=\"text-[10px] text-emerald-700\">\n {testResult.claudeTest.message}\n {testResult.claudeTest.output && (\n <span className=\"text-[10px] text-slate-500 ml-1.5\">输出: {testResult.claudeTest.output}</span>\n )}\n </p>\n ) : (\n <p className=\"text-[10px] text-rose-700 font-mono bg-rose-100/50 px-2 py-1 rounded inline-block\">\n {testResult.claudeTest.error}\n </p>\n )}\n </div>\n )}\n\n {testResult.configSummary && (\n <details className=\"mt-3 group\">\n <summary className=\"cursor-pointer text-[10px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n 配置详情\n </summary>\n <div className=\"mt-2 space-y-1.5 text-[10px]\">\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">网关</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.baseUrl}</span>\n </div>\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">API Key</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.apiKey}</span>\n </div>\n {testResult.configSummary.routerProvider && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">来源</span>\n <span className=\"text-slate-700\">\n {testResult.configSummary.routerProvider === 'aar' ? '当前工具' : testResult.configSummary.routerProvider}\n </span>\n </div>\n )}\n {testResult.configSummary.haikuModel !== 'not set' && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">Haiku</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.haikuModel}</span>\n </div>\n )}\n {testResult.configSummary.sonnetModel !== 'not set' && (\n <div className=\"flex justify-between py-1 border-b border-slate-200/40\">\n <span className=\"text-slate-500\">Sonnet</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.sonnetModel}</span>\n </div>\n )}\n {testResult.configSummary.opusModel !== 'not set' && (\n <div className=\"flex justify-between py-1\">\n <span className=\"text-slate-500\">Opus</span>\n <span className=\"font-mono text-slate-700\">{testResult.configSummary.opusModel}</span>\n </div>\n )}\n </div>\n </details>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setClaudeConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n claudeConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setClaudeConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n claudeConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {claudeConfigSubTab === 'preview' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">settings.json(仅当前网关相关,应用时会合并进现有配置)</span>\n </div>\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto bg-slate-950 max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(\n {\n router_provider: 'aar',\n env: {\n ANTHROPIC_AUTH_TOKEN: status?.currentGatewayApiKey ?? 'your-gateway-api-key',\n ANTHROPIC_BASE_URL: status?.currentGatewayAddress ?? 'http://localhost:1357',\n ANTHROPIC_DEFAULT_HAIKU_MODEL: haikuModel,\n ANTHROPIC_DEFAULT_SONNET_MODEL: sonnetModel,\n ANTHROPIC_DEFAULT_OPUS_MODEL: opusModel,\n ANTHROPIC_MODEL: defaultModel,\n ANTHROPIC_REASONING_MODEL: reasoningModel,\n API_TIMEOUT_MS: '3000000',\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1,\n hasCompletedOnboarding: true,\n },\n },\n null,\n 2\n )}\n </pre>\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">settings.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {status?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto bg-slate-950 max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(status.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 settings.json;「预览」为应用后将写入的内容</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>为每个模型类别选择路由模型后,在「预览」中查看,点击「应用配置」或「更新配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.claude/settings.json</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>若已应用过 AAR,会显示「更新配置」;有备份时「还原配置」可恢复,还原后请在「生效中」查看</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'opencode' && (\n <div className=\"space-y-6\">\n {opencodeStatus && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n opencodeStatus.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {opencodeStatus.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {opencodeStatus.applied ? '已配置' : '未配置'}\n </span>\n {opencodeStatus.applied && opencodeStatus.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n opencodeStatus.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {opencodeStatus.matchCurrentGateway ? '匹配当前网关' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {opencodeStatus.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(opencodeStatus.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div>\n <h2 className=\"text-[11px] font-medium text-slate-400 mb-5\">默认模型</h2>\n <div className=\"group relative bg-gradient-to-br from-white/50 to-transparent hover:from-slate-50/60 rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <label htmlFor=\"opencode-default-model\" className=\"cursor-pointer\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-slate-100/80 text-slate-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">OpenCode 使用的默认模型</span>\n </div>\n <div className=\"relative\">\n <select\n id=\"opencode-default-model\"\n value={opencodeDefaultModel}\n onChange={(e) => setOpencodeDefaultModel(e.target.value)}\n className=\"w-full appearance-none rounded-lg border border-slate-200/80 bg-white/90 backdrop-blur-sm px-3 py-2 pr-7 text-[11px] font-medium text-slate-700 shadow-sm transition-all duration-200 hover:border-slate-300/80 hover:bg-white focus:border-slate-400/80 focus:ring-2 focus:ring-slate-200/50 focus:outline-none cursor-pointer\"\n >\n {Object.entries(opencodeModels).map(([provider, providerModels]) => (\n <optgroup key={provider} label={provider}>\n {providerModels.map((model) => (\n <option key={model.id} value={model.model_id}>\n {model.name}\n </option>\n ))}\n </optgroup>\n ))}\n </select>\n <div className=\"absolute right-2.5 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg className=\"w-3 h-3 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </div>\n </div>\n </label>\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${opencodeEnabled ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleOpenCodeApply}\n disabled={opencodeApplying}\n className={`w-full px-4 py-2.5 text-xs font-medium rounded-lg border transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 ${\n opencodeEnabled\n ? 'bg-white border-slate-200/80 text-slate-700 hover:border-slate-300 hover:bg-slate-50'\n : 'bg-slate-900 border-slate-900 text-white hover:bg-slate-800'\n }`}\n >\n {opencodeApplying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {opencodeEnabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {opencodeEnabled && (\n <button\n onClick={handleOpenCodeRestore}\n disabled={opencodeRestoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {opencodeRestoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {opencodeTesting ? (\n <button\n onClick={handleOpenCodeCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleOpenCodeTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {opencodeTestResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n opencodeTestResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n opencodeTestResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {opencodeTestResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {opencodeTestResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${opencodeTestResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {opencodeTestResult.success\n ? (opencodeTestResult.opencodeTest?.message || 'OpenCode 可以正常工作')\n : (opencodeTestResult.opencodeTest?.error || opencodeTestResult.error || opencodeTestResult.suggestion || '请检查配置')}\n </p>\n {opencodeTestResult.checks && (\n <div className=\"mt-3 pt-3 border-t border-white/40\">\n <div className=\"grid grid-cols-3 gap-2\">\n {Object.entries(opencodeTestResult.checks).map(([key, value]) => {\n const labels: Record<string, string> = {\n hasBaseUrl: '网关',\n hasApiKey: 'API Key',\n hasDefaultModel: '默认模型',\n hasModels: '模型列表',\n };\n return (\n <div key={key} className=\"flex items-center gap-1.5\">\n {value ? (\n <svg className=\"w-3 h-3 text-emerald-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-rose-500 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n <span className=\"text-[10px] text-slate-600\">{labels[key] || key}</span>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setOpencodeConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n opencodeConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setOpencodeConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n opencodeConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {opencodeConfigSubTab === 'current' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">opencode.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {opencodeStatus?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(opencodeStatus.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">opencode.json(应用后将写入的合并结果)</span>\n </div>\n {opencodePreviewLoading ? (\n <div className=\"p-3.5 text-[10px] text-slate-400 font-mono\">加载中...</div>\n ) : (\n <textarea\n className=\"opencode-preview-textarea w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono bg-slate-950 border-0 focus:ring-0 focus:ring-offset-0 focus:outline-none resize-y max-h-96 overflow-y-auto placeholder:text-slate-500\n [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\"\n placeholder=\"暂无预览\"\n spellCheck={false}\n value={opencodePreviewText}\n onChange={(e) => setOpencodePreviewText(e.target.value)}\n />\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 opencode.json;「预览」为点击应用后将写入的合并结果(含 AAR 网关)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>选择默认模型后,在「预览」中查看合并结果,点击「应用配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.config/opencode/opencode.json(或 Windows %APPDATA%/opencode)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>「还原配置」恢复为应用前的备份;还原后请在「生效中」查看当前内容</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'openclaw' && (\n <div className=\"space-y-6\">\n {openclawStatus && (\n <div className=\"flex items-center justify-between py-3 px-4 bg-white/60 rounded-lg border border-slate-200/50\">\n <div className=\"flex items-center gap-3\">\n <div className={`w-6 h-6 rounded-full flex items-center justify-center ${\n openclawStatus.applied\n ? 'bg-emerald-100 text-emerald-600'\n : 'bg-slate-100 text-slate-400'\n }`}>\n {openclawStatus.applied ? (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01\" />\n </svg>\n )}\n </div>\n <div className=\"flex items-center gap-2.5\">\n <span className=\"text-sm font-medium text-slate-700\">\n {openclawStatus.applied ? '已配置' : '未配置'}\n </span>\n {openclawStatus.applied && openclawStatus.matchCurrentGateway !== undefined && (\n <span className={`inline-flex items-center px-2 py-0.5 text-[10px] font-medium rounded-full border ${\n openclawStatus.matchCurrentGateway\n ? 'bg-emerald-50/80 text-emerald-700 border-emerald-200/60'\n : 'bg-amber-50/80 text-amber-700 border-amber-200/60'\n }`}>\n {openclawStatus.matchCurrentGateway ? '匹配当前网关' : '不匹配'}\n </span>\n )}\n </div>\n </div>\n {openclawStatus.lastUpdated && (\n <div className=\"text-[11px] text-slate-400 font-mono\">\n {new Date(openclawStatus.lastUpdated).toLocaleString('zh-CN', {\n month: 'numeric', day: 'numeric', hour: '2-digit', minute: '2-digit'\n })}\n </div>\n )}\n </div>\n )}\n\n <div className=\"grid grid-cols-1 lg:grid-cols-2 gap-4\" ref={openClawDropdownRef}>\n {/* 默认模型 - 可搜索单选 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-indigo-100/80 text-indigo-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">默认模型</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'default' ? null : 'default'); }}\n className=\"w-full text-left appearance-none rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 pr-8 text-[11px] font-medium text-slate-700 shadow-sm focus:border-indigo-400 focus:ring-2 focus:ring-indigo-200/50 focus:outline-none cursor-pointer flex items-center justify-between\"\n >\n <span className=\"truncate\">\n {openclawModelsFlat.find((m) => m.model_id === openclawDefaultModel)?.name || openclawDefaultModel || '选择模型'}\n </span>\n <svg className=\"w-3 h-3 text-slate-400 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {openClawDropdown === 'default' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-indigo-200 focus:border-indigo-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered.map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawDefaultModel(model.model_id);\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-indigo-50 ${model.model_id === openclawDefaultModel ? 'bg-indigo-100 text-indigo-700 font-medium' : 'text-slate-700'}`}\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">主要使用的模型</p>\n </div>\n\n {/* 默认 Fallback - 可搜索多选,芯片展示,不可重复 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-amber-100/80 text-amber-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">默认 Fallback</span>\n </div>\n <div className=\"relative\">\n <div className=\"min-h-[38px] rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 flex flex-wrap gap-1.5 items-center\">\n {openclawDefaultFallbacks.length === 0 ? (\n <span className=\"text-[11px] text-slate-400\">从下方搜索并添加备用模型</span>\n ) : (\n openclawDefaultFallbacks.map((modelId) => {\n const m = openclawModelsFlat.find((x) => x.model_id === modelId);\n return (\n <span\n key={modelId}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md bg-amber-100 text-amber-800 text-[10px] font-medium\"\n >\n {m?.name || modelId}\n <button\n type=\"button\"\n onClick={() => setOpenclawDefaultFallbacks((prev) => prev.filter((id) => id !== modelId))}\n className=\"hover:bg-amber-200 rounded p-0.5\"\n aria-label=\"移除\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n );\n })\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'defaultFallbacks' ? null : 'defaultFallbacks'); }}\n className=\"mt-1.5 w-full text-left px-3 py-1.5 text-[11px] text-slate-500 border border-dashed border-slate-200 rounded-md hover:border-amber-300 hover:text-amber-700 hover:bg-amber-50/50\"\n >\n + 搜索并添加 Fallback 模型\n </button>\n {openClawDropdown === 'defaultFallbacks' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-amber-200 focus:border-amber-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered\n .filter((m) => !openclawDefaultFallbacks.includes(m.model_id))\n .map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawDefaultFallbacks((prev) => (prev.includes(model.model_id) ? prev : [...prev, model.model_id]));\n setOpenClawSearch('');\n }}\n className=\"w-full text-left px-3 py-2 text-[11px] text-slate-700 hover:bg-amber-50\"\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n {openclawModelsFiltered.filter((m) => !openclawDefaultFallbacks.includes(m.model_id)).length === 0 && (\n <li className=\"px-3 py-2 text-[11px] text-slate-400\">无更多可选或已全部添加</li>\n )}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">默认模型的备用模型,可多选,不可重复</p>\n </div>\n\n {/* 视觉模型 - 可搜索单选 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-rose-100/80 text-rose-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">视觉模型</span>\n </div>\n <div className=\"relative\">\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'image' ? null : 'image'); }}\n className=\"w-full text-left appearance-none rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 pr-8 text-[11px] font-medium text-slate-700 shadow-sm focus:border-rose-400 focus:ring-2 focus:ring-rose-200/50 focus:outline-none cursor-pointer flex items-center justify-between\"\n >\n <span className=\"truncate\">\n {openclawImageModel\n ? (openclawModelsFlat.find((m) => m.model_id === openclawImageModel)?.name || openclawImageModel)\n : '未设置'}\n </span>\n <svg className=\"w-3 h-3 text-slate-400 flex-shrink-0\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n {openClawDropdown === 'image' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-rose-200 focus:border-rose-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n <li>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageModel('');\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-rose-50 ${!openclawImageModel ? 'bg-rose-100 text-rose-700 font-medium' : 'text-slate-500'}`}\n >\n 未设置\n </button>\n </li>\n {openclawModelsFiltered.map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageModel(model.model_id);\n setOpenClawDropdown(null);\n setOpenClawSearch('');\n }}\n className={`w-full text-left px-3 py-2 text-[11px] hover:bg-rose-50 ${model.model_id === openclawImageModel ? 'bg-rose-100 text-rose-700 font-medium' : 'text-slate-700'}`}\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">用于图像理解(可选)</p>\n </div>\n\n {/* 视觉 Fallback - 可搜索多选,芯片展示,不可重复 */}\n <div className=\"bg-gradient-to-br from-white/50 to-transparent rounded-xl border border-slate-200/50 p-4 transition-all duration-300 hover:border-slate-300/60 hover:shadow-sm\">\n <div className=\"flex items-center gap-2.5 mb-2.5\">\n <div className=\"w-7 h-7 rounded-lg bg-emerald-100/80 text-emerald-600 flex items-center justify-center\">\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n </div>\n <span className=\"text-[11px] font-medium text-slate-700\">视觉 Fallback</span>\n </div>\n <div className=\"relative\">\n <div className=\"min-h-[38px] rounded-lg border border-slate-200/80 bg-white/90 px-3 py-2 flex flex-wrap gap-1.5 items-center\">\n {openclawImageFallbacks.length === 0 ? (\n <span className=\"text-[11px] text-slate-400\">从下方搜索并添加备用模型</span>\n ) : (\n openclawImageFallbacks.map((modelId) => {\n const m = openclawModelsFlat.find((x) => x.model_id === modelId);\n return (\n <span\n key={modelId}\n className=\"inline-flex items-center gap-1 px-2 py-0.5 rounded-md bg-emerald-100 text-emerald-800 text-[10px] font-medium\"\n >\n {m?.name || modelId}\n <button\n type=\"button\"\n onClick={() => setOpenclawImageFallbacks((prev) => prev.filter((id) => id !== modelId))}\n className=\"hover:bg-emerald-200 rounded p-0.5\"\n aria-label=\"移除\"\n >\n <svg className=\"w-3 h-3\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </span>\n );\n })\n )}\n </div>\n <button\n type=\"button\"\n onClick={() => { setOpenClawSearch(''); setOpenClawDropdown(openClawDropdown === 'imageFallbacks' ? null : 'imageFallbacks'); }}\n className=\"mt-1.5 w-full text-left px-3 py-1.5 text-[11px] text-slate-500 border border-dashed border-slate-200 rounded-md hover:border-emerald-300 hover:text-emerald-700 hover:bg-emerald-50/50\"\n >\n + 搜索并添加 Fallback 模型\n </button>\n {openClawDropdown === 'imageFallbacks' && (\n <div className=\"absolute z-20 mt-1 w-full rounded-lg border border-slate-200 bg-white shadow-lg py-1 max-h-56 overflow-hidden flex flex-col\">\n <input\n type=\"text\"\n placeholder=\"搜索模型...\"\n value={openClawSearch}\n onChange={(e) => setOpenClawSearch(e.target.value)}\n onKeyDown={(e) => e.stopPropagation()}\n className=\"mx-2 mb-1 px-2 py-1.5 text-[11px] border border-slate-200 rounded-md focus:ring-2 focus:ring-emerald-200 focus:border-emerald-400 focus:outline-none\"\n />\n <ul className=\"overflow-y-auto overscroll-contain max-h-44\">\n {openclawModelsFiltered\n .filter((m) => !openclawImageFallbacks.includes(m.model_id))\n .map((model) => (\n <li key={model.id}>\n <button\n type=\"button\"\n onClick={() => {\n setOpenclawImageFallbacks((prev) => (prev.includes(model.model_id) ? prev : [...prev, model.model_id]));\n setOpenClawSearch('');\n }}\n className=\"w-full text-left px-3 py-2 text-[11px] text-slate-700 hover:bg-emerald-50\"\n >\n {model.name}\n <span className=\"text-slate-400 ml-1\">({model.provider})</span>\n </button>\n </li>\n ))}\n {openclawModelsFiltered.filter((m) => !openclawImageFallbacks.includes(m.model_id)).length === 0 && (\n <li className=\"px-3 py-2 text-[11px] text-slate-400\">无更多可选或已全部添加</li>\n )}\n </ul>\n </div>\n )}\n </div>\n <p className=\"text-[10px] text-slate-500 mt-2\">视觉模型的备用模型,可多选,不可重复</p>\n </div>\n </div>\n\n <div className={`grid gap-3 pt-1 ${openclawEnabled ? 'grid-cols-3' : 'grid-cols-2'}`}>\n <button\n onClick={handleOpenClawApply}\n disabled={openclawApplying}\n className={`w-full px-4 py-2.5 text-xs font-medium rounded-lg border transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 ${\n openclawEnabled\n ? 'bg-white border-slate-200/80 text-slate-700 hover:border-slate-300 hover:bg-slate-50'\n : 'bg-slate-900 border-slate-900 text-white hover:bg-slate-800'\n }`}\n >\n {openclawApplying ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 应用中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n {openclawEnabled ? '更新配置' : '应用配置'}\n </>\n )}\n </button>\n\n {openclawEnabled && (\n <button\n onClick={handleOpenClawRestore}\n disabled={openclawRestoring}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:border-slate-300 hover:bg-slate-50 transition-all duration-200 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2\"\n >\n {openclawRestoring ? (\n <>\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 还原中\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n 还原配置\n </>\n )}\n </button>\n )}\n\n {openclawTesting ? (\n <button\n onClick={handleOpenClawCancelTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-amber-200/80 bg-amber-50 text-amber-700 hover:bg-amber-100 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"animate-spin w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"3\"></circle>\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"></path>\n </svg>\n 取消测试\n </button>\n ) : (\n <button\n onClick={handleOpenClawTest}\n className=\"w-full px-4 py-2.5 text-xs font-medium rounded-lg border border-slate-200/80 bg-white text-slate-700 hover:bg-slate-50 transition-all duration-200 flex items-center justify-center gap-2\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 10V3L4 14h7v7l9-11h-7z\" />\n </svg>\n 测试配置\n </button>\n )}\n </div>\n\n {openclawTestResult && (\n <div className={`rounded-lg border px-4 py-3 ${\n openclawTestResult.success\n ? 'bg-emerald-50/60 border-emerald-200/60'\n : 'bg-rose-50/60 border-rose-200/60'\n }`}>\n <div className=\"flex items-start gap-3\">\n <div className={`w-5 h-5 rounded-full flex items-center justify-center flex-shrink-0 mt-0.5 ${\n openclawTestResult.success ? 'bg-emerald-500' : 'bg-rose-500'\n }`}>\n {openclawTestResult.success ? (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M5 13l4 4L19 7\" />\n </svg>\n ) : (\n <svg className=\"w-3 h-3 text-white\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2.5} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n )}\n </div>\n <div className=\"flex-1\">\n <div className=\"text-xs font-medium mb-1\">\n {openclawTestResult.success ? '配置验证成功' : '配置验证失败'}\n </div>\n <p className={`text-[11px] ${openclawTestResult.success ? 'text-emerald-700/80' : 'text-rose-700/80'}`}>\n {openclawTestResult.success\n ? (openclawTestResult.openclawTest?.message || 'OpenClaw 可以正常工作')\n : (openclawTestResult.openclawTest?.error || openclawTestResult.error || openclawTestResult.suggestion || '请检查配置')}\n </p>\n {openclawTestResult.openclawTest?.stdout && (\n <div className=\"mt-2 text-[10px] text-slate-500 font-mono bg-white/50 p-2 rounded\">\n {openclawTestResult.openclawTest.stdout}\n </div>\n )}\n </div>\n </div>\n </div>\n )}\n\n <details className=\"group\" open>\n <summary className=\"cursor-pointer text-[11px] text-slate-500 hover:text-slate-700 list-none flex items-center gap-1.5 py-1\">\n <svg className=\"w-3 h-3 transition-transform group-open:rotate-90\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n <span>配置</span>\n </summary>\n <div className=\"mt-3\">\n <div className=\"flex border border-slate-200 rounded-t-lg overflow-hidden bg-slate-100/90\">\n <button\n type=\"button\"\n onClick={() => setOpenclawConfigSubTab('preview')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n openclawConfigSubTab === 'preview'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 预览\n </button>\n <button\n type=\"button\"\n onClick={() => setOpenclawConfigSubTab('current')}\n className={`flex-1 px-4 py-2.5 text-[11px] transition-all ${\n openclawConfigSubTab === 'current'\n ? 'bg-white text-slate-800 font-semibold shadow-sm'\n : 'text-slate-500 font-medium hover:bg-slate-200/80 hover:text-slate-600'\n }`}\n >\n 生效中\n </button>\n </div>\n <div className=\"relative overflow-hidden rounded-b-lg bg-slate-950 border border-slate-200 border-t-0\">\n {openclawConfigSubTab === 'preview' ? (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">openclaw.json(应用后将写入的合并结果)</span>\n </div>\n {openclawPreviewLoading ? (\n <div className=\"p-3.5 text-[10px] text-slate-400 font-mono\">加载中...</div>\n ) : (\n <textarea\n className=\"openclaw-preview-textarea w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono bg-slate-950 border-0 focus:ring-0 focus:ring-offset-0 focus:outline-none resize-y max-h-96 overflow-y-auto placeholder:text-slate-500\n [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\"\n placeholder=\"暂无预览\"\n spellCheck={false}\n value={openclawPreviewText}\n onChange={(e) => setOpenclawPreviewText(e.target.value)}\n />\n )}\n </>\n ) : (\n <>\n <div className=\"flex items-center gap-1.5 px-3 py-2 bg-slate-900 border-b border-slate-800\">\n <div className=\"flex gap-1.5\">\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n <div className=\"w-2.5 h-2.5 rounded-full bg-slate-600\"></div>\n </div>\n <span className=\"text-[10px] font-medium text-slate-400 ml-2\">openclaw.json(当前磁盘内容,还原后即更新)</span>\n </div>\n {openclawStatus?.config != null ? (\n <pre className=\"w-full min-h-[12rem] p-3.5 text-[10px] text-slate-300 font-mono overflow-auto max-h-96 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-track]:bg-slate-900 [&::-webkit-scrollbar-thumb]:bg-slate-600 [&::-webkit-scrollbar-thumb]:rounded-full\">\n {JSON.stringify(openclawStatus.config, null, 2)}\n </pre>\n ) : (\n <div className=\"p-3.5 text-[10px] text-slate-500 font-mono\">暂无配置文件</div>\n )}\n </>\n )}\n </div>\n </div>\n </details>\n\n <div className=\"rounded-lg border border-slate-200/50 bg-slate-50/60 px-4 py-3\">\n <div className=\"flex items-center gap-2 mb-2.5\">\n <svg className=\"w-4 h-4 text-slate-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <h3 className=\"text-xs font-semibold text-slate-700\">使用说明</h3>\n </div>\n <ul className=\"space-y-1.5 text-[10px] text-slate-600\">\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">1.</span>\n <span>「生效中」为当前磁盘上的 openclaw.json;「预览」为应用后将写入的合并结果(含 AAR 网关)</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">2.</span>\n <span>选择默认模型等后,在「预览」中查看合并结果,点击「应用配置」写入</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">3.</span>\n <span>配置文件位于 ~/.openclaw/openclaw.json</span>\n </li>\n <li className=\"flex gap-2\">\n <span className=\"text-slate-400\">4.</span>\n <span>「还原配置」恢复为应用前的备份;还原后请在「生效中」查看当前内容</span>\n </li>\n </ul>\n </div>\n </div>\n )}\n\n {activeTab === 'picoclaw' && (\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\n <div className=\"w-16 h-16 bg-slate-100 rounded-full flex items-center justify-center mb-4\">\n <svg className=\"w-8 h-8 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4\" />\n </svg>\n </div>\n <h3 className=\"text-sm font-medium text-slate-900 mb-1\">PicoClaw 支持即将推出</h3>\n <p className=\"text-xs text-slate-500 max-w-xs\">\n 我们将很快添加对 PicoClaw 的支持,敬请期待。\n </p>\n </div>\n )}\n </div>\n </div>\n </main>\n </div>\n );\n}\n"],"names":["IDEConfigPage","activeTab","setActiveTab","haikuModel","setHaikuModel","sonnetModel","setSonnetModel","opusModel","setOpusModel","defaultModel","setDefaultModel","reasoningModel","setReasoningModel","enabled","setEnabled","showPreview","setShowPreview","claudeConfigSubTab","setClaudeConfigSubTab","applying","setApplying","restoring","setRestoring","testing","setTesting","saving","setSaving","status","setStatus","models","setModels","loading","setLoading","testResult","setTestResult","opencodeDefaultModel","setOpencodeDefaultModel","opencodeStatus","setOpencodeStatus","opencodeApplying","setOpencodeApplying","opencodeRestoring","setOpencodeRestoring","opencodeTesting","setOpencodeTesting","opencodeSaving","setOpencodeSaving","opencodeTestResult","setOpencodeTestResult","opencodeModels","setOpencodeModels","opencodePreviewConfig","setOpencodePreviewConfig","opencodePreviewText","setOpencodePreviewText","opencodePreviewLoading","setOpencodePreviewLoading","opencodeConfigSubTab","setOpencodeConfigSubTab","openclawDefaultModel","setOpenclawDefaultModel","openclawDefaultFallbacks","setOpenclawDefaultFallbacks","openclawImageModel","setOpenclawImageModel","openclawImageFallbacks","setOpenclawImageFallbacks","openclawStatus","setOpenclawStatus","openclawApplying","setOpenclawApplying","openclawRestoring","setOpenclawRestoring","openclawTesting","setOpenclawTesting","openclawSaving","setOpenclawSaving","openclawTestResult","setOpenclawTestResult","openclawModels","setOpenclawModels","openclawPreviewConfig","setOpenclawPreviewConfig","openclawPreviewText","setOpenclawPreviewText","openclawPreviewLoading","setOpenclawPreviewLoading","openClawDropdown","setOpenClawDropdown","openClawSearch","setOpenClawSearch","openclawConfigSubTab","setOpenclawConfigSubTab","openClawDropdownRef","showToast","openclawModelsFlat","Object","entries","flatMap","provider","arr","map","m","openclawModelsFiltered","q","trim","toLowerCase","filter","name","includes","model_id","abortControllerRef","opencodeAbortRef","openclawAbortRef","loadStatus","res","fetch","data","json","mappingToUse","matchCurrentGateway","tempMapping","modelMapping","haiku","sonnet","opus","default","reasoning","applied","routerProvider","error","console","loadModels","loadOpenCodeStatus","toUse","tempDefaultModel","loadOpenCodeModels","loadOpenClawStatus","useTemp","tempDefaultFallbacks","tempImageModel","tempImageFallbacks","defaultFallbacks","imageModel","imageFallbacks","loadOpenClawModels","cancelled","encodeURIComponent","then","config","JSON","stringify","catch","finally","params","URLSearchParams","default_model","default_fallbacks","join","set","length","toString","onDocClick","e","current","contains","target","document","addEventListener","removeEventListener","allModels","values","flat","modelIds","firstModelId","validFallbacks","id","validImageFallbacks","handleApply","method","headers","body","success","handleRestore","handleTest","abort","AbortController","signal","suggestion","aborted","handleCancelTest","handleSave","isTemp","saveType","opencodeEnabled","handleOpenCodeApply","message","handleOpenCodeRestore","handleOpenCodeTest","err","handleOpenCodeSave","handleOpenCodeCancelTest","openclawEnabled","handleOpenClawApply","image_model","undefined","image_fallbacks","handleOpenClawRestore","handleOpenClawTest","handleOpenClawSave","handleOpenClawCancelTest","className","onClick","disabled","fill","stroke","viewBox","strokeLinecap","strokeLinejoin","strokeWidth","d","lastUpdated","Date","toLocaleString","month","day","hour","minute","key","label","icon","description","value","onChange","htmlFor","providerModels","model","backupExists","cx","cy","r","checks","labels","hasBaseUrl","hasApiKey","hasHaikuModel","hasSonnetModel","hasOpusModel","hasDefaultModel","hasReasoningModel","isFromAar","claudeTest","output","configSummary","baseUrl","apiKey","open","type","router_provider","env","ANTHROPIC_AUTH_TOKEN","currentGatewayApiKey","ANTHROPIC_BASE_URL","currentGatewayAddress","ANTHROPIC_DEFAULT_HAIKU_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_MODEL","ANTHROPIC_REASONING_MODEL","API_TIMEOUT_MS","CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC","hasCompletedOnboarding","opencodeTest","hasModels","placeholder","spellCheck","ref","find","onKeyDown","stopPropagation","modelId","x","prev","openclawTest","stdout"],"mappings":"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"}
|