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,352 @@
1
+ import { Request, Response } from 'express';
2
+ import { ethers } from 'ethers';
3
+ import { getHotWallet, signWithHotWallet, tokenCanAccessWallet } from '../lib/hot';
4
+ import { getTempWallet, signWithTempWallet } from '../lib/temp';
5
+ import { isUnlocked } from '../lib/cold';
6
+ import { getRpcUrl } from '../lib/config';
7
+ import { logger } from '../lib/logger';
8
+ import {
9
+ getDexAdapter,
10
+ detectBestDex,
11
+ listDexes,
12
+ PoolKey
13
+ } from '../lib/dex';
14
+ import { getV4PoolKey, getKnownV4Hooks, detectV4PoolFromEvents } from '../lib/dex/uniswap';
15
+ import { isAdmin, hasAnyPermission, buildPermissionDenied } from '../lib/permissions';
16
+ import { reserveSpend, releaseSpend, getRemainingByType } from '../lib/sessions';
17
+ import { getDefault } from '../lib/defaults';
18
+ import { getNativeAddress } from '../lib/address';
19
+ import { recordTransaction, autoTrackToken } from '../lib/transactions';
20
+ import { AuthInfo } from '../middleware/auth';
21
+ import { ChainConfig } from '../lib/config';
22
+
23
+ export async function handleEvmSwap(
24
+ req: Request,
25
+ res: Response,
26
+ auth: AuthInfo,
27
+ targetChain: string,
28
+ chainConfig: ChainConfig,
29
+ destinationChainId?: number,
30
+ targetChainOut?: string
31
+ ): Promise<void> {
32
+ const {
33
+ from,
34
+ token,
35
+ direction,
36
+ amount,
37
+ minOut,
38
+ slippage,
39
+ dex: requestedDex,
40
+ version: requestedVersion,
41
+ poolFee,
42
+ poolKey,
43
+ hook: requestedHook,
44
+ description: userDescription
45
+ } = req.body;
46
+
47
+ const provider = new ethers.JsonRpcProvider(await getRpcUrl(targetChain));
48
+
49
+ // Determine wallet type and verify ownership
50
+ const hotWallet = await getHotWallet(from);
51
+ const tempWallet = getTempWallet(from);
52
+
53
+ if (!hotWallet && !tempWallet) {
54
+ res.status(404).json({ error: 'Wallet not found' });
55
+ return;
56
+ }
57
+
58
+ if (hotWallet) {
59
+ // Check permission
60
+ if (!isAdmin(auth) && !hasAnyPermission(auth.token.permissions, ['swap'])) {
61
+ logger.permissionDenied('swap', auth.token.agentId, '/swap');
62
+ res.status(403).json(buildPermissionDenied('Token does not have swap permission', ['swap'], auth.token.permissions));
63
+ return;
64
+ }
65
+
66
+ // Verify token can access this wallet
67
+ const canAccess = await tokenCanAccessWallet(auth.tokenHash, auth.token.walletAccess, from);
68
+ if (!isAdmin(auth) && !canAccess) {
69
+ logger.permissionDenied('wallet_access', auth.token.agentId, '/swap');
70
+ res.status(403).json(buildPermissionDenied('Token does not have access to this wallet', ['wallet:access'], auth.token.permissions));
71
+ return;
72
+ }
73
+
74
+ if (!isUnlocked()) {
75
+ logger.authFailed('Cold wallet locked', '/swap');
76
+ res.status(401).json({ error: 'Cold wallet must be unlocked to send from hot wallet' });
77
+ return;
78
+ }
79
+ } else if (tempWallet) {
80
+ // Check permission
81
+ if (!isAdmin(auth) && !hasAnyPermission(auth.token.permissions, ['swap'])) {
82
+ logger.permissionDenied('swap', auth.token.agentId, '/swap');
83
+ res.status(403).json(buildPermissionDenied('Token does not have swap permission', ['swap'], auth.token.permissions));
84
+ return;
85
+ }
86
+ }
87
+
88
+ // Reserve spending atomically (prevents TOCTOU race between concurrent requests)
89
+ const currency = getNativeAddress(targetChain);
90
+ const evmSwapAmount = parseFloat(ethers.formatEther(BigInt(amount)));
91
+ const needsEvmLimit = !isAdmin(auth) && evmSwapAmount > 0;
92
+ if (needsEvmLimit) {
93
+ const reserve = reserveSpend(auth.tokenHash, auth.token, 'swap', evmSwapAmount, currency);
94
+ if (!reserve.ok) {
95
+ const remaining = getRemainingByType(auth.tokenHash, auth.token, 'swap', currency);
96
+ logger.limitExceeded(auth.token.agentId, 'swap', evmSwapAmount, remaining);
97
+ res.status(403).json({ ...buildPermissionDenied('Amount exceeds remaining swap limit', ['swap'], auth.token.permissions), remaining: reserve.remaining, requested: evmSwapAmount });
98
+ return;
99
+ }
100
+ }
101
+
102
+ // Helper to roll back reserved spend on early exit or error
103
+ const evmRollback = () => {
104
+ if (needsEvmLimit) releaseSpend(auth.tokenHash, 'swap', evmSwapAmount, currency);
105
+ };
106
+
107
+ // Get DEX adapter
108
+ let adapter;
109
+ let detectedPool;
110
+ let version = requestedVersion;
111
+ let detectedFee = poolFee;
112
+ let detectedPoolKey = poolKey;
113
+
114
+ if (requestedDex) {
115
+ // Use specified DEX
116
+ adapter = getDexAdapter(requestedDex);
117
+ if (!adapter) {
118
+ evmRollback();
119
+ res.status(400).json({
120
+ error: `Unknown DEX: ${requestedDex}. Available: ${listDexes().join(', ')}`
121
+ });
122
+ return;
123
+ }
124
+
125
+ if (!adapter.supportsChain(chainConfig.chainId)) {
126
+ evmRollback();
127
+ res.status(400).json({ error: `${requestedDex} not supported on ${targetChain}` });
128
+ return;
129
+ }
130
+
131
+ // Detect pool if version not specified
132
+ if (!version) {
133
+ detectedPool = await adapter.detectPool(token, provider);
134
+ if (!detectedPool) {
135
+ evmRollback();
136
+ res.status(400).json({ error: `No ${requestedDex} pool found for this token` });
137
+ return;
138
+ }
139
+ version = detectedPool.version;
140
+ detectedFee = detectedPool.fee;
141
+ detectedPoolKey = detectedPool.poolKey;
142
+ }
143
+ } else {
144
+ // Auto-detect best DEX
145
+ const result = await detectBestDex(token, provider, chainConfig.chainId);
146
+ if (!result) {
147
+ evmRollback();
148
+ res.status(400).json({ error: 'No liquidity pool found for this token' });
149
+ return;
150
+ }
151
+ adapter = result.adapter;
152
+ detectedPool = result.pool;
153
+ // Only use detected version if user didn't specify one
154
+ if (!version) {
155
+ version = detectedPool.version;
156
+ }
157
+ if (!detectedFee) {
158
+ detectedFee = detectedPool.fee;
159
+ }
160
+ if (!detectedPoolKey) {
161
+ detectedPoolKey = detectedPool.poolKey;
162
+ }
163
+ }
164
+
165
+ // V4 requires poolKey (Uniswap-specific, skip for aggregators like Relay)
166
+ if (adapter.name === 'uniswap' && version === 'v4' && !detectedPoolKey) {
167
+ // 1. Try specified hook first
168
+ if (requestedHook) {
169
+ detectedPoolKey = getV4PoolKey(token, requestedHook);
170
+ if (!detectedPoolKey) {
171
+ evmRollback();
172
+ res.status(400).json({
173
+ error: `Unknown hook: ${requestedHook}. Known hooks: ${getKnownV4Hooks().join(', ')}, none`
174
+ });
175
+ return;
176
+ }
177
+ }
178
+
179
+ // 2. Try known hooks (clanker, zora, etc.)
180
+ if (!detectedPoolKey) {
181
+ for (const hookName of getKnownV4Hooks()) {
182
+ detectedPoolKey = getV4PoolKey(token, hookName);
183
+ if (detectedPoolKey) break;
184
+ }
185
+ }
186
+
187
+ // 3. Try no-hook pools with common fee/tickSpacing combos
188
+ if (!detectedPoolKey) {
189
+ detectedPoolKey = getV4PoolKey(token, 'none');
190
+ }
191
+
192
+ // 4. Event lookup fallback (slow, requires RPC)
193
+ if (!detectedPoolKey) {
194
+ detectedPoolKey = await detectV4PoolFromEvents(token, provider);
195
+ }
196
+
197
+ if (!detectedPoolKey) {
198
+ evmRollback();
199
+ res.status(400).json({
200
+ error: `V4 pool not found. Provide poolKey or specify a known hook. Known hooks: ${getKnownV4Hooks().join(', ')}, none`
201
+ });
202
+ return;
203
+ }
204
+ }
205
+
206
+ // Enforce slippage floors
207
+ const minSlippage = isAdmin(auth)
208
+ ? await getDefault<number>('swap.min_slippage_admin', 0.5)
209
+ : await getDefault<number>('swap.min_slippage_agent', 1.0);
210
+ let effectiveSlippage = slippage;
211
+ if (effectiveSlippage !== undefined && effectiveSlippage !== null) {
212
+ if (effectiveSlippage < minSlippage) {
213
+ effectiveSlippage = minSlippage;
214
+ }
215
+ }
216
+
217
+ // Calculate finalMinOut — amount is already in wei, use BigInt directly
218
+ let finalMinOut: string;
219
+ if (effectiveSlippage !== undefined && effectiveSlippage !== null) {
220
+ const amountBig = BigInt(amount);
221
+ const slippageBps = BigInt(Math.floor(effectiveSlippage * 100)); // basis points
222
+ const floorMinOut = amountBig - (amountBig * slippageBps / 10000n);
223
+
224
+ if (minOut && minOut !== '0') {
225
+ // Caller provided explicit minOut - enforce it's not below the slippage floor
226
+ const explicitMinOut = BigInt(minOut);
227
+ if (explicitMinOut < floorMinOut) {
228
+ evmRollback();
229
+ res.status(400).json({
230
+ error: `minOut too low: ${minOut} is below the ${effectiveSlippage}% slippage floor (min: ${floorMinOut.toString()})`
231
+ });
232
+ return;
233
+ }
234
+ finalMinOut = minOut;
235
+ } else {
236
+ finalMinOut = floorMinOut.toString();
237
+ }
238
+ } else if (minOut && minOut !== '0') {
239
+ // No slippage param but explicit minOut - validate against the floor slippage
240
+ const amountBig = BigInt(amount);
241
+ const floorBps = BigInt(Math.floor(minSlippage * 100));
242
+ const floorMinOut = amountBig - (amountBig * floorBps / 10000n);
243
+ const explicitMinOut = BigInt(minOut);
244
+ if (explicitMinOut < floorMinOut) {
245
+ evmRollback();
246
+ res.status(400).json({
247
+ error: `minOut too low: ${minOut} is below the ${minSlippage}% slippage floor (min: ${floorMinOut.toString()})`
248
+ });
249
+ return;
250
+ }
251
+ finalMinOut = minOut;
252
+ } else {
253
+ evmRollback();
254
+ res.status(400).json({ error: 'slippage is required (percentage, e.g. 1.0 for 1%)' });
255
+ return;
256
+ }
257
+
258
+ // Build the swap transaction
259
+ const swapTxData = await adapter.buildSwapTx({
260
+ token,
261
+ direction,
262
+ amount,
263
+ minOut: finalMinOut,
264
+ from,
265
+ chainId: chainConfig.chainId,
266
+ destinationChainId,
267
+ version,
268
+ fee: detectedFee,
269
+ poolKey: detectedPoolKey
270
+ });
271
+
272
+ // Build transaction object
273
+ const tx: ethers.TransactionRequest = {
274
+ from,
275
+ to: swapTxData.to,
276
+ data: swapTxData.data,
277
+ value: BigInt(swapTxData.value)
278
+ };
279
+
280
+ // Sign and send
281
+ let txHash: string;
282
+
283
+ try {
284
+ if (hotWallet) {
285
+ const result = await signWithHotWallet(from, tx, provider);
286
+ txHash = result.hash;
287
+ } else if (tempWallet) {
288
+ txHash = await signWithTempWallet(from, tx, provider);
289
+ } else {
290
+ evmRollback();
291
+ res.status(404).json({ error: 'Wallet not found' });
292
+ return;
293
+ }
294
+ } catch (err) {
295
+ evmRollback();
296
+ throw err;
297
+ }
298
+
299
+ // Log the swap
300
+ const versionStr = version ? version.toUpperCase() : '';
301
+ const description = userDescription || (direction === 'buy'
302
+ ? `Bought ${token} with ${amount} ETH via ${adapter.name} ${versionStr}`
303
+ : `Sold ${amount} tokens of ${token} for ETH via ${adapter.name} ${versionStr}`);
304
+
305
+ await recordTransaction({
306
+ walletAddress: from,
307
+ txHash,
308
+ type: 'swap',
309
+ amount: direction === 'buy' ? amount : undefined,
310
+ tokenAddress: token,
311
+ tokenAmount: direction === 'sell' ? amount : undefined,
312
+ from,
313
+ to: swapTxData.to || adapter.getRouterAddress(),
314
+ description,
315
+ chain: targetChain,
316
+ logTitle: `Swap ${direction === 'buy' ? 'Buy' : 'Sell'}`,
317
+ });
318
+
319
+ // Auto-track the swapped token (save pool info for price lookup)
320
+ await autoTrackToken({
321
+ walletAddress: from,
322
+ tokenAddress: token,
323
+ chain: targetChain,
324
+ poolAddress: detectedPool?.poolAddress,
325
+ poolVersion: detectedPool?.version,
326
+ });
327
+
328
+ // Log swap event
329
+ const agentId = !isAdmin(auth) ? auth.token.agentId : undefined;
330
+ const fromToken = direction === 'buy' ? 'ETH' : token.slice(0, 10);
331
+ const toToken = direction === 'buy' ? token.slice(0, 10) : 'ETH';
332
+ logger.swap(from, fromToken, toToken, amount, txHash, agentId);
333
+
334
+ const remaining = isAdmin(auth)
335
+ ? Infinity
336
+ : getRemainingByType(auth.tokenHash, auth.token, 'swap', currency);
337
+
338
+ res.json({
339
+ success: true,
340
+ hash: txHash,
341
+ from,
342
+ token,
343
+ direction,
344
+ amountIn: amount,
345
+ dex: adapter.name,
346
+ version,
347
+ chain: targetChain,
348
+ ...(targetChainOut && { chainOut: targetChainOut }),
349
+ router: adapter.getRouterAddress(),
350
+ remaining
351
+ });
352
+ }
@@ -0,0 +1,176 @@
1
+ import { Request, Response } from 'express';
2
+ import { PublicKey, VersionedTransaction } from '@solana/web3.js';
3
+ import { getHotWallet, tokenCanAccessWallet } from '../lib/hot';
4
+ import { hasTempWallet, getTempSolanaKeypair } from '../lib/temp';
5
+ import { isUnlocked } from '../lib/cold';
6
+ import { logger } from '../lib/logger';
7
+ import { isAdmin, hasAnyPermission, buildPermissionDenied } from '../lib/permissions';
8
+ import { reserveSpend, releaseSpend, getRemainingByType } from '../lib/sessions';
9
+ import { getDefaultSync } from '../lib/defaults';
10
+ import { getNativeAddress, getNativeCurrency, NATIVE_ADDRESSES } from '../lib/address';
11
+ import { getSolanaConnection } from '../lib/solana/connection';
12
+ import { getSolanaKeypair } from '../lib/solana/wallet';
13
+ import { recordTransaction, autoTrackToken } from '../lib/transactions';
14
+ import { executeJupiterSwap } from '../lib/solana/jupiter';
15
+ import { AuthInfo } from '../middleware/auth';
16
+ import { ChainConfig } from '../lib/config';
17
+
18
+ export async function handleSolanaSwap(
19
+ req: Request,
20
+ res: Response,
21
+ auth: AuthInfo,
22
+ targetChain: string,
23
+ _chainConfig: ChainConfig
24
+ ): Promise<void> {
25
+ const { from, token, direction, amount, slippage, chainOut, description: userDescription } = req.body;
26
+
27
+ if (chainOut) {
28
+ res.status(400).json({ error: 'Cross-chain swaps are not supported on Solana' });
29
+ return;
30
+ }
31
+
32
+ const currency = getNativeAddress(targetChain);
33
+ const nativeCurrency = getNativeCurrency(targetChain);
34
+
35
+ // Determine wallet
36
+ const hotWallet = await getHotWallet(from);
37
+ const isTempWallet = hasTempWallet(from);
38
+
39
+ if (!hotWallet && !isTempWallet) {
40
+ res.status(404).json({ error: 'Wallet not found' });
41
+ return;
42
+ }
43
+
44
+ // Permission checks
45
+ if (!isAdmin(auth) && !hasAnyPermission(auth.token.permissions, ['swap'])) {
46
+ logger.permissionDenied('swap', auth.token.agentId, '/swap');
47
+ res.status(403).json(buildPermissionDenied('Token does not have swap permission', ['swap'], auth.token.permissions));
48
+ return;
49
+ }
50
+
51
+ if (hotWallet) {
52
+ const canAccess = await tokenCanAccessWallet(auth.tokenHash, auth.token.walletAccess, from, targetChain);
53
+ if (!isAdmin(auth) && !canAccess) {
54
+ logger.permissionDenied('wallet_access', auth.token.agentId, '/swap');
55
+ res.status(403).json(buildPermissionDenied('Token does not have access to this wallet', ['wallet:access'], auth.token.permissions));
56
+ return;
57
+ }
58
+ if (!isUnlocked()) {
59
+ logger.authFailed('Cold wallet locked', '/swap');
60
+ res.status(401).json({ error: 'Cold wallet must be unlocked to send from hot wallet' });
61
+ return;
62
+ }
63
+ }
64
+
65
+ // Reserve spending atomically (prevents TOCTOU race between concurrent requests)
66
+ const swapAmountSol = Number(BigInt(amount)) / 1e9;
67
+ const needsSolLimit = !isAdmin(auth) && swapAmountSol > 0;
68
+ if (needsSolLimit) {
69
+ const reserve = reserveSpend(auth.tokenHash, auth.token, 'swap', swapAmountSol, currency);
70
+ if (!reserve.ok) {
71
+ logger.limitExceeded(auth.token.agentId, 'swap', swapAmountSol, reserve.remaining);
72
+ res.status(403).json({ ...buildPermissionDenied('Amount exceeds remaining swap limit', ['swap'], auth.token.permissions), remaining: reserve.remaining, requested: swapAmountSol });
73
+ return;
74
+ }
75
+ }
76
+
77
+ // Jupiter swap
78
+ const connection = await getSolanaConnection(targetChain);
79
+ const inputMint = direction === 'buy' ? NATIVE_ADDRESSES.SOL : token;
80
+ const outputMint = direction === 'buy' ? token : NATIVE_ADDRESSES.SOL;
81
+
82
+ // Amount is already in lamports (buy) or raw token amount (sell)
83
+ const amountRaw = amount;
84
+
85
+ // Calculate slippage in bps
86
+ const effectiveSlippage = slippage ?? getDefaultSync<number>('swap.min_slippage_agent', 1.0);
87
+ const slippageBps = Math.round(effectiveSlippage * 100);
88
+
89
+ let userPubkey: PublicKey;
90
+ try {
91
+ userPubkey = new PublicKey(from);
92
+ } catch {
93
+ if (needsSolLimit) releaseSpend(auth.tokenHash, 'swap', swapAmountSol, currency);
94
+ res.status(400).json({ error: 'Invalid Solana address' });
95
+ return;
96
+ }
97
+
98
+ // Get signer
99
+ let signerKeypair;
100
+ if (hotWallet) {
101
+ signerKeypair = await getSolanaKeypair(from);
102
+ } else {
103
+ signerKeypair = getTempSolanaKeypair(from);
104
+ if (!signerKeypair) {
105
+ if (needsSolLimit) releaseSpend(auth.tokenHash, 'swap', swapAmountSol, currency);
106
+ res.status(404).json({ error: 'Temp Solana wallet not found' });
107
+ return;
108
+ }
109
+ }
110
+
111
+ let signature: string;
112
+ try {
113
+ const result = await executeJupiterSwap(
114
+ connection,
115
+ inputMint,
116
+ outputMint,
117
+ amountRaw,
118
+ slippageBps,
119
+ userPubkey,
120
+ async (tx: VersionedTransaction) => {
121
+ tx.sign([signerKeypair!]);
122
+ return tx;
123
+ }
124
+ );
125
+ signature = result.signature;
126
+ } catch (err) {
127
+ if (needsSolLimit) releaseSpend(auth.tokenHash, 'swap', swapAmountSol, currency);
128
+ throw err;
129
+ }
130
+
131
+ // Log
132
+ const description = userDescription || (direction === 'buy'
133
+ ? `Bought ${token} with ${amount} ${nativeCurrency} via Jupiter`
134
+ : `Sold ${amount} tokens of ${token} for ${nativeCurrency} via Jupiter`);
135
+
136
+ await recordTransaction({
137
+ walletAddress: from,
138
+ txHash: signature,
139
+ type: 'swap',
140
+ amount: direction === 'buy' ? amount : undefined,
141
+ tokenAddress: token,
142
+ tokenAmount: direction === 'sell' ? amount : undefined,
143
+ from,
144
+ to: 'jupiter',
145
+ description,
146
+ chain: targetChain,
147
+ logTitle: `Swap ${direction === 'buy' ? 'Buy' : 'Sell'}`,
148
+ });
149
+
150
+ await autoTrackToken({
151
+ walletAddress: from,
152
+ tokenAddress: token,
153
+ chain: targetChain,
154
+ });
155
+
156
+ const agentId = !isAdmin(auth) ? auth.token.agentId : undefined;
157
+ const fromToken = direction === 'buy' ? nativeCurrency : token.slice(0, 10);
158
+ const toToken = direction === 'buy' ? token.slice(0, 10) : nativeCurrency;
159
+ logger.swap(from, fromToken, toToken, amount, signature, agentId);
160
+
161
+ const remaining = isAdmin(auth)
162
+ ? Infinity
163
+ : getRemainingByType(auth.tokenHash, auth.token, 'swap', currency);
164
+
165
+ res.json({
166
+ success: true,
167
+ hash: signature,
168
+ from,
169
+ token,
170
+ direction,
171
+ amountIn: amount,
172
+ dex: 'jupiter',
173
+ chain: targetChain,
174
+ remaining
175
+ });
176
+ }