auramaxx 1.0.0-alpha.4

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 (363) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +112 -0
  3. package/bin/aurawallet.js +121 -0
  4. package/docs/ADAPTERS.md +467 -0
  5. package/docs/API.md +2679 -0
  6. package/docs/APPS.md +198 -0
  7. package/docs/ARCHITECTURE.md +350 -0
  8. package/docs/AUTH.md +698 -0
  9. package/docs/BEST-PRACTICES.md +121 -0
  10. package/docs/CLI.md +61 -0
  11. package/docs/DEVELOPING-APPS.md +452 -0
  12. package/docs/EXTENSION.md +97 -0
  13. package/docs/JOBS.md +33 -0
  14. package/docs/MCP.md +76 -0
  15. package/docs/PROTOCOL.md +142 -0
  16. package/docs/SETUP.md +219 -0
  17. package/docs/WORKSPACE.md +672 -0
  18. package/docs/agent-auth.md +63 -0
  19. package/docs/aura-file.md +48 -0
  20. package/docs/credentials.md +53 -0
  21. package/docs/external/getting-started.md +65 -0
  22. package/docs/external/overview.md +45 -0
  23. package/docs/external/use-cases.md +48 -0
  24. package/docs/external/why-aura.md +35 -0
  25. package/docs/jobs/connect-agent.md +77 -0
  26. package/docs/jobs/migrate-from-dotenv.md +79 -0
  27. package/docs/jobs/recover-from-lockout.md +72 -0
  28. package/docs/jobs/secure-ci.md +63 -0
  29. package/docs/oauth2.md +42 -0
  30. package/docs/passkeys.md +60 -0
  31. package/docs/security.md +540 -0
  32. package/docs/specs/aura-open-protocol.md +61 -0
  33. package/docs/specs/aura-provider-plugin.md +24 -0
  34. package/docs/specs/aura-registry-model.md +31 -0
  35. package/docs/specs/fixtures/invalid-bad-key.aura +1 -0
  36. package/docs/specs/fixtures/invalid-bad-unicode-escape.aura +1 -0
  37. package/docs/specs/fixtures/invalid-duplicate-key.aura +2 -0
  38. package/docs/specs/fixtures/valid-basic.aura +4 -0
  39. package/docs/specs/fixtures/valid-provider-ref.aura +1 -0
  40. package/docs/specs/fixtures/valid-quoted-escapes.aura +2 -0
  41. package/docs/templates/RELEASE_NOTES_TEMPLATE.md +22 -0
  42. package/docs/totp.md +40 -0
  43. package/docs/wallet/AI.md +508 -0
  44. package/docs/wallet/DEVELOPING-STRATEGIES.md +713 -0
  45. package/docs/wallet/README.md +47 -0
  46. package/docs/wallet/STRATEGY.md +89 -0
  47. package/next.config.ts +21 -0
  48. package/package.json +151 -0
  49. package/postcss.config.mjs +8 -0
  50. package/prisma/migrations/20260214170000_baseline/migration.sql +511 -0
  51. package/prisma/migrations/20260216214537_add_passkey_model/migration.sql +18 -0
  52. package/prisma/migrations/20260217150500_add_credential_access_audit/migration.sql +31 -0
  53. package/prisma/migrations/migration_lock.toml +3 -0
  54. package/prisma/schema.prisma +447 -0
  55. package/public/logo-chevron.svg +31 -0
  56. package/public/logo-concentric.svg +31 -0
  57. package/public/logo-crosshatch.svg +39 -0
  58. package/public/logo-dashed.svg +39 -0
  59. package/public/logo-horizontal.svg +31 -0
  60. package/public/logo-m56.svg +64 -0
  61. package/public/logo.webp +0 -0
  62. package/scripts/add-app.js +245 -0
  63. package/scripts/init.sh +57 -0
  64. package/scripts/migrate-apikeys-to-credentials.ts +35 -0
  65. package/scripts/sandbox-agent-flow.sh +235 -0
  66. package/scripts/sandbox.sh +175 -0
  67. package/scripts/validate-job-docs.mjs +125 -0
  68. package/server/abi/SwapHelper.json +438 -0
  69. package/server/cli/approval.ts +447 -0
  70. package/server/cli/commands/app.ts +204 -0
  71. package/server/cli/commands/cron.ts +24 -0
  72. package/server/cli/commands/doctor.ts +1007 -0
  73. package/server/cli/commands/env.ts +456 -0
  74. package/server/cli/commands/init.ts +752 -0
  75. package/server/cli/commands/mcp.ts +125 -0
  76. package/server/cli/commands/restore.ts +314 -0
  77. package/server/cli/commands/shell-hook.ts +468 -0
  78. package/server/cli/commands/start.ts +62 -0
  79. package/server/cli/commands/status.ts +59 -0
  80. package/server/cli/commands/stop.ts +14 -0
  81. package/server/cli/commands/token.ts +180 -0
  82. package/server/cli/commands/unlock.ts +49 -0
  83. package/server/cli/commands/vault.ts +417 -0
  84. package/server/cli/index.ts +328 -0
  85. package/server/cli/lib/aura-parser.ts +64 -0
  86. package/server/cli/lib/credential-create.ts +74 -0
  87. package/server/cli/lib/credential-resolve.ts +254 -0
  88. package/server/cli/lib/dotenv-migrate.ts +116 -0
  89. package/server/cli/lib/dotenv-parser.ts +146 -0
  90. package/server/cli/lib/http.ts +91 -0
  91. package/server/cli/lib/init-steps.ts +76 -0
  92. package/server/cli/lib/local-agent-trust.ts +45 -0
  93. package/server/cli/lib/process.ts +136 -0
  94. package/server/cli/lib/prompt.ts +85 -0
  95. package/server/cli/lib/theme.ts +240 -0
  96. package/server/cli/socket.ts +570 -0
  97. package/server/cli/transport-client.ts +50 -0
  98. package/server/cron/index.ts +137 -0
  99. package/server/cron/job.ts +31 -0
  100. package/server/cron/jobs/balance-sync.ts +436 -0
  101. package/server/cron/jobs/incoming-scan.ts +506 -0
  102. package/server/cron/jobs/native-price.ts +70 -0
  103. package/server/cron/jobs/orphan-cleanup.ts +40 -0
  104. package/server/cron/jobs/strategy-runner.ts +175 -0
  105. package/server/cron/scheduler.ts +125 -0
  106. package/server/index.ts +406 -0
  107. package/server/lib/adapters/factory.ts +110 -0
  108. package/server/lib/adapters/index.ts +19 -0
  109. package/server/lib/adapters/router.ts +297 -0
  110. package/server/lib/adapters/telegram.ts +645 -0
  111. package/server/lib/adapters/types.ts +89 -0
  112. package/server/lib/adapters/webhook.ts +95 -0
  113. package/server/lib/address.ts +49 -0
  114. package/server/lib/agent-auth/contracts.ts +1194 -0
  115. package/server/lib/agent-profiles.ts +328 -0
  116. package/server/lib/ai.ts +285 -0
  117. package/server/lib/api-registry/contracts.ts +86 -0
  118. package/server/lib/api-registry/validation.ts +172 -0
  119. package/server/lib/apikey-migration.ts +189 -0
  120. package/server/lib/app-installer.ts +505 -0
  121. package/server/lib/app-tokens.ts +247 -0
  122. package/server/lib/auth.ts +314 -0
  123. package/server/lib/batch.ts +242 -0
  124. package/server/lib/cold.ts +874 -0
  125. package/server/lib/config.ts +381 -0
  126. package/server/lib/credential-access-audit.ts +85 -0
  127. package/server/lib/credential-access-policy.ts +110 -0
  128. package/server/lib/credential-health.ts +343 -0
  129. package/server/lib/credential-import.ts +487 -0
  130. package/server/lib/credential-scope.ts +87 -0
  131. package/server/lib/credential-shares.ts +190 -0
  132. package/server/lib/credential-transport.ts +342 -0
  133. package/server/lib/credential-vault.ts +77 -0
  134. package/server/lib/credentials.ts +333 -0
  135. package/server/lib/crypto.ts +8 -0
  136. package/server/lib/db.ts +15 -0
  137. package/server/lib/defaults.ts +366 -0
  138. package/server/lib/dex/index.ts +80 -0
  139. package/server/lib/dex/relay.ts +235 -0
  140. package/server/lib/dex/types.ts +59 -0
  141. package/server/lib/dex/uniswap.ts +370 -0
  142. package/server/lib/e2e-agent/artifacts.ts +36 -0
  143. package/server/lib/e2e-agent/contracts.ts +112 -0
  144. package/server/lib/e2e-agent/validation.ts +135 -0
  145. package/server/lib/encrypt.ts +128 -0
  146. package/server/lib/error.ts +20 -0
  147. package/server/lib/events.ts +205 -0
  148. package/server/lib/hot.ts +357 -0
  149. package/server/lib/key-fingerprint.ts +28 -0
  150. package/server/lib/logger.ts +331 -0
  151. package/server/lib/network.ts +137 -0
  152. package/server/lib/notifications.ts +219 -0
  153. package/server/lib/oauth2-refresh.ts +241 -0
  154. package/server/lib/oursecret.ts +54 -0
  155. package/server/lib/passkey-credential.ts +360 -0
  156. package/server/lib/passkey.ts +68 -0
  157. package/server/lib/permissions.ts +248 -0
  158. package/server/lib/pino.ts +24 -0
  159. package/server/lib/policy-preview.ts +138 -0
  160. package/server/lib/price.ts +338 -0
  161. package/server/lib/prices.ts +34 -0
  162. package/server/lib/project-scope.ts +239 -0
  163. package/server/lib/resolve-action.ts +427 -0
  164. package/server/lib/resolve.ts +36 -0
  165. package/server/lib/sessions.ts +632 -0
  166. package/server/lib/solana/connection.ts +26 -0
  167. package/server/lib/solana/jupiter.ts +128 -0
  168. package/server/lib/solana/transfer.ts +108 -0
  169. package/server/lib/solana/wallet.ts +136 -0
  170. package/server/lib/strategy/emits.ts +21 -0
  171. package/server/lib/strategy/engine.ts +1305 -0
  172. package/server/lib/strategy/executor.ts +115 -0
  173. package/server/lib/strategy/hook-context.ts +158 -0
  174. package/server/lib/strategy/hooks.ts +990 -0
  175. package/server/lib/strategy/index.ts +28 -0
  176. package/server/lib/strategy/installer.ts +305 -0
  177. package/server/lib/strategy/loader.ts +256 -0
  178. package/server/lib/strategy/message.ts +235 -0
  179. package/server/lib/strategy/repository.ts +218 -0
  180. package/server/lib/strategy/session-logger.ts +693 -0
  181. package/server/lib/strategy/sources.ts +288 -0
  182. package/server/lib/strategy/state.ts +189 -0
  183. package/server/lib/strategy/templates.ts +403 -0
  184. package/server/lib/strategy/tick.ts +404 -0
  185. package/server/lib/strategy/types.ts +230 -0
  186. package/server/lib/swap.ts +3 -0
  187. package/server/lib/temp.ts +86 -0
  188. package/server/lib/token-metadata.ts +86 -0
  189. package/server/lib/token-safety.ts +200 -0
  190. package/server/lib/token-search.ts +444 -0
  191. package/server/lib/totp.ts +194 -0
  192. package/server/lib/transactions.ts +123 -0
  193. package/server/lib/transport.ts +75 -0
  194. package/server/lib/txhistory/decoder.ts +262 -0
  195. package/server/lib/txhistory/enricher.ts +652 -0
  196. package/server/lib/txhistory/index.ts +391 -0
  197. package/server/lib/txhistory/signatures.ts +59 -0
  198. package/server/lib/verified-summary.ts +421 -0
  199. package/server/mcp/profile-policy.ts +30 -0
  200. package/server/mcp/server.ts +619 -0
  201. package/server/mcp/tools.ts +523 -0
  202. package/server/middleware/auth.ts +119 -0
  203. package/server/middleware/requestLogger.ts +84 -0
  204. package/server/routes/actions.ts +459 -0
  205. package/server/routes/adapters.ts +703 -0
  206. package/server/routes/addressbook.ts +113 -0
  207. package/server/routes/ai.ts +34 -0
  208. package/server/routes/apikeys.ts +295 -0
  209. package/server/routes/apps.ts +601 -0
  210. package/server/routes/auth.ts +457 -0
  211. package/server/routes/backup.ts +340 -0
  212. package/server/routes/batch.ts +270 -0
  213. package/server/routes/bookmarks.ts +162 -0
  214. package/server/routes/credential-shares.ts +198 -0
  215. package/server/routes/credential-vaults.ts +154 -0
  216. package/server/routes/credentials.ts +1290 -0
  217. package/server/routes/dashboard.ts +71 -0
  218. package/server/routes/defaults.ts +124 -0
  219. package/server/routes/fund.ts +229 -0
  220. package/server/routes/import.ts +352 -0
  221. package/server/routes/launch.ts +665 -0
  222. package/server/routes/lock.ts +54 -0
  223. package/server/routes/logs.ts +68 -0
  224. package/server/routes/nuke.ts +111 -0
  225. package/server/routes/passkey-credentials.ts +99 -0
  226. package/server/routes/passkey.ts +346 -0
  227. package/server/routes/portfolio.ts +217 -0
  228. package/server/routes/price.ts +63 -0
  229. package/server/routes/resolve.ts +31 -0
  230. package/server/routes/security.ts +45 -0
  231. package/server/routes/send-evm.ts +241 -0
  232. package/server/routes/send-solana.ts +281 -0
  233. package/server/routes/send.ts +178 -0
  234. package/server/routes/setup.ts +210 -0
  235. package/server/routes/strategy.ts +894 -0
  236. package/server/routes/swap-evm.ts +353 -0
  237. package/server/routes/swap-solana.ts +177 -0
  238. package/server/routes/swap.ts +356 -0
  239. package/server/routes/token.ts +247 -0
  240. package/server/routes/unlock.ts +403 -0
  241. package/server/routes/wallet-assets.ts +361 -0
  242. package/server/routes/wallet-transactions.ts +515 -0
  243. package/server/routes/wallet.ts +710 -0
  244. package/server/types.ts +146 -0
  245. package/skills/aurawallet/SKILL.md +739 -0
  246. package/skills/aurawallet-setup/SKILL.md +74 -0
  247. package/skills/security-review/SKILL.md +148 -0
  248. package/src/app/api/agent-requests/route.ts +30 -0
  249. package/src/app/api/apps/install/route.ts +126 -0
  250. package/src/app/api/apps/manifests/route.ts +16 -0
  251. package/src/app/api/apps/static/[...path]/route.ts +57 -0
  252. package/src/app/api/events/route.ts +92 -0
  253. package/src/app/api/page.tsx +212 -0
  254. package/src/app/api/workspace/[id]/apps/[wid]/route.ts +119 -0
  255. package/src/app/api/workspace/[id]/apps/route.ts +81 -0
  256. package/src/app/api/workspace/[id]/export/route.ts +67 -0
  257. package/src/app/api/workspace/[id]/route.ts +168 -0
  258. package/src/app/api/workspace/auth.ts +34 -0
  259. package/src/app/api/workspace/config/route.ts +106 -0
  260. package/src/app/api/workspace/import/route.ts +127 -0
  261. package/src/app/api/workspace/route.ts +116 -0
  262. package/src/app/app/page.tsx +2122 -0
  263. package/src/app/apple-icon.png +0 -0
  264. package/src/app/docs/page.tsx +178 -0
  265. package/src/app/favicon.ico +0 -0
  266. package/src/app/globals.css +572 -0
  267. package/src/app/health/page.tsx +5 -0
  268. package/src/app/hello/page.tsx +15 -0
  269. package/src/app/icon.png +0 -0
  270. package/src/app/layout.tsx +34 -0
  271. package/src/app/page.tsx +986 -0
  272. package/src/app/providers.tsx +90 -0
  273. package/src/app/share/[token]/page.tsx +295 -0
  274. package/src/components/ChainSelector.tsx +144 -0
  275. package/src/components/HumanActionBar.tsx +695 -0
  276. package/src/components/NotificationDrawer.tsx +129 -0
  277. package/src/components/apps/AgentKeysApp.tsx +490 -0
  278. package/src/components/apps/App.tsx +153 -0
  279. package/src/components/apps/AppGrid.tsx +15 -0
  280. package/src/components/apps/DetailedAddressDrawer.tsx +325 -0
  281. package/src/components/apps/DraggableApp.tsx +562 -0
  282. package/src/components/apps/IFrameApp.tsx +73 -0
  283. package/src/components/apps/LogsApp.tsx +360 -0
  284. package/src/components/apps/SendApp.tsx +394 -0
  285. package/src/components/apps/SetupWizardApp.tsx +1004 -0
  286. package/src/components/apps/SystemDefaultsApp.tsx +845 -0
  287. package/src/components/apps/ThirdPartyApp.tsx +428 -0
  288. package/src/components/apps/TokenApp.tsx +319 -0
  289. package/src/components/apps/TransactionsApp.tsx +438 -0
  290. package/src/components/apps/WalletDetailApp.tsx +1505 -0
  291. package/src/components/apps/index.ts +13 -0
  292. package/src/components/design-system/Button.tsx +53 -0
  293. package/src/components/design-system/ChainIndicator.tsx +65 -0
  294. package/src/components/design-system/ChainSelector.tsx +137 -0
  295. package/src/components/design-system/ConfirmationModal.tsx +106 -0
  296. package/src/components/design-system/ConfirmationPopover.tsx +81 -0
  297. package/src/components/design-system/Drawer.tsx +123 -0
  298. package/src/components/design-system/FilterDropdown.tsx +72 -0
  299. package/src/components/design-system/Modal.tsx +206 -0
  300. package/src/components/design-system/Popover.tsx +142 -0
  301. package/src/components/design-system/TextInput.tsx +85 -0
  302. package/src/components/design-system/Toggle.tsx +58 -0
  303. package/src/components/design-system/index.ts +11 -0
  304. package/src/components/docs/DocsThemeToggle.tsx +49 -0
  305. package/src/components/health/CredentialHealthDashboard.tsx +214 -0
  306. package/src/components/icons/ChainIcons.tsx +72 -0
  307. package/src/components/layout/AppStoreDrawer.tsx +369 -0
  308. package/src/components/layout/ContentArea.tsx +21 -0
  309. package/src/components/layout/TabBar.tsx +278 -0
  310. package/src/components/layout/WalletSidebar.tsx +1033 -0
  311. package/src/components/layout/index.ts +4 -0
  312. package/src/components/marketing/AuraWalletSpecOverlay.tsx +635 -0
  313. package/src/components/marketing/DeviceMorphExperience.tsx +216 -0
  314. package/src/components/vault/ApiKeysConsole.tsx +1080 -0
  315. package/src/components/vault/AuditConsole.tsx +584 -0
  316. package/src/components/vault/CredentialDetail.tsx +455 -0
  317. package/src/components/vault/CredentialEmpty.tsx +55 -0
  318. package/src/components/vault/CredentialField.tsx +361 -0
  319. package/src/components/vault/CredentialForm.tsx +1212 -0
  320. package/src/components/vault/CredentialList.tsx +165 -0
  321. package/src/components/vault/CredentialRow.tsx +97 -0
  322. package/src/components/vault/CredentialShareModal.tsx +178 -0
  323. package/src/components/vault/CredentialVault.tsx +754 -0
  324. package/src/components/vault/CredentialWalletWidget.tsx +103 -0
  325. package/src/components/vault/ImportCredentialsModal.tsx +515 -0
  326. package/src/components/vault/LargeTypeModal.tsx +64 -0
  327. package/src/components/vault/PasswordGenerator.tsx +224 -0
  328. package/src/components/vault/TOTPDisplay.tsx +123 -0
  329. package/src/components/vault/VaultSidebar.tsx +413 -0
  330. package/src/components/vault/types.ts +54 -0
  331. package/src/context/AuthContext.tsx +337 -0
  332. package/src/context/PriceContext.tsx +113 -0
  333. package/src/context/ThemeContext.tsx +164 -0
  334. package/src/context/WebSocketContext.tsx +269 -0
  335. package/src/context/WorkspaceContext.tsx +668 -0
  336. package/src/hooks/index.ts +3 -0
  337. package/src/hooks/useAgentActions.ts +368 -0
  338. package/src/hooks/useBalance.ts +103 -0
  339. package/src/hooks/useBalances.ts +129 -0
  340. package/src/instrumentation.ts +12 -0
  341. package/src/lib/api.ts +449 -0
  342. package/src/lib/app-loader.ts +148 -0
  343. package/src/lib/app-registry.ts +178 -0
  344. package/src/lib/app-sdk.ts +157 -0
  345. package/src/lib/audit-console-adapter.ts +151 -0
  346. package/src/lib/auth-client.ts +75 -0
  347. package/src/lib/config.ts +74 -0
  348. package/src/lib/crypto.ts +112 -0
  349. package/src/lib/db.ts +21 -0
  350. package/src/lib/docs.ts +390 -0
  351. package/src/lib/events.ts +361 -0
  352. package/src/lib/pino.ts +24 -0
  353. package/src/lib/theme-handlers.ts +168 -0
  354. package/src/lib/theme.ts +351 -0
  355. package/src/lib/tokenData.ts +378 -0
  356. package/src/lib/vault-crypto.ts +129 -0
  357. package/src/lib/websocket-server.ts +302 -0
  358. package/src/lib/websocket-setup.ts +79 -0
  359. package/src/lib/wordlist.ts +2050 -0
  360. package/src/lib/workspace-handlers.ts +285 -0
  361. package/start.sh +80 -0
  362. package/tailwind.config.ts +99 -0
  363. package/tsconfig.json +42 -0
@@ -0,0 +1,285 @@
1
+ import { prisma } from './db';
2
+ import {
3
+ WORKSPACE_EVENTS,
4
+ WorkspaceEvent,
5
+ WorkspaceData,
6
+ AppData,
7
+ AppUpdateData,
8
+ WorkspaceStateRequestData,
9
+ WorkspaceStateResponseData,
10
+ WorkspaceImportData,
11
+ createWorkspaceEvent,
12
+ } from './events';
13
+
14
+ /**
15
+ * Handle incoming workspace WebSocket messages
16
+ * Returns a response event if one should be sent back to the sender
17
+ */
18
+ export async function handleWorkspaceMessage(
19
+ msg: WorkspaceEvent
20
+ ): Promise<WorkspaceEvent | null> {
21
+ console.log(`[WS] Handling workspace message: ${msg.type}`);
22
+
23
+ switch (msg.type) {
24
+ case WORKSPACE_EVENTS.STATE_REQUEST:
25
+ return handleStateRequest(msg.data as WorkspaceStateRequestData);
26
+
27
+ case WORKSPACE_EVENTS.WORKSPACE_CREATED:
28
+ await handleWorkspaceCreated(msg.data as WorkspaceData);
29
+ return null;
30
+
31
+ case WORKSPACE_EVENTS.WORKSPACE_DELETED:
32
+ await handleWorkspaceDeleted(msg.data as { workspaceId: string });
33
+ return null;
34
+
35
+ case WORKSPACE_EVENTS.WORKSPACE_UPDATED:
36
+ await handleWorkspaceUpdated(msg.data as WorkspaceData);
37
+ return null;
38
+
39
+ case WORKSPACE_EVENTS.APP_ADDED:
40
+ await handleAppAdded(msg.data as AppData);
41
+ return null;
42
+
43
+ case WORKSPACE_EVENTS.APP_REMOVED:
44
+ await handleAppRemoved(msg.data as { appId: string });
45
+ return null;
46
+
47
+ case WORKSPACE_EVENTS.APP_UPDATED:
48
+ await handleAppUpdated(msg.data as AppUpdateData);
49
+ return null;
50
+
51
+ case WORKSPACE_EVENTS.WORKSPACE_SAVE:
52
+ await handleWorkspaceSave(msg.data as { workspaceId: string });
53
+ return null;
54
+
55
+ case WORKSPACE_EVENTS.WORKSPACE_IMPORT:
56
+ await handleWorkspaceImport(msg.data as WorkspaceImportData);
57
+ return null;
58
+
59
+ default:
60
+ console.warn(`[WS] Unknown workspace event type: ${msg.type}`);
61
+ return null;
62
+ }
63
+ }
64
+
65
+ async function handleStateRequest(
66
+ data: WorkspaceStateRequestData
67
+ ): Promise<WorkspaceEvent<WorkspaceStateResponseData>> {
68
+ // Get all workspaces
69
+ const workspaces = await prisma.workspace.findMany({
70
+ orderBy: { order: 'asc' },
71
+ });
72
+
73
+ // Find the default or first workspace
74
+ let activeWorkspaceId: string = data.workspaceId ?? '';
75
+ if (!activeWorkspaceId) {
76
+ const defaultWorkspace = workspaces.find((w: any) => w.isDefault) || workspaces[0];
77
+ activeWorkspaceId = defaultWorkspace?.id || '';
78
+ }
79
+
80
+ // Get apps for the active workspace
81
+ const apps = activeWorkspaceId
82
+ ? await prisma.workspaceApp.findMany({
83
+ where: { workspaceId: activeWorkspaceId },
84
+ })
85
+ : [];
86
+
87
+ const response: WorkspaceStateResponseData = {
88
+ requestId: data.requestId,
89
+ workspaces: workspaces.map((w: any) => ({
90
+ id: w.id,
91
+ name: w.name,
92
+ slug: w.slug,
93
+ icon: w.icon || undefined,
94
+ emoji: w.emoji || undefined,
95
+ color: w.color || undefined,
96
+ order: w.order,
97
+ isDefault: w.isDefault,
98
+ isCloseable: w.isCloseable,
99
+ })),
100
+ activeWorkspaceId,
101
+ apps: apps.map((w: any) => ({
102
+ id: w.id,
103
+ workspaceId: w.workspaceId,
104
+ appType: w.appType,
105
+ x: w.x,
106
+ y: w.y,
107
+ width: w.width,
108
+ height: w.height,
109
+ zIndex: w.zIndex,
110
+ isVisible: w.isVisible,
111
+ isLocked: w.isLocked,
112
+ config: w.config ? JSON.parse(w.config) : undefined,
113
+ })),
114
+ };
115
+
116
+ return createWorkspaceEvent(WORKSPACE_EVENTS.STATE_RESPONSE, response, 'server');
117
+ }
118
+
119
+ async function handleWorkspaceCreated(data: WorkspaceData): Promise<void> {
120
+ // Generate a unique slug from the name
121
+ const baseSlug = data.slug || data.name.toLowerCase().replace(/[^a-z0-9]+/g, '-');
122
+ let slug = baseSlug;
123
+ let counter = 1;
124
+
125
+ // Ensure slug is unique
126
+ while (await prisma.workspace.findUnique({ where: { slug } })) {
127
+ slug = `${baseSlug}-${counter}`;
128
+ counter++;
129
+ }
130
+
131
+ // Get the next order value
132
+ const maxOrder = await prisma.workspace.aggregate({
133
+ _max: { order: true },
134
+ });
135
+ const order = data.order ?? (maxOrder._max.order ?? -1) + 1;
136
+
137
+ await prisma.workspace.create({
138
+ data: {
139
+ id: data.id,
140
+ name: data.name,
141
+ slug,
142
+ icon: data.icon,
143
+ emoji: data.emoji,
144
+ color: data.color,
145
+ order,
146
+ isDefault: data.isDefault ?? false,
147
+ isCloseable: data.isCloseable ?? true,
148
+ },
149
+ });
150
+
151
+ console.log(`[WS] Created workspace: ${data.name} (${slug})`);
152
+ }
153
+
154
+ async function handleWorkspaceDeleted(data: { workspaceId: string }): Promise<void> {
155
+ // Cascade delete will remove associated apps
156
+ await prisma.workspace.delete({
157
+ where: { id: data.workspaceId },
158
+ });
159
+
160
+ console.log(`[WS] Deleted workspace: ${data.workspaceId}`);
161
+ }
162
+
163
+ async function handleWorkspaceUpdated(data: WorkspaceData): Promise<void> {
164
+ // Only include fields that are explicitly provided (not undefined)
165
+ const updateData: Record<string, unknown> = {};
166
+ if (data.name !== undefined) updateData.name = data.name;
167
+ if (data.icon !== undefined) updateData.icon = data.icon;
168
+ if (data.emoji !== undefined) updateData.emoji = data.emoji || null;
169
+ if (data.color !== undefined) updateData.color = data.color || null;
170
+ if (data.order !== undefined) updateData.order = data.order;
171
+ if (data.isDefault !== undefined) updateData.isDefault = data.isDefault;
172
+ if (data.isCloseable !== undefined) updateData.isCloseable = data.isCloseable;
173
+
174
+ await prisma.workspace.update({
175
+ where: { id: data.id },
176
+ data: updateData,
177
+ });
178
+
179
+ console.log(`[WS] Updated workspace: ${data.id}`);
180
+ }
181
+
182
+ async function handleAppAdded(data: AppData): Promise<void> {
183
+ // Get the next zIndex for this workspace
184
+ const maxZ = await prisma.workspaceApp.aggregate({
185
+ where: { workspaceId: data.workspaceId },
186
+ _max: { zIndex: true },
187
+ });
188
+ const zIndex = data.zIndex ?? (maxZ._max.zIndex ?? 9) + 1;
189
+
190
+ await prisma.workspaceApp.create({
191
+ data: {
192
+ id: data.id,
193
+ workspaceId: data.workspaceId,
194
+ appType: data.appType,
195
+ x: data.x ?? 20,
196
+ y: data.y ?? 20,
197
+ width: data.width ?? 320,
198
+ height: data.height ?? 280,
199
+ zIndex,
200
+ isVisible: data.isVisible ?? true,
201
+ isLocked: data.isLocked ?? false,
202
+ config: data.config ? JSON.stringify(data.config) : null,
203
+ },
204
+ });
205
+
206
+ console.log(`[WS] Added app: ${data.appType} to workspace ${data.workspaceId}`);
207
+ }
208
+
209
+ async function handleAppRemoved(data: { appId: string }): Promise<void> {
210
+ await prisma.workspaceApp.delete({
211
+ where: { id: data.appId },
212
+ });
213
+
214
+ console.log(`[WS] Removed app: ${data.appId}`);
215
+ }
216
+
217
+ async function handleAppUpdated(data: AppUpdateData): Promise<void> {
218
+ const updateData: Record<string, unknown> = {};
219
+
220
+ if (data.x !== undefined) updateData.x = data.x;
221
+ if (data.y !== undefined) updateData.y = data.y;
222
+ if (data.width !== undefined) updateData.width = data.width;
223
+ if (data.height !== undefined) updateData.height = data.height;
224
+ if (data.zIndex !== undefined) updateData.zIndex = data.zIndex;
225
+ if (data.isVisible !== undefined) updateData.isVisible = data.isVisible;
226
+ if (data.isLocked !== undefined) updateData.isLocked = data.isLocked;
227
+ if (data.config !== undefined) updateData.config = JSON.stringify(data.config);
228
+
229
+ await prisma.workspaceApp.update({
230
+ where: { id: data.appId },
231
+ data: updateData,
232
+ });
233
+
234
+ console.log(`[WS] Updated app: ${data.appId}`);
235
+ }
236
+
237
+ async function handleWorkspaceSave(data: { workspaceId: string }): Promise<void> {
238
+ // Touch the updatedAt timestamp to indicate a save
239
+ await prisma.workspace.update({
240
+ where: { id: data.workspaceId },
241
+ data: { updatedAt: new Date() },
242
+ });
243
+
244
+ console.log(`[WS] Saved workspace: ${data.workspaceId}`);
245
+ }
246
+
247
+ async function handleWorkspaceImport(data: WorkspaceImportData): Promise<void> {
248
+ const { workspace, apps } = data;
249
+
250
+ // Create the workspace
251
+ await handleWorkspaceCreated(workspace);
252
+
253
+ // Create all apps
254
+ for (const app of apps) {
255
+ await handleAppAdded({
256
+ ...app,
257
+ workspaceId: workspace.id,
258
+ });
259
+ }
260
+
261
+ console.log(`[WS] Imported workspace: ${workspace.name} with ${apps.length} apps`);
262
+ }
263
+
264
+ /**
265
+ * Ensure a default "HOME" workspace exists
266
+ */
267
+ export async function ensureDefaultWorkspace(): Promise<void> {
268
+ const existing = await prisma.workspace.findFirst({
269
+ where: { isDefault: true },
270
+ });
271
+
272
+ if (!existing) {
273
+ await prisma.workspace.create({
274
+ data: {
275
+ name: 'HOME',
276
+ slug: 'home',
277
+ icon: 'Home',
278
+ order: 0,
279
+ isDefault: true,
280
+ isCloseable: false,
281
+ },
282
+ });
283
+ console.log('[WS] Created default HOME workspace');
284
+ }
285
+ }
package/start.sh ADDED
@@ -0,0 +1,80 @@
1
+ #!/bin/bash
2
+
3
+ # Start Aura Wallet - both server and UI
4
+
5
+ MODE="${1:-dev}" # Default to dev mode if no argument provided
6
+
7
+ echo "Starting Aura Wallet in ${MODE} mode..."
8
+
9
+ # Kill any existing processes
10
+ pkill -f "tsx server/index.ts" 2>/dev/null
11
+ pkill -f "tsx watch server/index.ts" 2>/dev/null
12
+ pkill -f "tsx server/cron/index.ts" 2>/dev/null
13
+ pkill -f "next dev" 2>/dev/null
14
+ pkill -f "next start" 2>/dev/null
15
+
16
+ if [ "$MODE" = "prod" ] || [ "$MODE" = "production" ]; then
17
+ # Production mode
18
+ echo "Building Next.js..."
19
+ npm run build
20
+
21
+ echo "Starting wallet server on :4242..."
22
+ npm run server &
23
+ SERVER_PID=$!
24
+
25
+ echo "Starting cron server (balance sync, price sync)..."
26
+ npx tsx server/cron/index.ts &
27
+ CRON_PID=$!
28
+
29
+ sleep 2
30
+
31
+ echo "Starting Next.js production server on :4747..."
32
+ npm run start &
33
+ UI_PID=$!
34
+
35
+ MODE_LABEL="PRODUCTION"
36
+ else
37
+ # Development mode (default)
38
+ export BYPASS_RATE_LIMIT=true
39
+ # Keep internal docs visible in local dev unless explicitly overridden.
40
+ if [ -z "${NEXT_PUBLIC_SHOW_INTERNAL_DOCS}" ]; then
41
+ export NEXT_PUBLIC_SHOW_INTERNAL_DOCS=true
42
+ fi
43
+ echo "Internal docs visibility: NEXT_PUBLIC_SHOW_INTERNAL_DOCS=${NEXT_PUBLIC_SHOW_INTERNAL_DOCS}"
44
+
45
+ echo "Starting wallet server (dev) on :4242..."
46
+ npm run server:dev &
47
+ SERVER_PID=$!
48
+
49
+ echo "Starting cron server (balance sync, price sync)..."
50
+ npx tsx server/cron/index.ts &
51
+ CRON_PID=$!
52
+
53
+ sleep 2
54
+
55
+ echo "Starting Next.js dev server on :4747..."
56
+ npm run dev &
57
+ UI_PID=$!
58
+
59
+ MODE_LABEL="DEVELOPMENT"
60
+ fi
61
+
62
+ echo ""
63
+ echo "╔════════════════════════════════════════════╗"
64
+ echo "║ AURA WALLET RUNNING ║"
65
+ echo "╠════════════════════════════════════════════╣"
66
+ echo "║ Mode: ${MODE_LABEL} "
67
+ echo "║ Wallet Server: http://localhost:4242 ║"
68
+ echo "║ WebSocket: ws://localhost:4748 ║"
69
+ echo "║ Cron Server: background (balance sync) ║"
70
+ echo "║ Web UI: http://localhost:4747 ║"
71
+ echo "╠════════════════════════════════════════════╣"
72
+ echo "║ Press Ctrl+C to stop both services ║"
73
+ echo "╚════════════════════════════════════════════╝"
74
+ echo ""
75
+
76
+ # Handle Ctrl+C - kill both processes
77
+ trap "echo 'Shutting down...'; kill $SERVER_PID $CRON_PID $UI_PID 2>/dev/null; exit" SIGINT SIGTERM
78
+
79
+ # Wait for either process to exit
80
+ wait
@@ -0,0 +1,99 @@
1
+ import type { Config } from "tailwindcss";
2
+
3
+ const config: Config = {
4
+ content: [
5
+ "./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
6
+ "./src/components/**/*.{js,ts,jsx,tsx,mdx}",
7
+ "./src/app/**/*.{js,ts,jsx,tsx,mdx}",
8
+ ],
9
+ darkMode: ['selector', '[data-theme="dark"]'],
10
+ theme: {
11
+ extend: {
12
+ colors: {
13
+ // Legacy colors (preserved for backward compatibility)
14
+ voltage: '#ccff00',
15
+ void: '#0a0a0a',
16
+ tyvek: '#ffffff',
17
+ concrete: '#d4d4d8',
18
+ surgical: '#00f0ff',
19
+ alert: '#ff4d00',
20
+ 'clinical-blue': '#0047ff',
21
+ 'warning-orange': '#FF4D00',
22
+ 'tyvek-dim': '#F0F0F0',
23
+ ink: '#050505',
24
+ signal: '#00FF41',
25
+
26
+ // Theme-aware colors using CSS variables
27
+ theme: {
28
+ accent: 'var(--color-accent, #ccff00)',
29
+ 'accent-foreground': 'var(--color-accent-foreground, #0a0a0a)',
30
+ warning: 'var(--color-warning, #ff4d00)',
31
+ 'warning-foreground': 'var(--color-warning-foreground, #ffffff)',
32
+ danger: 'var(--color-danger, #ef4444)',
33
+ 'danger-foreground': 'var(--color-danger-foreground, #ffffff)',
34
+ success: 'var(--color-success, #00c853)',
35
+ 'success-foreground': 'var(--color-success-foreground, #ffffff)',
36
+ info: 'var(--color-info, #0047ff)',
37
+ 'info-foreground': 'var(--color-info-foreground, #ffffff)',
38
+ background: 'var(--color-background, #f5f5f5)',
39
+ 'background-alt': 'var(--color-background-alt, #e8e8e6)',
40
+ surface: 'var(--color-surface, #ffffff)',
41
+ 'surface-alt': 'var(--color-surface-alt, #fafafa)',
42
+ text: 'var(--color-text, #0a0a0a)',
43
+ 'text-muted': 'var(--color-text-muted, #6b7280)',
44
+ 'text-faint': 'var(--color-text-faint, #9ca3af)',
45
+ border: 'var(--color-border, #d4d4d8)',
46
+ 'border-muted': 'var(--color-border-muted, #e5e5e5)',
47
+ 'border-focus': 'var(--color-border-focus, #0a0a0a)',
48
+ },
49
+ },
50
+ fontFamily: {
51
+ sans: ['Inter', 'system-ui', 'sans-serif'],
52
+ mono: ['JetBrains Mono', 'Menlo', 'monospace'],
53
+ },
54
+ backgroundImage: {
55
+ 'noise': "url('data:image/svg+xml,%3Csvg viewBox=\"0 0 200 200\" xmlns=\"http://www.w3.org/2000/svg\"%3E%3Cfilter id=\"noiseFilter\"%3E%3CfeTurbulence type=\"fractalNoise\" baseFrequency=\"0.9\" numOctaves=\"3\" stitchTiles=\"stitch\"/%3E%3C/filter%3E%3Crect width=\"100%25\" height=\"100%25\" filter=\"url(%23noiseFilter)\" opacity=\"0.05\"/%3E%3C/svg%3E')",
56
+ 'grid-pattern': "linear-gradient(to right, #e5e5e5 1px, transparent 1px), linear-gradient(to bottom, #e5e5e5 1px, transparent 1px)",
57
+ 'grid-pattern-dark': "linear-gradient(to right, rgba(255,255,255,0.06) 1px, transparent 1px), linear-gradient(to bottom, rgba(255,255,255,0.06) 1px, transparent 1px)",
58
+ 'hazard-stripes': "repeating-linear-gradient(135deg, transparent, transparent 10px, rgba(204,255,0,0.06) 10px, rgba(204,255,0,0.06) 20px)",
59
+ },
60
+ animation: {
61
+ 'slam': 'slam 0.4s cubic-bezier(0.19, 1, 0.22, 1) forwards',
62
+ 'flash': 'flash 2s infinite',
63
+ 'ticker': 'ticker 30s linear infinite',
64
+ 'pulse-fast': 'pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
65
+ 'spin-slow': 'spin 3s linear infinite',
66
+ 'scan-vertical': 'scan-vertical 3s linear infinite',
67
+ 'app-focus': 'app-focus 0.25s cubic-bezier(0.34, 1.56, 0.64, 1)',
68
+ },
69
+ keyframes: {
70
+ slam: {
71
+ '0%': { transform: 'scale(1.05) translateY(20px)', opacity: '0' },
72
+ '100%': { transform: 'scale(1) translateY(0)', opacity: '1' },
73
+ },
74
+ ticker: {
75
+ '0%': { transform: 'translateX(0)' },
76
+ '100%': { transform: 'translateX(-100%)' },
77
+ },
78
+ flash: {
79
+ '0%, 100%': { opacity: '1' },
80
+ '50%': { opacity: '0.3' },
81
+ },
82
+ 'scan-vertical': {
83
+ '0%': { top: '0', opacity: '0' },
84
+ '10%': { opacity: '1' },
85
+ '90%': { opacity: '1' },
86
+ '100%': { top: '100%', opacity: '0' },
87
+ },
88
+ 'app-focus': {
89
+ '0%': { transform: 'scale(1)' },
90
+ '40%': { transform: 'scale(1.03)' },
91
+ '100%': { transform: 'scale(1)' },
92
+ }
93
+ }
94
+ },
95
+ },
96
+ plugins: [],
97
+ };
98
+
99
+ export default config;
package/tsconfig.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "compilerOptions": {
3
+ "lib": [
4
+ "dom",
5
+ "dom.iterable",
6
+ "esnext"
7
+ ],
8
+ "allowJs": true,
9
+ "skipLibCheck": true,
10
+ "strict": true,
11
+ "noEmit": true,
12
+ "esModuleInterop": true,
13
+ "module": "esnext",
14
+ "moduleResolution": "bundler",
15
+ "resolveJsonModule": true,
16
+ "isolatedModules": true,
17
+ "jsx": "preserve",
18
+ "incremental": true,
19
+ "plugins": [
20
+ {
21
+ "name": "next"
22
+ }
23
+ ],
24
+ "paths": {
25
+ "@/*": [
26
+ "./src/*"
27
+ ]
28
+ },
29
+ "target": "ES2017"
30
+ },
31
+ "include": [
32
+ "next-env.d.ts",
33
+ "**/*.ts",
34
+ "**/*.tsx",
35
+ ".next/types/**/*.ts"
36
+ ],
37
+ "exclude": [
38
+ "node_modules",
39
+ "server",
40
+ "extension"
41
+ ]
42
+ }