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,231 @@
1
+ /**
2
+ * auramaxx release-check — pre-release guardrail checklist
3
+ */
4
+
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import { spawnSync } from 'child_process';
8
+ import { getErrorMessage } from '../../lib/error';
9
+ import { printBanner } from '../lib/theme';
10
+
11
+ type ItemStatus = 'PASS' | 'WARN' | 'FAIL';
12
+ interface ChecklistItem {
13
+ id: string;
14
+ title: string;
15
+ status: ItemStatus;
16
+ details: string[];
17
+ blocking?: boolean;
18
+ }
19
+
20
+ interface ReleaseReport {
21
+ ok: boolean;
22
+ baseRef: string;
23
+ changed: { added: string[]; modified: string[]; deleted: string[] };
24
+ checklist: ChecklistItem[];
25
+ }
26
+
27
+ const ROOT = path.resolve(__dirname, '..', '..', '..');
28
+
29
+ function run(command: string, args: string[]): { ok: boolean; stdout: string; stderr: string; code: number } {
30
+ const r = spawnSync(command, args, { cwd: ROOT, encoding: 'utf8' });
31
+ return {
32
+ ok: (r.status ?? 1) === 0,
33
+ stdout: r.stdout || '',
34
+ stderr: r.stderr || '',
35
+ code: r.status ?? 1,
36
+ };
37
+ }
38
+
39
+ function parseArgs(argv: string[]): { json: boolean; base?: string } {
40
+ const json = argv.includes('--json');
41
+ const baseIdx = argv.indexOf('--base');
42
+ const base = baseIdx >= 0 ? argv[baseIdx + 1] : undefined;
43
+ return { json, base };
44
+ }
45
+
46
+ function getLastReleaseRef(explicitBase?: string): string {
47
+ if (explicitBase) return explicitBase;
48
+ const tag = run('git', ['describe', '--tags', '--abbrev=0']);
49
+ if (tag.ok) return tag.stdout.trim();
50
+ const first = run('git', ['rev-list', '--max-parents=0', 'HEAD']);
51
+ if (!first.ok) throw new Error('Unable to resolve release base ref');
52
+ return first.stdout.trim().split('\n')[0];
53
+ }
54
+
55
+ function parseChangedFiles(baseRef: string): { added: string[]; modified: string[]; deleted: string[] } {
56
+ const diff = run('git', ['diff', '--name-status', `${baseRef}..HEAD`]);
57
+ if (!diff.ok) throw new Error(diff.stderr || 'git diff failed');
58
+ const added: string[] = [];
59
+ const modified: string[] = [];
60
+ const deleted: string[] = [];
61
+
62
+ for (const line of diff.stdout.split('\n')) {
63
+ if (!line.trim()) continue;
64
+ const [status, file] = line.split(/\s+/, 2);
65
+ if (!file) continue;
66
+ if (status.startsWith('A')) added.push(file);
67
+ else if (status.startsWith('D')) deleted.push(file);
68
+ else modified.push(file);
69
+ }
70
+ return { added, modified, deleted };
71
+ }
72
+
73
+ function runSanityChecks(): ChecklistItem {
74
+ const checks: Array<{ label: string; command: string; args: string[] }> = [
75
+ { label: 'protected gate', command: 'npm', args: ['run', 'security:protected-gate'] },
76
+ { label: 'job docs validation', command: 'node', args: ['scripts/validate-job-docs.mjs'] },
77
+ ];
78
+
79
+ const details: string[] = [];
80
+ let failed = false;
81
+ for (const check of checks) {
82
+ const r = run(check.command, check.args);
83
+ details.push(`${check.label}: ${r.ok ? 'ok' : `failed (exit ${r.code})`}`);
84
+ if (!r.ok) failed = true;
85
+ }
86
+
87
+ return {
88
+ id: 'sanity',
89
+ title: 'Run existing sanity scripts',
90
+ status: failed ? 'FAIL' : 'PASS',
91
+ details,
92
+ blocking: failed,
93
+ };
94
+ }
95
+
96
+ function scanDoxxing(changedFiles: string[]): ChecklistItem {
97
+ const patterns: Array<{ label: string; re: RegExp }> = [
98
+ { label: 'private key', re: /-----BEGIN (RSA |EC )?PRIVATE KEY-----/ },
99
+ { label: 'api key token', re: /(sk-[A-Za-z0-9]{16,}|ghp_[A-Za-z0-9]{20,}|xox[baprs]-[A-Za-z0-9-]{10,})/ },
100
+ { label: 'jwt-like token', re: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9._-]{10,}\.[A-Za-z0-9._-]{10,}/ },
101
+ { label: 'local absolute path', re: /\/Users\/[A-Za-z0-9._-]+\// },
102
+ { label: 'email address', re: /[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/i },
103
+ ];
104
+
105
+ const findings: string[] = [];
106
+ for (const file of changedFiles) {
107
+ const abs = path.join(ROOT, file);
108
+ if (!fs.existsSync(abs) || fs.statSync(abs).isDirectory()) continue;
109
+ const content = fs.readFileSync(abs, 'utf8');
110
+ for (const p of patterns) {
111
+ if (p.re.test(content)) findings.push(`${file}: matched ${p.label}`);
112
+ }
113
+ }
114
+
115
+ return {
116
+ id: 'doxxing',
117
+ title: 'Doxxing/privacy leak scan on changed files',
118
+ status: findings.length ? 'WARN' : 'PASS',
119
+ details: findings.length ? findings.slice(0, 20) : ['No obvious sensitive-pattern hits'],
120
+ blocking: false,
121
+ };
122
+ }
123
+
124
+ function globToRegex(glob: string): RegExp {
125
+ const escaped = glob
126
+ .replace(/[.+^${}()|[\]\\]/g, '\\$&')
127
+ .replace(/\*\*/g, '::DOUBLE_STAR::')
128
+ .replace(/\*/g, '[^/]*')
129
+ .replace(/::DOUBLE_STAR::/g, '.*');
130
+ return new RegExp(`^${escaped}$`);
131
+ }
132
+
133
+ function verifySecurityRouteCoverage(changedFiles: string[]): ChecklistItem {
134
+ const protectedFile = path.join(ROOT, 'docs/internal/PROTECTED_FILES.md');
135
+ const indexFile = path.join(ROOT, 'server/index.ts');
136
+ const details: string[] = [];
137
+
138
+ if (!fs.existsSync(protectedFile)) {
139
+ return { id: 'security-routes', title: 'Protected/security route coverage', status: 'FAIL', details: ['Missing docs/internal/PROTECTED_FILES.md'], blocking: true };
140
+ }
141
+
142
+ const globs = fs.readFileSync(protectedFile, 'utf8')
143
+ .split('\n')
144
+ .map((line) => line.trim())
145
+ .filter((line) => line.startsWith('- `server/routes/'))
146
+ .map((line) => line.replace(/^- `|`$/g, '').trim());
147
+
148
+ const matchers = globs.map(globToRegex);
149
+ const changedRoutes = changedFiles.filter((f) => f.startsWith('server/routes/'));
150
+ const uncoveredChanged = changedRoutes.filter((f) => !matchers.some((re) => re.test(f)) && /(auth|lock|unlock|setup|security|passkey|credential-vaults)/.test(path.basename(f)));
151
+
152
+ if (uncoveredChanged.length) {
153
+ details.push(`Sensitive route changes not covered by protected list: ${uncoveredChanged.join(', ')}`);
154
+ } else {
155
+ details.push('Sensitive route changes are covered by protected file list.');
156
+ }
157
+
158
+ if (fs.existsSync(indexFile)) {
159
+ const indexText = fs.readFileSync(indexFile, 'utf8');
160
+ if (!indexText.includes("import securityRoutes from './routes/security'")) {
161
+ details.push('server/routes/security.ts is not imported by server/index.ts');
162
+ return { id: 'security-routes', title: 'Protected/security route coverage', status: 'FAIL', details, blocking: true };
163
+ }
164
+ }
165
+
166
+ return {
167
+ id: 'security-routes',
168
+ title: 'Protected/security route coverage',
169
+ status: uncoveredChanged.length ? 'FAIL' : 'PASS',
170
+ details,
171
+ blocking: uncoveredChanged.length > 0,
172
+ };
173
+ }
174
+
175
+ function printReport(report: ReleaseReport): void {
176
+ printBanner('RELEASE CHECK');
177
+ console.log(`Base ref: ${report.baseRef}`);
178
+ console.log(`Changed files: +${report.changed.added.length} ~${report.changed.modified.length} -${report.changed.deleted.length}`);
179
+ if (report.changed.added.length) {
180
+ console.log(`New files (${report.changed.added.length}):`);
181
+ for (const file of report.changed.added.slice(0, 20)) console.log(` + ${file}`);
182
+ }
183
+ console.log('\nChecklist:');
184
+ for (const item of report.checklist) {
185
+ const marker = item.status === 'PASS' ? '✅' : item.status === 'WARN' ? '⚠️' : '❌';
186
+ console.log(`- ${marker} ${item.title} [${item.status}]`);
187
+ for (const line of item.details) console.log(` - ${line}`);
188
+ if (item.status !== 'PASS') {
189
+ console.log(` - Next step: ${item.blocking ? 'Fix before release.' : 'Review manually before release sign-off.'}`);
190
+ }
191
+ }
192
+ }
193
+
194
+ async function main() {
195
+ const args = parseArgs(process.argv.slice(2));
196
+ const baseRef = getLastReleaseRef(args.base);
197
+ const changed = parseChangedFiles(baseRef);
198
+ const changedAll = [...changed.added, ...changed.modified, ...changed.deleted];
199
+
200
+ const checklist: ChecklistItem[] = [
201
+ {
202
+ id: 'diff-audit',
203
+ title: 'Diff audit since last release',
204
+ status: 'PASS',
205
+ details: [
206
+ `Added: ${changed.added.length}`,
207
+ `Modified: ${changed.modified.length}`,
208
+ `Deleted: ${changed.deleted.length}`,
209
+ ],
210
+ },
211
+ runSanityChecks(),
212
+ scanDoxxing([...changed.added, ...changed.modified]),
213
+ verifySecurityRouteCoverage(changedAll),
214
+ ];
215
+
216
+ const ok = checklist.every((item) => item.status !== 'FAIL' || !item.blocking);
217
+ const report: ReleaseReport = { ok, baseRef, changed, checklist };
218
+
219
+ if (args.json) {
220
+ console.log(JSON.stringify(report, null, 2));
221
+ } else {
222
+ printReport(report);
223
+ }
224
+
225
+ process.exit(ok ? 0 : 1);
226
+ }
227
+
228
+ main().catch((error) => {
229
+ console.error('release-check failed:', getErrorMessage(error));
230
+ process.exit(1);
231
+ });
@@ -0,0 +1,314 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * npx auramaxx restore — Restore from a backup
4
+ *
5
+ * Usage:
6
+ * npx auramaxx restore --list # List available backups
7
+ * npx auramaxx restore --latest # Restore most recent backup
8
+ * npx auramaxx restore <filename> # Restore specific backup
9
+ * npx auramaxx restore --dry-run <file> # Preview without modifying
10
+ * npx auramaxx restore --dry-run --latest # Preview latest restore
11
+ */
12
+
13
+ import { readdir, stat, copyFile, unlink, rename } from 'fs/promises';
14
+ import { join } from 'path';
15
+ import { existsSync, mkdirSync } from 'fs';
16
+ import { execSync } from 'child_process';
17
+ import { createServer } from 'net';
18
+ import { getDbPath, getBackupsDir } from '../../lib/config';
19
+ import { ensureBackupsDir, verifyIntegrity } from '../../routes/backup';
20
+
21
+ const DATA_DIR = join(getDbPath(), '..');
22
+ const CREDENTIALS_DIR = join(DATA_DIR, 'credentials');
23
+
24
+ interface BackupEntry {
25
+ filename: string;
26
+ timestamp: string;
27
+ size: number;
28
+ date: Date;
29
+ }
30
+
31
+ async function listBackups(): Promise<BackupEntry[]> {
32
+ const backupsDir = getBackupsDir();
33
+ ensureBackupsDir();
34
+
35
+ const files = await readdir(backupsDir);
36
+ const backups: BackupEntry[] = [];
37
+
38
+ for (const file of files) {
39
+ if (file.startsWith('auramaxx.db.') && file.endsWith('.bak')) {
40
+ const match = file.match(/auramaxx\.db\.(\d{8}_\d{6})\.bak/);
41
+ if (!match) continue;
42
+ const filePath = join(backupsDir, file);
43
+ const fileStat = await stat(filePath);
44
+ backups.push({
45
+ filename: file,
46
+ timestamp: match[1],
47
+ size: fileStat.size,
48
+ date: fileStat.mtime,
49
+ });
50
+ }
51
+ }
52
+
53
+ backups.sort((a, b) => b.date.getTime() - a.date.getTime());
54
+ return backups;
55
+ }
56
+
57
+ function formatSize(bytes: number): string {
58
+ if (bytes < 1024) return `${bytes} B`;
59
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
60
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
61
+ }
62
+
63
+ function formatTimestamp(ts: string): string {
64
+ // YYYYMMDD_HHMMSS -> YYYY-MM-DD HH:MM:SS
65
+ return `${ts.slice(0, 4)}-${ts.slice(4, 6)}-${ts.slice(6, 8)} ${ts.slice(9, 11)}:${ts.slice(11, 13)}:${ts.slice(13, 15)}`;
66
+ }
67
+
68
+ async function checkServerRunning(): Promise<boolean> {
69
+ return new Promise((resolve) => {
70
+ const server = createServer();
71
+ server.once('error', (error: NodeJS.ErrnoException) => {
72
+ if (error.code === 'EADDRINUSE') {
73
+ resolve(true);
74
+ } else {
75
+ resolve(false);
76
+ }
77
+ });
78
+ server.once('listening', () => {
79
+ server.close();
80
+ resolve(false);
81
+ });
82
+ server.listen(4242, '127.0.0.1');
83
+ });
84
+ }
85
+
86
+ async function createPreRestoreBackup(): Promise<string> {
87
+ const dbFile = getDbPath();
88
+ if (!existsSync(dbFile)) return '';
89
+
90
+ const backupsDir = getBackupsDir();
91
+ ensureBackupsDir();
92
+
93
+ const now = new Date();
94
+ const timestamp = now.toISOString().replace(/[-:]/g, '').replace('T', '_').split('.')[0];
95
+ const filename = `pre-restore.${timestamp}.bak`;
96
+ const backupPath = join(backupsDir, filename);
97
+
98
+ await copyFile(dbFile, backupPath);
99
+ return filename;
100
+ }
101
+
102
+ async function restoreCredentials(backupsDir: string, timestamp: string): Promise<number> {
103
+ const allFiles = await readdir(backupsDir);
104
+ const credBackups = allFiles.filter(
105
+ (f) => f.startsWith(`credentials.${timestamp}.cred-`) && f.endsWith('.json')
106
+ );
107
+
108
+ if (credBackups.length === 0) return 0;
109
+
110
+ if (!existsSync(CREDENTIALS_DIR)) {
111
+ mkdirSync(CREDENTIALS_DIR, { recursive: true });
112
+ }
113
+
114
+ // Remove existing credentials
115
+ if (existsSync(CREDENTIALS_DIR)) {
116
+ const existing = await readdir(CREDENTIALS_DIR);
117
+ for (const f of existing) {
118
+ if (f.startsWith('cred-') && f.endsWith('.json')) {
119
+ await unlink(join(CREDENTIALS_DIR, f));
120
+ }
121
+ }
122
+ }
123
+
124
+ // Copy from backup
125
+ for (const f of credBackups) {
126
+ const destName = f.replace(`credentials.${timestamp}.`, '');
127
+ await copyFile(join(backupsDir, f), join(CREDENTIALS_DIR, destName));
128
+ }
129
+
130
+ return credBackups.length;
131
+ }
132
+
133
+ async function runMigrations(): Promise<number> {
134
+ try {
135
+ const output = execSync('npx prisma migrate deploy', {
136
+ cwd: join(__dirname, '..', '..', '..'),
137
+ env: { ...process.env, DATABASE_URL: `file:${getDbPath()}` },
138
+ encoding: 'utf-8',
139
+ stdio: ['pipe', 'pipe', 'pipe'],
140
+ });
141
+
142
+ // Count applied migrations from output
143
+ const matches = output.match(/(\d+) migration/);
144
+ return matches ? parseInt(matches[1], 10) : 0;
145
+ } catch (error: any) {
146
+ const errMsg = error.stderr || error.message || 'Unknown error';
147
+ console.error(`\n ✗ Migration FAILED: ${errMsg}`);
148
+ console.error(' This is a critical error — the restored DB may have an incompatible schema.');
149
+ throw new Error(`Migration failed: ${errMsg}`);
150
+ }
151
+ }
152
+
153
+ async function main() {
154
+ const args = process.argv.slice(2);
155
+ const listFlag = args.includes('--list');
156
+ const latestFlag = args.includes('--latest');
157
+ const dryRun = args.includes('--dry-run');
158
+ const filename = args.find((a) => !a.startsWith('--'));
159
+
160
+ if (!listFlag && !latestFlag && !filename) {
161
+ console.log(`
162
+ auramaxx restore — Restore from a backup
163
+
164
+ Usage:
165
+ npx auramaxx restore --list List available backups
166
+ npx auramaxx restore --latest Restore most recent backup
167
+ npx auramaxx restore <filename> Restore specific backup
168
+ npx auramaxx restore --dry-run --latest Preview without modifying
169
+ `);
170
+ process.exit(0);
171
+ }
172
+
173
+ // --list: show backups and exit
174
+ if (listFlag) {
175
+ const backups = await listBackups();
176
+ if (backups.length === 0) {
177
+ console.log('No backups found.');
178
+ process.exit(0);
179
+ }
180
+
181
+ console.log(`\n Available backups (${backups.length}):\n`);
182
+ for (const b of backups) {
183
+ console.log(` ${b.filename} ${formatTimestamp(b.timestamp)} ${formatSize(b.size)}`);
184
+ }
185
+ console.log();
186
+ process.exit(0);
187
+ }
188
+
189
+ // Determine which backup to restore
190
+ let targetFilename: string;
191
+ if (latestFlag) {
192
+ const backups = await listBackups();
193
+ if (backups.length === 0) {
194
+ console.error('No backups found.');
195
+ process.exit(1);
196
+ }
197
+ targetFilename = backups[0].filename;
198
+ } else {
199
+ targetFilename = filename!;
200
+ }
201
+
202
+ // Validate filename
203
+ if (!targetFilename.match(/^auramaxx\.db\.\d{8}_\d{6}\.bak$/)) {
204
+ console.error(`Invalid backup filename: ${targetFilename}`);
205
+ process.exit(1);
206
+ }
207
+
208
+ const backupsDir = getBackupsDir();
209
+ const backupPath = join(backupsDir, targetFilename);
210
+
211
+ if (!existsSync(backupPath)) {
212
+ console.error(`Backup not found: ${targetFilename}`);
213
+ process.exit(1);
214
+ }
215
+
216
+ const backupStat = await stat(backupPath);
217
+ const tsMatch = targetFilename.match(/auramaxx\.db\.(\d{8}_\d{6})\.bak/)!;
218
+ const timestamp = tsMatch[1];
219
+
220
+ // Count matching credential backups
221
+ const allFiles = await readdir(backupsDir);
222
+ const credCount = allFiles.filter(
223
+ (f) => f.startsWith(`credentials.${timestamp}.cred-`) && f.endsWith('.json')
224
+ ).length;
225
+
226
+ console.log(`\n Restore target: ${targetFilename}`);
227
+ console.log(` Created: ${formatTimestamp(timestamp)}`);
228
+ console.log(` Size: ${formatSize(backupStat.size)}`);
229
+ console.log(` Credentials: ${credCount} file(s)`);
230
+
231
+ // Verify backup integrity
232
+ console.log('\n Verifying backup integrity...');
233
+ if (!verifyIntegrity(backupPath)) {
234
+ console.error(' ✗ Backup FAILED integrity check. Aborting.');
235
+ process.exit(1);
236
+ }
237
+ console.log(' ✓ Backup integrity OK');
238
+
239
+ if (dryRun) {
240
+ console.log('\n --dry-run: No changes made.\n');
241
+ process.exit(0);
242
+ }
243
+
244
+ // Check if server is running
245
+ const serverRunning = await checkServerRunning();
246
+ if (serverRunning) {
247
+ console.log('\n ⚠️ WARNING: Server appears to be running on port 4242.');
248
+ console.log(' Stop it first with `npx auramaxx stop` for clean restore.');
249
+ console.log(' Proceeding anyway...\n');
250
+ }
251
+
252
+ // Pre-restore safety backup
253
+ const preRestoreName = await createPreRestoreBackup();
254
+ if (preRestoreName) {
255
+ console.log(` Pre-restore backup: ${preRestoreName}`);
256
+ }
257
+
258
+ // Restore DB
259
+ const dbPath = getDbPath();
260
+ const tempPath = dbPath + '.restore-tmp';
261
+ await copyFile(backupPath, tempPath);
262
+ await rename(tempPath, dbPath);
263
+ console.log(' ✓ Database restored');
264
+
265
+ // Restore credentials
266
+ const restoredCreds = await restoreCredentials(backupsDir, timestamp);
267
+ console.log(` ✓ Credentials restored: ${restoredCreds} file(s)`);
268
+
269
+ // Run migrations
270
+ console.log(' Running schema migrations...');
271
+ let migrationsApplied: number;
272
+ try {
273
+ migrationsApplied = await runMigrations();
274
+ } catch {
275
+ if (preRestoreName) {
276
+ console.error(`\n Reverting to pre-restore backup: ${preRestoreName}`);
277
+ const revertTemp = dbPath + '.revert-tmp';
278
+ await copyFile(join(backupsDir, preRestoreName), revertTemp);
279
+ await rename(revertTemp, dbPath);
280
+ console.error(' ✓ Reverted to pre-restore state.');
281
+ }
282
+ process.exit(1);
283
+ }
284
+ console.log(` ✓ Migrations applied: ${migrationsApplied}`);
285
+
286
+ // Final integrity check
287
+ console.log(' Verifying restored database...');
288
+ if (!verifyIntegrity(dbPath)) {
289
+ console.error(' ✗ Restored DB FAILED integrity check!');
290
+ console.error(` Safety backup available: ${preRestoreName}`);
291
+ process.exit(1);
292
+ }
293
+ console.log(' ✓ Restored database integrity OK');
294
+
295
+ // Clean up old pre-restore backups (keep last 3)
296
+ const allBackupFiles = await readdir(backupsDir);
297
+ const preRestoreFiles = allBackupFiles
298
+ .filter(f => f.startsWith('pre-restore.') && f.endsWith('.bak'))
299
+ .sort()
300
+ .reverse();
301
+ if (preRestoreFiles.length > 3) {
302
+ for (let i = 3; i < preRestoreFiles.length; i++) {
303
+ await unlink(join(backupsDir, preRestoreFiles[i]));
304
+ }
305
+ console.log(` ✓ Cleaned up ${preRestoreFiles.length - 3} old pre-restore backup(s)`);
306
+ }
307
+
308
+ console.log(`\n ✅ Restore complete!\n`);
309
+ }
310
+
311
+ main().catch((err) => {
312
+ console.error('Restore failed:', err.message || err);
313
+ process.exit(1);
314
+ });