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
@@ -0,0 +1,103 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { buildMergedConfig } from '../build-config';
6
+
7
+ const OPENCLAW_DIR = join(homedir(), '.openclaw');
8
+ const OPENCLAW_FILE = join(OPENCLAW_DIR, 'openclaw.json');
9
+ const BACKUP_FILE = join(OPENCLAW_DIR, 'openclaw.json.aar.bak');
10
+
11
+ function backupOriginalConfig(): { success: boolean; existed: boolean; isFromAar: boolean; error?: string } {
12
+ try {
13
+ const existing = existsSync(OPENCLAW_FILE);
14
+ if (existing) {
15
+ const original = readFileSync(OPENCLAW_FILE, 'utf-8');
16
+ let isFromAar = false;
17
+ try {
18
+ const parsed = JSON.parse(original);
19
+ isFromAar = !!(parsed.models?.providers?.['aar-gateway']);
20
+ } catch {}
21
+ // 仅在当前配置不是 AAR 时写入备份,这样「还原」才能恢复到应用 AAR 前的状态;若已是 AAR 则保留原有备份不覆盖
22
+ if (!isFromAar) {
23
+ writeFileSync(BACKUP_FILE, original, 'utf-8');
24
+ }
25
+ return { success: true, existed: true, isFromAar };
26
+ }
27
+ return { success: true, existed: false, isFromAar: false };
28
+ } catch (error: any) {
29
+ return { success: false, existed: false, isFromAar: false, error: `Backup failed: ${error.message}` };
30
+ }
31
+ }
32
+
33
+ export async function POST(request: NextRequest) {
34
+ try {
35
+ const body = await request.json();
36
+ const {
37
+ default_model: defaultModel,
38
+ default_fallbacks: defaultFallbacks = [],
39
+ image_model: imageModel,
40
+ image_fallbacks: imageFallbacks = [],
41
+ config: customConfigStr,
42
+ } = body;
43
+
44
+ let existing: Record<string, any> | null = null;
45
+ if (existsSync(OPENCLAW_FILE)) {
46
+ try {
47
+ existing = JSON.parse(readFileSync(OPENCLAW_FILE, 'utf-8'));
48
+ } catch {
49
+ existing = null;
50
+ }
51
+ }
52
+
53
+ let config: Record<string, any>;
54
+ if (typeof customConfigStr === 'string' && customConfigStr.trim()) {
55
+ try {
56
+ config = JSON.parse(customConfigStr);
57
+ if (!config || typeof config !== 'object') throw new Error('Invalid config object');
58
+ } catch (e: any) {
59
+ return NextResponse.json({ error: 'Invalid config JSON: ' + (e.message || 'parse error') }, { status: 400 });
60
+ }
61
+ } else {
62
+ if (!defaultModel) {
63
+ return NextResponse.json({ error: 'Missing required field: default_model' }, { status: 400 });
64
+ }
65
+ config = await buildMergedConfig(
66
+ {
67
+ defaultModel,
68
+ defaultFallbacks,
69
+ imageModel: imageModel || undefined,
70
+ imageFallbacks,
71
+ },
72
+ existing
73
+ );
74
+ }
75
+
76
+ const backupResult = backupOriginalConfig();
77
+ if (!backupResult.success) {
78
+ return NextResponse.json({ error: backupResult.error }, { status: 500 });
79
+ }
80
+
81
+ if (!existsSync(OPENCLAW_DIR)) {
82
+ mkdirSync(OPENCLAW_DIR, { recursive: true });
83
+ }
84
+
85
+ const jsonString = JSON.stringify(config, null, 2);
86
+ writeFileSync(OPENCLAW_FILE, jsonString, 'utf-8');
87
+
88
+ const alreadyHadAar = !!(existing?.models?.providers?.['aar-gateway']);
89
+ return NextResponse.json({
90
+ success: true,
91
+ message: alreadyHadAar ? 'OpenClaw 配置已更新为最新网关信息' : 'OpenClaw configuration applied successfully',
92
+ config,
93
+ backup: backupResult.existed ? 'Created backup' : 'No existing config to backup',
94
+ previousWasFromAar: backupResult.existed && backupResult.isFromAar,
95
+ });
96
+ } catch (error: any) {
97
+ console.error('OpenClaw Apply API error:', error);
98
+ return NextResponse.json(
99
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
100
+ { status: 500 }
101
+ );
102
+ }
103
+ }
@@ -0,0 +1,59 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { getAllModels, getProviderById } from '@/db/queries';
3
+
4
+ type AvailableModel = {
5
+ id: number;
6
+ name: string;
7
+ model_id: string;
8
+ provider_id: number;
9
+ provider_name: string;
10
+ enabled: boolean;
11
+ };
12
+
13
+ type GroupedModels = { [providerName: string]: AvailableModel[] };
14
+
15
+ /**
16
+ * 查询可用模型列表(与 Claude 共用网关,用于 OpenCode 配置)
17
+ */
18
+ export async function GET(request: NextRequest) {
19
+ try {
20
+ const allModels = (await getAllModels()).filter((m: any) => m.enabled);
21
+
22
+ if (allModels.length === 0) {
23
+ return NextResponse.json({
24
+ models: {},
25
+ count: 0,
26
+ message: 'No enabled models found. Please enable some models first.',
27
+ });
28
+ }
29
+
30
+ const grouped = await allModels.reduce(async (acc: Promise<GroupedModels>, model: any) => {
31
+ const resolvedAcc = await acc;
32
+ const provider = await getProviderById(model.provider_id);
33
+ if (provider) {
34
+ if (!resolvedAcc[provider.name]) resolvedAcc[provider.name] = [];
35
+ resolvedAcc[provider.name].push({
36
+ id: model.id,
37
+ name: model.name,
38
+ model_id: model.model_id,
39
+ provider_id: model.provider_id,
40
+ provider_name: provider.name,
41
+ enabled: model.enabled,
42
+ });
43
+ }
44
+ return resolvedAcc;
45
+ }, Promise.resolve({} as GroupedModels));
46
+
47
+ return NextResponse.json({
48
+ models: grouped,
49
+ count: allModels.length,
50
+ providers: Object.keys(grouped),
51
+ });
52
+ } catch (error: any) {
53
+ console.error('OpenCode Available Models API error:', error);
54
+ return NextResponse.json(
55
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
56
+ { status: 500 }
57
+ );
58
+ }
59
+ }
@@ -0,0 +1,152 @@
1
+ import { getDatabase } from '@/db/database';
2
+ import { getConfig } from '@/db/queries';
3
+ import { getAllModels } from '@/db/queries';
4
+
5
+ export async function getGatewayAddress(): Promise<string> {
6
+ await getDatabase();
7
+ const portConfig = await getConfig('port');
8
+ const port = portConfig?.value || '1357';
9
+ return `http://localhost:${port}/v1`;
10
+ }
11
+
12
+ export async function getGatewayApiKey(): Promise<string> {
13
+ await getDatabase();
14
+ const apiKeyConfig = await getConfig('api_key');
15
+ return apiKeyConfig?.value || 'your-gateway-api-key';
16
+ }
17
+
18
+ /** OpenClaw provider entry structure */
19
+ export type OpenClawProviderEntry = {
20
+ baseUrl: string;
21
+ apiKey: string;
22
+ api: 'openai-completions';
23
+ models: Array<{
24
+ id: string;
25
+ name: string;
26
+ reasoning?: boolean;
27
+ input?: string[];
28
+ cost?: {
29
+ input: number;
30
+ output: number;
31
+ cacheRead: number;
32
+ cacheWrite: number;
33
+ };
34
+ contextWindow?: number;
35
+ maxTokens?: number;
36
+ }>;
37
+ };
38
+
39
+ export async function buildAarGatewayProvider(): Promise<OpenClawProviderEntry> {
40
+ const gatewayAddress = await getGatewayAddress();
41
+ const gatewayApiKey = await getGatewayApiKey();
42
+ const allModels = (await getAllModels()).filter((m: any) => m.enabled);
43
+
44
+ const models = allModels.map((m: any) => ({
45
+ id: m.model_id,
46
+ name: m.name,
47
+ reasoning: m.reasoning || false,
48
+ input: m.input || ['text'],
49
+ cost: m.cost || { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
50
+ contextWindow: m.context_window || 200000,
51
+ maxTokens: m.max_tokens || 8192,
52
+ }));
53
+
54
+ return {
55
+ baseUrl: gatewayAddress,
56
+ apiKey: gatewayApiKey,
57
+ api: 'openai-completions',
58
+ models,
59
+ };
60
+ }
61
+
62
+ const AAR_PROVIDER_ID = 'aar-gateway';
63
+
64
+ /** Merge existing OpenClaw config with AAR gateway */
65
+ export function mergeConfigWithAar(
66
+ existing: Record<string, any> | null,
67
+ config: {
68
+ defaultModel: string;
69
+ defaultFallbacks?: string[];
70
+ imageModel?: string;
71
+ imageFallbacks?: string[];
72
+ },
73
+ aarProvider: OpenClawProviderEntry
74
+ ): Record<string, any> {
75
+ const base = existing && typeof existing === 'object' ? { ...existing } : {};
76
+
77
+ // Update models.providers
78
+ const modelsConfig = base.models || {};
79
+ const providers = modelsConfig.providers || {};
80
+ providers[AAR_PROVIDER_ID] = aarProvider;
81
+ modelsConfig.providers = providers;
82
+ modelsConfig.mode = 'merge';
83
+ base.models = modelsConfig;
84
+
85
+ // Update agents.defaults.model
86
+ const agents = base.agents || {};
87
+ const defaults = agents.defaults || {};
88
+ const model = defaults.model || {};
89
+
90
+ // Format: provider/model
91
+ const fullModelId = `${AAR_PROVIDER_ID}/${config.defaultModel}`;
92
+ const fullImageModelId = config.imageModel
93
+ ? `${AAR_PROVIDER_ID}/${config.imageModel}`
94
+ : undefined;
95
+
96
+ model.primary = fullModelId;
97
+ if (config.defaultFallbacks && config.defaultFallbacks.length > 0) {
98
+ model.fallbacks = config.defaultFallbacks.map((m: string) =>
99
+ m.startsWith(`${AAR_PROVIDER_ID}/`) ? m : `${AAR_PROVIDER_ID}/${m}`
100
+ );
101
+ } else {
102
+ delete model.fallbacks;
103
+ }
104
+
105
+ defaults.model = model;
106
+
107
+ // Update agents.defaults.imageModel
108
+ const imageModel = defaults.imageModel || {};
109
+ if (fullImageModelId) {
110
+ imageModel.primary = fullImageModelId;
111
+ }
112
+ if (config.imageFallbacks && config.imageFallbacks.length > 0) {
113
+ imageModel.fallbacks = config.imageFallbacks.map((m: string) =>
114
+ m.startsWith(`${AAR_PROVIDER_ID}/`) ? m : `${AAR_PROVIDER_ID}/${m}`
115
+ );
116
+ } else {
117
+ delete imageModel.fallbacks;
118
+ }
119
+ defaults.imageModel = imageModel;
120
+
121
+ // Update agents.defaults.models so OpenClaw can resolve aar-gateway model ids (alias, etc.)
122
+ const modelsMap = defaults.models || {};
123
+ for (const m of aarProvider.models) {
124
+ const fullId = `${AAR_PROVIDER_ID}/${m.id}`;
125
+ modelsMap[fullId] = modelsMap[fullId] || { alias: m.name };
126
+ }
127
+ defaults.models = modelsMap;
128
+
129
+ agents.defaults = defaults;
130
+ base.agents = agents;
131
+
132
+ // Ensure channels exists (even if empty)
133
+ if (!base.channels) {
134
+ base.channels = {};
135
+ }
136
+
137
+ return base;
138
+ }
139
+
140
+ /** Generate merged config for preview or apply */
141
+ export async function buildMergedConfig(
142
+ config: {
143
+ defaultModel: string;
144
+ defaultFallbacks?: string[];
145
+ imageModel?: string;
146
+ imageFallbacks?: string[];
147
+ },
148
+ existing: Record<string, any> | null
149
+ ): Promise<Record<string, any>> {
150
+ const aarProvider = await buildAarGatewayProvider();
151
+ return mergeConfigWithAar(existing, config, aarProvider);
152
+ }
@@ -0,0 +1,57 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { existsSync, readFileSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { buildMergedConfig } from '../build-config';
6
+
7
+ const OPENCLAW_FILE = join(homedir(), '.openclaw', 'openclaw.json');
8
+
9
+ export async function GET(request: NextRequest) {
10
+ try {
11
+ const { searchParams } = new URL(request.url);
12
+ const defaultModel = searchParams.get('default_model') || '';
13
+ const defaultFallbacksStr = searchParams.get('default_fallbacks') || '';
14
+ const imageModel = searchParams.get('image_model') || '';
15
+ const imageFallbacksStr = searchParams.get('image_fallbacks') || '';
16
+
17
+ if (!defaultModel) {
18
+ return NextResponse.json({ error: 'Missing query: default_model' }, { status: 400 });
19
+ }
20
+
21
+ // Parse fallback arrays
22
+ const defaultFallbacks = defaultFallbacksStr
23
+ ? defaultFallbacksStr.split(',').filter(Boolean)
24
+ : [];
25
+ const imageFallbacks = imageFallbacksStr
26
+ ? imageFallbacksStr.split(',').filter(Boolean)
27
+ : [];
28
+
29
+ let existingConfig = null;
30
+ if (existsSync(OPENCLAW_FILE)) {
31
+ try {
32
+ const content = readFileSync(OPENCLAW_FILE, 'utf-8');
33
+ existingConfig = JSON.parse(content);
34
+ } catch (e) {
35
+ // If file exists but is invalid, treat as empty
36
+ }
37
+ }
38
+
39
+ const config = await buildMergedConfig(
40
+ {
41
+ defaultModel,
42
+ defaultFallbacks,
43
+ imageModel: imageModel || undefined,
44
+ imageFallbacks,
45
+ },
46
+ existingConfig
47
+ );
48
+
49
+ return NextResponse.json({ config });
50
+ } catch (error: any) {
51
+ console.error('OpenClaw Preview API error:', error);
52
+ return NextResponse.json(
53
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
54
+ { status: 500 }
55
+ );
56
+ }
57
+ }
@@ -0,0 +1,27 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { existsSync, copyFileSync, unlinkSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+
6
+ const OPENCLAW_DIR = join(homedir(), '.openclaw');
7
+ const OPENCLAW_FILE = join(OPENCLAW_DIR, 'openclaw.json');
8
+ const BACKUP_FILE = join(OPENCLAW_DIR, 'openclaw.json.aar.bak');
9
+
10
+ export async function POST() {
11
+ try {
12
+ if (!existsSync(BACKUP_FILE)) {
13
+ return NextResponse.json({ error: 'No backup file found' }, { status: 404 });
14
+ }
15
+
16
+ copyFileSync(BACKUP_FILE, OPENCLAW_FILE);
17
+ unlinkSync(BACKUP_FILE);
18
+
19
+ return NextResponse.json({ success: true, message: 'Configuration restored' });
20
+ } catch (error: any) {
21
+ console.error('OpenClaw Restore API error:', error);
22
+ return NextResponse.json(
23
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
24
+ { status: 500 }
25
+ );
26
+ }
27
+ }
@@ -0,0 +1,67 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { buildMergedConfig } from '../build-config';
6
+
7
+ const AAR_DIR = join(homedir(), '.aar');
8
+ const TEMP_OPENCLAW_FILE = join(AAR_DIR, 'openclaw.tmp.json');
9
+ const OPENCLAW_FILE = join(homedir(), '.openclaw', 'openclaw.json');
10
+
11
+ export async function POST(request: NextRequest) {
12
+ try {
13
+ const body = await request.json();
14
+ const {
15
+ default_model: defaultModel,
16
+ default_fallbacks: defaultFallbacks = [],
17
+ image_model: imageModel,
18
+ image_fallbacks: imageFallbacks = [],
19
+ } = body;
20
+
21
+ if (!existsSync(AAR_DIR)) {
22
+ mkdirSync(AAR_DIR, { recursive: true });
23
+ }
24
+
25
+ let existing: Record<string, any> | null = null;
26
+ if (existsSync(OPENCLAW_FILE)) {
27
+ try {
28
+ existing = JSON.parse(readFileSync(OPENCLAW_FILE, 'utf-8'));
29
+ } catch {
30
+ existing = null;
31
+ }
32
+ }
33
+
34
+ // Build the merged config
35
+ const mergedConfig = await buildMergedConfig(
36
+ {
37
+ defaultModel,
38
+ defaultFallbacks,
39
+ imageModel,
40
+ imageFallbacks,
41
+ },
42
+ existing
43
+ );
44
+
45
+ // Save to temp file
46
+ const tempData = {
47
+ defaultModel,
48
+ defaultFallbacks,
49
+ imageModel,
50
+ imageFallbacks,
51
+ updatedAt: new Date().toISOString(),
52
+ };
53
+ writeFileSync(TEMP_OPENCLAW_FILE, JSON.stringify(tempData, null, 2), 'utf-8');
54
+
55
+ return NextResponse.json({
56
+ success: true,
57
+ saveType: 'temp',
58
+ message: 'Configuration saved temporarily'
59
+ });
60
+ } catch (error: any) {
61
+ console.error('OpenClaw Save API error:', error);
62
+ return NextResponse.json(
63
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
64
+ { status: 500 }
65
+ );
66
+ }
67
+ }
@@ -0,0 +1,178 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+ import { existsSync, readFileSync, statSync } from 'fs';
3
+ import { join } from 'path';
4
+ import { homedir } from 'os';
5
+ import { getDatabase } from '@/db/database';
6
+ import { getConfig } from '@/db/queries';
7
+
8
+ const OPENCLAW_DIR = join(homedir(), '.openclaw');
9
+ const OPENCLAW_FILE = join(OPENCLAW_DIR, 'openclaw.json');
10
+ const BACKUP_FILE = join(OPENCLAW_DIR, 'openclaw.json.aar.bak');
11
+ const AAR_DIR = join(homedir(), '.aar');
12
+ const TEMP_OPENCLAW_FILE = join(AAR_DIR, 'openclaw.tmp.json');
13
+
14
+ type OpenClawStatus = {
15
+ applied: boolean;
16
+ defaultModel?: string;
17
+ defaultFallbacks?: string[];
18
+ imageModel?: string;
19
+ imageFallbacks?: string[];
20
+ gatewayAddress?: string;
21
+ apiKey?: string;
22
+ lastUpdated?: string | null;
23
+ backupExists: boolean;
24
+ matchCurrentGateway?: boolean;
25
+ routerProvider?: string;
26
+ tempDefaultModel?: string;
27
+ tempDefaultFallbacks?: string[];
28
+ tempImageModel?: string;
29
+ tempImageFallbacks?: string[];
30
+ providerName?: string;
31
+ modelsCount?: number;
32
+ /** 当前磁盘上 openclaw.json 的完整内容,用于「生效中」展示 */
33
+ config?: Record<string, unknown> | null;
34
+ };
35
+
36
+ function maskApiKey(apiKey: string): string {
37
+ if (!apiKey || apiKey === 'your-gateway-api-key') return apiKey;
38
+ if (apiKey.length <= 8) return apiKey.slice(0, 2) + '***' + apiKey.slice(-2);
39
+ return apiKey.slice(0, 4) + '****' + apiKey.slice(-4);
40
+ }
41
+
42
+ export async function GET(request: NextRequest) {
43
+ try {
44
+ const fileExists = existsSync(OPENCLAW_FILE);
45
+ const backupExists = existsSync(BACKUP_FILE);
46
+
47
+ await getDatabase();
48
+ const gatewayApiKeyConfig = await getConfig('api_key');
49
+ const portConfig = await getConfig('port');
50
+ const gatewayApiKey = gatewayApiKeyConfig?.value || 'your-gateway-api-key';
51
+ const gatewayAddress = `http://localhost:${portConfig?.value || '1357'}/v1`;
52
+
53
+ // Read temp config if exists
54
+ let tempConfig: any = {};
55
+ if (existsSync(TEMP_OPENCLAW_FILE)) {
56
+ try {
57
+ tempConfig = JSON.parse(readFileSync(TEMP_OPENCLAW_FILE, 'utf-8'));
58
+ } catch {}
59
+ }
60
+
61
+ if (!fileExists) {
62
+ return NextResponse.json({
63
+ applied: false,
64
+ defaultModel: tempConfig.defaultModel,
65
+ defaultFallbacks: tempConfig.defaultFallbacks || [],
66
+ imageModel: tempConfig.imageModel,
67
+ imageFallbacks: tempConfig.imageFallbacks || [],
68
+ gatewayAddress,
69
+ apiKey: maskApiKey(gatewayApiKey),
70
+ backupExists: false,
71
+ lastUpdated: undefined,
72
+ matchCurrentGateway: false,
73
+ routerProvider: undefined,
74
+ tempDefaultModel: tempConfig.defaultModel,
75
+ tempDefaultFallbacks: tempConfig.defaultFallbacks || [],
76
+ tempImageModel: tempConfig.imageModel,
77
+ tempImageFallbacks: tempConfig.imageFallbacks || [],
78
+ } as OpenClawStatus);
79
+ }
80
+
81
+ const content = readFileSync(OPENCLAW_FILE, 'utf-8');
82
+ let config: any;
83
+ try {
84
+ config = JSON.parse(content);
85
+ } catch {
86
+ return NextResponse.json({ error: 'Invalid openclaw.json format' }, { status: 500 });
87
+ }
88
+
89
+ const modelsConfig = config.models || {};
90
+ const providers = modelsConfig.providers || {};
91
+ const aarProvider = providers['aar-gateway'];
92
+
93
+ const appliedBaseUrl = aarProvider?.baseUrl;
94
+ const appliedApiKey = aarProvider?.apiKey;
95
+ const matchCurrentGateway = appliedBaseUrl === gatewayAddress && appliedApiKey === gatewayApiKey;
96
+
97
+ // Extract current config values
98
+ let defaultModel: string | undefined;
99
+ let defaultFallbacks: string[] | undefined;
100
+ let imageModel: string | undefined;
101
+ let imageFallbacks: string[] | undefined;
102
+
103
+ const primaryModel = config.agents?.defaults?.model?.primary;
104
+ if (typeof primaryModel === 'string' && primaryModel.startsWith('aar-gateway/')) {
105
+ defaultModel = primaryModel.slice('aar-gateway/'.length);
106
+ }
107
+
108
+ const fallbackModels = config.agents?.defaults?.model?.fallbacks;
109
+ if (Array.isArray(fallbackModels)) {
110
+ defaultFallbacks = fallbackModels.map((m: string) =>
111
+ m.startsWith('aar-gateway/') ? m.slice('aar-gateway/'.length) : m
112
+ );
113
+ }
114
+
115
+ const primaryImageModel = config.agents?.defaults?.imageModel?.primary;
116
+ if (typeof primaryImageModel === 'string' && primaryImageModel.startsWith('aar-gateway/')) {
117
+ imageModel = primaryImageModel.slice('aar-gateway/'.length);
118
+ }
119
+
120
+ const fallbackImageModels = config.agents?.defaults?.imageModel?.fallbacks;
121
+ if (Array.isArray(fallbackImageModels)) {
122
+ imageFallbacks = fallbackImageModels.map((m: string) =>
123
+ m.startsWith('aar-gateway/') ? m.slice('aar-gateway/'.length) : m
124
+ );
125
+ }
126
+
127
+ // OpenClaw models is an array
128
+ const modelsCount = Array.isArray(aarProvider?.models) ? aarProvider.models.length : 0;
129
+
130
+ // Use temp config if not matching current gateway
131
+ const finalDefaultModel = !matchCurrentGateway && tempConfig.defaultModel
132
+ ? tempConfig.defaultModel
133
+ : defaultModel;
134
+ const finalDefaultFallbacks = !matchCurrentGateway && tempConfig.defaultFallbacks
135
+ ? tempConfig.defaultFallbacks
136
+ : defaultFallbacks;
137
+ const finalImageModel = !matchCurrentGateway && tempConfig.imageModel
138
+ ? tempConfig.imageModel
139
+ : imageModel;
140
+ const finalImageFallbacks = !matchCurrentGateway && tempConfig.imageFallbacks
141
+ ? tempConfig.imageFallbacks
142
+ : imageFallbacks;
143
+
144
+ let lastUpdated: string | null = null;
145
+ try {
146
+ lastUpdated = new Date(statSync(OPENCLAW_FILE).mtime).toISOString();
147
+ } catch {}
148
+
149
+ const status: OpenClawStatus = {
150
+ applied: !!aarProvider,
151
+ defaultModel: finalDefaultModel,
152
+ defaultFallbacks: finalDefaultFallbacks,
153
+ imageModel: finalImageModel,
154
+ imageFallbacks: finalImageFallbacks,
155
+ gatewayAddress: appliedBaseUrl,
156
+ apiKey: maskApiKey(appliedApiKey || gatewayApiKey),
157
+ backupExists,
158
+ lastUpdated,
159
+ matchCurrentGateway,
160
+ routerProvider: aarProvider ? 'aar' : undefined,
161
+ tempDefaultModel: tempConfig.defaultModel,
162
+ tempDefaultFallbacks: tempConfig.defaultFallbacks || [],
163
+ tempImageModel: tempConfig.imageModel,
164
+ tempImageFallbacks: tempConfig.imageFallbacks || [],
165
+ providerName: 'AAR Model Router',
166
+ modelsCount,
167
+ config,
168
+ };
169
+
170
+ return NextResponse.json(status);
171
+ } catch (error: any) {
172
+ console.error('OpenClaw Status API error:', error);
173
+ return NextResponse.json(
174
+ { error: error.message || 'Internal server error', stack: process.env.NODE_ENV === 'development' ? error.stack : undefined },
175
+ { status: 500 }
176
+ );
177
+ }
178
+ }