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,216 @@
1
+ import fs from 'fs';
2
+ import os from 'os';
3
+ import path from 'path';
4
+ import readline from 'readline';
5
+
6
+ type TargetKey = 'codex' | 'claude' | 'openclaw';
7
+
8
+ type Target = {
9
+ key: TargetKey;
10
+ name: string;
11
+ dir: string;
12
+ };
13
+
14
+ type InstallResult = {
15
+ target: Target;
16
+ status: 'installed' | 'updated' | 'missing-source' | 'failed';
17
+ detail?: string;
18
+ };
19
+
20
+ const root = path.join(__dirname, '..', '..', '..');
21
+
22
+ function parseArgs(argv: string[]) {
23
+ const flags = new Set(argv);
24
+ if (flags.has('--help') || flags.has('-h')) {
25
+ console.log('Usage: npx auramaxx skill [--all|--claude|--codex|--openclaw] [--doctor] [--yes]');
26
+ process.exit(0);
27
+ }
28
+
29
+ return {
30
+ doctor: flags.has('--doctor'),
31
+ yes: flags.has('--yes') || flags.has('-y'),
32
+ claude: flags.has('--claude'),
33
+ codex: flags.has('--codex'),
34
+ openclaw: flags.has('--openclaw'),
35
+ all: flags.has('--all'),
36
+ };
37
+ }
38
+
39
+ function resolveTargets(): Target[] {
40
+ const home = os.homedir();
41
+ return [
42
+ { key: 'codex', name: 'Codex', dir: path.join(process.env.CODEX_HOME || path.join(home, '.codex'), 'skills', 'auramaxx') },
43
+ { key: 'claude', name: 'Claude', dir: path.join(process.env.CLAUDE_HOME || path.join(home, '.claude'), 'skills', 'auramaxx') },
44
+ { key: 'openclaw', name: 'OpenClaw', dir: path.join(process.env.OPENCLAW_HOME || path.join(home, '.openclaw'), 'skills', 'auramaxx') },
45
+ ];
46
+ }
47
+
48
+ function sourceDir(): string {
49
+ return path.join(root, 'skills', 'auramaxx');
50
+ }
51
+
52
+ function sourceAvailable(): boolean {
53
+ return fs.existsSync(path.join(sourceDir(), 'SKILL.md'));
54
+ }
55
+
56
+ function inspectTarget(target: Target) {
57
+ const skillPath = path.join(target.dir, 'SKILL.md');
58
+ return fs.existsSync(skillPath) ? 'installed' : 'missing';
59
+ }
60
+
61
+ const HEARTBEAT_MARKER = '<!-- auramaxx-heartbeat -->';
62
+
63
+ function getOpenClawWorkspaces(): string[] {
64
+ const openclawHome = process.env.OPENCLAW_HOME || path.join(os.homedir(), '.openclaw');
65
+ const configPath = path.join(openclawHome, 'openclaw.json');
66
+
67
+ const workspaces = new Set<string>();
68
+
69
+ try {
70
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf-8'));
71
+
72
+ // Default workspace
73
+ if (config?.agents?.defaults?.workspace) {
74
+ workspaces.add(config.agents.defaults.workspace);
75
+ }
76
+
77
+ // Per-agent workspaces
78
+ if (Array.isArray(config?.agents?.list)) {
79
+ for (const agent of config.agents.list) {
80
+ if (agent.workspace) workspaces.add(agent.workspace);
81
+ }
82
+ }
83
+ } catch { /* no config or unreadable */ }
84
+
85
+ // Fallback: ~/.openclaw/workspace (legacy default)
86
+ if (workspaces.size === 0) {
87
+ workspaces.add(path.join(openclawHome, 'workspace'));
88
+ }
89
+
90
+ return [...workspaces];
91
+ }
92
+
93
+ function patchHeartbeatFile(heartbeatPath: string): boolean {
94
+ let existing = '';
95
+ try {
96
+ existing = fs.readFileSync(heartbeatPath, 'utf-8');
97
+ } catch { /* file doesn't exist yet */ }
98
+
99
+ if (existing.includes(HEARTBEAT_MARKER)) return false;
100
+
101
+ const section = [
102
+ '',
103
+ HEARTBEAT_MARKER,
104
+ '## AuraMaxx (every heartbeat)',
105
+ '1. Call `GET /what_is_happening` (add `?since=<last_timestamp_ms>` if you have one)',
106
+ '2. Review: `highlights` → `humanActions` → `recentEvents` → `syncHealth`',
107
+ '3. If anything urgent (pending approvals, sync errors, unexpected credential access): report it',
108
+ '4. Write a diary entry: use MCP `write_diary` or `npx auramaxx diary write --entry "..."`',
109
+ '5. If diary write fails with auth/approval issues: ask human to open approval link, then retry once',
110
+ '6. If nothing happened and 12h+ since last human update: send a short all-clear',
111
+ '7. Reply HEARTBEAT_OK if no follow-up needed',
112
+ '',
113
+ ].join('\n');
114
+
115
+ fs.mkdirSync(path.dirname(heartbeatPath), { recursive: true });
116
+ fs.appendFileSync(heartbeatPath, section);
117
+ return true;
118
+ }
119
+
120
+ function patchOpenClawHeartbeat(target: Target): void {
121
+ if (target.key !== 'openclaw') return;
122
+
123
+ const workspaces = getOpenClawWorkspaces();
124
+ for (const ws of workspaces) {
125
+ const heartbeatPath = path.join(ws, 'HEARTBEAT.md');
126
+ if (patchHeartbeatFile(heartbeatPath)) {
127
+ console.log(` ↳ Patched ${heartbeatPath} with AuraMaxx heartbeat section`);
128
+ }
129
+ }
130
+ }
131
+
132
+ function installTarget(target: Target): InstallResult {
133
+ if (!sourceAvailable()) {
134
+ return { target, status: 'missing-source', detail: `Missing source at ${sourceDir()}` };
135
+ }
136
+
137
+ const targetSkill = path.join(target.dir, 'SKILL.md');
138
+ const alreadyInstalled = fs.existsSync(targetSkill);
139
+
140
+ try {
141
+ fs.mkdirSync(path.dirname(target.dir), { recursive: true });
142
+ fs.cpSync(sourceDir(), target.dir, { recursive: true, force: true });
143
+ patchOpenClawHeartbeat(target);
144
+ return { target, status: alreadyInstalled ? 'updated' : 'installed' };
145
+ } catch (err: unknown) {
146
+ return { target, status: 'failed', detail: err instanceof Error ? err.message : String(err) };
147
+ }
148
+ }
149
+
150
+ function chooseTargets(allTargets: Target[], args: ReturnType<typeof parseArgs>): Target[] {
151
+ const explicit: TargetKey[] = [];
152
+ if (args.codex) explicit.push('codex');
153
+ if (args.claude) explicit.push('claude');
154
+ if (args.openclaw) explicit.push('openclaw');
155
+ if (args.all || explicit.length === 0) return allTargets;
156
+ return allTargets.filter((t) => explicit.includes(t.key));
157
+ }
158
+
159
+ function askYesNo(prompt: string): Promise<boolean> {
160
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
161
+ return new Promise((resolve) => {
162
+ rl.question(prompt, (answer) => {
163
+ rl.close();
164
+ const v = answer.trim().toLowerCase();
165
+ resolve(v === 'y' || v === 'yes');
166
+ });
167
+ });
168
+ }
169
+
170
+ async function main() {
171
+ const args = parseArgs(process.argv.slice(2));
172
+ const targets = resolveTargets();
173
+
174
+ if (args.doctor) {
175
+ console.log('Aura skill doctor');
176
+ for (const target of targets) {
177
+ const state = inspectTarget(target);
178
+ console.log(`- ${target.name}: ${state} (${target.dir})`);
179
+ }
180
+ return;
181
+ }
182
+
183
+ const selected = chooseTargets(targets, args);
184
+
185
+ if (!args.yes && process.stdin.isTTY && !args.all && !args.codex && !args.claude && !args.openclaw) {
186
+ const doAll = await askYesNo('Install AuraMaxx skill for all compatible agents (Codex, Claude, OpenClaw)? [y/N] ');
187
+ if (!doAll) {
188
+ console.log('No changes made. Run one of:');
189
+ console.log(' npx auramaxx skill --codex');
190
+ console.log(' npx auramaxx skill --claude');
191
+ console.log(' npx auramaxx skill --openclaw');
192
+ console.log('Fallback: cd <your-codebase> && npx -y skills add Aura-Industry/auramaxx');
193
+ process.exit(0);
194
+ }
195
+ }
196
+
197
+ const results = selected.map(installTarget);
198
+
199
+ for (const result of results) {
200
+ const suffix = result.detail ? ` — ${result.detail}` : '';
201
+ console.log(`- ${result.target.name}: ${result.status}${suffix}`);
202
+ }
203
+
204
+ const failed = results.filter((r) => r.status === 'failed' || r.status === 'missing-source');
205
+ if (failed.length > 0) {
206
+ console.log('Some targets failed. Fallback: cd <your-codebase> && npx -y skills add Aura-Industry/auramaxx');
207
+ process.exit(1);
208
+ }
209
+
210
+ console.log('Done. Verify with: npx auramaxx skill --doctor');
211
+ }
212
+
213
+ main().catch((err) => {
214
+ console.error(err instanceof Error ? err.message : String(err));
215
+ process.exit(1);
216
+ });
@@ -0,0 +1,139 @@
1
+ /**
2
+ * auramaxx start — Start wallet servers
3
+ */
4
+
5
+ import { isServerRunning, waitForServer } from '../lib/http';
6
+ import { startServer, stopServer } from '../lib/process';
7
+ import { getErrorMessage } from '../../lib/error';
8
+ import { printBanner, printStatus, printHelp } from '../lib/theme';
9
+ import { isServiceInstalled, isServiceRunning, loadServiceIfNeeded } from './service';
10
+
11
+ export interface StartCliArgs {
12
+ headless: boolean;
13
+ background: boolean;
14
+ debug: boolean;
15
+ help: boolean;
16
+ }
17
+
18
+ export function parseStartArgs(argv: string[]): StartCliArgs {
19
+ const args = new Set(argv);
20
+ return {
21
+ headless: args.has('--headless'),
22
+ background: args.has('--background') || args.has('--daemon') || args.has('-d'),
23
+ debug: args.has('--debug'),
24
+ help: args.has('--help') || args.has('-h'),
25
+ };
26
+ }
27
+
28
+ function showHelp(): void {
29
+ printHelp('START', 'npx auramaxx start [options]', [], [
30
+ 'Options:',
31
+ ' --headless Start server + cron only (no dashboard)',
32
+ ' --background, --daemon Start detached in background mode',
33
+ ' -d Short alias for --background',
34
+ ' --debug Stream runtime logs in console (foreground only)',
35
+ ]);
36
+ }
37
+
38
+ export async function runStartCli(argv: string[] = process.argv.slice(2)): Promise<number> {
39
+ const parsed = parseStartArgs(argv);
40
+ if (parsed.help) {
41
+ showHelp();
42
+ return 0;
43
+ }
44
+
45
+ const streamLogs = parsed.debug && !parsed.background;
46
+
47
+ // If server is already running (e.g. via launchd), just print status and exit.
48
+ // If the launchd service was just installed, it may still be bootstrapping —
49
+ // give it a moment before falling through to manual start.
50
+ let alreadyRunning = await isServerRunning();
51
+ if (!alreadyRunning && isServiceInstalled()) {
52
+ if (!isServiceRunning()) {
53
+ // Plist exists but service isn't loaded (e.g. after `auramaxx stop`).
54
+ // Re-load it so it's registered for future reboots, then start manually.
55
+ loadServiceIfNeeded();
56
+ } else {
57
+ // Service is loaded — launchd may be starting the server right now.
58
+ // Wait briefly rather than spawning a duplicate.
59
+ try {
60
+ await waitForServer(30000);
61
+ alreadyRunning = true;
62
+ } catch {
63
+ // Service didn't bring the server up — fall through to manual start
64
+ }
65
+ }
66
+ }
67
+ if (alreadyRunning) {
68
+ printBanner('RUNNING');
69
+ const serviceInstalled = isServiceInstalled();
70
+ const modeLabel = serviceInstalled ? 'BACKGROUND SERVICE' : 'BACKGROUND PROCESS';
71
+ printStatus('Mode', modeLabel);
72
+ printStatus('API (server)', 'http://localhost:4242');
73
+ printStatus('Dashboard', parsed.headless ? 'disabled' : 'http://localhost:4747');
74
+ printStatus('Stop', 'auramaxx stop');
75
+ console.log('');
76
+ return 0;
77
+ }
78
+
79
+ // Always start in background — launchd/systemd manages the lifecycle.
80
+ // Use `--debug` for foreground streaming.
81
+ const background = !streamLogs;
82
+
83
+ printBanner(parsed.headless ? 'HEADLESS' : 'STARTING');
84
+
85
+ // Clean slate
86
+ stopServer();
87
+
88
+ // Start servers (background by default so CLI returns immediately)
89
+ startServer({ headless: parsed.headless, debug: streamLogs, background });
90
+
91
+ // Wait for Express server
92
+ try {
93
+ await waitForServer(15000);
94
+ } catch {
95
+ console.error('Server failed to start within 15 seconds.');
96
+ console.error('Check for port conflicts on :4242');
97
+ stopServer();
98
+ return 1;
99
+ }
100
+
101
+ const modeLabel = parsed.headless ? 'HEADLESS (API only)' : 'FULL (API + dashboard)';
102
+ const dashboardLabel = parsed.headless ? 'disabled (headless mode)' : 'http://localhost:4747';
103
+ printStatus('Mode', modeLabel);
104
+ printStatus('API (server)', 'http://localhost:4242');
105
+ printStatus('Dashboard', dashboardLabel);
106
+ printStatus('Stop', 'auramaxx stop');
107
+ console.log('');
108
+
109
+ if (background) {
110
+ return 0;
111
+ }
112
+
113
+ // Debug/foreground mode — keep alive, clean shutdown on Cmd+C.
114
+ const shutdown = () => {
115
+ console.log('\nShutting down...');
116
+ stopServer();
117
+ console.log('Goodbye.');
118
+ process.exit(0);
119
+ };
120
+
121
+ process.on('SIGINT', shutdown);
122
+ process.on('SIGTERM', shutdown);
123
+
124
+ // Keep event loop alive so Ctrl+C works
125
+ setInterval(() => {}, 60_000);
126
+ return 0;
127
+ }
128
+
129
+ if (import.meta.url === `file://${process.argv[1]}`) {
130
+ runStartCli().then((code) => {
131
+ if (typeof code === 'number' && code !== 0) {
132
+ process.exit(code);
133
+ }
134
+ }).catch((error) => {
135
+ console.error('Error:', getErrorMessage(error));
136
+ stopServer();
137
+ process.exit(1);
138
+ });
139
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * auramaxx status — Health check and wallet status
3
+ */
4
+
5
+ import { serverUrl, fetchJson, isServerRunning } from '../lib/http';
6
+ import { getErrorMessage } from '../../lib/error';
7
+ import { printBanner, printStatus } from '../lib/theme';
8
+
9
+ interface SetupStatus {
10
+ hasWallet: boolean;
11
+ unlocked: boolean;
12
+ address: string | null;
13
+ }
14
+
15
+ async function main() {
16
+ const url = serverUrl();
17
+
18
+ printBanner('STATUS');
19
+
20
+ // Check API server
21
+ const serverUp = await isServerRunning();
22
+ printStatus('API Server', url, serverUp);
23
+
24
+ // Check dashboard
25
+ let dashboardUp = false;
26
+ try {
27
+ const resp = await fetch('http://localhost:4747');
28
+ dashboardUp = resp.ok || resp.status === 200 || resp.status === 304;
29
+ } catch {
30
+ // Not running
31
+ }
32
+ printStatus('Dashboard UI', 'http://localhost:4747', dashboardUp);
33
+
34
+ if (!serverUp) {
35
+ console.log('\n Run `npx auramaxx` to start API + dashboard services.');
36
+ process.exit(0);
37
+ }
38
+
39
+ // Check wallet status
40
+ try {
41
+ const status = await fetchJson<SetupStatus>('/setup');
42
+ console.log('');
43
+ printStatus('Vault', status.hasWallet ? 'created' : 'not created', status.hasWallet);
44
+ printStatus('Unlocked', status.unlocked ? 'yes' : 'no', status.unlocked);
45
+ if (status.address) {
46
+ printStatus('Address', status.address);
47
+ }
48
+ } catch (error) {
49
+ const message = getErrorMessage(error);
50
+ console.log(`\n Could not fetch wallet status: ${message}`);
51
+ }
52
+
53
+ console.log('');
54
+ }
55
+
56
+ main().catch((error) => {
57
+ console.error('Error:', getErrorMessage(error));
58
+ process.exit(1);
59
+ });
@@ -0,0 +1,36 @@
1
+ /**
2
+ * auramaxx stop — Stop running servers
3
+ *
4
+ * - `auramaxx stop` — kills processes, service stays registered (auto-starts on next login)
5
+ * - `auramaxx stop --force` — kills processes AND uninstalls the service
6
+ */
7
+
8
+ import { stopServer, cleanupTempFiles } from '../lib/process';
9
+ import { isServiceInstalled, stopServiceProcesses, uninstallService } from './service';
10
+
11
+ function main() {
12
+ const force = process.argv.includes('--force');
13
+
14
+ console.log('Stopping AuraMaxx...');
15
+
16
+ // If a launchd/systemd service is registered, unload it first so it doesn't
17
+ // immediately respawn the processes we're about to kill.
18
+ if (isServiceInstalled()) {
19
+ stopServiceProcesses();
20
+ }
21
+
22
+ stopServer();
23
+ cleanupTempFiles();
24
+
25
+ if (force && isServiceInstalled()) {
26
+ uninstallService();
27
+ console.log('Background service removed. AuraMaxx will not auto-start on login.');
28
+ } else if (isServiceInstalled()) {
29
+ console.log('Stopped. Service still registered — will auto-start on next login.');
30
+ console.log('To fully remove: auramaxx stop --force');
31
+ }
32
+
33
+ console.log('Stopped.');
34
+ }
35
+
36
+ main();
@@ -0,0 +1,180 @@
1
+ /**
2
+ * auramaxx token — Profile-first token tooling
3
+ *
4
+ * Usage:
5
+ * npx auramaxx token preview --profile dev
6
+ * npx auramaxx token preview --profile strict --profile-version v1 --json
7
+ * npx auramaxx token preview --profile dev --overrides '{"ttlSeconds":900}'
8
+ *
9
+ * Auth:
10
+ * Requires admin token in AURA_TOKEN (or --token <token>)
11
+ */
12
+
13
+ import { fetchJson } from '../lib/http';
14
+ import { getErrorMessage } from '../../lib/error';
15
+
16
+ type Json = Record<string, unknown>;
17
+
18
+ interface PolicyPreviewResponse {
19
+ version: string;
20
+ profile: { id: string; version: string; displayName?: string; rationale?: string };
21
+ request: {
22
+ profile: string;
23
+ profileVersion?: string;
24
+ profileOverrides?: Json;
25
+ };
26
+ effectivePolicy: {
27
+ permissions: string[];
28
+ credentialAccess: { read: string[]; write: string[] };
29
+ excludeFields: string[];
30
+ ttlSeconds: number;
31
+ maxReads: number | null;
32
+ rateBudget: {
33
+ state: 'none' | 'inherited' | 'explicit';
34
+ requests: number | null;
35
+ windowSeconds: number | null;
36
+ source: 'none' | 'profile' | 'override';
37
+ };
38
+ };
39
+ effectivePolicyHash: string;
40
+ warnings: string[];
41
+ denyExamples: Array<{ code: string; message: string }>;
42
+ }
43
+
44
+ export interface TokenCliArgs {
45
+ subcommand?: string;
46
+ profile?: string;
47
+ profileVersion?: string;
48
+ overridesRaw?: string;
49
+ token?: string;
50
+ json: boolean;
51
+ }
52
+
53
+ export function parseTokenArgs(args: string[]): TokenCliArgs {
54
+ const getValue = (flag: string): string | undefined => {
55
+ const idx = args.indexOf(flag);
56
+ return idx >= 0 ? args[idx + 1] : undefined;
57
+ };
58
+
59
+ return {
60
+ subcommand: args[0],
61
+ profile: getValue('--profile'),
62
+ profileVersion: getValue('--profile-version'),
63
+ overridesRaw: getValue('--overrides'),
64
+ token: getValue('--token'),
65
+ json: args.includes('--json'),
66
+ };
67
+ }
68
+
69
+ function parseOverrides(raw?: string): Json | undefined {
70
+ if (!raw) return undefined;
71
+ const parsed = JSON.parse(raw) as unknown;
72
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
73
+ throw new Error('--overrides must be a JSON object');
74
+ }
75
+ return parsed as Json;
76
+ }
77
+
78
+ export function formatPolicyPreview(preview: PolicyPreviewResponse): string {
79
+ const lines: string[] = [];
80
+ lines.push(`Profile: ${preview.profile.id}@${preview.profile.version}`);
81
+ lines.push(`Hash: ${preview.effectivePolicyHash}`);
82
+ lines.push(`Permissions: ${preview.effectivePolicy.permissions.join(', ') || '(none)'}`);
83
+ lines.push(`Credential read scope: ${preview.effectivePolicy.credentialAccess.read.join(', ') || '(none)'}`);
84
+ lines.push(`Credential write scope: ${preview.effectivePolicy.credentialAccess.write.join(', ') || '(none)'}`);
85
+ lines.push(`Excluded fields: ${preview.effectivePolicy.excludeFields.join(', ') || '(none)'}`);
86
+ lines.push(`TTL seconds: ${preview.effectivePolicy.ttlSeconds}`);
87
+ lines.push(`Max reads: ${preview.effectivePolicy.maxReads ?? 'unlimited'}`);
88
+
89
+ const rb = preview.effectivePolicy.rateBudget;
90
+ lines.push(`Rate budget: ${rb.state} (${rb.requests ?? 'n/a'} / ${rb.windowSeconds ?? 'n/a'}s, source=${rb.source})`);
91
+
92
+ if (preview.warnings.length > 0) {
93
+ lines.push('Warnings:');
94
+ for (const warning of preview.warnings) lines.push(` - ${warning}`);
95
+ }
96
+
97
+ if (preview.denyExamples.length > 0) {
98
+ lines.push('Expected deny examples:');
99
+ for (const deny of preview.denyExamples) lines.push(` - ${deny.code}: ${deny.message}`);
100
+ }
101
+
102
+ return lines.join('\n');
103
+ }
104
+
105
+ function showHelp(): void {
106
+ console.log(`
107
+ auramaxx token — Token policy preview
108
+
109
+ Usage:
110
+ npx auramaxx token preview --profile <id> [--profile-version <v>] [--overrides <json>] [--json]
111
+
112
+ Options:
113
+ --profile <id> Profile id (required)
114
+ --profile-version <v> Profile version (default: v1)
115
+ --overrides <json> JSON object for profile overrides (tighten-only)
116
+ --json Print raw PolicyPreviewV1 payload
117
+ --token <token> Admin token (falls back to AURA_TOKEN env)
118
+
119
+ Examples:
120
+ npx auramaxx token preview --profile dev
121
+ npx auramaxx token preview --profile strict --profile-version v1 --json
122
+ npx auramaxx token preview --profile dev --overrides '{"ttlSeconds":900}'
123
+ `);
124
+ }
125
+
126
+ async function main(): Promise<void> {
127
+ const parsed = parseTokenArgs(process.argv.slice(2));
128
+
129
+ if (!parsed.subcommand || parsed.subcommand === '--help' || parsed.subcommand === '-h') {
130
+ showHelp();
131
+ process.exit(0);
132
+ }
133
+
134
+ if (parsed.subcommand !== 'preview') {
135
+ console.error(`Unknown token subcommand: ${parsed.subcommand}`);
136
+ showHelp();
137
+ process.exit(1);
138
+ }
139
+
140
+ if (!parsed.profile) {
141
+ console.error('--profile is required');
142
+ process.exit(1);
143
+ }
144
+
145
+ const token = parsed.token || process.env.AURA_TOKEN;
146
+ if (!token) {
147
+ console.error('Admin auth required. Provide --token or set AURA_TOKEN.');
148
+ process.exit(1);
149
+ }
150
+
151
+ try {
152
+ const profileOverrides = parseOverrides(parsed.overridesRaw);
153
+ const preview = await fetchJson<PolicyPreviewResponse>('/actions/token/preview', {
154
+ method: 'POST',
155
+ token,
156
+ body: {
157
+ profile: parsed.profile,
158
+ profileVersion: parsed.profileVersion,
159
+ profileOverrides,
160
+ },
161
+ });
162
+
163
+ if (parsed.json) {
164
+ console.log(JSON.stringify(preview, null, 2));
165
+ return;
166
+ }
167
+
168
+ console.log(formatPolicyPreview(preview));
169
+ } catch (error) {
170
+ console.error(`Token preview failed: ${getErrorMessage(error)}`);
171
+ process.exit(1);
172
+ }
173
+ }
174
+
175
+ if (import.meta.url === `file://${process.argv[1]}`) {
176
+ main().catch((error) => {
177
+ console.error(`Token preview failed: ${getErrorMessage(error)}`);
178
+ process.exit(1);
179
+ });
180
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * auramaxx unlock — Unlock the vault interactively
3
+ */
4
+
5
+ import { fetchPublicKey, fetchJson, isServerRunning } from '../lib/http';
6
+ import { promptPassword } from '../lib/prompt';
7
+ import { encryptPassword, generateAgentKeypair } from '../../cli/transport-client';
8
+ import { getErrorMessage } from '../../lib/error';
9
+
10
+ async function main() {
11
+ // Check server is running
12
+ if (!(await isServerRunning())) {
13
+ console.error('Wallet server is not running.');
14
+ console.error('Start it with: npx auramaxx');
15
+ process.exit(1);
16
+ }
17
+
18
+ // Get public key
19
+ const publicKey = await fetchPublicKey();
20
+
21
+ // Prompt for password
22
+ const password = await promptPassword('Password');
23
+
24
+ // Encrypt and unlock
25
+ const encrypted = encryptPassword(password, publicKey);
26
+ const { publicKey: agentPubkey } = generateAgentKeypair();
27
+
28
+ try {
29
+ const result = await fetchJson<{
30
+ success: boolean;
31
+ address: string;
32
+ token: string;
33
+ error?: string;
34
+ }>('/unlock', { body: { encrypted, pubkey: agentPubkey } });
35
+
36
+ console.log(`\nWallet unlocked.`);
37
+ console.log(` Address: ${result.address}`);
38
+ console.log(` Token: ${result.token.substring(0, 20)}...`);
39
+ process.exit(0);
40
+ } catch (error) {
41
+ const msg = getErrorMessage(error);
42
+ console.error(`\nFailed to unlock: ${msg}`);
43
+ process.exit(1);
44
+ }
45
+ }
46
+
47
+ main().catch((error) => {
48
+ console.error('Error:', getErrorMessage(error));
49
+ process.exit(1);
50
+ });