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.
Files changed (354) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +14 -0
  3. package/.next/build-manifest.json +2 -2
  4. package/.next/fallback-build-manifest.json +2 -2
  5. package/.next/next-server.js.nft.json +1 -1
  6. package/.next/prerender-manifest.json +3 -3
  7. package/.next/required-server-files.js +4 -4
  8. package/.next/required-server-files.json +4 -4
  9. package/.next/routes-manifest.json +84 -0
  10. package/.next/server/app/_global-error/page.js +1 -1
  11. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  12. package/.next/server/app/_global-error.html +2 -2
  13. package/.next/server/app/_global-error.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  16. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  17. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  18. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/_not-found/page.js +2 -2
  20. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  21. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  22. package/.next/server/app/_not-found.html +1 -1
  23. package/.next/server/app/_not-found.rsc +2 -2
  24. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  25. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  26. package/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  27. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  28. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  29. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  30. package/.next/server/app/api/config/route.js.nft.json +1 -1
  31. package/.next/server/app/api/gateway/[...path]/route.js.nft.json +1 -1
  32. package/.next/server/app/api/gateway/models/route.js.nft.json +1 -1
  33. package/.next/server/app/api/gateway/route.js.nft.json +1 -1
  34. package/.next/server/app/api/ide/claude/apply/route.js.nft.json +1 -1
  35. package/.next/server/app/api/ide/claude/available-models/route.js.nft.json +1 -1
  36. package/.next/server/app/api/ide/claude/restore/route.js.nft.json +1 -1
  37. package/.next/server/app/api/ide/claude/save/route.js.nft.json +1 -1
  38. package/.next/server/app/api/ide/claude/status/route.js.nft.json +1 -1
  39. package/.next/server/app/api/ide/claude/test/route.js +1 -1
  40. package/.next/server/app/api/ide/claude/test/route.js.nft.json +1 -1
  41. package/.next/server/app/api/ide/openclaw/apply/route/app-paths-manifest.json +3 -0
  42. package/.next/server/app/api/ide/openclaw/apply/route/build-manifest.json +11 -0
  43. package/.next/server/app/api/ide/openclaw/apply/route/server-reference-manifest.json +4 -0
  44. package/.next/server/app/api/ide/openclaw/apply/route.js +7 -0
  45. package/.next/server/app/api/ide/openclaw/apply/route.js.map +5 -0
  46. package/.next/server/app/api/ide/openclaw/apply/route.js.nft.json +1 -0
  47. package/.next/server/app/api/ide/openclaw/apply/route_client-reference-manifest.js +2 -0
  48. package/.next/server/app/api/ide/openclaw/available-models/route/app-paths-manifest.json +3 -0
  49. package/.next/server/app/api/ide/openclaw/available-models/route/build-manifest.json +11 -0
  50. package/.next/server/app/api/ide/openclaw/available-models/route/server-reference-manifest.json +4 -0
  51. package/.next/server/app/api/ide/openclaw/available-models/route.js +7 -0
  52. package/.next/server/app/api/ide/openclaw/available-models/route.js.map +5 -0
  53. package/.next/server/app/api/ide/openclaw/available-models/route.js.nft.json +1 -0
  54. package/.next/server/app/api/ide/openclaw/available-models/route_client-reference-manifest.js +2 -0
  55. package/.next/server/app/api/ide/openclaw/preview/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/ide/openclaw/preview/route/build-manifest.json +11 -0
  57. package/.next/server/app/api/ide/openclaw/preview/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/ide/openclaw/preview/route.js +7 -0
  59. package/.next/server/app/api/ide/openclaw/preview/route.js.map +5 -0
  60. package/.next/server/app/api/ide/openclaw/preview/route.js.nft.json +1 -0
  61. package/.next/server/app/api/ide/openclaw/preview/route_client-reference-manifest.js +2 -0
  62. package/.next/server/app/api/ide/openclaw/restore/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/ide/openclaw/restore/route/build-manifest.json +11 -0
  64. package/.next/server/app/api/ide/openclaw/restore/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/ide/openclaw/restore/route.js +6 -0
  66. package/.next/server/app/api/ide/openclaw/restore/route.js.map +5 -0
  67. package/.next/server/app/api/ide/openclaw/restore/route.js.nft.json +1 -0
  68. package/.next/server/app/api/ide/openclaw/restore/route_client-reference-manifest.js +2 -0
  69. package/.next/server/app/api/ide/openclaw/save/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/ide/openclaw/save/route/build-manifest.json +11 -0
  71. package/.next/server/app/api/ide/openclaw/save/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/ide/openclaw/save/route.js +7 -0
  73. package/.next/server/app/api/ide/openclaw/save/route.js.map +5 -0
  74. package/.next/server/app/api/ide/openclaw/save/route.js.nft.json +1 -0
  75. package/.next/server/app/api/ide/openclaw/save/route_client-reference-manifest.js +2 -0
  76. package/.next/server/app/api/ide/openclaw/status/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/ide/openclaw/status/route/build-manifest.json +11 -0
  78. package/.next/server/app/api/ide/openclaw/status/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/ide/openclaw/status/route.js +7 -0
  80. package/.next/server/app/api/ide/openclaw/status/route.js.map +5 -0
  81. package/.next/server/app/api/ide/openclaw/status/route.js.nft.json +1 -0
  82. package/.next/server/app/api/ide/openclaw/status/route_client-reference-manifest.js +2 -0
  83. package/.next/server/app/api/ide/openclaw/test/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/ide/openclaw/test/route/build-manifest.json +11 -0
  85. package/.next/server/app/api/ide/openclaw/test/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/ide/openclaw/test/route.js +6 -0
  87. package/.next/server/app/api/ide/openclaw/test/route.js.map +5 -0
  88. package/.next/server/app/api/ide/openclaw/test/route.js.nft.json +1 -0
  89. package/.next/server/app/api/ide/openclaw/test/route_client-reference-manifest.js +2 -0
  90. package/.next/server/app/api/ide/opencode/apply/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/ide/opencode/apply/route/build-manifest.json +11 -0
  92. package/.next/server/app/api/ide/opencode/apply/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/ide/opencode/apply/route.js +7 -0
  94. package/.next/server/app/api/ide/opencode/apply/route.js.map +5 -0
  95. package/.next/server/app/api/ide/opencode/apply/route.js.nft.json +1 -0
  96. package/.next/server/app/api/ide/opencode/apply/route_client-reference-manifest.js +2 -0
  97. package/.next/server/app/api/ide/opencode/available-models/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/ide/opencode/available-models/route/build-manifest.json +11 -0
  99. package/.next/server/app/api/ide/opencode/available-models/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/ide/opencode/available-models/route.js +7 -0
  101. package/.next/server/app/api/ide/opencode/available-models/route.js.map +5 -0
  102. package/.next/server/app/api/ide/opencode/available-models/route.js.nft.json +1 -0
  103. package/.next/server/app/api/ide/opencode/available-models/route_client-reference-manifest.js +2 -0
  104. package/.next/server/app/api/ide/opencode/preview/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/ide/opencode/preview/route/build-manifest.json +11 -0
  106. package/.next/server/app/api/ide/opencode/preview/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/ide/opencode/preview/route.js +7 -0
  108. package/.next/server/app/api/ide/opencode/preview/route.js.map +5 -0
  109. package/.next/server/app/api/ide/opencode/preview/route.js.nft.json +1 -0
  110. package/.next/server/app/api/ide/opencode/preview/route_client-reference-manifest.js +2 -0
  111. package/.next/server/app/api/ide/opencode/restore/route/app-paths-manifest.json +3 -0
  112. package/.next/server/app/api/ide/opencode/restore/route/build-manifest.json +11 -0
  113. package/.next/server/app/api/ide/opencode/restore/route/server-reference-manifest.json +4 -0
  114. package/.next/server/app/api/ide/opencode/restore/route.js +6 -0
  115. package/.next/server/app/api/ide/opencode/restore/route.js.map +5 -0
  116. package/.next/server/app/api/ide/opencode/restore/route.js.nft.json +1 -0
  117. package/.next/server/app/api/ide/opencode/restore/route_client-reference-manifest.js +2 -0
  118. package/.next/server/app/api/ide/opencode/save/route/app-paths-manifest.json +3 -0
  119. package/.next/server/app/api/ide/opencode/save/route/build-manifest.json +11 -0
  120. package/.next/server/app/api/ide/opencode/save/route/server-reference-manifest.json +4 -0
  121. package/.next/server/app/api/ide/opencode/save/route.js +7 -0
  122. package/.next/server/app/api/ide/opencode/save/route.js.map +5 -0
  123. package/.next/server/app/api/ide/opencode/save/route.js.nft.json +1 -0
  124. package/.next/server/app/api/ide/opencode/save/route_client-reference-manifest.js +2 -0
  125. package/.next/server/app/api/ide/opencode/status/route/app-paths-manifest.json +3 -0
  126. package/.next/server/app/api/ide/opencode/status/route/build-manifest.json +11 -0
  127. package/.next/server/app/api/ide/opencode/status/route/server-reference-manifest.json +4 -0
  128. package/.next/server/app/api/ide/opencode/status/route.js +7 -0
  129. package/.next/server/app/api/ide/opencode/status/route.js.map +5 -0
  130. package/.next/server/app/api/ide/opencode/status/route.js.nft.json +1 -0
  131. package/.next/server/app/api/ide/opencode/status/route_client-reference-manifest.js +2 -0
  132. package/.next/server/app/api/ide/opencode/test/route/app-paths-manifest.json +3 -0
  133. package/.next/server/app/api/ide/opencode/test/route/build-manifest.json +11 -0
  134. package/.next/server/app/api/ide/opencode/test/route/server-reference-manifest.json +4 -0
  135. package/.next/server/app/api/ide/opencode/test/route.js +6 -0
  136. package/.next/server/app/api/ide/opencode/test/route.js.map +5 -0
  137. package/.next/server/app/api/ide/opencode/test/route.js.nft.json +1 -0
  138. package/.next/server/app/api/ide/opencode/test/route_client-reference-manifest.js +2 -0
  139. package/.next/server/app/api/logs/route.js.nft.json +1 -1
  140. package/.next/server/app/api/models/route.js.nft.json +1 -1
  141. package/.next/server/app/api/providers/route.js.nft.json +1 -1
  142. package/.next/server/app/api/providers/test/route.js.nft.json +1 -1
  143. package/.next/server/app/api/service/force-stop/route.js.nft.json +1 -1
  144. package/.next/server/app/api/service/start/route.js.nft.json +1 -1
  145. package/.next/server/app/api/service/status/route.js.nft.json +1 -1
  146. package/.next/server/app/api/service/stop/route.js.nft.json +1 -1
  147. package/.next/server/app/ide/page.js +2 -2
  148. package/.next/server/app/ide/page.js.nft.json +1 -1
  149. package/.next/server/app/ide/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/ide.html +1 -1
  151. package/.next/server/app/ide.rsc +3 -3
  152. package/.next/server/app/ide.segments/_full.segment.rsc +3 -3
  153. package/.next/server/app/ide.segments/_head.segment.rsc +1 -1
  154. package/.next/server/app/ide.segments/_index.segment.rsc +2 -2
  155. package/.next/server/app/ide.segments/_tree.segment.rsc +2 -2
  156. package/.next/server/app/ide.segments/ide/__PAGE__.segment.rsc +2 -2
  157. package/.next/server/app/ide.segments/ide.segment.rsc +1 -1
  158. package/.next/server/app/index.html +1 -1
  159. package/.next/server/app/index.rsc +2 -2
  160. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  161. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  162. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  163. package/.next/server/app/index.segments/_index.segment.rsc +2 -2
  164. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  165. package/.next/server/app/logs/page.js +2 -2
  166. package/.next/server/app/logs/page.js.nft.json +1 -1
  167. package/.next/server/app/logs/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app/logs.html +1 -1
  169. package/.next/server/app/logs.rsc +3 -3
  170. package/.next/server/app/logs.segments/_full.segment.rsc +3 -3
  171. package/.next/server/app/logs.segments/_head.segment.rsc +1 -1
  172. package/.next/server/app/logs.segments/_index.segment.rsc +2 -2
  173. package/.next/server/app/logs.segments/_tree.segment.rsc +2 -2
  174. package/.next/server/app/logs.segments/logs/__PAGE__.segment.rsc +2 -2
  175. package/.next/server/app/logs.segments/logs.segment.rsc +1 -1
  176. package/.next/server/app/models/page.js +2 -2
  177. package/.next/server/app/models/page.js.nft.json +1 -1
  178. package/.next/server/app/models/page_client-reference-manifest.js +1 -1
  179. package/.next/server/app/models.html +1 -1
  180. package/.next/server/app/models.rsc +2 -2
  181. package/.next/server/app/models.segments/_full.segment.rsc +2 -2
  182. package/.next/server/app/models.segments/_head.segment.rsc +1 -1
  183. package/.next/server/app/models.segments/_index.segment.rsc +2 -2
  184. package/.next/server/app/models.segments/_tree.segment.rsc +2 -2
  185. package/.next/server/app/models.segments/models/__PAGE__.segment.rsc +1 -1
  186. package/.next/server/app/models.segments/models.segment.rsc +1 -1
  187. package/.next/server/app/page.js +2 -2
  188. package/.next/server/app/page.js.nft.json +1 -1
  189. package/.next/server/app/page_client-reference-manifest.js +1 -1
  190. package/.next/server/app/providers/page.js +2 -2
  191. package/.next/server/app/providers/page.js.nft.json +1 -1
  192. package/.next/server/app/providers/page_client-reference-manifest.js +1 -1
  193. package/.next/server/app/providers.html +1 -1
  194. package/.next/server/app/providers.rsc +2 -2
  195. package/.next/server/app/providers.segments/_full.segment.rsc +2 -2
  196. package/.next/server/app/providers.segments/_head.segment.rsc +1 -1
  197. package/.next/server/app/providers.segments/_index.segment.rsc +2 -2
  198. package/.next/server/app/providers.segments/_tree.segment.rsc +2 -2
  199. package/.next/server/app/providers.segments/providers/__PAGE__.segment.rsc +1 -1
  200. package/.next/server/app/providers.segments/providers.segment.rsc +1 -1
  201. package/.next/server/app-paths-manifest.json +14 -0
  202. package/.next/server/chunks/[root-of-the-server]__001d5756._.js +3 -0
  203. package/.next/server/chunks/[root-of-the-server]__001d5756._.js.map +1 -0
  204. package/.next/server/chunks/[root-of-the-server]__05f8578b._.js +3 -0
  205. package/.next/server/chunks/[root-of-the-server]__05f8578b._.js.map +1 -0
  206. package/.next/server/chunks/[root-of-the-server]__3a204d25._.js +1 -1
  207. package/.next/server/chunks/[root-of-the-server]__3a204d25._.js.map +1 -1
  208. package/.next/server/chunks/[root-of-the-server]__43810962._.js +3 -0
  209. package/.next/server/chunks/[root-of-the-server]__43810962._.js.map +1 -0
  210. package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js +1 -1
  211. package/.next/server/chunks/[root-of-the-server]__4a8f9bc7._.js.map +1 -1
  212. package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js +3 -0
  213. package/.next/server/chunks/[root-of-the-server]__55cd88b8._.js.map +1 -0
  214. package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js +1 -1
  215. package/.next/server/chunks/[root-of-the-server]__5e8276bc._.js.map +1 -1
  216. package/.next/server/chunks/[root-of-the-server]__760eaa16._.js +3 -0
  217. package/.next/server/chunks/[root-of-the-server]__760eaa16._.js.map +1 -0
  218. package/.next/server/chunks/[root-of-the-server]__7c298a19._.js +3 -0
  219. package/.next/server/chunks/[root-of-the-server]__7c298a19._.js.map +1 -0
  220. package/.next/server/chunks/[root-of-the-server]__85540228._.js +3 -0
  221. package/.next/server/chunks/[root-of-the-server]__85540228._.js.map +1 -0
  222. package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js +3 -0
  223. package/.next/server/chunks/[root-of-the-server]__94fe8d3c._.js.map +1 -0
  224. package/.next/server/chunks/[root-of-the-server]__97622908._.js +3 -0
  225. package/.next/server/chunks/[root-of-the-server]__97622908._.js.map +1 -0
  226. package/.next/server/chunks/[root-of-the-server]__a02e6618._.js +3 -0
  227. package/.next/server/chunks/[root-of-the-server]__a02e6618._.js.map +1 -0
  228. package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js +3 -0
  229. package/.next/server/chunks/[root-of-the-server]__a32a20a7._.js.map +1 -0
  230. package/.next/server/chunks/[root-of-the-server]__af5b556a._.js +3 -0
  231. package/.next/server/chunks/[root-of-the-server]__af5b556a._.js.map +1 -0
  232. package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js +16 -16
  233. package/.next/server/chunks/[root-of-the-server]__c1b4b601._.js.map +1 -1
  234. package/.next/server/chunks/[root-of-the-server]__cafe113e._.js +3 -0
  235. package/.next/server/chunks/[root-of-the-server]__cafe113e._.js.map +1 -0
  236. package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js +3 -0
  237. package/.next/server/chunks/[root-of-the-server]__dc8b0bed._.js.map +1 -0
  238. package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js +1 -1
  239. package/.next/server/chunks/[root-of-the-server]__f0461b8d._.js.map +1 -1
  240. package/.next/server/chunks/[root-of-the-server]__f8949f88._.js +1 -1
  241. package/.next/server/chunks/[root-of-the-server]__f8949f88._.js.map +1 -1
  242. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js +3 -0
  243. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_apply_route_actions_2cb9e4b4.js.map +1 -0
  244. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js +3 -0
  245. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_preview_route_actions_9814a8e4.js.map +1 -0
  246. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js +3 -0
  247. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_restore_route_actions_10ad8f9d.js.map +1 -0
  248. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js +3 -0
  249. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_save_route_actions_044ad081.js.map +1 -0
  250. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js +3 -0
  251. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_status_route_actions_ed9786d2.js.map +1 -0
  252. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js +3 -0
  253. package/.next/server/chunks/_next-internal_server_app_api_ide_openclaw_test_route_actions_ce2cb808.js.map +1 -0
  254. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js +3 -0
  255. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_apply_route_actions_6c422244.js.map +1 -0
  256. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js +3 -0
  257. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_preview_route_actions_256c82e0.js.map +1 -0
  258. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js +3 -0
  259. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_restore_route_actions_371993d3.js.map +1 -0
  260. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js +3 -0
  261. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_save_route_actions_6e4c9c41.js.map +1 -0
  262. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js +3 -0
  263. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_status_route_actions_498ad77b.js.map +1 -0
  264. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js +3 -0
  265. package/.next/server/chunks/_next-internal_server_app_api_ide_opencode_test_route_actions_c71be510.js.map +1 -0
  266. package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js +3 -0
  267. package/.next/server/chunks/ce889_server_app_api_ide_openclaw_available-models_route_actions_e568e70b.js.map +1 -0
  268. package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js +3 -0
  269. package/.next/server/chunks/ce889_server_app_api_ide_opencode_available-models_route_actions_95230db3.js.map +1 -0
  270. package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js → [root-of-the-server]__81937253._.js} +2 -2
  271. package/.next/server/chunks/ssr/{[root-of-the-server]__bec95712._.js.map → [root-of-the-server]__81937253._.js.map} +1 -1
  272. package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js → [root-of-the-server]__976ad963._.js} +2 -2
  273. package/.next/server/chunks/ssr/{[root-of-the-server]__71c85955._.js.map → [root-of-the-server]__976ad963._.js.map} +1 -1
  274. package/.next/server/chunks/ssr/_69468f4c._.js +3 -0
  275. package/.next/server/chunks/ssr/_69468f4c._.js.map +1 -0
  276. package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js +1 -1
  277. package/.next/server/chunks/ssr/src_app_ide_page_tsx_8962793b._.js.map +1 -1
  278. package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js +1 -1
  279. package/.next/server/chunks/ssr/src_app_logs_page_tsx_7b7b7b83._.js.map +1 -1
  280. package/.next/server/pages/404.html +1 -1
  281. package/.next/server/pages/500.html +2 -2
  282. package/.next/server/server-reference-manifest.js +1 -1
  283. package/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/static/chunks/64f547b3bcd3aef4.js +1 -0
  285. package/.next/static/chunks/6992685fe009e8fd.css +1 -0
  286. package/.next/static/chunks/{b6b258e8582e47c4.js → 7c8b7cbb3339f139.js} +1 -1
  287. package/.next/static/chunks/8ccc14e022ff6de3.js +1 -0
  288. package/.next/types/routes.d.ts +15 -1
  289. package/.next/types/validator.ts +126 -0
  290. package/README.md +31 -4
  291. package/dist/.next/dev/types/validator.js +56 -0
  292. package/dist/.next/types/validator.js +56 -0
  293. package/dist/package.json +55 -0
  294. package/dist/src/app/api/config/route.js +17 -0
  295. package/dist/src/app/api/ide/claude/apply/route.js +126 -31
  296. package/dist/src/app/api/ide/claude/restore/route.js +30 -0
  297. package/dist/src/app/api/ide/claude/save/route.js +79 -0
  298. package/dist/src/app/api/ide/claude/status/route.js +6 -1
  299. package/dist/src/app/api/ide/openclaw/apply/route.js +92 -0
  300. package/dist/src/app/api/ide/openclaw/available-models/route.js +46 -0
  301. package/dist/src/app/api/ide/openclaw/build-config.js +101 -0
  302. package/dist/src/app/api/ide/openclaw/preview/route.js +49 -0
  303. package/dist/src/app/api/ide/openclaw/restore/route.js +24 -0
  304. package/dist/src/app/api/ide/openclaw/save/route.js +54 -0
  305. package/dist/src/app/api/ide/openclaw/status/route.js +139 -0
  306. package/dist/src/app/api/ide/openclaw/test/route.js +158 -0
  307. package/dist/src/app/api/ide/opencode/apply/route.js +89 -0
  308. package/dist/src/app/api/ide/opencode/available-models/route.js +46 -0
  309. package/dist/src/app/api/ide/opencode/build-config.js +54 -0
  310. package/dist/src/app/api/ide/opencode/preview/route.js +36 -0
  311. package/dist/src/app/api/ide/opencode/restore/route.js +40 -0
  312. package/dist/src/app/api/ide/opencode/save/route.js +123 -0
  313. package/dist/src/app/api/ide/opencode/status/route.js +106 -0
  314. package/dist/src/app/api/ide/opencode/test/route.js +136 -0
  315. package/dist/src/app/components/Footer.js +11 -0
  316. package/dist/src/app/ide/page.js +651 -81
  317. package/dist/src/app/layout.js +5 -1
  318. package/dist/src/app/logs/page.js +4 -2
  319. package/dist/src/db/database.js +44 -8
  320. package/package.json +1 -1
  321. package/src/app/api/config/route.ts +17 -0
  322. package/src/app/api/ide/claude/apply/route.ts +140 -31
  323. package/src/app/api/ide/claude/restore/route.ts +36 -1
  324. package/src/app/api/ide/claude/save/route.ts +91 -1
  325. package/src/app/api/ide/claude/status/route.ts +12 -2
  326. package/src/app/api/ide/openclaw/apply/route.ts +103 -0
  327. package/src/app/api/ide/openclaw/available-models/route.ts +59 -0
  328. package/src/app/api/ide/openclaw/build-config.ts +152 -0
  329. package/src/app/api/ide/openclaw/preview/route.ts +57 -0
  330. package/src/app/api/ide/openclaw/restore/route.ts +27 -0
  331. package/src/app/api/ide/openclaw/save/route.ts +67 -0
  332. package/src/app/api/ide/openclaw/status/route.ts +178 -0
  333. package/src/app/api/ide/openclaw/test/route.ts +194 -0
  334. package/src/app/api/ide/opencode/apply/route.ts +92 -0
  335. package/src/app/api/ide/opencode/available-models/route.ts +59 -0
  336. package/src/app/api/ide/opencode/build-config.ts +69 -0
  337. package/src/app/api/ide/opencode/preview/route.ts +40 -0
  338. package/src/app/api/ide/opencode/restore/route.ts +52 -0
  339. package/src/app/api/ide/opencode/save/route.ts +131 -0
  340. package/src/app/api/ide/opencode/status/route.ts +128 -0
  341. package/src/app/api/ide/opencode/test/route.ts +145 -0
  342. package/src/app/components/Footer.tsx +9 -0
  343. package/src/app/globals.css +17 -0
  344. package/src/app/ide/page.tsx +1587 -118
  345. package/src/app/layout.tsx +3 -1
  346. package/src/app/logs/page.tsx +4 -2
  347. package/src/db/database.ts +55 -8
  348. package/.next/server/chunks/ssr/src_app_b2b1d928._.js +0 -3
  349. package/.next/server/chunks/ssr/src_app_b2b1d928._.js.map +0 -1
  350. package/.next/static/chunks/6418ca50028376b7.css +0 -1
  351. package/.next/static/chunks/9ec3b97741b6575e.js +0 -1
  352. /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_buildManifest.js +0 -0
  353. /package/.next/static/{ryTeHAYUvjT1bYolc-x9Z → cf2SWIkI5HVbnDjLExI42}/_clientMiddlewareManifest.json +0 -0
  354. /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 config = generateClaudeConfig(gatewayAddress, gatewayApiKey, modelMapping);
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
- const validationResult = validateAndWriteConfig(config);
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
- * 生成 Claude 配置
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
- * 返回原有配置是否来自当前工具(router_provider === 'aar')
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 (error) {
122
- // 解析失败,不影响备份操作
155
+ catch {
123
156
  isFromAar = false;
124
157
  }
125
- // 写入备份文件
126
- (0, fs_1.writeFileSync)(BACKUP_FILE, originalConfig, 'utf-8');
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
  }