auramaxx 0.0.20 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1099) hide show
  1. package/README.md +92 -53
  2. package/bin/auramaxx.js +114 -92
  3. package/package.json +18 -94
  4. package/src/server/cli/commands/create.ts +20 -24
  5. package/src/server/cli/commands/onboard.ts +18 -2
  6. package/src/server/cli/commands/play.ts +303 -34
  7. package/src/server/cli/lib/theme.ts +58 -0
  8. package/.next/BUILD_ID +0 -1
  9. package/.next/app-build-manifest.json +0 -303
  10. package/.next/app-path-routes-manifest.json +0 -38
  11. package/.next/build-manifest.json +0 -33
  12. package/.next/diagnostics/build-diagnostics.json +0 -6
  13. package/.next/diagnostics/framework.json +0 -1
  14. package/.next/export-marker.json +0 -6
  15. package/.next/images-manifest.json +0 -58
  16. package/.next/next-minimal-server.js.nft.json +0 -1
  17. package/.next/next-server.js.nft.json +0 -1
  18. package/.next/package.json +0 -1
  19. package/.next/prerender-manifest.json +0 -292
  20. package/.next/react-loadable-manifest.json +0 -80
  21. package/.next/required-server-files.json +0 -330
  22. package/.next/routes-manifest.json +0 -209
  23. package/.next/server/app/_not-found/page.js +0 -2
  24. package/.next/server/app/_not-found/page.js.nft.json +0 -1
  25. package/.next/server/app/_not-found/page_client-reference-manifest.js +0 -1
  26. package/.next/server/app/_not-found.html +0 -1
  27. package/.next/server/app/_not-found.meta +0 -8
  28. package/.next/server/app/_not-found.rsc +0 -19
  29. package/.next/server/app/api/[...doc]/page.js +0 -2
  30. package/.next/server/app/api/[...doc]/page.js.nft.json +0 -1
  31. package/.next/server/app/api/[...doc]/page_client-reference-manifest.js +0 -1
  32. package/.next/server/app/api/agent-requests/route.js +0 -1
  33. package/.next/server/app/api/agent-requests/route.js.nft.json +0 -1
  34. package/.next/server/app/api/agent-requests/route_client-reference-manifest.js +0 -1
  35. package/.next/server/app/api/apps/install/route.js +0 -25
  36. package/.next/server/app/api/apps/install/route.js.nft.json +0 -1
  37. package/.next/server/app/api/apps/install/route_client-reference-manifest.js +0 -1
  38. package/.next/server/app/api/apps/manifests/route.js +0 -1
  39. package/.next/server/app/api/apps/manifests/route.js.nft.json +0 -1
  40. package/.next/server/app/api/apps/manifests/route_client-reference-manifest.js +0 -1
  41. package/.next/server/app/api/apps/static/[...path]/route.js +0 -1
  42. package/.next/server/app/api/apps/static/[...path]/route.js.nft.json +0 -1
  43. package/.next/server/app/api/apps/static/[...path]/route_client-reference-manifest.js +0 -1
  44. package/.next/server/app/api/docs/plain/route.js +0 -4
  45. package/.next/server/app/api/docs/plain/route.js.nft.json +0 -1
  46. package/.next/server/app/api/docs/plain/route_client-reference-manifest.js +0 -1
  47. package/.next/server/app/api/events/route.js +0 -1
  48. package/.next/server/app/api/events/route.js.nft.json +0 -1
  49. package/.next/server/app/api/events/route_client-reference-manifest.js +0 -1
  50. package/.next/server/app/api/import-from-openclaw/[channel]/route.js +0 -1
  51. package/.next/server/app/api/import-from-openclaw/[channel]/route.js.nft.json +0 -1
  52. package/.next/server/app/api/import-from-openclaw/[channel]/route_client-reference-manifest.js +0 -1
  53. package/.next/server/app/api/import-from-openclaw/route.js +0 -1
  54. package/.next/server/app/api/import-from-openclaw/route.js.nft.json +0 -1
  55. package/.next/server/app/api/import-from-openclaw/route_client-reference-manifest.js +0 -1
  56. package/.next/server/app/api/import-from-openclaw/validate/[channel]/route.js +0 -1
  57. package/.next/server/app/api/import-from-openclaw/validate/[channel]/route.js.nft.json +0 -1
  58. package/.next/server/app/api/import-from-openclaw/validate/[channel]/route_client-reference-manifest.js +0 -1
  59. package/.next/server/app/api/page.js +0 -2
  60. package/.next/server/app/api/page.js.nft.json +0 -1
  61. package/.next/server/app/api/page_client-reference-manifest.js +0 -1
  62. package/.next/server/app/api/restart/route.js +0 -57
  63. package/.next/server/app/api/restart/route.js.nft.json +0 -1
  64. package/.next/server/app/api/restart/route_client-reference-manifest.js +0 -1
  65. package/.next/server/app/api/update/route.js +0 -94
  66. package/.next/server/app/api/update/route.js.nft.json +0 -1
  67. package/.next/server/app/api/update/route_client-reference-manifest.js +0 -1
  68. package/.next/server/app/api/version/route.js +0 -1
  69. package/.next/server/app/api/version/route.js.nft.json +0 -1
  70. package/.next/server/app/api/version/route_client-reference-manifest.js +0 -1
  71. package/.next/server/app/api/workspace/[id]/apps/[wid]/route.js +0 -1
  72. package/.next/server/app/api/workspace/[id]/apps/[wid]/route.js.nft.json +0 -1
  73. package/.next/server/app/api/workspace/[id]/apps/[wid]/route_client-reference-manifest.js +0 -1
  74. package/.next/server/app/api/workspace/[id]/apps/route.js +0 -1
  75. package/.next/server/app/api/workspace/[id]/apps/route.js.nft.json +0 -1
  76. package/.next/server/app/api/workspace/[id]/apps/route_client-reference-manifest.js +0 -1
  77. package/.next/server/app/api/workspace/[id]/export/route.js +0 -1
  78. package/.next/server/app/api/workspace/[id]/export/route.js.nft.json +0 -1
  79. package/.next/server/app/api/workspace/[id]/export/route_client-reference-manifest.js +0 -1
  80. package/.next/server/app/api/workspace/[id]/route.js +0 -1
  81. package/.next/server/app/api/workspace/[id]/route.js.nft.json +0 -1
  82. package/.next/server/app/api/workspace/[id]/route_client-reference-manifest.js +0 -1
  83. package/.next/server/app/api/workspace/config/route.js +0 -1
  84. package/.next/server/app/api/workspace/config/route.js.nft.json +0 -1
  85. package/.next/server/app/api/workspace/config/route_client-reference-manifest.js +0 -1
  86. package/.next/server/app/api/workspace/import/route.js +0 -1
  87. package/.next/server/app/api/workspace/import/route.js.nft.json +0 -1
  88. package/.next/server/app/api/workspace/import/route_client-reference-manifest.js +0 -1
  89. package/.next/server/app/api/workspace/route.js +0 -1
  90. package/.next/server/app/api/workspace/route.js.nft.json +0 -1
  91. package/.next/server/app/api/workspace/route_client-reference-manifest.js +0 -1
  92. package/.next/server/app/app-legacy-do-not-use/page.js +0 -17
  93. package/.next/server/app/app-legacy-do-not-use/page.js.nft.json +0 -1
  94. package/.next/server/app/app-legacy-do-not-use/page_client-reference-manifest.js +0 -1
  95. package/.next/server/app/app-legacy-do-not-use.html +0 -1
  96. package/.next/server/app/app-legacy-do-not-use.meta +0 -7
  97. package/.next/server/app/app-legacy-do-not-use.rsc +0 -23
  98. package/.next/server/app/apple-icon.png/route.js +0 -1
  99. package/.next/server/app/apple-icon.png/route.js.nft.json +0 -1
  100. package/.next/server/app/apple-icon.png.body +0 -0
  101. package/.next/server/app/apple-icon.png.meta +0 -1
  102. package/.next/server/app/approve/[actionId]/page.js +0 -2
  103. package/.next/server/app/approve/[actionId]/page.js.nft.json +0 -1
  104. package/.next/server/app/approve/[actionId]/page_client-reference-manifest.js +0 -1
  105. package/.next/server/app/docs/[...doc]/page.js +0 -2
  106. package/.next/server/app/docs/[...doc]/page.js.nft.json +0 -1
  107. package/.next/server/app/docs/[...doc]/page_client-reference-manifest.js +0 -1
  108. package/.next/server/app/docs/page.js +0 -2
  109. package/.next/server/app/docs/page.js.nft.json +0 -1
  110. package/.next/server/app/docs/page_client-reference-manifest.js +0 -1
  111. package/.next/server/app/favicon.ico/route.js +0 -1
  112. package/.next/server/app/favicon.ico/route.js.nft.json +0 -1
  113. package/.next/server/app/favicon.ico.body +0 -0
  114. package/.next/server/app/favicon.ico.meta +0 -1
  115. package/.next/server/app/health/page.js +0 -2
  116. package/.next/server/app/health/page.js.nft.json +0 -1
  117. package/.next/server/app/health/page_client-reference-manifest.js +0 -1
  118. package/.next/server/app/health.html +0 -1
  119. package/.next/server/app/health.meta +0 -7
  120. package/.next/server/app/health.rsc +0 -20
  121. package/.next/server/app/hello/page.js +0 -2
  122. package/.next/server/app/hello/page.js.nft.json +0 -1
  123. package/.next/server/app/hello/page_client-reference-manifest.js +0 -1
  124. package/.next/server/app/hello.html +0 -1
  125. package/.next/server/app/hello.meta +0 -7
  126. package/.next/server/app/hello.rsc +0 -23
  127. package/.next/server/app/icon.png/route.js +0 -1
  128. package/.next/server/app/icon.png/route.js.nft.json +0 -1
  129. package/.next/server/app/icon.png.body +0 -0
  130. package/.next/server/app/icon.png.meta +0 -1
  131. package/.next/server/app/index.html +0 -1
  132. package/.next/server/app/index.meta +0 -7
  133. package/.next/server/app/index.rsc +0 -20
  134. package/.next/server/app/page.js +0 -14
  135. package/.next/server/app/page.js.nft.json +0 -1
  136. package/.next/server/app/page_client-reference-manifest.js +0 -1
  137. package/.next/server/app/privacy/page.js +0 -2
  138. package/.next/server/app/privacy/page.js.nft.json +0 -1
  139. package/.next/server/app/privacy/page_client-reference-manifest.js +0 -1
  140. package/.next/server/app/privacy.html +0 -1
  141. package/.next/server/app/privacy.meta +0 -7
  142. package/.next/server/app/privacy.rsc +0 -24
  143. package/.next/server/app/share/[token]/page.js +0 -2
  144. package/.next/server/app/share/[token]/page.js.nft.json +0 -1
  145. package/.next/server/app/share/[token]/page_client-reference-manifest.js +0 -1
  146. package/.next/server/app/terms/page.js +0 -2
  147. package/.next/server/app/terms/page.js.nft.json +0 -1
  148. package/.next/server/app/terms/page_client-reference-manifest.js +0 -1
  149. package/.next/server/app/terms.html +0 -1
  150. package/.next/server/app/terms.meta +0 -7
  151. package/.next/server/app/terms.rsc +0 -24
  152. package/.next/server/app/yo/page.js +0 -2
  153. package/.next/server/app/yo/page.js.nft.json +0 -1
  154. package/.next/server/app/yo/page_client-reference-manifest.js +0 -1
  155. package/.next/server/app/yo.html +0 -1
  156. package/.next/server/app/yo.meta +0 -7
  157. package/.next/server/app/yo.rsc +0 -23
  158. package/.next/server/app-paths-manifest.json +0 -38
  159. package/.next/server/chunks/1194.js +0 -4
  160. package/.next/server/chunks/1196.js +0 -1
  161. package/.next/server/chunks/1331.js +0 -22
  162. package/.next/server/chunks/1503.js +0 -2
  163. package/.next/server/chunks/1644.js +0 -1
  164. package/.next/server/chunks/1692.js +0 -1
  165. package/.next/server/chunks/2123.js +0 -59
  166. package/.next/server/chunks/2145.js +0 -1
  167. package/.next/server/chunks/2234.js +0 -1
  168. package/.next/server/chunks/2269.js +0 -1
  169. package/.next/server/chunks/2395.js +0 -9
  170. package/.next/server/chunks/2945.js +0 -1
  171. package/.next/server/chunks/335.js +0 -1
  172. package/.next/server/chunks/372.js +0 -1
  173. package/.next/server/chunks/4224.js +0 -1
  174. package/.next/server/chunks/4337.js +0 -1
  175. package/.next/server/chunks/4600.js +0 -1
  176. package/.next/server/chunks/4697.js +0 -1
  177. package/.next/server/chunks/5347.js +0 -1
  178. package/.next/server/chunks/5482.js +0 -1
  179. package/.next/server/chunks/5611.js +0 -6
  180. package/.next/server/chunks/5678.js +0 -4
  181. package/.next/server/chunks/5784.js +0 -1
  182. package/.next/server/chunks/5991.js +0 -7
  183. package/.next/server/chunks/6086.js +0 -2
  184. package/.next/server/chunks/6470.js +0 -1
  185. package/.next/server/chunks/6572.js +0 -59
  186. package/.next/server/chunks/7585.js +0 -1
  187. package/.next/server/chunks/7935.js +0 -101
  188. package/.next/server/chunks/8011.js +0 -1
  189. package/.next/server/chunks/8468.js +0 -1
  190. package/.next/server/chunks/9323.js +0 -8
  191. package/.next/server/chunks/9971.js +0 -1
  192. package/.next/server/functions-config-manifest.json +0 -8
  193. package/.next/server/instrumentation.js +0 -1
  194. package/.next/server/instrumentation.js.nft.json +0 -1
  195. package/.next/server/interception-route-rewrite-manifest.js +0 -1
  196. package/.next/server/middleware-build-manifest.js +0 -1
  197. package/.next/server/middleware-manifest.json +0 -6
  198. package/.next/server/middleware-react-loadable-manifest.js +0 -1
  199. package/.next/server/next-font-manifest.js +0 -1
  200. package/.next/server/next-font-manifest.json +0 -1
  201. package/.next/server/pages/404.html +0 -1
  202. package/.next/server/pages/500.html +0 -1
  203. package/.next/server/pages/_app.js +0 -1
  204. package/.next/server/pages/_app.js.nft.json +0 -1
  205. package/.next/server/pages/_document.js +0 -1
  206. package/.next/server/pages/_document.js.nft.json +0 -1
  207. package/.next/server/pages/_error.js +0 -19
  208. package/.next/server/pages/_error.js.nft.json +0 -1
  209. package/.next/server/pages-manifest.json +0 -6
  210. package/.next/server/server-reference-manifest.js +0 -1
  211. package/.next/server/server-reference-manifest.json +0 -1
  212. package/.next/server/webpack-runtime.js +0 -1
  213. package/.next/static/chunks/1168.bb1c93965872e980.js +0 -1
  214. package/.next/static/chunks/1255-7999eac54f80a49f.js +0 -1
  215. package/.next/static/chunks/142-fa9752f53a551f63.js +0 -1
  216. package/.next/static/chunks/2505.d54ccadc42f4e3d1.js +0 -1
  217. package/.next/static/chunks/2619-04bc32f026a0d946.js +0 -1
  218. package/.next/static/chunks/2891-bf010357841c9ce9.js +0 -1
  219. package/.next/static/chunks/2927.3976471e61df966e.js +0 -1
  220. package/.next/static/chunks/3573-667bc4c8f56afcff.js +0 -1
  221. package/.next/static/chunks/3609.ded5a5306e18af9c.js +0 -1
  222. package/.next/static/chunks/3826.a73d4a88d8c09030.js +0 -1
  223. package/.next/static/chunks/3a91511d-da2c74cad6c6fc33.js +0 -7
  224. package/.next/static/chunks/4114-a375178fd94c4d8a.js +0 -1
  225. package/.next/static/chunks/4256.aa831e4d8c3f65bc.js +0 -1
  226. package/.next/static/chunks/4901-ba6a32818662e70a.js +0 -1
  227. package/.next/static/chunks/4919-0e698cd95504e355.js +0 -1
  228. package/.next/static/chunks/4bd1b696-100b9d70ed4e49c1.js +0 -1
  229. package/.next/static/chunks/5336-b775f449d7433604.js +0 -1
  230. package/.next/static/chunks/5362-2e8fcdd0bc6273ca.js +0 -59
  231. package/.next/static/chunks/6233-97a810aa272af547.js +0 -1
  232. package/.next/static/chunks/626.a5109d16f9eca1f6.js +0 -1
  233. package/.next/static/chunks/67-cb9bbb430499e803.js +0 -1
  234. package/.next/static/chunks/7616-1129bcb3eee8d315.js +0 -1
  235. package/.next/static/chunks/786-26deffb41572cbb3.js +0 -1
  236. package/.next/static/chunks/8273-3b9d882c5dd6a9a8.js +0 -1
  237. package/.next/static/chunks/8291-8f6fb6554e692552.js +0 -1
  238. package/.next/static/chunks/8357.5dee1e0c4e5bb091.js +0 -1
  239. package/.next/static/chunks/8370-6537b6b27df58b23.js +0 -1
  240. package/.next/static/chunks/9062-2bc2d089f9c9c6ba.js +0 -1
  241. package/.next/static/chunks/9380.f198afbf0c6b5369.js +0 -1
  242. package/.next/static/chunks/app/_not-found/page-5a8c6a29f762fa58.js +0 -1
  243. package/.next/static/chunks/app/api/[...doc]/page-f0852f35f0fd1d44.js +0 -1
  244. package/.next/static/chunks/app/api/agent-requests/route-cf84f975aad4c719.js +0 -1
  245. package/.next/static/chunks/app/api/apps/install/route-cf84f975aad4c719.js +0 -1
  246. package/.next/static/chunks/app/api/apps/manifests/route-cf84f975aad4c719.js +0 -1
  247. package/.next/static/chunks/app/api/apps/static/[...path]/route-cf84f975aad4c719.js +0 -1
  248. package/.next/static/chunks/app/api/docs/plain/route-cf84f975aad4c719.js +0 -1
  249. package/.next/static/chunks/app/api/events/route-cf84f975aad4c719.js +0 -1
  250. package/.next/static/chunks/app/api/import-from-openclaw/[channel]/route-cf84f975aad4c719.js +0 -1
  251. package/.next/static/chunks/app/api/import-from-openclaw/route-cf84f975aad4c719.js +0 -1
  252. package/.next/static/chunks/app/api/import-from-openclaw/validate/[channel]/route-cf84f975aad4c719.js +0 -1
  253. package/.next/static/chunks/app/api/page-cc59bebcc0d2c01d.js +0 -1
  254. package/.next/static/chunks/app/api/restart/route-cf84f975aad4c719.js +0 -1
  255. package/.next/static/chunks/app/api/update/route-cf84f975aad4c719.js +0 -1
  256. package/.next/static/chunks/app/api/version/route-cf84f975aad4c719.js +0 -1
  257. package/.next/static/chunks/app/api/workspace/[id]/apps/[wid]/route-cf84f975aad4c719.js +0 -1
  258. package/.next/static/chunks/app/api/workspace/[id]/apps/route-cf84f975aad4c719.js +0 -1
  259. package/.next/static/chunks/app/api/workspace/[id]/export/route-cf84f975aad4c719.js +0 -1
  260. package/.next/static/chunks/app/api/workspace/[id]/route-cf84f975aad4c719.js +0 -1
  261. package/.next/static/chunks/app/api/workspace/config/route-cf84f975aad4c719.js +0 -1
  262. package/.next/static/chunks/app/api/workspace/import/route-cf84f975aad4c719.js +0 -1
  263. package/.next/static/chunks/app/api/workspace/route-cf84f975aad4c719.js +0 -1
  264. package/.next/static/chunks/app/app-legacy-do-not-use/page-efa348da049c5873.js +0 -1
  265. package/.next/static/chunks/app/approve/[actionId]/page-c862645e19371cea.js +0 -1
  266. package/.next/static/chunks/app/docs/[...doc]/page-8e2a2d036caab242.js +0 -1
  267. package/.next/static/chunks/app/docs/page-acf872a03ff79893.js +0 -1
  268. package/.next/static/chunks/app/error-04a18fd49a89ee17.js +0 -1
  269. package/.next/static/chunks/app/health/page-c9185854ed9c86d0.js +0 -1
  270. package/.next/static/chunks/app/hello/page-74c9f4deaa4b03dd.js +0 -1
  271. package/.next/static/chunks/app/layout-7093dda0d106f34d.js +0 -1
  272. package/.next/static/chunks/app/page-0ec7cf48550f71e6.js +0 -1
  273. package/.next/static/chunks/app/privacy/page-8e2d17079355c2cc.js +0 -1
  274. package/.next/static/chunks/app/share/[token]/page-5dd9b0418eee411f.js +0 -1
  275. package/.next/static/chunks/app/terms/page-8e2d17079355c2cc.js +0 -1
  276. package/.next/static/chunks/app/yo/layout-cf84f975aad4c719.js +0 -1
  277. package/.next/static/chunks/app/yo/page-48930746b135037e.js +0 -1
  278. package/.next/static/chunks/framework-a32a2a465584c0bc.js +0 -1
  279. package/.next/static/chunks/main-0f0f9142f74e7215.js +0 -1
  280. package/.next/static/chunks/main-app-24f0c92ba10af457.js +0 -1
  281. package/.next/static/chunks/pages/_app-4b3fb5e477a0267f.js +0 -1
  282. package/.next/static/chunks/pages/_error-c970d8b55ace1b48.js +0 -1
  283. package/.next/static/chunks/polyfills-42372ed130431b0a.js +0 -1
  284. package/.next/static/chunks/webpack-15ec0114c9d658c2.js +0 -1
  285. package/.next/static/css/35991998d1b5eff0.css +0 -3
  286. package/.next/static/q3rrQEmg9jZ5Lt-BCTiTK/_buildManifest.js +0 -1
  287. package/.next/static/q3rrQEmg9jZ5Lt-BCTiTK/_ssgManifest.js +0 -1
  288. package/.next/trace +0 -28
  289. package/.next/types/app/api/[...doc]/page.ts +0 -84
  290. package/.next/types/app/api/agent-requests/route.ts +0 -347
  291. package/.next/types/app/api/apps/install/route.ts +0 -347
  292. package/.next/types/app/api/apps/manifests/route.ts +0 -347
  293. package/.next/types/app/api/apps/static/[...path]/route.ts +0 -347
  294. package/.next/types/app/api/docs/plain/route.ts +0 -347
  295. package/.next/types/app/api/events/route.ts +0 -347
  296. package/.next/types/app/api/import-from-openclaw/[channel]/route.ts +0 -347
  297. package/.next/types/app/api/import-from-openclaw/route.ts +0 -347
  298. package/.next/types/app/api/import-from-openclaw/validate/[channel]/route.ts +0 -347
  299. package/.next/types/app/api/restart/route.ts +0 -347
  300. package/.next/types/app/api/update/route.ts +0 -347
  301. package/.next/types/app/api/version/route.ts +0 -347
  302. package/.next/types/app/api/workspace/[id]/apps/[wid]/route.ts +0 -347
  303. package/.next/types/app/api/workspace/[id]/apps/route.ts +0 -347
  304. package/.next/types/app/api/workspace/[id]/export/route.ts +0 -347
  305. package/.next/types/app/api/workspace/[id]/route.ts +0 -347
  306. package/.next/types/app/api/workspace/config/route.ts +0 -347
  307. package/.next/types/app/api/workspace/import/route.ts +0 -347
  308. package/.next/types/app/api/workspace/route.ts +0 -347
  309. package/.next/types/app/app-legacy-do-not-use/page.ts +0 -84
  310. package/.next/types/app/approve/[actionId]/page.ts +0 -84
  311. package/.next/types/app/docs/[...doc]/page.ts +0 -84
  312. package/.next/types/app/docs/page.ts +0 -84
  313. package/.next/types/app/health/page.ts +0 -84
  314. package/.next/types/app/hello/page.ts +0 -84
  315. package/.next/types/app/page.ts +0 -84
  316. package/.next/types/app/privacy/page.ts +0 -84
  317. package/.next/types/app/share/[token]/page.ts +0 -84
  318. package/.next/types/app/terms/page.ts +0 -84
  319. package/.next/types/app/yo/layout.ts +0 -84
  320. package/.next/types/app/yo/page.ts +0 -84
  321. package/.next/types/cache-life.d.ts +0 -141
  322. package/.next/types/package.json +0 -1
  323. package/.next/types/routes.d.ts +0 -105
  324. package/.next/types/validator.ts +0 -358
  325. package/apps/desktop-electron/main.js +0 -428
  326. package/docs/README.md +0 -38
  327. package/docs/ai-agents-workflow/API.md +0 -127
  328. package/docs/ai-agents-workflow/AUTH.md +0 -460
  329. package/docs/ai-agents-workflow/BEST-PRACTICES.md +0 -82
  330. package/docs/ai-agents-workflow/CLI.md +0 -189
  331. package/docs/ai-agents-workflow/MCP.md +0 -223
  332. package/docs/ai-agents-workflow/POLICY.md +0 -194
  333. package/docs/ai-agents-workflow/SKILLS.md +0 -135
  334. package/docs/ai-agents-workflow/credentials.md +0 -122
  335. package/docs/api/authentication.md +0 -80
  336. package/docs/api/secrets/api-keys.md +0 -28
  337. package/docs/api/secrets/credentials.md +0 -88
  338. package/docs/api/secrets/sharing.md +0 -48
  339. package/docs/api/system.md +0 -42
  340. package/docs/api/wallets/apps-strategies.md +0 -66
  341. package/docs/api/wallets/core.md +0 -46
  342. package/docs/api/wallets/data-portfolio.md +0 -42
  343. package/docs/how-to-auramaxx/TROUBLESHOOTING.md +0 -477
  344. package/docs/how-to-auramaxx/WORKING_WITH_SECRETS.md +0 -96
  345. package/docs/how-to-auramaxx/share-secret.md +0 -74
  346. package/docs/legacy/ADAPTERS.md +0 -471
  347. package/docs/legacy/APPS.md +0 -199
  348. package/docs/legacy/DESKTOP_ELECTRON.md +0 -26
  349. package/docs/legacy/DEVELOPING-APPS.md +0 -453
  350. package/docs/legacy/PACKAGING_POLICY.md +0 -19
  351. package/docs/legacy/PERMISSION.md +0 -138
  352. package/docs/legacy/PROTOCOL.md +0 -142
  353. package/docs/legacy/README.md +0 -21
  354. package/docs/legacy/WORKSPACE.md +0 -673
  355. package/docs/legacy/agent-auth.md +0 -13
  356. package/docs/legacy/aura-file.md +0 -48
  357. package/docs/legacy/external/HOW_TO_AURAMAXX/README.md +0 -45
  358. package/docs/legacy/external/README.md +0 -7
  359. package/docs/legacy/external/getting-started.md +0 -10
  360. package/docs/legacy/external/overview.md +0 -19
  361. package/docs/legacy/external/persona-paths.md +0 -7
  362. package/docs/legacy/external/why-aura.md +0 -7
  363. package/docs/legacy/specs/README.md +0 -6
  364. package/docs/legacy/specs/aura-open-protocol.md +0 -61
  365. package/docs/legacy/specs/aura-provider-plugin.md +0 -24
  366. package/docs/legacy/specs/aura-registry-model.md +0 -31
  367. package/docs/legacy/specs/fixtures/invalid-bad-key.aura +0 -1
  368. package/docs/legacy/specs/fixtures/invalid-bad-unicode-escape.aura +0 -1
  369. package/docs/legacy/specs/fixtures/invalid-duplicate-key.aura +0 -2
  370. package/docs/legacy/specs/fixtures/valid-basic.aura +0 -4
  371. package/docs/legacy/specs/fixtures/valid-provider-ref.aura +0 -1
  372. package/docs/legacy/specs/fixtures/valid-quoted-escapes.aura +0 -2
  373. package/docs/legacy/specs/task-256-create-edit-ui.md +0 -65
  374. package/docs/legacy/templates/README.md +0 -3
  375. package/docs/legacy/templates/RELEASE_NOTES_TEMPLATE.md +0 -22
  376. package/docs/legacy/wallet/AI.md +0 -508
  377. package/docs/legacy/wallet/DEVELOPING-STRATEGIES.md +0 -713
  378. package/docs/legacy/wallet/README.md +0 -47
  379. package/docs/legacy/wallet/STRATEGY.md +0 -89
  380. package/docs/quickstart/AGENT_SETUP.md +0 -181
  381. package/docs/why-auramaxx/ARCHITECTURE.md +0 -248
  382. package/docs/why-auramaxx/FEATURES.md +0 -117
  383. package/docs/why-auramaxx/security.md +0 -362
  384. package/next.config.ts +0 -38
  385. package/postcss.config.mjs +0 -8
  386. package/prisma/migrations/20260214170000_baseline/migration.sql +0 -511
  387. package/prisma/migrations/20260216214537_add_passkey_model/migration.sql +0 -18
  388. package/prisma/migrations/20260217150500_add_credential_access_audit/migration.sql +0 -31
  389. package/prisma/migrations/20260222090000_update_admin_ttl_default/migration.sql +0 -10
  390. package/prisma/migrations/20260227214000_update_agent_action_ttl_defaults/migration.sql +0 -19
  391. package/prisma/migrations/20260301225214_social_tables/migration.sql +0 -81
  392. package/prisma/migrations/20260302120000_add_notification_hash/migration.sql +0 -8
  393. package/prisma/migrations/20260302160000_add_public_key_hex/migration.sql +0 -5
  394. package/prisma/migrations/20260302170000_add_inbound_author_public_key/migration.sql +0 -5
  395. package/prisma/migrations/migration_lock.toml +0 -3
  396. package/prisma/schema.prisma +0 -542
  397. package/public/0a167e5e-4f52-4715-ae23-bf63d259a6b1.png +0 -0
  398. package/public/141ec92c-6780-4b23-838f-9a7bf1e91bb8.png +0 -0
  399. package/public/3afc4935-92cb-42af-9624-0b1341c12a5e.png +0 -0
  400. package/public/43947df5-dbcf-4e49-ab8b-41b9162c0410.png +0 -0
  401. package/public/5aeae9ce-0d38-49ea-8fd1-167892a04a85.png +0 -0
  402. package/public/660e4ea3-a3a6-4be4-a8ca-2cb74c51dfb5.png +0 -0
  403. package/public/733f02d7-6b58-4ba6-a5c8-d062cd205e1d.png +0 -0
  404. package/public/README.png +0 -0
  405. package/public/a32d65cb-95b0-4977-be6b-cf69f515afbe.png +0 -0
  406. package/public/agent1.png +0 -0
  407. package/public/agent10.png +0 -0
  408. package/public/agent2.png +0 -0
  409. package/public/agent3.png +0 -0
  410. package/public/agent4.png +0 -0
  411. package/public/agent5.png +0 -0
  412. package/public/agent6.png +0 -0
  413. package/public/agent7.png +0 -0
  414. package/public/agent8.png +0 -0
  415. package/public/agent9.png +0 -0
  416. package/public/c4938305-b811-4ccc-91db-94d309734827.png +0 -0
  417. package/public/f2ca6825-a4f3-4107-815c-51ee740dfc09.png +0 -0
  418. package/public/install.ps1 +0 -10
  419. package/public/install.sh +0 -11
  420. package/public/llm.txt +0 -2
  421. package/public/llms.txt +0 -39
  422. package/public/logo.webp +0 -0
  423. package/public/opengraph.webp +0 -0
  424. package/public/ss-dark1.png +0 -0
  425. package/public/ss-dark1.webp +0 -0
  426. package/public/ss-dark2.png +0 -0
  427. package/public/ss-dark2.webp +0 -0
  428. package/public/ss-dark3.png +0 -0
  429. package/public/ss-dark3.webp +0 -0
  430. package/public/ss-light1.png +0 -0
  431. package/public/ss-light1.webp +0 -0
  432. package/public/ss-light2.png +0 -0
  433. package/public/ss-light2.webp +0 -0
  434. package/public/ss-light3.png +0 -0
  435. package/public/ss-light3.webp +0 -0
  436. package/scripts/add-app.js +0 -245
  437. package/shared/credential-field-schema.ts +0 -270
  438. package/skills/auramaxx/HEARTBEAT.md +0 -97
  439. package/skills/auramaxx/SKILL.md +0 -136
  440. package/skills/auramaxx/docs/AGENT_SETUP.md +0 -160
  441. package/skills/auramaxx/docs/API.md +0 -127
  442. package/skills/auramaxx/docs/AUTH.md +0 -318
  443. package/skills/auramaxx/docs/CLI.md +0 -130
  444. package/skills/auramaxx/docs/MCP.md +0 -192
  445. package/skills/auramaxx/docs/TROUBLESHOOTING.md +0 -357
  446. package/skills/auramaxx/docs/WORKSPACE.md +0 -673
  447. package/skills/auramaxx/docs/security.md +0 -227
  448. package/skills/task-lifecycle/SKILL.md +0 -366
  449. package/src/app/UnlockPageClient.tsx +0 -2344
  450. package/src/app/api/[...doc]/page.tsx +0 -36
  451. package/src/app/api/agent-requests/route.ts +0 -30
  452. package/src/app/api/apps/install/route.ts +0 -132
  453. package/src/app/api/apps/manifests/route.ts +0 -16
  454. package/src/app/api/apps/static/[...path]/route.ts +0 -57
  455. package/src/app/api/docs/plain/route.ts +0 -74
  456. package/src/app/api/events/route.ts +0 -92
  457. package/src/app/api/import-from-openclaw/[channel]/route.ts +0 -62
  458. package/src/app/api/import-from-openclaw/lib.ts +0 -672
  459. package/src/app/api/import-from-openclaw/route.ts +0 -88
  460. package/src/app/api/import-from-openclaw/validate/[channel]/route.ts +0 -88
  461. package/src/app/api/page.tsx +0 -299
  462. package/src/app/api/restart/route.ts +0 -111
  463. package/src/app/api/update/route.ts +0 -268
  464. package/src/app/api/version/route.ts +0 -79
  465. package/src/app/api/workspace/[id]/apps/[wid]/route.ts +0 -119
  466. package/src/app/api/workspace/[id]/apps/route.ts +0 -81
  467. package/src/app/api/workspace/[id]/export/route.ts +0 -67
  468. package/src/app/api/workspace/[id]/route.ts +0 -168
  469. package/src/app/api/workspace/auth.ts +0 -40
  470. package/src/app/api/workspace/config/route.ts +0 -121
  471. package/src/app/api/workspace/import/route.ts +0 -127
  472. package/src/app/api/workspace/route.ts +0 -116
  473. package/src/app/app-legacy-do-not-use/page.tsx +0 -2247
  474. package/src/app/apple-icon.png +0 -0
  475. package/src/app/approve/[actionId]/page.tsx +0 -428
  476. package/src/app/docs/DocsPageContent.tsx +0 -283
  477. package/src/app/docs/[...doc]/page.tsx +0 -41
  478. package/src/app/docs/page.tsx +0 -38
  479. package/src/app/error.tsx +0 -125
  480. package/src/app/favicon.ico +0 -0
  481. package/src/app/globals.css +0 -940
  482. package/src/app/health/page.tsx +0 -5
  483. package/src/app/hello/page.tsx +0 -102
  484. package/src/app/icon.png +0 -0
  485. package/src/app/layout.tsx +0 -40
  486. package/src/app/page.tsx +0 -38
  487. package/src/app/privacy/page.tsx +0 -63
  488. package/src/app/providers.tsx +0 -87
  489. package/src/app/share/[token]/page.tsx +0 -295
  490. package/src/app/terms/page.tsx +0 -80
  491. package/src/app/yo/layout.tsx +0 -38
  492. package/src/app/yo/page.tsx +0 -614
  493. package/src/components/AgentPicker.tsx +0 -278
  494. package/src/components/ChainSelector.tsx +0 -44
  495. package/src/components/CreateAgentModal.tsx +0 -192
  496. package/src/components/HumanActionBar.tsx +0 -865
  497. package/src/components/NotificationDrawer.tsx +0 -455
  498. package/src/components/PasskeyEnrollmentPrompt.tsx +0 -974
  499. package/src/components/UpdateBanner.tsx +0 -171
  500. package/src/components/agent/AgentSidebar.tsx +0 -921
  501. package/src/components/agent/ApiKeysConsole.tsx +0 -1272
  502. package/src/components/agent/AuditConsole.tsx +0 -600
  503. package/src/components/agent/CredentialAgent.tsx +0 -1718
  504. package/src/components/agent/CredentialDetail.tsx +0 -710
  505. package/src/components/agent/CredentialEmpty.tsx +0 -55
  506. package/src/components/agent/CredentialField.tsx +0 -594
  507. package/src/components/agent/CredentialForm.tsx +0 -1867
  508. package/src/components/agent/CredentialList.tsx +0 -299
  509. package/src/components/agent/CredentialRow.tsx +0 -138
  510. package/src/components/agent/CredentialShareModal.tsx +0 -285
  511. package/src/components/agent/CredentialWalletWidget.tsx +0 -103
  512. package/src/components/agent/DocsConsole.tsx +0 -113
  513. package/src/components/agent/ImportCredentialsModal.tsx +0 -578
  514. package/src/components/agent/LargeTypeModal.tsx +0 -88
  515. package/src/components/agent/PasswordGenerator.tsx +0 -232
  516. package/src/components/agent/TOTPDisplay.tsx +0 -108
  517. package/src/components/agent/TotpSetupPanel.tsx +0 -198
  518. package/src/components/agent/credentialDisplayName.ts +0 -42
  519. package/src/components/agent/credentialFormName.ts +0 -150
  520. package/src/components/agent/credentialListSort.ts +0 -56
  521. package/src/components/agent/hooks/useAgentKeyboardShortcuts.ts +0 -69
  522. package/src/components/agent/types.ts +0 -56
  523. package/src/components/agents/AgentsView.tsx +0 -1035
  524. package/src/components/apps/AgentKeysApp.tsx +0 -490
  525. package/src/components/apps/App.tsx +0 -153
  526. package/src/components/apps/AppGrid.tsx +0 -15
  527. package/src/components/apps/DetailedAddressDrawer.tsx +0 -325
  528. package/src/components/apps/DraggableApp.tsx +0 -562
  529. package/src/components/apps/IFrameApp.tsx +0 -73
  530. package/src/components/apps/LogsApp.tsx +0 -360
  531. package/src/components/apps/SendApp.tsx +0 -394
  532. package/src/components/apps/SetupWizardApp.tsx +0 -1004
  533. package/src/components/apps/SystemDefaultsApp.tsx +0 -845
  534. package/src/components/apps/ThirdPartyApp.tsx +0 -428
  535. package/src/components/apps/TokenApp.tsx +0 -319
  536. package/src/components/apps/TransactionsApp.tsx +0 -438
  537. package/src/components/apps/WalletDetailApp.tsx +0 -1505
  538. package/src/components/apps/index.ts +0 -13
  539. package/src/components/design-system/Button.tsx +0 -88
  540. package/src/components/design-system/ChainIndicator.tsx +0 -65
  541. package/src/components/design-system/ChainSelector.tsx +0 -147
  542. package/src/components/design-system/ConfirmationModal.tsx +0 -107
  543. package/src/components/design-system/ConfirmationPopover.tsx +0 -81
  544. package/src/components/design-system/DownloadButton.tsx +0 -149
  545. package/src/components/design-system/Drawer.tsx +0 -133
  546. package/src/components/design-system/FilterDropdown.tsx +0 -183
  547. package/src/components/design-system/ItemPicker.tsx +0 -157
  548. package/src/components/design-system/Modal.tsx +0 -314
  549. package/src/components/design-system/Popover.tsx +0 -142
  550. package/src/components/design-system/TextAreaInput.tsx +0 -78
  551. package/src/components/design-system/TextInput.tsx +0 -85
  552. package/src/components/design-system/Toggle.tsx +0 -65
  553. package/src/components/design-system/TyvekCollapsibleSection.tsx +0 -55
  554. package/src/components/design-system/index.ts +0 -15
  555. package/src/components/docs/ClientSideMarkdown.tsx +0 -51
  556. package/src/components/docs/DocsSearchBar.tsx +0 -118
  557. package/src/components/docs/DocsThemeToggle.tsx +0 -38
  558. package/src/components/docs/PersistentDocGroup.tsx +0 -91
  559. package/src/components/docs/ShareUrlButton.tsx +0 -33
  560. package/src/components/docs/SidebarScrollMemory.tsx +0 -56
  561. package/src/components/health/CredentialHealthDashboard.tsx +0 -214
  562. package/src/components/hub/HubView.tsx +0 -58
  563. package/src/components/icons/ChainIcons.tsx +0 -72
  564. package/src/components/layout/AppStoreDrawer.tsx +0 -369
  565. package/src/components/layout/ContentArea.tsx +0 -21
  566. package/src/components/layout/CreateViewModal.tsx +0 -88
  567. package/src/components/layout/LeftRail.tsx +0 -407
  568. package/src/components/layout/SettingsDrawer.tsx +0 -1200
  569. package/src/components/layout/TabBar.tsx +0 -284
  570. package/src/components/layout/ViewShell.tsx +0 -125
  571. package/src/components/layout/WalletSidebar.tsx +0 -1043
  572. package/src/components/layout/index.ts +0 -7
  573. package/src/components/marketing/AuraMaxxSpecOverlay.tsx +0 -653
  574. package/src/components/marketing/DeviceMorphExperience.tsx +0 -216
  575. package/src/components/social/PrimaryHubRegistrationGate.tsx +0 -260
  576. package/src/components/social/SocialView.tsx +0 -904
  577. package/src/context/AuthContext.tsx +0 -365
  578. package/src/context/PriceContext.tsx +0 -113
  579. package/src/context/ThemeContext.tsx +0 -164
  580. package/src/context/WebSocketContext.tsx +0 -269
  581. package/src/context/WorkspaceContext.tsx +0 -668
  582. package/src/hooks/index.ts +0 -4
  583. package/src/hooks/useAgentActions.ts +0 -552
  584. package/src/hooks/useBalance.ts +0 -103
  585. package/src/hooks/useBalances.ts +0 -129
  586. package/src/hooks/useSocialNotifications.ts +0 -123
  587. package/src/hooks/useTheme.ts +0 -156
  588. package/src/hooks/useUpdateChecker.ts +0 -245
  589. package/src/instrumentation.ts +0 -12
  590. package/src/lib/agent-crypto.ts +0 -129
  591. package/src/lib/api-docs.ts +0 -158
  592. package/src/lib/api.ts +0 -474
  593. package/src/lib/app-loader.ts +0 -148
  594. package/src/lib/app-registry.ts +0 -178
  595. package/src/lib/app-sdk.ts +0 -157
  596. package/src/lib/audit-console-adapter.ts +0 -151
  597. package/src/lib/auth-client.ts +0 -75
  598. package/src/lib/config.ts +0 -74
  599. package/src/lib/credential-field-schema.ts +0 -11
  600. package/src/lib/crypto.ts +0 -112
  601. package/src/lib/db.ts +0 -21
  602. package/src/lib/docs.ts +0 -617
  603. package/src/lib/events.ts +0 -372
  604. package/src/lib/markdown.ts +0 -39
  605. package/src/lib/pino.ts +0 -82
  606. package/src/lib/social-client.ts +0 -319
  607. package/src/lib/theme-handlers.ts +0 -168
  608. package/src/lib/theme.ts +0 -351
  609. package/src/lib/tokenData.ts +0 -378
  610. package/src/lib/totp-import.ts +0 -57
  611. package/src/lib/view-registry.ts +0 -75
  612. package/src/lib/websocket-server.ts +0 -302
  613. package/src/lib/websocket-setup.ts +0 -79
  614. package/src/lib/wordlist.ts +0 -2050
  615. package/src/lib/workspace-handlers.ts +0 -285
  616. package/src/server/abi/SwapHelper.json +0 -438
  617. package/src/server/cli/approval.ts +0 -447
  618. package/src/server/cli/commands/actions.ts +0 -469
  619. package/src/server/cli/commands/agent.ts +0 -1760
  620. package/src/server/cli/commands/api.ts +0 -181
  621. package/src/server/cli/commands/apikey.ts +0 -278
  622. package/src/server/cli/commands/app.ts +0 -204
  623. package/src/server/cli/commands/approve.ts +0 -209
  624. package/src/server/cli/commands/auth.ts +0 -885
  625. package/src/server/cli/commands/cron.ts +0 -24
  626. package/src/server/cli/commands/diary.ts +0 -273
  627. package/src/server/cli/commands/doctor.ts +0 -1267
  628. package/src/server/cli/commands/env.ts +0 -476
  629. package/src/server/cli/commands/experimental.ts +0 -69
  630. package/src/server/cli/commands/init.ts +0 -973
  631. package/src/server/cli/commands/lock.ts +0 -109
  632. package/src/server/cli/commands/mcp.ts +0 -285
  633. package/src/server/cli/commands/nuke.ts +0 -156
  634. package/src/server/cli/commands/quickhack.ts +0 -86
  635. package/src/server/cli/commands/register-agent.ts +0 -181
  636. package/src/server/cli/commands/release-check.ts +0 -231
  637. package/src/server/cli/commands/restart.ts +0 -61
  638. package/src/server/cli/commands/restore.ts +0 -314
  639. package/src/server/cli/commands/service.ts +0 -406
  640. package/src/server/cli/commands/shell-hook.ts +0 -512
  641. package/src/server/cli/commands/skill.ts +0 -280
  642. package/src/server/cli/commands/social.ts +0 -648
  643. package/src/server/cli/commands/start.ts +0 -260
  644. package/src/server/cli/commands/status.ts +0 -59
  645. package/src/server/cli/commands/stop.ts +0 -36
  646. package/src/server/cli/commands/token.ts +0 -180
  647. package/src/server/cli/commands/unlock.ts +0 -50
  648. package/src/server/cli/commands/wallet.ts +0 -210
  649. package/src/server/cli/index.ts +0 -285
  650. package/src/server/cli/lib/approval-actions.ts +0 -21
  651. package/src/server/cli/lib/approval-context.ts +0 -347
  652. package/src/server/cli/lib/approval-poll.ts +0 -142
  653. package/src/server/cli/lib/aura-parser.ts +0 -64
  654. package/src/server/cli/lib/auth-bootstrap.ts +0 -72
  655. package/src/server/cli/lib/credential-create.ts +0 -74
  656. package/src/server/cli/lib/credential-resolve.ts +0 -300
  657. package/src/server/cli/lib/dotenv-migrate.ts +0 -116
  658. package/src/server/cli/lib/dotenv-parser.ts +0 -146
  659. package/src/server/cli/lib/escalation.ts +0 -238
  660. package/src/server/cli/lib/http.ts +0 -105
  661. package/src/server/cli/lib/init-steps.ts +0 -76
  662. package/src/server/cli/lib/local-agent-trust.ts +0 -46
  663. package/src/server/cli/lib/lock-unlock-helper.ts +0 -71
  664. package/src/server/cli/lib/process.ts +0 -536
  665. package/src/server/cli/socket.ts +0 -583
  666. package/src/server/cli/transport-client.ts +0 -47
  667. package/src/server/cron/index.ts +0 -133
  668. package/src/server/cron/job.ts +0 -31
  669. package/src/server/cron/jobs/balance-sync.ts +0 -436
  670. package/src/server/cron/jobs/incoming-scan.ts +0 -506
  671. package/src/server/cron/jobs/native-price.ts +0 -70
  672. package/src/server/cron/jobs/orphan-cleanup.ts +0 -40
  673. package/src/server/cron/jobs/social-inbound.ts +0 -596
  674. package/src/server/cron/jobs/social-outbound.ts +0 -70
  675. package/src/server/cron/jobs/strategy-runner.ts +0 -175
  676. package/src/server/cron/scheduler.ts +0 -125
  677. package/src/server/index.ts +0 -438
  678. package/src/server/lib/adapters/delivery.ts +0 -508
  679. package/src/server/lib/adapters/discord.ts +0 -141
  680. package/src/server/lib/adapters/factory.ts +0 -123
  681. package/src/server/lib/adapters/index.ts +0 -21
  682. package/src/server/lib/adapters/router.ts +0 -297
  683. package/src/server/lib/adapters/telegram.ts +0 -646
  684. package/src/server/lib/adapters/types.ts +0 -89
  685. package/src/server/lib/adapters/webhook.ts +0 -95
  686. package/src/server/lib/adapters/whatsapp-native.ts +0 -276
  687. package/src/server/lib/adapters/whatsapp.ts +0 -904
  688. package/src/server/lib/address.ts +0 -49
  689. package/src/server/lib/agent-auth/contracts.ts +0 -1194
  690. package/src/server/lib/agent-profiles.ts +0 -430
  691. package/src/server/lib/ai.ts +0 -286
  692. package/src/server/lib/api-registry/contracts.ts +0 -86
  693. package/src/server/lib/api-registry/validation.ts +0 -172
  694. package/src/server/lib/apikey-migration.ts +0 -258
  695. package/src/server/lib/app-installer.ts +0 -505
  696. package/src/server/lib/app-tokens.ts +0 -247
  697. package/src/server/lib/approval-flow.ts +0 -139
  698. package/src/server/lib/approval-link.ts +0 -27
  699. package/src/server/lib/auth.ts +0 -324
  700. package/src/server/lib/auto-execute.ts +0 -160
  701. package/src/server/lib/batch.ts +0 -242
  702. package/src/server/lib/cold.ts +0 -1013
  703. package/src/server/lib/config.ts +0 -410
  704. package/src/server/lib/credential-access-audit.ts +0 -85
  705. package/src/server/lib/credential-access-policy.ts +0 -112
  706. package/src/server/lib/credential-agent.ts +0 -77
  707. package/src/server/lib/credential-health.ts +0 -343
  708. package/src/server/lib/credential-import.ts +0 -614
  709. package/src/server/lib/credential-scope.ts +0 -102
  710. package/src/server/lib/credential-shares.ts +0 -190
  711. package/src/server/lib/credential-transport.ts +0 -556
  712. package/src/server/lib/credentials.ts +0 -422
  713. package/src/server/lib/crypto.ts +0 -8
  714. package/src/server/lib/db.ts +0 -58
  715. package/src/server/lib/defaults.ts +0 -397
  716. package/src/server/lib/dex/index.ts +0 -80
  717. package/src/server/lib/dex/relay.ts +0 -235
  718. package/src/server/lib/dex/types.ts +0 -59
  719. package/src/server/lib/dex/uniswap.ts +0 -370
  720. package/src/server/lib/diary.ts +0 -61
  721. package/src/server/lib/dont-ask-again-policy.ts +0 -41
  722. package/src/server/lib/e2e-agent/artifacts.ts +0 -36
  723. package/src/server/lib/e2e-agent/contracts.ts +0 -112
  724. package/src/server/lib/e2e-agent/validation.ts +0 -135
  725. package/src/server/lib/encrypt.ts +0 -114
  726. package/src/server/lib/error.ts +0 -20
  727. package/src/server/lib/escalation-contract.ts +0 -140
  728. package/src/server/lib/escalation-error-codes.ts +0 -26
  729. package/src/server/lib/escalation-responder.ts +0 -729
  730. package/src/server/lib/escalation-route-registry.ts +0 -138
  731. package/src/server/lib/events.ts +0 -220
  732. package/src/server/lib/feature-flags.ts +0 -96
  733. package/src/server/lib/hot.ts +0 -357
  734. package/src/server/lib/hub-auth.ts +0 -159
  735. package/src/server/lib/human-action-summary.ts +0 -80
  736. package/src/server/lib/key-fingerprint.ts +0 -28
  737. package/src/server/lib/logger.ts +0 -340
  738. package/src/server/lib/migrate-agent-profiles.ts +0 -96
  739. package/src/server/lib/network.ts +0 -137
  740. package/src/server/lib/notifications.ts +0 -241
  741. package/src/server/lib/oauth2-refresh.ts +0 -241
  742. package/src/server/lib/oursecret.ts +0 -87
  743. package/src/server/lib/passkey-credential.ts +0 -360
  744. package/src/server/lib/passkey.ts +0 -68
  745. package/src/server/lib/permissions.ts +0 -340
  746. package/src/server/lib/pino.ts +0 -24
  747. package/src/server/lib/policy-preview.ts +0 -138
  748. package/src/server/lib/price.ts +0 -338
  749. package/src/server/lib/prices.ts +0 -34
  750. package/src/server/lib/project-scope.ts +0 -326
  751. package/src/server/lib/redaction.ts +0 -108
  752. package/src/server/lib/resolve-action.ts +0 -398
  753. package/src/server/lib/resolve.ts +0 -36
  754. package/src/server/lib/secret-env.ts +0 -18
  755. package/src/server/lib/secret-gist-share.ts +0 -296
  756. package/src/server/lib/sessions.ts +0 -634
  757. package/src/server/lib/social/create.ts +0 -176
  758. package/src/server/lib/social/global-aura-id.ts +0 -115
  759. package/src/server/lib/social/hub-rpc-client.ts +0 -99
  760. package/src/server/lib/social/hub-session.ts +0 -6
  761. package/src/server/lib/social/public-key.ts +0 -32
  762. package/src/server/lib/social/register.ts +0 -162
  763. package/src/server/lib/social/sign.ts +0 -95
  764. package/src/server/lib/social/sync.ts +0 -301
  765. package/src/server/lib/socket-path.ts +0 -76
  766. package/src/server/lib/solana/connection.ts +0 -26
  767. package/src/server/lib/solana/jupiter.ts +0 -128
  768. package/src/server/lib/solana/transfer.ts +0 -108
  769. package/src/server/lib/solana/wallet.ts +0 -136
  770. package/src/server/lib/strategy/emits.ts +0 -21
  771. package/src/server/lib/strategy/engine.ts +0 -1313
  772. package/src/server/lib/strategy/executor.ts +0 -115
  773. package/src/server/lib/strategy/hook-context.ts +0 -159
  774. package/src/server/lib/strategy/hooks.ts +0 -1023
  775. package/src/server/lib/strategy/index.ts +0 -28
  776. package/src/server/lib/strategy/installer.ts +0 -305
  777. package/src/server/lib/strategy/loader.ts +0 -256
  778. package/src/server/lib/strategy/message.ts +0 -237
  779. package/src/server/lib/strategy/repository.ts +0 -218
  780. package/src/server/lib/strategy/session-logger.ts +0 -693
  781. package/src/server/lib/strategy/sources.ts +0 -288
  782. package/src/server/lib/strategy/state.ts +0 -189
  783. package/src/server/lib/strategy/templates.ts +0 -403
  784. package/src/server/lib/strategy/tick.ts +0 -404
  785. package/src/server/lib/strategy/types.ts +0 -230
  786. package/src/server/lib/swap.ts +0 -3
  787. package/src/server/lib/temp-policy.ts +0 -413
  788. package/src/server/lib/temp.ts +0 -86
  789. package/src/server/lib/token-metadata.ts +0 -86
  790. package/src/server/lib/token-safety.ts +0 -200
  791. package/src/server/lib/token-search.ts +0 -444
  792. package/src/server/lib/totp.ts +0 -194
  793. package/src/server/lib/transactions.ts +0 -123
  794. package/src/server/lib/transport.ts +0 -84
  795. package/src/server/lib/txhistory/decoder.ts +0 -262
  796. package/src/server/lib/txhistory/enricher.ts +0 -652
  797. package/src/server/lib/txhistory/index.ts +0 -391
  798. package/src/server/lib/txhistory/signatures.ts +0 -59
  799. package/src/server/lib/update-check.ts +0 -48
  800. package/src/server/lib/verified-summary.ts +0 -414
  801. package/src/server/lib/version-check-cache.ts +0 -23
  802. package/src/server/lib/view-registry.ts +0 -80
  803. package/src/server/mcp/profile-policy.ts +0 -30
  804. package/src/server/mcp/server.ts +0 -2887
  805. package/src/server/mcp/tools.ts +0 -863
  806. package/src/server/middleware/auth.ts +0 -117
  807. package/src/server/middleware/requestLogger.ts +0 -86
  808. package/src/server/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
  809. package/src/server/routes/actions.ts +0 -607
  810. package/src/server/routes/adapters.ts +0 -1256
  811. package/src/server/routes/addressbook.ts +0 -129
  812. package/src/server/routes/agent-hub.ts +0 -276
  813. package/src/server/routes/agent-profiles.ts +0 -208
  814. package/src/server/routes/ai.ts +0 -34
  815. package/src/server/routes/apikeys.ts +0 -344
  816. package/src/server/routes/apps.ts +0 -623
  817. package/src/server/routes/auth.ts +0 -740
  818. package/src/server/routes/backup.ts +0 -404
  819. package/src/server/routes/batch.ts +0 -270
  820. package/src/server/routes/bookmarks.ts +0 -178
  821. package/src/server/routes/credential-agents.ts +0 -159
  822. package/src/server/routes/credential-shares.ts +0 -380
  823. package/src/server/routes/credentials.ts +0 -2545
  824. package/src/server/routes/dashboard.ts +0 -97
  825. package/src/server/routes/defaults.ts +0 -124
  826. package/src/server/routes/flags.ts +0 -11
  827. package/src/server/routes/fund.ts +0 -252
  828. package/src/server/routes/heartbeat.ts +0 -511
  829. package/src/server/routes/import.ts +0 -359
  830. package/src/server/routes/launch.ts +0 -703
  831. package/src/server/routes/lock.ts +0 -54
  832. package/src/server/routes/logs.ts +0 -78
  833. package/src/server/routes/nuke.ts +0 -136
  834. package/src/server/routes/passkey-credentials.ts +0 -99
  835. package/src/server/routes/passkey.ts +0 -372
  836. package/src/server/routes/portfolio.ts +0 -217
  837. package/src/server/routes/price.ts +0 -63
  838. package/src/server/routes/resolve.ts +0 -31
  839. package/src/server/routes/security.ts +0 -45
  840. package/src/server/routes/send-evm.ts +0 -286
  841. package/src/server/routes/send-solana.ts +0 -315
  842. package/src/server/routes/send.ts +0 -178
  843. package/src/server/routes/setup.ts +0 -210
  844. package/src/server/routes/social.ts +0 -869
  845. package/src/server/routes/strategy.ts +0 -901
  846. package/src/server/routes/swap-evm.ts +0 -386
  847. package/src/server/routes/swap-solana.ts +0 -203
  848. package/src/server/routes/swap.ts +0 -372
  849. package/src/server/routes/token.ts +0 -248
  850. package/src/server/routes/unlock.ts +0 -507
  851. package/src/server/routes/verified-credentials.ts +0 -312
  852. package/src/server/routes/views.ts +0 -41
  853. package/src/server/routes/wallet-assets.ts +0 -364
  854. package/src/server/routes/wallet-transactions.ts +0 -517
  855. package/src/server/routes/wallet.ts +0 -711
  856. package/src/server/test-data/agent-primary.json +0 -12
  857. package/src/server/test-data/agent-smbe0i.json +0 -14
  858. package/src/server/test-data/agent-wbl0v6.json +0 -14
  859. package/src/server/test-data/config.json +0 -33
  860. package/src/server/test-data/credentials/cred-1sj0yr5a.json +0 -23
  861. package/src/server/test-data/credentials/cred-469oz33y.json +0 -19
  862. package/src/server/test-data/credentials/cred-6h2h6oh7.json +0 -23
  863. package/src/server/test-data/credentials/cred-invrd1h9.json +0 -22
  864. package/src/server/test-data/credentials-archive/cred-nd7pngdm.json +0 -22
  865. package/src/server/test-data/debug-worker/agent-3vovb2.json +0 -14
  866. package/src/server/test-data/debug-worker/agent-ppchyx.json +0 -14
  867. package/src/server/test-data/debug-worker/agent-primary.json +0 -12
  868. package/src/server/test-data/debug-worker/agent-tm8bce.json +0 -14
  869. package/src/server/test-data/debug-worker/credentials/cred-bawnen1r.json +0 -23
  870. package/src/server/test-data/debug-worker/credentials/cred-wkqqa5sn.json +0 -23
  871. package/src/server/test-data/debug-worker/test.db +0 -0
  872. package/src/server/test-data/template.db +0 -0
  873. package/src/server/test-data/worker-1/test.db +0 -0
  874. package/src/server/test-data/worker-10/test.db +0 -0
  875. package/src/server/test-data/worker-11/test.db +0 -0
  876. package/src/server/test-data/worker-12/test.db +0 -0
  877. package/src/server/test-data/worker-13/test.db +0 -0
  878. package/src/server/test-data/worker-14/test.db +0 -0
  879. package/src/server/test-data/worker-15/test.db +0 -0
  880. package/src/server/test-data/worker-2/test.db +0 -0
  881. package/src/server/test-data/worker-3/test.db +0 -0
  882. package/src/server/test-data/worker-4/test.db +0 -0
  883. package/src/server/test-data/worker-5/test.db +0 -0
  884. package/src/server/test-data/worker-6/test.db +0 -0
  885. package/src/server/test-data/worker-7/test.db +0 -0
  886. package/src/server/test-data/worker-8/test.db +0 -0
  887. package/src/server/test-data/worker-9/test.db +0 -0
  888. package/src/server/tests/ai-integration/harness.ts +0 -235
  889. package/src/server/tests/ai-integration/live-harness.ts +0 -248
  890. package/src/server/tests/ai-integration/live.test.ts +0 -394
  891. package/src/server/tests/ai-integration/prompts.md +0 -396
  892. package/src/server/tests/ai-integration/scenarios.test.ts +0 -593
  893. package/src/server/tests/ai-integration/vitest.config.ts +0 -29
  894. package/src/server/tests/ai-integration/vitest.live.config.ts +0 -30
  895. package/src/server/tests/app-installer.test.ts +0 -406
  896. package/src/server/tests/auth/apikeys-validate.test.ts +0 -326
  897. package/src/server/tests/auth/apikeys.test.ts +0 -352
  898. package/src/server/tests/auth/approval-permissions-regression.test.ts +0 -641
  899. package/src/server/tests/auth/middleware.test.ts +0 -236
  900. package/src/server/tests/auth/permissions.test.ts +0 -387
  901. package/src/server/tests/cli/actions-auth.test.ts +0 -87
  902. package/src/server/tests/cli/agent-auth.test.ts +0 -1682
  903. package/src/server/tests/cli/agent-list-filters.test.ts +0 -150
  904. package/src/server/tests/cli/agent-share-gist.test.ts +0 -203
  905. package/src/server/tests/cli/agent.test.ts +0 -206
  906. package/src/server/tests/cli/auth-action-flag.test.ts +0 -135
  907. package/src/server/tests/cli/bin-entrypoint.test.ts +0 -438
  908. package/src/server/tests/cli/create-command.test.ts +0 -73
  909. package/src/server/tests/cli/credential-resolve.test.ts +0 -86
  910. package/src/server/tests/cli/doctor.test.ts +0 -154
  911. package/src/server/tests/cli/env-check-server-agent.test.ts +0 -114
  912. package/src/server/tests/cli/env.test.ts +0 -107
  913. package/src/server/tests/cli/escalation.test.ts +0 -140
  914. package/src/server/tests/cli/http.test.ts +0 -176
  915. package/src/server/tests/cli/init-flow.test.ts +0 -209
  916. package/src/server/tests/cli/init-runtime.test.ts +0 -144
  917. package/src/server/tests/cli/init-steps.test.ts +0 -184
  918. package/src/server/tests/cli/local-agent-trust.test.ts +0 -92
  919. package/src/server/tests/cli/process.test.ts +0 -453
  920. package/src/server/tests/cli/prompt-select.test.ts +0 -129
  921. package/src/server/tests/cli/quickhack.test.ts +0 -27
  922. package/src/server/tests/cli/restart-run.test.ts +0 -75
  923. package/src/server/tests/cli/service.test.ts +0 -138
  924. package/src/server/tests/cli/social.test.ts +0 -83
  925. package/src/server/tests/cli/socket.test.ts +0 -324
  926. package/src/server/tests/cli/start-run.test.ts +0 -185
  927. package/src/server/tests/cli/start.test.ts +0 -44
  928. package/src/server/tests/cli/taskctl-lock-smoke.test.ts +0 -136
  929. package/src/server/tests/cli/token.test.ts +0 -61
  930. package/src/server/tests/cli/wallet.test.ts +0 -23
  931. package/src/server/tests/credential-import.test.ts +0 -362
  932. package/src/server/tests/cron/incoming-scan.test.ts +0 -778
  933. package/src/server/tests/cron/native-price.test.ts +0 -121
  934. package/src/server/tests/cron/orphan-cleanup.test.ts +0 -94
  935. package/src/server/tests/cron/scheduler.test.ts +0 -161
  936. package/src/server/tests/cron/social-inbound-followers.unit.test.ts +0 -164
  937. package/src/server/tests/cron/social-inbound-staleness.test.ts +0 -193
  938. package/src/server/tests/cron/social-outbound.test.ts +0 -252
  939. package/src/server/tests/cron/strategy-runner.test.ts +0 -158
  940. package/src/server/tests/docs/job-docs-validation.test.ts +0 -16
  941. package/src/server/tests/dotenv-parser.test.ts +0 -121
  942. package/src/server/tests/e2e-agent/artifacts.test.ts +0 -35
  943. package/src/server/tests/e2e-agent/ci/nightly-set.json +0 -7
  944. package/src/server/tests/e2e-agent/ci/pr-smoke-set.json +0 -5
  945. package/src/server/tests/e2e-agent/ci-lanes.test.ts +0 -16
  946. package/src/server/tests/e2e-agent/runner.ts +0 -43
  947. package/src/server/tests/e2e-agent/scenarios/aura-onboarding-sanity.scenario.yaml +0 -16
  948. package/src/server/tests/e2e-agent/scenarios/credential-create-basic.scenario.yaml +0 -12
  949. package/src/server/tests/e2e-agent/scenarios/credential-read-basic.scenario.yaml +0 -16
  950. package/src/server/tests/e2e-agent/scenarios/save-on-submit-accept.scenario.yaml +0 -10
  951. package/src/server/tests/e2e-agent/scenarios/totp-retrieval-seeded.scenario.yaml +0 -12
  952. package/src/server/tests/e2e-agent/validation.test.ts +0 -129
  953. package/src/server/tests/e2e.test.ts +0 -295
  954. package/src/server/tests/endpoints/actions.test.ts +0 -1067
  955. package/src/server/tests/endpoints/address-transactions.test.ts +0 -223
  956. package/src/server/tests/endpoints/addressbook.test.ts +0 -225
  957. package/src/server/tests/endpoints/agent-profiles.test.ts +0 -117
  958. package/src/server/tests/endpoints/agent.test.ts +0 -713
  959. package/src/server/tests/endpoints/approve-action.test.ts +0 -107
  960. package/src/server/tests/endpoints/apps.test.ts +0 -561
  961. package/src/server/tests/endpoints/auth.test.ts +0 -565
  962. package/src/server/tests/endpoints/batch.test.ts +0 -352
  963. package/src/server/tests/endpoints/bookmarks.test.ts +0 -329
  964. package/src/server/tests/endpoints/credential-access-audit.test.ts +0 -194
  965. package/src/server/tests/endpoints/credential-ops.test.ts +0 -93
  966. package/src/server/tests/endpoints/credential-shares.test.ts +0 -249
  967. package/src/server/tests/endpoints/credentials.test.ts +0 -1786
  968. package/src/server/tests/endpoints/defaults.test.ts +0 -162
  969. package/src/server/tests/endpoints/escalation-migration-gate.test.ts +0 -488
  970. package/src/server/tests/endpoints/fund.test.ts +0 -299
  971. package/src/server/tests/endpoints/heartbeat.test.ts +0 -274
  972. package/src/server/tests/endpoints/import.test.ts +0 -192
  973. package/src/server/tests/endpoints/launch.test.ts +0 -734
  974. package/src/server/tests/endpoints/passkey-credentials.test.ts +0 -167
  975. package/src/server/tests/endpoints/passkey.test.ts +0 -219
  976. package/src/server/tests/endpoints/portfolio.test.ts +0 -497
  977. package/src/server/tests/endpoints/price.test.ts +0 -237
  978. package/src/server/tests/endpoints/rate-limit.test.ts +0 -465
  979. package/src/server/tests/endpoints/send.test.ts +0 -499
  980. package/src/server/tests/endpoints/setup.test.ts +0 -194
  981. package/src/server/tests/endpoints/solana-fund.test.ts +0 -218
  982. package/src/server/tests/endpoints/solana-send.test.ts +0 -215
  983. package/src/server/tests/endpoints/solana-swap.test.ts +0 -280
  984. package/src/server/tests/endpoints/solana-wallet.test.ts +0 -223
  985. package/src/server/tests/endpoints/strategy-routes.test.ts +0 -602
  986. package/src/server/tests/endpoints/swap.test.ts +0 -589
  987. package/src/server/tests/endpoints/token-balance.test.ts +0 -227
  988. package/src/server/tests/endpoints/token-clearing.test.ts +0 -230
  989. package/src/server/tests/endpoints/token-safety.test.ts +0 -280
  990. package/src/server/tests/endpoints/token-search.test.ts +0 -186
  991. package/src/server/tests/endpoints/transactions.test.ts +0 -348
  992. package/src/server/tests/endpoints/unlock.test.ts +0 -385
  993. package/src/server/tests/endpoints/wallet-data.test.ts +0 -547
  994. package/src/server/tests/endpoints/wallet.test.ts +0 -755
  995. package/src/server/tests/globalSetup.ts +0 -62
  996. package/src/server/tests/helpers/amounts.ts +0 -14
  997. package/src/server/tests/integration/adapter-resolve.test.ts +0 -160
  998. package/src/server/tests/integration/agent-flow.test.ts +0 -477
  999. package/src/server/tests/lib/adapters-chat.test.ts +0 -259
  1000. package/src/server/tests/lib/adapters-test.test.ts +0 -1196
  1001. package/src/server/tests/lib/adapters.test.ts +0 -962
  1002. package/src/server/tests/lib/address.test.ts +0 -96
  1003. package/src/server/tests/lib/agent-auth/contracts.test.ts +0 -771
  1004. package/src/server/tests/lib/agent-profiles.test.ts +0 -98
  1005. package/src/server/tests/lib/ai.test.ts +0 -452
  1006. package/src/server/tests/lib/api-registry/validation.test.ts +0 -174
  1007. package/src/server/tests/lib/app-tokens-tier.test.ts +0 -106
  1008. package/src/server/tests/lib/approval-link.test.ts +0 -20
  1009. package/src/server/tests/lib/aura-parser.test.ts +0 -96
  1010. package/src/server/tests/lib/auth-action.test.ts +0 -251
  1011. package/src/server/tests/lib/auth.test.ts +0 -237
  1012. package/src/server/tests/lib/auto-execute.test.ts +0 -269
  1013. package/src/server/tests/lib/auto-unlock.test.ts +0 -47
  1014. package/src/server/tests/lib/batch.test.ts +0 -363
  1015. package/src/server/tests/lib/credential-access.test.ts +0 -244
  1016. package/src/server/tests/lib/credential-agent.test.ts +0 -174
  1017. package/src/server/tests/lib/credential-field-schema.test.ts +0 -448
  1018. package/src/server/tests/lib/credential-health.test.ts +0 -110
  1019. package/src/server/tests/lib/credential-paths.test.ts +0 -430
  1020. package/src/server/tests/lib/credential-scope.test.ts +0 -163
  1021. package/src/server/tests/lib/credential-transport.test.ts +0 -319
  1022. package/src/server/tests/lib/credentials.test.ts +0 -249
  1023. package/src/server/tests/lib/defaults.test.ts +0 -76
  1024. package/src/server/tests/lib/diary.test.ts +0 -43
  1025. package/src/server/tests/lib/dont-ask-again-policy.test.ts +0 -22
  1026. package/src/server/tests/lib/encrypt.test.ts +0 -43
  1027. package/src/server/tests/lib/escalation-responder.test.ts +0 -228
  1028. package/src/server/tests/lib/events-decoder.test.ts +0 -286
  1029. package/src/server/tests/lib/events-enricher.test.ts +0 -294
  1030. package/src/server/tests/lib/events-fetcher.test.ts +0 -577
  1031. package/src/server/tests/lib/human-action-summary.test.ts +0 -62
  1032. package/src/server/tests/lib/network.test.ts +0 -280
  1033. package/src/server/tests/lib/oauth2-refresh.test.ts +0 -140
  1034. package/src/server/tests/lib/passkey-credential.test.ts +0 -153
  1035. package/src/server/tests/lib/price.test.ts +0 -286
  1036. package/src/server/tests/lib/prices.test.ts +0 -50
  1037. package/src/server/tests/lib/profile-parity.test.ts +0 -50
  1038. package/src/server/tests/lib/project-scope.test.ts +0 -242
  1039. package/src/server/tests/lib/relay.test.ts +0 -464
  1040. package/src/server/tests/lib/resolve-action.test.ts +0 -294
  1041. package/src/server/tests/lib/secret-gist-share.test.ts +0 -58
  1042. package/src/server/tests/lib/sessions-currency.test.ts +0 -215
  1043. package/src/server/tests/lib/sessions.test.ts +0 -327
  1044. package/src/server/tests/lib/social/create.test.ts +0 -207
  1045. package/src/server/tests/lib/social/sign.test.ts +0 -163
  1046. package/src/server/tests/lib/social/sync.test.ts +0 -198
  1047. package/src/server/tests/lib/solana-wallet.test.ts +0 -143
  1048. package/src/server/tests/lib/strategy/executor.test.ts +0 -363
  1049. package/src/server/tests/lib/strategy/hooks.test.ts +0 -897
  1050. package/src/server/tests/lib/strategy/loader.test.ts +0 -343
  1051. package/src/server/tests/lib/strategy/message.test.ts +0 -416
  1052. package/src/server/tests/lib/strategy/repository.test.ts +0 -84
  1053. package/src/server/tests/lib/strategy/session-logger.test.ts +0 -467
  1054. package/src/server/tests/lib/strategy/sources.test.ts +0 -503
  1055. package/src/server/tests/lib/strategy/state.test.ts +0 -349
  1056. package/src/server/tests/lib/strategy/tick.test.ts +0 -283
  1057. package/src/server/tests/lib/temp-policy.test.ts +0 -184
  1058. package/src/server/tests/lib/token-safety.test.ts +0 -277
  1059. package/src/server/tests/lib/token-search.test.ts +0 -687
  1060. package/src/server/tests/lib/totp.test.ts +0 -193
  1061. package/src/server/tests/lib/uniswap.test.ts +0 -307
  1062. package/src/server/tests/lib/update-check.test.ts +0 -27
  1063. package/src/server/tests/lib/verified-summary.test.ts +0 -454
  1064. package/src/server/tests/lib/websocket-auth.test.ts +0 -247
  1065. package/src/server/tests/mcp/contract.test.ts +0 -318
  1066. package/src/server/tests/mcp/profile-policy.test.ts +0 -178
  1067. package/src/server/tests/mcp/server.test.ts +0 -3159
  1068. package/src/server/tests/mcp/tools.test.ts +0 -518
  1069. package/src/server/tests/resolve.test.ts +0 -81
  1070. package/src/server/tests/runtime-agent-smoke.test.ts +0 -130
  1071. package/src/server/tests/sandbox/cli-cd-suite.test.ts +0 -526
  1072. package/src/server/tests/sandbox/cli.test.ts +0 -402
  1073. package/src/server/tests/send-token.test.ts +0 -191
  1074. package/src/server/tests/setup-integration/adapter-test.test.ts +0 -122
  1075. package/src/server/tests/setup-integration/apikey-validation.test.ts +0 -118
  1076. package/src/server/tests/setup-integration/autonomous-agent.test.ts +0 -243
  1077. package/src/server/tests/setup-integration/edge-cases.test.ts +0 -115
  1078. package/src/server/tests/setup-integration/fresh-setup.test.ts +0 -60
  1079. package/src/server/tests/setup-integration/harness.ts +0 -296
  1080. package/src/server/tests/setup-integration/onboarding-e2e.test.ts +0 -292
  1081. package/src/server/tests/setup-integration/terminal-flow.test.ts +0 -201
  1082. package/src/server/tests/setup-integration/vitest.config.ts +0 -29
  1083. package/src/server/tests/setup-integration/wizard-flow.test.ts +0 -139
  1084. package/src/server/tests/setup.ts +0 -351
  1085. package/src/server/tests/swap-quote.test.ts +0 -279
  1086. package/src/server/tests/test-data/agent-e1ica7.json +0 -14
  1087. package/src/server/tests/test-data/agent-iaswp5.json +0 -14
  1088. package/src/server/tests/test-data/agent-primary.json +0 -12
  1089. package/src/server/tests/test-data/agent-qvn7eo.json +0 -14
  1090. package/src/server/tests/test-data/agent-vqhtrt.json +0 -14
  1091. package/src/server/tests/test-data/config.json +0 -33
  1092. package/src/server/tests/test-data/test.db +0 -0
  1093. package/src/server/tests/workerSetup.ts +0 -39
  1094. package/src/server/tsconfig.json +0 -21
  1095. package/src/server/tsconfig.tsbuildinfo +0 -1
  1096. package/src/server/types.ts +0 -161
  1097. package/start.sh +0 -170
  1098. package/tailwind.config.ts +0 -99
  1099. package/tsconfig.json +0 -52
@@ -1,2247 +0,0 @@
1
- 'use client';
2
-
3
- import React, { useEffect, useState, Suspense } from 'react';
4
-
5
- import { Shield, Flame, Plus, Send, Rocket, Copy, Loader2, Check, X, AlertTriangle, Trash2, Home as HomeIcon, KeyRound, Code, Database, RotateCcw, Lock, Settings, Bot } from 'lucide-react';
6
- import { TextInput, Drawer, Modal, ConfirmationModal, Button, Popover, TyvekCollapsibleSection } from '@/components/design-system';
7
- import { WalletSidebar, TabBar, WorkspaceTab, AppStoreDrawer, LeftRail, CreateViewModal } from '@/components/layout';
8
- import { DEFAULT_VIEWS, SOCIAL_VIEW, getDefaultActiveViewId, type ViewDefinition } from '@/lib/view-registry';
9
- import { DraggableApp, type AppColor } from '@/components/apps';
10
- import { useAgentActions } from '@/hooks/useAgentActions';
11
- import { HumanActionBar } from '@/components/HumanActionBar';
12
- import { PasskeyEnrollmentPrompt } from '@/components/PasskeyEnrollmentPrompt';
13
- import { useWorkspace, type AppState as WorkspaceAppState } from '@/context/WorkspaceContext';
14
- import { useAuth, type ApiKey, type ChainConfig } from '@/context/AuthContext';
15
- import { useWebSocket } from '@/context/WebSocketContext';
16
- import { getAppDefinition } from '@/lib/app-registry';
17
- import SystemDefaults, { AiEngineSection } from '@/components/apps/SystemDefaultsApp';
18
- import { WALLET_EVENTS, WalletCreatedData } from '@/lib/events';
19
- import { api, Api } from '@/lib/api';
20
-
21
- // Known chains with Alchemy support - used for auto-fill when adding chains
22
- const KNOWN_CHAINS: Record<string, { chainId: number; alchemyPath: string; explorer: string }> = {
23
- base: { chainId: 8453, alchemyPath: 'base-mainnet', explorer: 'https://basescan.org' },
24
- ethereum: { chainId: 1, alchemyPath: 'eth-mainnet', explorer: 'https://etherscan.io' },
25
- arbitrum: { chainId: 42161, alchemyPath: 'arb-mainnet', explorer: 'https://arbiscan.io' },
26
- optimism: { chainId: 10, alchemyPath: 'opt-mainnet', explorer: 'https://optimistic.etherscan.io' },
27
- polygon: { chainId: 137, alchemyPath: 'polygon-mainnet', explorer: 'https://polygonscan.com' },
28
- zksync: { chainId: 324, alchemyPath: 'zksync-mainnet', explorer: 'https://explorer.zksync.io' },
29
- };
30
-
31
- interface WalletData {
32
- address: string;
33
- tier: 'cold' | 'hot' | 'temp';
34
- chain: string;
35
- balance?: string;
36
- label?: string;
37
- spentToday?: number;
38
- name?: string;
39
- color?: string;
40
- emoji?: string;
41
- description?: string;
42
- hidden?: boolean;
43
- tokenHash?: string;
44
- createdAt?: string;
45
- }
46
-
47
- interface DashboardState {
48
- configured: boolean;
49
- isUnlocked: boolean;
50
- wallets: WalletData[];
51
- }
52
-
53
- interface AppPosition {
54
- x: number;
55
- y: number;
56
- }
57
-
58
- export default function Home() {
59
- const {
60
- token,
61
- apiKeys: authApiKeys,
62
- apiKeysLoading: authApiKeysLoading,
63
- refreshApiKeys,
64
- getApiKey,
65
- chainOverrides,
66
- saveChainOverride,
67
- removeChainOverride,
68
- getConfiguredChains,
69
- } = useAuth();
70
- const { subscribe } = useWebSocket();
71
- const [state, setState] = useState<DashboardState | null>(null);
72
- const [loading, setLoading] = useState(true);
73
- const [error, setError] = useState('');
74
- const lastToastRef = React.useRef<{ message: string; at: number } | null>(null);
75
-
76
- // Experimental wallet multi-view shell state
77
- const [experimentalWallet, setExperimentalWallet] = useState(false);
78
- const [socialEnabled, setSocialEnabled] = useState(false);
79
- const [activeViewId, setActiveViewId] = useState(getDefaultActiveViewId());
80
- const [createViewOpen, setCreateViewOpen] = useState(false);
81
-
82
- const reportNonInlineError = React.useCallback((message: string) => {
83
- const normalized = message.trim() || 'Something went wrong';
84
- const now = Date.now();
85
- const last = lastToastRef.current;
86
- if (last && last.message === normalized && now - last.at < 3000) return;
87
- lastToastRef.current = { message: normalized, at: now };
88
- setError(normalized);
89
- }, []);
90
-
91
- // Agent requests - only need count for sidebar badge (app is self-contained)
92
- // Only auto-fetch when we have a token (wallet is unlocked)
93
- const { requests, notifications, dismissNotification, resolveAction, actionLoading } = useAgentActions({ autoFetch: !!token });
94
- const [copied, setCopied] = useState<string | null>(null);
95
- const [activeDrawer, setActiveDrawer] = useState<'settings' | 'receive' | null>(null);
96
- const [showAppStore, setShowAppStore] = useState(false);
97
- const [nuking, setNuking] = useState(false);
98
- const [confirmNuke, setConfirmNuke] = useState(false);
99
-
100
- const [sendFrom, setSendFrom] = useState('');
101
-
102
- const [seedPhrase, setSeedPhrase] = useState<string | null>(null);
103
- const [seedConfirmed, setSeedConfirmed] = useState(false);
104
- const [exportPassword, setExportPassword] = useState('');
105
- const [exporting, setExporting] = useState(false);
106
- const [exportedSeed, setExportedSeed] = useState<string | null>(null);
107
-
108
- // Import seed state
109
- const [showImportSeedModal, setShowImportSeedModal] = useState(false);
110
- const [importSeedPhrase, setImportSeedPhrase] = useState('');
111
- const [importPassword, setImportPassword] = useState('');
112
- const [importConfirmPassword, setImportConfirmPassword] = useState('');
113
- const [importing, setImporting] = useState(false);
114
-
115
- // Chain state
116
- const [chains, setChains] = useState<Record<string, { rpc: string; chainId: number; explorer: string; nativeCurrency: string }>>({});
117
- const [editingChainRpc, setEditingChainRpc] = useState<string | null>(null);
118
- const [customRpc, setCustomRpc] = useState('');
119
- const [savingConfig] = useState(false);
120
- const [showAddChainModal, setShowAddChainModal] = useState(false);
121
- const [addChainAnchorEl, setAddChainAnchorEl] = useState<HTMLElement | null>(null);
122
- const [newChain, setNewChain] = useState({ name: '', chainId: '', rpc: '', explorer: '', nativeCurrency: 'ETH' });
123
-
124
- // API Keys state
125
- const [showAddApiKeyPopover, setShowAddApiKeyPopover] = useState(false);
126
- const [addApiKeyAnchorEl, setAddApiKeyAnchorEl] = useState<HTMLElement | null>(null);
127
- const [newApiKey, setNewApiKey] = useState({ service: '', name: '', key: '' });
128
- const [savingApiKey, setSavingApiKey] = useState(false);
129
- const [deletingApiKey, setDeletingApiKey] = useState<string | null>(null);
130
- const [showRevokeAllApiKeysPopover, setShowRevokeAllApiKeysPopover] = useState(false);
131
- const [revokeAllApiKeysAnchorEl, setRevokeAllApiKeysAnchorEl] = useState<HTMLElement | null>(null);
132
- const [revokingAllApiKeys, setRevokingAllApiKeys] = useState(false);
133
-
134
- // Backup state
135
- interface BackupInfo {
136
- filename: string;
137
- timestamp: string;
138
- size: number;
139
- date: string;
140
- }
141
- const [backups, setBackups] = useState<BackupInfo[]>([]);
142
- const [backupsLoading, setBackupsLoading] = useState(false);
143
- const [creatingBackup, setCreatingBackup] = useState(false);
144
- const [restoringBackup, setRestoringBackup] = useState<string | null>(null);
145
-
146
- // Workspace context for programmatic workspace control
147
- const {
148
- workspaces,
149
- activeWorkspaceId,
150
- apps: workspaceApps,
151
- loading: workspaceLoading,
152
- createWorkspace,
153
- deleteWorkspace,
154
- updateWorkspace,
155
- switchWorkspace,
156
- addApp,
157
- removeApp,
158
- updateApp,
159
- bringToFront,
160
- tidyApps,
161
- } = useWorkspace();
162
-
163
- // Convert workspaces to tabs format
164
- const tabs: WorkspaceTab[] = workspaces.map(ws => ({
165
- id: ws.id,
166
- label: ws.name,
167
- icon: ws.icon === 'Home' ? HomeIcon : undefined,
168
- emoji: ws.emoji,
169
- color: ws.color,
170
- closeable: ws.isCloseable,
171
- isDefault: ws.isDefault,
172
- }));
173
-
174
- // Handle workspace tab update (name, emoji, color)
175
- const handleTabUpdate = (tabId: string, data: { name?: string; emoji?: string; color?: string }) => {
176
- updateWorkspace(tabId, {
177
- name: data.name,
178
- emoji: data.emoji,
179
- color: data.color,
180
- });
181
- };
182
-
183
- const fetchState = async (retries = 10): Promise<void> => {
184
- for (let attempt = 0; attempt < retries; attempt++) {
185
- try {
186
- const controller = new AbortController();
187
- const timeout = setTimeout(() => controller.abort(), 5000);
188
-
189
- const setupData = await api.get<{ hasWallet: boolean; unlocked: boolean; address: string | null }>(
190
- Api.Wallet, '/setup', undefined, { signal: controller.signal },
191
- );
192
- clearTimeout(timeout);
193
-
194
- // Map new server response format
195
- const configured = setupData.hasWallet;
196
- const isUnlocked = setupData.unlocked;
197
-
198
- if (!configured) {
199
- setState({ configured: false, isUnlocked: false, wallets: [] });
200
- setLoading(false);
201
- return;
202
- }
203
-
204
- if (!isUnlocked) {
205
- setState({ configured: true, isUnlocked: false, wallets: [] });
206
- setLoading(false);
207
- return;
208
- }
209
-
210
- const walletsData = await api.get<{ wallets: WalletData[] }>(Api.Wallet, '/wallets', { includeHidden: true });
211
-
212
- setState({
213
- configured: true,
214
- isUnlocked: true,
215
- wallets: walletsData.wallets || [],
216
- });
217
- if (walletsData.wallets?.length > 0 && !sendFrom) {
218
- const hotWallet = walletsData.wallets.find((w: WalletData) => w.tier === 'hot');
219
- if (hotWallet) setSendFrom(hotWallet.address);
220
- }
221
- setLoading(false);
222
- return;
223
- } catch {
224
- // Server not ready yet — retry after a delay
225
- if (attempt < retries - 1) {
226
- await new Promise(r => setTimeout(r, 2000));
227
- }
228
- }
229
- }
230
- // All retries exhausted
231
- reportNonInlineError('Failed to connect to wallet server');
232
- setLoading(false);
233
- };
234
-
235
- useEffect(() => { fetchState(); }, []);
236
-
237
- // Fetch feature flags for experimental wallet + social
238
- useEffect(() => {
239
- fetch('/flags')
240
- .then((r) => r.ok ? r.json() : {})
241
- .then((flags: Record<string, boolean>) => {
242
- if (flags.EXPERIMENTAL_WALLET) setExperimentalWallet(true);
243
- if (flags.SOCIAL) setSocialEnabled(true);
244
- })
245
- .catch(() => {});
246
- }, []);
247
-
248
- // Sync chains state from AuthContext (overrides + Alchemy + public fallbacks)
249
- useEffect(() => {
250
- const configuredChains = getConfiguredChains();
251
- const chainsWithNative: Record<string, { rpc: string; chainId: number; explorer: string; nativeCurrency: string }> = {};
252
- for (const [chain, config] of Object.entries(configuredChains)) {
253
- chainsWithNative[chain] = {
254
- ...config,
255
- nativeCurrency: 'ETH', // All supported chains use ETH
256
- };
257
- }
258
- setChains(chainsWithNative);
259
- }, [getConfiguredChains, chainOverrides, authApiKeys]);
260
-
261
- // Subscribe to WebSocket wallet events for real-time updates
262
- useEffect(() => {
263
- // Handle wallet:created - add new wallet to state
264
- const unsubscribeWalletCreated = subscribe(WALLET_EVENTS.WALLET_CREATED, (event) => {
265
- const data = event.data as WalletCreatedData;
266
- setState((prev) => {
267
- if (!prev) return prev;
268
- // Check if wallet already exists
269
- if (prev.wallets.some((w) => w.address === data.address)) {
270
- return prev;
271
- }
272
- // Add new wallet with createdAt timestamp
273
- const newWallet: WalletData = {
274
- address: data.address,
275
- tier: data.tier,
276
- chain: data.chain,
277
- name: data.name,
278
- tokenHash: data.tokenHash,
279
- balance: '0 ETH',
280
- createdAt: new Date().toISOString(),
281
- };
282
- return {
283
- ...prev,
284
- wallets: [...prev.wallets, newWallet],
285
- };
286
- });
287
- });
288
-
289
- return () => {
290
- unsubscribeWalletCreated();
291
- };
292
- }, [subscribe]);
293
-
294
- // Seed default apps on first setup (empty workspace + configured + unlocked)
295
- // Key is tied to cold wallet address so a new agent (e.g. sandbox) gets fresh defaults
296
- useEffect(() => {
297
- if (
298
- !state?.configured ||
299
- !state?.isUnlocked ||
300
- workspaceLoading ||
301
- workspaceApps.length > 0
302
- ) return;
303
-
304
- const coldWallet = state.wallets.find(w => w.tier === 'cold');
305
- const seedKey = `defaultAppsSeeded:${coldWallet?.address || 'unknown'}`;
306
-
307
- if (localStorage.getItem(seedKey)) return;
308
-
309
- // 1. Getting Started
310
- const dismissKey = `setupWizardDismissed:${coldWallet?.address || 'unknown'}`;
311
- if (!localStorage.getItem(dismissKey)) {
312
- addApp('setup', undefined, { x: 20, y: 20 });
313
- }
314
-
315
- // 2. Agent Chat
316
- addApp(
317
- 'installed:agent-chat',
318
- { appPath: 'agent-chat', appName: 'Agent Chat' },
319
- { x: 460, y: 20 }
320
- );
321
-
322
- // 3. Wallet detail for cold wallet
323
- if (coldWallet) {
324
- addApp(
325
- 'walletDetail',
326
- {
327
- walletAddress: coldWallet.address,
328
- walletName: coldWallet.name,
329
- walletEmoji: coldWallet.emoji,
330
- walletColor: coldWallet.color,
331
- },
332
- { x: 820, y: 20 },
333
- `walletDetail-${coldWallet.address}`
334
- );
335
- }
336
-
337
- localStorage.setItem(seedKey, 'true');
338
- }, [state?.configured, state?.isUnlocked, state?.wallets, workspaceLoading, workspaceApps.length, addApp]);
339
-
340
- const handleExportSeed = async (e: React.FormEvent) => {
341
- e.preventDefault();
342
- setError('');
343
- setExporting(true);
344
- try {
345
- const data = await api.post<{ success: boolean; error?: string; mnemonic?: string }>(Api.Wallet, '/wallet/export-seed', { password: exportPassword });
346
- if (!data.success) throw new Error(data.error);
347
- setExportedSeed(data.mnemonic ?? null);
348
- setExportPassword('');
349
- } catch (err) {
350
- setError(err instanceof Error ? err.message : 'Export failed');
351
- } finally {
352
- setExporting(false);
353
- }
354
- };
355
-
356
- const copyAddress = (address: string) => {
357
- navigator.clipboard.writeText(address);
358
- setCopied(address);
359
- setTimeout(() => setCopied(null), 2000);
360
- };
361
-
362
- const handleNuke = async () => {
363
- if (!confirmNuke) {
364
- setConfirmNuke(true);
365
- return;
366
- }
367
- setNuking(true);
368
- try {
369
- const data = await api.post<{ success: boolean; error?: string }>(Api.Wallet, '/nuke');
370
- if (!data.success) throw new Error(data.error);
371
- setState(null);
372
- setActiveDrawer(null);
373
- setConfirmNuke(false);
374
- window.location.reload();
375
- } catch (err) {
376
- setError(err instanceof Error ? err.message : 'Nuke failed');
377
- } finally {
378
- setNuking(false);
379
- }
380
- };
381
-
382
- const handleImportSeed = async (e: React.FormEvent) => {
383
- e.preventDefault();
384
- if (importPassword !== importConfirmPassword) {
385
- setError('Passwords do not match');
386
- return;
387
- }
388
- if (importPassword.length < 8) {
389
- setError('Password must be at least 8 characters');
390
- return;
391
- }
392
- if (!importSeedPhrase.trim()) {
393
- setError('Please enter a seed phrase');
394
- return;
395
- }
396
-
397
- setImporting(true);
398
- try {
399
- const data = await api.post<{ success?: boolean; error?: string }>(Api.Wallet, '/nuke/import', {
400
- mnemonic: importSeedPhrase.trim(),
401
- password: importPassword
402
- });
403
- if (!data.success && data.error) throw new Error(data.error);
404
-
405
- setShowImportSeedModal(false);
406
- setImportSeedPhrase('');
407
- setImportPassword('');
408
- setImportConfirmPassword('');
409
- window.location.reload();
410
- } catch (err) {
411
- setError(err instanceof Error ? err.message : 'Import failed');
412
- } finally {
413
- setImporting(false);
414
- }
415
- };
416
-
417
- const handleWalletClick = (wallet: WalletData) => {
418
- const appId = `walletDetail-${wallet.address}`;
419
-
420
- // Check if app for this wallet is already open
421
- const existingApp = workspaceApps.find(w => w.id === appId);
422
- if (existingApp) {
423
- // Bring to front
424
- bringToFront(appId);
425
- return;
426
- }
427
-
428
- // Count existing wallet detail apps for offset
429
- const walletAppCount = workspaceApps.filter(w => w.appType === 'walletDetail').length;
430
- const offset = walletAppCount * 30;
431
-
432
- // Add app through workspace system with wallet info for title/color
433
- addApp(
434
- 'walletDetail',
435
- {
436
- walletAddress: wallet.address,
437
- walletName: wallet.name,
438
- walletEmoji: wallet.emoji,
439
- walletColor: wallet.color,
440
- },
441
- { x: 360 + offset, y: 20 + offset },
442
- appId
443
- );
444
- };
445
-
446
-
447
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
448
- const handleWalletUpdate = async (
449
- address: string,
450
- updates: { name?: string; color?: string; emoji?: string; description?: string; hidden?: boolean }
451
- ) => {
452
- try {
453
- const data = await api.post<{ success: boolean; error?: string }>(Api.Wallet, '/wallet/rename', { address, ...updates });
454
- if (!data.success) throw new Error(data.error);
455
-
456
- // Update local state - wallet detail apps read from state.wallets
457
- if (state?.wallets) {
458
- const updatedWallets = state.wallets.map((w) =>
459
- w.address === address ? { ...w, ...updates } : w
460
- );
461
- setState((prev) => (prev ? { ...prev, wallets: updatedWallets } : null));
462
- }
463
- } catch (err) {
464
- setError(err instanceof Error ? err.message : 'Failed to update wallet');
465
- }
466
- };
467
-
468
- const handleRemoveChain = async (chain: string) => {
469
- try {
470
- await removeChainOverride(chain);
471
- } catch {
472
- setError('Failed to remove chain');
473
- }
474
- };
475
-
476
- // Add new API key
477
- const handleAddApiKey = async () => {
478
- if (!newApiKey.service || !newApiKey.name || !newApiKey.key) {
479
- setError('Service, name, and key are required');
480
- return;
481
- }
482
-
483
- setSavingApiKey(true);
484
- try {
485
- const data = await api.post<{ success: boolean; error?: string }>(Api.Wallet, '/apikeys', {
486
- service: newApiKey.service.toLowerCase(),
487
- name: newApiKey.name,
488
- key: newApiKey.key
489
- });
490
-
491
- if (data.success) {
492
- // Refresh API keys list from AuthContext
493
- await refreshApiKeys();
494
- setNewApiKey({ service: '', name: '', key: '' });
495
- setShowAddApiKeyPopover(false);
496
- } else {
497
- reportNonInlineError(data.error || 'Failed to save API key');
498
- }
499
- } catch (err) {
500
- setError(err instanceof Error ? err.message : 'Failed to save API key');
501
- } finally {
502
- setSavingApiKey(false);
503
- }
504
- };
505
-
506
- // Delete API key
507
- const handleDeleteApiKey = async (id: string) => {
508
- setDeletingApiKey(id);
509
- try {
510
- const data = await api.delete<{ success: boolean; error?: string }>(Api.Wallet, `/apikeys/${id}`);
511
-
512
- if (data.success) {
513
- await refreshApiKeys();
514
- } else {
515
- reportNonInlineError(data.error || 'Failed to delete API key');
516
- }
517
- } catch (err) {
518
- setError(err instanceof Error ? err.message : 'Failed to delete API key');
519
- } finally {
520
- setDeletingApiKey(null);
521
- }
522
- };
523
-
524
- const onOpenRevokeAllApiKeys = (anchorEl: HTMLElement) => {
525
- setRevokeAllApiKeysAnchorEl(anchorEl);
526
- setShowRevokeAllApiKeysPopover(true);
527
- };
528
-
529
- const onCloseRevokeAllApiKeys = () => {
530
- setShowRevokeAllApiKeysPopover(false);
531
- setRevokeAllApiKeysAnchorEl(null);
532
- };
533
-
534
- const handleRevokeAllApiKeys = async () => {
535
- setRevokingAllApiKeys(true);
536
- try {
537
- const data = await api.delete<{ success: boolean; revokedCount?: number; message?: string; error?: string }>(Api.Wallet, '/apikeys/revoke-all');
538
- if (!data.success) {
539
- reportNonInlineError(data.error || 'Failed to revoke all API keys');
540
- return;
541
- }
542
- await refreshApiKeys();
543
- onCloseRevokeAllApiKeys();
544
- } catch (err) {
545
- setError(err instanceof Error ? err.message : 'Failed to revoke all API keys');
546
- } finally {
547
- setRevokingAllApiKeys(false);
548
- }
549
- };
550
-
551
- // Add Alchemy API key directly (for quick setup)
552
- const handleAddAlchemyKey = async (key: string): Promise<boolean> => {
553
- try {
554
- const data = await api.post<{ success: boolean; error?: string }>(Api.Wallet, '/apikeys', {
555
- service: 'alchemy',
556
- name: 'default',
557
- key
558
- });
559
-
560
- if (data.success) {
561
- await refreshApiKeys();
562
- return true;
563
- } else {
564
- reportNonInlineError(data.error || 'Failed to save Alchemy key');
565
- return false;
566
- }
567
- } catch (err) {
568
- setError(err instanceof Error ? err.message : 'Failed to save Alchemy key');
569
- return false;
570
- }
571
- };
572
-
573
- const handleAddChain = async () => {
574
- const chainName = newChain.name.toLowerCase().trim();
575
- if (!chainName || !newChain.chainId) {
576
- setError('Chain name and chain ID are required');
577
- return;
578
- }
579
-
580
- const chainId = parseInt(newChain.chainId, 10);
581
- const knownChain = KNOWN_CHAINS[chainName];
582
- const explorer = newChain.explorer || knownChain?.explorer || '';
583
-
584
- // If RPC is blank and we have Alchemy key + known chain, construct Alchemy URL
585
- let rpc = newChain.rpc.trim();
586
- if (!rpc) {
587
- const alchemyKey = getApiKey('alchemy');
588
- if (alchemyKey && knownChain?.alchemyPath) {
589
- rpc = `https://${knownChain.alchemyPath}.g.alchemy.com/v2/${alchemyKey}`;
590
- } else {
591
- setError('RPC URL is required (or add Alchemy key for known chains)');
592
- return;
593
- }
594
- }
595
-
596
- try {
597
- await saveChainOverride(chainName, { rpc, chainId, explorer });
598
- setNewChain({ name: '', chainId: '', rpc: '', explorer: '', nativeCurrency: 'ETH' });
599
- setShowAddChainModal(false);
600
- } catch {
601
- setError('Failed to add chain');
602
- }
603
- };
604
-
605
- const handleSaveCustomRpc = async (chain: string, rpc: string) => {
606
- if (!rpc) {
607
- setError('RPC URL is required');
608
- return;
609
- }
610
- try {
611
- // Get current chain config to preserve chainId and explorer
612
- const currentConfig = chains[chain];
613
- await saveChainOverride(chain, {
614
- rpc,
615
- chainId: currentConfig?.chainId || 0,
616
- explorer: currentConfig?.explorer || '',
617
- });
618
- setEditingChainRpc(null);
619
- setCustomRpc('');
620
- } catch {
621
- setError('Failed to save RPC override');
622
- }
623
- };
624
-
625
- const fetchBackups = async () => {
626
- // Skip if no auth token
627
- if (!token) {
628
- setBackups([]);
629
- return;
630
- }
631
- setBackupsLoading(true);
632
- try {
633
- const data = await api.get<{ success: boolean; backups: Array<{ filename: string; timestamp: string; size: number; date: string }> }>(Api.Wallet, '/backup');
634
- if (data.success) {
635
- setBackups(data.backups);
636
- }
637
- } catch (err) {
638
- console.error('Failed to fetch backups:', err);
639
- setBackups([]);
640
- } finally {
641
- setBackupsLoading(false);
642
- }
643
- };
644
-
645
- const handleCreateBackup = async () => {
646
- setCreatingBackup(true);
647
- try {
648
- const data = await api.post<{ success: boolean; error?: string }>(Api.Wallet, '/backup');
649
- if (data.success) {
650
- await fetchBackups();
651
- } else {
652
- reportNonInlineError(data.error || 'Failed to create backup');
653
- }
654
- } catch (err) {
655
- setError(err instanceof Error ? err.message : 'Failed to create backup');
656
- } finally {
657
- setCreatingBackup(false);
658
- }
659
- };
660
-
661
- const handleRestoreBackup = async (filename: string) => {
662
- setRestoringBackup(filename);
663
- try {
664
- const data = await api.put<{ success: boolean; error?: string }>(Api.Wallet, '/backup', { filename });
665
- if (data.success) {
666
- window.location.reload();
667
- } else {
668
- reportNonInlineError(data.error || 'Failed to restore backup');
669
- }
670
- } catch (err) {
671
- setError(err instanceof Error ? err.message : 'Failed to restore backup');
672
- } finally {
673
- setRestoringBackup(null);
674
- }
675
- };
676
-
677
- const [exportingDb, setExportingDb] = useState(false);
678
-
679
- const handleExportDb = async () => {
680
- setExportingDb(true);
681
- try {
682
- const baseUrl = api.getBaseUrl(Api.Wallet);
683
- const authToken = token || '';
684
- const res = await fetch(`${baseUrl}/backup/export`, {
685
- headers: { Authorization: `Bearer ${authToken}` },
686
- });
687
- if (!res.ok) {
688
- const err = await res.json().catch(() => ({ error: 'Export failed' }));
689
- reportNonInlineError(err.error || 'Export failed');
690
- return;
691
- }
692
- const blob = await res.blob();
693
- const disposition = res.headers.get('Content-Disposition') || '';
694
- const filenameMatch = disposition.match(/filename="?([^"]+)"?/);
695
- const filename = filenameMatch ? filenameMatch[1] : 'auramaxx-export.db';
696
- const url = URL.createObjectURL(blob);
697
- const a = document.createElement('a');
698
- a.href = url;
699
- a.download = filename;
700
- document.body.appendChild(a);
701
- a.click();
702
- document.body.removeChild(a);
703
- URL.revokeObjectURL(url);
704
- } catch (err) {
705
- reportNonInlineError(err instanceof Error ? err.message : 'Export failed');
706
- } finally {
707
- setExportingDb(false);
708
- }
709
- };
710
-
711
- const handleNewTab = () => {
712
- createWorkspace('NEW');
713
- };
714
-
715
- const handleCloseTab = (tabId: string) => {
716
- deleteWorkspace(tabId);
717
- };
718
-
719
- const handleTabChange = (tabId: string) => {
720
- switchWorkspace(tabId);
721
- };
722
-
723
- const handleAppPositionChange = (id: string, pos: AppPosition) => {
724
- // Update context (will sync to DB)
725
- updateApp(id, { x: pos.x, y: pos.y });
726
- };
727
-
728
- const handleAppLockChange = (id: string, locked: boolean) => {
729
- updateApp(id, { isLocked: locked });
730
- };
731
-
732
- const handleAppSizeChange = (id: string, size: { width: number; height: number }) => {
733
- updateApp(id, { width: size.width, height: size.height });
734
- };
735
-
736
- const handleBringToFront = (id: string) => {
737
- bringToFront(id);
738
- };
739
-
740
- const handleDismissApp = (id: string) => {
741
- removeApp(id);
742
- };
743
-
744
- const handleOpenLogs = () => {
745
- // Check if logs app already exists
746
- const logsApp = workspaceApps.find(w => w.appType === 'logs');
747
- if (logsApp) {
748
- bringToFront(logsApp.id);
749
- } else {
750
- addApp('logs', undefined, { x: 700, y: 20 });
751
- }
752
- };
753
-
754
- const handleOpenApp = (type: string, position?: { x: number; y: number }) => {
755
- const existing = workspaceApps.find(w => w.appType === type);
756
- if (existing) {
757
- bringToFront(existing.id);
758
- } else {
759
- addApp(type, undefined, position);
760
- }
761
- };
762
-
763
- const handleAddAppFromStore = (appType: string, config?: Record<string, unknown>) => {
764
- addApp(appType, config, { x: 360, y: 20 });
765
- setShowAppStore(false);
766
- };
767
-
768
- // Loading state
769
- if (loading) {
770
- return (
771
- <div className="min-h-screen flex items-center justify-center bg-[var(--color-background,#f5f5f5)] relative">
772
- <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
773
- <div className="absolute inset-0 bg-[linear-gradient(to_right,var(--color-border-muted,#e5e5e5)_1px,transparent_1px),linear-gradient(to_bottom,var(--color-border-muted,#e5e5e5)_1px,transparent_1px)] bg-[size:4rem_4rem] opacity-30" />
774
- </div>
775
- <div className="font-mono text-sm text-[var(--color-text-muted,#6b7280)] animate-pulse relative z-10">INITIALIZING SYSTEM...</div>
776
- </div>
777
- );
778
- }
779
-
780
- // Seed backup screen
781
- if (seedPhrase && !seedConfirmed) {
782
- return (
783
- <div className="min-h-screen flex items-center justify-center p-4 bg-[var(--color-background,#f5f5f5)] relative">
784
- <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
785
- <div className="absolute inset-0 bg-[linear-gradient(to_right,var(--color-border-muted,#e5e5e5)_1px,transparent_1px),linear-gradient(to_bottom,var(--color-border-muted,#e5e5e5)_1px,transparent_1px)] bg-[size:4rem_4rem] opacity-30" />
786
- </div>
787
- <div className="w-full max-w-md bg-[var(--color-surface,#ffffff)] border border-[var(--color-border,#d4d4d8)] relative z-10">
788
- <div className="absolute top-2 left-2 w-4 h-4 border-l-2 border-t-2 border-[var(--color-border-focus,#0a0a0a)]" />
789
- <div className="absolute top-2 right-2 w-4 h-4 border-r-2 border-t-2 border-[var(--color-border-focus,#0a0a0a)]" />
790
- <div className="absolute bottom-2 left-2 w-4 h-4 border-l-2 border-b-2 border-[var(--color-border-focus,#0a0a0a)]" />
791
- <div className="absolute bottom-2 right-2 w-4 h-4 border-r-2 border-b-2 border-[var(--color-border-focus,#0a0a0a)]" />
792
- <div className="absolute inset-0 opacity-[0.02] pointer-events-none bg-[radial-gradient(var(--color-text,#000)_1px,transparent_1px)] bg-[size:4px_4px]" />
793
-
794
- <div className="p-8 relative z-10">
795
- <div className="flex items-center gap-3 mb-6">
796
- <div className="w-10 h-10 bg-[var(--color-warning,#ff4d00)] flex items-center justify-center">
797
- <AlertTriangle size={16} className="text-white" />
798
- </div>
799
- <div>
800
- <div className="font-mono text-[10px] text-[var(--color-warning,#ff4d00)] tracking-widest">CRITICAL</div>
801
- <div className="font-black text-xl text-[var(--color-text,#0a0a0a)] tracking-tight">BACKUP SEED PHRASE</div>
802
- </div>
803
- </div>
804
-
805
- <div className="mb-4 p-3 bg-[var(--color-warning,#ff4d00)]/10 border border-[var(--color-warning,#ff4d00)]/30">
806
- <div className="font-mono text-[10px] text-[var(--color-warning,#ff4d00)] leading-relaxed">
807
- Write this down and store it safely. This is the ONLY way to recover your wallets. It will NOT be shown again.
808
- </div>
809
- </div>
810
-
811
- <div className="mb-6 p-4 bg-[var(--color-text,#0a0a0a)] border-2 border-[var(--color-border-focus,#0a0a0a)] relative">
812
- <button
813
- onClick={() => {
814
- navigator.clipboard.writeText(seedPhrase);
815
- setCopied('seed');
816
- setTimeout(() => setCopied(null), 2000);
817
- }}
818
- className="absolute top-2 right-2 p-1.5 bg-[var(--color-text,#0a0a0a)]/80 hover:bg-[var(--color-text,#0a0a0a)]/70 transition-colors"
819
- >
820
- <Copy size={12} className={copied === 'seed' ? 'text-[var(--color-accent,#ccff00)]' : 'text-[var(--color-text-muted,#6b7280)]'} />
821
- </button>
822
- <div className="font-mono text-sm text-[var(--color-accent,#ccff00)] leading-relaxed break-words select-all">
823
- {seedPhrase}
824
- </div>
825
- </div>
826
-
827
- <div className="space-y-3">
828
- <label className="flex items-start gap-3 cursor-pointer group">
829
- <input
830
- type="checkbox"
831
- checked={seedConfirmed}
832
- onChange={(e) => setSeedConfirmed(e.target.checked)}
833
- className="mt-1 w-4 h-4 accent-[var(--color-accent,#ccff00)]"
834
- />
835
- <span className="font-mono text-[10px] text-[var(--color-text-muted,#6b7280)] leading-relaxed group-hover:text-[var(--color-text,#0a0a0a)]">
836
- I have saved my seed phrase in a secure location.
837
- </span>
838
- </label>
839
-
840
- <button
841
- onClick={() => {
842
- setSeedPhrase(null);
843
- fetchState();
844
- }}
845
- disabled={!seedConfirmed}
846
- className="w-full h-14 bg-[var(--color-text,#0a0a0a)] text-white relative overflow-hidden disabled:opacity-30 disabled:cursor-not-allowed group"
847
- >
848
- <span className="relative z-10 font-mono font-bold text-xs uppercase tracking-[0.15em] group-hover:text-[var(--color-accent,#ccff00)] transition-colors">
849
- CONTINUE
850
- </span>
851
- </button>
852
- </div>
853
- </div>
854
- </div>
855
- </div>
856
- );
857
- }
858
-
859
- // Derived state for other components
860
- const coldWallets = state?.wallets.filter(w => w.tier === 'cold') || [];
861
- const isLocked = state?.configured && !state?.isUnlocked;
862
- const isConfigured = state?.configured ?? false;
863
-
864
- // MAIN LAYOUT - Sidebar + Tab Content
865
- return (
866
- <div className="h-screen flex bg-[var(--color-background,#f5f5f5)] overflow-hidden">
867
- {/* Experimental Wallet Left Rail */}
868
- {experimentalWallet && (
869
- <LeftRail
870
- views={socialEnabled ? [...DEFAULT_VIEWS, SOCIAL_VIEW] : DEFAULT_VIEWS}
871
- activeViewId={activeViewId}
872
- onSelectView={setActiveViewId}
873
- onCreateView={() => setCreateViewOpen(true)}
874
- />
875
- )}
876
- {experimentalWallet && (
877
- <CreateViewModal
878
- open={createViewOpen}
879
- onClose={() => setCreateViewOpen(false)}
880
- onSelect={(view: ViewDefinition) => setActiveViewId(view.id)}
881
- />
882
- )}
883
- {/* Background Pattern with AURA/MAXXING */}
884
- <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
885
- <div className="absolute inset-0 bg-[linear-gradient(to_right,var(--color-border-muted,#e5e5e5)_1px,transparent_1px),linear-gradient(to_bottom,var(--color-border-muted,#e5e5e5)_1px,transparent_1px)] bg-[size:4rem_4rem] opacity-30" />
886
- <div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
887
- <div className="absolute top-[5%] left-[30%] opacity-[0.03] select-none">
888
- <div className="text-[15vw] font-black leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter">AURA</div>
889
- </div>
890
- <div className="absolute bottom-[5%] right-[5%] opacity-[0.03] select-none">
891
- <div className="text-[12vw] font-black leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter text-right">MAXXING</div>
892
- </div>
893
- {/* Lab Markings */}
894
- <div className="absolute top-10 left-[290px] w-24 h-24 border-l-4 border-t-4 border-[var(--color-text,#0a0a0a)] opacity-10">
895
- <div className="absolute top-2 left-2 w-3 h-3 bg-[var(--color-text,#0a0a0a)]" />
896
- </div>
897
- <div className="absolute bottom-10 right-10 w-24 h-24 border-r-4 border-b-4 border-[var(--color-text,#0a0a0a)] opacity-10 flex items-end justify-end">
898
- <div className="absolute bottom-2 right-2 w-3 h-3 bg-[var(--color-text,#0a0a0a)]" />
899
- </div>
900
- </div>
901
-
902
- {/* Wallet Sidebar - Self-contained component */}
903
- <WalletSidebar
904
- onSend={() => handleOpenApp('send', { x: 360, y: 20 })}
905
- onReceive={() => setActiveDrawer('receive')}
906
- onLogs={handleOpenLogs}
907
- onAgentKeys={() => handleOpenApp('agentKeys', { x: 360, y: 20 })}
908
- onAppStore={() => setShowAppStore(true)}
909
- onWalletClick={handleWalletClick}
910
- onImportSeed={() => setShowImportSeedModal(true)}
911
- onSettings={() => { setActiveDrawer(activeDrawer === 'settings' ? null : 'settings'); setConfirmNuke(false); }}
912
- pendingActionCount={notifications.filter((n) => n.status === 'pending' && n.type !== 'notify').length}
913
- onStateChange={(newState) => {
914
- setState(prev => prev ? {
915
- ...prev,
916
- configured: newState.configured,
917
- isUnlocked: newState.unlocked,
918
- wallets: newState.wallets,
919
- } : {
920
- configured: newState.configured,
921
- isUnlocked: newState.unlocked,
922
- wallets: newState.wallets,
923
- });
924
- }}
925
- />
926
-
927
- {/* Main Content Area */}
928
- <div className="flex-1 flex flex-col relative z-10">
929
- {/* Error Toast */}
930
- {error && (
931
- <div
932
- data-testid="app-error-toast"
933
- className="absolute top-2 left-1/2 -translate-x-1/2 z-50 flex items-center gap-2 px-3 py-2 border shadow-lg"
934
- style={{
935
- background: 'color-mix(in srgb, var(--color-warning,#ff4d00) 8%, var(--color-surface,#ffffff))',
936
- borderColor: 'color-mix(in srgb, var(--color-warning,#ff4d00) 40%, transparent)',
937
- }}
938
- >
939
- <span className="font-mono text-[10px] text-[var(--color-warning,#ff4d00)]">{error}</span>
940
- <button onClick={() => setError('')} className="text-[var(--color-warning,#ff4d00)] hover:opacity-70">
941
- <X size={10} />
942
- </button>
943
- </div>
944
- )}
945
-
946
- {isLocked || !isConfigured ? (
947
- /* Locked/unconfigured state - no workspace, no tabs, no apps */
948
- <div className="flex-1 flex items-center justify-center">
949
- <div className="text-center">
950
- <Lock size={32} className="mx-auto mb-3 text-[var(--color-text-faint,#9ca3af)]" />
951
- <div className="font-mono text-sm text-[var(--color-text-muted,#6b7280)]">
952
- {!isConfigured ? 'WALLET NOT CONFIGURED' : 'AGENT LOCKED'}
953
- </div>
954
- <div className="font-mono text-[10px] text-[var(--color-text-faint,#9ca3af)] mt-1">
955
- {!isConfigured ? 'Set up your wallet using the sidebar' : 'Unlock workspace access in the sidebar. Unlock each agent row separately.'}
956
- </div>
957
- </div>
958
- </div>
959
- ) : (
960
- <>
961
- {/* Tab Bar - only shown when unlocked */}
962
- <TabBar
963
- tabs={tabs}
964
- activeTab={activeWorkspaceId}
965
- onTabChange={handleTabChange}
966
- onTabClose={handleCloseTab}
967
- onNewTab={handleNewTab}
968
- onTabUpdate={handleTabUpdate}
969
- onTidy={tidyApps}
970
- onAppStore={() => setShowAppStore(true)}
971
- notifications={notifications}
972
- onDismissNotification={dismissNotification}
973
- />
974
-
975
- {/* Content Area - Freeform Canvas */}
976
- <div className="flex-1 relative overflow-y-auto overflow-x-hidden">
977
- {workspaceLoading ? (
978
- <div className="absolute inset-0 flex items-center justify-center">
979
- <div className="text-center">
980
- <Loader2 size={24} className="mx-auto mb-2 text-[var(--color-text-faint,#9ca3af)] animate-spin" />
981
- <div className="font-mono text-[10px] text-[var(--color-text-muted,#6b7280)]">LOADING WORKSPACE...</div>
982
- </div>
983
- </div>
984
- ) : (
985
- <div className="relative w-full h-full min-h-[800px]">
986
- {/* Render apps from context */}
987
- {workspaceApps.filter(w => w.isVisible).map((app) => (
988
- <WorkspaceApp
989
- key={app.id}
990
- app={app}
991
- onPositionChange={handleAppPositionChange}
992
- onSizeChange={handleAppSizeChange}
993
- onLockChange={handleAppLockChange}
994
- onBringToFront={handleBringToFront}
995
- onDismiss={handleDismissApp}
996
- />
997
- ))}
998
-
999
- {/* Empty state */}
1000
- {workspaceApps.length === 0 && (
1001
- <div className="absolute inset-0 flex items-center justify-center pointer-events-none">
1002
- <div className="text-center">
1003
- <div className="font-mono text-sm text-[var(--color-text-muted,#6b7280)]">EMPTY WORKSPACE</div>
1004
- <div className="font-mono text-[10px] text-[var(--color-text-faint,#9ca3af)] mt-1">Apps can be added via WebSocket or sidebar</div>
1005
- </div>
1006
- </div>
1007
- )}
1008
- </div>
1009
- )}
1010
- </div>
1011
-
1012
- <HumanActionBar
1013
- requests={requests}
1014
- resolveAction={resolveAction}
1015
- actionLoading={actionLoading}
1016
- />
1017
- </>
1018
- )}
1019
- </div>
1020
-
1021
- {/* Settings Drawer */}
1022
- <Drawer
1023
- isOpen={activeDrawer === 'settings'}
1024
- onClose={() => setActiveDrawer(null)}
1025
- title="SETTINGS"
1026
- subtitle="System configuration"
1027
- footerLabel=""
1028
- >
1029
- <SettingsContent
1030
- chains={chains}
1031
- editingChainRpc={editingChainRpc}
1032
- setEditingChainRpc={setEditingChainRpc}
1033
- customRpc={customRpc}
1034
- setCustomRpc={setCustomRpc}
1035
- savingConfig={savingConfig}
1036
- handleSaveCustomRpc={handleSaveCustomRpc}
1037
- handleRemoveChain={handleRemoveChain}
1038
- exportedSeed={exportedSeed}
1039
- setExportedSeed={setExportedSeed}
1040
- exportPassword={exportPassword}
1041
- setExportPassword={setExportPassword}
1042
- exporting={exporting}
1043
- handleExportSeed={handleExportSeed}
1044
- copied={copied}
1045
- setCopied={setCopied}
1046
- confirmNuke={confirmNuke}
1047
- nuking={nuking}
1048
- handleNuke={handleNuke}
1049
- backups={backups}
1050
- backupsLoading={backupsLoading}
1051
- creatingBackup={creatingBackup}
1052
- restoringBackup={restoringBackup}
1053
- onFetchBackups={fetchBackups}
1054
- onCreateBackup={handleCreateBackup}
1055
- onRestoreBackup={handleRestoreBackup}
1056
- exportingDb={exportingDb}
1057
- onExportDb={handleExportDb}
1058
- showAddChainPopover={showAddChainModal}
1059
- addChainAnchorEl={addChainAnchorEl}
1060
- onOpenAddChain={(el) => { setAddChainAnchorEl(el); setShowAddChainModal(true); }}
1061
- onCloseAddChain={() => { setShowAddChainModal(false); setAddChainAnchorEl(null); }}
1062
- newChain={newChain}
1063
- setNewChain={setNewChain}
1064
- handleAddChain={handleAddChain}
1065
- // Chain overrides props
1066
- chainOverrides={chainOverrides}
1067
- hasAlchemyKey={!!getApiKey('alchemy')}
1068
- // Auth state
1069
- isUnlocked={state?.isUnlocked ?? false}
1070
- // API Keys props (from AuthContext)
1071
- apiKeys={authApiKeys}
1072
- apiKeysLoading={authApiKeysLoading}
1073
- showAddApiKeyPopover={showAddApiKeyPopover}
1074
- addApiKeyAnchorEl={addApiKeyAnchorEl}
1075
- onOpenAddApiKey={(el) => { setAddApiKeyAnchorEl(el); setShowAddApiKeyPopover(true); }}
1076
- onCloseAddApiKey={() => { setShowAddApiKeyPopover(false); setAddApiKeyAnchorEl(null); }}
1077
- newApiKey={newApiKey}
1078
- setNewApiKey={setNewApiKey}
1079
- savingApiKey={savingApiKey}
1080
- handleAddApiKey={handleAddApiKey}
1081
- deletingApiKey={deletingApiKey}
1082
- handleDeleteApiKey={handleDeleteApiKey}
1083
- showRevokeAllApiKeysPopover={showRevokeAllApiKeysPopover}
1084
- revokeAllApiKeysAnchorEl={revokeAllApiKeysAnchorEl}
1085
- revokingAllApiKeys={revokingAllApiKeys}
1086
- onOpenRevokeAllApiKeys={onOpenRevokeAllApiKeys}
1087
- onCloseRevokeAllApiKeys={onCloseRevokeAllApiKeys}
1088
- handleRevokeAllApiKeys={handleRevokeAllApiKeys}
1089
- onAddAlchemyKey={handleAddAlchemyKey}
1090
- />
1091
- </Drawer>
1092
-
1093
- {/* Receive Drawer */}
1094
- <Drawer
1095
- isOpen={activeDrawer === 'receive'}
1096
- onClose={() => setActiveDrawer(null)}
1097
- title="RECEIVE"
1098
- subtitle="Fund your wallets"
1099
- >
1100
- <ReceiveContent
1101
- coldWallets={coldWallets}
1102
- copyAddress={copyAddress}
1103
- copied={copied}
1104
- />
1105
- </Drawer>
1106
-
1107
- {/* App Store Drawer - only accessible when unlocked */}
1108
- <AppStoreDrawer
1109
- isOpen={showAppStore && !isLocked && isConfigured}
1110
- onClose={() => setShowAppStore(false)}
1111
- onAddApp={handleAddAppFromStore}
1112
- />
1113
-
1114
- {/* Import Seed Modal */}
1115
- <Modal
1116
- isOpen={showImportSeedModal}
1117
- onClose={() => {
1118
- setShowImportSeedModal(false);
1119
- setImportSeedPhrase('');
1120
- setImportPassword('');
1121
- setImportConfirmPassword('');
1122
- }}
1123
- title="Import Seed Phrase"
1124
- subtitle="Recovery"
1125
- icon={<KeyRound size={20} className="text-[#0047ff]" />}
1126
- size="md"
1127
- >
1128
- <form onSubmit={handleImportSeed} className="space-y-4">
1129
- <div>
1130
- <label className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)] tracking-widest block mb-1">
1131
- SEED_PHRASE
1132
- </label>
1133
- <textarea
1134
- value={importSeedPhrase}
1135
- onChange={(e) => setImportSeedPhrase(e.target.value)}
1136
- placeholder="Enter your 12 or 24 word seed phrase..."
1137
- rows={3}
1138
- className="w-full px-3 py-2 border border-[var(--color-border,#d4d4d8)] font-mono text-xs focus:outline-none focus:border-[var(--color-border-focus,#0a0a0a)] bg-[var(--color-surface,#ffffff)] text-[var(--color-text,#0a0a0a)] resize-none"
1139
- />
1140
- </div>
1141
- <div>
1142
- <label className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)] tracking-widest block mb-1">
1143
- NEW_PASSWORD
1144
- </label>
1145
- <input
1146
- type="password"
1147
- value={importPassword}
1148
- onChange={(e) => setImportPassword(e.target.value)}
1149
- placeholder="Min 8 characters"
1150
- className="w-full px-3 py-2 border border-[var(--color-border,#d4d4d8)] font-mono text-xs focus:outline-none focus:border-[var(--color-border-focus,#0a0a0a)] bg-[var(--color-surface,#ffffff)] text-[var(--color-text,#0a0a0a)]"
1151
- />
1152
- </div>
1153
- <div>
1154
- <label className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)] tracking-widest block mb-1">
1155
- CONFIRM_PASSWORD
1156
- </label>
1157
- <input
1158
- type="password"
1159
- value={importConfirmPassword}
1160
- onChange={(e) => setImportConfirmPassword(e.target.value)}
1161
- placeholder="Confirm password"
1162
- className="w-full px-3 py-2 border border-[var(--color-border,#d4d4d8)] font-mono text-xs focus:outline-none focus:border-[var(--color-border-focus,#0a0a0a)] bg-[var(--color-surface,#ffffff)] text-[var(--color-text,#0a0a0a)]"
1163
- />
1164
- </div>
1165
- <div className="p-3 bg-[var(--color-info,#0047ff)]/5 border border-[var(--color-info,#0047ff)]/30">
1166
- <div className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)] leading-relaxed">
1167
- This will restore your wallet from the seed phrase. All hot wallets will be re-derived from this seed.
1168
- </div>
1169
- </div>
1170
- <div className="flex gap-2">
1171
- <button
1172
- type="button"
1173
- onClick={() => {
1174
- setShowImportSeedModal(false);
1175
- setImportSeedPhrase('');
1176
- setImportPassword('');
1177
- setImportConfirmPassword('');
1178
- }}
1179
- className="flex-1 h-10 border border-[var(--color-border,#d4d4d8)] font-mono text-[10px] tracking-widest text-[var(--color-text-muted,#6b7280)] hover:border-[var(--color-border-focus,#0a0a0a)] hover:text-[var(--color-text,#0a0a0a)] transition-colors"
1180
- >
1181
- CANCEL
1182
- </button>
1183
- <button
1184
- type="submit"
1185
- disabled={importing || !importSeedPhrase || !importPassword || !importConfirmPassword}
1186
- className="flex-1 h-10 bg-[var(--color-text,#0a0a0a)] text-white font-mono text-[10px] tracking-widest flex items-center justify-center gap-2 disabled:opacity-50 hover:text-[var(--color-accent,#ccff00)] transition-colors"
1187
- >
1188
- {importing ? <Loader2 size={12} className="animate-spin" /> : <KeyRound size={12} />}
1189
- {importing ? 'IMPORTING...' : 'IMPORT'}
1190
- </button>
1191
- </div>
1192
- </form>
1193
- </Modal>
1194
-
1195
- {/* Passkey Enrollment Prompt - shown after unlock if passkeys not yet registered */}
1196
- <PasskeyEnrollmentPrompt isUnlocked={state?.isUnlocked ?? false} />
1197
- </div>
1198
- );
1199
- }
1200
-
1201
- // WorkspaceApp - Renders a app from the workspace context
1202
- // All apps are self-contained and only receive config
1203
- interface WorkspaceAppProps {
1204
- app: WorkspaceAppState;
1205
- onPositionChange: (id: string, pos: { x: number; y: number }) => void;
1206
- onSizeChange: (id: string, size: { width: number; height: number }) => void;
1207
- onLockChange: (id: string, locked: boolean) => void;
1208
- onBringToFront: (id: string) => void;
1209
- onDismiss: (id: string) => void;
1210
- }
1211
-
1212
- function WorkspaceApp({
1213
- app,
1214
- onPositionChange,
1215
- onSizeChange,
1216
- onLockChange,
1217
- onBringToFront,
1218
- onDismiss,
1219
- }: WorkspaceAppProps) {
1220
- const [refreshKey, setRefreshKey] = useState(0);
1221
- const isThirdParty = app.appType.startsWith('installed:');
1222
- const definition = getAppDefinition(app.appType);
1223
-
1224
- if (!definition) {
1225
- return (
1226
- <DraggableApp
1227
- id={app.id}
1228
- title={`UNKNOWN: ${app.appType}`}
1229
- icon={Code}
1230
- color="gray"
1231
- initialPosition={{ x: app.x, y: app.y }}
1232
- initialSize={{ width: app.width, height: app.height }}
1233
- locked={app.isLocked}
1234
- onLockChange={onLockChange}
1235
- dismissable
1236
- onDismiss={() => onDismiss(app.id)}
1237
- onPositionChange={onPositionChange}
1238
- onSizeChange={onSizeChange}
1239
- onBringToFront={onBringToFront}
1240
- zIndex={app.zIndex}
1241
- >
1242
- <div className="py-4 text-center">
1243
- <Code size={20} className="mx-auto mb-2 text-[var(--color-text-faint,#9ca3af)]" />
1244
- <div className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)]">UNKNOWN APP TYPE</div>
1245
- <div className="font-mono text-[8px] text-[var(--color-text-faint,#9ca3af)] mt-1">{app.appType}</div>
1246
- </div>
1247
- </DraggableApp>
1248
- );
1249
- }
1250
-
1251
- const AppComponent = definition.component;
1252
-
1253
- // All apps are self-contained - just pass config
1254
- const renderContent = () => {
1255
- const config = isThirdParty
1256
- ? {
1257
- appPath: app.appType.slice(10), // installed:agent-chat -> agent-chat
1258
- ...app.config, // Explicit config (if present) wins
1259
- _refreshKey: refreshKey,
1260
- }
1261
- : app.config;
1262
- return (
1263
- <Suspense fallback={<AppLoading />}>
1264
- <AppComponent config={config} />
1265
- </Suspense>
1266
- );
1267
- };
1268
-
1269
- // Get title for wallet detail apps (use config passed when app was opened)
1270
- const getTitle = () => {
1271
- if (app.appType === 'walletDetail') {
1272
- const emoji = app.config?.walletEmoji as string | undefined;
1273
- const name = app.config?.walletName as string | undefined;
1274
- if (emoji || name) {
1275
- return emoji ? `${emoji} ${name || 'WALLET'}` : (name || 'WALLET');
1276
- }
1277
- }
1278
- return definition.title;
1279
- };
1280
-
1281
- // Get color for wallet detail apps (use config passed when app was opened)
1282
- const getColor = (): AppColor => {
1283
- if (app.appType === 'walletDetail') {
1284
- const color = app.config?.walletColor as string | undefined;
1285
- if (color) {
1286
- const colorMap: Record<string, AppColor> = {
1287
- '#ff4d00': 'orange',
1288
- '#0047ff': 'blue',
1289
- '#00c853': 'teal',
1290
- '#ffab00': 'orange',
1291
- '#9c27b0': 'purple',
1292
- '#00bcd4': 'teal',
1293
- '#e91e63': 'rose',
1294
- '#607d8b': 'gray',
1295
- };
1296
- return colorMap[color] || 'orange';
1297
- }
1298
- }
1299
- return definition.color;
1300
- };
1301
-
1302
- // Get subtitle for iframe apps (show URL hostname)
1303
- const getSubtitle = () => {
1304
- if (app.appType === 'iframe' && app.config?.url) {
1305
- try {
1306
- const url = new URL(app.config.url as string);
1307
- return url.hostname;
1308
- } catch {
1309
- return undefined;
1310
- }
1311
- }
1312
- return undefined;
1313
- };
1314
-
1315
- const getSubtitleLink = () => {
1316
- if (app.appType === 'iframe' && app.config?.url) {
1317
- return app.config.url as string;
1318
- }
1319
- return undefined;
1320
- };
1321
-
1322
- return (
1323
- <DraggableApp
1324
- id={app.id}
1325
- title={getTitle()}
1326
- subtitle={getSubtitle()}
1327
- subtitleLink={getSubtitleLink()}
1328
- icon={definition.icon}
1329
- color={getColor()}
1330
- initialPosition={{ x: app.x, y: app.y }}
1331
- initialSize={{ width: app.width, height: app.height }}
1332
- locked={app.isLocked}
1333
- onLockChange={onLockChange}
1334
- onRefresh={isThirdParty ? () => setRefreshKey(k => k + 1) : undefined}
1335
- dismissable
1336
- onDismiss={() => onDismiss(app.id)}
1337
- onPositionChange={onPositionChange}
1338
- onSizeChange={onSizeChange}
1339
- onBringToFront={onBringToFront}
1340
- zIndex={app.zIndex}
1341
- >
1342
- {renderContent()}
1343
- </DraggableApp>
1344
- );
1345
- }
1346
-
1347
- function AppLoading() {
1348
- return (
1349
- <div className="py-6 text-center">
1350
- <Loader2 size={20} className="mx-auto mb-2 text-[var(--color-text-faint,#9ca3af)] animate-spin" />
1351
- <div className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)]">LOADING...</div>
1352
- </div>
1353
- );
1354
- }
1355
-
1356
- interface BackupInfo {
1357
- filename: string;
1358
- timestamp: string;
1359
- size: number;
1360
- date: string;
1361
- }
1362
-
1363
- function SettingsContent({
1364
- chains,
1365
- editingChainRpc,
1366
- setEditingChainRpc,
1367
- customRpc,
1368
- setCustomRpc,
1369
- savingConfig,
1370
- handleSaveCustomRpc,
1371
- handleRemoveChain,
1372
- exportedSeed,
1373
- setExportedSeed,
1374
- exportPassword,
1375
- setExportPassword,
1376
- exporting,
1377
- handleExportSeed,
1378
- copied,
1379
- setCopied,
1380
- confirmNuke,
1381
- nuking,
1382
- handleNuke,
1383
- backups,
1384
- backupsLoading,
1385
- creatingBackup,
1386
- restoringBackup,
1387
- onFetchBackups,
1388
- onCreateBackup,
1389
- onRestoreBackup,
1390
- exportingDb,
1391
- onExportDb,
1392
- showAddChainPopover,
1393
- addChainAnchorEl,
1394
- onOpenAddChain,
1395
- onCloseAddChain,
1396
- newChain,
1397
- setNewChain,
1398
- handleAddChain,
1399
- // Chain overrides props
1400
- chainOverrides,
1401
- hasAlchemyKey,
1402
- // Auth state
1403
- isUnlocked,
1404
- // API Keys props
1405
- apiKeys,
1406
- apiKeysLoading,
1407
- showAddApiKeyPopover,
1408
- addApiKeyAnchorEl,
1409
- onOpenAddApiKey,
1410
- onCloseAddApiKey,
1411
- newApiKey,
1412
- setNewApiKey,
1413
- savingApiKey,
1414
- handleAddApiKey,
1415
- deletingApiKey,
1416
- handleDeleteApiKey,
1417
- showRevokeAllApiKeysPopover,
1418
- revokeAllApiKeysAnchorEl,
1419
- revokingAllApiKeys,
1420
- onOpenRevokeAllApiKeys,
1421
- onCloseRevokeAllApiKeys,
1422
- handleRevokeAllApiKeys,
1423
- onAddAlchemyKey,
1424
- }: {
1425
- chains: Record<string, { rpc: string; chainId: number; explorer: string; nativeCurrency: string }>;
1426
- editingChainRpc: string | null;
1427
- setEditingChainRpc: (c: string | null) => void;
1428
- customRpc: string;
1429
- setCustomRpc: (r: string) => void;
1430
- savingConfig: boolean;
1431
- handleSaveCustomRpc: (chain: string, rpc: string) => void;
1432
- handleRemoveChain: (chain: string) => void;
1433
- exportedSeed: string | null;
1434
- setExportedSeed: (s: string | null) => void;
1435
- exportPassword: string;
1436
- setExportPassword: (p: string) => void;
1437
- exporting: boolean;
1438
- handleExportSeed: (e: React.FormEvent) => void;
1439
- copied: string | null;
1440
- setCopied: (c: string | null) => void;
1441
- confirmNuke: boolean;
1442
- nuking: boolean;
1443
- handleNuke: () => void;
1444
- backups: BackupInfo[];
1445
- backupsLoading: boolean;
1446
- creatingBackup: boolean;
1447
- restoringBackup: string | null;
1448
- onFetchBackups: () => void;
1449
- onCreateBackup: () => void;
1450
- onRestoreBackup: (filename: string) => void;
1451
- exportingDb: boolean;
1452
- onExportDb: () => void;
1453
- showAddChainPopover: boolean;
1454
- addChainAnchorEl: HTMLElement | null;
1455
- onOpenAddChain: (el: HTMLElement) => void;
1456
- onCloseAddChain: () => void;
1457
- newChain: { name: string; chainId: string; rpc: string; explorer: string; nativeCurrency: string };
1458
- setNewChain: (c: { name: string; chainId: string; rpc: string; explorer: string; nativeCurrency: string }) => void;
1459
- // Chain overrides types
1460
- chainOverrides: Record<string, ChainConfig>;
1461
- hasAlchemyKey: boolean;
1462
- // Auth state
1463
- isUnlocked: boolean;
1464
- // API Keys types
1465
- apiKeys: ApiKey[];
1466
- apiKeysLoading: boolean;
1467
- showAddApiKeyPopover: boolean;
1468
- addApiKeyAnchorEl: HTMLElement | null;
1469
- onOpenAddApiKey: (el: HTMLElement) => void;
1470
- onCloseAddApiKey: () => void;
1471
- newApiKey: { service: string; name: string; key: string };
1472
- setNewApiKey: (k: { service: string; name: string; key: string }) => void;
1473
- savingApiKey: boolean;
1474
- handleAddApiKey: () => void;
1475
- deletingApiKey: string | null;
1476
- handleDeleteApiKey: (id: string) => void;
1477
- showRevokeAllApiKeysPopover: boolean;
1478
- revokeAllApiKeysAnchorEl: HTMLElement | null;
1479
- revokingAllApiKeys: boolean;
1480
- onOpenRevokeAllApiKeys: (el: HTMLElement) => void;
1481
- onCloseRevokeAllApiKeys: () => void;
1482
- handleRevokeAllApiKeys: () => void;
1483
- handleAddChain: () => void;
1484
- onAddAlchemyKey: (key: string) => Promise<boolean>;
1485
- }) {
1486
- const [restoreConfirmOpen, setRestoreConfirmOpen] = React.useState<string | null>(null);
1487
- const [restoreAnchorEl, setRestoreAnchorEl] = React.useState<HTMLElement | null>(null);
1488
- const [alchemyKeyInput, setAlchemyKeyInput] = React.useState('');
1489
- const [addingAlchemyKey, setAddingAlchemyKey] = React.useState(false);
1490
-
1491
- // Fetch backups when component mounts (only if unlocked)
1492
- React.useEffect(() => {
1493
- if (isUnlocked) {
1494
- onFetchBackups();
1495
- }
1496
- // eslint-disable-next-line react-hooks/exhaustive-deps
1497
- }, [isUnlocked]);
1498
-
1499
- // Handle adding Alchemy API key
1500
- const handleAlchemyKeySubmit = async () => {
1501
- if (!alchemyKeyInput.trim()) return;
1502
- setAddingAlchemyKey(true);
1503
- const success = await onAddAlchemyKey(alchemyKeyInput.trim());
1504
- if (success) {
1505
- setAlchemyKeyInput('');
1506
- }
1507
- setAddingAlchemyKey(false);
1508
- };
1509
-
1510
- const formatBackupDate = (timestamp: string) => {
1511
- // timestamp format: YYYYMMDD_HHMMSS
1512
- const year = timestamp.slice(0, 4);
1513
- const month = timestamp.slice(4, 6);
1514
- const day = timestamp.slice(6, 8);
1515
- const hour = timestamp.slice(9, 11);
1516
- const minute = timestamp.slice(11, 13);
1517
- return `${year}-${month}-${day} ${hour}:${minute}`;
1518
- };
1519
-
1520
- const formatSize = (bytes: number) => {
1521
- if (bytes < 1024) return `${bytes} B`;
1522
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
1523
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
1524
- };
1525
- // Alchemy-supported chains
1526
- const alchemyChains = ['base', 'ethereum', 'arbitrum', 'optimism'];
1527
-
1528
- // Get the RPC source for a chain (override, alchemy, or public)
1529
- const getRpcSource = (chainName: string): 'override' | 'alchemy' | 'public' => {
1530
- if (chainOverrides[chainName]) return 'override';
1531
- if (hasAlchemyKey && alchemyChains.includes(chainName)) return 'alchemy';
1532
- return 'public';
1533
- };
1534
-
1535
- const [agentSectionOpen, setAgentSectionOpen] = React.useState(false);
1536
- const [agentTier, setAgentTier] = React.useState<string>('admin');
1537
- const [agentTierLoading, setAgentTierLoading] = React.useState(true);
1538
- const [agentTierSaving, setAgentTierSaving] = React.useState(false);
1539
-
1540
- // Fetch agent tier on mount
1541
- React.useEffect(() => {
1542
- (async () => {
1543
- try {
1544
- const grouped = await api.get<Record<string, Array<{ key: string; value: unknown }>>>(Api.Wallet, '/defaults');
1545
- const permsGroup = grouped.permissions || [];
1546
- const tierRow = permsGroup.find((r: { key: string }) => r.key === 'permissions.agent_tier');
1547
- if (tierRow) setAgentTier(tierRow.value as string);
1548
- } catch { /* use default */ }
1549
- finally { setAgentTierLoading(false); }
1550
- })();
1551
- }, []);
1552
-
1553
- const handleTierChange = async (tier: string) => {
1554
- setAgentTier(tier);
1555
- setAgentTierSaving(true);
1556
- try {
1557
- await api.patch(Api.Wallet, `/defaults/${encodeURIComponent('permissions.agent_tier')}`, { value: tier });
1558
- } catch { /* revert on error */ setAgentTier(tier === 'admin' ? 'restricted' : 'admin'); }
1559
- finally { setAgentTierSaving(false); }
1560
- };
1561
-
1562
- const [systemDefaultsOpen, setSystemDefaultsOpen] = React.useState(false);
1563
- const [rpcOpen, setRpcOpen] = React.useState(false);
1564
- const [apiKeysOpen, setApiKeysOpen] = React.useState(false);
1565
- const [exportSeedOpen, setExportSeedOpen] = React.useState(false);
1566
- const [backupOpen, setBackupOpen] = React.useState(false);
1567
- const [dangerOpen, setDangerOpen] = React.useState(false);
1568
-
1569
- return (
1570
- <div className="space-y-4">
1571
- {/* DEFAULT_AGENT — permission tier + AI model */}
1572
- <TyvekCollapsibleSection
1573
- title="DEFAULT_AGENT"
1574
- icon={<Bot size={12} />}
1575
- isOpen={agentSectionOpen}
1576
- onToggle={() => setAgentSectionOpen(!agentSectionOpen)}
1577
- contentClassName="p-4 pt-0 space-y-4"
1578
- >
1579
- {/* Permission Tier Toggle */}
1580
- <div className="p-3 space-y-2 border border-[var(--color-border)] bg-[var(--color-surface)]">
1581
- <div className="font-mono text-[10px] text-[var(--color-text)]">Permission Tier</div>
1582
- <div className="font-mono text-[8px] text-[var(--color-text-muted)]">
1583
- Controls what the agent-chat app can do directly
1584
- </div>
1585
- {agentTierLoading ? (
1586
- <div className="flex items-center gap-2 py-2">
1587
- <Loader2 size={12} className="animate-spin text-[var(--color-text-muted)]" />
1588
- </div>
1589
- ) : (
1590
- <div className="flex gap-2">
1591
- <Button
1592
- type="button"
1593
- onClick={() => handleTierChange('admin')}
1594
- disabled={agentTierSaving}
1595
- variant={agentTier === 'admin' ? 'secondary' : 'ghost'}
1596
- size="md"
1597
- className={`flex-1 !h-auto !p-2 !justify-start border ${
1598
- agentTier === 'admin'
1599
- ? 'border-[var(--color-accent)] text-[var(--color-text)] bg-[var(--color-background-alt)]'
1600
- : 'border-[var(--color-border)] text-[var(--color-text-muted)]'
1601
- }`}
1602
- >
1603
- <div className="text-left">
1604
- <div className="font-bold text-[9px] tracking-normal">Full Admin</div>
1605
- <div className="text-[8px] tracking-normal text-[var(--color-text-muted)]">Agent can do everything directly</div>
1606
- </div>
1607
- </Button>
1608
- <Button
1609
- type="button"
1610
- onClick={() => handleTierChange('restricted')}
1611
- disabled={agentTierSaving}
1612
- variant={agentTier === 'restricted' ? 'secondary' : 'ghost'}
1613
- size="md"
1614
- className={`flex-1 !h-auto !p-2 !justify-start border ${
1615
- agentTier === 'restricted'
1616
- ? 'border-[var(--color-accent)] text-[var(--color-text)] bg-[var(--color-background-alt)]'
1617
- : 'border-[var(--color-border)] text-[var(--color-text-muted)]'
1618
- }`}
1619
- >
1620
- <div className="text-left">
1621
- <div className="font-bold text-[9px] tracking-normal">Restricted</div>
1622
- <div className="text-[8px] tracking-normal text-[var(--color-text-muted)]">Approval required for actions</div>
1623
- </div>
1624
- </Button>
1625
- </div>
1626
- )}
1627
- </div>
1628
-
1629
- {/* AI Model Selection (moved from SystemDefaults) */}
1630
- <AiEngineSection />
1631
- </TyvekCollapsibleSection>
1632
-
1633
- {/* System Defaults (limits, permissions, AI engine) — collapsible */}
1634
- <TyvekCollapsibleSection
1635
- title="SYSTEM_DEFAULTS"
1636
- icon={<Settings size={12} />}
1637
- isOpen={systemDefaultsOpen}
1638
- onToggle={() => setSystemDefaultsOpen(!systemDefaultsOpen)}
1639
- >
1640
- <SystemDefaults />
1641
- </TyvekCollapsibleSection>
1642
-
1643
- {/* RPC Configuration */}
1644
- <TyvekCollapsibleSection
1645
- title="RPC_CONFIGURATION"
1646
- icon={<Code size={12} />}
1647
- isOpen={rpcOpen}
1648
- onToggle={() => setRpcOpen(!rpcOpen)}
1649
- contentClassName="p-4 pt-0"
1650
- >
1651
- <div className="p-3 bg-[var(--color-background-alt)] border border-[var(--color-border)] space-y-4">
1652
- {/* Quick Setup - Alchemy API Key */}
1653
- <div className="p-3 border border-dashed border-[var(--color-border)] bg-[var(--color-surface)]">
1654
- <div className="font-mono text-[9px] text-[var(--color-text-muted)] uppercase tracking-widest mb-2">ALCHEMY API KEY</div>
1655
- {hasAlchemyKey ? (
1656
- <div className="space-y-2">
1657
- <div className="flex items-center gap-2">
1658
- <Check size={12} className="text-[var(--color-success)]" />
1659
- <span className="font-mono text-[10px] text-[var(--color-success)]">Configured</span>
1660
- <span className="font-mono text-[8px] text-[var(--color-text-muted)]">
1661
- (auto-configures: {alchemyChains.join(', ')})
1662
- </span>
1663
- </div>
1664
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] leading-relaxed">
1665
- Remove in API Keys section below. Custom overrides take priority.
1666
- </div>
1667
- </div>
1668
- ) : (
1669
- <div className="space-y-2">
1670
- <div className="font-mono text-[8px] text-[var(--color-text-muted)] leading-relaxed mb-2">
1671
- Get a free key at alchemy.com to auto-configure: {alchemyChains.join(', ')}
1672
- </div>
1673
- <div className="flex gap-2">
1674
- <div className="flex-1">
1675
- <TextInput
1676
- label=""
1677
- type="password"
1678
- value={alchemyKeyInput}
1679
- onChange={(e) => setAlchemyKeyInput(e.target.value)}
1680
- placeholder="Paste your Alchemy API key..."
1681
- compact
1682
- />
1683
- </div>
1684
- <Button
1685
- size="sm"
1686
- onClick={handleAlchemyKeySubmit}
1687
- disabled={addingAlchemyKey || !alchemyKeyInput.trim()}
1688
- loading={addingAlchemyKey}
1689
- icon={!addingAlchemyKey ? <Plus size={10} /> : undefined}
1690
- >
1691
- ADD
1692
- </Button>
1693
- </div>
1694
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] leading-relaxed">
1695
- Currently using public RPCs (may have rate limits).
1696
- </div>
1697
- </div>
1698
- )}
1699
- </div>
1700
-
1701
- {/* Chain Overrides */}
1702
- <div>
1703
- <div className="flex items-center justify-between mb-2">
1704
- <div className="font-mono text-[9px] text-[var(--color-text-muted)] uppercase tracking-widest">CHAIN OVERRIDES</div>
1705
- <div className="relative">
1706
- <Button
1707
- variant="ghost"
1708
- size="sm"
1709
- onClick={(e) => onOpenAddChain(e.currentTarget)}
1710
- icon={<Plus size={10} />}
1711
- >
1712
- ADD
1713
- </Button>
1714
- <Popover
1715
- isOpen={showAddChainPopover}
1716
- onClose={onCloseAddChain}
1717
- title="ADD_CHAIN"
1718
- anchorEl={addChainAnchorEl}
1719
- anchor="right"
1720
- className="w-64"
1721
- >
1722
- <div className="space-y-3">
1723
- <div className="font-mono text-[8px] text-[var(--color-text-muted)] leading-relaxed">
1724
- Known chains: arbitrum, optimism, polygon, zksync
1725
- </div>
1726
- <TextInput
1727
- label="NAME"
1728
- type="text"
1729
- value={newChain.name}
1730
- onChange={(e) => setNewChain({ ...newChain, name: e.target.value })}
1731
- placeholder="arbitrum, polygon, zksync..."
1732
- compact
1733
- />
1734
- <TextInput
1735
- label="CHAIN_ID"
1736
- type="number"
1737
- value={newChain.chainId}
1738
- onChange={(e) => setNewChain({ ...newChain, chainId: e.target.value })}
1739
- placeholder="42161, 10, 137..."
1740
- compact
1741
- />
1742
- <TextInput
1743
- label="RPC (optional)"
1744
- type="text"
1745
- value={newChain.rpc}
1746
- onChange={(e) => setNewChain({ ...newChain, rpc: e.target.value })}
1747
- placeholder="blank = use Alchemy"
1748
- compact
1749
- />
1750
- <Button
1751
- size="md"
1752
- onClick={() => { handleAddChain(); onCloseAddChain(); }}
1753
- disabled={savingConfig || !newChain.name || !newChain.chainId}
1754
- loading={savingConfig}
1755
- icon={!savingConfig ? <Plus size={10} /> : undefined}
1756
- className="w-full"
1757
- >
1758
- ADD CHAIN
1759
- </Button>
1760
- </div>
1761
- </Popover>
1762
- </div>
1763
- </div>
1764
- <div className="space-y-2">
1765
- {Object.entries(chains).map(([chainName, chainConfig]) => {
1766
- const source = getRpcSource(chainName);
1767
- // Can remove any chain except defaults (base, ethereum)
1768
- const canRemove = !['base', 'ethereum'].includes(chainName);
1769
- return (
1770
- <div key={chainName} className="flex items-center gap-2 p-2 bg-[var(--color-surface)] border border-[var(--color-border)]">
1771
- <div className="w-20 font-mono text-[10px] font-bold text-[var(--color-text)] uppercase flex items-center gap-1">
1772
- {chainName}
1773
- <span className={`font-mono text-[7px] px-1 py-0.5 rounded ${
1774
- source === 'override' ? 'bg-[var(--color-accent)]/20 text-[var(--color-accent)]' :
1775
- source === 'alchemy' ? 'bg-[var(--color-success)]/20 text-[var(--color-success)]' :
1776
- 'bg-[var(--color-text-muted)]/20 text-[var(--color-text-muted)]'
1777
- }`}>
1778
- {source === 'override' ? 'CUSTOM' : source === 'alchemy' ? 'ALCHEMY' : 'PUBLIC'}
1779
- </span>
1780
- </div>
1781
- {editingChainRpc === chainName ? (
1782
- <div className="flex-1">
1783
- <TextInput
1784
- label=""
1785
- type="text"
1786
- value={customRpc}
1787
- onChange={(e) => setCustomRpc(e.target.value)}
1788
- placeholder="https://..."
1789
- compact
1790
- autoFocus
1791
- rightElement={
1792
- <div className="flex gap-1">
1793
- <Button variant="ghost" size="sm" onClick={() => handleSaveCustomRpc(chainName, customRpc)} icon={<Check size={12} className="text-[var(--color-success)]" />}>
1794
- {''}
1795
- </Button>
1796
- <Button variant="ghost" size="sm" onClick={() => { setEditingChainRpc(null); setCustomRpc(''); }} icon={<X size={12} />}>
1797
- {''}
1798
- </Button>
1799
- </div>
1800
- }
1801
- />
1802
- </div>
1803
- ) : (
1804
- <>
1805
- <div className="flex-1" />
1806
- <Button variant="secondary" size="sm" onClick={() => { setEditingChainRpc(chainName); setCustomRpc(chainConfig.rpc); }}>
1807
- EDIT RPC
1808
- </Button>
1809
- {canRemove && (
1810
- <Button variant="ghost" size="sm" onClick={() => handleRemoveChain(chainName)} icon={<Trash2 size={10} />} className="hover:text-[var(--color-warning)]">
1811
- {''}
1812
- </Button>
1813
- )}
1814
- </>
1815
- )}
1816
- </div>
1817
- );
1818
- })}
1819
- </div>
1820
- </div>
1821
- </div>
1822
- </TyvekCollapsibleSection>
1823
-
1824
- {/* API Keys */}
1825
- <TyvekCollapsibleSection
1826
- title="API_KEYS"
1827
- icon={<KeyRound size={12} />}
1828
- isOpen={apiKeysOpen}
1829
- onToggle={() => setApiKeysOpen(!apiKeysOpen)}
1830
- contentClassName="p-4 pt-0"
1831
- >
1832
- <div className="p-3 bg-[var(--color-background-alt)] border border-[var(--color-border)] space-y-3">
1833
- <div className="flex items-center justify-between gap-2">
1834
- <div className="font-mono text-[9px] text-[var(--color-text-muted)]">
1835
- Store API keys for premium services (Alchemy, Infura, etc.)
1836
- </div>
1837
- <div className="flex items-center gap-1">
1838
- {apiKeys.length > 0 && (
1839
- <div className="relative">
1840
- <Button
1841
- variant="danger"
1842
- size="sm"
1843
- onClick={(e) => onOpenRevokeAllApiKeys(e.currentTarget)}
1844
- disabled={revokingAllApiKeys}
1845
- icon={revokingAllApiKeys ? <Loader2 size={10} className="animate-spin" /> : <AlertTriangle size={10} />}
1846
- >
1847
- REVOKE ALL
1848
- </Button>
1849
- <ConfirmationModal
1850
- isOpen={showRevokeAllApiKeysPopover}
1851
- onClose={onCloseRevokeAllApiKeys}
1852
- onConfirm={handleRevokeAllApiKeys}
1853
- title="Revoke All API Keys"
1854
- message="Revoking all API keys can lock the agent by disabling services that depend on them. This action revokes every active API key immediately."
1855
- confirmText="REVOKE ALL"
1856
- variant="danger"
1857
- loading={revokingAllApiKeys}
1858
- />
1859
- </div>
1860
- )}
1861
- <div className="relative">
1862
- <Button
1863
- variant="ghost"
1864
- size="sm"
1865
- onClick={(e) => onOpenAddApiKey(e.currentTarget)}
1866
- icon={<Plus size={10} />}
1867
- >
1868
- ADD
1869
- </Button>
1870
- <Popover
1871
- isOpen={showAddApiKeyPopover}
1872
- onClose={onCloseAddApiKey}
1873
- title="ADD_API_KEY"
1874
- anchorEl={addApiKeyAnchorEl}
1875
- anchor="right"
1876
- className="w-72"
1877
- >
1878
- <div className="space-y-3">
1879
- <TextInput
1880
- label="SERVICE"
1881
- type="text"
1882
- value={newApiKey.service}
1883
- onChange={(e) => setNewApiKey({ ...newApiKey, service: e.target.value })}
1884
- placeholder="alchemy, infura, etherscan..."
1885
- compact
1886
- />
1887
- <TextInput
1888
- label="NAME"
1889
- type="text"
1890
- value={newApiKey.name}
1891
- onChange={(e) => setNewApiKey({ ...newApiKey, name: e.target.value })}
1892
- placeholder="My API Key"
1893
- compact
1894
- />
1895
- <TextInput
1896
- label="API_KEY"
1897
- type="password"
1898
- value={newApiKey.key}
1899
- onChange={(e) => setNewApiKey({ ...newApiKey, key: e.target.value })}
1900
- placeholder="Enter your API key..."
1901
- compact
1902
- />
1903
- <Button
1904
- size="md"
1905
- onClick={handleAddApiKey}
1906
- disabled={savingApiKey || !newApiKey.service || !newApiKey.name || !newApiKey.key}
1907
- loading={savingApiKey}
1908
- icon={!savingApiKey ? <Plus size={10} /> : undefined}
1909
- className="w-full"
1910
- >
1911
- ADD KEY
1912
- </Button>
1913
- </div>
1914
- </Popover>
1915
- </div>
1916
- </div>
1917
- </div>
1918
-
1919
- {apiKeysLoading ? (
1920
- <div className="py-4 flex items-center justify-center">
1921
- <Loader2 size={16} className="animate-spin text-[var(--color-text-muted)]" />
1922
- </div>
1923
- ) : apiKeys.length === 0 ? (
1924
- <div className="py-4 text-center border border-dashed border-[var(--color-border)]">
1925
- <div className="font-mono text-[9px] text-[var(--color-text-muted)]">No API keys stored</div>
1926
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] mt-1">Add keys for Alchemy, Infura, etc.</div>
1927
- </div>
1928
- ) : (
1929
- <div className="space-y-2">
1930
- {apiKeys.map((apiKey) => (
1931
- <div key={apiKey.id} className="flex items-center gap-2 p-2 bg-[var(--color-surface)] border border-[var(--color-border)]">
1932
- <div className="flex-1 min-w-0">
1933
- <div className="flex items-center gap-2">
1934
- <span className="font-mono text-[10px] font-bold text-[var(--color-text)] uppercase">{apiKey.service}</span>
1935
- <span className="font-mono text-[9px] text-[var(--color-text-muted)]">{apiKey.name}</span>
1936
- </div>
1937
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] truncate">
1938
- {apiKey.keyMasked || apiKey.key}
1939
- </div>
1940
- </div>
1941
- <Button
1942
- variant="ghost"
1943
- size="sm"
1944
- onClick={() => handleDeleteApiKey(apiKey.id)}
1945
- disabled={deletingApiKey === apiKey.id}
1946
- icon={deletingApiKey === apiKey.id ? <Loader2 size={10} className="animate-spin" /> : <Trash2 size={10} />}
1947
- className="hover:text-[var(--color-warning)]"
1948
- >
1949
- {''}
1950
- </Button>
1951
- </div>
1952
- ))}
1953
- </div>
1954
- )}
1955
-
1956
- <div className="pt-2 border-t border-dashed border-[var(--color-border)]">
1957
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] leading-relaxed">
1958
- Alchemy keys will automatically configure RPCs for supported chains.
1959
- </div>
1960
- </div>
1961
- </div>
1962
- </TyvekCollapsibleSection>
1963
-
1964
- {/* Export Seed */}
1965
- <TyvekCollapsibleSection
1966
- title="EXPORT_SEED"
1967
- icon={<Shield size={12} />}
1968
- isOpen={exportSeedOpen}
1969
- onToggle={() => setExportSeedOpen(!exportSeedOpen)}
1970
- contentClassName="p-4 pt-0"
1971
- >
1972
- {exportedSeed ? (
1973
- <div className="space-y-3">
1974
- <div className="p-3 bg-[var(--color-text)] border border-[var(--color-border-focus)] relative">
1975
- <Button
1976
- variant="ghost"
1977
- size="sm"
1978
- onClick={() => { navigator.clipboard.writeText(exportedSeed); setCopied('exported'); setTimeout(() => setCopied(null), 2000); }}
1979
- className="absolute top-2 right-2 bg-[var(--color-text-muted)]/20 hover:bg-[var(--color-text-muted)]/40"
1980
- icon={<Copy size={10} className={copied === 'exported' ? 'text-[var(--color-accent)]' : 'text-[var(--color-surface)]'} />}
1981
- >
1982
- {''}
1983
- </Button>
1984
- <div className="font-mono text-xs text-[var(--color-accent)] leading-relaxed break-words select-all pr-8">{exportedSeed}</div>
1985
- </div>
1986
- <Button variant="ghost" size="sm" onClick={() => setExportedSeed(null)}>
1987
- HIDE
1988
- </Button>
1989
- </div>
1990
- ) : (
1991
- <form onSubmit={handleExportSeed}>
1992
- <TextInput
1993
- label="PASSWORD"
1994
- type="password"
1995
- value={exportPassword}
1996
- onChange={(e) => setExportPassword(e.target.value)}
1997
- placeholder="Enter password to export..."
1998
- compact
1999
- rightElement={
2000
- <Button type="submit" size="sm" disabled={exporting || !exportPassword} loading={exporting}>
2001
- EXPORT
2002
- </Button>
2003
- }
2004
- />
2005
- </form>
2006
- )}
2007
- </TyvekCollapsibleSection>
2008
-
2009
- {/* Database Backup */}
2010
- <TyvekCollapsibleSection
2011
- title="DATABASE_BACKUP"
2012
- icon={<Database size={12} />}
2013
- isOpen={backupOpen}
2014
- onToggle={() => setBackupOpen(!backupOpen)}
2015
- contentClassName="p-4 pt-0"
2016
- >
2017
- <div className="space-y-3">
2018
- <Button
2019
- variant="secondary"
2020
- size="lg"
2021
- onClick={onCreateBackup}
2022
- disabled={creatingBackup}
2023
- loading={creatingBackup}
2024
- icon={!creatingBackup ? <Plus size={12} /> : undefined}
2025
- className="w-full"
2026
- >
2027
- {creatingBackup ? 'CREATING...' : 'CREATE BACKUP'}
2028
- </Button>
2029
- <Button
2030
- variant="secondary"
2031
- size="lg"
2032
- onClick={onExportDb}
2033
- disabled={exportingDb}
2034
- loading={exportingDb}
2035
- icon={!exportingDb ? <Database size={12} /> : undefined}
2036
- className="w-full"
2037
- >
2038
- {exportingDb ? 'EXPORTING...' : 'EXPORT DATABASE'}
2039
- </Button>
2040
-
2041
- {backupsLoading ? (
2042
- <div className="py-4 flex items-center justify-center">
2043
- <Loader2 size={16} className="animate-spin text-[var(--color-text-muted)]" />
2044
- </div>
2045
- ) : backups.length === 0 ? (
2046
- <div className="py-4 text-center">
2047
- <div className="font-mono text-[9px] text-[var(--color-text-muted)]">No backups found</div>
2048
- </div>
2049
- ) : (
2050
- <div className="space-y-1 max-h-48 overflow-y-auto">
2051
- {backups.map((backup) => (
2052
- <div key={backup.filename} className="relative">
2053
- <Button
2054
- type="button"
2055
- variant="secondary"
2056
- size="md"
2057
- onClick={(e) => {
2058
- setRestoreAnchorEl(e.currentTarget);
2059
- setRestoreConfirmOpen(backup.filename);
2060
- }}
2061
- className="w-full !h-auto !px-2 !py-2 !justify-between group"
2062
- >
2063
- <div className="flex items-center gap-2">
2064
- <RotateCcw size={10} className="text-[var(--color-text-muted)] group-hover:text-[var(--color-text)]" />
2065
- <span className="font-mono text-[10px] text-[var(--color-text)]">
2066
- {formatBackupDate(backup.timestamp)}
2067
- </span>
2068
- </div>
2069
- <span className="font-mono text-[9px] text-[var(--color-text-muted)]">
2070
- {formatSize(backup.size)}
2071
- </span>
2072
- </Button>
2073
- <ConfirmationModal
2074
- isOpen={restoreConfirmOpen === backup.filename}
2075
- onClose={() => {
2076
- setRestoreConfirmOpen(null);
2077
- setRestoreAnchorEl(null);
2078
- }}
2079
- onConfirm={() => {
2080
- onRestoreBackup(backup.filename);
2081
- setRestoreConfirmOpen(null);
2082
- setRestoreAnchorEl(null);
2083
- }}
2084
- title="Restore Backup"
2085
- message="Restore to this backup? You will lose all data since this backup was created."
2086
- confirmText="RESTORE"
2087
- variant="warning"
2088
- loading={restoringBackup === backup.filename}
2089
- />
2090
- </div>
2091
- ))}
2092
- </div>
2093
- )}
2094
-
2095
- <div className="pt-2 border-t border-dashed border-[var(--color-border)]">
2096
- <div className="font-mono text-[8px] text-[var(--color-text-faint)] leading-relaxed">
2097
- Backups are tied to the current database schema. Restoring after migrations may cause issues.
2098
- </div>
2099
- </div>
2100
- </div>
2101
- </TyvekCollapsibleSection>
2102
-
2103
- {/* Danger Zone */}
2104
- <TyvekCollapsibleSection
2105
- title="DANGER_ZONE"
2106
- icon={<AlertTriangle size={12} />}
2107
- isOpen={dangerOpen}
2108
- onToggle={() => setDangerOpen(!dangerOpen)}
2109
- tone="warning"
2110
- contentClassName="p-4 pt-0"
2111
- >
2112
- <div className="p-3 border-2 border-[var(--color-warning)] bg-[color-mix(in_srgb,var(--color-warning)_5%,transparent)]">
2113
- <div className="font-mono text-[10px] text-[var(--color-text-muted)] mb-3">Delete ALL data. Irreversible.</div>
2114
- <Button
2115
- variant={confirmNuke ? 'primary' : 'danger'}
2116
- size="lg"
2117
- onClick={handleNuke}
2118
- disabled={nuking}
2119
- loading={nuking}
2120
- icon={!nuking ? <Trash2 size={12} /> : undefined}
2121
- className={`w-full ${confirmNuke ? '!bg-[var(--color-warning)] !border-[var(--color-warning)] hover:!bg-[var(--color-warning)]' : ''}`}
2122
- >
2123
- {nuking ? 'NUKING...' : confirmNuke ? 'CONFIRM' : 'NUKE'}
2124
- </Button>
2125
- </div>
2126
- </TyvekCollapsibleSection>
2127
- </div>
2128
- );
2129
- }
2130
-
2131
- function ReceiveContent({
2132
- coldWallets,
2133
- copyAddress,
2134
- copied,
2135
- }: {
2136
- coldWallets: WalletData[];
2137
- copyAddress: (addr: string) => void;
2138
- copied: string | null;
2139
- }) {
2140
- if (coldWallets.length === 0) {
2141
- return (
2142
- <div className="text-center py-8">
2143
- <div className="font-mono text-[10px] text-[var(--color-text-muted,#6b7280)]">No wallet found. Set up your wallet first.</div>
2144
- </div>
2145
- );
2146
- }
2147
-
2148
- return (
2149
- <div className="space-y-5">
2150
- {coldWallets.map((wallet) => (
2151
- <div key={wallet.address} className="space-y-3">
2152
- {/* Agent label */}
2153
- <div className="flex items-center justify-center gap-2">
2154
- <Shield size={12} style={{ color: 'var(--color-info, #0047ff)' }} />
2155
- <span className="font-mono text-[9px] font-bold tracking-widest" style={{ color: 'var(--color-info, #0047ff)' }}>
2156
- {wallet.name?.toUpperCase() || 'AGENT'}
2157
- {wallet.chain ? ` (${wallet.chain.toUpperCase()})` : ''}
2158
- </span>
2159
- </div>
2160
-
2161
- {/* QR Code - white bg required for scanning */}
2162
- <div className="flex justify-center">
2163
- <div
2164
- className="p-3 relative"
2165
- style={{
2166
- backgroundColor: 'var(--color-surface, #ffffff)',
2167
- border: '1px solid var(--color-border, #d4d4d8)',
2168
- }}
2169
- >
2170
- <div className="absolute top-1 left-1 w-2 h-2 border-l border-t" style={{ borderColor: 'var(--color-border-focus, #0a0a0a)' }} />
2171
- <div className="absolute top-1 right-1 w-2 h-2 border-r border-t" style={{ borderColor: 'var(--color-border-focus, #0a0a0a)' }} />
2172
- <div className="absolute bottom-1 left-1 w-2 h-2 border-l border-b" style={{ borderColor: 'var(--color-border-focus, #0a0a0a)' }} />
2173
- <div className="absolute bottom-1 right-1 w-2 h-2 border-r border-b" style={{ borderColor: 'var(--color-border-focus, #0a0a0a)' }} />
2174
- <img
2175
- src={`https://api.qrserver.com/v1/create-qr-code/?size=160x160&data=${wallet.address}&bgcolor=ffffff&color=0a0a0a&margin=0`}
2176
- alt="Wallet QR Code"
2177
- className="w-40 h-40"
2178
- />
2179
- </div>
2180
- </div>
2181
-
2182
- {/* Address */}
2183
- <div
2184
- className="p-3 relative group cursor-pointer"
2185
- onClick={() => copyAddress(wallet.address)}
2186
- style={{
2187
- backgroundColor: 'var(--color-background-alt, #f4f4f5)',
2188
- border: '1px solid var(--color-border, #d4d4d8)',
2189
- }}
2190
- >
2191
- <code
2192
- className="font-mono text-[11px] break-all select-all block text-center leading-relaxed pr-6"
2193
- style={{ color: 'var(--color-text, #0a0a0a)' }}
2194
- >
2195
- {wallet.address}
2196
- </code>
2197
- <button
2198
- className="absolute right-2 top-1/2 -translate-y-1/2 p-1 opacity-60 group-hover:opacity-100 transition-opacity"
2199
- onClick={(e) => {
2200
- e.stopPropagation();
2201
- copyAddress(wallet.address);
2202
- }}
2203
- >
2204
- <Copy size={14} style={{ color: copied === wallet.address ? 'var(--color-success, #00c853)' : 'var(--color-info, #0047ff)' }} />
2205
- </button>
2206
- </div>
2207
- {copied === wallet.address && (
2208
- <div className="text-center">
2209
- <span className="font-mono text-[9px]" style={{ color: 'var(--color-success, #00c853)' }}>COPIED TO CLIPBOARD</span>
2210
- </div>
2211
- )}
2212
-
2213
- {/* Divider between agents */}
2214
- {coldWallets.length > 1 && wallet !== coldWallets[coldWallets.length - 1] && (
2215
- <div className="border-t" style={{ borderColor: 'var(--color-border, #d4d4d8)' }} />
2216
- )}
2217
- </div>
2218
- ))}
2219
-
2220
- {/* Instructions */}
2221
- <div className="space-y-2 pt-2">
2222
- <div className="font-mono text-[8px] text-[var(--color-text-muted,#6b7280)] tracking-widest">INSTRUCTIONS</div>
2223
- <div className="space-y-1.5">
2224
- <div className="flex items-start gap-2">
2225
- <div className="w-4 h-4 bg-[var(--color-background-alt,#e8e8e6)] flex items-center justify-center shrink-0 mt-0.5">
2226
- <span className="font-mono text-[8px] text-[var(--color-text-muted,#6b7280)]">1</span>
2227
- </div>
2228
- <span className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)]">Scan QR or copy address above</span>
2229
- </div>
2230
- <div className="flex items-start gap-2">
2231
- <div className="w-4 h-4 bg-[var(--color-background-alt,#e8e8e6)] flex items-center justify-center shrink-0 mt-0.5">
2232
- <span className="font-mono text-[8px] text-[var(--color-text-muted,#6b7280)]">2</span>
2233
- </div>
2234
- <span className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)]">Send ETH from exchange or another wallet</span>
2235
- </div>
2236
- <div className="flex items-start gap-2">
2237
- <div className="w-4 h-4 bg-[var(--color-background-alt,#e8e8e6)] flex items-center justify-center shrink-0 mt-0.5">
2238
- <span className="font-mono text-[8px] text-[var(--color-text-muted,#6b7280)]">3</span>
2239
- </div>
2240
- <span className="font-mono text-[9px] text-[var(--color-text-muted,#6b7280)]">Funds will appear after network confirmation</span>
2241
- </div>
2242
- </div>
2243
- </div>
2244
-
2245
- </div>
2246
- );
2247
- }