auramaxx 0.0.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 (418) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +77 -0
  3. package/apps/desktop-electron/main.js +428 -0
  4. package/bin/auramaxx.js +1063 -0
  5. package/docs/ADAPTERS.md +466 -0
  6. package/docs/AGENT_SETUP.md +159 -0
  7. package/docs/API.md +127 -0
  8. package/docs/APPS.md +199 -0
  9. package/docs/ARCHITECTURE.md +235 -0
  10. package/docs/AUTH.md +318 -0
  11. package/docs/BEST-PRACTICES.md +82 -0
  12. package/docs/CLI.md +141 -0
  13. package/docs/DESKTOP_ELECTRON.md +26 -0
  14. package/docs/DEVELOPING-APPS.md +453 -0
  15. package/docs/MCP.md +122 -0
  16. package/docs/PACKAGING_POLICY.md +19 -0
  17. package/docs/PERMISSION.md +137 -0
  18. package/docs/PROTOCOL.md +142 -0
  19. package/docs/README.md +50 -0
  20. package/docs/SKILLS.md +132 -0
  21. package/docs/TROUBLESHOOTING.md +376 -0
  22. package/docs/WORKSPACE.md +673 -0
  23. package/docs/agent-auth.md +14 -0
  24. package/docs/api/authentication.md +79 -0
  25. package/docs/api/secrets/api-keys.md +28 -0
  26. package/docs/api/secrets/credentials.md +80 -0
  27. package/docs/api/secrets/sharing.md +48 -0
  28. package/docs/api/system.md +41 -0
  29. package/docs/api/wallets/apps-strategies.md +66 -0
  30. package/docs/api/wallets/core.md +46 -0
  31. package/docs/api/wallets/data-portfolio.md +42 -0
  32. package/docs/aura-file.md +48 -0
  33. package/docs/core-concepts/FEATURES.md +114 -0
  34. package/docs/credentials.md +120 -0
  35. package/docs/external/HOW_TO_AURAMAXX/GETTING_SECRETS.md +33 -0
  36. package/docs/external/HOW_TO_AURAMAXX/README.md +45 -0
  37. package/docs/external/getting-started.md +10 -0
  38. package/docs/external/overview.md +19 -0
  39. package/docs/external/persona-paths.md +7 -0
  40. package/docs/external/share-secret.md +76 -0
  41. package/docs/external/why-aura.md +7 -0
  42. package/docs/security.md +227 -0
  43. package/docs/templates/RELEASE_NOTES_TEMPLATE.md +22 -0
  44. package/docs/wallet/AI.md +508 -0
  45. package/docs/wallet/DEVELOPING-STRATEGIES.md +713 -0
  46. package/docs/wallet/README.md +47 -0
  47. package/docs/wallet/STRATEGY.md +89 -0
  48. package/next.config.ts +28 -0
  49. package/package.json +167 -0
  50. package/postcss.config.mjs +8 -0
  51. package/prisma/migrations/20260214170000_baseline/migration.sql +511 -0
  52. package/prisma/migrations/20260216214537_add_passkey_model/migration.sql +18 -0
  53. package/prisma/migrations/20260217150500_add_credential_access_audit/migration.sql +31 -0
  54. package/prisma/migrations/20260222090000_update_admin_ttl_default/migration.sql +10 -0
  55. package/prisma/migrations/migration_lock.toml +3 -0
  56. package/prisma/schema.prisma +447 -0
  57. package/public/logo.webp +0 -0
  58. package/scripts/add-app.js +245 -0
  59. package/server/abi/SwapHelper.json +438 -0
  60. package/server/cli/approval.ts +447 -0
  61. package/server/cli/commands/actions.ts +474 -0
  62. package/server/cli/commands/api.ts +220 -0
  63. package/server/cli/commands/apikey.ts +277 -0
  64. package/server/cli/commands/app.ts +204 -0
  65. package/server/cli/commands/auth.ts +464 -0
  66. package/server/cli/commands/cron.ts +24 -0
  67. package/server/cli/commands/diary.ts +274 -0
  68. package/server/cli/commands/doctor.ts +1247 -0
  69. package/server/cli/commands/env.ts +476 -0
  70. package/server/cli/commands/experimental.ts +69 -0
  71. package/server/cli/commands/init.ts +798 -0
  72. package/server/cli/commands/lock.ts +157 -0
  73. package/server/cli/commands/mcp.ts +285 -0
  74. package/server/cli/commands/quickhack.ts +86 -0
  75. package/server/cli/commands/release-check.ts +231 -0
  76. package/server/cli/commands/restore.ts +314 -0
  77. package/server/cli/commands/service.ts +320 -0
  78. package/server/cli/commands/shell-hook.ts +512 -0
  79. package/server/cli/commands/skill.ts +216 -0
  80. package/server/cli/commands/start.ts +139 -0
  81. package/server/cli/commands/status.ts +59 -0
  82. package/server/cli/commands/stop.ts +36 -0
  83. package/server/cli/commands/token.ts +180 -0
  84. package/server/cli/commands/unlock.ts +50 -0
  85. package/server/cli/commands/vault.ts +1323 -0
  86. package/server/cli/commands/wallet.ts +209 -0
  87. package/server/cli/index.ts +280 -0
  88. package/server/cli/lib/approval-poll.ts +94 -0
  89. package/server/cli/lib/aura-parser.ts +64 -0
  90. package/server/cli/lib/credential-create.ts +74 -0
  91. package/server/cli/lib/credential-resolve.ts +280 -0
  92. package/server/cli/lib/dotenv-migrate.ts +116 -0
  93. package/server/cli/lib/dotenv-parser.ts +146 -0
  94. package/server/cli/lib/escalation.ts +57 -0
  95. package/server/cli/lib/http.ts +91 -0
  96. package/server/cli/lib/init-steps.ts +76 -0
  97. package/server/cli/lib/local-agent-trust.ts +45 -0
  98. package/server/cli/lib/lock-unlock-helper.ts +71 -0
  99. package/server/cli/lib/process.ts +162 -0
  100. package/server/cli/lib/prompt.ts +294 -0
  101. package/server/cli/lib/theme.ts +240 -0
  102. package/server/cli/socket.ts +579 -0
  103. package/server/cli/transport-client.ts +50 -0
  104. package/server/cron/index.ts +137 -0
  105. package/server/cron/job.ts +31 -0
  106. package/server/cron/jobs/balance-sync.ts +436 -0
  107. package/server/cron/jobs/incoming-scan.ts +506 -0
  108. package/server/cron/jobs/native-price.ts +70 -0
  109. package/server/cron/jobs/orphan-cleanup.ts +40 -0
  110. package/server/cron/jobs/strategy-runner.ts +175 -0
  111. package/server/cron/scheduler.ts +125 -0
  112. package/server/index.ts +420 -0
  113. package/server/lib/adapters/factory.ts +119 -0
  114. package/server/lib/adapters/index.ts +19 -0
  115. package/server/lib/adapters/router.ts +297 -0
  116. package/server/lib/adapters/telegram.ts +645 -0
  117. package/server/lib/adapters/types.ts +89 -0
  118. package/server/lib/adapters/webhook.ts +95 -0
  119. package/server/lib/address.ts +49 -0
  120. package/server/lib/agent-auth/contracts.ts +1194 -0
  121. package/server/lib/agent-profiles.ts +419 -0
  122. package/server/lib/ai.ts +285 -0
  123. package/server/lib/api-registry/contracts.ts +86 -0
  124. package/server/lib/api-registry/validation.ts +172 -0
  125. package/server/lib/apikey-migration.ts +258 -0
  126. package/server/lib/app-installer.ts +505 -0
  127. package/server/lib/app-tokens.ts +247 -0
  128. package/server/lib/approval-link.ts +27 -0
  129. package/server/lib/auth.ts +314 -0
  130. package/server/lib/auto-execute.ts +160 -0
  131. package/server/lib/batch.ts +242 -0
  132. package/server/lib/cold.ts +1048 -0
  133. package/server/lib/config.ts +408 -0
  134. package/server/lib/credential-access-audit.ts +85 -0
  135. package/server/lib/credential-access-policy.ts +111 -0
  136. package/server/lib/credential-health.ts +343 -0
  137. package/server/lib/credential-import.ts +608 -0
  138. package/server/lib/credential-scope.ts +102 -0
  139. package/server/lib/credential-shares.ts +190 -0
  140. package/server/lib/credential-transport.ts +533 -0
  141. package/server/lib/credential-vault.ts +77 -0
  142. package/server/lib/credentials.ts +422 -0
  143. package/server/lib/crypto.ts +8 -0
  144. package/server/lib/db.ts +58 -0
  145. package/server/lib/defaults.ts +386 -0
  146. package/server/lib/dex/index.ts +80 -0
  147. package/server/lib/dex/relay.ts +235 -0
  148. package/server/lib/dex/types.ts +59 -0
  149. package/server/lib/dex/uniswap.ts +370 -0
  150. package/server/lib/diary.ts +34 -0
  151. package/server/lib/dont-ask-again-policy.ts +41 -0
  152. package/server/lib/e2e-agent/artifacts.ts +36 -0
  153. package/server/lib/e2e-agent/contracts.ts +112 -0
  154. package/server/lib/e2e-agent/validation.ts +135 -0
  155. package/server/lib/encrypt.ts +114 -0
  156. package/server/lib/error.ts +20 -0
  157. package/server/lib/events.ts +217 -0
  158. package/server/lib/feature-flags.ts +93 -0
  159. package/server/lib/hot.ts +357 -0
  160. package/server/lib/human-action-summary.ts +80 -0
  161. package/server/lib/key-fingerprint.ts +28 -0
  162. package/server/lib/logger.ts +340 -0
  163. package/server/lib/network.ts +137 -0
  164. package/server/lib/notifications.ts +230 -0
  165. package/server/lib/oauth2-refresh.ts +241 -0
  166. package/server/lib/oursecret.ts +71 -0
  167. package/server/lib/passkey-credential.ts +360 -0
  168. package/server/lib/passkey.ts +68 -0
  169. package/server/lib/permissions.ts +299 -0
  170. package/server/lib/pino.ts +24 -0
  171. package/server/lib/policy-preview.ts +138 -0
  172. package/server/lib/price.ts +338 -0
  173. package/server/lib/prices.ts +34 -0
  174. package/server/lib/project-scope.ts +297 -0
  175. package/server/lib/resolve-action.ts +328 -0
  176. package/server/lib/resolve.ts +36 -0
  177. package/server/lib/secret-gist-share.ts +296 -0
  178. package/server/lib/sessions.ts +634 -0
  179. package/server/lib/socket-path.ts +56 -0
  180. package/server/lib/solana/connection.ts +26 -0
  181. package/server/lib/solana/jupiter.ts +128 -0
  182. package/server/lib/solana/transfer.ts +108 -0
  183. package/server/lib/solana/wallet.ts +136 -0
  184. package/server/lib/strategy/emits.ts +21 -0
  185. package/server/lib/strategy/engine.ts +1305 -0
  186. package/server/lib/strategy/executor.ts +115 -0
  187. package/server/lib/strategy/hook-context.ts +159 -0
  188. package/server/lib/strategy/hooks.ts +990 -0
  189. package/server/lib/strategy/index.ts +28 -0
  190. package/server/lib/strategy/installer.ts +305 -0
  191. package/server/lib/strategy/loader.ts +256 -0
  192. package/server/lib/strategy/message.ts +237 -0
  193. package/server/lib/strategy/repository.ts +218 -0
  194. package/server/lib/strategy/session-logger.ts +693 -0
  195. package/server/lib/strategy/sources.ts +288 -0
  196. package/server/lib/strategy/state.ts +189 -0
  197. package/server/lib/strategy/templates.ts +403 -0
  198. package/server/lib/strategy/tick.ts +404 -0
  199. package/server/lib/strategy/types.ts +230 -0
  200. package/server/lib/swap.ts +3 -0
  201. package/server/lib/temp.ts +86 -0
  202. package/server/lib/token-metadata.ts +86 -0
  203. package/server/lib/token-safety.ts +200 -0
  204. package/server/lib/token-search.ts +444 -0
  205. package/server/lib/totp.ts +194 -0
  206. package/server/lib/transactions.ts +123 -0
  207. package/server/lib/transport.ts +84 -0
  208. package/server/lib/txhistory/decoder.ts +262 -0
  209. package/server/lib/txhistory/enricher.ts +652 -0
  210. package/server/lib/txhistory/index.ts +391 -0
  211. package/server/lib/txhistory/signatures.ts +59 -0
  212. package/server/lib/update-check.ts +35 -0
  213. package/server/lib/verified-summary.ts +414 -0
  214. package/server/lib/view-registry.ts +80 -0
  215. package/server/mcp/profile-policy.ts +30 -0
  216. package/server/mcp/server.ts +1589 -0
  217. package/server/mcp/tools.ts +276 -0
  218. package/server/middleware/auth.ts +119 -0
  219. package/server/middleware/requestLogger.ts +84 -0
  220. package/server/routes/actions.ts +539 -0
  221. package/server/routes/adapters.ts +711 -0
  222. package/server/routes/addressbook.ts +113 -0
  223. package/server/routes/ai.ts +34 -0
  224. package/server/routes/apikeys.ts +343 -0
  225. package/server/routes/apps.ts +601 -0
  226. package/server/routes/auth.ts +406 -0
  227. package/server/routes/backup.ts +404 -0
  228. package/server/routes/batch.ts +270 -0
  229. package/server/routes/bookmarks.ts +162 -0
  230. package/server/routes/credential-shares.ts +380 -0
  231. package/server/routes/credential-vaults.ts +159 -0
  232. package/server/routes/credentials.ts +1782 -0
  233. package/server/routes/dashboard.ts +97 -0
  234. package/server/routes/defaults.ts +124 -0
  235. package/server/routes/flags.ts +11 -0
  236. package/server/routes/fund.ts +225 -0
  237. package/server/routes/heartbeat.ts +375 -0
  238. package/server/routes/import.ts +364 -0
  239. package/server/routes/launch.ts +665 -0
  240. package/server/routes/lock.ts +54 -0
  241. package/server/routes/logs.ts +68 -0
  242. package/server/routes/nuke.ts +111 -0
  243. package/server/routes/passkey-credentials.ts +99 -0
  244. package/server/routes/passkey.ts +366 -0
  245. package/server/routes/portfolio.ts +217 -0
  246. package/server/routes/price.ts +63 -0
  247. package/server/routes/resolve.ts +31 -0
  248. package/server/routes/security.ts +45 -0
  249. package/server/routes/send-evm.ts +241 -0
  250. package/server/routes/send-solana.ts +281 -0
  251. package/server/routes/send.ts +178 -0
  252. package/server/routes/setup.ts +210 -0
  253. package/server/routes/strategy.ts +894 -0
  254. package/server/routes/swap-evm.ts +352 -0
  255. package/server/routes/swap-solana.ts +176 -0
  256. package/server/routes/swap.ts +356 -0
  257. package/server/routes/token.ts +247 -0
  258. package/server/routes/unlock.ts +467 -0
  259. package/server/routes/views.ts +41 -0
  260. package/server/routes/wallet-assets.ts +361 -0
  261. package/server/routes/wallet-transactions.ts +515 -0
  262. package/server/routes/wallet.ts +709 -0
  263. package/server/types.ts +146 -0
  264. package/shared/credential-field-schema.ts +248 -0
  265. package/skills/auramaxx/HEARTBEAT.md +78 -0
  266. package/skills/auramaxx/SKILL.md +745 -0
  267. package/skills/auramaxx/docs/AGENT_SETUP.md +155 -0
  268. package/skills/auramaxx/docs/API.md +127 -0
  269. package/skills/auramaxx/docs/AUTH.md +318 -0
  270. package/skills/auramaxx/docs/CLI.md +130 -0
  271. package/skills/auramaxx/docs/MCP.md +122 -0
  272. package/skills/auramaxx/docs/TROUBLESHOOTING.md +357 -0
  273. package/skills/auramaxx/docs/WORKSPACE.md +673 -0
  274. package/skills/auramaxx/docs/security.md +227 -0
  275. package/skills/task-lifecycle/SKILL.md +378 -0
  276. package/src/app/api/[...doc]/page.tsx +36 -0
  277. package/src/app/api/agent-requests/route.ts +30 -0
  278. package/src/app/api/apps/install/route.ts +132 -0
  279. package/src/app/api/apps/manifests/route.ts +16 -0
  280. package/src/app/api/apps/static/[...path]/route.ts +57 -0
  281. package/src/app/api/docs/plain/route.ts +74 -0
  282. package/src/app/api/events/route.ts +92 -0
  283. package/src/app/api/page.tsx +290 -0
  284. package/src/app/api/workspace/[id]/apps/[wid]/route.ts +119 -0
  285. package/src/app/api/workspace/[id]/apps/route.ts +81 -0
  286. package/src/app/api/workspace/[id]/export/route.ts +67 -0
  287. package/src/app/api/workspace/[id]/route.ts +168 -0
  288. package/src/app/api/workspace/auth.ts +40 -0
  289. package/src/app/api/workspace/config/route.ts +121 -0
  290. package/src/app/api/workspace/import/route.ts +127 -0
  291. package/src/app/api/workspace/route.ts +116 -0
  292. package/src/app/app-legacy-do-not-use/page.tsx +2245 -0
  293. package/src/app/apple-icon.png +0 -0
  294. package/src/app/approve/[actionId]/page.tsx +409 -0
  295. package/src/app/docs/DocsPageContent.tsx +269 -0
  296. package/src/app/docs/[...doc]/page.tsx +41 -0
  297. package/src/app/docs/page.tsx +38 -0
  298. package/src/app/favicon.ico +0 -0
  299. package/src/app/globals.css +819 -0
  300. package/src/app/health/page.tsx +5 -0
  301. package/src/app/hello/page.tsx +102 -0
  302. package/src/app/icon.png +0 -0
  303. package/src/app/layout.tsx +39 -0
  304. package/src/app/page.tsx +1964 -0
  305. package/src/app/privacy/page.tsx +63 -0
  306. package/src/app/providers.tsx +87 -0
  307. package/src/app/share/[token]/page.tsx +295 -0
  308. package/src/app/terms/page.tsx +80 -0
  309. package/src/components/ChainSelector.tsx +44 -0
  310. package/src/components/HumanActionBar.tsx +697 -0
  311. package/src/components/NotificationDrawer.tsx +387 -0
  312. package/src/components/PasskeyEnrollmentPrompt.tsx +235 -0
  313. package/src/components/apps/AgentKeysApp.tsx +490 -0
  314. package/src/components/apps/App.tsx +153 -0
  315. package/src/components/apps/AppGrid.tsx +15 -0
  316. package/src/components/apps/DetailedAddressDrawer.tsx +325 -0
  317. package/src/components/apps/DraggableApp.tsx +562 -0
  318. package/src/components/apps/IFrameApp.tsx +73 -0
  319. package/src/components/apps/LogsApp.tsx +360 -0
  320. package/src/components/apps/SendApp.tsx +394 -0
  321. package/src/components/apps/SetupWizardApp.tsx +1004 -0
  322. package/src/components/apps/SystemDefaultsApp.tsx +845 -0
  323. package/src/components/apps/ThirdPartyApp.tsx +428 -0
  324. package/src/components/apps/TokenApp.tsx +319 -0
  325. package/src/components/apps/TransactionsApp.tsx +438 -0
  326. package/src/components/apps/WalletDetailApp.tsx +1505 -0
  327. package/src/components/apps/index.ts +13 -0
  328. package/src/components/design-system/Button.tsx +88 -0
  329. package/src/components/design-system/ChainIndicator.tsx +65 -0
  330. package/src/components/design-system/ChainSelector.tsx +147 -0
  331. package/src/components/design-system/ConfirmationModal.tsx +107 -0
  332. package/src/components/design-system/ConfirmationPopover.tsx +81 -0
  333. package/src/components/design-system/DownloadButton.tsx +149 -0
  334. package/src/components/design-system/Drawer.tsx +133 -0
  335. package/src/components/design-system/FilterDropdown.tsx +183 -0
  336. package/src/components/design-system/ItemPicker.tsx +157 -0
  337. package/src/components/design-system/Modal.tsx +296 -0
  338. package/src/components/design-system/Popover.tsx +142 -0
  339. package/src/components/design-system/TextInput.tsx +85 -0
  340. package/src/components/design-system/Toggle.tsx +65 -0
  341. package/src/components/design-system/TyvekCollapsibleSection.tsx +55 -0
  342. package/src/components/design-system/index.ts +14 -0
  343. package/src/components/docs/ClientSideMarkdown.tsx +51 -0
  344. package/src/components/docs/DocsSearchBar.tsx +118 -0
  345. package/src/components/docs/DocsThemeToggle.tsx +38 -0
  346. package/src/components/docs/PersistentDocGroup.tsx +91 -0
  347. package/src/components/docs/ShareUrlButton.tsx +33 -0
  348. package/src/components/docs/SidebarScrollMemory.tsx +56 -0
  349. package/src/components/health/CredentialHealthDashboard.tsx +214 -0
  350. package/src/components/icons/ChainIcons.tsx +72 -0
  351. package/src/components/layout/AppStoreDrawer.tsx +369 -0
  352. package/src/components/layout/ContentArea.tsx +21 -0
  353. package/src/components/layout/CreateViewModal.tsx +88 -0
  354. package/src/components/layout/LeftRail.tsx +114 -0
  355. package/src/components/layout/TabBar.tsx +284 -0
  356. package/src/components/layout/WalletSidebar.tsx +1030 -0
  357. package/src/components/layout/index.ts +6 -0
  358. package/src/components/marketing/AuraMaxxSpecOverlay.tsx +653 -0
  359. package/src/components/marketing/DeviceMorphExperience.tsx +216 -0
  360. package/src/components/vault/ApiKeysConsole.tsx +1272 -0
  361. package/src/components/vault/AuditConsole.tsx +600 -0
  362. package/src/components/vault/CredentialDetail.tsx +625 -0
  363. package/src/components/vault/CredentialEmpty.tsx +55 -0
  364. package/src/components/vault/CredentialField.tsx +583 -0
  365. package/src/components/vault/CredentialForm.tsx +1484 -0
  366. package/src/components/vault/CredentialList.tsx +265 -0
  367. package/src/components/vault/CredentialRow.tsx +130 -0
  368. package/src/components/vault/CredentialShareModal.tsx +273 -0
  369. package/src/components/vault/CredentialVault.tsx +1662 -0
  370. package/src/components/vault/CredentialWalletWidget.tsx +103 -0
  371. package/src/components/vault/DocsConsole.tsx +113 -0
  372. package/src/components/vault/ImportCredentialsModal.tsx +578 -0
  373. package/src/components/vault/LargeTypeModal.tsx +88 -0
  374. package/src/components/vault/PasswordGenerator.tsx +232 -0
  375. package/src/components/vault/TOTPDisplay.tsx +108 -0
  376. package/src/components/vault/TotpSetupPanel.tsx +198 -0
  377. package/src/components/vault/VaultSidebar.tsx +881 -0
  378. package/src/components/vault/credentialFormName.ts +91 -0
  379. package/src/components/vault/hooks/useVaultKeyboardShortcuts.ts +69 -0
  380. package/src/components/vault/types.ts +56 -0
  381. package/src/context/AuthContext.tsx +365 -0
  382. package/src/context/PriceContext.tsx +113 -0
  383. package/src/context/ThemeContext.tsx +164 -0
  384. package/src/context/WebSocketContext.tsx +269 -0
  385. package/src/context/WorkspaceContext.tsx +668 -0
  386. package/src/hooks/index.ts +4 -0
  387. package/src/hooks/useAgentActions.ts +552 -0
  388. package/src/hooks/useBalance.ts +103 -0
  389. package/src/hooks/useBalances.ts +129 -0
  390. package/src/hooks/useTheme.ts +156 -0
  391. package/src/instrumentation.ts +12 -0
  392. package/src/lib/api-docs.ts +154 -0
  393. package/src/lib/api.ts +474 -0
  394. package/src/lib/app-loader.ts +148 -0
  395. package/src/lib/app-registry.ts +178 -0
  396. package/src/lib/app-sdk.ts +157 -0
  397. package/src/lib/audit-console-adapter.ts +151 -0
  398. package/src/lib/auth-client.ts +75 -0
  399. package/src/lib/config.ts +74 -0
  400. package/src/lib/credential-field-schema.ts +11 -0
  401. package/src/lib/crypto.ts +112 -0
  402. package/src/lib/db.ts +21 -0
  403. package/src/lib/docs.ts +544 -0
  404. package/src/lib/events.ts +363 -0
  405. package/src/lib/pino.ts +24 -0
  406. package/src/lib/theme-handlers.ts +168 -0
  407. package/src/lib/theme.ts +351 -0
  408. package/src/lib/tokenData.ts +378 -0
  409. package/src/lib/totp-import.ts +57 -0
  410. package/src/lib/vault-crypto.ts +129 -0
  411. package/src/lib/view-registry.ts +57 -0
  412. package/src/lib/websocket-server.ts +302 -0
  413. package/src/lib/websocket-setup.ts +79 -0
  414. package/src/lib/wordlist.ts +2050 -0
  415. package/src/lib/workspace-handlers.ts +285 -0
  416. package/start.sh +170 -0
  417. package/tailwind.config.ts +99 -0
  418. package/tsconfig.json +42 -0
@@ -0,0 +1,63 @@
1
+ import Link from 'next/link';
2
+
3
+ export default function PrivacyPage() {
4
+ return (
5
+ <div className="min-h-screen bg-[var(--color-background,#f4f4f5)] relative p-4 py-8">
6
+ <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
7
+ <div className="absolute inset-0 bg-grid-adaptive bg-[size:4rem_4rem] opacity-30" />
8
+ <div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
9
+ <div className="absolute top-[5%] left-[5%] opacity-5 select-none">
10
+ <h1 className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter">
11
+ AURA
12
+ </h1>
13
+ </div>
14
+ <div className="absolute bottom-[5%] right-[5%] opacity-5 select-none">
15
+ <h1 className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter text-right">
16
+ PRIVACY
17
+ </h1>
18
+ </div>
19
+ </div>
20
+
21
+ <Link
22
+ href="/hello"
23
+ className="fixed top-6 left-6 z-50 flex items-center gap-3 hover:opacity-80 transition-opacity"
24
+ >
25
+ <div className="w-10 h-10">
26
+ <img src="/logo.webp" alt="AuraMaxx" className="w-full h-full object-contain" />
27
+ </div>
28
+ <div className="font-black text-xl tracking-tighter text-[var(--color-text,#0a0a0a)]">AURAMAXX</div>
29
+ </Link>
30
+
31
+ <div className="fixed top-7 right-6 z-50 flex items-center gap-3 font-mono text-[10px] tracking-widest">
32
+ <Link href="/terms" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">TERMS</Link>
33
+ <Link href="/docs" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">DOCS</Link>
34
+ <Link href="/" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">HOME</Link>
35
+ </div>
36
+
37
+ <main className="relative z-[5] max-w-[920px] mx-auto pt-16">
38
+ <article className="bg-[var(--color-surface,#f4f4f2)] border border-[var(--color-border,#d4d4d8)] shadow-lg overflow-hidden font-mono">
39
+ <header className="px-5 py-4 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
40
+ <h1 className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
41
+ Privacy Policy
42
+ </h1>
43
+ <span className="text-[9px] text-[var(--color-text-muted,#6b7280)] tracking-widest">LOCAL-FIRST</span>
44
+ </header>
45
+
46
+ <div className="p-6 space-y-5 text-[13px] leading-6 text-[var(--color-text,#0a0a0a)]">
47
+ <p>Zero personal data is collected.</p>
48
+ <p>No analytics, no tracking, and no telemetry are built into AuraWallet.</p>
49
+ <p>All vault data is stored locally on your machine.</p>
50
+ <p>Aura does not have access to your credentials.</p>
51
+ <p>
52
+ AuraWallet is fully open source, so you can inspect and audit the code yourself at any time.
53
+ </p>
54
+ </div>
55
+
56
+ <footer className="px-5 py-3 border-t border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] text-[9px] tracking-widest text-[var(--color-text-faint,#9ca3af)] uppercase">
57
+ We never receive your secrets
58
+ </footer>
59
+ </article>
60
+ </main>
61
+ </div>
62
+ );
63
+ }
@@ -0,0 +1,87 @@
1
+ 'use client';
2
+
3
+ import { useEffect, useRef } from 'react';
4
+ import { PriceProvider } from '@/context/PriceContext';
5
+ import { WebSocketProvider, useWebSocket } from '@/context/WebSocketContext';
6
+ import { WorkspaceProvider } from '@/context/WorkspaceContext';
7
+ import { AuthProvider, useAuth } from '@/context/AuthContext';
8
+
9
+ function ServerRestartBanner() {
10
+ const { reconnected, dismissReconnected } = useWebSocket();
11
+ const timerRef = useRef<NodeJS.Timeout | null>(null);
12
+
13
+ useEffect(() => {
14
+ if (reconnected) {
15
+ timerRef.current = setTimeout(dismissReconnected, 30000);
16
+ return () => {
17
+ if (timerRef.current) clearTimeout(timerRef.current);
18
+ };
19
+ }
20
+ }, [reconnected, dismissReconnected]);
21
+
22
+ if (!reconnected) return null;
23
+
24
+ return (
25
+ <div
26
+ style={{
27
+ position: 'fixed',
28
+ top: 0,
29
+ left: 0,
30
+ right: 0,
31
+ zIndex: 9999,
32
+ padding: '10px 16px',
33
+ display: 'flex',
34
+ alignItems: 'center',
35
+ justifyContent: 'space-between',
36
+ gap: '12px',
37
+ fontFamily: 'monospace',
38
+ fontSize: '11px',
39
+ background: 'var(--color-warning, #ff4d00)',
40
+ color: '#fff',
41
+ }}
42
+ >
43
+ <span>
44
+ Server restarted. All agent tokens have been invalidated. Agents will need to re-request access.
45
+ </span>
46
+ <button
47
+ onClick={dismissReconnected}
48
+ style={{
49
+ background: 'rgba(255,255,255,0.2)',
50
+ border: 'none',
51
+ color: '#fff',
52
+ padding: '4px 10px',
53
+ cursor: 'pointer',
54
+ fontFamily: 'monospace',
55
+ fontSize: '10px',
56
+ flexShrink: 0,
57
+ }}
58
+ >
59
+ DISMISS
60
+ </button>
61
+ </div>
62
+ );
63
+ }
64
+
65
+ // Inner component that uses the auth context
66
+ function AuthenticatedProviders({ children }: { children: React.ReactNode }) {
67
+ const { token } = useAuth();
68
+
69
+ return (
70
+ <WebSocketProvider token={token}>
71
+ <PriceProvider>
72
+ <WorkspaceProvider>
73
+ <ServerRestartBanner />
74
+ {children}
75
+ </WorkspaceProvider>
76
+ </PriceProvider>
77
+ </WebSocketProvider>
78
+ );
79
+ }
80
+
81
+ export function Providers({ children }: { children: React.ReactNode }) {
82
+ return (
83
+ <AuthProvider>
84
+ <AuthenticatedProviders>{children}</AuthenticatedProviders>
85
+ </AuthProvider>
86
+ );
87
+ }
@@ -0,0 +1,295 @@
1
+ 'use client';
2
+
3
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
4
+ import { AlertTriangle, Eye, Link2, Loader2, Lock, ShieldCheck } from 'lucide-react';
5
+ import { getWalletBaseUrl } from '@/lib/api';
6
+ import Image from 'next/image';
7
+ import Link from 'next/link';
8
+ import { useParams } from 'next/navigation';
9
+
10
+ interface ShareMeta {
11
+ token: string;
12
+ credentialId: string;
13
+ credentialName: string;
14
+ credentialType: string;
15
+ expiresAt: number;
16
+ accessMode: 'anyone' | 'password';
17
+ passwordRequired: boolean;
18
+ oneTimeOnly: boolean;
19
+ viewCount: number;
20
+ maxViews: number | null;
21
+ }
22
+
23
+ interface SharedCredentialField {
24
+ key: string;
25
+ value: string;
26
+ }
27
+
28
+ interface SharedCredential {
29
+ id: string;
30
+ name: string;
31
+ type: string;
32
+ meta: Record<string, unknown>;
33
+ fields: SharedCredentialField[];
34
+ createdAt: string;
35
+ updatedAt: string;
36
+ }
37
+
38
+ export default function SharedCredentialPage() {
39
+ const params = useParams<{ token: string | string[] }>();
40
+ const [token, setToken] = useState('');
41
+ const [meta, setMeta] = useState<ShareMeta | null>(null);
42
+ const [credential, setCredential] = useState<SharedCredential | null>(null);
43
+ const [loadingMeta, setLoadingMeta] = useState(true);
44
+ const [reading, setReading] = useState(false);
45
+ const [password, setPassword] = useState('');
46
+ const [error, setError] = useState<string | null>(null);
47
+
48
+ const walletBaseUrl = useMemo(() => getWalletBaseUrl(), []);
49
+
50
+ const fetchMeta = useCallback(async (shareToken: string) => {
51
+ setLoadingMeta(true);
52
+ setError(null);
53
+ try {
54
+ const res = await fetch(`${walletBaseUrl}/credential-shares/${encodeURIComponent(shareToken)}`);
55
+ const data = await res.json().catch(() => ({ error: 'Invalid response' }));
56
+ if (!res.ok) {
57
+ setError(data.error || 'Failed to load share');
58
+ setMeta(null);
59
+ return;
60
+ }
61
+ setMeta(data.share as ShareMeta);
62
+ } catch {
63
+ setError('Failed to load share');
64
+ setMeta(null);
65
+ } finally {
66
+ setLoadingMeta(false);
67
+ }
68
+ }, [walletBaseUrl]);
69
+
70
+ const readShare = useCallback(async (shareToken: string, sharePassword?: string) => {
71
+ setReading(true);
72
+ setError(null);
73
+ try {
74
+ const res = await fetch(`${walletBaseUrl}/credential-shares/${encodeURIComponent(shareToken)}/read`, {
75
+ method: 'POST',
76
+ headers: { 'Content-Type': 'application/json' },
77
+ body: JSON.stringify(sharePassword ? { password: sharePassword } : {}),
78
+ });
79
+ const data = await res.json().catch(() => ({ error: 'Invalid response' }));
80
+ if (!res.ok) {
81
+ setError(data.error || 'Failed to read shared credential');
82
+ return;
83
+ }
84
+ setCredential(data.credential as SharedCredential);
85
+ } catch {
86
+ setError('Failed to read shared credential');
87
+ } finally {
88
+ setReading(false);
89
+ }
90
+ }, [walletBaseUrl]);
91
+
92
+ useEffect(() => {
93
+ const rawToken = params?.token;
94
+ const shareToken = Array.isArray(rawToken) ? rawToken[0] : rawToken;
95
+ setToken(shareToken || '');
96
+ if (shareToken) {
97
+ void fetchMeta(shareToken);
98
+ } else {
99
+ setLoadingMeta(false);
100
+ setError('Invalid share link');
101
+ }
102
+ }, [fetchMeta, params]);
103
+
104
+ useEffect(() => {
105
+ if (!token || !meta || meta.passwordRequired || credential || reading) return;
106
+ void readShare(token);
107
+ }, [token, meta, credential, reading, readShare]);
108
+
109
+ const metaEntries = useMemo(() => {
110
+ if (!credential) return [];
111
+ return Object.entries(credential.meta || {}).filter(([, value]) =>
112
+ typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean',
113
+ );
114
+ }, [credential]);
115
+
116
+ return (
117
+ <div className="min-h-screen bg-tyvek relative flex items-center justify-center p-4 py-8">
118
+ <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
119
+ <div className="absolute inset-0 bg-grid-pattern bg-[size:4rem_4rem] opacity-30" />
120
+ <div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
121
+
122
+ <div className="absolute top-[5%] left-[5%] opacity-5 select-none">
123
+ <h1 className="text-[15vw] font-bold leading-none text-void font-mono tracking-tighter">STERILE</h1>
124
+ </div>
125
+ <div className="absolute bottom-[5%] right-[5%] opacity-5 select-none">
126
+ <h1 className="text-[15vw] font-bold leading-none text-void font-mono tracking-tighter text-right">FIELD</h1>
127
+ </div>
128
+
129
+ <div className="absolute top-10 left-10 w-32 h-32 border-l-4 border-t-4 border-void opacity-10">
130
+ <div className="absolute top-2 left-2 w-4 h-4 bg-void" />
131
+ </div>
132
+ <div className="absolute bottom-10 right-10 w-32 h-32 border-r-4 border-b-4 border-void opacity-10 flex items-end justify-end">
133
+ <div className="absolute bottom-2 right-2 w-4 h-4 bg-void" />
134
+ </div>
135
+ </div>
136
+
137
+ <Link href="/" className="fixed top-6 left-6 z-50 flex items-center gap-3 hover:opacity-80 transition-opacity">
138
+ <div className="w-10 h-10">
139
+ <Image src="/logo.webp" alt="AuraMaxx" width={40} height={40} className="w-full h-full object-contain" priority />
140
+ </div>
141
+ <div className="font-black text-xl tracking-tighter text-black">AURAMAXX</div>
142
+ </Link>
143
+
144
+ <div className="relative z-10 w-full max-w-2xl">
145
+ <div className="bg-[#f4f4f2] border border-black/10 shadow-lg overflow-hidden font-mono">
146
+ <div className="px-4 py-3 border-b border-black/10 bg-white/50 flex items-center justify-between">
147
+ <div className="flex items-center gap-2">
148
+ <Link2 size={15} className="text-black/70" />
149
+ <h1 className="text-[11px] font-bold uppercase tracking-[0.22em] text-black">SHARED CREDENTIAL</h1>
150
+ </div>
151
+ <span className="text-[9px] text-black/40 tracking-wider">
152
+ {credential ? 'ACCESS_GRANTED' : meta?.passwordRequired ? 'LOCKED' : 'PENDING'}
153
+ </span>
154
+ </div>
155
+
156
+ <div className="px-4 pb-4 pt-4 space-y-4">
157
+ {loadingMeta && (
158
+ <div className="flex items-center gap-2 text-[10px] text-black/60 uppercase tracking-widest">
159
+ <Loader2 size={12} className="animate-spin" />
160
+ LOADING SHARE
161
+ </div>
162
+ )}
163
+
164
+ {!loadingMeta && error && !credential && (
165
+ <div className="border border-red-300 bg-red-100/40 p-3">
166
+ <div className="flex items-center gap-2 text-[10px] text-red-700 uppercase tracking-wider">
167
+ <AlertTriangle size={12} />
168
+ {error}
169
+ </div>
170
+ </div>
171
+ )}
172
+
173
+ {!loadingMeta && meta && !credential && !meta.passwordRequired && reading && (
174
+ <div className="flex items-center gap-2 text-[10px] text-black/60 uppercase tracking-widest">
175
+ <Loader2 size={12} className="animate-spin" />
176
+ DECRYPTING PAYLOAD
177
+ </div>
178
+ )}
179
+
180
+ {!loadingMeta && meta && !credential && meta.passwordRequired && (
181
+ <div className="space-y-3">
182
+ <div className="text-[10px] text-black/60 uppercase tracking-wider">
183
+ This shared credential is password protected.
184
+ </div>
185
+ <div className="space-y-1">
186
+ <label htmlFor="share-password" className="block text-[8px] font-bold text-black/50 uppercase tracking-[0.14em]">
187
+ SHARE PASSWORD
188
+ </label>
189
+ <input
190
+ id="share-password"
191
+ type="password"
192
+ value={password}
193
+ onChange={(e) => setPassword(e.target.value)}
194
+ placeholder="Enter password"
195
+ className="w-full h-10 px-3 border border-black/20 bg-white text-[11px] text-black placeholder:text-black/35 outline-none focus:border-black transition-colors"
196
+ />
197
+ </div>
198
+
199
+ <button
200
+ type="button"
201
+ onClick={() => { void readShare(token, password); }}
202
+ disabled={!password || reading}
203
+ className="h-9 px-4 flex items-center justify-center gap-2 border border-black/20 bg-white hover:border-black text-[10px] font-bold uppercase tracking-wider text-black transition-colors disabled:opacity-40 disabled:cursor-not-allowed"
204
+ >
205
+ {reading ? <Loader2 size={12} className="animate-spin" /> : <Lock size={12} />}
206
+ UNLOCK
207
+ </button>
208
+
209
+ {error && (
210
+ <div className="text-[9px] text-red-700 uppercase tracking-wider">{error}</div>
211
+ )}
212
+ </div>
213
+ )}
214
+
215
+ {credential && (
216
+ <div className="space-y-4">
217
+ {meta && (
218
+ <div className="flex items-center gap-2 px-3 py-2 bg-voltage/10 border border-voltage/20">
219
+ <ShieldCheck size={13} className="text-green-600" />
220
+ <span className="text-[10px] font-bold text-black uppercase tracking-wider">AUTHENTIC SHARE</span>
221
+ <span className="text-[9px] text-black/50 ml-auto">
222
+ {meta.oneTimeOnly ? 'ONE_TIME' : 'MULTI_VIEW'}
223
+ </span>
224
+ </div>
225
+ )}
226
+
227
+ <div>
228
+ <div className="text-[14px] font-bold text-black uppercase tracking-tight">{credential.name}</div>
229
+ <div className="text-[9px] uppercase tracking-widest text-black/60">
230
+ {credential.type}
231
+ {meta?.oneTimeOnly ? ' · One-time view' : ''}
232
+ </div>
233
+ {meta && (
234
+ <div className="text-[9px] text-black/50 mt-1">Expires {new Date(meta.expiresAt).toLocaleString()}</div>
235
+ )}
236
+ </div>
237
+
238
+ {metaEntries.length > 0 && (
239
+ <div className="border border-dashed border-black/20 p-3 bg-white/40">
240
+ <div className="flex justify-between items-center mb-2 border-b border-black/10 pb-1">
241
+ <span className="text-[9px] font-bold uppercase tracking-widest text-black">METADATA</span>
242
+ <span className="text-[8px] text-black/40 font-bold">
243
+ QTY: {metaEntries.length.toString().padStart(2, '0')}
244
+ </span>
245
+ </div>
246
+ <div className="space-y-1.5">
247
+ {metaEntries.map(([key, value]) => (
248
+ <div key={key} className="grid grid-cols-[140px_1fr] gap-2 py-1 border-b border-black/10">
249
+ <div className="text-[9px] uppercase tracking-widest text-black/60">{key}</div>
250
+ <div className="text-[10px] break-all text-black">{String(value)}</div>
251
+ </div>
252
+ ))}
253
+ </div>
254
+ </div>
255
+ )}
256
+
257
+ <div className="border border-dashed border-black/20 p-3 bg-white/40">
258
+ <div className="flex justify-between items-center mb-2 border-b border-black/10 pb-1">
259
+ <span className="text-[9px] font-bold uppercase tracking-widest text-black">SHARED_FIELDS</span>
260
+ <span className="text-[8px] text-black/40 font-bold">
261
+ QTY: {credential.fields.length.toString().padStart(2, '0')}
262
+ </span>
263
+ </div>
264
+
265
+ {credential.fields.length === 0 ? (
266
+ <div className="text-[10px] text-black/60 uppercase tracking-wider">No sensitive fields.</div>
267
+ ) : (
268
+ <div className="space-y-1.5">
269
+ {credential.fields.map((field) => (
270
+ <div key={field.key} className="grid grid-cols-[140px_1fr] gap-2 py-1 border-b border-black/10">
271
+ <div className="text-[9px] uppercase tracking-widest text-black/60">{field.key}</div>
272
+ <div className="text-[10px] break-all flex items-start gap-1.5 text-black">
273
+ <Eye size={10} className="mt-0.5 shrink-0" />
274
+ <span>{field.value}</span>
275
+ </div>
276
+ </div>
277
+ ))}
278
+ </div>
279
+ )}
280
+ </div>
281
+ </div>
282
+ )}
283
+ </div>
284
+
285
+ {credential && (
286
+ <div className="px-4 py-2 border-t border-black/10 bg-white/30">
287
+ <div className="text-[8px] text-black/40 uppercase tracking-widest mb-1">SHARE TOKEN</div>
288
+ <div className="text-[9px] text-black font-bold break-all leading-relaxed">{token}</div>
289
+ </div>
290
+ )}
291
+ </div>
292
+ </div>
293
+ </div>
294
+ );
295
+ }
@@ -0,0 +1,80 @@
1
+ import Link from 'next/link';
2
+
3
+ export default function TermsPage() {
4
+ return (
5
+ <div className="min-h-screen bg-[var(--color-background,#f4f4f5)] relative p-4 py-8">
6
+ <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
7
+ <div className="absolute inset-0 bg-grid-adaptive bg-[size:4rem_4rem] opacity-30" />
8
+ <div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
9
+ <div className="absolute top-[5%] left-[5%] opacity-5 select-none">
10
+ <h1 className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter">
11
+ AURA
12
+ </h1>
13
+ </div>
14
+ <div className="absolute bottom-[5%] right-[5%] opacity-5 select-none">
15
+ <h1 className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter text-right">
16
+ TERMS
17
+ </h1>
18
+ </div>
19
+ </div>
20
+
21
+ <Link
22
+ href="/hello"
23
+ className="fixed top-6 left-6 z-50 flex items-center gap-3 hover:opacity-80 transition-opacity"
24
+ >
25
+ <div className="w-10 h-10">
26
+ <img src="/logo.webp" alt="AuraMaxx" className="w-full h-full object-contain" />
27
+ </div>
28
+ <div className="font-black text-xl tracking-tighter text-[var(--color-text,#0a0a0a)]">AURAMAXX</div>
29
+ </Link>
30
+
31
+ <div className="fixed top-7 right-6 z-50 flex items-center gap-3 font-mono text-[10px] tracking-widest">
32
+ <Link href="/privacy" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">PRIVACY</Link>
33
+ <Link href="/docs" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">DOCS</Link>
34
+ <Link href="/" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">HOME</Link>
35
+ </div>
36
+
37
+ <main className="relative z-[5] max-w-[920px] mx-auto pt-16">
38
+ <article className="bg-[var(--color-surface,#f4f4f2)] border border-[var(--color-border,#d4d4d8)] shadow-lg overflow-hidden font-mono">
39
+ <header className="px-5 py-4 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
40
+ <h1 className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
41
+ Terms of Service
42
+ </h1>
43
+ <span className="text-[9px] text-[var(--color-text-muted,#6b7280)] tracking-widest">AURAWALLET</span>
44
+ </header>
45
+
46
+ <div className="p-6 space-y-5 text-[13px] leading-6 text-[var(--color-text,#0a0a0a)]">
47
+ <p>
48
+ AuraWallet is open-source software released under the MIT License. By using it, you agree that Aura Industries is not liable for any damages, losses, or claims tied to use of this software.
49
+ </p>
50
+ <p>
51
+ There is no warranty of any kind. Use AuraWallet at your own risk.
52
+ </p>
53
+ <p>
54
+ All data stays local on your machine and we collect nothing from your usage.
55
+ </p>
56
+ <p>
57
+ The software is provided as-is under MIT, without guarantees of merchantability, fitness for a particular purpose, or noninfringement.
58
+ </p>
59
+ <p>
60
+ Source code is public on GitHub:{' '}
61
+ <a
62
+ href="https://github.com/nicoduclare/aura"
63
+ target="_blank"
64
+ rel="noopener noreferrer"
65
+ className="underline hover:no-underline"
66
+ >
67
+ https://github.com/nicoduclare/aura
68
+ </a>
69
+ .
70
+ </p>
71
+ </div>
72
+
73
+ <footer className="px-5 py-3 border-t border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] text-[9px] tracking-widest text-[var(--color-text-faint,#9ca3af)] uppercase">
74
+ Effective immediately
75
+ </footer>
76
+ </article>
77
+ </main>
78
+ </div>
79
+ );
80
+ }
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+
3
+ import React from 'react';
4
+ import { ChainSelector as DefaultChainSelector } from '@/components/design-system';
5
+
6
+ export const SUPPORTED_CHAINS = ['base', 'ethereum', 'arbitrum', 'optimism', 'polygon', 'solana'] as const;
7
+
8
+ interface ChainSelectorProps {
9
+ value: string;
10
+ onChange: (chain: string) => void;
11
+ includeAll?: boolean;
12
+ disabled?: boolean;
13
+ size?: 'sm' | 'md';
14
+ className?: string;
15
+ label?: string;
16
+ }
17
+
18
+ export function ChainSelector({
19
+ value,
20
+ onChange,
21
+ includeAll = false,
22
+ disabled = false,
23
+ size = 'sm',
24
+ className = '',
25
+ label,
26
+ }: ChainSelectorProps) {
27
+ const chains = includeAll
28
+ ? ['all', ...SUPPORTED_CHAINS]
29
+ : [...SUPPORTED_CHAINS];
30
+
31
+ return (
32
+ <DefaultChainSelector
33
+ value={value}
34
+ onChange={onChange}
35
+ chains={chains}
36
+ disabled={disabled}
37
+ size={size}
38
+ className={className}
39
+ label={label}
40
+ />
41
+ );
42
+ }
43
+
44
+ export default ChainSelector;