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,673 @@
1
+ # Workspace API - Agent Control Guide
2
+
3
+ Programmatic control of the AuraMaxx dashboard via WebSocket.
4
+
5
+ ## Authentication
6
+
7
+ **Read-only operations** (querying state) work without authentication.
8
+
9
+ **Mutation operations** (creating/updating/deleting workspaces and apps, changing themes) require a valid token with `workspace:modify` permission or admin access (`admin:*`).
10
+
11
+ For authentication details, see [AUTH.md](./AUTH.md).
12
+
13
+ ## Quick Start (CLI Script)
14
+
15
+ The easiest way to add apps is via the CLI script:
16
+
17
+ ```bash
18
+ # Set your token (required for mutations)
19
+ export AURA_TOKEN="your-agent-token"
20
+
21
+ # Add an iframe app
22
+ node scripts/add-app.js iframe --url "https://dexscreener.com/base/0x123" --title "Price Chart"
23
+
24
+ # Add a built-in app
25
+ node scripts/add-app.js wallets
26
+ node scripts/add-app.js logs --x 400 --y 100
27
+
28
+ # Add an installed app (from apps/ folder)
29
+ node scripts/add-app.js installed:example-kanban
30
+
31
+ # Specify position and size
32
+ node scripts/add-app.js iframe --url "https://example.com" --x 100 --y 200 --width 600 --height 400
33
+
34
+ # Custom app ID (for multi-instance)
35
+ node scripts/add-app.js iframe --id "my-chart" --url "https://example.com"
36
+ ```
37
+
38
+ Run `node scripts/add-app.js --help` for full usage.
39
+
40
+ > **Note**: Adding apps requires a token with `workspace:modify` permission or admin access. See [AUTH.md](./AUTH.md) for obtaining tokens.
41
+
42
+ ---
43
+
44
+ ## Quick Start (WebSocket)
45
+
46
+ For programmatic control from code:
47
+
48
+ ```javascript
49
+ // Connect with authentication token for mutations
50
+ // Token is passed as URL query parameter
51
+ const token = 'your-agent-token'; // From /auth endpoint or admin token from /unlock
52
+ const ws = new WebSocket(`ws://localhost:4748?token=${encodeURIComponent(token)}`);
53
+
54
+ ws.onopen = () => {
55
+ // Add an app (requires workspace:modify permission or admin:*)
56
+ ws.send(JSON.stringify({
57
+ type: 'app:added',
58
+ timestamp: Date.now(),
59
+ source: 'agent',
60
+ data: {
61
+ workspaceId: 'your-workspace-id',
62
+ appType: 'iframe',
63
+ config: { url: 'https://example.com/chart' },
64
+ x: 100, y: 100, width: 400, height: 300
65
+ }
66
+ }));
67
+ };
68
+
69
+ ws.onmessage = (event) => {
70
+ const msg = JSON.parse(event.data);
71
+
72
+ // Check for permission errors
73
+ if (msg.type === 'error') {
74
+ console.error('Permission denied:', msg.error);
75
+ return;
76
+ }
77
+
78
+ console.log('Received:', msg.type, msg.data);
79
+ };
80
+ ```
81
+
82
+ **Without a token**, you can still query state (read-only):
83
+
84
+ ```javascript
85
+ const ws = new WebSocket('ws://localhost:4748'); // No token
86
+
87
+ ws.onopen = () => {
88
+ // Query current state (no auth required)
89
+ ws.send(JSON.stringify({
90
+ type: 'workspace:state:request',
91
+ timestamp: Date.now(),
92
+ source: 'agent',
93
+ data: { requestId: 'req-123' }
94
+ }));
95
+ };
96
+ ```
97
+
98
+ ---
99
+
100
+ ## WebSocket Events
101
+
102
+ ### Connection
103
+
104
+ ```
105
+ ws://localhost:4748
106
+ ```
107
+
108
+ On connect, you'll receive: `{ type: 'connected', timestamp: ... }`
109
+
110
+ ---
111
+
112
+ ## Query Events (Request/Response)
113
+
114
+ ### Get Current State
115
+
116
+ Request the full workspace state:
117
+
118
+ ```javascript
119
+ ws.send(JSON.stringify({
120
+ type: 'workspace:state:request',
121
+ timestamp: Date.now(),
122
+ source: 'agent',
123
+ data: {
124
+ requestId: 'req-123', // Your unique ID to match response
125
+ workspaceId: 'optional-id' // Omit for default workspace
126
+ }
127
+ }));
128
+ ```
129
+
130
+ Response:
131
+
132
+ ```javascript
133
+ {
134
+ type: 'workspace:state:response',
135
+ data: {
136
+ requestId: 'req-123',
137
+ workspaces: [
138
+ { id: 'ws-1', name: 'HOME', slug: 'home', icon: 'Home', isDefault: true, isCloseable: false }
139
+ ],
140
+ activeWorkspaceId: 'ws-1',
141
+ apps: [
142
+ { id: 'w-1', workspaceId: 'ws-1', appType: 'logs', x: 20, y: 20, width: 600, height: 300, zIndex: 10, isVisible: true, isLocked: false }
143
+ ]
144
+ }
145
+ }
146
+ ```
147
+
148
+ ---
149
+
150
+ ## Mutation Events
151
+
152
+ > **Authentication Required**: All mutation events require a valid token with `workspace:modify` permission or admin access. Connect with `ws://localhost:4748?token=YOUR_TOKEN`. See [AUTH.md](./AUTH.md) for obtaining tokens.
153
+
154
+ All mutations are broadcast to other connected clients automatically.
155
+
156
+ ### Create Workspace
157
+
158
+ ```javascript
159
+ ws.send(JSON.stringify({
160
+ type: 'workspace:created',
161
+ timestamp: Date.now(),
162
+ source: 'agent',
163
+ data: {
164
+ id: 'ws-' + Date.now(), // Optional - auto-generated if omitted
165
+ name: 'TRADING',
166
+ slug: 'trading', // Optional - generated from name
167
+ icon: 'TrendingUp', // Lucide icon name
168
+ order: 1, // Tab order
169
+ isDefault: false,
170
+ isCloseable: true
171
+ }
172
+ }));
173
+ ```
174
+
175
+ ### Delete Workspace
176
+
177
+ ```javascript
178
+ ws.send(JSON.stringify({
179
+ type: 'workspace:deleted',
180
+ timestamp: Date.now(),
181
+ source: 'agent',
182
+ data: { workspaceId: 'ws-123' }
183
+ }));
184
+ ```
185
+
186
+ ### Update Workspace
187
+
188
+ ```javascript
189
+ ws.send(JSON.stringify({
190
+ type: 'workspace:updated',
191
+ timestamp: Date.now(),
192
+ source: 'agent',
193
+ data: {
194
+ id: 'ws-123',
195
+ name: 'NEW NAME',
196
+ icon: 'Zap'
197
+ }
198
+ }));
199
+ ```
200
+
201
+ ---
202
+
203
+ ## App Events
204
+
205
+ ### Add App
206
+
207
+ ```javascript
208
+ ws.send(JSON.stringify({
209
+ type: 'app:added',
210
+ timestamp: Date.now(),
211
+ source: 'agent',
212
+ data: {
213
+ id: 'app-' + Date.now(), // Optional
214
+ workspaceId: 'ws-123', // Required
215
+ appType: 'iframe', // Required - see App Types below
216
+ x: 100, // Position (default: 20)
217
+ y: 100,
218
+ width: 400, // Size (default varies by type)
219
+ height: 300,
220
+ zIndex: 50, // Layering (auto-incremented if omitted)
221
+ isVisible: true,
222
+ isLocked: false,
223
+ config: { // Type-specific config
224
+ url: 'https://example.com'
225
+ }
226
+ }
227
+ }));
228
+ ```
229
+
230
+ ### Remove App
231
+
232
+ ```javascript
233
+ ws.send(JSON.stringify({
234
+ type: 'app:removed',
235
+ timestamp: Date.now(),
236
+ source: 'agent',
237
+ data: { appId: 'app-123' }
238
+ }));
239
+ ```
240
+
241
+ ### Update App
242
+
243
+ Update position, size, visibility, lock state, or config:
244
+
245
+ ```javascript
246
+ ws.send(JSON.stringify({
247
+ type: 'app:updated',
248
+ timestamp: Date.now(),
249
+ source: 'agent',
250
+ data: {
251
+ appId: 'app-123',
252
+ x: 200, // Move app
253
+ y: 150,
254
+ width: 500, // Resize
255
+ height: 400,
256
+ isVisible: true, // Show/hide
257
+ isLocked: true, // Prevent dragging
258
+ config: { ... } // Update config
259
+ }
260
+ }));
261
+ ```
262
+
263
+ ---
264
+
265
+ ## App Types
266
+
267
+ ### Singleton vs Multi-Instance
268
+
269
+ Apps are categorized as **singleton** or **multi-instance**:
270
+
271
+ - **Singleton**: Only one instance per workspace. ID = app type. If you try to add a duplicate, it brings the existing one to front.
272
+ - **Multi-instance**: Can have multiple instances with different IDs. Use custom `id` like `wallet:0x123` or `iframe:my-chart`.
273
+
274
+ ### Built-in Apps (Singleton)
275
+
276
+ | Type | Description | Default Size |
277
+ |------|-------------|--------------|
278
+ | `logs` | Event log viewer | 600x300 |
279
+ | `send` | Send ETH form | 320x280 |
280
+ | `agentKeys` | Agent keys & approvals | 340x400 |
281
+ | `setup` | Getting started wizard | 420x520 |
282
+ | `transactions` | Transaction history log | 520x400 |
283
+
284
+ ### Multi-Instance Apps
285
+
286
+ These app types can be opened multiple times with different IDs:
287
+
288
+ | Type | Description | Default Size |
289
+ |------|-------------|--------------|
290
+ | `token` | Market data for a token | 380x480 |
291
+ | `walletDetail` | Detailed view of a single wallet | 320x380 |
292
+ | `iframe` | Embed external URL | 400x300 |
293
+ | `installed:*` | Installed apps from `apps/` folder | varies |
294
+
295
+ **Custom IDs**: Pass an `id` field to control identity:
296
+
297
+ ```javascript
298
+ // Multiple iframe apps with different IDs
299
+ { id: 'chart-eth', appType: 'iframe', config: { url: '...' } }
300
+ { id: 'chart-btc', appType: 'iframe', config: { url: '...' } }
301
+
302
+ // Wallet detail apps
303
+ { id: 'wallet:0x123...', appType: 'walletDetail', config: { address: '0x123...' } }
304
+
305
+ // Installed third-party apps
306
+ { appType: 'installed:example-kanban', config: { appPath: 'example-kanban', appName: 'Kanban Board' } }
307
+ ```
308
+
309
+ If no `id` is provided, one is auto-generated (e.g., `iframe-1738505123456`).
310
+
311
+ > For full details on creating and installing third-party apps, see [docs/APPS.md](./APPS.md).
312
+
313
+ #### IFrame App
314
+
315
+ Embed any URL:
316
+
317
+ ```javascript
318
+ {
319
+ appType: 'iframe',
320
+ config: {
321
+ url: 'https://example.com/chart',
322
+ title: 'Price Chart', // Optional
323
+ }
324
+ }
325
+ ```
326
+
327
+ > **Security note:** Iframes are sandboxed with `allow-scripts allow-forms` (no `allow-same-origin`). The sandbox policy is not configurable by agents to prevent sandbox escape.
328
+
329
+ #### Installed Apps
330
+
331
+ Third-party apps installed as folders under `apps/`. Each installed app consists of a `app.md` manifest and an `index.html` entry point, rendered inside a sandboxed iframe.
332
+
333
+ ```javascript
334
+ {
335
+ appType: 'installed:example-kanban',
336
+ config: {
337
+ appPath: 'example-kanban',
338
+ appName: 'Kanban Board'
339
+ }
340
+ }
341
+ ```
342
+
343
+ Installed apps appear in the App Store under the "INSTALLED" tab. For full details on creating, installing, and developing third-party apps (manifest format, SDK API, storage, security model), see [APPS.md](./APPS.md) and [DEVELOPING-APPS.md](./DEVELOPING-APPS.md).
344
+
345
+ ---
346
+
347
+ ## Strategy Events
348
+
349
+ The strategy engine broadcasts events over the WebSocket as strategies execute.
350
+
351
+ | Event | When | Data |
352
+ |-------|------|------|
353
+ | `strategy:tick` | Tick completes | `strategyId`, `intents` (count), `duration` (ms) |
354
+ | `strategy:enabled` | Strategy enabled | `strategyId` |
355
+ | `strategy:paused` | Strategy paused | `strategyId`, `reason` |
356
+ | `strategy:error` | Hook or action failed | `strategyId`, `error`, `phase` |
357
+ | `strategy:approve` | Intents awaiting approval | `strategyId`, `intents[]` |
358
+
359
+ ### Example: strategy:tick
360
+
361
+ ```json
362
+ {
363
+ "type": "strategy:tick",
364
+ "timestamp": 1707052800000,
365
+ "source": "express",
366
+ "data": {
367
+ "strategyId": "dca-eth",
368
+ "intents": 2,
369
+ "duration": 145
370
+ }
371
+ }
372
+ ```
373
+
374
+ ### Example: strategy:approve
375
+
376
+ Sent when a strategy produces intents that require human approval before execution.
377
+
378
+ ```json
379
+ {
380
+ "type": "strategy:approve",
381
+ "timestamp": 1707052800000,
382
+ "source": "express",
383
+ "data": {
384
+ "strategyId": "dca-eth",
385
+ "intents": [
386
+ { "id": "approval-123", "action": "swap", "params": { "token": "0x...", "amount": "0.05" } }
387
+ ]
388
+ }
389
+ }
390
+ ```
391
+
392
+ ### Example: strategy:error
393
+
394
+ ```json
395
+ {
396
+ "type": "strategy:error",
397
+ "timestamp": 1707052800000,
398
+ "source": "express",
399
+ "data": {
400
+ "strategyId": "dca-eth",
401
+ "error": "Hook 'beforeTick' threw: network timeout",
402
+ "phase": "hook"
403
+ }
404
+ }
405
+ ```
406
+
407
+ ---
408
+
409
+ ## REST API
410
+
411
+ Alternative to WebSocket for simple CRUD operations.
412
+
413
+ ### Workspaces
414
+
415
+ ```bash
416
+ # List all workspaces
417
+ GET /api/workspace
418
+
419
+ # Create workspace
420
+ POST /api/workspace
421
+ { "name": "TRADING", "icon": "TrendingUp" }
422
+
423
+ # Get workspace with apps
424
+ GET /api/workspace/:id
425
+
426
+ # Update workspace
427
+ PATCH /api/workspace/:id
428
+ { "name": "NEW NAME" }
429
+
430
+ # Delete workspace
431
+ DELETE /api/workspace/:id
432
+ ```
433
+
434
+ ### Apps
435
+
436
+ ```bash
437
+ # Add app to workspace
438
+ POST /api/workspace/:id/apps
439
+ {
440
+ "appType": "iframe",
441
+ "config": { "url": "https://example.com" },
442
+ "x": 100, "y": 100
443
+ }
444
+
445
+ # Update app
446
+ PATCH /api/workspace/:id/apps/:wid
447
+ { "x": 200, "y": 150, "width": 500 }
448
+
449
+ # Remove app
450
+ DELETE /api/workspace/:id/apps/:wid
451
+ ```
452
+
453
+ ### Export/Import
454
+
455
+ ```bash
456
+ # Export workspace as JSON
457
+ GET /api/workspace/:id/export
458
+
459
+ # Import workspace from JSON
460
+ POST /api/workspace/import
461
+ {
462
+ "workspace": { "name": "Imported", "icon": "Download" },
463
+ "apps": [
464
+ { "appType": "logs", "x": 20, "y": 20 }
465
+ ]
466
+ }
467
+ ```
468
+
469
+ ---
470
+
471
+ ## Persistence
472
+
473
+ - All changes auto-save to SQLite database (500ms debounce)
474
+ - Workspaces persist across server restarts
475
+ - Default "HOME" workspace created automatically
476
+
477
+ ---
478
+
479
+ ## Example: Full Agent Session
480
+
481
+ ```javascript
482
+ // Connect with authentication token
483
+ const token = 'your-agent-token'; // Obtained from /auth endpoint
484
+ const ws = new WebSocket(`ws://localhost:4748?token=${encodeURIComponent(token)}`);
485
+
486
+ ws.onopen = async () => {
487
+ // 1. Get current state (no auth required for queries)
488
+ const requestId = 'req-' + Date.now();
489
+ ws.send(JSON.stringify({
490
+ type: 'workspace:state:request',
491
+ timestamp: Date.now(),
492
+ source: 'agent',
493
+ data: { requestId }
494
+ }));
495
+ };
496
+
497
+ ws.onmessage = (event) => {
498
+ const msg = JSON.parse(event.data);
499
+
500
+ if (msg.type === 'workspace:state:response') {
501
+ const workspaceId = msg.data.activeWorkspaceId;
502
+
503
+ // 2. Add a price chart iframe
504
+ ws.send(JSON.stringify({
505
+ type: 'app:added',
506
+ timestamp: Date.now(),
507
+ source: 'agent',
508
+ data: {
509
+ workspaceId,
510
+ appType: 'iframe',
511
+ config: { url: 'https://www.tradingview.com/chart/', title: 'TradingView' },
512
+ x: 400, y: 20, width: 800, height: 500
513
+ }
514
+ }));
515
+
516
+ // 3. Add an installed third-party app
517
+ ws.send(JSON.stringify({
518
+ type: 'app:added',
519
+ timestamp: Date.now(),
520
+ source: 'agent',
521
+ data: {
522
+ workspaceId,
523
+ appType: 'installed:example-kanban',
524
+ config: { appPath: 'example-kanban', appName: 'Kanban Board' },
525
+ x: 20, y: 20, width: 640, height: 560
526
+ }
527
+ }));
528
+ }
529
+ };
530
+ ```
531
+
532
+ ---
533
+
534
+ ## Theme System
535
+
536
+ The dashboard supports light/dark mode and accent color customization via WebSocket events.
537
+
538
+ ### Query Current Theme
539
+
540
+ ```javascript
541
+ ws.send(JSON.stringify({
542
+ type: 'theme:request',
543
+ timestamp: Date.now(),
544
+ source: 'agent',
545
+ data: { requestId: 'req-123' }
546
+ }));
547
+ ```
548
+
549
+ Response:
550
+
551
+ ```javascript
552
+ {
553
+ type: 'theme:response',
554
+ data: {
555
+ requestId: 'req-123',
556
+ activeThemeId: 'light',
557
+ accentColor: '#ccff00',
558
+ mode: 'light'
559
+ }
560
+ }
561
+ ```
562
+
563
+ ### Change Theme Mode (Light/Dark)
564
+
565
+ > **Authentication Required**: Theme changes require `workspace:modify` permission or admin access.
566
+
567
+ ```javascript
568
+ ws.send(JSON.stringify({
569
+ type: 'theme:mode:changed',
570
+ timestamp: Date.now(),
571
+ source: 'agent',
572
+ data: { mode: 'dark' } // 'light' or 'dark'
573
+ }));
574
+ ```
575
+
576
+ ### Change Accent Color
577
+
578
+ ```javascript
579
+ ws.send(JSON.stringify({
580
+ type: 'theme:accent:changed',
581
+ timestamp: Date.now(),
582
+ source: 'agent',
583
+ data: { accent: '#ff4d00' } // Any hex color
584
+ }));
585
+ ```
586
+
587
+ ### Theme-Aware Apps
588
+
589
+ When creating installed apps, use CSS variables for automatic theme support. The host injects theme CSS variables into every app iframe, so your app automatically adapts to light/dark mode and accent color changes.
590
+
591
+ ```html
592
+ <!-- In your installed app's index.html -->
593
+ <style>
594
+ body {
595
+ background: var(--color-surface, #fff);
596
+ color: var(--color-text, #0a0a0a);
597
+ border: 1px solid var(--color-border, #d4d4d8);
598
+ padding: 16px;
599
+ font-family: ui-monospace, monospace;
600
+ }
601
+ .label {
602
+ color: var(--color-text-muted, #6b7280);
603
+ font-size: 10px;
604
+ }
605
+ .highlight {
606
+ color: var(--color-accent, #ccff00);
607
+ font-weight: bold;
608
+ }
609
+ </style>
610
+ ```
611
+
612
+ > For the full list of injected CSS variables and theming details for installed apps, see [DEVELOPING-APPS.md](./DEVELOPING-APPS.md#theming).
613
+
614
+ ### Available CSS Variables
615
+
616
+ **Core Colors:**
617
+ - `--color-accent` - Primary accent color (default: #ccff00)
618
+ - `--color-background` - Page background
619
+ - `--color-background-alt` - Alternate background (e.g., sidebar)
620
+ - `--color-surface` - Card/app background
621
+ - `--color-surface-alt` - Alternate surface
622
+
623
+ **Text:**
624
+ - `--color-text` - Primary text
625
+ - `--color-text-muted` - Secondary text
626
+ - `--color-text-faint` - Tertiary/disabled text
627
+
628
+ **Borders:**
629
+ - `--color-border` - Default border
630
+ - `--color-border-muted` - Subtle border
631
+ - `--color-border-focus` - Focus ring
632
+
633
+ **Semantic:**
634
+ - `--color-warning` - Warning state (#ff4d00)
635
+ - `--color-danger` - Error/danger state (#ef4444)
636
+ - `--color-success` - Success state (#00c853)
637
+ - `--color-info` - Info state (#0047ff)
638
+
639
+ **App Palette:**
640
+ - `--app-{color}-band` - App header band color
641
+ - `--app-{color}-accent` - App border accent
642
+ - `--app-{color}-bg` - App background tint
643
+ - `--app-{color}-text` - App text color
644
+
645
+ Where `{color}` is: `blue`, `orange`, `lime`, `purple`, `gray`, `teal`, `rose`
646
+
647
+ ### Theme Events Reference
648
+
649
+ | Event | Direction | Description |
650
+ |-------|-----------|-------------|
651
+ | `theme:request` | Agent → Server | Query current theme state |
652
+ | `theme:response` | Server → Agent | Response with theme data |
653
+ | `theme:mode:changed` | Agent/UI → Server → Broadcast | Toggle light/dark mode |
654
+ | `theme:accent:changed` | Agent/UI → Server → Broadcast | Change accent color |
655
+ | `workspace:theme:updated` | Agent/UI → Server → Broadcast | Per-workspace overrides |
656
+
657
+ ### CLI Theme Control
658
+
659
+ Quick theme toggle from command line (requires authentication):
660
+
661
+ ```bash
662
+ # Set your token
663
+ TOKEN="your-agent-token"
664
+
665
+ # Switch to dark mode
666
+ node -e "const ws = new (require('ws'))('ws://localhost:4748?token=$TOKEN'); ws.on('open', () => { ws.send(JSON.stringify({type:'theme:mode:changed',timestamp:Date.now(),source:'agent',data:{mode:'dark'}})); setTimeout(() => process.exit(), 500); });"
667
+
668
+ # Switch to light mode
669
+ node -e "const ws = new (require('ws'))('ws://localhost:4748?token=$TOKEN'); ws.on('open', () => { ws.send(JSON.stringify({type:'theme:mode:changed',timestamp:Date.now(),source:'agent',data:{mode:'light'}})); setTimeout(() => process.exit(), 500); });"
670
+
671
+ # Change accent color
672
+ node -e "const ws = new (require('ws'))('ws://localhost:4748?token=$TOKEN'); ws.on('open', () => { ws.send(JSON.stringify({type:'theme:accent:changed',timestamp:Date.now(),source:'agent',data:{accent:'#ff4d00'}})); setTimeout(() => process.exit(), 500); });"
673
+ ```
@@ -0,0 +1,14 @@
1
+ # Agent Auth Model
2
+
3
+ This page is intentionally minimal to avoid duplicating `AUTH.md`.
4
+
5
+ Use these entrypoints:
6
+
7
+ - First secret access path: [GETTING_SECRETS](./external/HOW_TO_AURAMAXX/GETTING_SECRETS.md)
8
+ - Full auth/token model: [AUTH.md](./AUTH.md)
9
+
10
+ Quick summary:
11
+
12
+ 1. Agent requests access via `POST /auth` with `pubkey`.
13
+ 2. Human approves.
14
+ 3. Agent claims token via `GET /auth/:requestId?secret=...`.