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
Binary file
@@ -0,0 +1,409 @@
1
+ 'use client';
2
+
3
+ import { useState, useEffect, useCallback } from 'react';
4
+ import Link from 'next/link';
5
+ import { useParams } from 'next/navigation';
6
+ import { useAuth } from '@/context/AuthContext';
7
+ import { api, Api, unlockWallet } from '@/lib/api';
8
+ import { generateVaultKeypair } from '@/lib/vault-crypto';
9
+
10
+ interface ActionSummary {
11
+ success: boolean;
12
+ id: string;
13
+ type: string;
14
+ status: string;
15
+ action: string;
16
+ scope?: string[];
17
+ impact?: string[];
18
+ risk?: string;
19
+ profile?: string;
20
+ }
21
+
22
+ type PageState = 'loading' | 'locked' | 'ready';
23
+
24
+ export default function ApproveActionPage() {
25
+ const { actionId } = useParams<{ actionId: string }>();
26
+ const { setToken } = useAuth();
27
+
28
+ const [pageState, setPageState] = useState<PageState>('loading');
29
+ const [action, setAction] = useState<ActionSummary | null>(null);
30
+
31
+ // Unlock form state
32
+ const [password, setPassword] = useState('');
33
+ const [trustDevice, setTrustDevice] = useState(false);
34
+ const [unlockLoading, setUnlockLoading] = useState(false);
35
+ const [resolving, setResolving] = useState(false);
36
+ const [error, setError] = useState<string | null>(null);
37
+
38
+ const fetchAction = useCallback(async () => {
39
+ try {
40
+ const data = await api.get<ActionSummary>(Api.Wallet, `/actions/${encodeURIComponent(actionId)}/summary`);
41
+ setAction(data);
42
+ } catch {
43
+ setAction(null);
44
+ }
45
+ }, [actionId]);
46
+
47
+ // Check setup status on mount
48
+ useEffect(() => {
49
+ let cancelled = false;
50
+ (async () => {
51
+ try {
52
+ const setup = await api.get<{ hasWallet: boolean; unlocked: boolean }>(Api.Wallet, '/setup');
53
+ if (cancelled) return;
54
+ if (!setup.hasWallet) {
55
+ window.location.href = '/';
56
+ return;
57
+ }
58
+ if (!setup.unlocked) {
59
+ setPageState('locked');
60
+ return;
61
+ }
62
+ // Unlocked — fetch action and show approval
63
+ await fetchAction();
64
+ if (!cancelled) setPageState('ready');
65
+ } catch {
66
+ if (!cancelled) setPageState('locked');
67
+ }
68
+ })();
69
+ return () => { cancelled = true; };
70
+ }, [fetchAction]);
71
+
72
+ const handleUnlock = async (e: React.FormEvent) => {
73
+ e.preventDefault();
74
+ if (!password) return;
75
+
76
+ setUnlockLoading(true);
77
+ setError(null);
78
+ try {
79
+ const { publicKeyBase64 } = await generateVaultKeypair();
80
+ const data = await unlockWallet(password, undefined, publicKeyBase64);
81
+ if (data.token) {
82
+ setToken(data.token, { persist: trustDevice ? 'local' : 'session' });
83
+ }
84
+ setPassword('');
85
+ // Fetch action summary now that we're unlocked
86
+ await fetchAction();
87
+ setPageState('ready');
88
+ } catch (err) {
89
+ setError((err as Error).message || 'Unlock failed');
90
+ } finally {
91
+ setUnlockLoading(false);
92
+ }
93
+ };
94
+
95
+ const handleResolve = async (approved: boolean) => {
96
+ setResolving(true);
97
+ setError(null);
98
+ try {
99
+ await api.post(Api.Wallet, `/actions/${encodeURIComponent(actionId)}/resolve`, { approved });
100
+ // Re-fetch action to get the resolved status from the server
101
+ await fetchAction();
102
+ } catch (err) {
103
+ setError((err as Error).message || 'Failed to resolve action');
104
+ } finally {
105
+ setResolving(false);
106
+ }
107
+ };
108
+
109
+ // Derive display state from action status
110
+ const state: string = action?.status === 'approved' ? 'approved' : action?.status === 'rejected' ? 'denied' : action?.status === 'expired' ? 'expired' : 'pending';
111
+
112
+ const actionName = action?.action || 'Unspecified action';
113
+ const scopeItems = action?.scope || [];
114
+ const impactItems = action?.impact || [];
115
+ const riskLevel = (action?.risk || 'unknown').toUpperCase();
116
+ const profileName = action?.profile;
117
+
118
+ const hasScopeContext = scopeItems.length > 0 || impactItems.length > 0;
119
+
120
+ const isResolved = state === 'approved' || state === 'denied' || state === 'expired';
121
+
122
+ const statusLabel =
123
+ state === 'approved' ? 'APPROVED'
124
+ : state === 'denied' ? 'DENIED'
125
+ : state === 'expired' ? 'EXPIRED'
126
+ : 'PENDING';
127
+
128
+ const copy =
129
+ state === 'approved'
130
+ ? { title: 'ACTION APPROVED', body: 'This request has been approved. Return to your CLI/agent and retry.' }
131
+ : state === 'denied'
132
+ ? { title: 'ACTION DENIED', body: 'This request was denied. You can close this page.' }
133
+ : state === 'expired'
134
+ ? { title: 'ACTION EXPIRED', body: 'This approval link has expired. Generate a new approval request.' }
135
+ : {
136
+ title: 'REVIEW PERMISSION REQUEST',
137
+ body: 'Confirm what this action can do before choosing Approve or Deny.',
138
+ };
139
+
140
+ return (
141
+ <div className="min-h-screen bg-[var(--color-background,#f4f4f5)] relative flex items-center justify-center p-4">
142
+ {/* Background — sterile field */}
143
+ <div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
144
+ <div className="absolute inset-0 bg-grid-adaptive bg-[size:4rem_4rem] opacity-30" />
145
+ <div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
146
+
147
+ {/* Giant background typography */}
148
+ <div className="absolute bottom-[5%] right-[5%] opacity-5 select-none">
149
+ <div className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter text-right">
150
+ AURAMAXX
151
+ </div>
152
+ </div>
153
+
154
+ {/* Corner finder patterns */}
155
+ <div className="absolute top-10 left-10 w-32 h-32 border-l-4 border-t-4 border-[var(--color-text,#0a0a0a)] opacity-10">
156
+ <div className="absolute top-2 left-2 w-4 h-4 bg-[var(--color-text,#0a0a0a)]" />
157
+ </div>
158
+ <div className="absolute bottom-10 right-10 w-32 h-32 border-r-4 border-b-4 border-[var(--color-text,#0a0a0a)] opacity-10 flex items-end justify-end">
159
+ <div className="absolute bottom-2 right-2 w-4 h-4 bg-[var(--color-text,#0a0a0a)]" />
160
+ </div>
161
+ </div>
162
+
163
+ {/* Logo header */}
164
+ <div className="fixed top-6 left-6 z-50 flex items-center gap-3">
165
+ <div className="w-10 h-10">
166
+ <img src="/logo.webp" alt="AuraMaxx" className="w-full h-full object-contain" />
167
+ </div>
168
+ </div>
169
+
170
+ {/* Nav */}
171
+ <div className="fixed top-7 right-6 z-50 flex items-center gap-3 font-mono text-[10px] tracking-widest">
172
+ <Link href="/docs" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">DOCS</Link>
173
+ <Link href="/api" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">API</Link>
174
+ </div>
175
+
176
+ {/* Main card */}
177
+ <div className="relative z-10 w-full max-w-[420px]">
178
+ {/* Vertical specimen label */}
179
+ <div className="absolute -left-8 top-1/2 -translate-y-1/2 text-vertical label-specimen-sm text-[var(--color-text-faint,#9ca3af)] select-none hidden sm:block">
180
+ PERMISSION&nbsp;REVIEW
181
+ </div>
182
+ <div className="bg-[var(--color-surface,#f4f4f2)] clip-specimen border-mech shadow-mech overflow-hidden font-mono corner-marks">
183
+ {/* Loading state */}
184
+ {pageState === 'loading' && (
185
+ <div className="p-6 flex items-center justify-center gap-2">
186
+ <div className="w-3 h-3 border border-[var(--color-text,#0a0a0a)] border-t-transparent animate-spin" />
187
+ <span className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-widest">LOADING...</span>
188
+ </div>
189
+ )}
190
+
191
+ {/* Locked — unlock form */}
192
+ {pageState === 'locked' && (
193
+ <>
194
+ <div className="px-5 py-3 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
195
+ <span className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
196
+ UNLOCK VAULT
197
+ </span>
198
+ <span className="text-[9px] font-bold tracking-widest text-[var(--color-warning,#ff4d00)]">
199
+ LOCKED
200
+ </span>
201
+ </div>
202
+ <div className="p-6">
203
+ <div className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-wider mb-4">
204
+ Unlock your vault to review this permission request.
205
+ </div>
206
+ <form onSubmit={handleUnlock} className="space-y-4">
207
+ <div>
208
+ <label className="block text-[8px] text-[var(--color-text-faint,#9ca3af)] tracking-widest mb-1.5 uppercase">
209
+ Password
210
+ </label>
211
+ <input
212
+ type="password"
213
+ value={password}
214
+ onChange={(e) => { setPassword(e.target.value); setError(null); }}
215
+ placeholder="Enter vault password"
216
+ className="w-full px-3 py-2.5 border border-[var(--color-border,#d4d4d8)] font-mono text-sm text-[var(--color-text,#0a0a0a)] focus:outline-none focus:border-[var(--color-text,#0a0a0a)] bg-[var(--color-surface,#ffffff)] placeholder-[var(--color-text-faint,#9ca3af)] transition-colors"
217
+ autoFocus
218
+ />
219
+ </div>
220
+ <label className="flex items-center justify-between gap-3 text-[8px] tracking-widest uppercase text-[var(--color-text-muted,#6b7280)]">
221
+ <span className="inline-flex items-center gap-2">
222
+ <input
223
+ type="checkbox"
224
+ checked={trustDevice}
225
+ onChange={(e) => setTrustDevice(e.target.checked)}
226
+ className="h-3.5 w-3.5 border border-[var(--color-border,#d4d4d8)] accent-[var(--color-text,#0a0a0a)]"
227
+ />
228
+ Trusted device
229
+ </span>
230
+ <span>{trustDevice ? 'PERSISTENT' : 'TAB ONLY'}</span>
231
+ </label>
232
+
233
+ {error && (
234
+ <div
235
+ data-testid="unlock-error-banner"
236
+ className="text-[9px] text-[var(--color-danger,#ef4444)] px-3 py-2 border"
237
+ style={{
238
+ borderColor: 'color-mix(in srgb, var(--color-danger,#ef4444) 35%, transparent)',
239
+ background: 'color-mix(in srgb, var(--color-danger,#ef4444) 12%, transparent)',
240
+ }}
241
+ >
242
+ {error}
243
+ </div>
244
+ )}
245
+
246
+ <button
247
+ type="submit"
248
+ disabled={unlockLoading || !password}
249
+ className="w-full py-2.5 bg-[var(--color-text,#0a0a0a)] text-[var(--color-surface,#ffffff)] font-mono text-xs tracking-widest font-bold hover:opacity-90 transition-opacity disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center gap-2"
250
+ >
251
+ {unlockLoading ? (
252
+ <>
253
+ <div className="w-3 h-3 border border-[var(--color-surface,#ffffff)] border-t-transparent animate-spin" />
254
+ UNLOCKING...
255
+ </>
256
+ ) : (
257
+ 'UNLOCK'
258
+ )}
259
+ </button>
260
+ </form>
261
+ </div>
262
+ </>
263
+ )}
264
+
265
+ {/* Ready — approval content */}
266
+ {pageState === 'ready' && (
267
+ <>
268
+ {/* Card header bar */}
269
+ <div className="px-5 py-3 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
270
+ <span className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
271
+ {copy.title}
272
+ </span>
273
+ <span className={`text-[9px] font-bold tracking-widest ${state === 'approved' ? 'text-[var(--color-info,#0047ff)]'
274
+ : state === 'denied' ? 'text-[var(--color-danger,#ef4444)]'
275
+ : state === 'expired' ? 'text-[var(--color-text-faint,#9ca3af)]'
276
+ : 'text-[var(--color-warning,#ff4d00)]'
277
+ }`}>
278
+ {statusLabel}
279
+ </span>
280
+ </div>
281
+
282
+ <div className="p-6 space-y-4">
283
+ {/* Status message */}
284
+ <p className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-wider">
285
+ {copy.body}
286
+ </p>
287
+
288
+ {/* Action details */}
289
+ <div className="space-y-2">
290
+ <div className="flex items-baseline justify-between gap-2">
291
+ <span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">ACTION</span>
292
+ <span className="text-[11px] text-[var(--color-text,#0a0a0a)] font-bold tracking-wider text-right">{actionName}</span>
293
+ </div>
294
+ {profileName && (
295
+ <div className="flex items-baseline justify-between gap-2">
296
+ <span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">PROFILE</span>
297
+ <span className="text-[11px] text-[var(--color-text,#0a0a0a)] tracking-wider text-right">{profileName}</span>
298
+ </div>
299
+ )}
300
+ <div className="flex items-baseline justify-between gap-2">
301
+ <span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">RISK</span>
302
+ <span className={`text-[11px] font-bold tracking-wider ${riskLevel === 'HIGH' ? 'text-[var(--color-danger,#ef4444)]'
303
+ : riskLevel === 'MEDIUM' ? 'text-[var(--color-warning,#ff4d00)]'
304
+ : 'text-[var(--color-text,#0a0a0a)]'
305
+ }`}>{riskLevel}</span>
306
+ </div>
307
+ <div className="text-[8px] text-[var(--color-text-faint,#9ca3af)] tracking-widest break-all">
308
+ ID: {actionId}
309
+ </div>
310
+ </div>
311
+
312
+ {/* Scope + Impact */}
313
+ {hasScopeContext && (
314
+ <div className="border-t border-[var(--color-border,#d4d4d8)] pt-3 space-y-3">
315
+ {scopeItems.length > 0 && (
316
+ <div>
317
+ <div className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)] mb-1.5">PERMISSIONS</div>
318
+ <div className="space-y-1">
319
+ {scopeItems.map((item) => (
320
+ <div key={item} className="text-[10px] text-[var(--color-text,#0a0a0a)] tracking-wider pl-2 border-l-2 border-[var(--color-border,#d4d4d8)]">
321
+ {item}
322
+ </div>
323
+ ))}
324
+ </div>
325
+ </div>
326
+ )}
327
+ {impactItems.length > 0 && (
328
+ <div>
329
+ <div className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)] mb-1.5">IMPACT</div>
330
+ <div className="space-y-1">
331
+ {impactItems.map((item) => (
332
+ <div key={item} className="text-[10px] text-[var(--color-text,#0a0a0a)] tracking-wider pl-2 border-l-2 border-[var(--color-border,#d4d4d8)]">
333
+ {item}
334
+ </div>
335
+ ))}
336
+ </div>
337
+ </div>
338
+ )}
339
+ </div>
340
+ )}
341
+
342
+ {/* Missing scope warning */}
343
+ {!hasScopeContext && !action && (
344
+ <div className="text-[9px] text-[var(--color-warning,#ff4d00)] bg-[var(--color-warning,#ff4d00)]/10 px-3 py-2 border border-[var(--color-warning,#ff4d00)]/20">
345
+ Could not load action details. Use extra caution and deny if this request is unexpected.
346
+ </div>
347
+ )}
348
+
349
+ {/* Resolve error */}
350
+ {error && (
351
+ <div
352
+ className="text-[9px] text-[var(--color-danger,#ef4444)] px-3 py-2 border"
353
+ style={{
354
+ borderColor: 'color-mix(in srgb, var(--color-danger,#ef4444) 35%, transparent)',
355
+ background: 'color-mix(in srgb, var(--color-danger,#ef4444) 12%, transparent)',
356
+ }}
357
+ >
358
+ {error}
359
+ </div>
360
+ )}
361
+
362
+ {/* Approve / Deny buttons */}
363
+ {!isResolved && (
364
+ <div className="flex gap-2 pt-2">
365
+ <button
366
+ type="button"
367
+ onClick={() => handleResolve(true)}
368
+ disabled={resolving}
369
+ className="flex-1 py-2.5 bg-[var(--color-text,#0a0a0a)] text-[var(--color-surface,#ffffff)] font-mono text-[10px] tracking-widest font-bold text-center hover:opacity-90 transition-opacity clip-specimen-sm disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center gap-2"
370
+ >
371
+ {resolving ? (
372
+ <>
373
+ <div className="w-3 h-3 border border-[var(--color-surface,#ffffff)] border-t-transparent animate-spin" />
374
+ RESOLVING...
375
+ </>
376
+ ) : (
377
+ 'APPROVE'
378
+ )}
379
+ </button>
380
+ <button
381
+ type="button"
382
+ onClick={() => handleResolve(false)}
383
+ disabled={resolving}
384
+ className="flex-1 py-2.5 border border-[var(--color-border,#d4d4d8)] text-[var(--color-text-muted,#6b7280)] font-mono text-[10px] tracking-widest font-bold text-center hover:border-[var(--color-text,#0a0a0a)] hover:text-[var(--color-text,#0a0a0a)] transition-colors disabled:opacity-30 disabled:cursor-not-allowed"
385
+ >
386
+ DENY
387
+ </button>
388
+ </div>
389
+ )}
390
+
391
+ {/* Resolved — link back */}
392
+ {isResolved && (
393
+ <div className="pt-2">
394
+ <Link
395
+ href="/"
396
+ className="block w-full py-2.5 border border-[var(--color-border,#d4d4d8)] text-[var(--color-text-muted,#6b7280)] font-mono text-[10px] tracking-widest font-bold text-center hover:border-[var(--color-text,#0a0a0a)] hover:text-[var(--color-text,#0a0a0a)] transition-colors"
397
+ >
398
+ RETURN TO DASHBOARD
399
+ </Link>
400
+ </div>
401
+ )}
402
+ </div>
403
+ </>
404
+ )}
405
+ </div>
406
+ </div>
407
+ </div>
408
+ );
409
+ }