@aitne/dashboard 0.1.4 → 0.1.7

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 (751) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +5 -1
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/cache/.tsbuildinfo +1 -1
  5. package/.next/diagnostics/route-bundle-stats.json +450 -356
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/prerender-manifest.json +96 -0
  8. package/.next/routes-manifest.json +24 -0
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +15 -15
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +15 -15
  21. package/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  22. package/.next/server/app/_not-found.segments/_index.segment.rsc +10 -10
  23. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  24. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  25. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  26. package/.next/server/app/activity/page.js.nft.json +1 -1
  27. package/.next/server/app/activity/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/activity.html +1 -1
  29. package/.next/server/app/activity.rsc +19 -19
  30. package/.next/server/app/activity.segments/_full.segment.rsc +19 -19
  31. package/.next/server/app/activity.segments/_head.segment.rsc +4 -4
  32. package/.next/server/app/activity.segments/_index.segment.rsc +10 -10
  33. package/.next/server/app/activity.segments/_tree.segment.rsc +2 -2
  34. package/.next/server/app/activity.segments/activity/__PAGE__.segment.rsc +4 -4
  35. package/.next/server/app/activity.segments/activity.segment.rsc +4 -4
  36. package/.next/server/app/analytics/page.js.nft.json +1 -1
  37. package/.next/server/app/analytics/page_client-reference-manifest.js +1 -1
  38. package/.next/server/app/analytics.html +1 -1
  39. package/.next/server/app/analytics.rsc +19 -19
  40. package/.next/server/app/analytics.segments/_full.segment.rsc +19 -19
  41. package/.next/server/app/analytics.segments/_head.segment.rsc +4 -4
  42. package/.next/server/app/analytics.segments/_index.segment.rsc +10 -10
  43. package/.next/server/app/analytics.segments/_tree.segment.rsc +2 -2
  44. package/.next/server/app/analytics.segments/analytics/__PAGE__.segment.rsc +4 -4
  45. package/.next/server/app/analytics.segments/analytics.segment.rsc +4 -4
  46. package/.next/server/app/api/[...path]/route.js +1 -1
  47. package/.next/server/app/api/[...path]/route.js.nft.json +1 -1
  48. package/.next/server/app/chat/page.js.nft.json +1 -1
  49. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  50. package/.next/server/app/chat.html +1 -1
  51. package/.next/server/app/chat.rsc +17 -17
  52. package/.next/server/app/chat.segments/_full.segment.rsc +17 -17
  53. package/.next/server/app/chat.segments/_head.segment.rsc +4 -4
  54. package/.next/server/app/chat.segments/_index.segment.rsc +10 -10
  55. package/.next/server/app/chat.segments/_tree.segment.rsc +2 -2
  56. package/.next/server/app/chat.segments/chat/__PAGE__.segment.rsc +4 -4
  57. package/.next/server/app/chat.segments/chat.segment.rsc +3 -3
  58. package/.next/server/app/connections/calendar/page.js.nft.json +1 -1
  59. package/.next/server/app/connections/calendar/page_client-reference-manifest.js +1 -1
  60. package/.next/server/app/connections/calendar.html +1 -1
  61. package/.next/server/app/connections/calendar.rsc +18 -18
  62. package/.next/server/app/connections/calendar.segments/_full.segment.rsc +18 -18
  63. package/.next/server/app/connections/calendar.segments/_head.segment.rsc +4 -4
  64. package/.next/server/app/connections/calendar.segments/_index.segment.rsc +10 -10
  65. package/.next/server/app/connections/calendar.segments/_tree.segment.rsc +2 -2
  66. package/.next/server/app/connections/calendar.segments/connections/calendar/__PAGE__.segment.rsc +4 -4
  67. package/.next/server/app/connections/calendar.segments/connections/calendar.segment.rsc +3 -3
  68. package/.next/server/app/connections/calendar.segments/connections.segment.rsc +4 -4
  69. package/.next/server/app/connections/journal/page.js.nft.json +1 -1
  70. package/.next/server/app/connections/journal/page_client-reference-manifest.js +1 -1
  71. package/.next/server/app/connections/journal.html +1 -1
  72. package/.next/server/app/connections/journal.rsc +16 -16
  73. package/.next/server/app/connections/journal.segments/_full.segment.rsc +16 -16
  74. package/.next/server/app/connections/journal.segments/_head.segment.rsc +4 -4
  75. package/.next/server/app/connections/journal.segments/_index.segment.rsc +10 -10
  76. package/.next/server/app/connections/journal.segments/_tree.segment.rsc +2 -2
  77. package/.next/server/app/connections/journal.segments/connections/journal/__PAGE__.segment.rsc +2 -2
  78. package/.next/server/app/connections/journal.segments/connections/journal.segment.rsc +3 -3
  79. package/.next/server/app/connections/journal.segments/connections.segment.rsc +4 -4
  80. package/.next/server/app/connections/knowledge/page.js.nft.json +1 -1
  81. package/.next/server/app/connections/knowledge/page_client-reference-manifest.js +1 -1
  82. package/.next/server/app/connections/knowledge.html +1 -1
  83. package/.next/server/app/connections/knowledge.rsc +18 -18
  84. package/.next/server/app/connections/knowledge.segments/_full.segment.rsc +18 -18
  85. package/.next/server/app/connections/knowledge.segments/_head.segment.rsc +4 -4
  86. package/.next/server/app/connections/knowledge.segments/_index.segment.rsc +10 -10
  87. package/.next/server/app/connections/knowledge.segments/_tree.segment.rsc +2 -2
  88. package/.next/server/app/connections/knowledge.segments/connections/knowledge/__PAGE__.segment.rsc +4 -4
  89. package/.next/server/app/connections/knowledge.segments/connections/knowledge.segment.rsc +3 -3
  90. package/.next/server/app/connections/knowledge.segments/connections.segment.rsc +4 -4
  91. package/.next/server/app/connections/mail/page.js.nft.json +1 -1
  92. package/.next/server/app/connections/mail/page_client-reference-manifest.js +1 -1
  93. package/.next/server/app/connections/mail.html +1 -1
  94. package/.next/server/app/connections/mail.rsc +18 -18
  95. package/.next/server/app/connections/mail.segments/_full.segment.rsc +18 -18
  96. package/.next/server/app/connections/mail.segments/_head.segment.rsc +4 -4
  97. package/.next/server/app/connections/mail.segments/_index.segment.rsc +10 -10
  98. package/.next/server/app/connections/mail.segments/_tree.segment.rsc +2 -2
  99. package/.next/server/app/connections/mail.segments/connections/mail/__PAGE__.segment.rsc +4 -4
  100. package/.next/server/app/connections/mail.segments/connections/mail.segment.rsc +3 -3
  101. package/.next/server/app/connections/mail.segments/connections.segment.rsc +4 -4
  102. package/.next/server/app/connections/mcp/page.js.nft.json +1 -1
  103. package/.next/server/app/connections/mcp/page_client-reference-manifest.js +1 -1
  104. package/.next/server/app/connections/mcp.html +1 -1
  105. package/.next/server/app/connections/mcp.rsc +18 -18
  106. package/.next/server/app/connections/mcp.segments/_full.segment.rsc +18 -18
  107. package/.next/server/app/connections/mcp.segments/_head.segment.rsc +4 -4
  108. package/.next/server/app/connections/mcp.segments/_index.segment.rsc +10 -10
  109. package/.next/server/app/connections/mcp.segments/_tree.segment.rsc +2 -2
  110. package/.next/server/app/connections/mcp.segments/connections/mcp/__PAGE__.segment.rsc +4 -4
  111. package/.next/server/app/connections/mcp.segments/connections/mcp.segment.rsc +3 -3
  112. package/.next/server/app/connections/mcp.segments/connections.segment.rsc +4 -4
  113. package/.next/server/app/connections/messaging/page.js.nft.json +1 -1
  114. package/.next/server/app/connections/messaging/page_client-reference-manifest.js +1 -1
  115. package/.next/server/app/connections/messaging.html +1 -1
  116. package/.next/server/app/connections/messaging.rsc +18 -18
  117. package/.next/server/app/connections/messaging.segments/_full.segment.rsc +18 -18
  118. package/.next/server/app/connections/messaging.segments/_head.segment.rsc +4 -4
  119. package/.next/server/app/connections/messaging.segments/_index.segment.rsc +10 -10
  120. package/.next/server/app/connections/messaging.segments/_tree.segment.rsc +2 -2
  121. package/.next/server/app/connections/messaging.segments/connections/messaging/__PAGE__.segment.rsc +4 -4
  122. package/.next/server/app/connections/messaging.segments/connections/messaging.segment.rsc +3 -3
  123. package/.next/server/app/connections/messaging.segments/connections.segment.rsc +4 -4
  124. package/.next/server/app/connections/page.js.nft.json +1 -1
  125. package/.next/server/app/connections/page_client-reference-manifest.js +1 -1
  126. package/.next/server/app/connections/repositories/page.js.nft.json +1 -1
  127. package/.next/server/app/connections/repositories/page_client-reference-manifest.js +1 -1
  128. package/.next/server/app/connections/repositories.html +1 -1
  129. package/.next/server/app/connections/repositories.rsc +18 -18
  130. package/.next/server/app/connections/repositories.segments/_full.segment.rsc +18 -18
  131. package/.next/server/app/connections/repositories.segments/_head.segment.rsc +4 -4
  132. package/.next/server/app/connections/repositories.segments/_index.segment.rsc +10 -10
  133. package/.next/server/app/connections/repositories.segments/_tree.segment.rsc +2 -2
  134. package/.next/server/app/connections/repositories.segments/connections/repositories/__PAGE__.segment.rsc +4 -4
  135. package/.next/server/app/connections/repositories.segments/connections/repositories.segment.rsc +3 -3
  136. package/.next/server/app/connections/repositories.segments/connections.segment.rsc +4 -4
  137. package/.next/server/app/connections/routines/page.js.nft.json +1 -1
  138. package/.next/server/app/connections/routines/page_client-reference-manifest.js +1 -1
  139. package/.next/server/app/connections/routines.html +1 -1
  140. package/.next/server/app/connections/routines.rsc +16 -16
  141. package/.next/server/app/connections/routines.segments/_full.segment.rsc +16 -16
  142. package/.next/server/app/connections/routines.segments/_head.segment.rsc +4 -4
  143. package/.next/server/app/connections/routines.segments/_index.segment.rsc +10 -10
  144. package/.next/server/app/connections/routines.segments/_tree.segment.rsc +2 -2
  145. package/.next/server/app/connections/routines.segments/connections/routines/__PAGE__.segment.rsc +2 -2
  146. package/.next/server/app/connections/routines.segments/connections/routines.segment.rsc +3 -3
  147. package/.next/server/app/connections/routines.segments/connections.segment.rsc +4 -4
  148. package/.next/server/app/connections.html +1 -1
  149. package/.next/server/app/connections.rsc +16 -16
  150. package/.next/server/app/connections.segments/_full.segment.rsc +16 -16
  151. package/.next/server/app/connections.segments/_head.segment.rsc +4 -4
  152. package/.next/server/app/connections.segments/_index.segment.rsc +10 -10
  153. package/.next/server/app/connections.segments/_tree.segment.rsc +2 -2
  154. package/.next/server/app/connections.segments/connections/__PAGE__.segment.rsc +2 -2
  155. package/.next/server/app/connections.segments/connections.segment.rsc +4 -4
  156. package/.next/server/app/conversations/[id]/page.js.nft.json +1 -1
  157. package/.next/server/app/conversations/[id]/page_client-reference-manifest.js +1 -1
  158. package/.next/server/app/conversations/page.js.nft.json +1 -1
  159. package/.next/server/app/conversations/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/conversations.html +1 -1
  161. package/.next/server/app/conversations.rsc +15 -15
  162. package/.next/server/app/conversations.segments/_full.segment.rsc +15 -15
  163. package/.next/server/app/conversations.segments/_head.segment.rsc +4 -4
  164. package/.next/server/app/conversations.segments/_index.segment.rsc +10 -10
  165. package/.next/server/app/conversations.segments/_tree.segment.rsc +2 -2
  166. package/.next/server/app/conversations.segments/conversations/__PAGE__.segment.rsc +2 -2
  167. package/.next/server/app/conversations.segments/conversations.segment.rsc +3 -3
  168. package/.next/server/app/docs/[[...slug]]/page.js.nft.json +1 -1
  169. package/.next/server/app/docs/[[...slug]]/page_client-reference-manifest.js +1 -1
  170. package/.next/server/app/finance/page.js.nft.json +1 -1
  171. package/.next/server/app/finance/page_client-reference-manifest.js +1 -1
  172. package/.next/server/app/finance.html +1 -1
  173. package/.next/server/app/finance.rsc +17 -17
  174. package/.next/server/app/finance.segments/_full.segment.rsc +17 -17
  175. package/.next/server/app/finance.segments/_head.segment.rsc +4 -4
  176. package/.next/server/app/finance.segments/_index.segment.rsc +10 -10
  177. package/.next/server/app/finance.segments/_tree.segment.rsc +2 -2
  178. package/.next/server/app/finance.segments/finance/__PAGE__.segment.rsc +4 -4
  179. package/.next/server/app/finance.segments/finance.segment.rsc +3 -3
  180. package/.next/server/app/git/page.js.nft.json +1 -1
  181. package/.next/server/app/git/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/git.html +1 -1
  183. package/.next/server/app/git.rsc +17 -17
  184. package/.next/server/app/git.segments/_full.segment.rsc +17 -17
  185. package/.next/server/app/git.segments/_head.segment.rsc +4 -4
  186. package/.next/server/app/git.segments/_index.segment.rsc +10 -10
  187. package/.next/server/app/git.segments/_tree.segment.rsc +2 -2
  188. package/.next/server/app/git.segments/git/__PAGE__.segment.rsc +4 -4
  189. package/.next/server/app/git.segments/git.segment.rsc +3 -3
  190. package/.next/server/app/health/page.js.nft.json +1 -1
  191. package/.next/server/app/health/page_client-reference-manifest.js +1 -1
  192. package/.next/server/app/health.html +1 -1
  193. package/.next/server/app/health.rsc +17 -17
  194. package/.next/server/app/health.segments/_full.segment.rsc +17 -17
  195. package/.next/server/app/health.segments/_head.segment.rsc +4 -4
  196. package/.next/server/app/health.segments/_index.segment.rsc +10 -10
  197. package/.next/server/app/health.segments/_tree.segment.rsc +2 -2
  198. package/.next/server/app/health.segments/health/__PAGE__.segment.rsc +4 -4
  199. package/.next/server/app/health.segments/health.segment.rsc +3 -3
  200. package/.next/server/app/index.html +1 -1
  201. package/.next/server/app/index.rsc +17 -17
  202. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  203. package/.next/server/app/index.segments/_full.segment.rsc +17 -17
  204. package/.next/server/app/index.segments/_head.segment.rsc +4 -4
  205. package/.next/server/app/index.segments/_index.segment.rsc +10 -10
  206. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/.next/server/app/knowledge/page.js.nft.json +1 -1
  208. package/.next/server/app/knowledge/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/knowledge.html +1 -1
  210. package/.next/server/app/knowledge.rsc +18 -18
  211. package/.next/server/app/knowledge.segments/_full.segment.rsc +18 -18
  212. package/.next/server/app/knowledge.segments/_head.segment.rsc +4 -4
  213. package/.next/server/app/knowledge.segments/_index.segment.rsc +10 -10
  214. package/.next/server/app/knowledge.segments/_tree.segment.rsc +2 -2
  215. package/.next/server/app/knowledge.segments/knowledge/__PAGE__.segment.rsc +4 -4
  216. package/.next/server/app/knowledge.segments/knowledge.segment.rsc +4 -4
  217. package/.next/server/app/page.js.nft.json +1 -1
  218. package/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/reading/page.js.nft.json +1 -1
  220. package/.next/server/app/reading/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/reading.html +1 -1
  222. package/.next/server/app/reading.rsc +17 -17
  223. package/.next/server/app/reading.segments/_full.segment.rsc +17 -17
  224. package/.next/server/app/reading.segments/_head.segment.rsc +4 -4
  225. package/.next/server/app/reading.segments/_index.segment.rsc +10 -10
  226. package/.next/server/app/reading.segments/_tree.segment.rsc +2 -2
  227. package/.next/server/app/reading.segments/reading/__PAGE__.segment.rsc +4 -4
  228. package/.next/server/app/reading.segments/reading.segment.rsc +3 -3
  229. package/.next/server/app/schedule/page.js.nft.json +1 -1
  230. package/.next/server/app/schedule/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/schedule.html +1 -1
  232. package/.next/server/app/schedule.rsc +17 -17
  233. package/.next/server/app/schedule.segments/_full.segment.rsc +17 -17
  234. package/.next/server/app/schedule.segments/_head.segment.rsc +4 -4
  235. package/.next/server/app/schedule.segments/_index.segment.rsc +10 -10
  236. package/.next/server/app/schedule.segments/_tree.segment.rsc +2 -2
  237. package/.next/server/app/schedule.segments/schedule/__PAGE__.segment.rsc +4 -4
  238. package/.next/server/app/schedule.segments/schedule.segment.rsc +3 -3
  239. package/.next/server/app/settings/advanced/page.js.nft.json +1 -1
  240. package/.next/server/app/settings/advanced/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/settings/advanced.html +1 -1
  242. package/.next/server/app/settings/advanced.rsc +18 -18
  243. package/.next/server/app/settings/advanced.segments/_full.segment.rsc +18 -18
  244. package/.next/server/app/settings/advanced.segments/_head.segment.rsc +4 -4
  245. package/.next/server/app/settings/advanced.segments/_index.segment.rsc +10 -10
  246. package/.next/server/app/settings/advanced.segments/_tree.segment.rsc +2 -2
  247. package/.next/server/app/settings/advanced.segments/settings/advanced/__PAGE__.segment.rsc +4 -4
  248. package/.next/server/app/settings/advanced.segments/settings/advanced.segment.rsc +3 -3
  249. package/.next/server/app/settings/advanced.segments/settings.segment.rsc +4 -4
  250. package/.next/server/app/settings/backends/page.js.nft.json +1 -1
  251. package/.next/server/app/settings/backends/page_client-reference-manifest.js +1 -1
  252. package/.next/server/app/settings/backends.html +1 -1
  253. package/.next/server/app/settings/backends.rsc +16 -16
  254. package/.next/server/app/settings/backends.segments/_full.segment.rsc +16 -16
  255. package/.next/server/app/settings/backends.segments/_head.segment.rsc +4 -4
  256. package/.next/server/app/settings/backends.segments/_index.segment.rsc +10 -10
  257. package/.next/server/app/settings/backends.segments/_tree.segment.rsc +2 -2
  258. package/.next/server/app/settings/backends.segments/settings/backends/__PAGE__.segment.rsc +2 -2
  259. package/.next/server/app/settings/backends.segments/settings/backends.segment.rsc +3 -3
  260. package/.next/server/app/settings/backends.segments/settings.segment.rsc +4 -4
  261. package/.next/server/app/settings/commands/page.js.nft.json +1 -1
  262. package/.next/server/app/settings/commands/page_client-reference-manifest.js +1 -1
  263. package/.next/server/app/settings/commands.html +1 -1
  264. package/.next/server/app/settings/commands.rsc +18 -18
  265. package/.next/server/app/settings/commands.segments/_full.segment.rsc +18 -18
  266. package/.next/server/app/settings/commands.segments/_head.segment.rsc +4 -4
  267. package/.next/server/app/settings/commands.segments/_index.segment.rsc +10 -10
  268. package/.next/server/app/settings/commands.segments/_tree.segment.rsc +2 -2
  269. package/.next/server/app/settings/commands.segments/settings/commands/__PAGE__.segment.rsc +4 -4
  270. package/.next/server/app/settings/commands.segments/settings/commands.segment.rsc +3 -3
  271. package/.next/server/app/settings/commands.segments/settings.segment.rsc +4 -4
  272. package/.next/server/app/settings/connections/page.js.nft.json +1 -1
  273. package/.next/server/app/settings/connections/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/settings/connections.html +1 -1
  275. package/.next/server/app/settings/connections.rsc +16 -16
  276. package/.next/server/app/settings/connections.segments/_full.segment.rsc +16 -16
  277. package/.next/server/app/settings/connections.segments/_head.segment.rsc +4 -4
  278. package/.next/server/app/settings/connections.segments/_index.segment.rsc +10 -10
  279. package/.next/server/app/settings/connections.segments/_tree.segment.rsc +2 -2
  280. package/.next/server/app/settings/connections.segments/settings/connections/__PAGE__.segment.rsc +2 -2
  281. package/.next/server/app/settings/connections.segments/settings/connections.segment.rsc +3 -3
  282. package/.next/server/app/settings/connections.segments/settings.segment.rsc +4 -4
  283. package/.next/server/app/settings/journal/page.js.nft.json +1 -1
  284. package/.next/server/app/settings/journal/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/settings/journal.html +1 -1
  286. package/.next/server/app/settings/journal.rsc +18 -18
  287. package/.next/server/app/settings/journal.segments/_full.segment.rsc +18 -18
  288. package/.next/server/app/settings/journal.segments/_head.segment.rsc +4 -4
  289. package/.next/server/app/settings/journal.segments/_index.segment.rsc +10 -10
  290. package/.next/server/app/settings/journal.segments/_tree.segment.rsc +2 -2
  291. package/.next/server/app/settings/journal.segments/settings/journal/__PAGE__.segment.rsc +4 -4
  292. package/.next/server/app/settings/journal.segments/settings/journal.segment.rsc +3 -3
  293. package/.next/server/app/settings/journal.segments/settings.segment.rsc +4 -4
  294. package/.next/server/app/settings/management/page.js.nft.json +1 -1
  295. package/.next/server/app/settings/management/page_client-reference-manifest.js +1 -1
  296. package/.next/server/app/settings/management.html +1 -1
  297. package/.next/server/app/settings/management.rsc +18 -18
  298. package/.next/server/app/settings/management.segments/_full.segment.rsc +18 -18
  299. package/.next/server/app/settings/management.segments/_head.segment.rsc +4 -4
  300. package/.next/server/app/settings/management.segments/_index.segment.rsc +10 -10
  301. package/.next/server/app/settings/management.segments/_tree.segment.rsc +2 -2
  302. package/.next/server/app/settings/management.segments/settings/management/__PAGE__.segment.rsc +4 -4
  303. package/.next/server/app/settings/management.segments/settings/management.segment.rsc +3 -3
  304. package/.next/server/app/settings/management.segments/settings.segment.rsc +4 -4
  305. package/.next/server/app/settings/messaging/page.js.nft.json +1 -1
  306. package/.next/server/app/settings/messaging/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app/settings/messaging.html +1 -1
  308. package/.next/server/app/settings/messaging.rsc +16 -16
  309. package/.next/server/app/settings/messaging.segments/_full.segment.rsc +16 -16
  310. package/.next/server/app/settings/messaging.segments/_head.segment.rsc +4 -4
  311. package/.next/server/app/settings/messaging.segments/_index.segment.rsc +10 -10
  312. package/.next/server/app/settings/messaging.segments/_tree.segment.rsc +2 -2
  313. package/.next/server/app/settings/messaging.segments/settings/messaging/__PAGE__.segment.rsc +2 -2
  314. package/.next/server/app/settings/messaging.segments/settings/messaging.segment.rsc +3 -3
  315. package/.next/server/app/settings/messaging.segments/settings.segment.rsc +4 -4
  316. package/.next/server/app/settings/models/page.js.nft.json +1 -1
  317. package/.next/server/app/settings/models/page_client-reference-manifest.js +1 -1
  318. package/.next/server/app/settings/models.html +1 -1
  319. package/.next/server/app/settings/models.rsc +18 -18
  320. package/.next/server/app/settings/models.segments/_full.segment.rsc +18 -18
  321. package/.next/server/app/settings/models.segments/_head.segment.rsc +4 -4
  322. package/.next/server/app/settings/models.segments/_index.segment.rsc +10 -10
  323. package/.next/server/app/settings/models.segments/_tree.segment.rsc +2 -2
  324. package/.next/server/app/settings/models.segments/settings/models/__PAGE__.segment.rsc +4 -4
  325. package/.next/server/app/settings/models.segments/settings/models.segment.rsc +3 -3
  326. package/.next/server/app/settings/models.segments/settings.segment.rsc +4 -4
  327. package/.next/server/app/settings/page.js.nft.json +1 -1
  328. package/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  329. package/.next/server/app/settings/processes/page.js.nft.json +1 -1
  330. package/.next/server/app/settings/processes/page_client-reference-manifest.js +1 -1
  331. package/.next/server/app/settings/processes.html +1 -1
  332. package/.next/server/app/settings/processes.rsc +16 -16
  333. package/.next/server/app/settings/processes.segments/_full.segment.rsc +16 -16
  334. package/.next/server/app/settings/processes.segments/_head.segment.rsc +4 -4
  335. package/.next/server/app/settings/processes.segments/_index.segment.rsc +10 -10
  336. package/.next/server/app/settings/processes.segments/_tree.segment.rsc +2 -2
  337. package/.next/server/app/settings/processes.segments/settings/processes/__PAGE__.segment.rsc +2 -2
  338. package/.next/server/app/settings/processes.segments/settings/processes.segment.rsc +3 -3
  339. package/.next/server/app/settings/processes.segments/settings.segment.rsc +4 -4
  340. package/.next/server/app/settings/routines/page.js.nft.json +1 -1
  341. package/.next/server/app/settings/routines/page_client-reference-manifest.js +1 -1
  342. package/.next/server/app/settings/routines.html +1 -1
  343. package/.next/server/app/settings/routines.rsc +18 -18
  344. package/.next/server/app/settings/routines.segments/_full.segment.rsc +18 -18
  345. package/.next/server/app/settings/routines.segments/_head.segment.rsc +4 -4
  346. package/.next/server/app/settings/routines.segments/_index.segment.rsc +10 -10
  347. package/.next/server/app/settings/routines.segments/_tree.segment.rsc +2 -2
  348. package/.next/server/app/settings/routines.segments/settings/routines/__PAGE__.segment.rsc +4 -4
  349. package/.next/server/app/settings/routines.segments/settings/routines.segment.rsc +3 -3
  350. package/.next/server/app/settings/routines.segments/settings.segment.rsc +4 -4
  351. package/.next/server/app/settings/schedule/page.js.nft.json +1 -1
  352. package/.next/server/app/settings/schedule/page_client-reference-manifest.js +1 -1
  353. package/.next/server/app/settings/schedule.html +1 -1
  354. package/.next/server/app/settings/schedule.rsc +18 -18
  355. package/.next/server/app/settings/schedule.segments/_full.segment.rsc +18 -18
  356. package/.next/server/app/settings/schedule.segments/_head.segment.rsc +4 -4
  357. package/.next/server/app/settings/schedule.segments/_index.segment.rsc +10 -10
  358. package/.next/server/app/settings/schedule.segments/_tree.segment.rsc +2 -2
  359. package/.next/server/app/settings/schedule.segments/settings/schedule/__PAGE__.segment.rsc +4 -4
  360. package/.next/server/app/settings/schedule.segments/settings/schedule.segment.rsc +3 -3
  361. package/.next/server/app/settings/schedule.segments/settings.segment.rsc +4 -4
  362. package/.next/server/app/settings/self-learning/page.js.nft.json +1 -1
  363. package/.next/server/app/settings/self-learning/page_client-reference-manifest.js +1 -1
  364. package/.next/server/app/settings/self-learning.html +1 -1
  365. package/.next/server/app/settings/self-learning.rsc +18 -18
  366. package/.next/server/app/settings/self-learning.segments/_full.segment.rsc +18 -18
  367. package/.next/server/app/settings/self-learning.segments/_head.segment.rsc +4 -4
  368. package/.next/server/app/settings/self-learning.segments/_index.segment.rsc +10 -10
  369. package/.next/server/app/settings/self-learning.segments/_tree.segment.rsc +2 -2
  370. package/.next/server/app/settings/self-learning.segments/settings/self-learning/__PAGE__.segment.rsc +4 -4
  371. package/.next/server/app/settings/self-learning.segments/settings/self-learning.segment.rsc +3 -3
  372. package/.next/server/app/settings/self-learning.segments/settings.segment.rsc +4 -4
  373. package/.next/server/app/settings/wiki/page/app-paths-manifest.json +3 -0
  374. package/.next/server/app/settings/wiki/page/build-manifest.json +18 -0
  375. package/.next/server/app/settings/wiki/page/next-font-manifest.json +6 -0
  376. package/.next/server/app/settings/wiki/page/react-loadable-manifest.json +8 -0
  377. package/.next/server/app/settings/wiki/page/server-reference-manifest.json +4 -0
  378. package/.next/server/app/settings/wiki/page.js +16 -0
  379. package/.next/server/app/settings/wiki/page.js.map +5 -0
  380. package/.next/server/app/settings/wiki/page.js.nft.json +1 -0
  381. package/.next/server/app/settings/wiki/page_client-reference-manifest.js +3 -0
  382. package/.next/server/app/settings/wiki/timeline/page/app-paths-manifest.json +3 -0
  383. package/.next/server/app/settings/wiki/timeline/page/build-manifest.json +18 -0
  384. package/.next/server/app/settings/wiki/timeline/page/next-font-manifest.json +6 -0
  385. package/.next/server/app/settings/wiki/timeline/page/react-loadable-manifest.json +8 -0
  386. package/.next/server/app/settings/wiki/timeline/page/server-reference-manifest.json +4 -0
  387. package/.next/server/app/settings/wiki/timeline/page.js +17 -0
  388. package/.next/server/app/settings/wiki/timeline/page.js.map +5 -0
  389. package/.next/server/app/settings/wiki/timeline/page.js.nft.json +1 -0
  390. package/.next/server/app/settings/wiki/timeline/page_client-reference-manifest.js +3 -0
  391. package/.next/server/app/settings/wiki/timeline.html +1 -0
  392. package/.next/server/app/settings/wiki/timeline.meta +17 -0
  393. package/.next/server/app/settings/wiki/timeline.rsc +24 -0
  394. package/.next/server/app/settings/wiki/timeline.segments/_full.segment.rsc +24 -0
  395. package/.next/server/app/settings/wiki/timeline.segments/_head.segment.rsc +6 -0
  396. package/.next/server/app/settings/wiki/timeline.segments/_index.segment.rsc +11 -0
  397. package/.next/server/app/settings/wiki/timeline.segments/_tree.segment.rsc +2 -0
  398. package/.next/server/app/settings/wiki/timeline.segments/settings/wiki/timeline/__PAGE__.segment.rsc +6 -0
  399. package/.next/server/app/settings/wiki/timeline.segments/settings/wiki/timeline.segment.rsc +5 -0
  400. package/.next/server/app/settings/wiki/timeline.segments/settings/wiki.segment.rsc +5 -0
  401. package/.next/server/app/settings/wiki/timeline.segments/settings.segment.rsc +5 -0
  402. package/.next/server/app/settings/wiki.html +1 -0
  403. package/.next/server/app/settings/wiki.meta +16 -0
  404. package/.next/server/app/settings/wiki.rsc +27 -0
  405. package/.next/server/app/settings/wiki.segments/_full.segment.rsc +27 -0
  406. package/.next/server/app/settings/wiki.segments/_head.segment.rsc +6 -0
  407. package/.next/server/app/settings/wiki.segments/_index.segment.rsc +11 -0
  408. package/.next/server/app/settings/wiki.segments/_tree.segment.rsc +2 -0
  409. package/.next/server/app/settings/wiki.segments/settings/wiki/__PAGE__.segment.rsc +9 -0
  410. package/.next/server/app/settings/wiki.segments/settings/wiki.segment.rsc +5 -0
  411. package/.next/server/app/settings/wiki.segments/settings.segment.rsc +5 -0
  412. package/.next/server/app/settings.html +1 -1
  413. package/.next/server/app/settings.rsc +18 -18
  414. package/.next/server/app/settings.segments/_full.segment.rsc +18 -18
  415. package/.next/server/app/settings.segments/_head.segment.rsc +4 -4
  416. package/.next/server/app/settings.segments/_index.segment.rsc +10 -10
  417. package/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
  418. package/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +4 -4
  419. package/.next/server/app/settings.segments/settings.segment.rsc +4 -4
  420. package/.next/server/app/setup/page.js.nft.json +1 -1
  421. package/.next/server/app/setup/page_client-reference-manifest.js +1 -1
  422. package/.next/server/app/setup.html +1 -1
  423. package/.next/server/app/setup.rsc +17 -17
  424. package/.next/server/app/setup.segments/_full.segment.rsc +17 -17
  425. package/.next/server/app/setup.segments/_head.segment.rsc +4 -4
  426. package/.next/server/app/setup.segments/_index.segment.rsc +10 -10
  427. package/.next/server/app/setup.segments/_tree.segment.rsc +2 -2
  428. package/.next/server/app/setup.segments/setup/__PAGE__.segment.rsc +4 -4
  429. package/.next/server/app/setup.segments/setup.segment.rsc +3 -3
  430. package/.next/server/app/trip/page.js.nft.json +1 -1
  431. package/.next/server/app/trip/page_client-reference-manifest.js +1 -1
  432. package/.next/server/app/trip.html +1 -1
  433. package/.next/server/app/trip.rsc +17 -17
  434. package/.next/server/app/trip.segments/_full.segment.rsc +17 -17
  435. package/.next/server/app/trip.segments/_head.segment.rsc +4 -4
  436. package/.next/server/app/trip.segments/_index.segment.rsc +10 -10
  437. package/.next/server/app/trip.segments/_tree.segment.rsc +2 -2
  438. package/.next/server/app/trip.segments/trip/__PAGE__.segment.rsc +4 -4
  439. package/.next/server/app/trip.segments/trip.segment.rsc +3 -3
  440. package/.next/server/app/wiki/page/app-paths-manifest.json +3 -0
  441. package/.next/server/app/wiki/page/build-manifest.json +18 -0
  442. package/.next/server/app/wiki/page/next-font-manifest.json +6 -0
  443. package/.next/server/app/wiki/page/react-loadable-manifest.json +8 -0
  444. package/.next/server/app/wiki/page/server-reference-manifest.json +4 -0
  445. package/.next/server/app/wiki/page.js +15 -0
  446. package/.next/server/app/wiki/page.js.map +5 -0
  447. package/.next/server/app/wiki/page.js.nft.json +1 -0
  448. package/.next/server/app/wiki/page_client-reference-manifest.js +3 -0
  449. package/.next/server/app/wiki/timeline/page/app-paths-manifest.json +3 -0
  450. package/.next/server/app/wiki/timeline/page/build-manifest.json +18 -0
  451. package/.next/server/app/wiki/timeline/page/next-font-manifest.json +6 -0
  452. package/.next/server/app/wiki/timeline/page/react-loadable-manifest.json +8 -0
  453. package/.next/server/app/wiki/timeline/page/server-reference-manifest.json +4 -0
  454. package/.next/server/app/wiki/timeline/page.js +15 -0
  455. package/.next/server/app/wiki/timeline/page.js.map +5 -0
  456. package/.next/server/app/wiki/timeline/page.js.nft.json +1 -0
  457. package/.next/server/app/wiki/timeline/page_client-reference-manifest.js +3 -0
  458. package/.next/server/app/wiki/timeline.html +1 -0
  459. package/.next/server/app/wiki/timeline.meta +16 -0
  460. package/.next/server/app/wiki/timeline.rsc +26 -0
  461. package/.next/server/app/wiki/timeline.segments/_full.segment.rsc +26 -0
  462. package/.next/server/app/wiki/timeline.segments/_head.segment.rsc +6 -0
  463. package/.next/server/app/wiki/timeline.segments/_index.segment.rsc +11 -0
  464. package/.next/server/app/wiki/timeline.segments/_tree.segment.rsc +2 -0
  465. package/.next/server/app/wiki/timeline.segments/wiki/timeline/__PAGE__.segment.rsc +9 -0
  466. package/.next/server/app/wiki/timeline.segments/wiki/timeline.segment.rsc +5 -0
  467. package/.next/server/app/wiki/timeline.segments/wiki.segment.rsc +5 -0
  468. package/.next/server/app/wiki.html +1 -0
  469. package/.next/server/app/wiki.meta +15 -0
  470. package/.next/server/app/wiki.rsc +26 -0
  471. package/.next/server/app/wiki.segments/_full.segment.rsc +26 -0
  472. package/.next/server/app/wiki.segments/_head.segment.rsc +6 -0
  473. package/.next/server/app/wiki.segments/_index.segment.rsc +11 -0
  474. package/.next/server/app/wiki.segments/_tree.segment.rsc +2 -0
  475. package/.next/server/app/wiki.segments/wiki/__PAGE__.segment.rsc +9 -0
  476. package/.next/server/app/wiki.segments/wiki.segment.rsc +5 -0
  477. package/.next/server/app-paths-manifest.json +5 -1
  478. package/.next/server/chunks/0z~i_next_dist_esm_build_templates_app-route_0o_o_hp.js +1 -1
  479. package/.next/server/chunks/0z~i_next_dist_esm_build_templates_app-route_0o_o_hp.js.map +1 -1
  480. package/.next/server/chunks/{[root-of-the-server]__00gp8gz._.js → [root-of-the-server]__01knfi.._.js} +1 -1
  481. package/.next/server/chunks/{[root-of-the-server]__0-0wgko._.js → [root-of-the-server]__08_s4yo._.js} +2 -2
  482. package/.next/server/chunks/ssr/0juq_dashboard__next-internal_server_app_settings_wiki_timeline_page_actions_0czqn6z.js +3 -0
  483. package/.next/server/chunks/ssr/0juq_dashboard__next-internal_server_app_settings_wiki_timeline_page_actions_0czqn6z.js.map +1 -0
  484. package/.next/server/chunks/ssr/0mzu_lucide-react_dist_esm_icons_zap_115-27i.js +3 -0
  485. package/.next/server/chunks/ssr/0mzu_lucide-react_dist_esm_icons_zap_115-27i.js.map +1 -0
  486. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0k3x-na.js +4 -0
  487. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0k3x-na.js.map +1 -0
  488. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0km22.v.js +4 -0
  489. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0km22.v.js.map +1 -0
  490. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0vui1gx.js +4 -0
  491. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_0vui1gx.js.map +1 -0
  492. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_11h319t.js +4 -0
  493. package/.next/server/chunks/ssr/0z~i_next_dist_esm_build_templates_app-page_11h319t.js.map +1 -0
  494. package/.next/server/chunks/ssr/[root-of-the-server]__007ymqm._.js +3 -0
  495. package/.next/server/chunks/ssr/[root-of-the-server]__007ymqm._.js.map +1 -0
  496. package/.next/server/chunks/ssr/[root-of-the-server]__00vjce2._.js +3 -0
  497. package/.next/server/chunks/ssr/[root-of-the-server]__00vjce2._.js.map +1 -0
  498. package/.next/server/chunks/ssr/[root-of-the-server]__07pkvm3._.js +3 -0
  499. package/.next/server/chunks/ssr/[root-of-the-server]__07pkvm3._.js.map +1 -0
  500. package/.next/server/chunks/ssr/[root-of-the-server]__0dfuz7_._.js +3 -0
  501. package/.next/server/chunks/ssr/[root-of-the-server]__0dfuz7_._.js.map +1 -0
  502. package/.next/server/chunks/ssr/[root-of-the-server]__117dw_l._.js +3 -0
  503. package/.next/server/chunks/ssr/[root-of-the-server]__117dw_l._.js.map +1 -0
  504. package/.next/server/chunks/ssr/_0-3uzu1._.js +3 -0
  505. package/.next/server/chunks/ssr/_0-3uzu1._.js.map +1 -0
  506. package/.next/server/chunks/ssr/_0-6jgyg._.js +3 -0
  507. package/.next/server/chunks/ssr/_0-6jgyg._.js.map +1 -0
  508. package/.next/server/chunks/ssr/_0-fv_sr._.js +1 -1
  509. package/.next/server/chunks/ssr/_0-fv_sr._.js.map +1 -1
  510. package/.next/server/chunks/ssr/_0.7pki~._.js +3 -0
  511. package/.next/server/chunks/ssr/_0.7pki~._.js.map +1 -0
  512. package/.next/server/chunks/ssr/_02s86rg._.js +3 -0
  513. package/.next/server/chunks/ssr/_02s86rg._.js.map +1 -0
  514. package/.next/server/chunks/ssr/_03bq.de._.js +3 -0
  515. package/.next/server/chunks/ssr/_03bq.de._.js.map +1 -0
  516. package/.next/server/chunks/ssr/_03u6ja0._.js +3 -0
  517. package/.next/server/chunks/ssr/_03u6ja0._.js.map +1 -0
  518. package/.next/server/chunks/ssr/_04-.z69._.js +3 -0
  519. package/.next/server/chunks/ssr/_04-.z69._.js.map +1 -0
  520. package/.next/server/chunks/ssr/_05rlac0._.js +3 -0
  521. package/.next/server/chunks/ssr/_05rlac0._.js.map +1 -0
  522. package/.next/server/chunks/ssr/_05xysbw._.js +3 -0
  523. package/.next/server/chunks/ssr/_05xysbw._.js.map +1 -0
  524. package/.next/server/chunks/ssr/_09e_66m._.js +3 -0
  525. package/.next/server/chunks/ssr/_09e_66m._.js.map +1 -0
  526. package/.next/server/chunks/ssr/_0_bnan9._.js +3 -0
  527. package/.next/server/chunks/ssr/_0_bnan9._.js.map +1 -0
  528. package/.next/server/chunks/ssr/_0b00io4._.js +3 -0
  529. package/.next/server/chunks/ssr/_0b00io4._.js.map +1 -0
  530. package/.next/server/chunks/ssr/_0es_2i2._.js +3 -0
  531. package/.next/server/chunks/ssr/_0es_2i2._.js.map +1 -0
  532. package/.next/server/chunks/ssr/_0g7_r5i._.js +3 -0
  533. package/.next/server/chunks/ssr/_0g7_r5i._.js.map +1 -0
  534. package/.next/server/chunks/ssr/_0hojxqy._.js +1 -1
  535. package/.next/server/chunks/ssr/_0hojxqy._.js.map +1 -1
  536. package/.next/server/chunks/ssr/_0ifb9jm._.js +3 -0
  537. package/.next/server/chunks/ssr/_0ifb9jm._.js.map +1 -0
  538. package/.next/server/chunks/ssr/_0jl_-u5._.js +3 -0
  539. package/.next/server/chunks/ssr/_0jl_-u5._.js.map +1 -0
  540. package/.next/server/chunks/ssr/_0lfuvjg._.js +3 -0
  541. package/.next/server/chunks/ssr/_0lfuvjg._.js.map +1 -0
  542. package/.next/server/chunks/ssr/{_0jm~wn-._.js → _0mp7n5i._.js} +2 -2
  543. package/.next/server/chunks/ssr/{_0jm~wn-._.js.map → _0mp7n5i._.js.map} +1 -1
  544. package/.next/server/chunks/ssr/_0powsoh._.js +3 -0
  545. package/.next/server/chunks/ssr/_0powsoh._.js.map +1 -0
  546. package/.next/server/chunks/ssr/_0q34y9l._.js +3 -0
  547. package/.next/server/chunks/ssr/_0q34y9l._.js.map +1 -0
  548. package/.next/server/chunks/ssr/_0q4rpi-._.js +5 -0
  549. package/.next/server/chunks/ssr/_0q4rpi-._.js.map +1 -0
  550. package/.next/server/chunks/ssr/_0rc-7d4._.js +3 -0
  551. package/.next/server/chunks/ssr/_0rc-7d4._.js.map +1 -0
  552. package/.next/server/chunks/ssr/_0tjsh16._.js +3 -0
  553. package/.next/server/chunks/ssr/_0tjsh16._.js.map +1 -0
  554. package/.next/server/chunks/ssr/_0tl98en._.js +1 -1
  555. package/.next/server/chunks/ssr/_0tl98en._.js.map +1 -1
  556. package/.next/server/chunks/ssr/{_0._ysx3._.js → _0v_6ros._.js} +2 -2
  557. package/.next/server/chunks/ssr/_0v_6ros._.js.map +1 -0
  558. package/.next/server/chunks/ssr/_0vncjim._.js +3 -0
  559. package/.next/server/chunks/ssr/_0vncjim._.js.map +1 -0
  560. package/.next/server/chunks/ssr/_0vx-jgf._.js +3 -0
  561. package/.next/server/chunks/ssr/_0vx-jgf._.js.map +1 -0
  562. package/.next/server/chunks/ssr/_0w1ez1p._.js +3 -0
  563. package/.next/server/chunks/ssr/_0w1ez1p._.js.map +1 -0
  564. package/.next/server/chunks/ssr/_0yl49yk._.js +3 -0
  565. package/.next/server/chunks/ssr/_0yl49yk._.js.map +1 -0
  566. package/.next/server/chunks/ssr/_0z1ah9x._.js +1 -1
  567. package/.next/server/chunks/ssr/_0z1ah9x._.js.map +1 -1
  568. package/.next/server/chunks/ssr/_0z9ikwn._.js +3 -0
  569. package/.next/server/chunks/ssr/_0z9ikwn._.js.map +1 -0
  570. package/.next/server/chunks/ssr/_0z_cp12._.js +3 -0
  571. package/.next/server/chunks/ssr/_0z_cp12._.js.map +1 -0
  572. package/.next/server/chunks/ssr/_10hvwg5._.js +3 -0
  573. package/.next/server/chunks/ssr/_10hvwg5._.js.map +1 -0
  574. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_settings_wiki_page_actions_12d~w9l.js +3 -0
  575. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_settings_wiki_page_actions_12d~w9l.js.map +1 -0
  576. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_page_actions_026bi.d.js +3 -0
  577. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_page_actions_026bi.d.js.map +1 -0
  578. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_timeline_page_actions_06jb4gg.js +3 -0
  579. package/.next/server/chunks/ssr/packages_dashboard__next-internal_server_app_wiki_timeline_page_actions_06jb4gg.js.map +1 -0
  580. package/.next/server/chunks/ssr/packages_dashboard_src_0bx940s._.js +3 -0
  581. package/.next/server/chunks/ssr/packages_dashboard_src_0bx940s._.js.map +1 -0
  582. package/.next/server/chunks/ssr/packages_dashboard_src_0fo7nqq._.js +3 -0
  583. package/.next/server/chunks/ssr/packages_dashboard_src_0fo7nqq._.js.map +1 -0
  584. package/.next/server/chunks/ssr/packages_dashboard_src_0uxs9-.._.js +1 -1
  585. package/.next/server/chunks/ssr/packages_dashboard_src_0uxs9-.._.js.map +1 -1
  586. package/.next/server/chunks/ssr/packages_dashboard_src_app_activity_page_tsx_08yep46._.js +1 -1
  587. package/.next/server/chunks/ssr/packages_dashboard_src_app_activity_page_tsx_08yep46._.js.map +1 -1
  588. package/.next/server/chunks/ssr/packages_dashboard_src_app_connections_repositories_page_tsx_08y6paq._.js +1 -1
  589. package/.next/server/chunks/ssr/packages_dashboard_src_app_connections_repositories_page_tsx_08y6paq._.js.map +1 -1
  590. package/.next/server/chunks/ssr/packages_dashboard_src_app_git_page_tsx_0ah19-6._.js +1 -1
  591. package/.next/server/chunks/ssr/packages_dashboard_src_app_git_page_tsx_0ah19-6._.js.map +1 -1
  592. package/.next/server/chunks/ssr/packages_dashboard_src_app_schedule_page_tsx_0znc404._.js +1 -1
  593. package/.next/server/chunks/ssr/packages_dashboard_src_app_schedule_page_tsx_0znc404._.js.map +1 -1
  594. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js +1 -1
  595. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_models_page_tsx_0djsx88._.js.map +1 -1
  596. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_schedule_page_tsx_0b8zr2l._.js +1 -1
  597. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_schedule_page_tsx_0b8zr2l._.js.map +1 -1
  598. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js +3 -0
  599. package/.next/server/chunks/ssr/packages_dashboard_src_app_settings_wiki_page_tsx_0..1tkb._.js.map +1 -0
  600. package/.next/server/chunks/ssr/packages_dashboard_src_app_setup_page_tsx_06k3via._.js +1 -1
  601. package/.next/server/chunks/ssr/packages_dashboard_src_app_setup_page_tsx_06k3via._.js.map +1 -1
  602. package/.next/server/chunks/ssr/packages_dashboard_src_components_connections_slack-card_tsx_0mahejj._.js +1 -1
  603. package/.next/server/chunks/ssr/packages_dashboard_src_components_connections_slack-card_tsx_0mahejj._.js.map +1 -1
  604. package/.next/server/chunks/ssr/packages_dashboard_src_components_settings_backend-settings_tsx_0i-tp_u._.js +3 -0
  605. package/.next/server/chunks/ssr/packages_dashboard_src_components_settings_backend-settings_tsx_0i-tp_u._.js.map +1 -0
  606. package/.next/server/chunks/ssr/packages_shared_dist_index_0kuvow-.js +1 -1
  607. package/.next/server/chunks/ssr/packages_shared_dist_index_0kuvow-.js.map +1 -1
  608. package/.next/server/middleware/middleware-manifest.json +1 -1
  609. package/.next/server/middleware-build-manifest.js +3 -3
  610. package/.next/server/middleware-manifest.json +1 -1
  611. package/.next/server/pages/404.html +1 -1
  612. package/.next/server/pages/500.html +1 -1
  613. package/.next/static/chunks/01yix41q.0970.js +1 -0
  614. package/.next/static/chunks/02qjylw4yp63l.js +1 -0
  615. package/.next/static/chunks/06y2ddf5x9x_4.js +1 -0
  616. package/.next/static/chunks/{0ztl~44vjnpe1.js → 08ie9t4zn6n4-.js} +1 -1
  617. package/.next/static/chunks/091khs5zza4_4.js +1 -0
  618. package/.next/static/chunks/{0~_56pt8wsmeo.js → 0abhg-m1-acdb.js} +1 -1
  619. package/.next/static/chunks/0ae.1upy09t--.js +1 -0
  620. package/.next/static/chunks/0bvcd~k.vfro8.js +1 -0
  621. package/.next/static/chunks/{0g6.0r0i-wyeg.js → 0eqm47_oikj36.js} +1 -1
  622. package/.next/static/chunks/0fqugh~hv4my1.js +1 -0
  623. package/.next/static/chunks/0has04tc4mrik.js +1 -0
  624. package/.next/static/chunks/0huynm-qbj26k.js +1 -0
  625. package/.next/static/chunks/0ibq4zul6305p.js +1 -0
  626. package/.next/static/chunks/0jm_e6e6n~rdn.js +1 -0
  627. package/.next/static/chunks/0k0.4cksmybb2.js +1 -0
  628. package/.next/static/chunks/0l07yrtw3fxp5.js +1 -0
  629. package/.next/static/chunks/0nhqu-sq045x7.js +1 -0
  630. package/.next/static/chunks/0op3oc-if6n5-.js +3 -0
  631. package/.next/static/chunks/0p34n6.st3s~1.js +1 -0
  632. package/.next/static/chunks/0r8nosw42e2m9.js +1 -0
  633. package/.next/static/chunks/0shx3_mxukfhr.js +1 -0
  634. package/.next/static/chunks/0thm~t5g5adz1.js +1 -0
  635. package/.next/static/chunks/0thyr1cngc-j..css +1 -0
  636. package/.next/static/chunks/0ttdb_354lh4t.js +1 -0
  637. package/.next/static/chunks/0v..ut2v38yep.js +1 -0
  638. package/.next/static/chunks/{17npklzvg8-~3.js → 0vhj0k-zy6jhh.js} +1 -1
  639. package/.next/static/chunks/0wdx410~0~gmn.js +1 -0
  640. package/.next/static/chunks/0y3ptqa0bbi-h.js +1 -0
  641. package/.next/static/chunks/{0zbxi2grjtx.c.js → 0zx_~u_zxg_7e.js} +1 -1
  642. package/.next/static/chunks/{0f3kjzb~5zhc~.js → 10pq~97vgkzro.js} +1 -1
  643. package/.next/static/chunks/11hlk6.h1of0y.js +1 -0
  644. package/.next/static/chunks/13w_6v~nprp8j.js +11 -0
  645. package/.next/static/chunks/14-kkni6ecqaw.js +1 -0
  646. package/.next/static/chunks/{148a9fv~bo0gq.js → 1555iv~_t.1lp.js} +1 -1
  647. package/.next/static/chunks/{04bbme2th8s1_.js → 15ec5~pa1pv_z.js} +1 -1
  648. package/.next/static/chunks/15vc-857cdedi.js +1 -0
  649. package/.next/static/chunks/16zgco6hwlr-n.js +1 -0
  650. package/.next/trace +2 -2
  651. package/.next/trace-build +1 -1
  652. package/.next/types/routes.d.ts +5 -1
  653. package/.next/types/validator.ts +36 -0
  654. package/package.json +2 -2
  655. package/.next/server/chunks/ssr/[root-of-the-server]__02idks~._.js +0 -3
  656. package/.next/server/chunks/ssr/[root-of-the-server]__02idks~._.js.map +0 -1
  657. package/.next/server/chunks/ssr/_0-8__9s._.js +0 -3
  658. package/.next/server/chunks/ssr/_0-8__9s._.js.map +0 -1
  659. package/.next/server/chunks/ssr/_0._ysx3._.js.map +0 -1
  660. package/.next/server/chunks/ssr/_0.h-tj4._.js +0 -3
  661. package/.next/server/chunks/ssr/_0.h-tj4._.js.map +0 -1
  662. package/.next/server/chunks/ssr/_02g4o18._.js +0 -3
  663. package/.next/server/chunks/ssr/_02g4o18._.js.map +0 -1
  664. package/.next/server/chunks/ssr/_0463dg_._.js +0 -3
  665. package/.next/server/chunks/ssr/_0463dg_._.js.map +0 -1
  666. package/.next/server/chunks/ssr/_04a42pa._.js +0 -3
  667. package/.next/server/chunks/ssr/_04a42pa._.js.map +0 -1
  668. package/.next/server/chunks/ssr/_04kt9.8._.js +0 -3
  669. package/.next/server/chunks/ssr/_04kt9.8._.js.map +0 -1
  670. package/.next/server/chunks/ssr/_052zlig._.js +0 -3
  671. package/.next/server/chunks/ssr/_052zlig._.js.map +0 -1
  672. package/.next/server/chunks/ssr/_060itkv._.js +0 -3
  673. package/.next/server/chunks/ssr/_060itkv._.js.map +0 -1
  674. package/.next/server/chunks/ssr/_07p0n9g._.js +0 -3
  675. package/.next/server/chunks/ssr/_07p0n9g._.js.map +0 -1
  676. package/.next/server/chunks/ssr/_08mbdt1._.js +0 -3
  677. package/.next/server/chunks/ssr/_08mbdt1._.js.map +0 -1
  678. package/.next/server/chunks/ssr/_08r_qwd._.js +0 -3
  679. package/.next/server/chunks/ssr/_08r_qwd._.js.map +0 -1
  680. package/.next/server/chunks/ssr/_08xk3kp._.js +0 -3
  681. package/.next/server/chunks/ssr/_08xk3kp._.js.map +0 -1
  682. package/.next/server/chunks/ssr/_0938p.1._.js +0 -3
  683. package/.next/server/chunks/ssr/_0938p.1._.js.map +0 -1
  684. package/.next/server/chunks/ssr/_0afdsbz._.js +0 -3
  685. package/.next/server/chunks/ssr/_0afdsbz._.js.map +0 -1
  686. package/.next/server/chunks/ssr/_0ff5qav._.js +0 -3
  687. package/.next/server/chunks/ssr/_0ff5qav._.js.map +0 -1
  688. package/.next/server/chunks/ssr/_0gp8d.p._.js +0 -3
  689. package/.next/server/chunks/ssr/_0gp8d.p._.js.map +0 -1
  690. package/.next/server/chunks/ssr/_0k2j6-t._.js +0 -3
  691. package/.next/server/chunks/ssr/_0k2j6-t._.js.map +0 -1
  692. package/.next/server/chunks/ssr/_0mix09j._.js +0 -3
  693. package/.next/server/chunks/ssr/_0mix09j._.js.map +0 -1
  694. package/.next/server/chunks/ssr/_0mk7dqt._.js +0 -3
  695. package/.next/server/chunks/ssr/_0mk7dqt._.js.map +0 -1
  696. package/.next/server/chunks/ssr/_0n168uk._.js +0 -3
  697. package/.next/server/chunks/ssr/_0n168uk._.js.map +0 -1
  698. package/.next/server/chunks/ssr/_0nwg6lo._.js +0 -3
  699. package/.next/server/chunks/ssr/_0nwg6lo._.js.map +0 -1
  700. package/.next/server/chunks/ssr/_0pwd-nz._.js +0 -3
  701. package/.next/server/chunks/ssr/_0pwd-nz._.js.map +0 -1
  702. package/.next/server/chunks/ssr/_0rspzax._.js +0 -3
  703. package/.next/server/chunks/ssr/_0rspzax._.js.map +0 -1
  704. package/.next/server/chunks/ssr/_0t-2u_i._.js +0 -3
  705. package/.next/server/chunks/ssr/_0t-2u_i._.js.map +0 -1
  706. package/.next/server/chunks/ssr/_0vn5_62._.js +0 -5
  707. package/.next/server/chunks/ssr/_0vn5_62._.js.map +0 -1
  708. package/.next/server/chunks/ssr/_0yiz~s5._.js +0 -3
  709. package/.next/server/chunks/ssr/_0yiz~s5._.js.map +0 -1
  710. package/.next/server/chunks/ssr/_0~4ta0s._.js +0 -3
  711. package/.next/server/chunks/ssr/_0~4ta0s._.js.map +0 -1
  712. package/.next/server/chunks/ssr/_0~5r_8s._.js +0 -3
  713. package/.next/server/chunks/ssr/_0~5r_8s._.js.map +0 -1
  714. package/.next/server/chunks/ssr/_115_o9h._.js +0 -3
  715. package/.next/server/chunks/ssr/_115_o9h._.js.map +0 -1
  716. package/.next/server/chunks/ssr/_13mk_9n._.js +0 -3
  717. package/.next/server/chunks/ssr/_13mk_9n._.js.map +0 -1
  718. package/.next/server/chunks/ssr/packages_dashboard_src_07.4ogy._.js +0 -3
  719. package/.next/server/chunks/ssr/packages_dashboard_src_07.4ogy._.js.map +0 -1
  720. package/.next/static/chunks/00p2fat~wl7uz.js +0 -1
  721. package/.next/static/chunks/07aksg8x5r0d9.js +0 -1
  722. package/.next/static/chunks/082cjr-p4ubw7.js +0 -1
  723. package/.next/static/chunks/09hewwcw-ts34.js +0 -1
  724. package/.next/static/chunks/09j~fmfefj03i.js +0 -1
  725. package/.next/static/chunks/0adfy5uyh_8c8.js +0 -1
  726. package/.next/static/chunks/0agoryx~xvt31.js +0 -1
  727. package/.next/static/chunks/0aoci_z-c0ele.css +0 -1
  728. package/.next/static/chunks/0atsym5j2dgzw.js +0 -1
  729. package/.next/static/chunks/0b3tta7tnnbur.js +0 -1
  730. package/.next/static/chunks/0d02.lqlwe9a_.js +0 -1
  731. package/.next/static/chunks/0eqyosc.qae5n.js +0 -1
  732. package/.next/static/chunks/0kkrrex6qm68-.js +0 -1
  733. package/.next/static/chunks/0lfxqap3b6sar.js +0 -11
  734. package/.next/static/chunks/0ord2b6oqi.3g.js +0 -1
  735. package/.next/static/chunks/0rh-ee9ky1ybq.js +0 -1
  736. package/.next/static/chunks/0t5v~o90gn66f.js +0 -1
  737. package/.next/static/chunks/0vaymprggmdwi.js +0 -3
  738. package/.next/static/chunks/0x2vder5-rzy3.js +0 -1
  739. package/.next/static/chunks/0yk64vsbmwqd8.js +0 -1
  740. package/.next/static/chunks/0yvzj34_7s6kb.js +0 -1
  741. package/.next/static/chunks/104za._t2qmr8.js +0 -1
  742. package/.next/static/chunks/13pe2-ed6nel..js +0 -1
  743. package/.next/static/chunks/13zn61okwjlyn.js +0 -1
  744. package/.next/static/chunks/153hm0-366-at.js +0 -1
  745. package/.next/static/chunks/16k3_-6f7kx97.js +0 -1
  746. package/.next/static/chunks/18904zqns5ncn.js +0 -1
  747. /package/.next/server/chunks/{[root-of-the-server]__00gp8gz._.js.map → [root-of-the-server]__01knfi.._.js.map} +0 -0
  748. /package/.next/server/chunks/{[root-of-the-server]__0-0wgko._.js.map → [root-of-the-server]__08_s4yo._.js.map} +0 -0
  749. /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_buildManifest.js +0 -0
  750. /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_clientMiddlewareManifest.js +0 -0
  751. /package/.next/static/{CDXVH-99b-ZdHz0Rd9pr_ → lsV2FU1YUtwJPmeiim7tk}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../packages/dashboard/src/components/settings/auth-status-badge.tsx","../../../../../../packages/dashboard/src/components/settings/cli-install-panel.tsx","../../../../../../packages/dashboard/src/components/settings/backend-card.tsx","../../../../../../node_modules/.pnpm/lucide-react%400.468.0_react%4019.2.4/node_modules/lucide-react/src/icons/clipboard-copy.ts","../../../../../../packages/dashboard/src/components/settings/backend-card.logic.ts","../../../../../../packages/dashboard/src/components/settings/backend-api-key-panel.tsx","../../../../../../packages/dashboard/src/lib/hooks/use-backend-api-key.ts","../../../../../../packages/dashboard/src/components/settings/backend-api-key-panel.logic.ts","../../../../../../packages/dashboard/src/components/settings/subscription-auth-warning.tsx","../../../../../../node_modules/.pnpm/lucide-react%400.468.0_react%4019.2.4/node_modules/lucide-react/src/icons/lock-open.ts","../../../../../../packages/dashboard/src/components/settings/execution-mode.logic.ts"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"@/components/ui/tooltip\";\nimport { formatRelativeTime, parseUtcDate } from \"@/lib/utils\";\nimport { Loader2 } from \"lucide-react\";\n\ntype AuthStatus = \"ok\" | \"expiring_soon\" | \"expired\" | \"missing\" | \"recovering\" | \"unknown\";\n\ninterface AuthStatusBadgeProps {\n status: string;\n detail: string | null;\n firstExpiredAt: string | null;\n lastSuccessAt: string | null;\n notificationCount: number;\n}\n\nconst STATUS_CONFIG: Record<AuthStatus, {\n variant: \"green\" | \"amber\" | \"red\" | \"gray\" | \"blue\";\n label: string;\n icon: string;\n}> = {\n ok: { variant: \"green\", label: \"OK\", icon: \"\\u2705\" },\n expiring_soon: { variant: \"amber\", label: \"Expiring Soon\", icon: \"\\uD83D\\uDFE1\" },\n expired: { variant: \"red\", label: \"Expired\", icon: \"\\uD83D\\uDD34\" },\n missing: { variant: \"gray\", label: \"Missing\", icon: \"\\u26AB\" },\n recovering: { variant: \"blue\", label: \"Recovering\", icon: \"\\uD83D\\uDD04\" },\n unknown: { variant: \"gray\", label: \"Unknown\", icon: \"\\u2753\" },\n};\n\nfunction normalizeStatus(raw: string): AuthStatus {\n if (raw in STATUS_CONFIG) return raw as AuthStatus;\n if (raw === \"error\") return \"expired\";\n return \"unknown\";\n}\n\nfunction formatElapsed(isoDate: string): string {\n const diffMs = Date.now() - parseUtcDate(isoDate).getTime();\n const mins = Math.floor(diffMs / 60_000);\n if (mins < 60) return `${mins}m`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n return `${days}d`;\n}\n\n/**\n * Auth status badge with 5-state color coding, elapsed-time display for\n * failures, and a tooltip showing the detailed auth status information.\n *\n * Phase 8 §7.1.\n */\nexport function AuthStatusBadge({\n status: rawStatus,\n detail,\n firstExpiredAt,\n lastSuccessAt,\n notificationCount,\n}: AuthStatusBadgeProps) {\n const status = normalizeStatus(rawStatus);\n const config = STATUS_CONFIG[status];\n\n const isRecovering = status === \"recovering\";\n const isFailure = status === \"expired\" || status === \"missing\";\n\n const elapsedText =\n isFailure && firstExpiredAt ? ` (${formatElapsed(firstExpiredAt)})` : \"\";\n\n const tooltipLines: string[] = [];\n tooltipLines.push(`Status: ${config.label}`);\n if (detail) tooltipLines.push(`Detail: ${detail}`);\n if (firstExpiredAt && isFailure) {\n tooltipLines.push(`Failed since: ${formatRelativeTime(firstExpiredAt)}`);\n }\n if (lastSuccessAt) {\n tooltipLines.push(`Last success: ${formatRelativeTime(lastSuccessAt)}`);\n }\n if (notificationCount > 0) {\n tooltipLines.push(`Notifications sent: ${notificationCount}`);\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Badge variant={config.variant} className=\"gap-1\">\n {isRecovering ? (\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n ) : null}\n Auth: {config.label}\n {elapsedText}\n </Badge>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\n <div className=\"space-y-0.5 text-xs\">\n {tooltipLines.map((line, i) => (\n <p key={i}>{line}</p>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n CheckCircle2,\n ClipboardCopy,\n Download,\n ExternalLink,\n Loader2,\n RefreshCw,\n Terminal,\n XCircle,\n} from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { api } from \"@/lib/api-client\";\nimport type {\n BackendInstallInfo,\n CliInstallResult,\n InstallMethodsResponse,\n} from \"@/lib/api-types\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { BACKEND_LABELS } from \"@/lib/backend-ui\";\n\ninterface CliInstallPanelProps {\n backendId: BackendId;\n /** Whether the CLI is currently installed (from useBackends). */\n cliInstalled: boolean;\n /** Compact mode for inline use in settings cards. */\n compact?: boolean;\n /** Called after a successful install so the parent can re-fetch data. */\n onInstalled?: () => void;\n}\n\n/**\n * Shows CLI installation status for a backend and lets the user\n * install via their preferred package manager (npm, brew, etc.).\n *\n * Handles two types of install methods:\n * - Auto-runnable: daemon executes the install command directly\n * - Manual-only: command is shown for the user to copy & run in their\n * own terminal (for methods requiring elevation or interactive input)\n */\nexport function CliInstallPanel({\n backendId,\n cliInstalled,\n compact = false,\n onInstalled,\n}: CliInstallPanelProps) {\n const queryClient = useQueryClient();\n const [installInfo, setInstallInfo] = useState<BackendInstallInfo | null>(\n null,\n );\n const [loading, setLoading] = useState(false);\n const [selectedMethod, setSelectedMethod] = useState<string>(\"\");\n const [installing, setInstalling] = useState(false);\n const [result, setResult] = useState<CliInstallResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const fetchMethods = useCallback(async () => {\n if (cliInstalled) return;\n setLoading(true);\n try {\n const data = await api.get<InstallMethodsResponse>(\n \"/backends/install-methods\",\n );\n const info = data.backends[backendId];\n setInstallInfo(info);\n // Auto-select the first available method (ordered by recommendation)\n const firstAvailable = info.methods.find((m) => m.available);\n if (firstAvailable) {\n setSelectedMethod(firstAvailable.id);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch install methods\",\n );\n } finally {\n setLoading(false);\n }\n }, [backendId, cliInstalled]);\n\n useEffect(() => {\n if (!cliInstalled) {\n fetchMethods();\n }\n }, [cliInstalled, fetchMethods]);\n\n const handleInstall = async () => {\n if (!selectedMethod) return;\n setInstalling(true);\n setResult(null);\n setError(null);\n try {\n const res = await api.post<CliInstallResult>(\n `/backends/${backendId}/install`,\n { method: selectedMethod },\n );\n setResult(res);\n if (res.ok && res.cliInstalled) {\n await queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n onInstalled?.();\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Install failed\");\n } finally {\n setInstalling(false);\n }\n };\n\n const handleCopy = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback — select the text for manual copy\n }\n };\n\n const handleRetryDetection = () => {\n setResult(null);\n setError(null);\n fetchMethods();\n queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n };\n\n const docsUrl = installInfo?.docsUrl;\n const backendLabel = BACKEND_LABELS[backendId];\n\n // ── Already installed (or field unavailable from old daemon) ──\n // cliInstalled is `true` when installed, `false` when not, or\n // `undefined` if the daemon predates this field. For `undefined`,\n // hide the panel rather than falsely showing \"not installed.\"\n if (cliInstalled !== false && !result?.ok) {\n if (compact) return null;\n if (cliInstalled === true) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>{backendLabel} CLI is installed and ready</span>\n </div>\n );\n }\n return null;\n }\n\n // ── Loading methods ──\n if (loading) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Detecting available install methods...</span>\n </div>\n );\n }\n\n const allMethods = installInfo?.methods ?? [];\n const availableMethods = allMethods.filter((m) => m.available);\n const selectedDef = allMethods.find((m) => m.id === selectedMethod);\n const isManualOnly = selectedDef?.manualOnly ?? false;\n const otherAvailable = availableMethods.filter(\n (m) => m.id !== selectedMethod,\n );\n\n // ── Install success ──\n if (result?.ok) {\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>{backendLabel} CLI installed successfully</span>\n </div>\n {!compact && (\n <p className=\"text-xs text-muted-foreground\">\n Proceed to verify authentication below to confirm your credentials\n are working.\n </p>\n )}\n </div>\n );\n }\n\n // ── Install form ──\n return (\n <div className={compact ? \"space-y-2\" : \"space-y-3\"}>\n {/* Status heading */}\n <div className=\"flex items-center gap-2 text-sm text-amber-600 dark:text-amber-400\">\n <Download className=\"h-4 w-4 shrink-0\" />\n <span>{backendLabel} CLI is not installed</span>\n </div>\n\n {/* Description — only in non-compact mode */}\n {!compact && (\n <p className=\"text-xs text-muted-foreground\">\n The {backendLabel} CLI must be installed on this machine for the agent\n to use it as a backend. Choose an install method below, or install\n manually in your terminal.\n </p>\n )}\n\n {availableMethods.length > 0 ? (\n <>\n <div className={compact ? \"flex items-center gap-2\" : \"space-y-2\"}>\n {/* Method selector */}\n <Select value={selectedMethod} onValueChange={setSelectedMethod}>\n <SelectTrigger className={compact ? \"w-[200px]\" : \"w-full\"}>\n <SelectValue placeholder=\"Choose install method\" />\n </SelectTrigger>\n <SelectContent>\n {allMethods.map((m) => (\n <SelectItem key={m.id} value={m.id} disabled={!m.available}>\n {m.label}\n {!m.available && \" (not available)\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Action button — Install or Copy depending on method type */}\n {isManualOnly ? (\n <Button\n size={compact ? \"sm\" : \"default\"}\n variant=\"outline\"\n onClick={() => selectedDef && handleCopy(selectedDef.command)}\n disabled={!selectedMethod}\n className=\"gap-2 shrink-0\"\n >\n {copied ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied ? \"Copied!\" : \"Copy Command\"}\n </Button>\n ) : (\n <Button\n size={compact ? \"sm\" : \"default\"}\n variant=\"outline\"\n onClick={handleInstall}\n disabled={\n installing || !selectedMethod || !selectedDef?.available\n }\n className=\"gap-2 shrink-0\"\n >\n {installing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Terminal className=\"h-3.5 w-3.5\" />\n )}\n {installing ? \"Installing...\" : \"Install\"}\n </Button>\n )}\n </div>\n\n {/* Command preview — non-compact only */}\n {selectedDef && !compact && (\n <div className=\"rounded-md bg-muted/50 px-3 py-2\">\n <p className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-muted-foreground/60\">\n {isManualOnly\n ? \"Run this command in your terminal\"\n : \"Command to run\"}\n </p>\n <code className=\"text-xs text-muted-foreground\">\n $ {selectedDef.command}\n </code>\n </div>\n )}\n\n {/* Manual-only hint */}\n {isManualOnly && !compact && (\n <p className=\"text-xs text-muted-foreground\">\n This method requires you to run the command in your own terminal\n (it may need elevated permissions). After installing, click{\" \"}\n <strong>Retry Detection</strong> to verify.\n </p>\n )}\n\n {/* Retry detection — always visible for manual-only methods */}\n {isManualOnly && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n )}\n </>\n ) : (\n /* No package manager available — manual install guidance */\n <div className=\"space-y-2 rounded-md border border-amber-200 bg-amber-50/50 p-3 dark:border-amber-900 dark:bg-amber-950/30\">\n <p className=\"text-xs font-medium text-amber-800 dark:text-amber-200\">\n No supported package manager was detected on this system.\n </p>\n <p className=\"text-xs text-amber-700 dark:text-amber-300\">\n Please install the CLI manually in your terminal:\n </p>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 rounded bg-muted px-2.5 py-1.5\">\n <code className=\"text-xs\">\n npm install -g{\" \"}\n {backendId === \"claude\"\n ? \"@anthropic-ai/claude-code\"\n : backendId === \"codex\"\n ? \"@openai/codex\"\n : \"@google/gemini-cli\"}\n </code>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() =>\n handleCopy(\n `npm install -g ${\n backendId === \"claude\"\n ? \"@anthropic-ai/claude-code\"\n : backendId === \"codex\"\n ? \"@openai/codex\"\n : \"@google/gemini-cli\"\n }`,\n )\n }\n className=\"shrink-0\"\n >\n {copied ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n {docsUrl && (\n <a\n href={docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-amber-700 underline hover:text-amber-900 dark:text-amber-300 dark:hover:text-amber-100\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Official installation guide\n </a>\n )}\n </div>\n </div>\n )}\n\n {/* ── Install failure ── */}\n {result && !result.ok && (\n <div className=\"space-y-2 rounded-md border border-red-200 bg-red-50/50 p-3 dark:border-red-900 dark:bg-red-950/30\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-red-700 dark:text-red-300\">\n <XCircle className=\"h-4 w-4 shrink-0\" />\n <span>\n {result.timedOut\n ? \"Installation timed out (5 min limit)\"\n : `Installation failed (exit code ${result.exitCode})`}\n </span>\n </div>\n\n {/* stderr output */}\n {result.stderr && (\n <pre className=\"max-h-32 overflow-auto rounded bg-red-100/50 p-2 text-xs text-red-800 dark:bg-red-950/50 dark:text-red-200\">\n {result.stderr.slice(-1500)}\n </pre>\n )}\n\n {/* Recovery suggestions */}\n <div className=\"space-y-1 text-xs text-red-700 dark:text-red-300\">\n {otherAvailable.length > 0 && (\n <p>\n Try a different method: select{\" \"}\n {otherAvailable.map((m) => `\"${m.label}\"`).join(\" or \")} from\n the dropdown above.\n </p>\n )}\n <p>\n You can also install manually in your terminal and then click{\" \"}\n <strong>Retry Detection</strong> below.\n </p>\n </div>\n\n {/* Retry detection + docs link */}\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n {docsUrl && (\n <a\n href={docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-red-600 underline hover:text-red-800 dark:text-red-400 dark:hover:text-red-200\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Official install guide\n </a>\n )}\n </div>\n </div>\n )}\n\n {/* API-level error (not install failure) */}\n {error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">{error}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { CheckCircle2, Loader2, Lock as _Lock, Terminal, XCircle } from \"lucide-react\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport {\n BACKEND_BADGE_VARIANTS,\n BACKEND_PROVIDER_LABELS,\n} from \"@/lib/backend-ui\";\nimport { AuthStatusBadge } from \"./auth-status-badge\";\nimport { CliInstallPanel } from \"./cli-install-panel\";\nimport {\n isAllowModeActive,\n isRecommended,\n shouldEnableVerifyInstall,\n shouldShowCliInstall,\n shouldShowWizardConfigureLaterHint,\n} from \"./backend-card.logic\";\n\nexport interface BackendCardProps {\n backendId: BackendId;\n mode: \"wizard\" | \"settings\";\n\n // Identity + state\n isMain: boolean;\n authStatus: string;\n authStatusDetail?: string | null;\n authFirstExpiredAt?: string | null;\n authLastSuccessAt?: string | null;\n authNotificationCount?: number;\n cliInstalled: boolean;\n enabled: boolean;\n webSearchEnabled: boolean;\n webSearchSupported?: boolean;\n /**\n * Derived by the parent from `config.{backendId}ExecutionPermissionMode`.\n * Passed through `isAllowModeActive()` so the card stays pure — no\n * second `useConfig()` subscription.\n */\n permissionMode: string | null | undefined;\n\n // Transient UI state\n /** True while enable/disable, web-search, verify-install, install are in flight. */\n busy?: boolean;\n /** Inline state for the Verify-Install button — card-local, not global. */\n installCheck?: {\n status: \"idle\" | \"checking\" | \"ok\" | \"error\";\n error?: string | null;\n version?: string | null;\n };\n\n // Callbacks\n onCliInstalled?: () => void;\n onVerifyInstall: () => void;\n onToggleEnable?: () => void;\n onToggleWebSearch?: () => void;\n\n /**\n * Optional slot rendered between the auth strip and the settings-only\n * control row. Used to inline an \"Advanced — default light/heavy\n * models\" collapsible on the MAIN card only. Keeping it as a slot —\n * rather than hoisting model-draft state into the card — preserves\n * `BackendCard`'s \"pure presentation\" contract.\n */\n renderExtra?: () => React.ReactNode;\n}\n\n/**\n * Single-row card rendering one backend's identity + CLI + auth +\n * toggles. Subscription-plan picker has been removed — Aitne is\n * designed to run on provider API keys (`ANTHROPIC_API_KEY` /\n * `OPENAI_API_KEY` / `GEMINI_API_KEY`), and the daemon does not ask\n * the operator which Claude/Codex/Gemini tier they hold. Consumed by:\n * - the wizard's `backends-step.tsx` (mode=\"wizard\") — no enable /\n * web-search controls, inline auth-check state, hint shown when\n * the non-main card is incomplete;\n * - the settings page (mode=\"settings\") — adds enable / web-search\n * / Allow pill + anchor back to the Execution Mode card.\n *\n * The card itself owns zero data-fetching. Parents thread in backend\n * status (from `useBackends()`) and the derived `permissionMode` /\n * `isMain` flags as props.\n */\nexport function BackendCard(props: BackendCardProps) {\n const {\n backendId,\n mode,\n isMain,\n authStatus,\n authStatusDetail,\n authFirstExpiredAt,\n authLastSuccessAt,\n authNotificationCount,\n cliInstalled,\n enabled,\n webSearchEnabled,\n webSearchSupported,\n permissionMode,\n busy = false,\n installCheck,\n onCliInstalled,\n onVerifyInstall,\n onToggleEnable,\n onToggleWebSearch,\n renderExtra,\n } = props;\n\n const allowModeActive = isAllowModeActive(permissionMode);\n const recommended = isRecommended(backendId);\n const showInstall = shouldShowCliInstall(cliInstalled);\n const verifyEnabled = shouldEnableVerifyInstall(busy);\n // Prominent CTA when the CLI is on PATH but we have not yet confirmed\n // it can actually run (or last run failed). Once the user clicks Verify\n // install and gets `ok`, we drop the callout.\n const verifyInstallRequired =\n cliInstalled\n && installCheck?.status !== \"ok\"\n && installCheck?.status !== \"checking\";\n const showHint = shouldShowWizardConfigureLaterHint({\n mode,\n isMain,\n cliInstalled,\n });\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 shadow-sm\">\n {/* ── Header ─────────────────────────────────────────── */}\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1.5\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={BACKEND_BADGE_VARIANTS[backendId]}>\n {BACKEND_PROVIDER_LABELS[backendId]}\n </Badge>\n {recommended && (\n <Badge variant=\"gray\" className=\"font-normal\">\n Recommended\n </Badge>\n )}\n {isMain && <Badge variant=\"amber\">MAIN</Badge>}\n <AuthStatusBadge\n status={authStatus}\n detail={authStatusDetail ?? null}\n firstExpiredAt={authFirstExpiredAt ?? null}\n lastSuccessAt={authLastSuccessAt ?? null}\n notificationCount={authNotificationCount ?? 0}\n />\n {mode === \"settings\" && allowModeActive && (\n <a href=\"#execution-mode\" className=\"inline-flex\">\n <Badge\n variant=\"red\"\n className=\"cursor-pointer\"\n title=\"Allow mode is on for this backend — click to jump to the Execution Mode card\"\n >\n Allow\n </Badge>\n </a>\n )}\n {mode === \"settings\" && (\n <Badge variant={enabled ? \"green\" : \"gray\"}>\n {enabled ? \"Enabled\" : \"Disabled\"}\n </Badge>\n )}\n </div>\n </div>\n </div>\n\n {/* ── CLI + auth strip ───────────────────────────────── */}\n <div className=\"mt-4 space-y-3 border-t border-border pt-4\">\n {showInstall ? (\n <CliInstallPanel\n backendId={backendId}\n cliInstalled={cliInstalled}\n compact\n onInstalled={() => {\n onCliInstalled?.();\n }}\n />\n ) : (\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>CLI installed</span>\n </div>\n )}\n\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\",\n verifyInstallRequired &&\n \"rounded-lg border border-primary/40 bg-primary/5 p-3\",\n )}\n >\n <div className=\"space-y-1\">\n {verifyInstallRequired ? (\n <>\n <p className=\"text-sm font-semibold text-foreground\">\n Verify the CLI runs on this machine\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Confirms the {BACKEND_PROVIDER_LABELS[backendId]} CLI is\n on your{\" \"}\n <code className=\"rounded bg-muted px-1\">PATH</code> and\n responds to{\" \"}\n <code className=\"rounded bg-muted px-1\">--version</code>.\n </p>\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {cliInstalled\n ? \"Re-run this whenever you reinstall or update the CLI to confirm it still launches.\"\n : \"Install the CLI first, then verify it runs.\"}\n </p>\n )}\n </div>\n <Button\n size={verifyInstallRequired ? \"default\" : \"sm\"}\n variant={verifyInstallRequired ? \"default\" : \"outline\"}\n disabled={!verifyEnabled}\n onClick={onVerifyInstall}\n className={cn(\n \"gap-2\",\n verifyInstallRequired &&\n \"shrink-0 self-start ring-2 ring-primary/40 ring-offset-2 ring-offset-background sm:self-auto\",\n )}\n >\n {installCheck?.status === \"checking\" ? (\n <Loader2\n className={cn(\n \"animate-spin\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : installCheck?.status === \"ok\" ? (\n <CheckCircle2\n className={cn(\n \"text-green-500\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : installCheck?.status === \"error\" ? (\n <XCircle\n className={cn(\n \"text-red-500\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : verifyInstallRequired ? (\n <Terminal className=\"h-4 w-4\" />\n ) : null}\n {installCheck?.status === \"checking\"\n ? \"Checking…\"\n : \"Verify install\"}\n </Button>\n </div>\n {installCheck?.status === \"ok\" && installCheck.version && (\n <p className=\"text-xs text-green-700 dark:text-green-400\">\n CLI runs OK —{\" \"}\n <code className=\"rounded bg-muted px-1\">\n {installCheck.version}\n </code>\n </p>\n )}\n {installCheck?.status === \"error\" && installCheck.error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {installCheck.error}\n </p>\n )}\n {showHint && (\n <p className=\"text-xs text-muted-foreground\">\n You can install the CLI and verify it later from{\" \"}\n <code className=\"rounded bg-muted px-1\">/settings/models</code>.\n </p>\n )}\n </div>\n\n {/* ── Optional extra slot (e.g. main-card Advanced) ──── */}\n {renderExtra && (\n <div className=\"mt-4 border-t border-border pt-4\">\n {renderExtra()}\n </div>\n )}\n\n {/* ── Settings-only controls ─────────────────────────── */}\n {mode === \"settings\" && (\n <div className=\"mt-4 flex flex-wrap items-center justify-between gap-2 border-t border-border pt-4\">\n <div className=\"flex flex-wrap gap-2\">\n {onToggleEnable && (\n <Button\n size=\"sm\"\n variant={enabled ? \"outline\" : \"default\"}\n onClick={onToggleEnable}\n disabled={busy}\n >\n {enabled ? \"Disable backend\" : \"Enable backend\"}\n </Button>\n )}\n {onToggleWebSearch && (\n <Button\n size=\"sm\"\n variant={webSearchEnabled ? \"default\" : \"outline\"}\n onClick={onToggleWebSearch}\n disabled={!webSearchSupported || !enabled || busy}\n title={\n !webSearchSupported\n ? \"Web search is not supported for this backend.\"\n : undefined\n }\n >\n Web search: {webSearchEnabled ? \"on\" : \"off\"}\n </Button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ClipboardCopy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0yIiAvPgogIDxwYXRoIGQ9Ik0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNEgxMSIgLz4KICA8cGF0aCBkPSJtMTUgMTAtNCA0IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clipboard-copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ClipboardCopy = createLucideIcon('ClipboardCopy', [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n ['path', { d: 'M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2', key: '4jdomd' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v4', key: '3hqy98' }],\n ['path', { d: 'M21 14H11', key: '1bme5i' }],\n ['path', { d: 'm15 10-4 4 4 4', key: '5dvupr' }],\n]);\n\nexport default ClipboardCopy;\n","/**\n * Pure logic helpers for BackendCard. Kept separate so render-free\n * assertions (install-vs-verify visibility, continue gating, hint copy)\n * stay unit-testable without pulling React or the query client.\n */\n\nimport type { BackendId } from \"@aitne/shared\";\n\n/**\n * Product constant — \"Recommended\" pill anchor. Claude is the recommended\n * main for new users because the Agent SDK's advisor tool only works\n * server-side on Claude. Kept here (not in server-provided metadata)\n * because \"what we recommend\" is a product-UX decision, not a daemon\n * policy — changing it should not require a daemon release.\n */\nexport const RECOMMENDED_BACKEND: BackendId = \"claude\";\n\nexport function isRecommended(backendId: BackendId): boolean {\n return backendId === RECOMMENDED_BACKEND;\n}\n\n/**\n * Whether the BackendCard should show the inline CLI install panel\n * (true = CLI missing and we should surface the installer). The CLI\n * install panel also shows its own done state; we hide it entirely when\n * the CLI is present so we don't flash \"detecting install methods…\"\n * every time the backend card mounts.\n */\nexport function shouldShowCliInstall(cliInstalled: boolean): boolean {\n return !cliInstalled;\n}\n\n/**\n * Whether the \"Verify install\" button should be reachable. The button\n * stays mounted-and-disabled while another card mutation is in flight\n * (busy), but it's allowed even when the CLI isn't on PATH — the\n * server-side handler returns a clean \"not installed\" diagnostic, which\n * is more useful to the user than a greyed-out button with no feedback.\n */\nexport function shouldEnableVerifyInstall(busy: boolean): boolean {\n return !busy;\n}\n\n/**\n * Whether the wizard's \"Configure later\" one-liner should be rendered\n * on this card. Shown only in wizard mode, only on non-main cards where\n * the CLI is not yet installed. Auth verification was removed as a\n * setup-flow gate — install presence (verify-install) is now the only\n * signal we use here.\n */\nexport function shouldShowWizardConfigureLaterHint(opts: {\n mode: \"wizard\" | \"settings\";\n isMain: boolean;\n cliInstalled: boolean;\n}): boolean {\n if (opts.mode !== \"wizard\") return false;\n if (opts.isMain) return false;\n return !opts.cliInstalled;\n}\n\n/**\n * True when the wizard's Continue button should be enabled. The only\n * hard requirement is that the operator has picked a main backend —\n * CLI install, auth verify, and API-key registration are all\n * skippable. Skipping is a deliberate product choice: the user can\n * complete the rest from /settings/models on their own time, and any\n * verify-install state already saved is persisted server-side via\n * `useBackends()`. Non-main backends were already exempt from gating.\n */\nexport function isContinueEligible(opts: {\n mainBackend: BackendId | null;\n}): boolean {\n return opts.mainBackend !== null;\n}\n\n/**\n * Derive whether the Allow-mode badge should show for this card's\n * backend. Caller passes the per-backend permission mode string from\n * `useConfig()` so the card itself stays a pure render — this helper\n * accepts any string (not just the typed `ExecutionPermissionMode`\n * union) because config values arrive as `Record<string, unknown>`\n * until the React 19 typed slice lands.\n */\nexport function isAllowModeActive(\n permissionMode: string | null | undefined,\n): boolean {\n return permissionMode === \"allow\";\n}\n","\"use client\";\n\nimport { CheckCircle2, KeyRound, Loader2, XCircle } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { ApiKeyProvider, BackendId } from \"@aitne/shared\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { ApiError } from \"@/lib/api-client\";\nimport { BACKEND_PROVIDER_LABELS } from \"@/lib/backend-ui\";\nimport {\n useBackendApiKey,\n useClearBackendApiKey,\n useSaveBackendApiKey,\n type SaveBackendApiKeyInput,\n} from \"@/lib/hooks/use-backend-api-key\";\nimport {\n apiKeyEnvVarNames,\n apiKeyFormatHint,\n apiKeyStatusLabel,\n draftToConfig,\n emptyBedrockDraft,\n emptyDraft,\n emptyGeminiVertexDraft,\n isClearVisible,\n isConfigSaveEnabled,\n isDirectApiKeyProvider,\n isPlausibleApiKey,\n isSaveEnabled,\n PROVIDER_DESCRIPTIONS,\n PROVIDER_LABELS,\n type BedrockAuthMode,\n type GeminiVertexAuthMode,\n type ProviderDraft,\n} from \"./backend-api-key-panel.logic\";\n\nexport interface BackendApiKeyPanelProps {\n backendId: BackendId;\n onToast?: (\n type: \"success\" | \"error\",\n message: string,\n ) => void;\n}\n\ninterface InlineFeedback {\n kind: \"success\" | \"error\";\n message: string;\n}\n\n/**\n * Per-backend provider auth panel.\n *\n * Direct API key (Anthropic / OpenAI / Google) is the long-standing path.\n * Claude additionally supports Bedrock / Vertex / Foundry; Gemini\n * additionally supports Vertex AI. A provider dropdown switches forms;\n * each provider exposes its own field set. The daemon mirrors the\n * active provider's env vars (`CLAUDE_CODE_USE_*`, `GOOGLE_GENAI_USE_VERTEXAI`,\n * AWS / GCP / Azure credentials) into `process.env` so the SDK / CLI\n * subprocess picks them up via inherited env.\n *\n * Codex Azure OpenAI is not exposed here — it requires a\n * `~/.codex/config.toml` file in addition to env vars, which the\n * env-mirroring chokepoint cannot configure. Codex stays direct-key only.\n *\n * The panel intentionally never displays a saved value — only a status\n * label (\"Saved (bedrock)\") and a one-shot input for new values.\n */\nexport function BackendApiKeyPanel({\n backendId,\n onToast,\n}: BackendApiKeyPanelProps) {\n const { data, isLoading, error } = useBackendApiKey(backendId);\n const save = useSaveBackendApiKey(backendId);\n const clear = useClearBackendApiKey(backendId);\n\n const availableProviders: readonly ApiKeyProvider[] = useMemo(\n () => data?.availableProviders ?? defaultAvailableProviders(backendId),\n [data?.availableProviders, backendId],\n );\n const hasProviderChoice = availableProviders.length > 1;\n\n const [pickedProvider, setPickedProvider] = useState<ApiKeyProvider | null>(\n null,\n );\n const selectedProvider: ApiKeyProvider =\n pickedProvider ?? data?.provider ?? availableProviders[0];\n\n const [draft, setDraft] = useState<ProviderDraft>(() =>\n emptyDraft(selectedProvider),\n );\n const [feedback, setFeedback] = useState<InlineFeedback | null>(null);\n\n const source = data?.source ?? \"none\";\n const configured = data?.configured ?? false;\n const savedProvider = data?.provider ?? null;\n const envVarNames = data?.envVarNames ?? apiKeyEnvVarNames(backendId);\n\n const saving = save.isPending;\n const clearing = clear.isPending;\n const showClear = isClearVisible(source);\n\n const handleProviderChange = (next: string) => {\n if (next === selectedProvider) return;\n if (!availableProviders.includes(next as ApiKeyProvider)) return;\n setPickedProvider(next as ApiKeyProvider);\n setDraft(emptyDraft(next as ApiKeyProvider));\n setFeedback(null);\n };\n\n const handleSave = async () => {\n setFeedback(null);\n\n let payload: SaveBackendApiKeyInput;\n if (isDirectApiKeyProvider(selectedProvider)) {\n const trimmed = \"apiKey\" in draft ? draft.apiKey.trim() : \"\";\n if (!isPlausibleApiKey(backendId, trimmed)) {\n setFeedback({ kind: \"error\", message: apiKeyFormatHint(backendId) });\n return;\n }\n payload = { apiKey: trimmed };\n } else {\n const config = draftToConfig(draft);\n if (!config) {\n setFeedback({\n kind: \"error\",\n message: \"Fill in all required fields for this provider.\",\n });\n return;\n }\n payload = { config };\n }\n\n try {\n const result = await save.mutateAsync(payload);\n setDraft(emptyDraft(selectedProvider));\n const detail = result.auth?.detail ?? null;\n const providerLabel = result.provider\n ? PROVIDER_LABELS[result.provider]\n : BACKEND_PROVIDER_LABELS[backendId];\n if (result.auth?.ok) {\n const message = detail\n ? `Saved (${providerLabel}) — ${detail}`\n : `Saved (${providerLabel}).`;\n setFeedback({ kind: \"success\", message });\n onToast?.(\"success\", `${providerLabel} configured.`);\n } else {\n const message = detail\n ? `Saved (${providerLabel}), but the provider rejected it — ${detail}`\n : `Saved (${providerLabel}), but the provider probe did not succeed.`;\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to save provider config\";\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n };\n\n const handleClear = async () => {\n setFeedback(null);\n try {\n const result = await clear.mutateAsync();\n const message =\n result.source === \"shell\"\n ? \"Cleared from keychain — falling back to the shell-set env var.\"\n : \"Cleared from keychain — backend will use CLI / OAuth auth.\";\n setFeedback({ kind: \"success\", message });\n onToast?.(\n \"success\",\n `${BACKEND_PROVIDER_LABELS[backendId]} provider config cleared.`,\n );\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to clear provider config\";\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n };\n\n const saveEnabled = isDirectApiKeyProvider(selectedProvider)\n ? isSaveEnabled({\n backendId,\n draftValue: \"apiKey\" in draft ? draft.apiKey : \"\",\n saving,\n })\n : isConfigSaveEnabled({ backendId, draft, saving });\n\n return (\n <div className=\"space-y-3 rounded-xl border border-border bg-card p-4 shadow-sm\">\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <KeyRound className=\"h-4 w-4 text-muted-foreground\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Provider auth\n <span className=\"ml-2 text-xs font-normal text-muted-foreground\">\n (optional)\n </span>\n </h3>\n {configured && (\n <Badge variant={source === \"keychain\" ? \"green\" : \"gray\"}>\n {source === \"keychain\"\n ? `Saved${savedProvider ? ` (${PROVIDER_LABELS[savedProvider]})` : \"\"}`\n : \"From shell\"}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {isLoading\n ? \"Loading…\"\n : error\n ? \"Could not read provider config from the daemon.\"\n : apiKeyStatusLabel(source)}\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n Stored in the OS keychain. Leave blank to skip — the daemon falls back\n to local CLI / OAuth auth or your shell-set env vars.\n </p>\n </div>\n\n {hasProviderChoice && (\n <div className=\"space-y-1\">\n <label\n htmlFor={`${backendId}-provider`}\n className=\"text-xs font-medium text-foreground\"\n >\n Provider\n </label>\n <Select\n value={selectedProvider}\n onValueChange={handleProviderChange}\n >\n <SelectTrigger id={`${backendId}-provider`} className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availableProviders.map((provider) => (\n <SelectItem key={provider} value={provider}>\n {PROVIDER_LABELS[provider]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[11px] text-muted-foreground\">\n {PROVIDER_DESCRIPTIONS[selectedProvider]}\n </p>\n </div>\n )}\n\n <ProviderForm\n backendId={backendId}\n draft={draft}\n onChange={setDraft}\n disabled={saving || clearing}\n />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n size=\"sm\"\n onClick={() => {\n void handleSave();\n }}\n disabled={!saveEnabled}\n className=\"gap-2\"\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : null}\n {configured && source === \"keychain\"\n ? \"Update provider\"\n : \"Save provider\"}\n </Button>\n {showClear && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n void handleClear();\n }}\n disabled={saving || clearing}\n className=\"gap-2\"\n >\n {clearing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : null}\n Clear\n </Button>\n )}\n {!hasProviderChoice && (\n <span className=\"text-[11px] text-muted-foreground\">\n Sets <code className=\"rounded bg-muted px-1\">{envVarNames.join(\" / \")}</code>\n </span>\n )}\n </div>\n\n {feedback && (\n <div\n role=\"status\"\n className={`flex items-start gap-2 rounded-md border p-2 text-xs ${\n feedback.kind === \"success\"\n ? \"border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400\"\n : \"border-red-500/30 bg-red-500/5 text-red-600 dark:text-red-400\"\n }`}\n >\n {feedback.kind === \"success\" ? (\n <CheckCircle2 className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n ) : (\n <XCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n )}\n <span>{feedback.message}</span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Per-provider form fragment. Switches the visible inputs based on the\n * draft's `provider` discriminator. Inline because the field set is\n * tightly coupled to the provider type.\n */\nfunction ProviderForm({\n backendId,\n draft,\n onChange,\n disabled,\n}: {\n backendId: BackendId;\n draft: ProviderDraft;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n switch (draft.provider) {\n case \"anthropic\":\n case \"openai\":\n case \"google\":\n return (\n <div className=\"space-y-1\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder={apiKeyFormatHint(backendId)}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n aria-label={`${PROVIDER_LABELS[draft.provider]} API key`}\n />\n <p className=\"text-[11px] text-muted-foreground\">\n {apiKeyFormatHint(backendId)}\n </p>\n </div>\n );\n\n case \"bedrock\":\n return (\n <BedrockForm draft={draft} onChange={onChange} disabled={disabled} />\n );\n\n case \"vertex\":\n return (\n <div className=\"space-y-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField label=\"GCP project id\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-gcp-project\"\n value={draft.projectId}\n onChange={(e) =>\n onChange({ ...draft, projectId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Vertex region\"\n hint=\"`global`, a multi-region (`us`, `eu`), or a region (e.g. `us-east5`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-east5\"\n value={draft.region}\n onChange={(e) =>\n onChange({ ...draft, region: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n <LabeledField\n label=\"Service account key file path (optional)\"\n hint=\"Absolute path to a service-account JSON file. Leave blank to use Application Default Credentials (`gcloud auth application-default login`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"/Users/me/keys/sa.json\"\n value={draft.credentialsFile}\n onChange={(e) =>\n onChange({ ...draft, credentialsFile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Vertex base URL (optional)\"\n hint=\"Override for custom endpoints / gateways.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://aiplatform.googleapis.com\"\n value={draft.vertexBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, vertexBaseUrl: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n\n case \"foundry\":\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">Endpoint</span>\n <div className=\"flex gap-2\">\n <Select\n value={draft.endpointKind}\n onValueChange={(v) =>\n onChange({\n ...draft,\n endpointKind: v as \"resource\" | \"base_url\",\n })\n }\n >\n <SelectTrigger className=\"w-44\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"resource\">Resource name</SelectItem>\n <SelectItem value=\"base_url\">Full base URL</SelectItem>\n </SelectContent>\n </Select>\n {draft.endpointKind === \"resource\" ? (\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-foundry-resource\"\n value={draft.resource}\n onChange={(e) =>\n onChange({ ...draft, resource: e.target.value })\n }\n disabled={disabled}\n />\n ) : (\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://my-foundry-resource.services.ai.azure.com/anthropic\"\n value={draft.baseUrl}\n onChange={(e) =>\n onChange({ ...draft, baseUrl: e.target.value })\n }\n disabled={disabled}\n />\n )}\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Resource name is the simpler form; base URL is for custom\n gateways. Set exactly one.\n </p>\n </div>\n <LabeledField\n label=\"Foundry API key (optional)\"\n hint=\"Leave blank to use Azure DefaultAzureCredential (`az login`, managed identity, etc.).\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n\n case \"azure-openai\":\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-md border border-amber-500/40 bg-amber-500/5 p-2 text-[11px] text-amber-700 dark:text-amber-400\">\n <strong>Deployment-name alignment required.</strong> The daemon\n spawns codex with <code>--model &lt;id&gt;</code> from the\n process-routing registry, which Codex treats as the Azure\n deployment name. Name your Azure deployments to match the\n model IDs configured on the <code>/settings/models</code>{\" \"}\n page (e.g. <code>gpt-5-codex</code>). Renaming the deployment\n in Azure is the supported fix.\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"Azure resource name\"\n hint=\"The Foundry/Azure-OpenAI resource name (subdomain of `*.openai.azure.com`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-azure-resource\"\n value={draft.resource}\n onChange={(e) =>\n onChange({ ...draft, resource: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Azure OpenAI API key\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"API version\"\n hint=\"Azure OpenAI API version (Codex uses the `responses` wire API).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiVersion}\n onChange={(e) =>\n onChange({ ...draft, apiVersion: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Default deployment name (optional)\"\n hint=\"Falls back when the daemon does not pass --model. Most invocations override this via --model from the routing registry — see warning above.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"gpt-5-codex\"\n value={draft.deploymentName}\n onChange={(e) =>\n onChange({ ...draft, deploymentName: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n </div>\n );\n\n case \"gemini-vertex\":\n return (\n <GeminiVertexForm\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n );\n }\n}\n\nfunction BedrockForm({\n draft,\n onChange,\n disabled,\n}: {\n draft: Extract<ProviderDraft, { provider: \"bedrock\" }>;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n const setMode = (mode: string) => {\n if (mode === draft.authMode) return;\n onChange(emptyBedrockDraft(mode as BedrockAuthMode));\n };\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">\n AWS authentication\n </span>\n <Select value={draft.authMode} onValueChange={setMode}>\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"access_key\">\n Access key id + secret\n </SelectItem>\n <SelectItem value=\"bearer_token\">\n Bedrock API key (`AWS_BEARER_TOKEN_BEDROCK`)\n </SelectItem>\n <SelectItem value=\"profile\">\n AWS profile (`~/.aws/config`)\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {draft.authMode === \"access_key\" && (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"AWS access key id\"\n hint=\"`AKIA…` for IAM users; `ASIA…` for STS / Identity Center.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"AKIAIOSFODNN7EXAMPLE\"\n value={draft.awsAccessKeyId}\n onChange={(e) =>\n onChange({ ...draft, awsAccessKeyId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"AWS secret access key\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsSecretAccessKey}\n onChange={(e) =>\n onChange({ ...draft, awsSecretAccessKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"AWS session token (optional)\"\n hint=\"Required for STS / Identity Center temporary credentials.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsSessionToken}\n onChange={(e) =>\n onChange({ ...draft, awsSessionToken: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n )}\n\n {draft.authMode === \"bearer_token\" && (\n <LabeledField\n label=\"Bedrock API key\"\n hint=\"See AWS docs: 'Bedrock API keys' for how to issue one.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsBearerTokenBedrock}\n onChange={(e) =>\n onChange({\n ...draft,\n awsBearerTokenBedrock: e.target.value,\n })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n {draft.authMode === \"profile\" && (\n <LabeledField\n label=\"AWS profile name\"\n hint=\"Resolves credentials from `~/.aws/config` and `~/.aws/credentials`.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"default\"\n value={draft.awsProfile}\n onChange={(e) =>\n onChange({ ...draft, awsProfile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"AWS region\"\n hint=\"Required by Claude Code regardless of auth mode.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-east-1\"\n value={draft.awsRegion}\n onChange={(e) =>\n onChange({ ...draft, awsRegion: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Bedrock base URL (optional)\"\n hint=\"Override for VPC endpoints / gateways.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://bedrock-runtime.us-east-1.amazonaws.com\"\n value={draft.bedrockBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, bedrockBaseUrl: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n\n <details className=\"rounded-md border border-border p-2 text-xs\">\n <summary className=\"cursor-pointer font-medium text-foreground\">\n Mantle endpoint (advanced)\n </summary>\n <div className=\"mt-2 space-y-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n Mantle is an alternate Bedrock endpoint that uses the native\n Anthropic API shape. Setting this alongside the standard\n Invoke API lets Claude Code route per model. Most operators\n should leave this off.\n </p>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n checked={draft.useMantle}\n onChange={(e) =>\n onChange({ ...draft, useMantle: e.target.checked })\n }\n disabled={disabled}\n />\n Enable Mantle endpoint (`CLAUDE_CODE_USE_MANTLE=1`)\n </label>\n <LabeledField\n label=\"Mantle base URL (optional)\"\n hint=\"Override the default Mantle endpoint URL.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.mantleBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, mantleBaseUrl: e.target.value })\n }\n disabled={disabled || !draft.useMantle}\n />\n </LabeledField>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n checked={draft.skipMantleAuth}\n onChange={(e) =>\n onChange({ ...draft, skipMantleAuth: e.target.checked })\n }\n disabled={disabled || !draft.useMantle}\n />\n Skip client-side auth (gateway injects credentials)\n </label>\n </div>\n </details>\n\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n}\n\n/**\n * Shared pinned-model fields for all three Anthropic-cloud forms.\n * Pre-filled with the recommended defaults from the Anthropic docs;\n * editing them mirrors to `ANTHROPIC_DEFAULT_*_MODEL` env vars.\n *\n * Pinning is *strongly recommended* by Anthropic for production rollouts:\n * without it, `sonnet`/`opus`/`haiku` aliases resolve to the latest model\n * version, which may not be enabled in the customer's cloud account →\n * Claude Code falls back at startup or 404s on Foundry. Hide behind a\n * `<details>` because the defaults are usually right.\n */\ntype PinnedDraft = Extract<\n ProviderDraft,\n { defaultOpusModel: string }\n>;\n\nfunction PinnedModelsFields({\n draft,\n onChange,\n disabled,\n}: {\n draft: PinnedDraft;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n // Each branch of the discriminated draft union has a different\n // property set, so spreading `draft` and adding one field at a time\n // would produce a union too wide for TS to assign back to ProviderDraft.\n // The runtime spread is sound; we narrow once via a local helper.\n const updatePinned = (patch: Partial<PinnedDraft>) => {\n onChange({ ...draft, ...patch } as ProviderDraft);\n };\n return (\n <details className=\"rounded-md border border-border p-2 text-xs\">\n <summary className=\"cursor-pointer font-medium text-foreground\">\n Pinned model IDs (recommended)\n </summary>\n <div className=\"mt-2 space-y-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n Pinning prevents the `sonnet`/`opus`/`haiku` aliases from\n resolving to a model not yet enabled in your cloud account.\n Pre-filled with Anthropic&apos;s recommended defaults — edit only\n if your account is on a different model tier.\n </p>\n <LabeledField label=\"Opus model ID (`ANTHROPIC_DEFAULT_OPUS_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultOpusModel}\n onChange={(e) =>\n updatePinned({ defaultOpusModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Sonnet model ID (`ANTHROPIC_DEFAULT_SONNET_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultSonnetModel}\n onChange={(e) =>\n updatePinned({ defaultSonnetModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Haiku model ID (`ANTHROPIC_DEFAULT_HAIKU_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultHaikuModel}\n onChange={(e) =>\n updatePinned({ defaultHaikuModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n </details>\n );\n}\n\nfunction GeminiVertexForm({\n draft,\n onChange,\n disabled,\n}: {\n draft: Extract<ProviderDraft, { provider: \"gemini-vertex\" }>;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n const setMode = (mode: string) => {\n if (mode === draft.authMode) return;\n onChange(emptyGeminiVertexDraft(mode as GeminiVertexAuthMode));\n };\n return (\n <div className=\"space-y-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField label=\"GCP project id\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-gcp-project\"\n value={draft.projectId}\n onChange={(e) =>\n onChange({ ...draft, projectId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"GCP location\" hint=\"e.g. `us-central1`\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-central1\"\n value={draft.location}\n onChange={(e) =>\n onChange({ ...draft, location: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">\n Authentication\n </span>\n <Select value={draft.authMode} onValueChange={setMode}>\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"adc\">\n Application Default Credentials (`gcloud auth`)\n </SelectItem>\n <SelectItem value=\"service_account\">\n Service-account JSON file path\n </SelectItem>\n <SelectItem value=\"api_key\">Vertex API key</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {draft.authMode === \"service_account\" && (\n <LabeledField label=\"Service account key file path\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"/Users/me/keys/sa.json\"\n value={draft.credentialsFile}\n onChange={(e) =>\n onChange({ ...draft, credentialsFile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n {draft.authMode === \"api_key\" && (\n <LabeledField\n label=\"Vertex API key\"\n hint=\"`AIza…`. Distinct from a direct Gemini API key — it goes to GOOGLE_API_KEY only and routes through Vertex.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n </div>\n );\n}\n\nfunction LabeledField({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">{label}</span>\n {children}\n {hint && (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n )}\n </div>\n );\n}\n\nfunction defaultAvailableProviders(\n backendId: BackendId,\n): readonly ApiKeyProvider[] {\n switch (backendId) {\n case \"claude\":\n return [\"anthropic\", \"bedrock\", \"vertex\", \"foundry\"];\n case \"codex\":\n return [\"openai\", \"azure-openai\"];\n case \"gemini\":\n return [\"google\", \"gemini-vertex\"];\n }\n}\n","\"use client\";\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n ApiKeyProvider,\n BackendApiKeyConfig,\n BackendId,\n} from \"@aitne/shared\";\nimport { api } from \"@/lib/api-client\";\n\nexport type ApiKeySource = \"keychain\" | \"shell\" | \"none\";\n\nexport interface BackendApiKeyState {\n backendId: BackendId;\n configured: boolean;\n source: ApiKeySource;\n /** Active provider when source==='keychain'. Null otherwise. */\n provider: ApiKeyProvider | null;\n envVarNames: readonly string[];\n /** Providers the operator can pick for this backend. */\n availableProviders: readonly ApiKeyProvider[];\n}\n\nexport interface BackendApiKeyMutationResult {\n status: \"saved\" | \"cleared\";\n backendId: BackendId;\n source: ApiKeySource;\n provider: ApiKeyProvider | null;\n auth: {\n ok: boolean;\n status: string | null;\n detail: string | null;\n method: string | null;\n } | null;\n}\n\n/**\n * Save body. Two accepted shapes — direct API key (legacy single-field\n * form) or a typed cloud-provider config. Mirrors the union the daemon\n * accepts at PUT /backends/:id/api-key.\n */\nexport type SaveBackendApiKeyInput =\n | { apiKey: string }\n | { config: BackendApiKeyConfig };\n\nconst apiKeyQueryKey = (backendId: BackendId) =>\n [\"backend-api-key\", backendId] as const;\n\nexport function useBackendApiKey(backendId: BackendId) {\n return useQuery({\n queryKey: apiKeyQueryKey(backendId),\n queryFn: () =>\n api.get<BackendApiKeyState>(`/backends/${backendId}/api-key`),\n staleTime: 30_000,\n });\n}\n\n/** Save a new API key or cloud-provider config. Triggers a server-side\n * `checkAuthDetailed()` so the backend's auth status reflects the new\n * config without a separate click. */\nexport function useSaveBackendApiKey(backendId: BackendId) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: SaveBackendApiKeyInput) =>\n api.put<BackendApiKeyMutationResult>(\n `/backends/${backendId}/api-key`,\n input,\n ),\n onSuccess: () => {\n void queryClient.invalidateQueries({\n queryKey: apiKeyQueryKey(backendId),\n });\n // The save triggered a checkAuthDetailed() server-side, so the\n // /backends list now has a fresher auth status row.\n void queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n },\n });\n}\n\n/** Clear the keychain entry. Falls back to the captured shell value if any. */\nexport function useClearBackendApiKey(backendId: BackendId) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: () =>\n api.delete<BackendApiKeyMutationResult>(\n `/backends/${backendId}/api-key`,\n ),\n onSuccess: () => {\n void queryClient.invalidateQueries({\n queryKey: apiKeyQueryKey(backendId),\n });\n void queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n },\n });\n}\n","/**\n * Pure logic helpers for `BackendApiKeyPanel`. Mirrors the Zod schemas\n * from `@aitne/shared` so the dashboard can preview format\n * issues before round-tripping to the daemon.\n *\n * The daemon is the source of truth — even a format-valid config may be\n * rejected by the provider's runtime auth check. The panel surfaces both\n * layers: client-side rejection for cheap typos, server-side detail for\n * the rest.\n */\n\nimport {\n defaultApiKeyProvider,\n DEFAULT_AZURE_OPENAI_API_VERSION,\n isPlausibleAnthropicApiKey,\n isPlausibleGeminiApiKey,\n isPlausibleOpenAiApiKey,\n RECOMMENDED_PINNED_MODELS_BY_PROVIDER,\n validateBackendApiKeyConfigFormat,\n type ApiKeyProvider,\n type BackendApiKeyConfig,\n type BackendId,\n} from \"@aitne/shared\";\n\nexport type ApiKeySource = \"keychain\" | \"shell\" | \"none\";\n\n// Re-exports so existing dashboard tests / callers keep their import\n// surface stable while the implementation is sourced from shared.\nexport {\n isPlausibleAnthropicApiKey,\n isPlausibleOpenAiApiKey,\n isPlausibleGeminiApiKey,\n};\n\n/**\n * Direct-API-key plausibility check used by the legacy single-field\n * form (provider === default direct provider for the backend).\n */\nexport function isPlausibleApiKey(\n backendId: BackendId,\n value: string,\n): boolean {\n switch (defaultApiKeyProvider(backendId)) {\n case \"anthropic\":\n return isPlausibleAnthropicApiKey(value);\n case \"openai\":\n return isPlausibleOpenAiApiKey(value);\n case \"google\":\n return isPlausibleGeminiApiKey(value);\n default:\n return false;\n }\n}\n\n/** Hint text shown beneath the direct-API-key input field. */\nexport function apiKeyFormatHint(backendId: BackendId): string {\n switch (defaultApiKeyProvider(backendId)) {\n case \"anthropic\":\n return \"Anthropic key — starts with `sk-ant-…`.\";\n case \"openai\":\n return \"OpenAI key — starts with `sk-…` (not `sk-ant-…`).\";\n case \"google\":\n return \"Google API key — starts with `AIza…`, 39 chars total.\";\n default:\n return \"API key\";\n }\n}\n\n/** Env var names the daemon will populate when a direct key is saved. */\nexport function apiKeyEnvVarNames(backendId: BackendId): readonly string[] {\n switch (backendId) {\n case \"claude\":\n return [\"ANTHROPIC_API_KEY\"];\n case \"codex\":\n return [\"OPENAI_API_KEY\"];\n case \"gemini\":\n return [\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"];\n }\n}\n\nexport function apiKeyStatusLabel(source: ApiKeySource): string {\n switch (source) {\n case \"keychain\":\n return \"API key configured (stored in OS keychain).\";\n case \"shell\":\n return \"Using API key from shell environment. Save a key here to override.\";\n case \"none\":\n return \"No API key configured. Falling back to CLI login / OAuth.\";\n }\n}\n\n/** Whether the Save button should be enabled for the legacy direct form. */\nexport function isSaveEnabled(opts: {\n backendId: BackendId;\n draftValue: string;\n saving: boolean;\n}): boolean {\n if (opts.saving) return false;\n const trimmed = opts.draftValue.trim();\n if (!trimmed) return false;\n return isPlausibleApiKey(opts.backendId, trimmed);\n}\n\nexport function isClearVisible(source: ApiKeySource): boolean {\n return source === \"keychain\";\n}\n\n// ── Provider metadata ──────────────────────────────────────────────\n\nexport const PROVIDER_LABELS: Record<ApiKeyProvider, string> = {\n anthropic: \"Anthropic API key\",\n bedrock: \"Amazon Bedrock\",\n vertex: \"Google Vertex AI\",\n foundry: \"Microsoft Foundry\",\n openai: \"OpenAI API key\",\n \"azure-openai\": \"Azure OpenAI\",\n google: \"Google API key\",\n \"gemini-vertex\": \"Google Vertex AI\",\n};\n\nexport const PROVIDER_DESCRIPTIONS: Record<ApiKeyProvider, string> = {\n anthropic:\n \"Direct Anthropic API key (`sk-ant-…`). Stored in the OS keychain and mirrored to `ANTHROPIC_API_KEY`.\",\n bedrock:\n \"Anthropic models on Amazon Bedrock. Sets `CLAUDE_CODE_USE_BEDROCK=1` plus AWS credentials. Required: `AWS_REGION`.\",\n vertex:\n \"Anthropic models on Google Vertex AI. Sets `CLAUDE_CODE_USE_VERTEX=1` plus GCP project / region. Auth via Application Default Credentials or a service-account key file.\",\n foundry:\n \"Anthropic models on Microsoft Foundry. Sets `CLAUDE_CODE_USE_FOUNDRY=1` plus the Foundry resource (or full base URL). API key optional — falls back to Azure DefaultAzureCredential (`az login`).\",\n openai:\n \"OpenAI API key (`sk-…`). Stored in the keychain and mirrored to `OPENAI_API_KEY`.\",\n \"azure-openai\":\n \"Codex CLI on Azure OpenAI. Daemon writes a managed `config.toml` to `<dataDir>/codex-home/` and points `CODEX_HOME` there — your personal `~/.codex/` is untouched. Sets `AZURE_OPENAI_API_KEY`. **Important:** the daemon spawns codex with `--model <id>` from the model registry, which Codex treats as the deployment name on Azure. Name your Azure deployments to match the model IDs shown on the /settings/models page (e.g. `gpt-5-codex`).\",\n google:\n \"Direct Gemini API key (`AIza…`). Mirrored to `GEMINI_API_KEY` + `GOOGLE_API_KEY`.\",\n \"gemini-vertex\":\n \"Gemini on Google Vertex AI. Sets `GOOGLE_GENAI_USE_VERTEXAI=true` plus GCP project / location. Auth via ADC, a service-account key file, or a Vertex API key.\",\n};\n\n// ── Drafts (form state) ────────────────────────────────────────────\n\n/** Common pinned-model fields shared by all three Anthropic-cloud forms. */\ninterface PinnedModelDraftFields {\n defaultOpusModel: string;\n defaultSonnetModel: string;\n defaultHaikuModel: string;\n}\n\nexport type ProviderDraft =\n | { provider: \"anthropic\"; apiKey: string }\n | ({\n provider: \"bedrock\";\n authMode: \"access_key\";\n awsAccessKeyId: string;\n awsSecretAccessKey: string;\n awsSessionToken: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n // Mantle endpoint (optional)\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"bedrock\";\n authMode: \"bearer_token\";\n awsBearerTokenBedrock: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"bedrock\";\n authMode: \"profile\";\n awsProfile: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"vertex\";\n projectId: string;\n region: string;\n credentialsFile: string;\n vertexBaseUrl: string;\n } & PinnedModelDraftFields)\n | ({\n provider: \"foundry\";\n endpointKind: \"resource\" | \"base_url\";\n resource: string;\n baseUrl: string;\n apiKey: string;\n } & PinnedModelDraftFields)\n | { provider: \"openai\"; apiKey: string }\n | {\n provider: \"azure-openai\";\n resource: string;\n apiKey: string;\n apiVersion: string;\n deploymentName: string;\n }\n | { provider: \"google\"; apiKey: string }\n | {\n provider: \"gemini-vertex\";\n authMode: \"adc\";\n projectId: string;\n location: string;\n }\n | {\n provider: \"gemini-vertex\";\n authMode: \"service_account\";\n projectId: string;\n location: string;\n credentialsFile: string;\n }\n | {\n provider: \"gemini-vertex\";\n authMode: \"api_key\";\n projectId: string;\n location: string;\n apiKey: string;\n };\n\nexport type BedrockAuthMode = \"access_key\" | \"bearer_token\" | \"profile\";\nexport type GeminiVertexAuthMode = \"adc\" | \"service_account\" | \"api_key\";\n\n/** Build the recommended-defaults seed for the pinned-model fields. */\nfunction pinnedDefaults(provider: \"bedrock\" | \"vertex\" | \"foundry\"): PinnedModelDraftFields {\n const r = RECOMMENDED_PINNED_MODELS_BY_PROVIDER[provider];\n return {\n defaultOpusModel: r.defaultOpusModel,\n defaultSonnetModel: r.defaultSonnetModel,\n defaultHaikuModel: r.defaultHaikuModel,\n };\n}\n\nconst EMPTY_MANTLE_FIELDS = {\n useMantle: false,\n mantleBaseUrl: \"\",\n skipMantleAuth: false,\n};\n\nexport function emptyDraft(provider: ApiKeyProvider): ProviderDraft {\n switch (provider) {\n case \"anthropic\":\n return { provider: \"anthropic\", apiKey: \"\" };\n case \"bedrock\":\n return emptyBedrockDraft(\"access_key\");\n case \"vertex\":\n return {\n provider: \"vertex\",\n projectId: \"\",\n region: \"\",\n credentialsFile: \"\",\n vertexBaseUrl: \"\",\n ...pinnedDefaults(\"vertex\"),\n };\n case \"foundry\":\n return {\n provider: \"foundry\",\n endpointKind: \"resource\",\n resource: \"\",\n baseUrl: \"\",\n apiKey: \"\",\n ...pinnedDefaults(\"foundry\"),\n };\n case \"openai\":\n return { provider: \"openai\", apiKey: \"\" };\n case \"azure-openai\":\n return {\n provider: \"azure-openai\",\n resource: \"\",\n apiKey: \"\",\n apiVersion: DEFAULT_AZURE_OPENAI_API_VERSION,\n deploymentName: \"\",\n };\n case \"google\":\n return { provider: \"google\", apiKey: \"\" };\n case \"gemini-vertex\":\n return emptyGeminiVertexDraft(\"adc\");\n }\n}\n\nexport function emptyBedrockDraft(mode: BedrockAuthMode): ProviderDraft {\n const baseShared = {\n awsRegion: \"\",\n bedrockBaseUrl: \"\",\n ...EMPTY_MANTLE_FIELDS,\n ...pinnedDefaults(\"bedrock\"),\n };\n switch (mode) {\n case \"access_key\":\n return {\n provider: \"bedrock\",\n authMode: \"access_key\",\n awsAccessKeyId: \"\",\n awsSecretAccessKey: \"\",\n awsSessionToken: \"\",\n ...baseShared,\n };\n case \"bearer_token\":\n return {\n provider: \"bedrock\",\n authMode: \"bearer_token\",\n awsBearerTokenBedrock: \"\",\n ...baseShared,\n };\n case \"profile\":\n return {\n provider: \"bedrock\",\n authMode: \"profile\",\n awsProfile: \"\",\n ...baseShared,\n };\n }\n}\n\nexport function emptyGeminiVertexDraft(\n mode: GeminiVertexAuthMode,\n): ProviderDraft {\n const base = { projectId: \"\", location: \"\" };\n switch (mode) {\n case \"adc\":\n return { provider: \"gemini-vertex\", authMode: \"adc\", ...base };\n case \"service_account\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"service_account\",\n credentialsFile: \"\",\n ...base,\n };\n case \"api_key\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"api_key\",\n apiKey: \"\",\n ...base,\n };\n }\n}\n\n/**\n * Build a typed config from the panel draft, dropping optional fields\n * that the operator left blank. Returns null when required fields are\n * missing (the Save button stays disabled in that state).\n */\n/**\n * Strip the pinned-model draft fields into the schema's optional shape.\n * Treats blank values as \"leave the cloud's built-in default\" by omitting\n * the field entirely (so we don't push empty-string env vars).\n */\nfunction pinnedFromDraft(draft: PinnedModelDraftFields): {\n defaultOpusModel?: string;\n defaultSonnetModel?: string;\n defaultHaikuModel?: string;\n} {\n const out: {\n defaultOpusModel?: string;\n defaultSonnetModel?: string;\n defaultHaikuModel?: string;\n } = {};\n if (draft.defaultOpusModel.trim()) {\n out.defaultOpusModel = draft.defaultOpusModel.trim();\n }\n if (draft.defaultSonnetModel.trim()) {\n out.defaultSonnetModel = draft.defaultSonnetModel.trim();\n }\n if (draft.defaultHaikuModel.trim()) {\n out.defaultHaikuModel = draft.defaultHaikuModel.trim();\n }\n return out;\n}\n\nexport function draftToConfig(\n draft: ProviderDraft,\n): BackendApiKeyConfig | null {\n switch (draft.provider) {\n case \"anthropic\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"anthropic\", apiKey: draft.apiKey.trim() };\n case \"bedrock\": {\n const region = draft.awsRegion.trim();\n if (!region) return null;\n const baseUrl = draft.bedrockBaseUrl.trim();\n const baseUrlField = baseUrl ? { bedrockBaseUrl: baseUrl } : {};\n const mantleFields = {\n ...(draft.useMantle ? { useMantle: true } : {}),\n ...(draft.mantleBaseUrl.trim()\n ? { mantleBaseUrl: draft.mantleBaseUrl.trim() }\n : {}),\n ...(draft.skipMantleAuth ? { skipMantleAuth: true } : {}),\n };\n const pinned = pinnedFromDraft(draft);\n switch (draft.authMode) {\n case \"access_key\": {\n if (\n !draft.awsAccessKeyId.trim()\n || !draft.awsSecretAccessKey.trim()\n ) {\n return null;\n }\n return {\n provider: \"bedrock\",\n authMode: \"access_key\",\n awsAccessKeyId: draft.awsAccessKeyId.trim(),\n awsSecretAccessKey: draft.awsSecretAccessKey.trim(),\n ...(draft.awsSessionToken.trim()\n ? { awsSessionToken: draft.awsSessionToken.trim() }\n : {}),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n }\n case \"bearer_token\":\n if (!draft.awsBearerTokenBedrock.trim()) return null;\n return {\n provider: \"bedrock\",\n authMode: \"bearer_token\",\n awsBearerTokenBedrock: draft.awsBearerTokenBedrock.trim(),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n case \"profile\":\n if (!draft.awsProfile.trim()) return null;\n return {\n provider: \"bedrock\",\n authMode: \"profile\",\n awsProfile: draft.awsProfile.trim(),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n }\n return null;\n }\n case \"vertex\": {\n if (!draft.projectId.trim() || !draft.region.trim()) return null;\n return {\n provider: \"vertex\",\n projectId: draft.projectId.trim(),\n region: draft.region.trim(),\n ...(draft.credentialsFile.trim()\n ? { credentialsFile: draft.credentialsFile.trim() }\n : {}),\n ...(draft.vertexBaseUrl.trim()\n ? { vertexBaseUrl: draft.vertexBaseUrl.trim() }\n : {}),\n ...pinnedFromDraft(draft),\n };\n }\n case \"foundry\": {\n const resource = draft.resource.trim();\n const baseUrl = draft.baseUrl.trim();\n const apiKey = draft.apiKey.trim();\n const pinned = pinnedFromDraft(draft);\n if (draft.endpointKind === \"resource\") {\n if (!resource) return null;\n return {\n provider: \"foundry\",\n resource,\n ...(apiKey ? { apiKey } : {}),\n ...pinned,\n };\n }\n if (!baseUrl) return null;\n return {\n provider: \"foundry\",\n baseUrl,\n ...(apiKey ? { apiKey } : {}),\n ...pinned,\n };\n }\n case \"openai\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"openai\", apiKey: draft.apiKey.trim() };\n case \"azure-openai\": {\n const resource = draft.resource.trim();\n const apiKey = draft.apiKey.trim();\n if (!resource || !apiKey) return null;\n return {\n provider: \"azure-openai\",\n resource,\n apiKey,\n ...(draft.apiVersion.trim()\n ? { apiVersion: draft.apiVersion.trim() }\n : {}),\n ...(draft.deploymentName.trim()\n ? { deploymentName: draft.deploymentName.trim() }\n : {}),\n };\n }\n case \"google\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"google\", apiKey: draft.apiKey.trim() };\n case \"gemini-vertex\": {\n const projectId = draft.projectId.trim();\n const location = draft.location.trim();\n if (!projectId || !location) return null;\n switch (draft.authMode) {\n case \"adc\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"adc\",\n projectId,\n location,\n };\n case \"service_account\":\n if (!draft.credentialsFile.trim()) return null;\n return {\n provider: \"gemini-vertex\",\n authMode: \"service_account\",\n projectId,\n location,\n credentialsFile: draft.credentialsFile.trim(),\n };\n case \"api_key\":\n if (!draft.apiKey.trim()) return null;\n return {\n provider: \"gemini-vertex\",\n authMode: \"api_key\",\n projectId,\n location,\n apiKey: draft.apiKey.trim(),\n };\n }\n return null;\n }\n }\n}\n\n/**\n * Whether the cloud-provider Save button should be enabled. Requires\n * all required fields populated, valid format, and no in-flight save.\n */\nexport function isConfigSaveEnabled(opts: {\n backendId: BackendId;\n draft: ProviderDraft;\n saving: boolean;\n}): boolean {\n if (opts.saving) return false;\n const config = draftToConfig(opts.draft);\n if (!config) return false;\n return validateBackendApiKeyConfigFormat(opts.backendId, config) === null;\n}\n\n/** True when a provider is the legacy single-API-key form, false when it\n * needs the multi-field cloud form. Drives which form to render. */\nexport function isDirectApiKeyProvider(provider: ApiKeyProvider): boolean {\n return (\n provider === \"anthropic\" || provider === \"openai\" || provider === \"google\"\n );\n}\n","\"use client\";\n\nimport { Alert } from \"@/components/ui/alert\";\n\n/**\n * Warning surfaced wherever the operator sees the per-backend API-key\n * panel (setup wizard's AI Backends step, /settings/models). Skipping\n * the API key falls the daemon back to the CLI's local subscription\n * auth, which providers explicitly discourage for programmatic use —\n * Anthropic in particular currently prohibits running the Agent SDK on a\n * Claude Pro / Max subscription. Provider policies change frequently, so\n * we surface the warning rather than silently relying on the fallback.\n */\nexport function SubscriptionAuthWarning() {\n return (\n <Alert variant=\"warning\">\n <p className=\"font-semibold\">\n API key recommended — subscription auth is not supported by all\n providers\n </p>\n <p className=\"mt-1 leading-relaxed\">\n You can skip API key setup and the daemon will fall back to each\n backend&rsquo;s local CLI login (subscription auth). Most providers\n do not officially support running automated agents on a\n subscription plan; <strong>Anthropic currently prohibits</strong>{\" \"}\n using the Claude Agent SDK with a Claude Pro / Max subscription.\n Provider policies change often — to stay clear of the gray area,\n register a paid API key here.\n </p>\n </Alert>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name LockOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgOS45LTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lock-open\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LockOpen = createLucideIcon('LockOpen', [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 9.9-1', key: '1mm8w8' }],\n]);\n\nexport default LockOpen;\n","import type { BackendId, ExecutionPermissionMode } from \"@aitne/shared\";\n\n/**\n * Execution mode step — pure state + payload logic.\n *\n * Design: `EXECUTION-MODE-DESIGN.md` §5.1.\n *\n * The user-visible labels are `Safe` / `Allow`; the daemon already stores\n * these as `strict` / `allow` in `{claude,codex,gemini}ExecutionPermissionMode`.\n * The UI layer uses `ExecutionModeUi` everywhere so the copy and form state\n * stay consistent with the card labels, and this module owns the single\n * translation point into the internal `ExecutionPermissionMode` alphabet.\n */\n\nexport type ExecutionModeUi = \"safe\" | \"allow\";\n\nexport const EXECUTION_MODE_UI_VALUES = [\"safe\", \"allow\"] as const;\n\n/**\n * Per-backend override as stored in form state. `null` means \"follow the\n * top-level choice\" — the accordion is collapsed-by-default and unchanged\n * rows should not silently diverge from the top-level pick.\n */\nexport type PerBackendOverrides = Record<BackendId, ExecutionModeUi | null>;\n\nexport const EMPTY_OVERRIDES: PerBackendOverrides = {\n claude: null,\n codex: null,\n gemini: null,\n};\n\nexport function uiToInternal(mode: ExecutionModeUi): ExecutionPermissionMode {\n return mode === \"safe\" ? \"strict\" : \"allow\";\n}\n\nexport function internalToUi(mode: ExecutionPermissionMode): ExecutionModeUi {\n return mode === \"strict\" ? \"safe\" : \"allow\";\n}\n\n/**\n * API payload for `POST /api/setup/mode`. Per-backend overrides are only\n * emitted when they diverge from the top-level pick, so the shape stays\n * minimal for the common case.\n */\nexport interface SetupModePayload {\n mode: ExecutionModeUi;\n perBackend?: Partial<Record<BackendId, ExecutionModeUi>>;\n}\n\n/**\n * Build the `/setup/mode` payload from the current form state. Two paths:\n *\n * 1. `topLevel` non-null — standard case. Overrides that equal the top are\n * filtered out; only divergent rows are emitted.\n * 2. `topLevel === null` — settings-page divergent-seed case (every backend\n * had a different persisted mode, so there is no unified top to show).\n * Caller must supply a fully-specified override set; a synthetic top is\n * chosen as the majority mode across the three rows, and the minority\n * rows are emitted as overrides. This keeps the API shape unchanged —\n * `mode` is still required by the endpoint — while letting the user\n * commit an arbitrary per-backend configuration without first clicking\n * one of the cards.\n *\n * Returns `null` when the state is incomplete (no top pick and at least\n * one override is null). Caller uses that to gate the Apply button.\n */\nexport function buildSetupModePayload(\n topLevel: ExecutionModeUi | null,\n overrides: PerBackendOverrides,\n): SetupModePayload | null {\n if (topLevel === null) {\n if (\n overrides.claude === null\n || overrides.codex === null\n || overrides.gemini === null\n ) {\n return null;\n }\n const synthetic = majorityMode(overrides);\n const perBackend: Partial<Record<BackendId, ExecutionModeUi>> = {};\n for (const backend of [\"claude\", \"codex\", \"gemini\"] as const) {\n const value = overrides[backend];\n // The null guard above narrows `value` at runtime, but TS doesn't\n // track the per-index narrowing through the const-backends loop.\n if (value !== null && value !== synthetic) perBackend[backend] = value;\n }\n const payload: SetupModePayload = { mode: synthetic };\n if (Object.keys(perBackend).length > 0) payload.perBackend = perBackend;\n return payload;\n }\n\n const perBackend: Partial<Record<BackendId, ExecutionModeUi>> = {};\n for (const backend of [\"claude\", \"codex\", \"gemini\"] as const) {\n const override = overrides[backend];\n if (override !== null && override !== topLevel) {\n perBackend[backend] = override;\n }\n }\n const payload: SetupModePayload = { mode: topLevel };\n if (Object.keys(perBackend).length > 0) {\n payload.perBackend = perBackend;\n }\n return payload;\n}\n\n/** True when the current form state is ready to POST. */\nexport function canApply(\n topLevel: ExecutionModeUi | null,\n overrides: PerBackendOverrides,\n): boolean {\n return buildSetupModePayload(topLevel, overrides) !== null;\n}\n\n/**\n * Majority mode across three non-null overrides. Ties (e.g. 1 safe / 1\n * allow / 1 safe) resolve to the first-occurring mode in backend order\n * claude → codex → gemini. Used for the divergent-apply synthetic top.\n */\nfunction majorityMode(\n overrides: PerBackendOverrides,\n): ExecutionModeUi {\n const backends = [\"claude\", \"codex\", \"gemini\"] as const;\n let safe = 0;\n let allow = 0;\n for (const b of backends) {\n if (overrides[b] === \"safe\") safe++;\n else if (overrides[b] === \"allow\") allow++;\n }\n if (safe > allow) return \"safe\";\n if (allow > safe) return \"allow\";\n // Tie — pick the first non-null in backend order. With three non-null\n // entries a tie is impossible (3 is odd), but the fallthrough keeps\n // the type system and future 4-backend extensions honest.\n for (const b of backends) {\n if (overrides[b] !== null) return overrides[b] as ExecutionModeUi;\n }\n return \"safe\";\n}\n\n/**\n * Resolve what mode a backend will effectively run in given the current\n * form state. Used by the advanced accordion to echo the actual mode a\n * row will be written with — including when \"follow top-level\" is active.\n */\nexport function resolveEffectiveMode(\n backend: BackendId,\n topLevel: ExecutionModeUi,\n overrides: PerBackendOverrides,\n): ExecutionModeUi {\n return overrides[backend] ?? topLevel;\n}\n\n/**\n * True when at least one per-backend row diverges from the top-level pick.\n * Drives the accordion's \"mixed\" indicator so the user can tell at a glance\n * whether the collapsed accordion hides a non-trivial configuration.\n */\nexport function hasDivergentOverride(\n topLevel: ExecutionModeUi,\n overrides: PerBackendOverrides,\n): boolean {\n return ([\"claude\", \"codex\", \"gemini\"] as const).some(\n (b) => overrides[b] !== null && overrides[b] !== topLevel,\n );\n}\n"],"names":["STATUS_CONFIG","ok","variant","label","icon","expiring_soon","expired","missing","recovering","unknown","normalizeStatus","raw","formatElapsed","isoDate","diffMs","Date","now","getTime","mins","Math","floor","hours","days","AuthStatusBadge","status","rawStatus","elapsedText","detail","firstExpiredAt","lastSuccessAt","notificationCount","config","isRecovering","isFailure","tooltipLines","push","asChild","className","side","map","line","i","apiKeyQueryKey","backendId","useBackendApiKey","queryKey","queryFn","get","staleTime","useSaveBackendApiKey","queryClient","mutationFn","input","put","onSuccess","invalidateQueries","useClearBackendApiKey","delete","SubscriptionAuthWarning","EXECUTION_MODE_UI_VALUES","EMPTY_OVERRIDES","claude","codex","gemini","uiToInternal","mode","internalToUi","buildSetupModePayload","topLevel","overrides","synthetic","majorityMode","perBackend","backend","value","payload","Object","keys","length","override","canApply","backends","safe","allow","b","resolveEffectiveMode","hasDivergentOverride","some"],"mappings":"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","ignoreList":[3,9]}
1
+ {"version":3,"sources":["../../../../../../packages/dashboard/src/components/settings/auth-status-badge.tsx","../../../../../../packages/dashboard/src/components/settings/cli-install-panel.tsx","../../../../../../packages/dashboard/src/components/settings/backend-card.tsx","../../../../../../node_modules/.pnpm/lucide-react%400.468.0_react%4019.2.4/node_modules/lucide-react/src/icons/globe.ts","../../../../../../node_modules/.pnpm/lucide-react%400.468.0_react%4019.2.4/node_modules/lucide-react/src/icons/clipboard-copy.ts","../../../../../../packages/dashboard/src/components/settings/backend-card.logic.ts","../../../../../../packages/dashboard/src/components/settings/backend-api-key-panel.tsx","../../../../../../packages/dashboard/src/lib/hooks/use-backend-api-key.ts","../../../../../../packages/dashboard/src/components/settings/backend-api-key-panel.logic.ts","../../../../../../packages/dashboard/src/components/settings/subscription-auth-warning.tsx","../../../../../../node_modules/.pnpm/lucide-react%400.468.0_react%4019.2.4/node_modules/lucide-react/src/icons/lock-open.ts","../../../../../../packages/dashboard/src/components/settings/execution-mode.logic.ts"],"sourcesContent":["\"use client\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport { Tooltip, TooltipTrigger, TooltipContent } from \"@/components/ui/tooltip\";\nimport { formatRelativeTime, parseUtcDate } from \"@/lib/utils\";\nimport { Loader2 } from \"lucide-react\";\n\ntype AuthStatus = \"ok\" | \"expiring_soon\" | \"expired\" | \"missing\" | \"recovering\" | \"unknown\";\n\ninterface AuthStatusBadgeProps {\n status: string;\n detail: string | null;\n firstExpiredAt: string | null;\n lastSuccessAt: string | null;\n notificationCount: number;\n}\n\nconst STATUS_CONFIG: Record<AuthStatus, {\n variant: \"green\" | \"amber\" | \"red\" | \"gray\" | \"blue\";\n label: string;\n icon: string;\n}> = {\n ok: { variant: \"green\", label: \"OK\", icon: \"\\u2705\" },\n expiring_soon: { variant: \"amber\", label: \"Expiring Soon\", icon: \"\\uD83D\\uDFE1\" },\n expired: { variant: \"red\", label: \"Expired\", icon: \"\\uD83D\\uDD34\" },\n missing: { variant: \"gray\", label: \"Missing\", icon: \"\\u26AB\" },\n recovering: { variant: \"blue\", label: \"Recovering\", icon: \"\\uD83D\\uDD04\" },\n unknown: { variant: \"gray\", label: \"Unknown\", icon: \"\\u2753\" },\n};\n\nfunction normalizeStatus(raw: string): AuthStatus {\n if (raw in STATUS_CONFIG) return raw as AuthStatus;\n if (raw === \"error\") return \"expired\";\n return \"unknown\";\n}\n\nfunction formatElapsed(isoDate: string): string {\n const diffMs = Date.now() - parseUtcDate(isoDate).getTime();\n const mins = Math.floor(diffMs / 60_000);\n if (mins < 60) return `${mins}m`;\n const hours = Math.floor(mins / 60);\n if (hours < 24) return `${hours}h`;\n const days = Math.floor(hours / 24);\n return `${days}d`;\n}\n\n/**\n * Auth status badge with 5-state color coding, elapsed-time display for\n * failures, and a tooltip showing the detailed auth status information.\n *\n * Phase 8 §7.1.\n */\nexport function AuthStatusBadge({\n status: rawStatus,\n detail,\n firstExpiredAt,\n lastSuccessAt,\n notificationCount,\n}: AuthStatusBadgeProps) {\n const status = normalizeStatus(rawStatus);\n const config = STATUS_CONFIG[status];\n\n const isRecovering = status === \"recovering\";\n const isFailure = status === \"expired\" || status === \"missing\";\n\n const elapsedText =\n isFailure && firstExpiredAt ? ` (${formatElapsed(firstExpiredAt)})` : \"\";\n\n const tooltipLines: string[] = [];\n tooltipLines.push(`Status: ${config.label}`);\n if (detail) tooltipLines.push(`Detail: ${detail}`);\n if (firstExpiredAt && isFailure) {\n tooltipLines.push(`Failed since: ${formatRelativeTime(firstExpiredAt)}`);\n }\n if (lastSuccessAt) {\n tooltipLines.push(`Last success: ${formatRelativeTime(lastSuccessAt)}`);\n }\n if (notificationCount > 0) {\n tooltipLines.push(`Notifications sent: ${notificationCount}`);\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <span>\n <Badge variant={config.variant} className=\"gap-1\">\n {isRecovering ? (\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n ) : null}\n Auth: {config.label}\n {elapsedText}\n </Badge>\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-xs\">\n <div className=\"space-y-0.5 text-xs\">\n {tooltipLines.map((line, i) => (\n <p key={i}>{line}</p>\n ))}\n </div>\n </TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport {\n CheckCircle2,\n ClipboardCopy,\n Download,\n ExternalLink,\n Loader2,\n RefreshCw,\n Terminal,\n XCircle,\n} from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { api } from \"@/lib/api-client\";\nimport type {\n BackendInstallInfo,\n CliInstallResult,\n InstallMethodsResponse,\n} from \"@/lib/api-types\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { BACKEND_LABELS } from \"@/lib/backend-ui\";\n\ninterface CliInstallPanelProps {\n backendId: BackendId;\n /** Whether the CLI is currently installed (from useBackends). */\n cliInstalled: boolean;\n /** Compact mode for inline use in settings cards. */\n compact?: boolean;\n /** Called after a successful install so the parent can re-fetch data. */\n onInstalled?: () => void;\n}\n\n/**\n * Shows CLI installation status for a backend and lets the user\n * install via their preferred package manager (npm, brew, etc.).\n *\n * Handles two types of install methods:\n * - Auto-runnable: daemon executes the install command directly\n * - Manual-only: command is shown for the user to copy & run in their\n * own terminal (for methods requiring elevation or interactive input)\n */\nexport function CliInstallPanel({\n backendId,\n cliInstalled,\n compact = false,\n onInstalled,\n}: CliInstallPanelProps) {\n const queryClient = useQueryClient();\n const [installInfo, setInstallInfo] = useState<BackendInstallInfo | null>(\n null,\n );\n const [loading, setLoading] = useState(false);\n const [selectedMethod, setSelectedMethod] = useState<string>(\"\");\n const [installing, setInstalling] = useState(false);\n const [result, setResult] = useState<CliInstallResult | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n const fetchMethods = useCallback(async () => {\n if (cliInstalled) return;\n setLoading(true);\n try {\n const data = await api.get<InstallMethodsResponse>(\n \"/backends/install-methods\",\n );\n const info = data.backends[backendId];\n setInstallInfo(info);\n // Auto-select the first available method (ordered by recommendation)\n const firstAvailable = info.methods.find((m) => m.available);\n if (firstAvailable) {\n setSelectedMethod(firstAvailable.id);\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Failed to fetch install methods\",\n );\n } finally {\n setLoading(false);\n }\n }, [backendId, cliInstalled]);\n\n useEffect(() => {\n if (!cliInstalled) {\n fetchMethods();\n }\n }, [cliInstalled, fetchMethods]);\n\n const handleInstall = async () => {\n if (!selectedMethod) return;\n setInstalling(true);\n setResult(null);\n setError(null);\n try {\n const res = await api.post<CliInstallResult>(\n `/backends/${backendId}/install`,\n { method: selectedMethod },\n );\n setResult(res);\n if (res.ok && res.cliInstalled) {\n await queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n onInstalled?.();\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Install failed\");\n } finally {\n setInstalling(false);\n }\n };\n\n const handleCopy = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback — select the text for manual copy\n }\n };\n\n const handleRetryDetection = () => {\n setResult(null);\n setError(null);\n fetchMethods();\n queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n };\n\n const docsUrl = installInfo?.docsUrl;\n const backendLabel = BACKEND_LABELS[backendId];\n\n // ── Already installed (or field unavailable from old daemon) ──\n // cliInstalled is `true` when installed, `false` when not, or\n // `undefined` if the daemon predates this field. For `undefined`,\n // hide the panel rather than falsely showing \"not installed.\"\n if (cliInstalled !== false && !result?.ok) {\n if (compact) return null;\n if (cliInstalled === true) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>{backendLabel} CLI is installed and ready</span>\n </div>\n );\n }\n return null;\n }\n\n // ── Loading methods ──\n if (loading) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span>Detecting available install methods...</span>\n </div>\n );\n }\n\n const allMethods = installInfo?.methods ?? [];\n const availableMethods = allMethods.filter((m) => m.available);\n const selectedDef = allMethods.find((m) => m.id === selectedMethod);\n const isManualOnly = selectedDef?.manualOnly ?? false;\n const otherAvailable = availableMethods.filter(\n (m) => m.id !== selectedMethod,\n );\n\n // ── Install success ──\n if (result?.ok) {\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>{backendLabel} CLI installed successfully</span>\n </div>\n {!compact && (\n <p className=\"text-xs text-muted-foreground\">\n Proceed to verify authentication below to confirm your credentials\n are working.\n </p>\n )}\n </div>\n );\n }\n\n // ── Install form ──\n return (\n <div className={compact ? \"space-y-2\" : \"space-y-3\"}>\n {/* Status heading */}\n <div className=\"flex items-center gap-2 text-sm text-amber-600 dark:text-amber-400\">\n <Download className=\"h-4 w-4 shrink-0\" />\n <span>{backendLabel} CLI is not installed</span>\n </div>\n\n {/* Description — only in non-compact mode */}\n {!compact && (\n <p className=\"text-xs text-muted-foreground\">\n The {backendLabel} CLI must be installed on this machine for the agent\n to use it as a backend. Choose an install method below, or install\n manually in your terminal.\n </p>\n )}\n\n {availableMethods.length > 0 ? (\n <>\n <div className={compact ? \"flex items-center gap-2\" : \"space-y-2\"}>\n {/* Method selector */}\n <Select value={selectedMethod} onValueChange={setSelectedMethod}>\n <SelectTrigger className={compact ? \"w-[200px]\" : \"w-full\"}>\n <SelectValue placeholder=\"Choose install method\" />\n </SelectTrigger>\n <SelectContent>\n {allMethods.map((m) => (\n <SelectItem key={m.id} value={m.id} disabled={!m.available}>\n {m.label}\n {!m.available && \" (not available)\"}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Action button — Install or Copy depending on method type */}\n {isManualOnly ? (\n <Button\n size={compact ? \"sm\" : \"default\"}\n variant=\"outline\"\n onClick={() => selectedDef && handleCopy(selectedDef.command)}\n disabled={!selectedMethod}\n className=\"gap-2 shrink-0\"\n >\n {copied ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied ? \"Copied!\" : \"Copy Command\"}\n </Button>\n ) : (\n <Button\n size={compact ? \"sm\" : \"default\"}\n variant=\"outline\"\n onClick={handleInstall}\n disabled={\n installing || !selectedMethod || !selectedDef?.available\n }\n className=\"gap-2 shrink-0\"\n >\n {installing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Terminal className=\"h-3.5 w-3.5\" />\n )}\n {installing ? \"Installing...\" : \"Install\"}\n </Button>\n )}\n </div>\n\n {/* Command preview — non-compact only */}\n {selectedDef && !compact && (\n <div className=\"rounded-md bg-muted/50 px-3 py-2\">\n <p className=\"mb-1 text-[10px] font-medium uppercase tracking-wider text-muted-foreground/60\">\n {isManualOnly\n ? \"Run this command in your terminal\"\n : \"Command to run\"}\n </p>\n <code className=\"text-xs text-muted-foreground\">\n $ {selectedDef.command}\n </code>\n </div>\n )}\n\n {/* Manual-only hint */}\n {isManualOnly && !compact && (\n <p className=\"text-xs text-muted-foreground\">\n This method requires you to run the command in your own terminal\n (it may need elevated permissions). After installing, click{\" \"}\n <strong>Retry Detection</strong> to verify.\n </p>\n )}\n\n {/* Retry detection — always visible for manual-only methods */}\n {isManualOnly && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n )}\n </>\n ) : (\n /* No package manager available — manual install guidance */\n <div className=\"space-y-2 rounded-md border border-amber-200 bg-amber-50/50 p-3 dark:border-amber-900 dark:bg-amber-950/30\">\n <p className=\"text-xs font-medium text-amber-800 dark:text-amber-200\">\n No supported package manager was detected on this system.\n </p>\n <p className=\"text-xs text-amber-700 dark:text-amber-300\">\n Please install the CLI manually in your terminal:\n </p>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 rounded bg-muted px-2.5 py-1.5\">\n <code className=\"text-xs\">\n npm install -g{\" \"}\n {backendId === \"claude\"\n ? \"@anthropic-ai/claude-code\"\n : backendId === \"codex\"\n ? \"@openai/codex\"\n : \"@google/gemini-cli\"}\n </code>\n </div>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() =>\n handleCopy(\n `npm install -g ${\n backendId === \"claude\"\n ? \"@anthropic-ai/claude-code\"\n : backendId === \"codex\"\n ? \"@openai/codex\"\n : \"@google/gemini-cli\"\n }`,\n )\n }\n className=\"shrink-0\"\n >\n {copied ? (\n <CheckCircle2 className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <ClipboardCopy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </div>\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n {docsUrl && (\n <a\n href={docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-amber-700 underline hover:text-amber-900 dark:text-amber-300 dark:hover:text-amber-100\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Official installation guide\n </a>\n )}\n </div>\n </div>\n )}\n\n {/* ── Install failure ── */}\n {result && !result.ok && (\n <div className=\"space-y-2 rounded-md border border-red-200 bg-red-50/50 p-3 dark:border-red-900 dark:bg-red-950/30\">\n <div className=\"flex items-center gap-2 text-sm font-medium text-red-700 dark:text-red-300\">\n <XCircle className=\"h-4 w-4 shrink-0\" />\n <span>\n {result.timedOut\n ? \"Installation timed out (5 min limit)\"\n : `Installation failed (exit code ${result.exitCode})`}\n </span>\n </div>\n\n {/* stderr output */}\n {result.stderr && (\n <pre className=\"max-h-32 overflow-auto rounded bg-red-100/50 p-2 text-xs text-red-800 dark:bg-red-950/50 dark:text-red-200\">\n {result.stderr.slice(-1500)}\n </pre>\n )}\n\n {/* Recovery suggestions */}\n <div className=\"space-y-1 text-xs text-red-700 dark:text-red-300\">\n {otherAvailable.length > 0 && (\n <p>\n Try a different method: select{\" \"}\n {otherAvailable.map((m) => `\"${m.label}\"`).join(\" or \")} from\n the dropdown above.\n </p>\n )}\n <p>\n You can also install manually in your terminal and then click{\" \"}\n <strong>Retry Detection</strong> below.\n </p>\n </div>\n\n {/* Retry detection + docs link */}\n <div className=\"flex flex-wrap items-center gap-2 pt-1\">\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={handleRetryDetection}\n className=\"gap-1.5\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n Retry Detection\n </Button>\n {docsUrl && (\n <a\n href={docsUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"inline-flex items-center gap-1 text-xs text-red-600 underline hover:text-red-800 dark:text-red-400 dark:hover:text-red-200\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n Official install guide\n </a>\n )}\n </div>\n </div>\n )}\n\n {/* API-level error (not install failure) */}\n {error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">{error}</p>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n CheckCircle2,\n Globe,\n Loader2,\n Lock as _Lock,\n Terminal,\n XCircle,\n} from \"lucide-react\";\nimport type { BackendId } from \"@aitne/shared\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/lib/utils\";\nimport {\n BACKEND_BADGE_VARIANTS,\n BACKEND_PROVIDER_LABELS,\n BACKEND_WEB_SEARCH_DESCRIPTIONS,\n} from \"@/lib/backend-ui\";\nimport { AuthStatusBadge } from \"./auth-status-badge\";\nimport { CliInstallPanel } from \"./cli-install-panel\";\nimport {\n isAllowModeActive,\n isRecommended,\n shouldEnableVerifyInstall,\n shouldShowCliInstall,\n shouldShowWizardConfigureLaterHint,\n} from \"./backend-card.logic\";\n\nexport interface BackendCardProps {\n backendId: BackendId;\n mode: \"wizard\" | \"settings\";\n\n // Identity + state\n isMain: boolean;\n authStatus: string;\n authStatusDetail?: string | null;\n authFirstExpiredAt?: string | null;\n authLastSuccessAt?: string | null;\n authNotificationCount?: number;\n cliInstalled: boolean;\n enabled: boolean;\n webSearchEnabled: boolean;\n webSearchSupported?: boolean;\n /**\n * Derived by the parent from `config.{backendId}ExecutionPermissionMode`.\n * Passed through `isAllowModeActive()` so the card stays pure — no\n * second `useConfig()` subscription.\n */\n permissionMode: string | null | undefined;\n\n // Transient UI state\n /** True while enable/disable, web-search, verify-install, install are in flight. */\n busy?: boolean;\n /** Inline state for the Verify-Install button — card-local, not global. */\n installCheck?: {\n status: \"idle\" | \"checking\" | \"ok\" | \"error\";\n error?: string | null;\n version?: string | null;\n };\n\n // Callbacks\n onCliInstalled?: () => void;\n onVerifyInstall: () => void;\n onToggleEnable?: () => void;\n onToggleWebSearch?: () => void;\n\n /**\n * Optional slot rendered between the auth strip and the settings-only\n * control row. Used to inline an \"Advanced — default light/heavy\n * models\" collapsible on the MAIN card only. Keeping it as a slot —\n * rather than hoisting model-draft state into the card — preserves\n * `BackendCard`'s \"pure presentation\" contract.\n */\n renderExtra?: () => React.ReactNode;\n}\n\n/**\n * Single-row card rendering one backend's identity + CLI + auth +\n * toggles. Subscription-plan picker has been removed — Aitne is\n * designed to run on provider API keys (`ANTHROPIC_API_KEY` /\n * `OPENAI_API_KEY` / `GEMINI_API_KEY`), and the daemon does not ask\n * the operator which Claude/Codex/Gemini tier they hold. Consumed by:\n * - the wizard's `backends-step.tsx` (mode=\"wizard\") — no enable /\n * web-search controls, inline auth-check state, hint shown when\n * the non-main card is incomplete;\n * - the settings page (mode=\"settings\") — adds enable / web-search\n * / Allow pill + anchor back to the Execution Mode card.\n *\n * The card itself owns zero data-fetching. Parents thread in backend\n * status (from `useBackends()`) and the derived `permissionMode` /\n * `isMain` flags as props.\n */\nexport function BackendCard(props: BackendCardProps) {\n const {\n backendId,\n mode,\n isMain,\n authStatus,\n authStatusDetail,\n authFirstExpiredAt,\n authLastSuccessAt,\n authNotificationCount,\n cliInstalled,\n enabled,\n webSearchEnabled,\n webSearchSupported,\n permissionMode,\n busy = false,\n installCheck,\n onCliInstalled,\n onVerifyInstall,\n onToggleEnable,\n onToggleWebSearch,\n renderExtra,\n } = props;\n\n const allowModeActive = isAllowModeActive(permissionMode);\n const recommended = isRecommended(backendId);\n const showInstall = shouldShowCliInstall(cliInstalled);\n const verifyEnabled = shouldEnableVerifyInstall(busy);\n // Prominent CTA when the CLI is on PATH but we have not yet confirmed\n // it can actually run (or last run failed). Once the user clicks Verify\n // install and gets `ok`, we drop the callout.\n const verifyInstallRequired =\n cliInstalled\n && installCheck?.status !== \"ok\"\n && installCheck?.status !== \"checking\";\n const showHint = shouldShowWizardConfigureLaterHint({\n mode,\n isMain,\n cliInstalled,\n });\n\n return (\n <div className=\"rounded-xl border border-border bg-card p-4 shadow-sm\">\n {/* ── Header ─────────────────────────────────────────── */}\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"min-w-0 space-y-1.5\">\n <div className=\"flex flex-wrap items-center gap-1.5\">\n <Badge variant={BACKEND_BADGE_VARIANTS[backendId]}>\n {BACKEND_PROVIDER_LABELS[backendId]}\n </Badge>\n {recommended && (\n <Badge variant=\"gray\" className=\"font-normal\">\n Recommended\n </Badge>\n )}\n {isMain && <Badge variant=\"amber\">MAIN</Badge>}\n <AuthStatusBadge\n status={authStatus}\n detail={authStatusDetail ?? null}\n firstExpiredAt={authFirstExpiredAt ?? null}\n lastSuccessAt={authLastSuccessAt ?? null}\n notificationCount={authNotificationCount ?? 0}\n />\n {mode === \"settings\" && allowModeActive && (\n <a href=\"#execution-mode\" className=\"inline-flex\">\n <Badge\n variant=\"red\"\n className=\"cursor-pointer\"\n title=\"Allow mode is on for this backend — click to jump to the Execution Mode card\"\n >\n Allow\n </Badge>\n </a>\n )}\n {mode === \"settings\" && (\n <Badge variant={enabled ? \"green\" : \"gray\"}>\n {enabled ? \"Enabled\" : \"Disabled\"}\n </Badge>\n )}\n </div>\n </div>\n </div>\n\n {/* ── CLI + auth strip ───────────────────────────────── */}\n <div className=\"mt-4 space-y-3 border-t border-border pt-4\">\n {showInstall ? (\n <CliInstallPanel\n backendId={backendId}\n cliInstalled={cliInstalled}\n compact\n onInstalled={() => {\n onCliInstalled?.();\n }}\n />\n ) : (\n <div className=\"flex items-center gap-2 text-sm text-green-600 dark:text-green-400\">\n <CheckCircle2 className=\"h-4 w-4\" />\n <span>CLI installed</span>\n </div>\n )}\n\n <div\n className={cn(\n \"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\",\n verifyInstallRequired &&\n \"rounded-lg border border-primary/40 bg-primary/5 p-3\",\n )}\n >\n <div className=\"space-y-1\">\n {verifyInstallRequired ? (\n <>\n <p className=\"text-sm font-semibold text-foreground\">\n Verify the CLI runs on this machine\n </p>\n <p className=\"text-xs text-muted-foreground\">\n Confirms the {BACKEND_PROVIDER_LABELS[backendId]} CLI is\n on your{\" \"}\n <code className=\"rounded bg-muted px-1\">PATH</code> and\n responds to{\" \"}\n <code className=\"rounded bg-muted px-1\">--version</code>.\n </p>\n </>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {cliInstalled\n ? \"Re-run this whenever you reinstall or update the CLI to confirm it still launches.\"\n : \"Install the CLI first, then verify it runs.\"}\n </p>\n )}\n </div>\n <Button\n size={verifyInstallRequired ? \"default\" : \"sm\"}\n variant={verifyInstallRequired ? \"default\" : \"outline\"}\n disabled={!verifyEnabled}\n onClick={onVerifyInstall}\n className={cn(\n \"gap-2\",\n verifyInstallRequired &&\n \"shrink-0 self-start ring-2 ring-primary/40 ring-offset-2 ring-offset-background sm:self-auto\",\n )}\n >\n {installCheck?.status === \"checking\" ? (\n <Loader2\n className={cn(\n \"animate-spin\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : installCheck?.status === \"ok\" ? (\n <CheckCircle2\n className={cn(\n \"text-green-500\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : installCheck?.status === \"error\" ? (\n <XCircle\n className={cn(\n \"text-red-500\",\n verifyInstallRequired ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n )}\n />\n ) : verifyInstallRequired ? (\n <Terminal className=\"h-4 w-4\" />\n ) : null}\n {installCheck?.status === \"checking\"\n ? \"Checking…\"\n : \"Verify install\"}\n </Button>\n </div>\n {installCheck?.status === \"ok\" && installCheck.version && (\n <p className=\"text-xs text-green-700 dark:text-green-400\">\n CLI runs OK —{\" \"}\n <code className=\"rounded bg-muted px-1\">\n {installCheck.version}\n </code>\n </p>\n )}\n {installCheck?.status === \"error\" && installCheck.error && (\n <p className=\"text-xs text-red-600 dark:text-red-400\">\n {installCheck.error}\n </p>\n )}\n {showHint && (\n <p className=\"text-xs text-muted-foreground\">\n You can install the CLI and verify it later from{\" \"}\n <code className=\"rounded bg-muted px-1\">/settings/models</code>.\n </p>\n )}\n </div>\n\n {/* ── Optional extra slot (e.g. main-card Advanced) ──── */}\n {renderExtra && (\n <div className=\"mt-4 border-t border-border pt-4\">\n {renderExtra()}\n </div>\n )}\n\n {/* ── Settings-only controls ─────────────────────────── */}\n {mode === \"settings\" && (\n <div className=\"mt-4 space-y-4 border-t border-border pt-4\">\n {onToggleEnable && (\n <div className=\"flex flex-wrap items-center justify-end gap-2\">\n <Button\n size=\"sm\"\n variant={enabled ? \"outline\" : \"default\"}\n onClick={onToggleEnable}\n disabled={busy}\n >\n {enabled ? \"Disable backend\" : \"Enable backend\"}\n </Button>\n </div>\n )}\n {onToggleWebSearch && (\n <div className=\"flex flex-col gap-3 rounded-lg border border-border bg-muted/30 p-3 sm:flex-row sm:items-start sm:justify-between\">\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-3.5 w-3.5 text-muted-foreground\" />\n <p className=\"text-sm font-medium text-foreground\">\n Web search\n </p>\n <Badge\n variant={webSearchEnabled ? \"green\" : \"gray\"}\n className=\"text-[10px]\"\n >\n {!webSearchSupported\n ? \"Not supported\"\n : webSearchEnabled\n ? \"On\"\n : \"Off\"}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {webSearchSupported\n ? BACKEND_WEB_SEARCH_DESCRIPTIONS[backendId]\n : \"This backend does not expose a web-search tool.\"}\n </p>\n {webSearchSupported && !enabled && (\n <p className=\"text-xs text-amber-600 dark:text-amber-400\">\n Enable the backend first to toggle web search.\n </p>\n )}\n </div>\n <Button\n size=\"sm\"\n variant={webSearchEnabled ? \"outline\" : \"default\"}\n onClick={onToggleWebSearch}\n disabled={!webSearchSupported || !enabled || busy}\n className=\"shrink-0 self-start sm:self-center\"\n >\n {webSearchEnabled ? \"Disable web search\" : \"Enable web search\"}\n </Button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name Globe\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIgLz4KICA8cGF0aCBkPSJNMTIgMmExNC41IDE0LjUgMCAwIDAgMCAyMCAxNC41IDE0LjUgMCAwIDAgMC0yMCIgLz4KICA8cGF0aCBkPSJNMiAxMmgyMCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/globe\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst Globe = createLucideIcon('Globe', [\n ['circle', { cx: '12', cy: '12', r: '10', key: '1mglay' }],\n ['path', { d: 'M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20', key: '13o1zl' }],\n ['path', { d: 'M2 12h20', key: '9i4pu4' }],\n]);\n\nexport default Globe;\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name ClipboardCopy\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iOCIgaGVpZ2h0PSI0IiB4PSI4IiB5PSIyIiByeD0iMSIgcnk9IjEiIC8+CiAgPHBhdGggZD0iTTggNEg2YTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxMmEyIDIgMCAwIDAgMi0ydi0yIiAvPgogIDxwYXRoIGQ9Ik0xNiA0aDJhMiAyIDAgMCAxIDIgMnY0IiAvPgogIDxwYXRoIGQ9Ik0yMSAxNEgxMSIgLz4KICA8cGF0aCBkPSJtMTUgMTAtNCA0IDQgNCIgLz4KPC9zdmc+Cg==) - https://lucide.dev/icons/clipboard-copy\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst ClipboardCopy = createLucideIcon('ClipboardCopy', [\n ['rect', { width: '8', height: '4', x: '8', y: '2', rx: '1', ry: '1', key: 'tgr4d6' }],\n ['path', { d: 'M8 4H6a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-2', key: '4jdomd' }],\n ['path', { d: 'M16 4h2a2 2 0 0 1 2 2v4', key: '3hqy98' }],\n ['path', { d: 'M21 14H11', key: '1bme5i' }],\n ['path', { d: 'm15 10-4 4 4 4', key: '5dvupr' }],\n]);\n\nexport default ClipboardCopy;\n","/**\n * Pure logic helpers for BackendCard. Kept separate so render-free\n * assertions (install-vs-verify visibility, continue gating, hint copy)\n * stay unit-testable without pulling React or the query client.\n */\n\nimport type { BackendId } from \"@aitne/shared\";\n\n/**\n * Product constant — \"Recommended\" pill anchor. Claude is the recommended\n * main for new users because the Agent SDK's advisor tool only works\n * server-side on Claude. Kept here (not in server-provided metadata)\n * because \"what we recommend\" is a product-UX decision, not a daemon\n * policy — changing it should not require a daemon release.\n */\nexport const RECOMMENDED_BACKEND: BackendId = \"claude\";\n\nexport function isRecommended(backendId: BackendId): boolean {\n return backendId === RECOMMENDED_BACKEND;\n}\n\n/**\n * Whether the BackendCard should show the inline CLI install panel\n * (true = CLI missing and we should surface the installer). The CLI\n * install panel also shows its own done state; we hide it entirely when\n * the CLI is present so we don't flash \"detecting install methods…\"\n * every time the backend card mounts.\n */\nexport function shouldShowCliInstall(cliInstalled: boolean): boolean {\n return !cliInstalled;\n}\n\n/**\n * Whether the \"Verify install\" button should be reachable. The button\n * stays mounted-and-disabled while another card mutation is in flight\n * (busy), but it's allowed even when the CLI isn't on PATH — the\n * server-side handler returns a clean \"not installed\" diagnostic, which\n * is more useful to the user than a greyed-out button with no feedback.\n */\nexport function shouldEnableVerifyInstall(busy: boolean): boolean {\n return !busy;\n}\n\n/**\n * Whether the wizard's \"Configure later\" one-liner should be rendered\n * on this card. Shown only in wizard mode, only on non-main cards where\n * the CLI is not yet installed. Auth verification was removed as a\n * setup-flow gate — install presence (verify-install) is now the only\n * signal we use here.\n */\nexport function shouldShowWizardConfigureLaterHint(opts: {\n mode: \"wizard\" | \"settings\";\n isMain: boolean;\n cliInstalled: boolean;\n}): boolean {\n if (opts.mode !== \"wizard\") return false;\n if (opts.isMain) return false;\n return !opts.cliInstalled;\n}\n\n/**\n * True when the wizard's Continue button should be enabled. The only\n * hard requirement is that the operator has picked a main backend —\n * CLI install, auth verify, and API-key registration are all\n * skippable. Skipping is a deliberate product choice: the user can\n * complete the rest from /settings/models on their own time, and any\n * verify-install state already saved is persisted server-side via\n * `useBackends()`. Non-main backends were already exempt from gating.\n */\nexport function isContinueEligible(opts: {\n mainBackend: BackendId | null;\n}): boolean {\n return opts.mainBackend !== null;\n}\n\n/**\n * Derive whether the Allow-mode badge should show for this card's\n * backend. Caller passes the per-backend permission mode string from\n * `useConfig()` so the card itself stays a pure render — this helper\n * accepts any string (not just the typed `ExecutionPermissionMode`\n * union) because config values arrive as `Record<string, unknown>`\n * until the React 19 typed slice lands.\n */\nexport function isAllowModeActive(\n permissionMode: string | null | undefined,\n): boolean {\n return permissionMode === \"allow\";\n}\n","\"use client\";\n\nimport { CheckCircle2, KeyRound, Loader2, XCircle } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport type { ApiKeyProvider, BackendId } from \"@aitne/shared\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"@/components/ui/select\";\nimport { ApiError } from \"@/lib/api-client\";\nimport { BACKEND_PROVIDER_LABELS } from \"@/lib/backend-ui\";\nimport {\n useBackendApiKey,\n useClearBackendApiKey,\n useSaveBackendApiKey,\n type SaveBackendApiKeyInput,\n} from \"@/lib/hooks/use-backend-api-key\";\nimport {\n apiKeyEnvVarNames,\n apiKeyFormatHint,\n apiKeyStatusLabel,\n draftToConfig,\n emptyBedrockDraft,\n emptyDraft,\n emptyGeminiVertexDraft,\n isClearVisible,\n isConfigSaveEnabled,\n isDirectApiKeyProvider,\n isPlausibleApiKey,\n isSaveEnabled,\n PROVIDER_DESCRIPTIONS,\n PROVIDER_LABELS,\n type BedrockAuthMode,\n type GeminiVertexAuthMode,\n type ProviderDraft,\n} from \"./backend-api-key-panel.logic\";\n\nexport interface BackendApiKeyPanelProps {\n backendId: BackendId;\n onToast?: (\n type: \"success\" | \"error\",\n message: string,\n ) => void;\n}\n\ninterface InlineFeedback {\n kind: \"success\" | \"error\";\n message: string;\n}\n\n/**\n * Per-backend provider auth panel.\n *\n * Direct API key (Anthropic / OpenAI / Google) is the long-standing path.\n * Claude additionally supports Bedrock / Vertex / Foundry; Gemini\n * additionally supports Vertex AI. A provider dropdown switches forms;\n * each provider exposes its own field set. The daemon mirrors the\n * active provider's env vars (`CLAUDE_CODE_USE_*`, `GOOGLE_GENAI_USE_VERTEXAI`,\n * AWS / GCP / Azure credentials) into `process.env` so the SDK / CLI\n * subprocess picks them up via inherited env.\n *\n * Codex Azure OpenAI is not exposed here — it requires a\n * `~/.codex/config.toml` file in addition to env vars, which the\n * env-mirroring chokepoint cannot configure. Codex stays direct-key only.\n *\n * The panel intentionally never displays a saved value — only a status\n * label (\"Saved (bedrock)\") and a one-shot input for new values.\n */\nexport function BackendApiKeyPanel({\n backendId,\n onToast,\n}: BackendApiKeyPanelProps) {\n const { data, isLoading, error } = useBackendApiKey(backendId);\n const save = useSaveBackendApiKey(backendId);\n const clear = useClearBackendApiKey(backendId);\n\n const availableProviders: readonly ApiKeyProvider[] = useMemo(\n () => data?.availableProviders ?? defaultAvailableProviders(backendId),\n [data?.availableProviders, backendId],\n );\n const hasProviderChoice = availableProviders.length > 1;\n\n const [pickedProvider, setPickedProvider] = useState<ApiKeyProvider | null>(\n null,\n );\n const selectedProvider: ApiKeyProvider =\n pickedProvider ?? data?.provider ?? availableProviders[0];\n\n const [draft, setDraft] = useState<ProviderDraft>(() =>\n emptyDraft(selectedProvider),\n );\n const [feedback, setFeedback] = useState<InlineFeedback | null>(null);\n\n const source = data?.source ?? \"none\";\n const configured = data?.configured ?? false;\n const savedProvider = data?.provider ?? null;\n const envVarNames = data?.envVarNames ?? apiKeyEnvVarNames(backendId);\n\n const saving = save.isPending;\n const clearing = clear.isPending;\n const showClear = isClearVisible(source);\n\n const handleProviderChange = (next: string) => {\n if (next === selectedProvider) return;\n if (!availableProviders.includes(next as ApiKeyProvider)) return;\n setPickedProvider(next as ApiKeyProvider);\n setDraft(emptyDraft(next as ApiKeyProvider));\n setFeedback(null);\n };\n\n const handleSave = async () => {\n setFeedback(null);\n\n let payload: SaveBackendApiKeyInput;\n if (isDirectApiKeyProvider(selectedProvider)) {\n const trimmed = \"apiKey\" in draft ? draft.apiKey.trim() : \"\";\n if (!isPlausibleApiKey(backendId, trimmed)) {\n setFeedback({ kind: \"error\", message: apiKeyFormatHint(backendId) });\n return;\n }\n payload = { apiKey: trimmed };\n } else {\n const config = draftToConfig(draft);\n if (!config) {\n setFeedback({\n kind: \"error\",\n message: \"Fill in all required fields for this provider.\",\n });\n return;\n }\n payload = { config };\n }\n\n try {\n const result = await save.mutateAsync(payload);\n setDraft(emptyDraft(selectedProvider));\n const detail = result.auth?.detail ?? null;\n const providerLabel = result.provider\n ? PROVIDER_LABELS[result.provider]\n : BACKEND_PROVIDER_LABELS[backendId];\n if (result.auth?.ok) {\n const message = detail\n ? `Saved (${providerLabel}) — ${detail}`\n : `Saved (${providerLabel}).`;\n setFeedback({ kind: \"success\", message });\n onToast?.(\"success\", `${providerLabel} configured.`);\n } else {\n const message = detail\n ? `Saved (${providerLabel}), but the provider rejected it — ${detail}`\n : `Saved (${providerLabel}), but the provider probe did not succeed.`;\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to save provider config\";\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n };\n\n const handleClear = async () => {\n setFeedback(null);\n try {\n const result = await clear.mutateAsync();\n const message =\n result.source === \"shell\"\n ? \"Cleared from keychain — falling back to the shell-set env var.\"\n : \"Cleared from keychain — backend will use CLI / OAuth auth.\";\n setFeedback({ kind: \"success\", message });\n onToast?.(\n \"success\",\n `${BACKEND_PROVIDER_LABELS[backendId]} provider config cleared.`,\n );\n } catch (err) {\n const message =\n err instanceof ApiError\n ? err.message\n : err instanceof Error\n ? err.message\n : \"Failed to clear provider config\";\n setFeedback({ kind: \"error\", message });\n onToast?.(\"error\", message);\n }\n };\n\n const saveEnabled = isDirectApiKeyProvider(selectedProvider)\n ? isSaveEnabled({\n backendId,\n draftValue: \"apiKey\" in draft ? draft.apiKey : \"\",\n saving,\n })\n : isConfigSaveEnabled({ backendId, draft, saving });\n\n return (\n <div className=\"space-y-3 rounded-xl border border-border bg-card p-4 shadow-sm\">\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <KeyRound className=\"h-4 w-4 text-muted-foreground\" />\n <h3 className=\"text-sm font-semibold text-foreground\">\n Provider auth\n <span className=\"ml-2 text-xs font-normal text-muted-foreground\">\n (optional)\n </span>\n </h3>\n {configured && (\n <Badge variant={source === \"keychain\" ? \"green\" : \"gray\"}>\n {source === \"keychain\"\n ? `Saved${savedProvider ? ` (${PROVIDER_LABELS[savedProvider]})` : \"\"}`\n : \"From shell\"}\n </Badge>\n )}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {isLoading\n ? \"Loading…\"\n : error\n ? \"Could not read provider config from the daemon.\"\n : apiKeyStatusLabel(source)}\n </p>\n <p className=\"text-[11px] text-muted-foreground\">\n Stored in the OS keychain. Leave blank to skip — the daemon falls back\n to local CLI / OAuth auth or your shell-set env vars.\n </p>\n </div>\n\n {hasProviderChoice && (\n <div className=\"space-y-1\">\n <label\n htmlFor={`${backendId}-provider`}\n className=\"text-xs font-medium text-foreground\"\n >\n Provider\n </label>\n <Select\n value={selectedProvider}\n onValueChange={handleProviderChange}\n >\n <SelectTrigger id={`${backendId}-provider`} className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {availableProviders.map((provider) => (\n <SelectItem key={provider} value={provider}>\n {PROVIDER_LABELS[provider]}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <p className=\"text-[11px] text-muted-foreground\">\n {PROVIDER_DESCRIPTIONS[selectedProvider]}\n </p>\n </div>\n )}\n\n <ProviderForm\n backendId={backendId}\n draft={draft}\n onChange={setDraft}\n disabled={saving || clearing}\n />\n\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button\n size=\"sm\"\n onClick={() => {\n void handleSave();\n }}\n disabled={!saveEnabled}\n className=\"gap-2\"\n >\n {saving ? <Loader2 className=\"h-3.5 w-3.5 animate-spin\" /> : null}\n {configured && source === \"keychain\"\n ? \"Update provider\"\n : \"Save provider\"}\n </Button>\n {showClear && (\n <Button\n size=\"sm\"\n variant=\"outline\"\n onClick={() => {\n void handleClear();\n }}\n disabled={saving || clearing}\n className=\"gap-2\"\n >\n {clearing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : null}\n Clear\n </Button>\n )}\n {!hasProviderChoice && (\n <span className=\"text-[11px] text-muted-foreground\">\n Sets <code className=\"rounded bg-muted px-1\">{envVarNames.join(\" / \")}</code>\n </span>\n )}\n </div>\n\n {feedback && (\n <div\n role=\"status\"\n className={`flex items-start gap-2 rounded-md border p-2 text-xs ${\n feedback.kind === \"success\"\n ? \"border-green-500/30 bg-green-500/5 text-green-700 dark:text-green-400\"\n : \"border-red-500/30 bg-red-500/5 text-red-600 dark:text-red-400\"\n }`}\n >\n {feedback.kind === \"success\" ? (\n <CheckCircle2 className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n ) : (\n <XCircle className=\"mt-0.5 h-3.5 w-3.5 shrink-0\" />\n )}\n <span>{feedback.message}</span>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Per-provider form fragment. Switches the visible inputs based on the\n * draft's `provider` discriminator. Inline because the field set is\n * tightly coupled to the provider type.\n */\nfunction ProviderForm({\n backendId,\n draft,\n onChange,\n disabled,\n}: {\n backendId: BackendId;\n draft: ProviderDraft;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n switch (draft.provider) {\n case \"anthropic\":\n case \"openai\":\n case \"google\":\n return (\n <div className=\"space-y-1\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n placeholder={apiKeyFormatHint(backendId)}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n aria-label={`${PROVIDER_LABELS[draft.provider]} API key`}\n />\n <p className=\"text-[11px] text-muted-foreground\">\n {apiKeyFormatHint(backendId)}\n </p>\n </div>\n );\n\n case \"bedrock\":\n return (\n <BedrockForm draft={draft} onChange={onChange} disabled={disabled} />\n );\n\n case \"vertex\":\n return (\n <div className=\"space-y-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField label=\"GCP project id\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-gcp-project\"\n value={draft.projectId}\n onChange={(e) =>\n onChange({ ...draft, projectId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Vertex region\"\n hint=\"`global`, a multi-region (`us`, `eu`), or a region (e.g. `us-east5`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-east5\"\n value={draft.region}\n onChange={(e) =>\n onChange({ ...draft, region: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n <LabeledField\n label=\"Service account key file path (optional)\"\n hint=\"Absolute path to a service-account JSON file. Leave blank to use Application Default Credentials (`gcloud auth application-default login`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"/Users/me/keys/sa.json\"\n value={draft.credentialsFile}\n onChange={(e) =>\n onChange({ ...draft, credentialsFile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Vertex base URL (optional)\"\n hint=\"Override for custom endpoints / gateways.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://aiplatform.googleapis.com\"\n value={draft.vertexBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, vertexBaseUrl: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n\n case \"foundry\":\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">Endpoint</span>\n <div className=\"flex gap-2\">\n <Select\n value={draft.endpointKind}\n onValueChange={(v) =>\n onChange({\n ...draft,\n endpointKind: v as \"resource\" | \"base_url\",\n })\n }\n >\n <SelectTrigger className=\"w-44\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"resource\">Resource name</SelectItem>\n <SelectItem value=\"base_url\">Full base URL</SelectItem>\n </SelectContent>\n </Select>\n {draft.endpointKind === \"resource\" ? (\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-foundry-resource\"\n value={draft.resource}\n onChange={(e) =>\n onChange({ ...draft, resource: e.target.value })\n }\n disabled={disabled}\n />\n ) : (\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://my-foundry-resource.services.ai.azure.com/anthropic\"\n value={draft.baseUrl}\n onChange={(e) =>\n onChange({ ...draft, baseUrl: e.target.value })\n }\n disabled={disabled}\n />\n )}\n </div>\n <p className=\"text-[11px] text-muted-foreground\">\n Resource name is the simpler form; base URL is for custom\n gateways. Set exactly one.\n </p>\n </div>\n <LabeledField\n label=\"Foundry API key (optional)\"\n hint=\"Leave blank to use Azure DefaultAzureCredential (`az login`, managed identity, etc.).\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n\n case \"azure-openai\":\n return (\n <div className=\"space-y-2\">\n <div className=\"rounded-md border border-amber-500/40 bg-amber-500/5 p-2 text-[11px] text-amber-700 dark:text-amber-400\">\n <strong>Deployment-name alignment required.</strong> The daemon\n spawns codex with <code>--model &lt;id&gt;</code> from the\n process-routing registry, which Codex treats as the Azure\n deployment name. Name your Azure deployments to match the\n model IDs configured on the <code>/settings/models</code>{\" \"}\n page (e.g. <code>gpt-5-codex</code>). Renaming the deployment\n in Azure is the supported fix.\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"Azure resource name\"\n hint=\"The Foundry/Azure-OpenAI resource name (subdomain of `*.openai.azure.com`).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-azure-resource\"\n value={draft.resource}\n onChange={(e) =>\n onChange({ ...draft, resource: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Azure OpenAI API key\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"API version\"\n hint=\"Azure OpenAI API version (Codex uses the `responses` wire API).\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiVersion}\n onChange={(e) =>\n onChange({ ...draft, apiVersion: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Default deployment name (optional)\"\n hint=\"Falls back when the daemon does not pass --model. Most invocations override this via --model from the routing registry — see warning above.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"gpt-5-codex\"\n value={draft.deploymentName}\n onChange={(e) =>\n onChange({ ...draft, deploymentName: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n </div>\n );\n\n case \"gemini-vertex\":\n return (\n <GeminiVertexForm\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n );\n }\n}\n\nfunction BedrockForm({\n draft,\n onChange,\n disabled,\n}: {\n draft: Extract<ProviderDraft, { provider: \"bedrock\" }>;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n const setMode = (mode: string) => {\n if (mode === draft.authMode) return;\n onChange(emptyBedrockDraft(mode as BedrockAuthMode));\n };\n return (\n <div className=\"space-y-2\">\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">\n AWS authentication\n </span>\n <Select value={draft.authMode} onValueChange={setMode}>\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"access_key\">\n Access key id + secret\n </SelectItem>\n <SelectItem value=\"bearer_token\">\n Bedrock API key (`AWS_BEARER_TOKEN_BEDROCK`)\n </SelectItem>\n <SelectItem value=\"profile\">\n AWS profile (`~/.aws/config`)\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {draft.authMode === \"access_key\" && (\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"AWS access key id\"\n hint=\"`AKIA…` for IAM users; `ASIA…` for STS / Identity Center.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"AKIAIOSFODNN7EXAMPLE\"\n value={draft.awsAccessKeyId}\n onChange={(e) =>\n onChange({ ...draft, awsAccessKeyId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"AWS secret access key\">\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsSecretAccessKey}\n onChange={(e) =>\n onChange({ ...draft, awsSecretAccessKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"AWS session token (optional)\"\n hint=\"Required for STS / Identity Center temporary credentials.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsSessionToken}\n onChange={(e) =>\n onChange({ ...draft, awsSessionToken: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n )}\n\n {draft.authMode === \"bearer_token\" && (\n <LabeledField\n label=\"Bedrock API key\"\n hint=\"See AWS docs: 'Bedrock API keys' for how to issue one.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.awsBearerTokenBedrock}\n onChange={(e) =>\n onChange({\n ...draft,\n awsBearerTokenBedrock: e.target.value,\n })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n {draft.authMode === \"profile\" && (\n <LabeledField\n label=\"AWS profile name\"\n hint=\"Resolves credentials from `~/.aws/config` and `~/.aws/credentials`.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"default\"\n value={draft.awsProfile}\n onChange={(e) =>\n onChange({ ...draft, awsProfile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField\n label=\"AWS region\"\n hint=\"Required by Claude Code regardless of auth mode.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-east-1\"\n value={draft.awsRegion}\n onChange={(e) =>\n onChange({ ...draft, awsRegion: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField\n label=\"Bedrock base URL (optional)\"\n hint=\"Override for VPC endpoints / gateways.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"https://bedrock-runtime.us-east-1.amazonaws.com\"\n value={draft.bedrockBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, bedrockBaseUrl: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n\n <details className=\"rounded-md border border-border p-2 text-xs\">\n <summary className=\"cursor-pointer font-medium text-foreground\">\n Mantle endpoint (advanced)\n </summary>\n <div className=\"mt-2 space-y-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n Mantle is an alternate Bedrock endpoint that uses the native\n Anthropic API shape. Setting this alongside the standard\n Invoke API lets Claude Code route per model. Most operators\n should leave this off.\n </p>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n checked={draft.useMantle}\n onChange={(e) =>\n onChange({ ...draft, useMantle: e.target.checked })\n }\n disabled={disabled}\n />\n Enable Mantle endpoint (`CLAUDE_CODE_USE_MANTLE=1`)\n </label>\n <LabeledField\n label=\"Mantle base URL (optional)\"\n hint=\"Override the default Mantle endpoint URL.\"\n >\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.mantleBaseUrl}\n onChange={(e) =>\n onChange({ ...draft, mantleBaseUrl: e.target.value })\n }\n disabled={disabled || !draft.useMantle}\n />\n </LabeledField>\n <label className=\"flex items-center gap-2 text-xs text-foreground\">\n <input\n type=\"checkbox\"\n checked={draft.skipMantleAuth}\n onChange={(e) =>\n onChange({ ...draft, skipMantleAuth: e.target.checked })\n }\n disabled={disabled || !draft.useMantle}\n />\n Skip client-side auth (gateway injects credentials)\n </label>\n </div>\n </details>\n\n <PinnedModelsFields\n draft={draft}\n onChange={onChange}\n disabled={disabled}\n />\n </div>\n );\n}\n\n/**\n * Shared pinned-model fields for all three Anthropic-cloud forms.\n * Pre-filled with the recommended defaults from the Anthropic docs;\n * editing them mirrors to `ANTHROPIC_DEFAULT_*_MODEL` env vars.\n *\n * Pinning is *strongly recommended* by Anthropic for production rollouts:\n * without it, `sonnet`/`opus`/`haiku` aliases resolve to the latest model\n * version, which may not be enabled in the customer's cloud account →\n * Claude Code falls back at startup or 404s on Foundry. Hide behind a\n * `<details>` because the defaults are usually right.\n */\ntype PinnedDraft = Extract<\n ProviderDraft,\n { defaultOpusModel: string }\n>;\n\nfunction PinnedModelsFields({\n draft,\n onChange,\n disabled,\n}: {\n draft: PinnedDraft;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n // Each branch of the discriminated draft union has a different\n // property set, so spreading `draft` and adding one field at a time\n // would produce a union too wide for TS to assign back to ProviderDraft.\n // The runtime spread is sound; we narrow once via a local helper.\n const updatePinned = (patch: Partial<PinnedDraft>) => {\n onChange({ ...draft, ...patch } as ProviderDraft);\n };\n return (\n <details className=\"rounded-md border border-border p-2 text-xs\">\n <summary className=\"cursor-pointer font-medium text-foreground\">\n Pinned model IDs (recommended)\n </summary>\n <div className=\"mt-2 space-y-2\">\n <p className=\"text-[11px] text-muted-foreground\">\n Pinning prevents the `sonnet`/`opus`/`haiku` aliases from\n resolving to a model not yet enabled in your cloud account.\n Pre-filled with Anthropic&apos;s recommended defaults — edit only\n if your account is on a different model tier.\n </p>\n <LabeledField label=\"Opus model ID (`ANTHROPIC_DEFAULT_OPUS_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultOpusModel}\n onChange={(e) =>\n updatePinned({ defaultOpusModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Sonnet model ID (`ANTHROPIC_DEFAULT_SONNET_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultSonnetModel}\n onChange={(e) =>\n updatePinned({ defaultSonnetModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"Haiku model ID (`ANTHROPIC_DEFAULT_HAIKU_MODEL`)\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.defaultHaikuModel}\n onChange={(e) =>\n updatePinned({ defaultHaikuModel: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n </details>\n );\n}\n\nfunction GeminiVertexForm({\n draft,\n onChange,\n disabled,\n}: {\n draft: Extract<ProviderDraft, { provider: \"gemini-vertex\" }>;\n onChange: (draft: ProviderDraft) => void;\n disabled: boolean;\n}) {\n const setMode = (mode: string) => {\n if (mode === draft.authMode) return;\n onChange(emptyGeminiVertexDraft(mode as GeminiVertexAuthMode));\n };\n return (\n <div className=\"space-y-2\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <LabeledField label=\"GCP project id\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"my-gcp-project\"\n value={draft.projectId}\n onChange={(e) =>\n onChange({ ...draft, projectId: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n <LabeledField label=\"GCP location\" hint=\"e.g. `us-central1`\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"us-central1\"\n value={draft.location}\n onChange={(e) =>\n onChange({ ...draft, location: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n </div>\n\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">\n Authentication\n </span>\n <Select value={draft.authMode} onValueChange={setMode}>\n <SelectTrigger className=\"w-full\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"adc\">\n Application Default Credentials (`gcloud auth`)\n </SelectItem>\n <SelectItem value=\"service_account\">\n Service-account JSON file path\n </SelectItem>\n <SelectItem value=\"api_key\">Vertex API key</SelectItem>\n </SelectContent>\n </Select>\n </div>\n\n {draft.authMode === \"service_account\" && (\n <LabeledField label=\"Service account key file path\">\n <Input\n autoComplete=\"off\"\n spellCheck={false}\n placeholder=\"/Users/me/keys/sa.json\"\n value={draft.credentialsFile}\n onChange={(e) =>\n onChange({ ...draft, credentialsFile: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n\n {draft.authMode === \"api_key\" && (\n <LabeledField\n label=\"Vertex API key\"\n hint=\"`AIza…`. Distinct from a direct Gemini API key — it goes to GOOGLE_API_KEY only and routes through Vertex.\"\n >\n <Input\n type=\"password\"\n autoComplete=\"off\"\n spellCheck={false}\n value={draft.apiKey}\n onChange={(e) =>\n onChange({ ...draft, apiKey: e.target.value })\n }\n disabled={disabled}\n />\n </LabeledField>\n )}\n </div>\n );\n}\n\nfunction LabeledField({\n label,\n hint,\n children,\n}: {\n label: string;\n hint?: string;\n children: React.ReactNode;\n}) {\n return (\n <div className=\"space-y-1\">\n <span className=\"text-xs font-medium text-foreground\">{label}</span>\n {children}\n {hint && (\n <p className=\"text-[11px] text-muted-foreground\">{hint}</p>\n )}\n </div>\n );\n}\n\nfunction defaultAvailableProviders(\n backendId: BackendId,\n): readonly ApiKeyProvider[] {\n switch (backendId) {\n case \"claude\":\n return [\"anthropic\", \"bedrock\", \"vertex\", \"foundry\"];\n case \"codex\":\n return [\"openai\", \"azure-openai\"];\n case \"gemini\":\n return [\"google\", \"gemini-vertex\"];\n }\n}\n","\"use client\";\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport type {\n ApiKeyProvider,\n BackendApiKeyConfig,\n BackendId,\n} from \"@aitne/shared\";\nimport { api } from \"@/lib/api-client\";\n\nexport type ApiKeySource = \"keychain\" | \"shell\" | \"none\";\n\nexport interface BackendApiKeyState {\n backendId: BackendId;\n configured: boolean;\n source: ApiKeySource;\n /** Active provider when source==='keychain'. Null otherwise. */\n provider: ApiKeyProvider | null;\n envVarNames: readonly string[];\n /** Providers the operator can pick for this backend. */\n availableProviders: readonly ApiKeyProvider[];\n}\n\nexport interface BackendApiKeyMutationResult {\n status: \"saved\" | \"cleared\";\n backendId: BackendId;\n source: ApiKeySource;\n provider: ApiKeyProvider | null;\n auth: {\n ok: boolean;\n status: string | null;\n detail: string | null;\n method: string | null;\n } | null;\n}\n\n/**\n * Save body. Two accepted shapes — direct API key (legacy single-field\n * form) or a typed cloud-provider config. Mirrors the union the daemon\n * accepts at PUT /backends/:id/api-key.\n */\nexport type SaveBackendApiKeyInput =\n | { apiKey: string }\n | { config: BackendApiKeyConfig };\n\nconst apiKeyQueryKey = (backendId: BackendId) =>\n [\"backend-api-key\", backendId] as const;\n\nexport function useBackendApiKey(backendId: BackendId) {\n return useQuery({\n queryKey: apiKeyQueryKey(backendId),\n queryFn: () =>\n api.get<BackendApiKeyState>(`/backends/${backendId}/api-key`),\n staleTime: 30_000,\n });\n}\n\n/** Save a new API key or cloud-provider config. Triggers a server-side\n * `checkAuthDetailed()` so the backend's auth status reflects the new\n * config without a separate click. */\nexport function useSaveBackendApiKey(backendId: BackendId) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: (input: SaveBackendApiKeyInput) =>\n api.put<BackendApiKeyMutationResult>(\n `/backends/${backendId}/api-key`,\n input,\n ),\n onSuccess: () => {\n void queryClient.invalidateQueries({\n queryKey: apiKeyQueryKey(backendId),\n });\n // The save triggered a checkAuthDetailed() server-side, so the\n // /backends list now has a fresher auth status row.\n void queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n },\n });\n}\n\n/** Clear the keychain entry. Falls back to the captured shell value if any. */\nexport function useClearBackendApiKey(backendId: BackendId) {\n const queryClient = useQueryClient();\n return useMutation({\n mutationFn: () =>\n api.delete<BackendApiKeyMutationResult>(\n `/backends/${backendId}/api-key`,\n ),\n onSuccess: () => {\n void queryClient.invalidateQueries({\n queryKey: apiKeyQueryKey(backendId),\n });\n void queryClient.invalidateQueries({ queryKey: [\"backends\"] });\n },\n });\n}\n","/**\n * Pure logic helpers for `BackendApiKeyPanel`. Mirrors the Zod schemas\n * from `@aitne/shared` so the dashboard can preview format\n * issues before round-tripping to the daemon.\n *\n * The daemon is the source of truth — even a format-valid config may be\n * rejected by the provider's runtime auth check. The panel surfaces both\n * layers: client-side rejection for cheap typos, server-side detail for\n * the rest.\n */\n\nimport {\n defaultApiKeyProvider,\n DEFAULT_AZURE_OPENAI_API_VERSION,\n isPlausibleAnthropicApiKey,\n isPlausibleGeminiApiKey,\n isPlausibleOpenAiApiKey,\n RECOMMENDED_PINNED_MODELS_BY_PROVIDER,\n validateBackendApiKeyConfigFormat,\n type ApiKeyProvider,\n type BackendApiKeyConfig,\n type BackendId,\n} from \"@aitne/shared\";\n\nexport type ApiKeySource = \"keychain\" | \"shell\" | \"none\";\n\n// Re-exports so existing dashboard tests / callers keep their import\n// surface stable while the implementation is sourced from shared.\nexport {\n isPlausibleAnthropicApiKey,\n isPlausibleOpenAiApiKey,\n isPlausibleGeminiApiKey,\n};\n\n/**\n * Direct-API-key plausibility check used by the legacy single-field\n * form (provider === default direct provider for the backend).\n */\nexport function isPlausibleApiKey(\n backendId: BackendId,\n value: string,\n): boolean {\n switch (defaultApiKeyProvider(backendId)) {\n case \"anthropic\":\n return isPlausibleAnthropicApiKey(value);\n case \"openai\":\n return isPlausibleOpenAiApiKey(value);\n case \"google\":\n return isPlausibleGeminiApiKey(value);\n default:\n return false;\n }\n}\n\n/** Hint text shown beneath the direct-API-key input field. */\nexport function apiKeyFormatHint(backendId: BackendId): string {\n switch (defaultApiKeyProvider(backendId)) {\n case \"anthropic\":\n return \"Anthropic key — starts with `sk-ant-…`.\";\n case \"openai\":\n return \"OpenAI key — starts with `sk-…` (not `sk-ant-…`).\";\n case \"google\":\n return \"Google API key — starts with `AIza…`, 39 chars total.\";\n default:\n return \"API key\";\n }\n}\n\n/** Env var names the daemon will populate when a direct key is saved. */\nexport function apiKeyEnvVarNames(backendId: BackendId): readonly string[] {\n switch (backendId) {\n case \"claude\":\n return [\"ANTHROPIC_API_KEY\"];\n case \"codex\":\n return [\"OPENAI_API_KEY\"];\n case \"gemini\":\n return [\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"];\n }\n}\n\nexport function apiKeyStatusLabel(source: ApiKeySource): string {\n switch (source) {\n case \"keychain\":\n return \"API key configured (stored in OS keychain).\";\n case \"shell\":\n return \"Using API key from shell environment. Save a key here to override.\";\n case \"none\":\n return \"No API key configured. Falling back to CLI login / OAuth.\";\n }\n}\n\n/** Whether the Save button should be enabled for the legacy direct form. */\nexport function isSaveEnabled(opts: {\n backendId: BackendId;\n draftValue: string;\n saving: boolean;\n}): boolean {\n if (opts.saving) return false;\n const trimmed = opts.draftValue.trim();\n if (!trimmed) return false;\n return isPlausibleApiKey(opts.backendId, trimmed);\n}\n\nexport function isClearVisible(source: ApiKeySource): boolean {\n return source === \"keychain\";\n}\n\n// ── Provider metadata ──────────────────────────────────────────────\n\nexport const PROVIDER_LABELS: Record<ApiKeyProvider, string> = {\n anthropic: \"Anthropic API key\",\n bedrock: \"Amazon Bedrock\",\n vertex: \"Google Vertex AI\",\n foundry: \"Microsoft Foundry\",\n openai: \"OpenAI API key\",\n \"azure-openai\": \"Azure OpenAI\",\n google: \"Google API key\",\n \"gemini-vertex\": \"Google Vertex AI\",\n};\n\nexport const PROVIDER_DESCRIPTIONS: Record<ApiKeyProvider, string> = {\n anthropic:\n \"Direct Anthropic API key (`sk-ant-…`). Stored in the OS keychain and mirrored to `ANTHROPIC_API_KEY`.\",\n bedrock:\n \"Anthropic models on Amazon Bedrock. Sets `CLAUDE_CODE_USE_BEDROCK=1` plus AWS credentials. Required: `AWS_REGION`.\",\n vertex:\n \"Anthropic models on Google Vertex AI. Sets `CLAUDE_CODE_USE_VERTEX=1` plus GCP project / region. Auth via Application Default Credentials or a service-account key file.\",\n foundry:\n \"Anthropic models on Microsoft Foundry. Sets `CLAUDE_CODE_USE_FOUNDRY=1` plus the Foundry resource (or full base URL). API key optional — falls back to Azure DefaultAzureCredential (`az login`).\",\n openai:\n \"OpenAI API key (`sk-…`). Stored in the keychain and mirrored to `OPENAI_API_KEY`.\",\n \"azure-openai\":\n \"Codex CLI on Azure OpenAI. Daemon writes a managed `config.toml` to `<dataDir>/codex-home/` and points `CODEX_HOME` there — your personal `~/.codex/` is untouched. Sets `AZURE_OPENAI_API_KEY`. **Important:** the daemon spawns codex with `--model <id>` from the model registry, which Codex treats as the deployment name on Azure. Name your Azure deployments to match the model IDs shown on the /settings/models page (e.g. `gpt-5-codex`).\",\n google:\n \"Direct Gemini API key (`AIza…`). Mirrored to `GEMINI_API_KEY` + `GOOGLE_API_KEY`.\",\n \"gemini-vertex\":\n \"Gemini on Google Vertex AI. Sets `GOOGLE_GENAI_USE_VERTEXAI=true` plus GCP project / location. Auth via ADC, a service-account key file, or a Vertex API key.\",\n};\n\n// ── Drafts (form state) ────────────────────────────────────────────\n\n/** Common pinned-model fields shared by all three Anthropic-cloud forms. */\ninterface PinnedModelDraftFields {\n defaultOpusModel: string;\n defaultSonnetModel: string;\n defaultHaikuModel: string;\n}\n\nexport type ProviderDraft =\n | { provider: \"anthropic\"; apiKey: string }\n | ({\n provider: \"bedrock\";\n authMode: \"access_key\";\n awsAccessKeyId: string;\n awsSecretAccessKey: string;\n awsSessionToken: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n // Mantle endpoint (optional)\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"bedrock\";\n authMode: \"bearer_token\";\n awsBearerTokenBedrock: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"bedrock\";\n authMode: \"profile\";\n awsProfile: string;\n awsRegion: string;\n bedrockBaseUrl: string;\n useMantle: boolean;\n mantleBaseUrl: string;\n skipMantleAuth: boolean;\n } & PinnedModelDraftFields)\n | ({\n provider: \"vertex\";\n projectId: string;\n region: string;\n credentialsFile: string;\n vertexBaseUrl: string;\n } & PinnedModelDraftFields)\n | ({\n provider: \"foundry\";\n endpointKind: \"resource\" | \"base_url\";\n resource: string;\n baseUrl: string;\n apiKey: string;\n } & PinnedModelDraftFields)\n | { provider: \"openai\"; apiKey: string }\n | {\n provider: \"azure-openai\";\n resource: string;\n apiKey: string;\n apiVersion: string;\n deploymentName: string;\n }\n | { provider: \"google\"; apiKey: string }\n | {\n provider: \"gemini-vertex\";\n authMode: \"adc\";\n projectId: string;\n location: string;\n }\n | {\n provider: \"gemini-vertex\";\n authMode: \"service_account\";\n projectId: string;\n location: string;\n credentialsFile: string;\n }\n | {\n provider: \"gemini-vertex\";\n authMode: \"api_key\";\n projectId: string;\n location: string;\n apiKey: string;\n };\n\nexport type BedrockAuthMode = \"access_key\" | \"bearer_token\" | \"profile\";\nexport type GeminiVertexAuthMode = \"adc\" | \"service_account\" | \"api_key\";\n\n/** Build the recommended-defaults seed for the pinned-model fields. */\nfunction pinnedDefaults(provider: \"bedrock\" | \"vertex\" | \"foundry\"): PinnedModelDraftFields {\n const r = RECOMMENDED_PINNED_MODELS_BY_PROVIDER[provider];\n return {\n defaultOpusModel: r.defaultOpusModel,\n defaultSonnetModel: r.defaultSonnetModel,\n defaultHaikuModel: r.defaultHaikuModel,\n };\n}\n\nconst EMPTY_MANTLE_FIELDS = {\n useMantle: false,\n mantleBaseUrl: \"\",\n skipMantleAuth: false,\n};\n\nexport function emptyDraft(provider: ApiKeyProvider): ProviderDraft {\n switch (provider) {\n case \"anthropic\":\n return { provider: \"anthropic\", apiKey: \"\" };\n case \"bedrock\":\n return emptyBedrockDraft(\"access_key\");\n case \"vertex\":\n return {\n provider: \"vertex\",\n projectId: \"\",\n region: \"\",\n credentialsFile: \"\",\n vertexBaseUrl: \"\",\n ...pinnedDefaults(\"vertex\"),\n };\n case \"foundry\":\n return {\n provider: \"foundry\",\n endpointKind: \"resource\",\n resource: \"\",\n baseUrl: \"\",\n apiKey: \"\",\n ...pinnedDefaults(\"foundry\"),\n };\n case \"openai\":\n return { provider: \"openai\", apiKey: \"\" };\n case \"azure-openai\":\n return {\n provider: \"azure-openai\",\n resource: \"\",\n apiKey: \"\",\n apiVersion: DEFAULT_AZURE_OPENAI_API_VERSION,\n deploymentName: \"\",\n };\n case \"google\":\n return { provider: \"google\", apiKey: \"\" };\n case \"gemini-vertex\":\n return emptyGeminiVertexDraft(\"adc\");\n }\n}\n\nexport function emptyBedrockDraft(mode: BedrockAuthMode): ProviderDraft {\n const baseShared = {\n awsRegion: \"\",\n bedrockBaseUrl: \"\",\n ...EMPTY_MANTLE_FIELDS,\n ...pinnedDefaults(\"bedrock\"),\n };\n switch (mode) {\n case \"access_key\":\n return {\n provider: \"bedrock\",\n authMode: \"access_key\",\n awsAccessKeyId: \"\",\n awsSecretAccessKey: \"\",\n awsSessionToken: \"\",\n ...baseShared,\n };\n case \"bearer_token\":\n return {\n provider: \"bedrock\",\n authMode: \"bearer_token\",\n awsBearerTokenBedrock: \"\",\n ...baseShared,\n };\n case \"profile\":\n return {\n provider: \"bedrock\",\n authMode: \"profile\",\n awsProfile: \"\",\n ...baseShared,\n };\n }\n}\n\nexport function emptyGeminiVertexDraft(\n mode: GeminiVertexAuthMode,\n): ProviderDraft {\n const base = { projectId: \"\", location: \"\" };\n switch (mode) {\n case \"adc\":\n return { provider: \"gemini-vertex\", authMode: \"adc\", ...base };\n case \"service_account\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"service_account\",\n credentialsFile: \"\",\n ...base,\n };\n case \"api_key\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"api_key\",\n apiKey: \"\",\n ...base,\n };\n }\n}\n\n/**\n * Build a typed config from the panel draft, dropping optional fields\n * that the operator left blank. Returns null when required fields are\n * missing (the Save button stays disabled in that state).\n */\n/**\n * Strip the pinned-model draft fields into the schema's optional shape.\n * Treats blank values as \"leave the cloud's built-in default\" by omitting\n * the field entirely (so we don't push empty-string env vars).\n */\nfunction pinnedFromDraft(draft: PinnedModelDraftFields): {\n defaultOpusModel?: string;\n defaultSonnetModel?: string;\n defaultHaikuModel?: string;\n} {\n const out: {\n defaultOpusModel?: string;\n defaultSonnetModel?: string;\n defaultHaikuModel?: string;\n } = {};\n if (draft.defaultOpusModel.trim()) {\n out.defaultOpusModel = draft.defaultOpusModel.trim();\n }\n if (draft.defaultSonnetModel.trim()) {\n out.defaultSonnetModel = draft.defaultSonnetModel.trim();\n }\n if (draft.defaultHaikuModel.trim()) {\n out.defaultHaikuModel = draft.defaultHaikuModel.trim();\n }\n return out;\n}\n\nexport function draftToConfig(\n draft: ProviderDraft,\n): BackendApiKeyConfig | null {\n switch (draft.provider) {\n case \"anthropic\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"anthropic\", apiKey: draft.apiKey.trim() };\n case \"bedrock\": {\n const region = draft.awsRegion.trim();\n if (!region) return null;\n const baseUrl = draft.bedrockBaseUrl.trim();\n const baseUrlField = baseUrl ? { bedrockBaseUrl: baseUrl } : {};\n const mantleFields = {\n ...(draft.useMantle ? { useMantle: true } : {}),\n ...(draft.mantleBaseUrl.trim()\n ? { mantleBaseUrl: draft.mantleBaseUrl.trim() }\n : {}),\n ...(draft.skipMantleAuth ? { skipMantleAuth: true } : {}),\n };\n const pinned = pinnedFromDraft(draft);\n switch (draft.authMode) {\n case \"access_key\": {\n if (\n !draft.awsAccessKeyId.trim()\n || !draft.awsSecretAccessKey.trim()\n ) {\n return null;\n }\n return {\n provider: \"bedrock\",\n authMode: \"access_key\",\n awsAccessKeyId: draft.awsAccessKeyId.trim(),\n awsSecretAccessKey: draft.awsSecretAccessKey.trim(),\n ...(draft.awsSessionToken.trim()\n ? { awsSessionToken: draft.awsSessionToken.trim() }\n : {}),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n }\n case \"bearer_token\":\n if (!draft.awsBearerTokenBedrock.trim()) return null;\n return {\n provider: \"bedrock\",\n authMode: \"bearer_token\",\n awsBearerTokenBedrock: draft.awsBearerTokenBedrock.trim(),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n case \"profile\":\n if (!draft.awsProfile.trim()) return null;\n return {\n provider: \"bedrock\",\n authMode: \"profile\",\n awsProfile: draft.awsProfile.trim(),\n awsRegion: region,\n ...baseUrlField,\n ...mantleFields,\n ...pinned,\n };\n }\n return null;\n }\n case \"vertex\": {\n if (!draft.projectId.trim() || !draft.region.trim()) return null;\n return {\n provider: \"vertex\",\n projectId: draft.projectId.trim(),\n region: draft.region.trim(),\n ...(draft.credentialsFile.trim()\n ? { credentialsFile: draft.credentialsFile.trim() }\n : {}),\n ...(draft.vertexBaseUrl.trim()\n ? { vertexBaseUrl: draft.vertexBaseUrl.trim() }\n : {}),\n ...pinnedFromDraft(draft),\n };\n }\n case \"foundry\": {\n const resource = draft.resource.trim();\n const baseUrl = draft.baseUrl.trim();\n const apiKey = draft.apiKey.trim();\n const pinned = pinnedFromDraft(draft);\n if (draft.endpointKind === \"resource\") {\n if (!resource) return null;\n return {\n provider: \"foundry\",\n resource,\n ...(apiKey ? { apiKey } : {}),\n ...pinned,\n };\n }\n if (!baseUrl) return null;\n return {\n provider: \"foundry\",\n baseUrl,\n ...(apiKey ? { apiKey } : {}),\n ...pinned,\n };\n }\n case \"openai\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"openai\", apiKey: draft.apiKey.trim() };\n case \"azure-openai\": {\n const resource = draft.resource.trim();\n const apiKey = draft.apiKey.trim();\n if (!resource || !apiKey) return null;\n return {\n provider: \"azure-openai\",\n resource,\n apiKey,\n ...(draft.apiVersion.trim()\n ? { apiVersion: draft.apiVersion.trim() }\n : {}),\n ...(draft.deploymentName.trim()\n ? { deploymentName: draft.deploymentName.trim() }\n : {}),\n };\n }\n case \"google\":\n if (!draft.apiKey.trim()) return null;\n return { provider: \"google\", apiKey: draft.apiKey.trim() };\n case \"gemini-vertex\": {\n const projectId = draft.projectId.trim();\n const location = draft.location.trim();\n if (!projectId || !location) return null;\n switch (draft.authMode) {\n case \"adc\":\n return {\n provider: \"gemini-vertex\",\n authMode: \"adc\",\n projectId,\n location,\n };\n case \"service_account\":\n if (!draft.credentialsFile.trim()) return null;\n return {\n provider: \"gemini-vertex\",\n authMode: \"service_account\",\n projectId,\n location,\n credentialsFile: draft.credentialsFile.trim(),\n };\n case \"api_key\":\n if (!draft.apiKey.trim()) return null;\n return {\n provider: \"gemini-vertex\",\n authMode: \"api_key\",\n projectId,\n location,\n apiKey: draft.apiKey.trim(),\n };\n }\n return null;\n }\n }\n}\n\n/**\n * Whether the cloud-provider Save button should be enabled. Requires\n * all required fields populated, valid format, and no in-flight save.\n */\nexport function isConfigSaveEnabled(opts: {\n backendId: BackendId;\n draft: ProviderDraft;\n saving: boolean;\n}): boolean {\n if (opts.saving) return false;\n const config = draftToConfig(opts.draft);\n if (!config) return false;\n return validateBackendApiKeyConfigFormat(opts.backendId, config) === null;\n}\n\n/** True when a provider is the legacy single-API-key form, false when it\n * needs the multi-field cloud form. Drives which form to render. */\nexport function isDirectApiKeyProvider(provider: ApiKeyProvider): boolean {\n return (\n provider === \"anthropic\" || provider === \"openai\" || provider === \"google\"\n );\n}\n","\"use client\";\n\nimport { Alert } from \"@/components/ui/alert\";\n\n/**\n * Warning surfaced wherever the operator sees the per-backend API-key\n * panel (setup wizard's AI Backends step, /settings/models). Skipping\n * the API key falls the daemon back to the CLI's local subscription\n * auth, which providers explicitly discourage for programmatic use —\n * Anthropic in particular currently prohibits running the Agent SDK on a\n * Claude Pro / Max subscription. Provider policies change frequently, so\n * we surface the warning rather than silently relying on the fallback.\n */\nexport function SubscriptionAuthWarning() {\n return (\n <Alert variant=\"warning\">\n <p className=\"font-semibold\">\n API key recommended — subscription auth is not supported by all\n providers\n </p>\n <p className=\"mt-1 leading-relaxed\">\n You can skip API key setup and the daemon will fall back to each\n backend&rsquo;s local CLI login (subscription auth). Most providers\n do not officially support running automated agents on a\n subscription plan; <strong>Anthropic currently prohibits</strong>{\" \"}\n using the Claude Agent SDK with a Claude Pro / Max subscription.\n Provider policies change often — to stay clear of the gray area,\n register a paid API key here.\n </p>\n </Alert>\n );\n}\n","import createLucideIcon from '../createLucideIcon';\n\n/**\n * @component @name LockOpen\n * @description Lucide SVG icon component, renders SVG Element with children.\n *\n * @preview ![img](data:image/svg+xml;base64,PHN2ZyAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHN0cm9rZT0iIzAwMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6ICNmZmY7IGJvcmRlci1yYWRpdXM6IDJweCIKICBzdHJva2Utd2lkdGg9IjIiCiAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogIHN0cm9rZS1saW5lam9pbj0icm91bmQiCj4KICA8cmVjdCB3aWR0aD0iMTgiIGhlaWdodD0iMTEiIHg9IjMiIHk9IjExIiByeD0iMiIgcnk9IjIiIC8+CiAgPHBhdGggZD0iTTcgMTFWN2E1IDUgMCAwIDEgOS45LTEiIC8+Cjwvc3ZnPgo=) - https://lucide.dev/icons/lock-open\n * @see https://lucide.dev/guide/packages/lucide-react - Documentation\n *\n * @param {Object} props - Lucide icons props and any valid SVG attribute\n * @returns {JSX.Element} JSX Element\n *\n */\nconst LockOpen = createLucideIcon('LockOpen', [\n ['rect', { width: '18', height: '11', x: '3', y: '11', rx: '2', ry: '2', key: '1w4ew1' }],\n ['path', { d: 'M7 11V7a5 5 0 0 1 9.9-1', key: '1mm8w8' }],\n]);\n\nexport default LockOpen;\n","import type { BackendId, ExecutionPermissionMode } from \"@aitne/shared\";\n\n/**\n * Execution mode step — pure state + payload logic.\n *\n * Design: `EXECUTION-MODE-DESIGN.md` §5.1.\n *\n * The user-visible labels are `Safe` / `Allow`; the daemon already stores\n * these as `strict` / `allow` in `{claude,codex,gemini}ExecutionPermissionMode`.\n * The UI layer uses `ExecutionModeUi` everywhere so the copy and form state\n * stay consistent with the card labels, and this module owns the single\n * translation point into the internal `ExecutionPermissionMode` alphabet.\n */\n\nexport type ExecutionModeUi = \"safe\" | \"allow\";\n\nexport const EXECUTION_MODE_UI_VALUES = [\"safe\", \"allow\"] as const;\n\n/**\n * Per-backend override as stored in form state. `null` means \"follow the\n * top-level choice\" — the accordion is collapsed-by-default and unchanged\n * rows should not silently diverge from the top-level pick.\n */\nexport type PerBackendOverrides = Record<BackendId, ExecutionModeUi | null>;\n\nexport const EMPTY_OVERRIDES: PerBackendOverrides = {\n claude: null,\n codex: null,\n gemini: null,\n};\n\nexport function uiToInternal(mode: ExecutionModeUi): ExecutionPermissionMode {\n return mode === \"safe\" ? \"strict\" : \"allow\";\n}\n\nexport function internalToUi(mode: ExecutionPermissionMode): ExecutionModeUi {\n return mode === \"strict\" ? \"safe\" : \"allow\";\n}\n\n/**\n * API payload for `POST /api/setup/mode`. Per-backend overrides are only\n * emitted when they diverge from the top-level pick, so the shape stays\n * minimal for the common case.\n */\nexport interface SetupModePayload {\n mode: ExecutionModeUi;\n perBackend?: Partial<Record<BackendId, ExecutionModeUi>>;\n}\n\n/**\n * Build the `/setup/mode` payload from the current form state. Two paths:\n *\n * 1. `topLevel` non-null — standard case. Overrides that equal the top are\n * filtered out; only divergent rows are emitted.\n * 2. `topLevel === null` — settings-page divergent-seed case (every backend\n * had a different persisted mode, so there is no unified top to show).\n * Caller must supply a fully-specified override set; a synthetic top is\n * chosen as the majority mode across the three rows, and the minority\n * rows are emitted as overrides. This keeps the API shape unchanged —\n * `mode` is still required by the endpoint — while letting the user\n * commit an arbitrary per-backend configuration without first clicking\n * one of the cards.\n *\n * Returns `null` when the state is incomplete (no top pick and at least\n * one override is null). Caller uses that to gate the Apply button.\n */\nexport function buildSetupModePayload(\n topLevel: ExecutionModeUi | null,\n overrides: PerBackendOverrides,\n): SetupModePayload | null {\n if (topLevel === null) {\n if (\n overrides.claude === null\n || overrides.codex === null\n || overrides.gemini === null\n ) {\n return null;\n }\n const synthetic = majorityMode(overrides);\n const perBackend: Partial<Record<BackendId, ExecutionModeUi>> = {};\n for (const backend of [\"claude\", \"codex\", \"gemini\"] as const) {\n const value = overrides[backend];\n // The null guard above narrows `value` at runtime, but TS doesn't\n // track the per-index narrowing through the const-backends loop.\n if (value !== null && value !== synthetic) perBackend[backend] = value;\n }\n const payload: SetupModePayload = { mode: synthetic };\n if (Object.keys(perBackend).length > 0) payload.perBackend = perBackend;\n return payload;\n }\n\n const perBackend: Partial<Record<BackendId, ExecutionModeUi>> = {};\n for (const backend of [\"claude\", \"codex\", \"gemini\"] as const) {\n const override = overrides[backend];\n if (override !== null && override !== topLevel) {\n perBackend[backend] = override;\n }\n }\n const payload: SetupModePayload = { mode: topLevel };\n if (Object.keys(perBackend).length > 0) {\n payload.perBackend = perBackend;\n }\n return payload;\n}\n\n/** True when the current form state is ready to POST. */\nexport function canApply(\n topLevel: ExecutionModeUi | null,\n overrides: PerBackendOverrides,\n): boolean {\n return buildSetupModePayload(topLevel, overrides) !== null;\n}\n\n/**\n * Majority mode across three non-null overrides. Ties (e.g. 1 safe / 1\n * allow / 1 safe) resolve to the first-occurring mode in backend order\n * claude → codex → gemini. Used for the divergent-apply synthetic top.\n */\nfunction majorityMode(\n overrides: PerBackendOverrides,\n): ExecutionModeUi {\n const backends = [\"claude\", \"codex\", \"gemini\"] as const;\n let safe = 0;\n let allow = 0;\n for (const b of backends) {\n if (overrides[b] === \"safe\") safe++;\n else if (overrides[b] === \"allow\") allow++;\n }\n if (safe > allow) return \"safe\";\n if (allow > safe) return \"allow\";\n // Tie — pick the first non-null in backend order. With three non-null\n // entries a tie is impossible (3 is odd), but the fallthrough keeps\n // the type system and future 4-backend extensions honest.\n for (const b of backends) {\n if (overrides[b] !== null) return overrides[b] as ExecutionModeUi;\n }\n return \"safe\";\n}\n\n/**\n * Resolve what mode a backend will effectively run in given the current\n * form state. Used by the advanced accordion to echo the actual mode a\n * row will be written with — including when \"follow top-level\" is active.\n */\nexport function resolveEffectiveMode(\n backend: BackendId,\n topLevel: ExecutionModeUi,\n overrides: PerBackendOverrides,\n): ExecutionModeUi {\n return overrides[backend] ?? topLevel;\n}\n\n/**\n * True when at least one per-backend row diverges from the top-level pick.\n * Drives the accordion's \"mixed\" indicator so the user can tell at a glance\n * whether the collapsed accordion hides a non-trivial configuration.\n */\nexport function hasDivergentOverride(\n topLevel: ExecutionModeUi,\n overrides: PerBackendOverrides,\n): boolean {\n return ([\"claude\", \"codex\", \"gemini\"] as const).some(\n (b) => overrides[b] !== null && overrides[b] !== topLevel,\n );\n}\n"],"names":["apiKeyQueryKey","backendId","useBackendApiKey","queryKey","queryFn","get","staleTime","useSaveBackendApiKey","queryClient","mutationFn","input","put","onSuccess","invalidateQueries","useClearBackendApiKey","delete","SubscriptionAuthWarning","variant","className","EXECUTION_MODE_UI_VALUES","EMPTY_OVERRIDES","claude","codex","gemini","uiToInternal","mode","internalToUi","buildSetupModePayload","topLevel","overrides","synthetic","majorityMode","perBackend","backend","value","payload","Object","keys","length","override","canApply","backends","safe","allow","b","resolveEffectiveMode","hasDivergentOverride","some"],"mappings":"8DEEA,EAAA,EAAA,CAAA,CAAA,mBCWM,CAAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,ADAA,CCAA,ADAA,CAAA,CAAA,EAAA,EAAA,OAAA,EAAyB,QAAS,CAAA,CACrC,CCAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,EDAE,CAAA,AAAE,ECDyC,ADCrC,CCDqC,ADCrC,ACAC,kCDAuC,CAAA,ACAD,CAAK,0EDCmB,CAAA,uCDblF,IAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,OAAA,EAAA,EAAA,CAAA,CAAA,MASA,EAAA,EAAA,CAAA,CAAA,MACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OFXA,EAAA,EAAA,CAAA,CAAA,KAcA,IAAM,EAID,CACH,GAAI,CAAE,QAAS,QAAS,MAAO,KAAM,KAAM,GAAS,EACpD,cAAe,CAAE,QAAS,QAAS,MAAO,gBAAiB,KAAM,IAAe,EAChF,QAAS,CAAE,QAAS,MAAO,MAAO,UAAW,KAAM,IAAe,EAClE,QAAS,CAAE,QAAS,OAAQ,MAAO,UAAW,KAAM,GAAS,EAC7D,WAAY,CAAE,QAAS,OAAQ,MAAO,aAAc,KAAM,IAAe,EACzE,QAAS,CAAE,QAAS,OAAQ,MAAO,UAAW,KAAM,GAAS,CAC/D,EAwBO,SAAS,EAAgB,CAC9B,OAAQ,CAAS,CACjB,QAAM,gBACN,CAAc,eACd,CAAa,mBACb,CAAiB,CACI,EACrB,IAAM,EA5BN,AAAI,KAAO,EA4BI,EA3BX,AAAQ,SAAS,CA2BU,CA5BL,CACE,MADK,IAE1B,UA2BD,EAAS,CAAa,CAAC,EAAO,CAG9B,EAAY,AAAW,eAAwB,YAAX,EAEpC,EACJ,GAAa,EAAiB,CAAC,EAAE,EA9BrC,AA8BuC,SA9B9B,AAAc,CAAe,EAEpC,IAAM,EAAO,KAAK,KAAK,CAAC,CADT,KAAK,GAAG,GAAK,CAAA,EAAA,EAAA,YAAA,AAAY,EAAC,GAAS,OAAO,EAAA,EACxB,KACjC,GAAI,EAAO,GAAI,MAAO,CAAA,EAAG,EAAK,CAAC,CAAC,CAChC,IAAM,EAAQ,KAAK,KAAK,CAAC,EAAO,IAChC,GAAI,EAAQ,GAAI,MAAO,CAAA,EAAG,EAAM,CAAC,CAAC,CAClC,IAAM,EAAO,KAAK,KAAK,CAAC,EAAQ,IAChC,MAAO,CAAA,EAAG,EAAK,CAAC,CAAC,AACnB,EAsBqD,GAAgB,CAAC,CAAC,CAAG,GAElE,EAAyB,EAAE,CAajC,OAZA,EAAa,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAO,KAAK,CAAA,CAAE,EACvC,GAAQ,EAAa,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAA,CAAQ,EAC7C,GAAkB,GACpB,EAAa,IAAI,CAAC,CADa,AACZ,cAAc,EAAE,CAAA,EAAA,EAAA,kBAAA,AAAkB,EAAC,GAAA,CAAiB,EAErE,GACF,EAAa,IAAI,CAAC,CAAC,IADF,UACgB,EAAE,CAAA,EAAA,EAAA,kBAAA,AAAkB,EAAC,GAAA,CAAgB,EAEpE,EAAoB,GAAG,AACzB,EAAa,IAAI,CAAC,CAAC,oBAAoB,EAAE,EAAA,CAAmB,EAI5D,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,OAAO,CAAA,WACN,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,OAAO,CAAA,CAAA,WACrB,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UACC,CAAA,EAAA,EAAA,IAAA,EAAC,EAAA,KAAK,CAAA,CAAC,QAAS,EAAO,OAAO,CAAE,UAAU,kBACvC,AAxBqB,eAAX,EAyBT,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,OAAO,CAAA,CAAC,UAAU,yBACjB,KAAK,SACF,EAAO,KAAK,CAClB,SAIP,CAAA,EAAA,EAAA,GAAA,EAAC,EAAA,cAAc,CAAA,CAAC,KAAK,SAAS,UAAU,oBACtC,CAAA,EAAA,EAAA,GAAA,EAAC,MAAA,CAAI,UAAU,+BACZ,EAAa,GAAG,CAAC,CAAC,EAAM,IACvB,CAAA,EAAA,EAAA,GAAA,EAAC,IAAA,UAAW,GAAJ,UAMpB,CCrGA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,gBGUsB,EAAA,OAAA,EAAA,gBAAkC,CAAA,QAC7C,CDAE,ACAF,MAAS,CDAD,ACAC,CAAA,ADAD,CAAA,ACAC,CAAK,CAAA,ADAI,CAAA,ACAJ,CDAI,ACAJ,IAAA,IAAa,CAAA,ADAA,CAAA,ACAG,CAAK,ADAR,CAAA,ACAQ,EAAA,CAAA,ADAG,CCAH,ADAG,ICAK,CDAL,ACAS,CDAT,ACAS,CDAT,ACAS,CDAC,GCAI,CAAA,EAAI,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAK,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAU,CAAA,CAAA,CACpF,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAA,ACAA,CDAQ,ACAA,CDAA,ACAA,CDAA,ACAA,AAAE,EAAG,CAA6D,ADAV,CCAU,ADAV,CAAA,ACAU,CAAA,ADAV,CCAU,ADAV,CAAA,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CAAA,ADAV,CAAA,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CAAA,ADAV,CCAU,ADAV,CAAA,ACAU,CDAV,ACAU,CDAV,ACAU,CAAA,ADAV,CAAA,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CAAA,ADAV,CAAA,ACAU,CDAV,ACAU,CAAA,ADAV,CAAA,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CDAV,ACAU,CAAA,ADAV,CCAU,ADAV,UCAU,CAAA,CAAA,CAAA,CAAK,UAAU,CAAA,yCAC5C,QAAA,CAAU,CAAA,CAAA,AACxD,QAAS,CAAA,AAAE,EAAG,CAAa,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,AAAK,QAAA,CAAU,CAAA,CAC1C,AAD0C,CACzC,CAAA,CAAA,CAAA,CAAA,CAAA,CAAQ,CAAA,CAAA,AAAE,EAAG,CAAkB,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,C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","ignoreList":[3,4,10]}