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,93 @@
1
+ /**
2
+ * Lightweight file-backed feature flags for dev/experimental toggles.
3
+ * Config stored at <project-root>/.aura/features.json (local, gitignored).
4
+ */
5
+
6
+ import fs from 'fs';
7
+ import path from 'path';
8
+
9
+ export interface FeatureFlags {
10
+ DEMO_FEATURE: boolean;
11
+ [key: string]: boolean;
12
+ }
13
+
14
+ const DEFAULT_FLAGS: FeatureFlags = {
15
+ DEMO_FEATURE: false,
16
+ EXPERIMENTAL_WALLET: false,
17
+ };
18
+
19
+ const root = path.resolve(__dirname, '..', '..');
20
+
21
+ function configPath(): string {
22
+ return path.join(root, '.aura', 'features.json');
23
+ }
24
+
25
+ export function getDefaultFlags(): FeatureFlags {
26
+ return { ...DEFAULT_FLAGS };
27
+ }
28
+
29
+ export function getKnownFlagNames(): string[] {
30
+ return Object.keys(DEFAULT_FLAGS);
31
+ }
32
+
33
+ export function readFlags(): FeatureFlags {
34
+ const defaults = getDefaultFlags();
35
+ const filePath = configPath();
36
+
37
+ if (!fs.existsSync(filePath)) {
38
+ return defaults;
39
+ }
40
+
41
+ try {
42
+ const raw = fs.readFileSync(filePath, 'utf-8');
43
+ const parsed = JSON.parse(raw);
44
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
45
+ return defaults;
46
+ }
47
+ // Merge: defaults first, then file overrides (only known keys)
48
+ const merged = { ...defaults };
49
+ for (const key of Object.keys(defaults)) {
50
+ if (typeof parsed[key] === 'boolean') {
51
+ merged[key] = parsed[key];
52
+ }
53
+ }
54
+ return merged;
55
+ } catch {
56
+ return defaults;
57
+ }
58
+ }
59
+
60
+ export function writeFlag(name: string, value: boolean): { ok: boolean; error?: string } {
61
+ const known = getKnownFlagNames();
62
+ if (!known.includes(name)) {
63
+ return { ok: false, error: `Unknown flag: ${name}. Known flags: ${known.join(', ')}` };
64
+ }
65
+
66
+ const current = readFlags();
67
+ current[name] = value;
68
+
69
+ const filePath = configPath();
70
+ try {
71
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
72
+ fs.writeFileSync(filePath, JSON.stringify(current, null, 2) + '\n', 'utf-8');
73
+ return { ok: true };
74
+ } catch (err: unknown) {
75
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
76
+ }
77
+ }
78
+
79
+ export function isEnabled(name: string): boolean {
80
+ const flags = readFlags();
81
+ return !!flags[name];
82
+ }
83
+
84
+ export function ensureDefaults(): void {
85
+ const filePath = configPath();
86
+ if (fs.existsSync(filePath)) return;
87
+ try {
88
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
89
+ fs.writeFileSync(filePath, JSON.stringify(getDefaultFlags(), null, 2) + '\n', 'utf-8');
90
+ } catch {
91
+ // Best-effort; non-fatal during bootstrap.
92
+ }
93
+ }
@@ -0,0 +1,357 @@
1
+ import { ethers } from 'ethers';
2
+ import { WalletInfo, EncryptedData } from '../types';
3
+ import { getMnemonic, isUnlocked, getVaultMnemonic, isVaultUnlocked, getPrimaryVaultId } from './cold';
4
+ import { encryptWithSeed, decryptWithSeed } from './encrypt';
5
+ import { prisma } from './db';
6
+ import { normalizeAddress, isSolanaChain } from './address';
7
+ import { createSolanaHotWallet, getSolanaKeypair, signSolanaTransaction } from './solana/wallet';
8
+
9
+ export interface HotWalletInfo extends WalletInfo {
10
+ name?: string;
11
+ color?: string;
12
+ description?: string;
13
+ emoji?: string;
14
+ hidden?: boolean;
15
+ tokenHash: string;
16
+ }
17
+
18
+ export interface CreateHotWalletOptions {
19
+ tokenHash: string;
20
+ chain?: string;
21
+ name?: string;
22
+ color?: string;
23
+ description?: string;
24
+ emoji?: string;
25
+ hidden?: boolean;
26
+ coldWalletId?: string; // Which vault to encrypt with (null = primary)
27
+ }
28
+
29
+ /**
30
+ * Create a new hot wallet with random keypair, encrypted with the seed phrase.
31
+ * The wallet is owned by the token that creates it.
32
+ */
33
+ export async function createHotWallet(options: CreateHotWalletOptions): Promise<HotWalletInfo> {
34
+ const { chain = 'base', coldWalletId } = options;
35
+
36
+ // Delegate to Solana wallet creation if Solana chain
37
+ if (isSolanaChain(chain)) {
38
+ return createSolanaHotWallet(options);
39
+ }
40
+
41
+ // Get mnemonic from specific vault or primary
42
+ const mnemonic = coldWalletId ? getVaultMnemonic(coldWalletId) : getMnemonic();
43
+ if (!mnemonic) {
44
+ const target = coldWalletId ? `Vault ${coldWalletId}` : 'Cold wallet';
45
+ throw new Error(`${target} must be unlocked to create hot wallets`);
46
+ }
47
+
48
+ const { tokenHash, name, color, description, emoji, hidden = false } = options;
49
+
50
+ // Generate random wallet
51
+ const wallet = ethers.Wallet.createRandom();
52
+
53
+ // Encrypt private key with seed phrase
54
+ const encrypted = encryptWithSeed(wallet.privateKey, mnemonic);
55
+
56
+ // Store in DB (with coldWalletId reference)
57
+ const hotWallet = await prisma.hotWallet.create({
58
+ data: {
59
+ address: normalizeAddress(wallet.address, chain),
60
+ encryptedPrivateKey: JSON.stringify(encrypted),
61
+ tokenHash,
62
+ coldWalletId: coldWalletId || null,
63
+ name,
64
+ color,
65
+ description,
66
+ emoji,
67
+ hidden,
68
+ chain,
69
+ },
70
+ });
71
+
72
+ return {
73
+ address: hotWallet.address,
74
+ tier: 'hot',
75
+ chain: hotWallet.chain,
76
+ createdAt: hotWallet.createdAt.toISOString(),
77
+ name: hotWallet.name || undefined,
78
+ color: hotWallet.color || undefined,
79
+ description: hotWallet.description || undefined,
80
+ emoji: hotWallet.emoji || undefined,
81
+ hidden: hotWallet.hidden,
82
+ tokenHash: hotWallet.tokenHash,
83
+ };
84
+ }
85
+
86
+ /**
87
+ * List hot wallets. If tokenHash is provided, filter to only wallets owned by that token.
88
+ * If not provided (human access), return all wallets.
89
+ * If includeHidden is false (default), hidden wallets are excluded.
90
+ */
91
+ export async function listHotWallets(tokenHash?: string, includeHidden: boolean = false): Promise<HotWalletInfo[]> {
92
+ const where: { tokenHash?: string; hidden?: boolean } = {};
93
+ if (tokenHash) where.tokenHash = tokenHash;
94
+ if (!includeHidden) where.hidden = false;
95
+
96
+ const wallets = await prisma.hotWallet.findMany({
97
+ where,
98
+ orderBy: { createdAt: 'desc' },
99
+ });
100
+
101
+ return wallets.map((w) => ({
102
+ address: w.address,
103
+ tier: 'hot' as const,
104
+ chain: w.chain,
105
+ createdAt: w.createdAt.toISOString(),
106
+ name: w.name || undefined,
107
+ color: w.color || undefined,
108
+ description: w.description || undefined,
109
+ emoji: w.emoji || undefined,
110
+ hidden: w.hidden,
111
+ tokenHash: w.tokenHash,
112
+ }));
113
+ }
114
+
115
+ /**
116
+ * Get a hot wallet by address.
117
+ */
118
+ export async function getHotWallet(address: string) {
119
+ // Try lowercase first (EVM), then exact match (Solana)
120
+ let wallet = await prisma.hotWallet.findUnique({
121
+ where: { address: address.toLowerCase() },
122
+ });
123
+ if (!wallet && address !== address.toLowerCase()) {
124
+ wallet = await prisma.hotWallet.findUnique({
125
+ where: { address },
126
+ });
127
+ }
128
+
129
+ if (!wallet) return null;
130
+
131
+ return {
132
+ address: wallet.address,
133
+ tokenHash: wallet.tokenHash,
134
+ coldWalletId: wallet.coldWalletId,
135
+ metadata: {
136
+ name: wallet.name,
137
+ color: wallet.color,
138
+ description: wallet.description,
139
+ emoji: wallet.emoji,
140
+ hidden: wallet.hidden,
141
+ chain: wallet.chain,
142
+ createdAt: wallet.createdAt.toISOString(),
143
+ },
144
+ };
145
+ }
146
+
147
+ /**
148
+ * Sign and send a transaction from a hot wallet.
149
+ * Requires the cold wallet to be unlocked to decrypt the private key.
150
+ */
151
+ export async function signWithHotWallet(
152
+ address: string,
153
+ transaction: ethers.TransactionRequest,
154
+ provider: ethers.Provider
155
+ ): Promise<{ hash: string }> {
156
+ // Try lowercase first (EVM), then exact match (Solana)
157
+ let wallet = await prisma.hotWallet.findUnique({
158
+ where: { address: address.toLowerCase() },
159
+ });
160
+ if (!wallet && address !== address.toLowerCase()) {
161
+ wallet = await prisma.hotWallet.findUnique({
162
+ where: { address },
163
+ });
164
+ }
165
+
166
+ if (!wallet) {
167
+ throw new Error(`Hot wallet not found: ${address}`);
168
+ }
169
+
170
+ // Get mnemonic from the vault this hot wallet belongs to
171
+ const mnemonic = wallet.coldWalletId
172
+ ? getVaultMnemonic(wallet.coldWalletId)
173
+ : getMnemonic();
174
+ if (!mnemonic) {
175
+ const target = wallet.coldWalletId ? `Vault ${wallet.coldWalletId}` : 'Cold wallet';
176
+ throw new Error(`${target} must be unlocked to sign from hot wallet`);
177
+ }
178
+
179
+ // Decrypt the private key
180
+ const encrypted: EncryptedData = JSON.parse(wallet.encryptedPrivateKey);
181
+ const privateKey = decryptWithSeed(encrypted, mnemonic);
182
+
183
+ // Create signer and send transaction
184
+ const signer = new ethers.Wallet(privateKey, provider);
185
+ const tx = await signer.sendTransaction(transaction);
186
+
187
+ return { hash: tx.hash };
188
+ }
189
+
190
+ /**
191
+ * Export a hot wallet's private key.
192
+ * Requires the cold wallet to be unlocked.
193
+ */
194
+ export async function exportHotWallet(address: string): Promise<{ address: string; privateKey: string }> {
195
+ // Try lowercase first (EVM), then exact match (Solana)
196
+ let wallet = await prisma.hotWallet.findUnique({
197
+ where: { address: address.toLowerCase() },
198
+ });
199
+ if (!wallet && address !== address.toLowerCase()) {
200
+ wallet = await prisma.hotWallet.findUnique({
201
+ where: { address },
202
+ });
203
+ }
204
+
205
+ if (!wallet) {
206
+ throw new Error(`Hot wallet not found: ${address}`);
207
+ }
208
+
209
+ // Get mnemonic from the vault this hot wallet belongs to
210
+ const mnemonic = wallet.coldWalletId
211
+ ? getVaultMnemonic(wallet.coldWalletId)
212
+ : getMnemonic();
213
+ if (!mnemonic) {
214
+ const target = wallet.coldWalletId ? `Vault ${wallet.coldWalletId}` : 'Cold wallet';
215
+ throw new Error(`${target} must be unlocked to export hot wallet`);
216
+ }
217
+
218
+ // Decrypt the private key
219
+ const encrypted: EncryptedData = JSON.parse(wallet.encryptedPrivateKey);
220
+ const privateKey = decryptWithSeed(encrypted, mnemonic);
221
+
222
+ return {
223
+ address: wallet.address,
224
+ privateKey,
225
+ };
226
+ }
227
+
228
+ /**
229
+ * Delete a hot wallet.
230
+ */
231
+ export async function deleteHotWallet(address: string): Promise<void> {
232
+ // Try lowercase first (EVM), then exact (Solana)
233
+ try {
234
+ await prisma.hotWallet.delete({ where: { address: address.toLowerCase() } });
235
+ } catch {
236
+ if (address !== address.toLowerCase()) {
237
+ await prisma.hotWallet.delete({ where: { address } }).catch(() => {});
238
+ }
239
+ }
240
+ }
241
+
242
+ /**
243
+ * Update hot wallet metadata.
244
+ */
245
+ export async function updateHotWallet(
246
+ address: string,
247
+ updates: { name?: string; color?: string; description?: string; emoji?: string; hidden?: boolean }
248
+ ): Promise<boolean> {
249
+ try {
250
+ await prisma.hotWallet.update({
251
+ where: { address: address.toLowerCase() },
252
+ data: updates,
253
+ });
254
+ return true;
255
+ } catch {
256
+ // Try exact match (Solana addresses are case-sensitive)
257
+ if (address !== address.toLowerCase()) {
258
+ try {
259
+ await prisma.hotWallet.update({
260
+ where: { address },
261
+ data: updates,
262
+ });
263
+ return true;
264
+ } catch {
265
+ return false;
266
+ }
267
+ }
268
+ return false;
269
+ }
270
+ }
271
+
272
+ /**
273
+ * Search hot wallets by name, address, or description.
274
+ * If tokenHash is provided, filter to only wallets owned by that token.
275
+ * Always includes hidden wallets in search results.
276
+ */
277
+ export async function searchHotWallets(query: string, tokenHash?: string): Promise<HotWalletInfo[]> {
278
+ const lowerQuery = query.toLowerCase();
279
+
280
+ const where: { tokenHash?: string; OR: Array<{ name?: { contains: string }; address?: { contains: string }; description?: { contains: string } }> } = {
281
+ OR: [
282
+ { name: { contains: lowerQuery } },
283
+ { address: { contains: lowerQuery } },
284
+ { description: { contains: lowerQuery } },
285
+ ],
286
+ };
287
+ if (tokenHash) where.tokenHash = tokenHash;
288
+
289
+ const wallets = await prisma.hotWallet.findMany({
290
+ where,
291
+ orderBy: { createdAt: 'desc' },
292
+ });
293
+
294
+ return wallets.map((w) => ({
295
+ address: w.address,
296
+ tier: 'hot' as const,
297
+ chain: w.chain,
298
+ createdAt: w.createdAt.toISOString(),
299
+ name: w.name || undefined,
300
+ color: w.color || undefined,
301
+ description: w.description || undefined,
302
+ emoji: w.emoji || undefined,
303
+ hidden: w.hidden,
304
+ tokenHash: w.tokenHash,
305
+ }));
306
+ }
307
+
308
+ /**
309
+ * Check if a token owns a specific hot wallet.
310
+ */
311
+ export async function tokenOwnsWallet(tokenHash: string, address: string): Promise<boolean> {
312
+ // Try lowercase first (EVM), then exact match (Solana)
313
+ let wallet = await prisma.hotWallet.findUnique({
314
+ where: { address: address.toLowerCase() },
315
+ select: { tokenHash: true },
316
+ });
317
+ if (!wallet && address !== address.toLowerCase()) {
318
+ wallet = await prisma.hotWallet.findUnique({
319
+ where: { address },
320
+ select: { tokenHash: true },
321
+ });
322
+ }
323
+
324
+ return wallet?.tokenHash === tokenHash;
325
+ }
326
+
327
+ /**
328
+ * Check if a token can access a specific wallet.
329
+ * A token can access a wallet if:
330
+ * 1. The token created the wallet (tokenHash match), OR
331
+ * 2. The wallet address is in the token's walletAccess array
332
+ *
333
+ * @param tokenHash - Hash of the token making the request
334
+ * @param walletAccess - Array of wallet addresses the token has been granted access to
335
+ * @param address - The wallet address to check access for
336
+ * @returns true if the token can access the wallet
337
+ */
338
+ export async function tokenCanAccessWallet(
339
+ tokenHash: string,
340
+ walletAccess: string[] | undefined,
341
+ address: string,
342
+ chain?: string
343
+ ): Promise<boolean> {
344
+ const normalized = normalizeAddress(address, chain);
345
+
346
+ // Check if wallet address is in the walletAccess grants
347
+ if (walletAccess && walletAccess.includes(normalized)) {
348
+ return true;
349
+ }
350
+ // Also check original address (for Solana addresses that may be stored as-is)
351
+ if (walletAccess && walletAccess.includes(address)) {
352
+ return true;
353
+ }
354
+
355
+ // Fall back to checking ownership
356
+ return tokenOwnsWallet(tokenHash, address);
357
+ }
@@ -0,0 +1,80 @@
1
+ import type { HumanAction } from '@prisma/client';
2
+
3
+ export interface HumanActionReadableSummary {
4
+ actionLabel: string;
5
+ oneLiner: string;
6
+ can: string[];
7
+ cannot: string[];
8
+ scope: string[];
9
+ expiresIn: string;
10
+ riskHint: string;
11
+ profileLabel?: string;
12
+ }
13
+
14
+ function parseMetadata(metadata?: string | null): Record<string, unknown> {
15
+ if (!metadata) return {};
16
+ try {
17
+ const parsed = JSON.parse(metadata);
18
+ return parsed && typeof parsed === 'object' ? parsed as Record<string, unknown> : {};
19
+ } catch {
20
+ return {};
21
+ }
22
+ }
23
+
24
+ function formatTtl(ttl: unknown): string {
25
+ const n = Number(ttl);
26
+ if (!Number.isFinite(n) || n <= 0) return 'default';
27
+ if (n < 60) return `${n}s`;
28
+ if (n % 60 === 0) return `${Math.round(n / 60)}m`;
29
+ return `${n}s`;
30
+ }
31
+
32
+ export function buildHumanActionSummary(action: Pick<HumanAction, 'type' | 'summary' | 'metadata'>): HumanActionReadableSummary {
33
+ const meta = parseMetadata(action.metadata);
34
+ const verified = (meta.verifiedSummary && typeof meta.verifiedSummary === 'object')
35
+ ? meta.verifiedSummary as Record<string, unknown>
36
+ : null;
37
+
38
+ const permissions = Array.isArray(meta.permissions)
39
+ ? meta.permissions.filter((v): v is string => typeof v === 'string')
40
+ : [];
41
+ const walletAccess = Array.isArray(meta.walletAccess)
42
+ ? meta.walletAccess.filter((v): v is string => typeof v === 'string')
43
+ : [];
44
+
45
+ const oneLiner = typeof verified?.oneLiner === 'string'
46
+ ? verified.oneLiner
47
+ : (typeof action.summary === 'string' && action.summary.trim()) || 'Approval requested';
48
+
49
+ const can = Array.isArray(verified?.permissionLabels)
50
+ ? (verified.permissionLabels as unknown[]).filter((v): v is string => typeof v === 'string')
51
+ : permissions;
52
+
53
+ const scope = Array.isArray(verified?.walletAccessLabels)
54
+ ? (verified.walletAccessLabels as unknown[]).filter((v): v is string => typeof v === 'string')
55
+ : walletAccess;
56
+
57
+ const riskHint = scope.length > 1
58
+ ? 'Affects multiple wallets'
59
+ : can.some((p) => p.includes('swap') || p.includes('send') || p.includes('fund'))
60
+ ? 'Can move funds'
61
+ : 'Limited scope';
62
+
63
+ const profile = meta.profile && typeof meta.profile === 'object'
64
+ ? meta.profile as Record<string, unknown>
65
+ : null;
66
+ const profileLabel = typeof profile?.displayName === 'string'
67
+ ? profile.displayName
68
+ : undefined;
69
+
70
+ return {
71
+ actionLabel: action.type.replace(/[:_]/g, ' ').toUpperCase(),
72
+ oneLiner,
73
+ can,
74
+ cannot: ['Cannot exceed granted permission scope', 'Cannot bypass expiry'],
75
+ scope,
76
+ expiresIn: typeof verified?.ttlLabel === 'string' ? verified.ttlLabel : formatTtl(meta.ttl),
77
+ riskHint,
78
+ profileLabel,
79
+ };
80
+ }
@@ -0,0 +1,28 @@
1
+ import { createHash, createPublicKey } from 'crypto';
2
+
3
+ function normalizeFingerprint(hex: string): string {
4
+ return hex.toLowerCase().replace(/[^a-f0-9]/g, '').match(/.{1,2}/g)?.join(':') || '';
5
+ }
6
+
7
+ export function computeSshFingerprint(publicKeyOrPrivateKey: string): string | null {
8
+ const material = publicKeyOrPrivateKey?.trim();
9
+ if (!material) return null;
10
+
11
+ try {
12
+ const keyObject = createPublicKey(material);
13
+ const der = keyObject.export({ format: 'der', type: 'spki' }) as Buffer;
14
+ const digest = createHash('sha256').update(der).digest('hex');
15
+ return normalizeFingerprint(digest);
16
+ } catch {
17
+ return null;
18
+ }
19
+ }
20
+
21
+ export function computeGpgFingerprint(material: string): string | null {
22
+ const normalized = material?.trim();
23
+ if (!normalized) return null;
24
+
25
+ // Deterministic pseudo-fingerprint for armored key material (v1 scope).
26
+ const digest = createHash('sha1').update(normalized).digest('hex');
27
+ return normalizeFingerprint(digest);
28
+ }