ai-agent-router 0.1.21 → 0.2.1
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/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 +1 -1
- 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/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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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]__1480f018._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1480f018._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1909f3aa._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1909f3aa._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__1d4b7fc5._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__1d4b7fc5._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__372ef2bf._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__372ef2bf._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__3aaf963c._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__3aaf963c._.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]__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]__6ce199d2._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__6ce199d2._.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]__772134c6._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__772134c6._.js.map +1 -1
- package/.next/server/chunks/[root-of-the-server]__7b77f523._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__7b77f523._.js.map +1 -1
- 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 +18 -18
- 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]__ccfc7f1d._.js +1 -1
- package/.next/server/chunks/[root-of-the-server]__ccfc7f1d._.js.map +1 -1
- 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]__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/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/static/chunks/0f120c117962200b.css +1 -0
- package/.next/static/chunks/64f547b3bcd3aef4.js +1 -0
- package/.next/static/chunks/{81c904164fe81379.js → 7c8b7cbb3339f139.js} +1 -1
- package/.next/static/chunks/8ed839b2e4948968.js +1 -0
- package/.next/types/routes.d.ts +15 -1
- package/.next/types/validator.ts +126 -0
- package/README.md +100 -111
- package/dist/.next/dev/types/validator.js +56 -0
- package/dist/.next/types/validator.js +56 -0
- package/dist/src/app/api/gateway/[...path]/route.js +1 -1
- package/dist/src/app/api/gateway/route.js +1 -1
- package/dist/src/app/api/ide/claude/apply/route.js +42 -31
- 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/api/logs/route.js +2 -2
- package/dist/src/app/api/models/route.js +5 -5
- package/dist/src/app/api/providers/route.js +4 -4
- package/dist/src/app/api/providers/test/route.js +1 -1
- package/dist/src/app/api/service/start/route.js +1 -1
- package/dist/src/app/api/service/status/route.js +1 -1
- package/dist/src/app/api/service/stop/route.js +1 -1
- package/dist/src/app/ide/page.js +591 -81
- package/dist/src/app/logs/page.js +15 -1
- package/dist/src/cli/index.js +218 -20
- package/dist/src/db/database.js +56 -5
- package/dist/src/db/queries.js +6 -6
- package/dist/src/server/logger.js +22 -4
- package/package.json +2 -1
- package/src/app/api/gateway/[...path]/route.ts +1 -1
- package/src/app/api/gateway/route.ts +1 -1
- package/src/app/api/ide/claude/apply/route.ts +46 -31
- 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/api/logs/route.ts +2 -2
- package/src/app/api/models/route.ts +5 -5
- package/src/app/api/providers/route.ts +4 -4
- package/src/app/api/providers/test/route.ts +1 -1
- package/src/app/api/service/start/route.ts +1 -1
- package/src/app/api/service/status/route.ts +1 -1
- package/src/app/api/service/stop/route.ts +1 -1
- package/src/app/globals.css +17 -0
- package/src/app/ide/page.tsx +1535 -132
- package/src/app/logs/page.tsx +17 -5
- package/src/cli/index.ts +228 -25
- package/src/db/database.ts +60 -8
- package/src/db/queries.ts +6 -6
- package/src/server/logger.ts +19 -4
- package/.next/static/chunks/6418ca50028376b7.css +0 -1
- package/.next/static/chunks/9ec3b97741b6575e.js +0 -1
- /package/.next/static/{PkfqdzwOZgX-UhSNUuhdp → dYin74gcpdlg8TGoGv-_d}/_buildManifest.js +0 -0
- /package/.next/static/{PkfqdzwOZgX-UhSNUuhdp → dYin74gcpdlg8TGoGv-_d}/_clientMiddlewareManifest.json +0 -0
- /package/.next/static/{PkfqdzwOZgX-UhSNUuhdp → dYin74gcpdlg8TGoGv-_d}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const build_config_1 = require("../build-config");
|
|
9
|
+
const OPENCODE_DIR = process.platform === 'win32'
|
|
10
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode')
|
|
11
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode');
|
|
12
|
+
const OPENCODE_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json');
|
|
13
|
+
const BACKUP_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json.aar.bak');
|
|
14
|
+
function backupOriginalConfig() {
|
|
15
|
+
try {
|
|
16
|
+
const existing = (0, fs_1.existsSync)(OPENCODE_FILE);
|
|
17
|
+
if (existing) {
|
|
18
|
+
const original = (0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8');
|
|
19
|
+
let isFromAar = false;
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(original);
|
|
22
|
+
isFromAar = !!(parsed.provider && parsed.provider['aar-gateway']);
|
|
23
|
+
}
|
|
24
|
+
catch { }
|
|
25
|
+
// 仅在当前配置不是 AAR 时写入备份,这样「还原」才能恢复到应用 AAR 前的状态;若已是 AAR 则保留原有备份不覆盖
|
|
26
|
+
if (!isFromAar) {
|
|
27
|
+
(0, fs_1.writeFileSync)(BACKUP_FILE, original, 'utf-8');
|
|
28
|
+
}
|
|
29
|
+
return { success: true, existed: true, isFromAar };
|
|
30
|
+
}
|
|
31
|
+
return { success: true, existed: false, isFromAar: false };
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return { success: false, existed: false, isFromAar: false, error: `Backup failed: ${error.message}` };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
async function POST(request) {
|
|
38
|
+
try {
|
|
39
|
+
const body = await request.json();
|
|
40
|
+
const { default_model: defaultModel, config: customConfigStr } = body;
|
|
41
|
+
let existing = null;
|
|
42
|
+
if ((0, fs_1.existsSync)(OPENCODE_FILE)) {
|
|
43
|
+
try {
|
|
44
|
+
existing = JSON.parse((0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8'));
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
existing = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
let config;
|
|
51
|
+
if (typeof customConfigStr === 'string' && customConfigStr.trim()) {
|
|
52
|
+
try {
|
|
53
|
+
config = JSON.parse(customConfigStr);
|
|
54
|
+
if (!config || typeof config !== 'object')
|
|
55
|
+
throw new Error('Invalid config object');
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
return server_1.NextResponse.json({ error: 'Invalid config JSON: ' + (e.message || 'parse error') }, { status: 400 });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (defaultModel === undefined || defaultModel === '') {
|
|
63
|
+
return server_1.NextResponse.json({ error: 'Missing required field: default_model' }, { status: 400 });
|
|
64
|
+
}
|
|
65
|
+
config = await (0, build_config_1.buildMergedConfig)(defaultModel, existing);
|
|
66
|
+
}
|
|
67
|
+
const backupResult = backupOriginalConfig();
|
|
68
|
+
if (!backupResult.success) {
|
|
69
|
+
return server_1.NextResponse.json({ error: backupResult.error }, { status: 500 });
|
|
70
|
+
}
|
|
71
|
+
if (!(0, fs_1.existsSync)(OPENCODE_DIR)) {
|
|
72
|
+
(0, fs_1.mkdirSync)(OPENCODE_DIR, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
const jsonString = JSON.stringify(config, null, 2);
|
|
75
|
+
(0, fs_1.writeFileSync)(OPENCODE_FILE, jsonString, 'utf-8');
|
|
76
|
+
const alreadyHadAar = !!(existing?.provider?.['aar-gateway']);
|
|
77
|
+
return server_1.NextResponse.json({
|
|
78
|
+
success: true,
|
|
79
|
+
message: alreadyHadAar ? 'OpenCode 配置已更新为最新网关信息' : 'OpenCode configuration applied successfully',
|
|
80
|
+
config,
|
|
81
|
+
backup: backupResult.existed ? 'Created backup' : 'No existing config to backup',
|
|
82
|
+
previousWasFromAar: backupResult.existed && backupResult.isFromAar,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error('OpenCode Apply API error:', error);
|
|
87
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const queries_1 = require("@/db/queries");
|
|
6
|
+
/**
|
|
7
|
+
* 查询可用模型列表(与 Claude 共用网关,用于 OpenCode 配置)
|
|
8
|
+
*/
|
|
9
|
+
async function GET(request) {
|
|
10
|
+
try {
|
|
11
|
+
const allModels = (await (0, queries_1.getAllModels)()).filter((m) => m.enabled);
|
|
12
|
+
if (allModels.length === 0) {
|
|
13
|
+
return server_1.NextResponse.json({
|
|
14
|
+
models: {},
|
|
15
|
+
count: 0,
|
|
16
|
+
message: 'No enabled models found. Please enable some models first.',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
const grouped = await allModels.reduce(async (acc, model) => {
|
|
20
|
+
const resolvedAcc = await acc;
|
|
21
|
+
const provider = await (0, queries_1.getProviderById)(model.provider_id);
|
|
22
|
+
if (provider) {
|
|
23
|
+
if (!resolvedAcc[provider.name])
|
|
24
|
+
resolvedAcc[provider.name] = [];
|
|
25
|
+
resolvedAcc[provider.name].push({
|
|
26
|
+
id: model.id,
|
|
27
|
+
name: model.name,
|
|
28
|
+
model_id: model.model_id,
|
|
29
|
+
provider_id: model.provider_id,
|
|
30
|
+
provider_name: provider.name,
|
|
31
|
+
enabled: model.enabled,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return resolvedAcc;
|
|
35
|
+
}, Promise.resolve({}));
|
|
36
|
+
return server_1.NextResponse.json({
|
|
37
|
+
models: grouped,
|
|
38
|
+
count: allModels.length,
|
|
39
|
+
providers: Object.keys(grouped),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.error('OpenCode Available Models API error:', error);
|
|
44
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getGatewayAddress = getGatewayAddress;
|
|
4
|
+
exports.getGatewayApiKey = getGatewayApiKey;
|
|
5
|
+
exports.buildAarGatewayProvider = buildAarGatewayProvider;
|
|
6
|
+
exports.mergeConfigWithAar = mergeConfigWithAar;
|
|
7
|
+
exports.buildMergedConfig = buildMergedConfig;
|
|
8
|
+
const database_1 = require("@/db/database");
|
|
9
|
+
const queries_1 = require("@/db/queries");
|
|
10
|
+
const queries_2 = require("@/db/queries");
|
|
11
|
+
async function getGatewayAddress() {
|
|
12
|
+
await (0, database_1.getDatabase)();
|
|
13
|
+
const portConfig = await (0, queries_1.getConfig)('port');
|
|
14
|
+
const port = portConfig?.value || '1357';
|
|
15
|
+
return `http://localhost:${port}/v1`;
|
|
16
|
+
}
|
|
17
|
+
async function getGatewayApiKey() {
|
|
18
|
+
await (0, database_1.getDatabase)();
|
|
19
|
+
const apiKeyConfig = await (0, queries_1.getConfig)('api_key');
|
|
20
|
+
return apiKeyConfig?.value || 'your-gateway-api-key';
|
|
21
|
+
}
|
|
22
|
+
async function buildAarGatewayProvider() {
|
|
23
|
+
const gatewayAddress = await getGatewayAddress();
|
|
24
|
+
const gatewayApiKey = await getGatewayApiKey();
|
|
25
|
+
const allModels = (await (0, queries_2.getAllModels)()).filter((m) => m.enabled);
|
|
26
|
+
const models = {};
|
|
27
|
+
for (const m of allModels) {
|
|
28
|
+
await (0, queries_2.getProviderById)(m.provider_id);
|
|
29
|
+
models[m.model_id] = { name: m.name, limit: { context: 128000, output: 65536 } };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
npm: '@ai-sdk/openai-compatible',
|
|
33
|
+
name: 'AAR Model Router',
|
|
34
|
+
options: { baseURL: gatewayAddress, apiKey: gatewayApiKey },
|
|
35
|
+
models,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const AAR_PROVIDER_ID = 'aar-gateway';
|
|
39
|
+
/** 合并现有配置与 AAR 网关:写入 config.provider["aar-gateway"],并设置 config.model = "aar-gateway/{defaultModel}" */
|
|
40
|
+
function mergeConfigWithAar(existing, defaultModel, aarProvider) {
|
|
41
|
+
const base = existing && typeof existing === 'object' ? { ...existing } : {};
|
|
42
|
+
const provider = base.provider && typeof base.provider === 'object' ? { ...base.provider } : {};
|
|
43
|
+
provider[AAR_PROVIDER_ID] = aarProvider;
|
|
44
|
+
return {
|
|
45
|
+
...base,
|
|
46
|
+
provider,
|
|
47
|
+
model: `${AAR_PROVIDER_ID}/${defaultModel}`,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** 生成合并后的配置(不写入磁盘),供预览或应用使用 */
|
|
51
|
+
async function buildMergedConfig(defaultModel, existing) {
|
|
52
|
+
const aarProvider = await buildAarGatewayProvider();
|
|
53
|
+
return mergeConfigWithAar(existing, defaultModel, aarProvider);
|
|
54
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const build_config_1 = require("../build-config");
|
|
9
|
+
const OPENCODE_FILE = process.platform === 'win32'
|
|
10
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode', 'opencode.json')
|
|
11
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode', 'opencode.json');
|
|
12
|
+
/** GET ?default_model=xxx 返回配置预览:始终返回「现有配置 + AAR provider + 默认模型」的合并结果,即应用后将写入的内容 */
|
|
13
|
+
async function GET(request) {
|
|
14
|
+
try {
|
|
15
|
+
const { searchParams } = new URL(request.url);
|
|
16
|
+
const defaultModel = searchParams.get('default_model') || '';
|
|
17
|
+
if (!defaultModel) {
|
|
18
|
+
return server_1.NextResponse.json({ error: 'Missing query: default_model' }, { status: 400 });
|
|
19
|
+
}
|
|
20
|
+
let existing = null;
|
|
21
|
+
if ((0, fs_1.existsSync)(OPENCODE_FILE)) {
|
|
22
|
+
try {
|
|
23
|
+
existing = JSON.parse((0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8'));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
/* 文件损坏时 existing 保持 null */
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const config = await (0, build_config_1.buildMergedConfig)(defaultModel, existing);
|
|
30
|
+
return server_1.NextResponse.json({ config });
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
console.error('OpenCode Preview API error:', error);
|
|
34
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const OPENCODE_DIR = process.platform === 'win32'
|
|
9
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode')
|
|
10
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode');
|
|
11
|
+
const OPENCODE_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json');
|
|
12
|
+
const BACKUP_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json.aar.bak');
|
|
13
|
+
async function POST(request) {
|
|
14
|
+
try {
|
|
15
|
+
if (!(0, fs_1.existsSync)(BACKUP_FILE)) {
|
|
16
|
+
return server_1.NextResponse.json({ error: 'No backup file found. Please apply configuration first before restoring.' }, { status: 404 });
|
|
17
|
+
}
|
|
18
|
+
const backupContent = (0, fs_1.readFileSync)(BACKUP_FILE, 'utf-8');
|
|
19
|
+
if (!(0, fs_1.existsSync)(OPENCODE_DIR)) {
|
|
20
|
+
return server_1.NextResponse.json({ error: 'OpenCode config directory does not exist' }, { status: 500 });
|
|
21
|
+
}
|
|
22
|
+
(0, fs_1.copyFileSync)(BACKUP_FILE, OPENCODE_FILE);
|
|
23
|
+
let parsedBackup;
|
|
24
|
+
try {
|
|
25
|
+
parsedBackup = JSON.parse(backupContent);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return server_1.NextResponse.json({ error: 'Backup file is corrupted or invalid JSON', backupContent }, { status: 500 });
|
|
29
|
+
}
|
|
30
|
+
return server_1.NextResponse.json({
|
|
31
|
+
success: true,
|
|
32
|
+
message: 'OpenCode configuration restored successfully',
|
|
33
|
+
config: parsedBackup,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
console.error('OpenCode Restore API error:', error);
|
|
38
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const database_1 = require("@/db/database");
|
|
9
|
+
const queries_1 = require("@/db/queries");
|
|
10
|
+
const build_config_1 = require("../build-config");
|
|
11
|
+
const OPENCODE_DIR = process.platform === 'win32'
|
|
12
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode')
|
|
13
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode');
|
|
14
|
+
const OPENCODE_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json');
|
|
15
|
+
const BACKUP_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json.aar.bak');
|
|
16
|
+
const AAR_DIR = (0, path_1.join)((0, os_1.homedir)(), '.aar');
|
|
17
|
+
const TEMP_OPENCODE_FILE = (0, path_1.join)(AAR_DIR, 'opencode.tmp.json');
|
|
18
|
+
function backupIfExists() {
|
|
19
|
+
try {
|
|
20
|
+
if ((0, fs_1.existsSync)(OPENCODE_FILE)) {
|
|
21
|
+
const original = (0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8');
|
|
22
|
+
(0, fs_1.writeFileSync)(BACKUP_FILE, original, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
return { success: true };
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
return { success: false, error: `Backup failed: ${error.message}` };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async function getGatewayAddress() {
|
|
31
|
+
await (0, database_1.getDatabase)();
|
|
32
|
+
const portConfig = await (0, queries_1.getConfig)('port');
|
|
33
|
+
return `http://localhost:${portConfig?.value || '1357'}/v1`;
|
|
34
|
+
}
|
|
35
|
+
async function getGatewayApiKey() {
|
|
36
|
+
await (0, database_1.getDatabase)();
|
|
37
|
+
const apiKeyConfig = await (0, queries_1.getConfig)('api_key');
|
|
38
|
+
return apiKeyConfig?.value || 'your-gateway-api-key';
|
|
39
|
+
}
|
|
40
|
+
async function POST(request) {
|
|
41
|
+
try {
|
|
42
|
+
const body = await request.json();
|
|
43
|
+
const { default_model: defaultModel, config: customConfigStr } = body;
|
|
44
|
+
// 若前端传了编辑后的 config,直接写入 opencode.json(与「应用配置」一致)
|
|
45
|
+
if (typeof customConfigStr === 'string' && customConfigStr.trim()) {
|
|
46
|
+
let config;
|
|
47
|
+
try {
|
|
48
|
+
config = JSON.parse(customConfigStr);
|
|
49
|
+
if (!config || typeof config !== 'object')
|
|
50
|
+
throw new Error('Invalid config object');
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return server_1.NextResponse.json({ error: 'Invalid config JSON: ' + (e.message || 'parse error') }, { status: 400 });
|
|
54
|
+
}
|
|
55
|
+
const backupResult = backupIfExists();
|
|
56
|
+
if (!backupResult.success) {
|
|
57
|
+
return server_1.NextResponse.json({ error: backupResult.error }, { status: 500 });
|
|
58
|
+
}
|
|
59
|
+
if (!(0, fs_1.existsSync)(OPENCODE_DIR))
|
|
60
|
+
(0, fs_1.mkdirSync)(OPENCODE_DIR, { recursive: true });
|
|
61
|
+
(0, fs_1.writeFileSync)(OPENCODE_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
62
|
+
return server_1.NextResponse.json({
|
|
63
|
+
success: true,
|
|
64
|
+
message: '配置已更新到 OpenCode',
|
|
65
|
+
saveType: 'applied',
|
|
66
|
+
savePath: '~/.config/opencode/opencode.json',
|
|
67
|
+
config,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (defaultModel === undefined || defaultModel === '') {
|
|
71
|
+
return server_1.NextResponse.json({ error: 'No default model provided' }, { status: 400 });
|
|
72
|
+
}
|
|
73
|
+
const gatewayAddress = await getGatewayAddress();
|
|
74
|
+
const gatewayApiKey = await getGatewayApiKey();
|
|
75
|
+
const fileExists = (0, fs_1.existsSync)(OPENCODE_FILE);
|
|
76
|
+
let current = null;
|
|
77
|
+
if (fileExists) {
|
|
78
|
+
try {
|
|
79
|
+
current = JSON.parse((0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8'));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
current = null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const aar = current?.provider?.['aar-gateway'];
|
|
86
|
+
const isCurrentGatewayApplied = !!aar &&
|
|
87
|
+
aar?.options?.baseURL === gatewayAddress &&
|
|
88
|
+
aar?.options?.apiKey === gatewayApiKey;
|
|
89
|
+
let savePath;
|
|
90
|
+
let saveType;
|
|
91
|
+
let mergedConfig;
|
|
92
|
+
if (fileExists && isCurrentGatewayApplied && current) {
|
|
93
|
+
mergedConfig = await (0, build_config_1.buildMergedConfig)(defaultModel, current);
|
|
94
|
+
savePath = OPENCODE_FILE;
|
|
95
|
+
saveType = 'applied';
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
savePath = TEMP_OPENCODE_FILE;
|
|
99
|
+
saveType = 'temp';
|
|
100
|
+
mergedConfig = {
|
|
101
|
+
defaultModel,
|
|
102
|
+
isTemp: true,
|
|
103
|
+
savedAt: new Date().toISOString(),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const targetDir = savePath === OPENCODE_FILE ? OPENCODE_DIR : AAR_DIR;
|
|
107
|
+
if (!(0, fs_1.existsSync)(targetDir)) {
|
|
108
|
+
(0, fs_1.mkdirSync)(targetDir, { recursive: true });
|
|
109
|
+
}
|
|
110
|
+
(0, fs_1.writeFileSync)(savePath, JSON.stringify(mergedConfig, null, 2), 'utf-8');
|
|
111
|
+
return server_1.NextResponse.json({
|
|
112
|
+
success: true,
|
|
113
|
+
message: saveType === 'applied' ? '配置已更新到 OpenCode' : '配置已保存(临时)',
|
|
114
|
+
saveType,
|
|
115
|
+
savePath: savePath === OPENCODE_FILE ? '~/.config/opencode/opencode.json' : '~/.aar/opencode.tmp.json',
|
|
116
|
+
config: mergedConfig,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error('OpenCode Save API error:', error);
|
|
121
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const database_1 = require("@/db/database");
|
|
9
|
+
const queries_1 = require("@/db/queries");
|
|
10
|
+
// OpenCode 配置文件路径(XDG)
|
|
11
|
+
const OPENCODE_DIR = process.platform === 'win32'
|
|
12
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode')
|
|
13
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode');
|
|
14
|
+
const OPENCODE_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json');
|
|
15
|
+
const BACKUP_FILE = (0, path_1.join)(OPENCODE_DIR, 'opencode.json.aar.bak');
|
|
16
|
+
const AAR_DIR = (0, path_1.join)((0, os_1.homedir)(), '.aar');
|
|
17
|
+
const TEMP_OPENCODE_FILE = (0, path_1.join)(AAR_DIR, 'opencode.tmp.json');
|
|
18
|
+
function maskApiKey(apiKey) {
|
|
19
|
+
if (!apiKey || apiKey === 'your-gateway-api-key')
|
|
20
|
+
return apiKey;
|
|
21
|
+
if (apiKey.length <= 8)
|
|
22
|
+
return apiKey.slice(0, 2) + '***' + apiKey.slice(-2);
|
|
23
|
+
return apiKey.slice(0, 4) + '****' + apiKey.slice(-4);
|
|
24
|
+
}
|
|
25
|
+
async function GET(request) {
|
|
26
|
+
try {
|
|
27
|
+
const fileExists = (0, fs_1.existsSync)(OPENCODE_FILE);
|
|
28
|
+
const backupExists = (0, fs_1.existsSync)(BACKUP_FILE);
|
|
29
|
+
await (0, database_1.getDatabase)();
|
|
30
|
+
const gatewayApiKeyConfig = await (0, queries_1.getConfig)('api_key');
|
|
31
|
+
const portConfig = await (0, queries_1.getConfig)('port');
|
|
32
|
+
const gatewayApiKey = gatewayApiKeyConfig?.value || 'your-gateway-api-key';
|
|
33
|
+
const gatewayAddress = `http://localhost:${portConfig?.value || '1357'}/v1`;
|
|
34
|
+
if (!fileExists) {
|
|
35
|
+
let tempDefaultModel;
|
|
36
|
+
if ((0, fs_1.existsSync)(TEMP_OPENCODE_FILE)) {
|
|
37
|
+
try {
|
|
38
|
+
const temp = JSON.parse((0, fs_1.readFileSync)(TEMP_OPENCODE_FILE, 'utf-8'));
|
|
39
|
+
tempDefaultModel = temp.defaultModel;
|
|
40
|
+
}
|
|
41
|
+
catch { }
|
|
42
|
+
}
|
|
43
|
+
return server_1.NextResponse.json({
|
|
44
|
+
applied: false,
|
|
45
|
+
defaultModel: undefined,
|
|
46
|
+
gatewayAddress,
|
|
47
|
+
apiKey: maskApiKey(gatewayApiKey),
|
|
48
|
+
backupExists: false,
|
|
49
|
+
lastUpdated: undefined,
|
|
50
|
+
matchCurrentGateway: false,
|
|
51
|
+
routerProvider: undefined,
|
|
52
|
+
tempDefaultModel,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
const content = (0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8');
|
|
56
|
+
let config;
|
|
57
|
+
try {
|
|
58
|
+
config = JSON.parse(content);
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return server_1.NextResponse.json({ error: 'Invalid opencode.json format' }, { status: 500 });
|
|
62
|
+
}
|
|
63
|
+
const providerMap = config.provider && typeof config.provider === 'object' ? config.provider : {};
|
|
64
|
+
const aarProvider = providerMap['aar-gateway'];
|
|
65
|
+
const provider = aarProvider;
|
|
66
|
+
const appliedBaseUrl = provider?.options?.baseURL;
|
|
67
|
+
const appliedApiKey = provider?.options?.apiKey;
|
|
68
|
+
const matchCurrentGateway = appliedBaseUrl === gatewayAddress && appliedApiKey === gatewayApiKey;
|
|
69
|
+
const defaultModel = typeof config.model === 'string' && config.model.startsWith('aar-gateway/')
|
|
70
|
+
? config.model.slice('aar-gateway/'.length)
|
|
71
|
+
: config.default_model;
|
|
72
|
+
const modelsCount = provider?.models ? Object.keys(provider.models).length : 0;
|
|
73
|
+
let tempDefaultModel;
|
|
74
|
+
if (!matchCurrentGateway && (0, fs_1.existsSync)(TEMP_OPENCODE_FILE)) {
|
|
75
|
+
try {
|
|
76
|
+
const temp = JSON.parse((0, fs_1.readFileSync)(TEMP_OPENCODE_FILE, 'utf-8'));
|
|
77
|
+
tempDefaultModel = temp.defaultModel;
|
|
78
|
+
}
|
|
79
|
+
catch { }
|
|
80
|
+
}
|
|
81
|
+
let lastUpdated = null;
|
|
82
|
+
try {
|
|
83
|
+
lastUpdated = new Date((0, fs_1.statSync)(OPENCODE_FILE).mtime).toISOString();
|
|
84
|
+
}
|
|
85
|
+
catch { }
|
|
86
|
+
const status = {
|
|
87
|
+
applied: true,
|
|
88
|
+
defaultModel,
|
|
89
|
+
gatewayAddress: appliedBaseUrl,
|
|
90
|
+
apiKey: maskApiKey(appliedApiKey || gatewayApiKey),
|
|
91
|
+
backupExists,
|
|
92
|
+
lastUpdated,
|
|
93
|
+
matchCurrentGateway,
|
|
94
|
+
routerProvider: aarProvider ? 'aar' : undefined,
|
|
95
|
+
tempDefaultModel,
|
|
96
|
+
providerName: provider?.name,
|
|
97
|
+
modelsCount,
|
|
98
|
+
config,
|
|
99
|
+
};
|
|
100
|
+
return server_1.NextResponse.json(status);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.error('OpenCode Status API error:', error);
|
|
104
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined }, { status: 500 });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GET = GET;
|
|
4
|
+
const server_1 = require("next/server");
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const os_1 = require("os");
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const OPENCODE_FILE = process.platform === 'win32'
|
|
10
|
+
? (0, path_1.join)(process.env.APPDATA || (0, os_1.homedir)(), 'opencode', 'opencode.json')
|
|
11
|
+
: (0, path_1.join)((0, os_1.homedir)(), '.config', 'opencode', 'opencode.json');
|
|
12
|
+
const TEST_PROMPT = '严格只输出这个 JSON,不要多任何字:{"test":"ok"}';
|
|
13
|
+
const EXPECTED_JSON = '{"test":"ok"}';
|
|
14
|
+
const RUN_TIMEOUT_MS = 90000;
|
|
15
|
+
/**
|
|
16
|
+
* 在子进程中执行 opencode run,不阻塞主进程;若输出中出现 {"test":"ok"} 则判定通过
|
|
17
|
+
*/
|
|
18
|
+
function runOpencodeTest(model) {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
const start = Date.now();
|
|
21
|
+
let settled = false;
|
|
22
|
+
let timeoutId;
|
|
23
|
+
const done = (success, error) => {
|
|
24
|
+
if (settled)
|
|
25
|
+
return;
|
|
26
|
+
settled = true;
|
|
27
|
+
clearTimeout(timeoutId);
|
|
28
|
+
resolve({
|
|
29
|
+
success,
|
|
30
|
+
stdout,
|
|
31
|
+
stderr,
|
|
32
|
+
error,
|
|
33
|
+
latency: Date.now() - start,
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const args = ['run', TEST_PROMPT, '--model', model];
|
|
37
|
+
const child = (0, child_process_1.spawn)('opencode', args, {
|
|
38
|
+
shell: process.platform === 'win32',
|
|
39
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
40
|
+
});
|
|
41
|
+
let stdout = '';
|
|
42
|
+
let stderr = '';
|
|
43
|
+
child.stdout?.on('data', (chunk) => {
|
|
44
|
+
stdout += chunk.toString('utf-8');
|
|
45
|
+
});
|
|
46
|
+
child.stderr?.on('data', (chunk) => {
|
|
47
|
+
stderr += chunk.toString('utf-8');
|
|
48
|
+
});
|
|
49
|
+
child.on('error', (err) => {
|
|
50
|
+
done(false, err.message || 'Failed to spawn opencode');
|
|
51
|
+
});
|
|
52
|
+
child.on('close', (code, signal) => {
|
|
53
|
+
if (settled)
|
|
54
|
+
return;
|
|
55
|
+
const combined = stdout + stderr;
|
|
56
|
+
const hasExpected = combined.includes(EXPECTED_JSON);
|
|
57
|
+
if (hasExpected) {
|
|
58
|
+
done(true);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (code !== 0 && code !== null) {
|
|
62
|
+
done(false, `opencode exited with code ${code}${signal ? ` signal ${signal}` : ''}`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
done(false, 'Output did not contain expected JSON');
|
|
66
|
+
});
|
|
67
|
+
timeoutId = setTimeout(() => {
|
|
68
|
+
try {
|
|
69
|
+
child.kill('SIGTERM');
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
try {
|
|
73
|
+
child.kill('SIGKILL');
|
|
74
|
+
}
|
|
75
|
+
catch { }
|
|
76
|
+
}
|
|
77
|
+
done(false, 'Request timed out');
|
|
78
|
+
}, RUN_TIMEOUT_MS);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 测试 OpenCode 配置:用子进程执行 opencode run,检查输出是否包含 {"test":"ok"}
|
|
83
|
+
*/
|
|
84
|
+
async function GET(request) {
|
|
85
|
+
try {
|
|
86
|
+
if (!(0, fs_1.existsSync)(OPENCODE_FILE)) {
|
|
87
|
+
return server_1.NextResponse.json({
|
|
88
|
+
success: false,
|
|
89
|
+
error: 'Configuration file not found',
|
|
90
|
+
suggestion: 'Please apply configuration first',
|
|
91
|
+
gatewayRunning: false,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
const content = (0, fs_1.readFileSync)(OPENCODE_FILE, 'utf-8');
|
|
95
|
+
let config;
|
|
96
|
+
try {
|
|
97
|
+
config = JSON.parse(content);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return server_1.NextResponse.json({
|
|
101
|
+
success: false,
|
|
102
|
+
error: 'Invalid configuration format',
|
|
103
|
+
gatewayRunning: false,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const model = config.model;
|
|
107
|
+
if (!model || typeof model !== 'string') {
|
|
108
|
+
return server_1.NextResponse.json({
|
|
109
|
+
success: false,
|
|
110
|
+
error: 'No model set in config (config.model)',
|
|
111
|
+
suggestion: 'Apply configuration with a default model',
|
|
112
|
+
gatewayRunning: false,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
const result = await runOpencodeTest(model);
|
|
116
|
+
return server_1.NextResponse.json({
|
|
117
|
+
success: result.success,
|
|
118
|
+
gatewayRunning: undefined,
|
|
119
|
+
opencodeTest: {
|
|
120
|
+
success: result.success,
|
|
121
|
+
message: result.success ? 'opencode run 输出符合预期' : (result.error || 'Output did not contain expected JSON'),
|
|
122
|
+
error: result.error || '',
|
|
123
|
+
latency: result.latency,
|
|
124
|
+
stdout: result.stdout.slice(-2000),
|
|
125
|
+
stderr: result.stderr.slice(-1000),
|
|
126
|
+
},
|
|
127
|
+
configSummary: {
|
|
128
|
+
model,
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('OpenCode Test API error:', error);
|
|
134
|
+
return server_1.NextResponse.json({ error: error.message || 'Internal server error', gatewayRunning: false }, { status: 500 });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
@@ -35,7 +35,7 @@ function cleanLogData(log) {
|
|
|
35
35
|
}
|
|
36
36
|
async function GET(request) {
|
|
37
37
|
try {
|
|
38
|
-
(0, database_1.getDatabase)();
|
|
38
|
+
await (0, database_1.getDatabase)();
|
|
39
39
|
const { searchParams } = new URL(request.url);
|
|
40
40
|
const id = searchParams.get('id');
|
|
41
41
|
const limit = parseInt(searchParams.get('limit') || '100');
|
|
@@ -66,7 +66,7 @@ async function GET(request) {
|
|
|
66
66
|
}
|
|
67
67
|
async function DELETE(request) {
|
|
68
68
|
try {
|
|
69
|
-
(0, database_1.getDatabase)();
|
|
69
|
+
await (0, database_1.getDatabase)();
|
|
70
70
|
const { searchParams } = new URL(request.url);
|
|
71
71
|
const ids = searchParams.get('ids');
|
|
72
72
|
const clearAll = searchParams.get('clear_all') === 'true';
|