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,420 @@
1
+ import express from 'express';
2
+ import cors from 'cors';
3
+ import { createHash } from 'crypto';
4
+ import rateLimit, { ipKeyGenerator } from 'express-rate-limit';
5
+ import { SERVER_PORT, ensureDataDir } from './lib/config';
6
+ import { unlock, hasColdWallet, autoUnlockLinkedVaults, isVaultUnlocked, getPrimaryVaultId } from './lib/cold';
7
+ import { ApprovalRouter, loadAdaptersFromDb } from './lib/adapters';
8
+ import { requestLogger } from './middleware/requestLogger';
9
+ import { logger } from './lib/logger';
10
+ import { log } from './lib/pino';
11
+
12
+ // Routes
13
+ import setupRoutes from './routes/setup';
14
+ import unlockRoutes, { unlockPageHandler } from './routes/unlock';
15
+ import lockRoutes from './routes/lock';
16
+ import walletRoutes from './routes/wallet';
17
+ import sendRoutes from './routes/send';
18
+ import authRoutes from './routes/auth';
19
+ import passkeyRoutes from './routes/passkey';
20
+ import nukeRoutes from './routes/nuke';
21
+ import fundRoutes from './routes/fund';
22
+ import swapRoutes from './routes/swap';
23
+ import launchRoutes from './routes/launch';
24
+ import apikeysRoutes from './routes/apikeys';
25
+ import backupRoutes from './routes/backup';
26
+ import strategyRoutes from './routes/strategy';
27
+ import appRoutes from './routes/apps';
28
+ import actionsRoutes from './routes/actions';
29
+ import credentialVaultRoutes from './routes/credential-vaults';
30
+ import credentialsRoutes from './routes/credentials';
31
+ import credentialSharesRoutes from './routes/credential-shares';
32
+ import passkeyCredentialRoutes from './routes/passkey-credentials';
33
+ import importRoutes from './routes/import';
34
+ import adaptersRoutes, { setApprovalRouter, getApprovalRouter } from './routes/adapters';
35
+ import defaultsRoutes from './routes/defaults';
36
+ import aiRoutes from './routes/ai';
37
+ import portfolioRoutes from './routes/portfolio';
38
+ import resolveRoutes from './routes/resolve';
39
+ import priceRoutes from './routes/price';
40
+ import tokenRoutes from './routes/token';
41
+ import batchRoutes from './routes/batch';
42
+ import addressbookRoutes from './routes/addressbook';
43
+ import bookmarkRoutes from './routes/bookmarks';
44
+ import logsRoutes from './routes/logs';
45
+ import dashboardRoutes from './routes/dashboard';
46
+ import heartbeatRoutes from './routes/heartbeat';
47
+ import securityRoutes from './routes/security';
48
+ import flagsRoutes from './routes/flags';
49
+ import viewsRoutes from './routes/views';
50
+ import { preloadCache, onDefaultChanged, parseRateLimit, getDefaultSync } from './lib/defaults';
51
+ import { SocketServer } from './cli/socket';
52
+
53
+ // Ensure data directory exists
54
+ ensureDataDir();
55
+
56
+ const app = express();
57
+
58
+ // Middleware
59
+ // Restrict CORS to localhost origins. Bearer token is the primary auth mechanism,
60
+ // but limiting origins provides defense-in-depth.
61
+ const ALLOWED_ORIGINS = [
62
+ /^https?:\/\/localhost(:\d+)?$/,
63
+ /^https?:\/\/127\.0\.0\.1(:\d+)?$/,
64
+ /^https:\/\/[a-z0-9-]+\.auramaxx\.xyz$/, // Cloudflare tunnel subdomains
65
+ 'null', // blob URL iframes have opaque origin "null"
66
+ ];
67
+ app.use(cors({
68
+ origin: (origin, callback) => {
69
+ // Allow requests with no origin (e.g., server-to-server, curl, mobile apps)
70
+ if (!origin) return callback(null, true);
71
+ if (origin === 'null') return callback(null, true);
72
+ if (ALLOWED_ORIGINS.some(p => p instanceof RegExp ? p.test(origin) : p === origin)) {
73
+ return callback(null, true);
74
+ }
75
+ callback(new Error(`Origin ${origin} not allowed by CORS`));
76
+ },
77
+ credentials: true,
78
+ }));
79
+ app.use(express.json());
80
+
81
+ // Rate limiting — set BYPASS_RATE_LIMIT=true to disable (useful for local dev)
82
+ const bypassRateLimit = process.env.BYPASS_RATE_LIMIT === 'true';
83
+
84
+ const rateLimitResponse = (_req: express.Request, res: express.Response) => {
85
+ res.status(429).json({ success: false, error: 'Too many requests, please try again later' });
86
+ };
87
+
88
+ const noopMiddleware: express.RequestHandler = (_req, _res, next) => next();
89
+
90
+ // Hot-reloadable rate limiter: wraps a mutable inner limiter that gets swapped on config change
91
+ function createHotLimiter(
92
+ defaultKey: string,
93
+ fallback: string,
94
+ ): express.RequestHandler {
95
+ if (bypassRateLimit) return noopMiddleware;
96
+
97
+ const { max, windowMs } = parseRateLimit(getDefaultSync(defaultKey, fallback));
98
+ let inner = rateLimit({ windowMs, max, standardHeaders: true, legacyHeaders: false, handler: rateLimitResponse });
99
+
100
+ onDefaultChanged(defaultKey, (_key, value) => {
101
+ const updated = parseRateLimit(value);
102
+ inner = rateLimit({ windowMs: updated.windowMs, max: updated.max, standardHeaders: true, legacyHeaders: false, handler: rateLimitResponse });
103
+ });
104
+
105
+ return (req, res, next) => inner(req, res, next);
106
+ }
107
+
108
+ // Strict limit for password/setup endpoints (brute force protection)
109
+ const authBruteForceLimit = createHotLimiter('rate.brute_force', '5,900000');
110
+
111
+ // Registration/token request limit
112
+ const authRequestLimit = createHotLimiter('rate.auth_request', '10,60000');
113
+
114
+ // Transaction endpoints - keyed by hashed Bearer token
115
+ const txLimit = bypassRateLimit ? noopMiddleware : rateLimit({
116
+ windowMs: 60 * 1000, // 1 minute
117
+ max: 30,
118
+ standardHeaders: true,
119
+ legacyHeaders: false,
120
+ keyGenerator: (req) => {
121
+ const authHeader = req.headers.authorization;
122
+ if (authHeader && authHeader.startsWith('Bearer ')) {
123
+ // Hash the token so plaintext tokens are never stored in the rate limit memory store
124
+ return createHash('sha256').update(authHeader.slice(7)).digest('hex').slice(0, 16);
125
+ }
126
+ return ipKeyGenerator(req);
127
+ },
128
+ handler: rateLimitResponse,
129
+ });
130
+
131
+ // Paths that already have specific rate limits (skip general limit to avoid double-counting)
132
+ const rateLimitedPaths = new Set(['/unlock', '/setup', '/auth', '/send', '/swap', '/fund', '/launch', '/actions', '/nuke']);
133
+
134
+ // General rate limit for all other endpoints
135
+ const generalLimit = bypassRateLimit ? noopMiddleware : rateLimit({
136
+ windowMs: 60 * 1000, // 1 minute
137
+ max: 100,
138
+ standardHeaders: true,
139
+ legacyHeaders: false,
140
+ skip: (req) => rateLimitedPaths.has('/' + req.path.split('/')[1]),
141
+ handler: rateLimitResponse,
142
+ });
143
+
144
+ // Request/response logging (structured, with timing, agent identification, and event storage)
145
+ app.use(requestLogger);
146
+
147
+ // Serve unlock page before rate limiting (GET is not a brute force vector)
148
+ app.get('/unlock', unlockPageHandler);
149
+
150
+ // Apply rate limits to specific routes before general middleware
151
+ if (bypassRateLimit) {
152
+ log.warn('Rate limiting BYPASSED (BYPASS_RATE_LIMIT=true)');
153
+ }
154
+ // NOTE: Rate limiting assumes direct connections (no reverse proxy).
155
+ // If deploying behind a proxy, set app.set('trust proxy', 1) and configure accordingly.
156
+ app.use('/unlock', authBruteForceLimit);
157
+ // Only brute-force-limit setup writes; GET /setup (status check) uses the general limiter
158
+ app.use('/setup', (req, res, next) => {
159
+ if (req.method === 'GET') return next();
160
+ return authBruteForceLimit(req, res, next);
161
+ });
162
+ app.use('/actions', authBruteForceLimit);
163
+ app.use('/nuke', authBruteForceLimit);
164
+ // Only brute-force-limit backup writes; GET /backup (list) uses the general limiter
165
+ app.use('/backup', (req, res, next) => {
166
+ if (req.method === 'GET') return next();
167
+ return authBruteForceLimit(req, res, next);
168
+ });
169
+ app.use('/auth', authRequestLimit);
170
+ app.use('/send', txLimit);
171
+ app.use('/swap', txLimit);
172
+ app.use('/fund', txLimit);
173
+ app.use('/launch', txLimit);
174
+
175
+ // General rate limit for everything else
176
+ app.use(generalLimit);
177
+
178
+ // Routes
179
+ app.use('/setup', setupRoutes);
180
+ app.use('/unlock', unlockRoutes);
181
+ app.use('/lock', lockRoutes);
182
+ app.use('/wallets', walletRoutes);
183
+ app.use('/wallet', walletRoutes);
184
+ app.use('/send', sendRoutes);
185
+ app.use('/auth', authRoutes);
186
+ app.use('/auth/passkey', passkeyRoutes);
187
+ app.use('/nuke', nukeRoutes);
188
+ app.use('/fund', fundRoutes);
189
+ app.use('/swap', swapRoutes);
190
+ app.use('/launch', launchRoutes);
191
+ app.use('/apikeys', apikeysRoutes);
192
+ app.use('/backup', backupRoutes);
193
+ app.use('/strategies', strategyRoutes);
194
+ app.use('/apps', appRoutes);
195
+ app.use('/actions', actionsRoutes);
196
+ app.use('/vaults/credential', credentialVaultRoutes);
197
+ app.use('/credentials/import', importRoutes);
198
+ app.use('/credentials/passkey', passkeyCredentialRoutes);
199
+ app.use('/credentials', credentialsRoutes);
200
+ app.use('/credential-shares', credentialSharesRoutes);
201
+ app.use('/adapters', adaptersRoutes);
202
+ app.use('/defaults', defaultsRoutes);
203
+ app.use('/ai', aiRoutes);
204
+ app.use('/portfolio', portfolioRoutes);
205
+ app.use('/resolve', resolveRoutes);
206
+ app.use('/price', priceRoutes);
207
+ app.use('/token', tokenRoutes);
208
+ app.use('/batch', batchRoutes);
209
+ app.use('/address-labels', addressbookRoutes);
210
+ app.use('/bookmarks', bookmarkRoutes);
211
+ app.use('/security', securityRoutes);
212
+ app.use('/flags', flagsRoutes);
213
+ app.use('/views', viewsRoutes);
214
+
215
+ // Health check
216
+ app.get('/health', (_req, res) => {
217
+ res.json({ status: 'ok', timestamp: new Date().toISOString() });
218
+ });
219
+
220
+ app.use('/logs', logsRoutes);
221
+ app.use('/dashboard', dashboardRoutes);
222
+ app.use('/what_is_happening', heartbeatRoutes);
223
+
224
+ // Catch-all 404 — return JSON instead of Express default HTML
225
+ app.use((_req: express.Request, res: express.Response) => {
226
+ res.status(404).json({ error: 'Not found' });
227
+ });
228
+
229
+ // Error handler
230
+ app.use((err: Error, req: express.Request, res: express.Response, _next: express.NextFunction) => {
231
+ log.error({ err, method: req.method, url: req.originalUrl || req.path, agentId: req.auth?.token?.agentId }, 'server error');
232
+ logger.error(err.message, req.originalUrl || req.path, {
233
+ method: req.method,
234
+ agentId: req.auth?.token?.agentId,
235
+ });
236
+ res.status(500).json({ error: 'Internal server error' });
237
+ });
238
+
239
+ // Auto-migrate database on startup (applies any pending Prisma migrations)
240
+ async function autoMigrate() {
241
+ const { execSync } = await import('child_process');
242
+ const dbUrl = process.env.DATABASE_URL;
243
+ try {
244
+ execSync('npx prisma migrate deploy', {
245
+ cwd: import.meta.dirname ? import.meta.dirname + '/..' : process.cwd(),
246
+ env: { ...process.env, DATABASE_URL: dbUrl },
247
+ stdio: 'pipe',
248
+ });
249
+ log.info('Database migrations applied');
250
+ } catch (err) {
251
+ log.warn({ err }, 'Database migration failed (may already be up to date)');
252
+ }
253
+ }
254
+
255
+ // Start server (preload defaults cache before listening)
256
+ let server: ReturnType<typeof app.listen>;
257
+ let socketServer: SocketServer | null = null;
258
+
259
+ async function startServer() {
260
+ // Apply pending migrations before anything else
261
+ await autoMigrate();
262
+
263
+ // Load system defaults into memory cache before handling any requests
264
+ await preloadCache().catch(err => {
265
+ log.warn({ err }, 'Failed to preload defaults cache (will use seed values)');
266
+ });
267
+
268
+ // Seed default views for experimental wallet shell (no-op when flag is off)
269
+ try {
270
+ const { seedDefaultViews } = await import('./lib/view-registry');
271
+ seedDefaultViews();
272
+ } catch (err) {
273
+ log.warn({ err }, 'view registry seed failed');
274
+ }
275
+
276
+ // Session crash recovery and log cleanup (before starting engine)
277
+ try {
278
+ const { recoverCrashedSessions, cleanupOldLogs } = await import('./lib/strategy/session-logger');
279
+ await recoverCrashedSessions().catch(err => log.warn({ err }, 'session crash recovery failed'));
280
+ await cleanupOldLogs().catch(err => log.warn({ err }, 'session log cleanup failed'));
281
+ } catch (err) {
282
+ log.warn({ err }, 'session logger import failed');
283
+ }
284
+
285
+ // Credential lifecycle retention: purge recently deleted credentials older than retention window.
286
+ try {
287
+ const { purgeDeletedCredentials } = await import('./lib/credentials');
288
+ const summary = purgeDeletedCredentials(30);
289
+ if (summary.purged > 0) {
290
+ log.info({ purged: summary.purged, scanned: summary.scanned }, 'Purged expired recently deleted credentials on startup');
291
+ }
292
+ if (summary.errors.length > 0) {
293
+ log.warn({ errors: summary.errors, scanned: summary.scanned }, 'Credential startup purge completed with errors');
294
+ }
295
+ } catch (err) {
296
+ log.warn({ err }, 'Credential startup purge failed');
297
+ }
298
+
299
+ // Auto-unlock vault if VAULT_PASSWORD env var is set
300
+ if (process.env.VAULT_PASSWORD) {
301
+ if (!hasColdWallet()) {
302
+ log.error('VAULT_PASSWORD is set but no vault exists. Run setup first.');
303
+ process.exit(1);
304
+ }
305
+ const ok = unlock(process.env.VAULT_PASSWORD);
306
+ if (!ok) {
307
+ log.error('VAULT_PASSWORD is incorrect. Exiting.');
308
+ process.exit(1);
309
+ }
310
+ delete process.env.VAULT_PASSWORD;
311
+ log.info('Vault auto-unlocked via VAULT_PASSWORD env var');
312
+ }
313
+
314
+ // Auto-unlock linked vaults when primary is already unlocked (e.g. via VAULT_PASSWORD).
315
+ // Independent vaults remain locked until explicitly unlocked with their own password.
316
+ const pid = getPrimaryVaultId();
317
+ if (pid && isVaultUnlocked(pid)) {
318
+ try {
319
+ const count = autoUnlockLinkedVaults();
320
+ if (count > 0) {
321
+ log.info({ count }, 'Auto-unlocked linked vaults on startup');
322
+ }
323
+ } catch (err) {
324
+ log.warn({ err }, 'Failed to auto-unlock linked vaults');
325
+ }
326
+ } else {
327
+ log.debug('Primary vault not unlocked yet — deferring linked vault auto-unlock');
328
+ }
329
+
330
+ server = app.listen(SERVER_PORT, '127.0.0.1', () => {
331
+ log.info({ port: SERVER_PORT, url: `http://127.0.0.1:${SERVER_PORT}` }, 'Aura Wallet server started');
332
+
333
+ // Start local Unix socket broker as part of normal server lifecycle.
334
+ socketServer = new SocketServer({ serverUrl: `http://127.0.0.1:${SERVER_PORT}` });
335
+ socketServer.start()
336
+ .then(() => {
337
+ if (!socketServer) return;
338
+ log.info({ socketPath: socketServer.getSocketPath() }, 'Local socket broker started');
339
+ })
340
+ .catch((err) => {
341
+ log.error({ err }, 'Failed to start local socket broker');
342
+ });
343
+
344
+ // Start approval adapter router (if configured in DB)
345
+ loadAdaptersFromDb().then(adapters => {
346
+ if (adapters.length > 0) {
347
+ const router = new ApprovalRouter(`http://127.0.0.1:${SERVER_PORT}`);
348
+ for (const adapter of adapters) {
349
+ router.registerAdapter(adapter);
350
+ }
351
+ setApprovalRouter(router);
352
+ router.start().catch(err =>
353
+ log.error({ err }, 'Failed to start approval router')
354
+ );
355
+ log.info({ count: adapters.length }, 'Approval adapters loaded');
356
+ }
357
+ }).catch(err => {
358
+ log.error({ err }, 'Failed to load adapters from DB');
359
+ });
360
+
361
+ // Daily summary generation (hourly + on boot)
362
+ import('./lib/strategy/session-logger').then(({ generateDailySummary }) => {
363
+ generateDailySummary().catch(() => {});
364
+ setInterval(() => generateDailySummary().catch(() => {}), 3_600_000);
365
+ }).catch(() => {});
366
+ });
367
+ }
368
+
369
+ startServer().catch(err => {
370
+ log.error({ err }, 'Failed to start server');
371
+ process.exit(1);
372
+ });
373
+
374
+ // Graceful shutdown
375
+ async function shutdown(signal: string) {
376
+ log.info({ signal }, 'Shutting down...');
377
+ try {
378
+ const { endAllActiveSessions } = await import('./lib/strategy/session-logger');
379
+ await endAllActiveSessions('completed').catch(() => {});
380
+ } catch {}
381
+ try {
382
+ if (socketServer) {
383
+ await socketServer.stop();
384
+ socketServer = null;
385
+ log.info('Local socket broker stopped');
386
+ }
387
+ } catch (err) {
388
+ log.error({ err }, 'Error stopping local socket broker');
389
+ }
390
+ try {
391
+ const router = getApprovalRouter();
392
+ if (router) await router.stop();
393
+ } catch (err) {
394
+ log.error({ err }, 'Error stopping approval router');
395
+ }
396
+ server.close(() => {
397
+ log.info('HTTP server closed');
398
+ process.exit(0);
399
+ });
400
+ // Force exit after 35s if graceful shutdown hangs
401
+ setTimeout(() => process.exit(1), 35_000);
402
+ }
403
+
404
+ process.on('SIGTERM', () => shutdown('SIGTERM'));
405
+ process.on('SIGINT', () => shutdown('SIGINT'));
406
+
407
+ process.on('uncaughtException', async (err) => {
408
+ log.fatal({ err }, 'Uncaught exception');
409
+ try {
410
+ const { markAllSessionsCrashed } = await import('./lib/strategy/session-logger');
411
+ await markAllSessionsCrashed();
412
+ } catch {}
413
+ process.exit(1);
414
+ });
415
+
416
+ process.on('unhandledRejection', (reason) => {
417
+ log.error({ err: reason }, 'Unhandled rejection');
418
+ });
419
+
420
+ export default app;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Adapter registry and factory.
3
+ *
4
+ * Maps adapter type names to constructors. Built-in types (webhook, telegram)
5
+ * are registered at import time. Third-party types can be registered via
6
+ * registerAdapterType().
7
+ */
8
+
9
+ import type { ApprovalAdapter, AdapterFactory } from './types';
10
+ import { WebhookAdapter, type WebhookAdapterConfig } from './webhook';
11
+ import { TelegramAdapter, type TelegramAdapterConfig } from './telegram';
12
+ import { getErrorMessage } from '../error';
13
+ import {
14
+ ensureApiKeysMigrated,
15
+ listApiKeyCredentials,
16
+ readApiKeyValueByServiceName,
17
+ } from '../apikey-migration';
18
+
19
+ const registry = new Map<string, AdapterFactory>();
20
+
21
+ /** Register a custom adapter type */
22
+ export function registerAdapterType(type: string, factory: AdapterFactory): void {
23
+ registry.set(type, factory);
24
+ }
25
+
26
+ /** Internal config shape used by createAdapters and loadAdaptersFromDb */
27
+ interface AdapterEntry {
28
+ type: string;
29
+ enabled: boolean;
30
+ config: Record<string, unknown>;
31
+ chat?: { enabled?: boolean };
32
+ }
33
+
34
+ /** Create adapter instances from structured config, skipping disabled entries */
35
+ export function createAdapters(entries: AdapterEntry[]): ApprovalAdapter[] {
36
+ const adapters: ApprovalAdapter[] = [];
37
+
38
+ for (const entry of entries) {
39
+ if (!entry.enabled) continue;
40
+
41
+ const factory = registry.get(entry.type);
42
+ if (!factory) {
43
+ console.warn(`[adapters] Unknown adapter type: ${entry.type}`);
44
+ continue;
45
+ }
46
+
47
+ try {
48
+ const config = entry.chat ? { ...entry.config, chat: entry.chat } : entry.config;
49
+ adapters.push(factory(config));
50
+ } catch (err) {
51
+ const msg = getErrorMessage(err);
52
+ console.error(`[adapters] Failed to create ${entry.type} adapter:`, msg);
53
+ }
54
+ }
55
+
56
+ return adapters;
57
+ }
58
+
59
+ /**
60
+ * Load and create adapters from the database.
61
+ *
62
+ * Reads adapter settings from AppConfig.adapterConfig (enabled flags, non-secret config)
63
+ * and secrets from vault-backed API key credentials (service = 'adapter:<type>').
64
+ * Merges them to create instances.
65
+ */
66
+ export async function loadAdaptersFromDb(): Promise<ApprovalAdapter[]> {
67
+ // Never load adapters during tests
68
+ if (process.env.NODE_ENV === 'test') return [];
69
+
70
+ // Lazy import to avoid circular deps
71
+ const { prisma } = await import('../db');
72
+
73
+ // 1. Read adapter config from AppConfig
74
+ const appConfig = await prisma.appConfig.findUnique({
75
+ where: { id: 'global' },
76
+ });
77
+
78
+ if (!appConfig?.adapterConfig) return [];
79
+
80
+ let parsed: { enabled?: boolean; chat?: { defaultApp?: string }; adapters?: AdapterEntry[] };
81
+ try {
82
+ parsed = JSON.parse(appConfig.adapterConfig);
83
+ } catch {
84
+ console.error('[adapters] Invalid adapterConfig JSON in AppConfig');
85
+ return [];
86
+ }
87
+
88
+ if (!parsed.enabled || !parsed.adapters?.length) return [];
89
+
90
+ // 2. Read all adapter secrets from vault-backed API key credentials.
91
+ await ensureApiKeysMigrated();
92
+ const secretKeys = listApiKeyCredentials().filter((credential) =>
93
+ credential.service.startsWith('adapter:'),
94
+ );
95
+
96
+ // Build a lookup: { 'telegram': { botToken: '...' }, 'webhook': { secret: '...' } }
97
+ const secretsByType: Record<string, Record<string, string>> = {};
98
+ for (const key of secretKeys) {
99
+ const adapterType = key.service.replace('adapter:', '');
100
+ const value = readApiKeyValueByServiceName(key.service, key.name);
101
+ if (!value) continue;
102
+ if (!secretsByType[adapterType]) secretsByType[adapterType] = {};
103
+ secretsByType[adapterType][key.name] = value;
104
+ }
105
+
106
+ // 3. Merge secrets into adapter configs and create instances
107
+ const entries: AdapterEntry[] = parsed.adapters.map((a) => ({
108
+ type: a.type,
109
+ enabled: a.enabled,
110
+ config: { ...a.config, ...(secretsByType[a.type] || {}) },
111
+ chat: a.chat,
112
+ }));
113
+
114
+ return createAdapters(entries);
115
+ }
116
+
117
+ // Register built-in adapter types
118
+ registerAdapterType('webhook', (config) => new WebhookAdapter(config as WebhookAdapterConfig));
119
+ registerAdapterType('telegram', (config) => new TelegramAdapter(config as TelegramAdapterConfig));
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Public exports for the approval adapter system.
3
+ */
4
+
5
+ export { ApprovalRouter } from './router';
6
+ export { createAdapters, registerAdapterType, loadAdaptersFromDb } from './factory';
7
+ export type {
8
+ ApprovalAdapter,
9
+ AdapterContext,
10
+ ActionNotification,
11
+ ActionResolution,
12
+ ResolveOptions,
13
+ ResolveResult,
14
+ AdapterFactory,
15
+ ChatMessage,
16
+ ChatReply,
17
+ } from './types';
18
+ export { WebhookAdapter, type WebhookAdapterConfig } from './webhook';
19
+ export { TelegramAdapter, type TelegramAdapterConfig } from './telegram';