ai-agent-router 0.2.0 → 0.2.2
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 +14 -0
- package/.next/build-manifest.json +2 -2
- package/.next/fallback-build-manifest.json +2 -2
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.js +4 -4
- package/.next/required-server-files.json +4 -4
- package/.next/routes-manifest.json +84 -0
- package/.next/server/app/_global-error/page.js +1 -1
- package/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/.next/server/app/_global-error.html +2 -2
- package/.next/server/app/_global-error.rsc +1 -1
- package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +2 -2
- package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/api/config/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/[...path]/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/models/route.js.nft.json +1 -1
- package/.next/server/app/api/gateway/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/apply/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/available-models/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/save/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/status/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/claude/test/route.js +1 -1
- package/.next/server/app/api/ide/claude/test/route.js.nft.json +1 -1
- package/.next/server/app/api/ide/openclaw/apply/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/apply/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/apply/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/apply/route.js +7 -0
- package/.next/server/app/api/ide/openclaw/apply/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/apply/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/apply/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/available-models/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/available-models/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/available-models/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/available-models/route.js +7 -0
- package/.next/server/app/api/ide/openclaw/available-models/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/available-models/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/available-models/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/preview/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/preview/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/preview/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/preview/route.js +7 -0
- package/.next/server/app/api/ide/openclaw/preview/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/preview/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/preview/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/restore/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/restore/route.js +6 -0
- package/.next/server/app/api/ide/openclaw/restore/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/restore/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/save/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/save/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/save/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/save/route.js +7 -0
- package/.next/server/app/api/ide/openclaw/save/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/save/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/save/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/status/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/status/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/status/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/status/route.js +7 -0
- package/.next/server/app/api/ide/openclaw/status/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/status/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/status/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/openclaw/test/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/openclaw/test/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/openclaw/test/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/openclaw/test/route.js +6 -0
- package/.next/server/app/api/ide/openclaw/test/route.js.map +5 -0
- package/.next/server/app/api/ide/openclaw/test/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/openclaw/test/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/apply/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/apply/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/apply/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/apply/route.js +7 -0
- package/.next/server/app/api/ide/opencode/apply/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/apply/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/apply/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/available-models/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/available-models/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/available-models/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/available-models/route.js +7 -0
- package/.next/server/app/api/ide/opencode/available-models/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/available-models/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/available-models/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/preview/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/preview/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/preview/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/preview/route.js +7 -0
- package/.next/server/app/api/ide/opencode/preview/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/preview/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/preview/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/restore/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/restore/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/restore/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/restore/route.js +6 -0
- package/.next/server/app/api/ide/opencode/restore/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/restore/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/restore/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/save/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/save/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/save/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/save/route.js +7 -0
- package/.next/server/app/api/ide/opencode/save/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/save/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/save/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/status/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/status/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/status/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/status/route.js +7 -0
- package/.next/server/app/api/ide/opencode/status/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/status/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/status/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/ide/opencode/test/route/app-paths-manifest.json +3 -0
- package/.next/server/app/api/ide/opencode/test/route/build-manifest.json +11 -0
- package/.next/server/app/api/ide/opencode/test/route/server-reference-manifest.json +4 -0
- package/.next/server/app/api/ide/opencode/test/route.js +6 -0
- package/.next/server/app/api/ide/opencode/test/route.js.map +5 -0
- package/.next/server/app/api/ide/opencode/test/route.js.nft.json +1 -0
- package/.next/server/app/api/ide/opencode/test/route_client-reference-manifest.js +2 -0
- package/.next/server/app/api/logs/route.js.nft.json +1 -1
- package/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/.next/server/app/api/providers/test/route.js.nft.json +1 -1
- package/.next/server/app/api/service/force-stop/route.js.nft.json +1 -1
- package/.next/server/app/api/service/start/route.js.nft.json +1 -1
- package/.next/server/app/api/service/status/route.js.nft.json +1 -1
- package/.next/server/app/api/service/stop/route.js.nft.json +1 -1
- package/.next/server/app/ide/page.js +2 -2
- package/.next/server/app/ide/page.js.nft.json +1 -1
- package/.next/server/app/ide/page_client-reference-manifest.js +1 -1
- package/.next/server/app/ide.html +1 -1
- package/.next/server/app/ide.rsc +3 -3
- package/.next/server/app/ide.segments/_full.segment.rsc +3 -3
- package/.next/server/app/ide.segments/_head.segment.rsc +1 -1
- package/.next/server/app/ide.segments/_index.segment.rsc +2 -2
- package/.next/server/app/ide.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/ide.segments/ide/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/ide.segments/ide.segment.rsc +1 -1
- package/.next/server/app/index.html +1 -1
- package/.next/server/app/index.rsc +2 -2
- package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/index.segments/_full.segment.rsc +2 -2
- package/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs/page.js +2 -2
- package/.next/server/app/logs/page.js.nft.json +1 -1
- package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/logs.html +1 -1
- package/.next/server/app/logs.rsc +3 -3
- package/.next/server/app/logs.segments/_full.segment.rsc +3 -3
- package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
- package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
- package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +2 -2
- package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
- package/.next/server/app/models/page.js +2 -2
- package/.next/server/app/models/page.js.nft.json +1 -1
- package/.next/server/app/models/page_client-reference-manifest.js +1 -1
- package/.next/server/app/models.html +1 -1
- package/.next/server/app/models.rsc +2 -2
- package/.next/server/app/models.segments/_full.segment.rsc +2 -2
- package/.next/server/app/models.segments/_head.segment.rsc +1 -1
- package/.next/server/app/models.segments/_index.segment.rsc +2 -2
- package/.next/server/app/models.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/models.segments/models/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/models.segments/models.segment.rsc +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers/page.js +2 -2
- package/.next/server/app/providers/page.js.nft.json +1 -1
- package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
- package/.next/server/app/providers.html +1 -1
- package/.next/server/app/providers.rsc +2 -2
- package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
- package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
- package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
- package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
- package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
- package/.next/server/app/providers.segments/providers.segment.rsc +1 -1
- package/.next/server/app-paths-manifest.json +14 -0
- package/.next/server/chunks/[root-of-the-server]__001d5756._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__001d5756._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__05f8578b._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__05f8578b._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__3a204d25._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3a204d25._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__43810962._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__43810962._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__760eaa16._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__760eaa16._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__7c298a19._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__7c298a19._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__85540228._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__85540228._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__97622908._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__97622908._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a02e6618._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a02e6618._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__af5b556a._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__af5b556a._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js +16 -16
- package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__cafe113e._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__cafe113e._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js +3 -0
- package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js.map +1 -0
- package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__f8949f88._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__f8949f88._.js.map +1 -1
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js.map +1 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js +3 -0
- package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js.map +1 -0
- package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js +3 -0
- package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js.map +1 -0
- package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js → [root-of-the-server]__81937253._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js.map → [root-of-the-server]__81937253._.js.map} +1 -1
- package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js → [root-of-the-server]__976ad963._.js} +2 -2
- package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js.map → [root-of-the-server]__976ad963._.js.map} +1 -1
- package/.next/server/chunks/ssr/_69468f4c._.js +3 -0
- package/.next/server/chunks/ssr/_69468f4c._.js.map +1 -0
- package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js +1 -1
- package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js.map +1 -1
- package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js +1 -1
- package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js.map +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +2 -2
- package/.next/server/server-reference-manifest.js +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/static/chunks/64f547b3bcd3aef4.js +1 -0
- package/.next/static/chunks/6992685fe009e8fd.css +1 -0
- package/.next/static/chunks/{b6b258e8582e47c4.js → 7c8b7cbb3339f139.js} +1 -1
- package/.next/static/chunks/8ccc14e022ff6de3.js +1 -0
- package/.next/types/routes.d.ts +15 -1
- package/.next/types/validator.ts +126 -0
- package/README.md +31 -4
- package/dist/.next/dev/types/validator.js +56 -0
- package/dist/.next/types/validator.js +56 -0
- package/dist/package.json +55 -0
- package/dist/src/app/api/config/route.js +17 -0
- package/dist/src/app/api/ide/claude/apply/route.js +126 -31
- package/dist/src/app/api/ide/claude/restore/route.js +30 -0
- package/dist/src/app/api/ide/claude/save/route.js +79 -0
- package/dist/src/app/api/ide/claude/status/route.js +6 -1
- package/dist/src/app/api/ide/openclaw/apply/route.js +92 -0
- package/dist/src/app/api/ide/openclaw/available-models/route.js +46 -0
- package/dist/src/app/api/ide/openclaw/build-config.js +101 -0
- package/dist/src/app/api/ide/openclaw/preview/route.js +49 -0
- package/dist/src/app/api/ide/openclaw/restore/route.js +24 -0
- package/dist/src/app/api/ide/openclaw/save/route.js +54 -0
- package/dist/src/app/api/ide/openclaw/status/route.js +139 -0
- package/dist/src/app/api/ide/openclaw/test/route.js +158 -0
- package/dist/src/app/api/ide/opencode/apply/route.js +89 -0
- package/dist/src/app/api/ide/opencode/available-models/route.js +46 -0
- package/dist/src/app/api/ide/opencode/build-config.js +54 -0
- package/dist/src/app/api/ide/opencode/preview/route.js +36 -0
- package/dist/src/app/api/ide/opencode/restore/route.js +40 -0
- package/dist/src/app/api/ide/opencode/save/route.js +123 -0
- package/dist/src/app/api/ide/opencode/status/route.js +106 -0
- package/dist/src/app/api/ide/opencode/test/route.js +136 -0
- package/dist/src/app/components/Footer.js +11 -0
- package/dist/src/app/ide/page.js +651 -81
- package/dist/src/app/layout.js +5 -1
- package/dist/src/app/logs/page.js +4 -2
- package/dist/src/db/database.js +44 -8
- package/package.json +1 -1
- package/src/app/api/config/route.ts +17 -0
- package/src/app/api/ide/claude/apply/route.ts +140 -31
- package/src/app/api/ide/claude/restore/route.ts +36 -1
- package/src/app/api/ide/claude/save/route.ts +91 -1
- package/src/app/api/ide/claude/status/route.ts +12 -2
- package/src/app/api/ide/openclaw/apply/route.ts +103 -0
- package/src/app/api/ide/openclaw/available-models/route.ts +59 -0
- package/src/app/api/ide/openclaw/build-config.ts +152 -0
- package/src/app/api/ide/openclaw/preview/route.ts +57 -0
- package/src/app/api/ide/openclaw/restore/route.ts +27 -0
- package/src/app/api/ide/openclaw/save/route.ts +67 -0
- package/src/app/api/ide/openclaw/status/route.ts +178 -0
- package/src/app/api/ide/openclaw/test/route.ts +194 -0
- package/src/app/api/ide/opencode/apply/route.ts +92 -0
- package/src/app/api/ide/opencode/available-models/route.ts +59 -0
- package/src/app/api/ide/opencode/build-config.ts +69 -0
- package/src/app/api/ide/opencode/preview/route.ts +40 -0
- package/src/app/api/ide/opencode/restore/route.ts +52 -0
- package/src/app/api/ide/opencode/save/route.ts +131 -0
- package/src/app/api/ide/opencode/status/route.ts +128 -0
- package/src/app/api/ide/opencode/test/route.ts +145 -0
- package/src/app/components/Footer.tsx +9 -0
- package/src/app/globals.css +17 -0
- package/src/app/ide/page.tsx +1587 -118
- package/src/app/layout.tsx +3 -1
- package/src/app/logs/page.tsx +4 -2
- package/src/db/database.ts +55 -8
- package/.next/server/chunks/ssr/src_app_b2b1d928._.js +0 -3
- package/.next/server/chunks/ssr/src_app_b2b1d928._.js.map +0 -1
- package/.next/static/chunks/6418ca50028376b7.css +0 -1
- package/.next/static/chunks/9ec3b97741b6575e.js +0 -1
- /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_buildManifest.js +0 -0
- /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_ssgManifest.js +0 -0
|
@@ -63,6 +63,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
63
63
|
{
|
|
64
64
|
const handler = {};
|
|
65
65
|
}
|
|
66
|
+
// Validate ../../../src/app/api/ide/openclaw/apply/route.ts
|
|
67
|
+
{
|
|
68
|
+
const handler = {};
|
|
69
|
+
}
|
|
70
|
+
// Validate ../../../src/app/api/ide/openclaw/available-models/route.ts
|
|
71
|
+
{
|
|
72
|
+
const handler = {};
|
|
73
|
+
}
|
|
74
|
+
// Validate ../../../src/app/api/ide/openclaw/preview/route.ts
|
|
75
|
+
{
|
|
76
|
+
const handler = {};
|
|
77
|
+
}
|
|
78
|
+
// Validate ../../../src/app/api/ide/openclaw/restore/route.ts
|
|
79
|
+
{
|
|
80
|
+
const handler = {};
|
|
81
|
+
}
|
|
82
|
+
// Validate ../../../src/app/api/ide/openclaw/save/route.ts
|
|
83
|
+
{
|
|
84
|
+
const handler = {};
|
|
85
|
+
}
|
|
86
|
+
// Validate ../../../src/app/api/ide/openclaw/status/route.ts
|
|
87
|
+
{
|
|
88
|
+
const handler = {};
|
|
89
|
+
}
|
|
90
|
+
// Validate ../../../src/app/api/ide/openclaw/test/route.ts
|
|
91
|
+
{
|
|
92
|
+
const handler = {};
|
|
93
|
+
}
|
|
94
|
+
// Validate ../../../src/app/api/ide/opencode/apply/route.ts
|
|
95
|
+
{
|
|
96
|
+
const handler = {};
|
|
97
|
+
}
|
|
98
|
+
// Validate ../../../src/app/api/ide/opencode/available-models/route.ts
|
|
99
|
+
{
|
|
100
|
+
const handler = {};
|
|
101
|
+
}
|
|
102
|
+
// Validate ../../../src/app/api/ide/opencode/preview/route.ts
|
|
103
|
+
{
|
|
104
|
+
const handler = {};
|
|
105
|
+
}
|
|
106
|
+
// Validate ../../../src/app/api/ide/opencode/restore/route.ts
|
|
107
|
+
{
|
|
108
|
+
const handler = {};
|
|
109
|
+
}
|
|
110
|
+
// Validate ../../../src/app/api/ide/opencode/save/route.ts
|
|
111
|
+
{
|
|
112
|
+
const handler = {};
|
|
113
|
+
}
|
|
114
|
+
// Validate ../../../src/app/api/ide/opencode/status/route.ts
|
|
115
|
+
{
|
|
116
|
+
const handler = {};
|
|
117
|
+
}
|
|
118
|
+
// Validate ../../../src/app/api/ide/opencode/test/route.ts
|
|
119
|
+
{
|
|
120
|
+
const handler = {};
|
|
121
|
+
}
|
|
66
122
|
// Validate ../../../src/app/api/logs/route.ts
|
|
67
123
|
{
|
|
68
124
|
const handler = {};
|
|
@@ -63,6 +63,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
63
63
|
{
|
|
64
64
|
const handler = {};
|
|
65
65
|
}
|
|
66
|
+
// Validate ../../src/app/api/ide/openclaw/apply/route.ts
|
|
67
|
+
{
|
|
68
|
+
const handler = {};
|
|
69
|
+
}
|
|
70
|
+
// Validate ../../src/app/api/ide/openclaw/available-models/route.ts
|
|
71
|
+
{
|
|
72
|
+
const handler = {};
|
|
73
|
+
}
|
|
74
|
+
// Validate ../../src/app/api/ide/openclaw/preview/route.ts
|
|
75
|
+
{
|
|
76
|
+
const handler = {};
|
|
77
|
+
}
|
|
78
|
+
// Validate ../../src/app/api/ide/openclaw/restore/route.ts
|
|
79
|
+
{
|
|
80
|
+
const handler = {};
|
|
81
|
+
}
|
|
82
|
+
// Validate ../../src/app/api/ide/openclaw/save/route.ts
|
|
83
|
+
{
|
|
84
|
+
const handler = {};
|
|
85
|
+
}
|
|
86
|
+
// Validate ../../src/app/api/ide/openclaw/status/route.ts
|
|
87
|
+
{
|
|
88
|
+
const handler = {};
|
|
89
|
+
}
|
|
90
|
+
// Validate ../../src/app/api/ide/openclaw/test/route.ts
|
|
91
|
+
{
|
|
92
|
+
const handler = {};
|
|
93
|
+
}
|
|
94
|
+
// Validate ../../src/app/api/ide/opencode/apply/route.ts
|
|
95
|
+
{
|
|
96
|
+
const handler = {};
|
|
97
|
+
}
|
|
98
|
+
// Validate ../../src/app/api/ide/opencode/available-models/route.ts
|
|
99
|
+
{
|
|
100
|
+
const handler = {};
|
|
101
|
+
}
|
|
102
|
+
// Validate ../../src/app/api/ide/opencode/preview/route.ts
|
|
103
|
+
{
|
|
104
|
+
const handler = {};
|
|
105
|
+
}
|
|
106
|
+
// Validate ../../src/app/api/ide/opencode/restore/route.ts
|
|
107
|
+
{
|
|
108
|
+
const handler = {};
|
|
109
|
+
}
|
|
110
|
+
// Validate ../../src/app/api/ide/opencode/save/route.ts
|
|
111
|
+
{
|
|
112
|
+
const handler = {};
|
|
113
|
+
}
|
|
114
|
+
// Validate ../../src/app/api/ide/opencode/status/route.ts
|
|
115
|
+
{
|
|
116
|
+
const handler = {};
|
|
117
|
+
}
|
|
118
|
+
// Validate ../../src/app/api/ide/opencode/test/route.ts
|
|
119
|
+
{
|
|
120
|
+
const handler = {};
|
|
121
|
+
}
|
|
66
122
|
// Validate ../../src/app/api/logs/route.ts
|
|
67
123
|
{
|
|
68
124
|
const handler = {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "ai-agent-router",
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "A unified API gateway for managing multiple AI model providers (Anthropic, OpenAI, Gemini, etc.)",
|
|
5
|
+
"main": "dist/src/cli/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"aar": "./dist/src/cli/index.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"dev": "next dev -p 9527",
|
|
11
|
+
"build": "next build && tsc",
|
|
12
|
+
"start": "node dist/src/cli/index.js start",
|
|
13
|
+
"stop": "node dist/src/cli/index.js stop",
|
|
14
|
+
"lint": "eslint .",
|
|
15
|
+
"pub": "npm run build && npm publish",
|
|
16
|
+
"type-check": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"api-gateway",
|
|
20
|
+
"ai",
|
|
21
|
+
"openai",
|
|
22
|
+
"anthropic",
|
|
23
|
+
"gemini",
|
|
24
|
+
"proxy"
|
|
25
|
+
],
|
|
26
|
+
"author": "",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@anthropic-ai/sdk": "^0.71.2",
|
|
30
|
+
"sql.js": "^1.13.0",
|
|
31
|
+
"commander": "^11.1.0",
|
|
32
|
+
"crypto-js": "^4.2.0",
|
|
33
|
+
"globals": "^17.0.0",
|
|
34
|
+
"next": "^16.1.6",
|
|
35
|
+
"react": "^18.2.0",
|
|
36
|
+
"react-dom": "^18.2.0",
|
|
37
|
+
"typescript-eslint": "^8.53.0",
|
|
38
|
+
"autoprefixer": "^10.4.0",
|
|
39
|
+
"postcss": "^8.4.0",
|
|
40
|
+
"tailwindcss": "^3.3.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/sql.js": "^1.4.9",
|
|
44
|
+
"@types/crypto-js": "^4.2.0",
|
|
45
|
+
"@types/node": "^20.10.0",
|
|
46
|
+
"@types/react": "^18.2.0",
|
|
47
|
+
"@types/react-dom": "^18.2.0",
|
|
48
|
+
"eslint": "^9.39.2",
|
|
49
|
+
"eslint-config-next": "^16.1.1",
|
|
50
|
+
"typescript": "^5.3.0"
|
|
51
|
+
},
|
|
52
|
+
"engines": {
|
|
53
|
+
"node": ">=18.0.0"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.runtime = void 0;
|
|
4
7
|
exports.GET = GET;
|
|
@@ -6,8 +9,15 @@ exports.POST = POST;
|
|
|
6
9
|
const server_1 = require("next/server");
|
|
7
10
|
const database_1 = require("@/db/database");
|
|
8
11
|
const queries_1 = require("@/db/queries");
|
|
12
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
9
13
|
// Ensure Node.js runtime (required for SQLite)
|
|
10
14
|
exports.runtime = 'nodejs';
|
|
15
|
+
/**
|
|
16
|
+
* 生成随机的 API Key(用于网关密码默认值)
|
|
17
|
+
*/
|
|
18
|
+
function generateRandomApiKey() {
|
|
19
|
+
return `aar-${crypto_1.default.randomBytes(16).toString('hex')}`;
|
|
20
|
+
}
|
|
11
21
|
async function GET(request) {
|
|
12
22
|
try {
|
|
13
23
|
// Initialize database on request (safer than module load)
|
|
@@ -22,6 +32,13 @@ async function GET(request) {
|
|
|
22
32
|
return server_1.NextResponse.json(config);
|
|
23
33
|
}
|
|
24
34
|
const configs = await (0, queries_1.getAllConfig)();
|
|
35
|
+
// 如果 api_key 为空,生成一个随机默认值
|
|
36
|
+
if (!configs.api_key) {
|
|
37
|
+
const defaultApiKey = generateRandomApiKey();
|
|
38
|
+
await (0, queries_1.setConfig)('api_key', defaultApiKey);
|
|
39
|
+
configs.api_key = defaultApiKey;
|
|
40
|
+
console.log('[Config API] Generated default API key');
|
|
41
|
+
}
|
|
25
42
|
return server_1.NextResponse.json(configs);
|
|
26
43
|
}
|
|
27
44
|
catch (error) {
|
|
@@ -11,6 +11,10 @@ const queries_1 = require("@/db/queries");
|
|
|
11
11
|
const CLAUDE_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude');
|
|
12
12
|
const SETTINGS_FILE = (0, path_1.join)(CLAUDE_DIR, 'settings.json');
|
|
13
13
|
const BACKUP_FILE = (0, path_1.join)(CLAUDE_DIR, 'settings.json.aar.bak');
|
|
14
|
+
// Claude 登录配置文件(用于 hasCompletedOnboarding)
|
|
15
|
+
const CLAUDE_JSON_FILE = (0, path_1.join)((0, os_1.homedir)(), '.claude.json');
|
|
16
|
+
// AAR 备份目录
|
|
17
|
+
const AAR_BACKUP_DIR = (0, path_1.join)((0, os_1.homedir)(), '.aar', 'backups');
|
|
14
18
|
// 默认模型映射
|
|
15
19
|
const DEFAULT_MODEL_MAPPING = {
|
|
16
20
|
haiku: 'GLM-4.5-air',
|
|
@@ -32,29 +36,61 @@ async function POST(request) {
|
|
|
32
36
|
// 获取当前网关地址和API Key(从数据库读取)
|
|
33
37
|
const gatewayAddress = await getGatewayAddress();
|
|
34
38
|
const gatewayApiKey = await getGatewayApiKey();
|
|
35
|
-
// 生成配置对象
|
|
36
39
|
const modelMapping = { haiku, sonnet, opus, default: defaultModel, reasoning: reasoningModel };
|
|
37
|
-
const
|
|
38
|
-
//
|
|
40
|
+
const aarEnv = buildAarEnv(gatewayAddress, gatewayApiKey, modelMapping);
|
|
41
|
+
// 在修改配置前,先备份到 ~/.aar/backups 目录
|
|
42
|
+
const settingsBackup = backupToAar(SETTINGS_FILE, 'settings');
|
|
43
|
+
const claudeJsonBackup = backupToAar(CLAUDE_JSON_FILE, 'claude');
|
|
44
|
+
if (!settingsBackup.success) {
|
|
45
|
+
console.warn('[Claude Apply] Settings backup warning:', settingsBackup.error);
|
|
46
|
+
}
|
|
47
|
+
if (!claudeJsonBackup.success) {
|
|
48
|
+
console.warn('[Claude Apply] Claude.json backup warning:', claudeJsonBackup.error);
|
|
49
|
+
}
|
|
39
50
|
const backupResult = backupOriginalConfig();
|
|
40
51
|
if (!backupResult.success) {
|
|
41
52
|
return server_1.NextResponse.json({ error: backupResult.error }, { status: 500 });
|
|
42
53
|
}
|
|
43
|
-
// 确保目录存在
|
|
44
54
|
if (!(0, fs_1.existsSync)(CLAUDE_DIR)) {
|
|
45
55
|
(0, fs_1.mkdirSync)(CLAUDE_DIR, { recursive: true });
|
|
46
56
|
}
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
let configToWrite;
|
|
58
|
+
if ((0, fs_1.existsSync)(SETTINGS_FILE)) {
|
|
59
|
+
try {
|
|
60
|
+
const existing = JSON.parse((0, fs_1.readFileSync)(SETTINGS_FILE, 'utf-8'));
|
|
61
|
+
configToWrite = {
|
|
62
|
+
...existing,
|
|
63
|
+
env: { ...(existing.env || {}), ...aarEnv },
|
|
64
|
+
router_provider: 'aar',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
configToWrite = generateClaudeConfig(gatewayAddress, gatewayApiKey, modelMapping);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
configToWrite = generateClaudeConfig(gatewayAddress, gatewayApiKey, modelMapping);
|
|
73
|
+
}
|
|
74
|
+
const validationResult = validateAndWriteConfig(configToWrite);
|
|
49
75
|
if (!validationResult.success) {
|
|
50
76
|
return server_1.NextResponse.json({ error: validationResult.error }, { status: 500 });
|
|
51
77
|
}
|
|
78
|
+
// 处理 ~/.claude.json,确保包含 hasCompletedOnboarding: true
|
|
79
|
+
const onboardingResult = ensureClaudeOnboarding();
|
|
80
|
+
if (!onboardingResult.success) {
|
|
81
|
+
console.warn('[Claude Apply] Onboarding update warning:', onboardingResult.error);
|
|
82
|
+
}
|
|
52
83
|
return server_1.NextResponse.json({
|
|
53
84
|
success: true,
|
|
54
85
|
message: 'Configuration applied successfully',
|
|
55
|
-
config,
|
|
86
|
+
config: configToWrite,
|
|
56
87
|
backup: backupResult.existed ? 'Created backup' : 'No existing config to backup',
|
|
57
88
|
previousWasFromAar: backupResult.existed && backupResult.isFromAar,
|
|
89
|
+
onboarding: onboardingResult.created ? 'Created ~/.claude.json' : 'Updated ~/.claude.json',
|
|
90
|
+
aarBackups: {
|
|
91
|
+
settings: settingsBackup.backupPath,
|
|
92
|
+
claudeJson: claudeJsonBackup.backupPath,
|
|
93
|
+
},
|
|
58
94
|
});
|
|
59
95
|
}
|
|
60
96
|
catch (error) {
|
|
@@ -80,50 +116,48 @@ async function getGatewayApiKey() {
|
|
|
80
116
|
const apiKeyConfig = await (0, queries_1.getConfig)('api_key');
|
|
81
117
|
return apiKeyConfig?.value || 'your-gateway-api-key';
|
|
82
118
|
}
|
|
83
|
-
/**
|
|
84
|
-
|
|
85
|
-
|
|
119
|
+
/** 仅生成 AAR 相关的 env 字段,用于合并到现有配置 */
|
|
120
|
+
function buildAarEnv(gatewayAddress, gatewayApiKey, modelMapping) {
|
|
121
|
+
return {
|
|
122
|
+
ANTHROPIC_AUTH_TOKEN: gatewayApiKey,
|
|
123
|
+
ANTHROPIC_BASE_URL: gatewayAddress,
|
|
124
|
+
ANTHROPIC_DEFAULT_HAIKU_MODEL: modelMapping.haiku,
|
|
125
|
+
ANTHROPIC_DEFAULT_OPUS_MODEL: modelMapping.opus,
|
|
126
|
+
ANTHROPIC_DEFAULT_SONNET_MODEL: modelMapping.sonnet,
|
|
127
|
+
ANTHROPIC_MODEL: modelMapping.default,
|
|
128
|
+
ANTHROPIC_REASONING_MODEL: modelMapping.reasoning,
|
|
129
|
+
API_TIMEOUT_MS: '3000000',
|
|
130
|
+
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1,
|
|
131
|
+
hasCompletedOnboarding: true,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** 生成完整 Claude 配置(仅在无现有文件时使用) */
|
|
86
135
|
function generateClaudeConfig(gatewayAddress, gatewayApiKey, modelMapping) {
|
|
87
136
|
return {
|
|
88
|
-
// 路由提供者标识,标识配置来自当前工具 aar
|
|
89
137
|
router_provider: 'aar',
|
|
90
|
-
env:
|
|
91
|
-
ANTHROPIC_AUTH_TOKEN: gatewayApiKey,
|
|
92
|
-
ANTHROPIC_BASE_URL: gatewayAddress,
|
|
93
|
-
ANTHROPIC_DEFAULT_HAIKU_MODEL: modelMapping.haiku,
|
|
94
|
-
ANTHROPIC_DEFAULT_OPUS_MODEL: modelMapping.opus,
|
|
95
|
-
ANTHROPIC_DEFAULT_SONNET_MODEL: modelMapping.sonnet,
|
|
96
|
-
ANTHROPIC_MODEL: modelMapping.default,
|
|
97
|
-
ANTHROPIC_REASONING_MODEL: modelMapping.reasoning,
|
|
98
|
-
API_TIMEOUT_MS: '3000000',
|
|
99
|
-
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: 1,
|
|
100
|
-
hasCompletedOnboarding: true,
|
|
101
|
-
},
|
|
138
|
+
env: buildAarEnv(gatewayAddress, gatewayApiKey, modelMapping),
|
|
102
139
|
};
|
|
103
140
|
}
|
|
104
141
|
/**
|
|
105
142
|
* 备份原有配置
|
|
106
|
-
*
|
|
143
|
+
* 仅在当前配置不是 AAR 时写入备份,这样「还原」才能恢复到应用 AAR 前的状态
|
|
107
144
|
*/
|
|
108
145
|
function backupOriginalConfig() {
|
|
109
146
|
try {
|
|
110
|
-
// 检查原有配置是否存在
|
|
111
147
|
const existing = (0, fs_1.existsSync)(SETTINGS_FILE);
|
|
112
148
|
if (existing) {
|
|
113
|
-
// 读取原有配置
|
|
114
149
|
const originalConfig = (0, fs_1.readFileSync)(SETTINGS_FILE, 'utf-8');
|
|
115
|
-
// 解析配置检查 router_provider
|
|
116
150
|
let isFromAar = false;
|
|
117
151
|
try {
|
|
118
152
|
const parsedConfig = JSON.parse(originalConfig);
|
|
119
153
|
isFromAar = parsedConfig.router_provider === 'aar';
|
|
120
154
|
}
|
|
121
|
-
catch
|
|
122
|
-
// 解析失败,不影响备份操作
|
|
155
|
+
catch {
|
|
123
156
|
isFromAar = false;
|
|
124
157
|
}
|
|
125
|
-
|
|
126
|
-
|
|
158
|
+
if (!isFromAar) {
|
|
159
|
+
(0, fs_1.writeFileSync)(BACKUP_FILE, originalConfig, 'utf-8');
|
|
160
|
+
}
|
|
127
161
|
return { success: true, existed: true, isFromAar };
|
|
128
162
|
}
|
|
129
163
|
return { success: true, existed: false, isFromAar: false };
|
|
@@ -157,3 +191,64 @@ function validateAndWriteConfig(config) {
|
|
|
157
191
|
};
|
|
158
192
|
}
|
|
159
193
|
}
|
|
194
|
+
/**
|
|
195
|
+
* 备份文件到 ~/.aar/backups 目录
|
|
196
|
+
*/
|
|
197
|
+
function backupToAar(filePath, backupName) {
|
|
198
|
+
try {
|
|
199
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
200
|
+
return { success: true }; // 文件不存在,无需备份
|
|
201
|
+
}
|
|
202
|
+
if (!(0, fs_1.existsSync)(AAR_BACKUP_DIR)) {
|
|
203
|
+
(0, fs_1.mkdirSync)(AAR_BACKUP_DIR, { recursive: true });
|
|
204
|
+
}
|
|
205
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
206
|
+
const backupPath = (0, path_1.join)(AAR_BACKUP_DIR, `${backupName}-${timestamp}.json`);
|
|
207
|
+
(0, fs_1.copyFileSync)(filePath, backupPath);
|
|
208
|
+
return { success: true, backupPath };
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return {
|
|
212
|
+
success: false,
|
|
213
|
+
error: `Backup to AAR failed: ${error.message}`,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 确保 ~/.claude.json 文件中包含 hasCompletedOnboarding: true
|
|
219
|
+
* 这允许用户跳过 Claude 登录使用自定义模型
|
|
220
|
+
*/
|
|
221
|
+
function ensureClaudeOnboarding() {
|
|
222
|
+
try {
|
|
223
|
+
let config = {};
|
|
224
|
+
let created = false;
|
|
225
|
+
if ((0, fs_1.existsSync)(CLAUDE_JSON_FILE)) {
|
|
226
|
+
try {
|
|
227
|
+
const content = (0, fs_1.readFileSync)(CLAUDE_JSON_FILE, 'utf-8');
|
|
228
|
+
config = JSON.parse(content);
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// 文件存在但解析失败,使用空对象
|
|
232
|
+
config = {};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
created = true;
|
|
237
|
+
}
|
|
238
|
+
// 检查是否已经有 hasCompletedOnboarding
|
|
239
|
+
if (config.hasCompletedOnboarding === true) {
|
|
240
|
+
return { success: true, created: false };
|
|
241
|
+
}
|
|
242
|
+
// 添加 hasCompletedOnboarding
|
|
243
|
+
config.hasCompletedOnboarding = true;
|
|
244
|
+
(0, fs_1.writeFileSync)(CLAUDE_JSON_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
245
|
+
return { success: true, created };
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
return {
|
|
249
|
+
success: false,
|
|
250
|
+
created: false,
|
|
251
|
+
error: `Failed to update claude.json: ${error.message}`,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
@@ -10,6 +10,8 @@ const os_1 = require("os");
|
|
|
10
10
|
const CLAUDE_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude');
|
|
11
11
|
const SETTINGS_FILE = (0, path_1.join)(CLAUDE_DIR, 'settings.json');
|
|
12
12
|
const BACKUP_FILE = (0, path_1.join)(CLAUDE_DIR, 'settings.json.aar.bak');
|
|
13
|
+
// AAR 备份目录
|
|
14
|
+
const AAR_BACKUP_DIR = (0, path_1.join)((0, os_1.homedir)(), '.aar', 'backups');
|
|
13
15
|
/**
|
|
14
16
|
* 还原 Claude IDE 配置
|
|
15
17
|
*/
|
|
@@ -26,6 +28,11 @@ async function POST(request) {
|
|
|
26
28
|
if (!(0, fs_1.existsSync)(CLAUDE_DIR)) {
|
|
27
29
|
return server_1.NextResponse.json({ error: 'Claude config directory does not exist' }, { status: 500 });
|
|
28
30
|
}
|
|
31
|
+
// 在还原前,先备份当前配置到 ~/.aar/backups 目录
|
|
32
|
+
const currentBackup = backupToAar(SETTINGS_FILE, 'settings-before-restore');
|
|
33
|
+
if (!currentBackup.success) {
|
|
34
|
+
console.warn('[IDE Restore] Current config backup warning:', currentBackup.error);
|
|
35
|
+
}
|
|
29
36
|
// 将备份内容复制到原配置文件
|
|
30
37
|
(0, fs_1.copyFileSync)(BACKUP_FILE, SETTINGS_FILE);
|
|
31
38
|
// 尝试解析备份内容以验证格式
|
|
@@ -71,3 +78,26 @@ async function DELETE(request) {
|
|
|
71
78
|
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
72
79
|
}
|
|
73
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* 备份文件到 ~/.aar/backups 目录
|
|
83
|
+
*/
|
|
84
|
+
function backupToAar(filePath, backupName) {
|
|
85
|
+
try {
|
|
86
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
87
|
+
return { success: true }; // 文件不存在,无需备份
|
|
88
|
+
}
|
|
89
|
+
if (!(0, fs_1.existsSync)(AAR_BACKUP_DIR)) {
|
|
90
|
+
(0, fs_1.mkdirSync)(AAR_BACKUP_DIR, { recursive: true });
|
|
91
|
+
}
|
|
92
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
93
|
+
const backupPath = (0, path_1.join)(AAR_BACKUP_DIR, `${backupName}-${timestamp}.json`);
|
|
94
|
+
(0, fs_1.copyFileSync)(filePath, backupPath);
|
|
95
|
+
return { success: true, backupPath };
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return {
|
|
99
|
+
success: false,
|
|
100
|
+
error: `Backup to AAR failed: ${error.message}`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -10,9 +10,13 @@ const queries_1 = require("@/db/queries");
|
|
|
10
10
|
// Claude settings.json 文件路径
|
|
11
11
|
const CLAUDE_DIR = (0, path_1.join)((0, os_1.homedir)(), '.claude');
|
|
12
12
|
const SETTINGS_FILE = (0, path_1.join)(CLAUDE_DIR, 'settings.json');
|
|
13
|
+
// Claude 登录配置文件(用于 hasCompletedOnboarding)
|
|
14
|
+
const CLAUDE_JSON_FILE = (0, path_1.join)((0, os_1.homedir)(), '.claude.json');
|
|
13
15
|
// AAR 临时配置目录和文件
|
|
14
16
|
const AAR_DIR = (0, path_1.join)((0, os_1.homedir)(), '.aar');
|
|
15
17
|
const TEMP_SETTINGS_FILE = (0, path_1.join)(AAR_DIR, 'settings.tmp.json');
|
|
18
|
+
// AAR 备份目录
|
|
19
|
+
const AAR_BACKUP_DIR = (0, path_1.join)(AAR_DIR, 'backups');
|
|
16
20
|
/**
|
|
17
21
|
* 保存 IDE 配置
|
|
18
22
|
* - 如果当前已应用配置( ~/.claude/settings.json 存在且匹配当前网关),直接更新 settings.json
|
|
@@ -47,6 +51,15 @@ async function POST(request) {
|
|
|
47
51
|
// 已应用当前网关配置,更新 settings.json
|
|
48
52
|
savePath = SETTINGS_FILE;
|
|
49
53
|
saveType = 'applied';
|
|
54
|
+
// 备份到 ~/.aar/backups 目录
|
|
55
|
+
const settingsBackup = backupToAar(SETTINGS_FILE, 'settings');
|
|
56
|
+
const claudeJsonBackup = backupToAar(CLAUDE_JSON_FILE, 'claude');
|
|
57
|
+
if (!settingsBackup.success) {
|
|
58
|
+
console.warn('[IDE Save] Settings backup warning:', settingsBackup.error);
|
|
59
|
+
}
|
|
60
|
+
if (!claudeJsonBackup.success) {
|
|
61
|
+
console.warn('[IDE Save] Claude.json backup warning:', claudeJsonBackup.error);
|
|
62
|
+
}
|
|
50
63
|
mergedConfig = generateClaudeConfig(gatewayAddress, gatewayApiKey, {
|
|
51
64
|
haiku: haiku,
|
|
52
65
|
sonnet: sonnet,
|
|
@@ -54,6 +67,11 @@ async function POST(request) {
|
|
|
54
67
|
default: defaultModel,
|
|
55
68
|
reasoning: reasoningModel
|
|
56
69
|
});
|
|
70
|
+
// 确保 ~/.claude.json 包含 hasCompletedOnboarding: true
|
|
71
|
+
const onboardingResult = ensureClaudeOnboarding();
|
|
72
|
+
if (!onboardingResult.success) {
|
|
73
|
+
console.warn('[IDE Save] Onboarding update warning:', onboardingResult.error);
|
|
74
|
+
}
|
|
57
75
|
}
|
|
58
76
|
else {
|
|
59
77
|
// 未应用网络关配置,保存到临时文件 ~/.aar/settings.tmp.json
|
|
@@ -149,3 +167,64 @@ function generateClaudeConfig(gatewayAddress, gatewayApiKey, modelMapping) {
|
|
|
149
167
|
},
|
|
150
168
|
};
|
|
151
169
|
}
|
|
170
|
+
/**
|
|
171
|
+
* 备份文件到 ~/.aar/backups 目录
|
|
172
|
+
*/
|
|
173
|
+
function backupToAar(filePath, backupName) {
|
|
174
|
+
try {
|
|
175
|
+
if (!(0, fs_1.existsSync)(filePath)) {
|
|
176
|
+
return { success: true }; // 文件不存在,无需备份
|
|
177
|
+
}
|
|
178
|
+
if (!(0, fs_1.existsSync)(AAR_BACKUP_DIR)) {
|
|
179
|
+
(0, fs_1.mkdirSync)(AAR_BACKUP_DIR, { recursive: true });
|
|
180
|
+
}
|
|
181
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
182
|
+
const backupPath = (0, path_1.join)(AAR_BACKUP_DIR, `${backupName}-${timestamp}.json`);
|
|
183
|
+
(0, fs_1.copyFileSync)(filePath, backupPath);
|
|
184
|
+
return { success: true, backupPath };
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
error: `Backup to AAR failed: ${error.message}`,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 确保 ~/.claude.json 文件中包含 hasCompletedOnboarding: true
|
|
195
|
+
* 这允许用户跳过 Claude 登录使用自定义模型
|
|
196
|
+
*/
|
|
197
|
+
function ensureClaudeOnboarding() {
|
|
198
|
+
try {
|
|
199
|
+
let config = {};
|
|
200
|
+
let created = false;
|
|
201
|
+
if ((0, fs_1.existsSync)(CLAUDE_JSON_FILE)) {
|
|
202
|
+
try {
|
|
203
|
+
const content = (0, fs_1.readFileSync)(CLAUDE_JSON_FILE, 'utf-8');
|
|
204
|
+
config = JSON.parse(content);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
// 文件存在但解析失败,使用空对象
|
|
208
|
+
config = {};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
created = true;
|
|
213
|
+
}
|
|
214
|
+
// 检查是否已经有 hasCompletedOnboarding
|
|
215
|
+
if (config.hasCompletedOnboarding === true) {
|
|
216
|
+
return { success: true, created: false };
|
|
217
|
+
}
|
|
218
|
+
// 添加 hasCompletedOnboarding
|
|
219
|
+
config.hasCompletedOnboarding = true;
|
|
220
|
+
(0, fs_1.writeFileSync)(CLAUDE_JSON_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
221
|
+
return { success: true, created };
|
|
222
|
+
}
|
|
223
|
+
catch (error) {
|
|
224
|
+
return {
|
|
225
|
+
success: false,
|
|
226
|
+
created: false,
|
|
227
|
+
error: `Failed to update claude.json: ${error.message}`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
}
|
|
@@ -45,6 +45,8 @@ async function GET(request) {
|
|
|
45
45
|
lastUpdated: undefined,
|
|
46
46
|
matchCurrentGateway: false,
|
|
47
47
|
routerProvider: undefined,
|
|
48
|
+
currentGatewayAddress: gatewayAddress,
|
|
49
|
+
currentGatewayApiKey: gatewayApiKey,
|
|
48
50
|
});
|
|
49
51
|
}
|
|
50
52
|
// 读取配置文件
|
|
@@ -78,7 +80,7 @@ async function GET(request) {
|
|
|
78
80
|
}
|
|
79
81
|
}
|
|
80
82
|
}
|
|
81
|
-
//
|
|
83
|
+
// 提取配置状态;返回完整 config 供前端在非 AAR 时展示原有配置文件
|
|
82
84
|
const status = {
|
|
83
85
|
applied: true,
|
|
84
86
|
modelMapping: extractModelMapping(config),
|
|
@@ -89,6 +91,9 @@ async function GET(request) {
|
|
|
89
91
|
matchCurrentGateway,
|
|
90
92
|
routerProvider: config.router_provider,
|
|
91
93
|
tempMapping,
|
|
94
|
+
config,
|
|
95
|
+
currentGatewayAddress: gatewayAddress,
|
|
96
|
+
currentGatewayApiKey: gatewayApiKey,
|
|
92
97
|
};
|
|
93
98
|
return server_1.NextResponse.json(status);
|
|
94
99
|
}
|