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,361 @@
1
+ /**
2
+ * Shared event types for WebSocket communication between
3
+ * Express (wallet layer) and Next.js (UI layer)
4
+ */
5
+
6
+ // ============================================================================
7
+ // WORKSPACE EVENTS - Programmatic workspace control
8
+ // ============================================================================
9
+
10
+ export const WORKSPACE_EVENTS = {
11
+ // Mutations (agent → UI)
12
+ WORKSPACE_CREATED: 'workspace:created',
13
+ WORKSPACE_DELETED: 'workspace:deleted',
14
+ WORKSPACE_UPDATED: 'workspace:updated',
15
+ APP_ADDED: 'app:added',
16
+ APP_REMOVED: 'app:removed',
17
+ APP_UPDATED: 'app:updated',
18
+
19
+ // Queries (agent → server → agent)
20
+ STATE_REQUEST: 'workspace:state:request',
21
+ STATE_RESPONSE: 'workspace:state:response',
22
+
23
+ // Persistence
24
+ WORKSPACE_SAVE: 'workspace:save',
25
+ WORKSPACE_LOAD: 'workspace:load',
26
+ WORKSPACE_EXPORT: 'workspace:export',
27
+ WORKSPACE_IMPORT: 'workspace:import',
28
+ } as const;
29
+
30
+ export type WorkspaceEventType = (typeof WORKSPACE_EVENTS)[keyof typeof WORKSPACE_EVENTS];
31
+
32
+ // Workspace event payload types
33
+ export interface WorkspaceData {
34
+ id: string;
35
+ name: string;
36
+ slug: string;
37
+ icon?: string;
38
+ emoji?: string;
39
+ color?: string;
40
+ order?: number;
41
+ isDefault?: boolean;
42
+ isCloseable?: boolean;
43
+ }
44
+
45
+ export interface AppData {
46
+ id?: string;
47
+ workspaceId: string;
48
+ appType: string;
49
+ x?: number;
50
+ y?: number;
51
+ width?: number;
52
+ height?: number;
53
+ zIndex?: number;
54
+ isVisible?: boolean;
55
+ isLocked?: boolean;
56
+ config?: Record<string, unknown>;
57
+ }
58
+
59
+ export interface AppUpdateData {
60
+ appId: string;
61
+ x?: number;
62
+ y?: number;
63
+ width?: number;
64
+ height?: number;
65
+ zIndex?: number;
66
+ isVisible?: boolean;
67
+ isLocked?: boolean;
68
+ config?: Record<string, unknown>;
69
+ }
70
+
71
+ export interface WorkspaceStateRequestData {
72
+ requestId: string;
73
+ workspaceId?: string;
74
+ }
75
+
76
+ export interface WorkspaceStateResponseData {
77
+ requestId: string;
78
+ workspaces: WorkspaceData[];
79
+ activeWorkspaceId: string;
80
+ apps: AppData[];
81
+ }
82
+
83
+ export interface WorkspaceImportData {
84
+ workspace: WorkspaceData;
85
+ apps: AppData[];
86
+ }
87
+
88
+ export type WorkspaceEventData =
89
+ | WorkspaceData
90
+ | AppData
91
+ | AppUpdateData
92
+ | WorkspaceStateRequestData
93
+ | WorkspaceStateResponseData
94
+ | WorkspaceImportData
95
+ | { appId: string }
96
+ | { workspaceId: string };
97
+
98
+ export interface WorkspaceEvent<T = WorkspaceEventData> {
99
+ type: WorkspaceEventType;
100
+ timestamp: number;
101
+ source: 'agent' | 'ui' | 'server';
102
+ data: T;
103
+ }
104
+
105
+ export function createWorkspaceEvent<T extends WorkspaceEventData>(
106
+ type: WorkspaceEventType,
107
+ data: T,
108
+ source: 'agent' | 'ui' | 'server' = 'ui'
109
+ ): WorkspaceEvent<T> {
110
+ return {
111
+ type,
112
+ timestamp: Date.now(),
113
+ source,
114
+ data,
115
+ };
116
+ }
117
+
118
+ // ============================================================================
119
+ // WALLET EVENTS - Existing wallet layer events
120
+ // ============================================================================
121
+
122
+ // Event payload types
123
+ export interface TokenCreatedData {
124
+ tokenHash: string;
125
+ agentId: string;
126
+ limit: number;
127
+ permissions: string[];
128
+ expiresAt: number;
129
+ }
130
+
131
+ export interface TokenRevokedData {
132
+ tokenHash: string;
133
+ }
134
+
135
+ export interface TokenSpentData {
136
+ tokenHash: string;
137
+ amount: number;
138
+ newSpent: number;
139
+ remaining: number;
140
+ }
141
+
142
+ export interface WalletCreatedData {
143
+ address: string;
144
+ tier: 'hot' | 'temp';
145
+ chain: string;
146
+ name?: string;
147
+ tokenHash?: string;
148
+ }
149
+
150
+ export interface AssetChangedData {
151
+ walletAddress: string;
152
+ tokenAddress: string;
153
+ symbol?: string;
154
+ name?: string;
155
+ poolAddress?: string;
156
+ poolVersion?: string;
157
+ icon?: string;
158
+ removed?: boolean;
159
+ }
160
+
161
+ export interface TxCreatedData {
162
+ walletAddress: string;
163
+ id: string;
164
+ type: string;
165
+ txHash?: string;
166
+ amount?: string;
167
+ tokenAddress?: string;
168
+ tokenAmount?: string;
169
+ description?: string;
170
+ }
171
+
172
+ export interface ActionCreatedData {
173
+ id: string;
174
+ type: string;
175
+ source: string;
176
+ summary: string;
177
+ expiresAt: number | null;
178
+ metadata?: Record<string, unknown>;
179
+ }
180
+
181
+ export interface ActionResolvedData {
182
+ id: string;
183
+ type: string;
184
+ approved: boolean;
185
+ resolvedBy: string;
186
+ }
187
+
188
+ export interface CredentialChangedData {
189
+ credentialId: string;
190
+ vaultId: string;
191
+ change:
192
+ | 'created'
193
+ | 'updated'
194
+ | 'archived'
195
+ | 'moved_to_recently_deleted'
196
+ | 'restored_to_active'
197
+ | 'restored_to_archive'
198
+ | 'purged';
199
+ actorType: 'admin' | 'agent';
200
+ agentId?: string;
201
+ tokenHash?: string;
202
+ fromLocation?: 'active' | 'archive' | 'recently_deleted';
203
+ toLocation?: 'active' | 'archive' | 'recently_deleted';
204
+ }
205
+
206
+ export interface CredentialAccessedData {
207
+ credentialId: string;
208
+ vaultId: string;
209
+ action: 'credentials.read' | 'credentials.totp';
210
+ allowed: boolean;
211
+ reasonCode: string;
212
+ httpStatus: number;
213
+ actorType: 'admin' | 'agent';
214
+ agentId?: string;
215
+ tokenHash?: string;
216
+ }
217
+
218
+ export interface BalanceUpdatedData {
219
+ chain: string;
220
+ type: 'native' | 'token';
221
+ balances: { walletAddress: string; tokenAddress?: string; balance: string }[];
222
+ }
223
+
224
+ // Union of all event data types
225
+ export type WalletEventData =
226
+ | TokenCreatedData
227
+ | TokenRevokedData
228
+ | TokenSpentData
229
+ | WalletCreatedData
230
+ | AssetChangedData
231
+ | BalanceUpdatedData
232
+ | TxCreatedData
233
+ | ActionCreatedData
234
+ | ActionResolvedData
235
+ | CredentialChangedData
236
+ | CredentialAccessedData;
237
+
238
+ // Event types as const for type safety
239
+ export const WALLET_EVENTS = {
240
+ TOKEN_CREATED: 'token:created',
241
+ TOKEN_REVOKED: 'token:revoked',
242
+ TOKEN_SPENT: 'token:spent',
243
+ WALLET_CREATED: 'wallet:created',
244
+ WALLET_CHANGED: 'wallet:changed',
245
+ ASSET_CHANGED: 'asset:changed',
246
+ BALANCE_UPDATED: 'balance:updated',
247
+ TX_CREATED: 'tx:created',
248
+ ACTION_CREATED: 'action:created',
249
+ ACTION_RESOLVED: 'action:resolved',
250
+ CREDENTIAL_CHANGED: 'credential:changed',
251
+ CREDENTIAL_ACCESSED: 'credential:accessed',
252
+ } as const;
253
+
254
+ export type WalletEventType = (typeof WALLET_EVENTS)[keyof typeof WALLET_EVENTS];
255
+
256
+ // Main event interface
257
+ export interface WalletEvent<T = WalletEventData> {
258
+ type: WalletEventType;
259
+ timestamp: number;
260
+ source: 'express' | 'nextjs';
261
+ data: T;
262
+ }
263
+
264
+ // Type-safe event creators
265
+ export function createWalletEvent<T extends WalletEventData>(
266
+ type: WalletEventType,
267
+ data: T,
268
+ source: 'express' | 'nextjs' = 'nextjs'
269
+ ): WalletEvent<T> {
270
+ return {
271
+ type,
272
+ timestamp: Date.now(),
273
+ source,
274
+ data,
275
+ };
276
+ }
277
+
278
+ // ============================================================================
279
+ // THEME EVENTS - Theme system control
280
+ // ============================================================================
281
+
282
+ export const THEME_EVENTS = {
283
+ // Query (agent → server → agent)
284
+ THEME_REQUEST: 'theme:request',
285
+ THEME_RESPONSE: 'theme:response',
286
+
287
+ // Mutations (agent/ui → server → broadcast)
288
+ THEME_UPDATED: 'theme:updated',
289
+ THEME_MODE_CHANGED: 'theme:mode:changed',
290
+ THEME_ACCENT_CHANGED: 'theme:accent:changed',
291
+ WORKSPACE_THEME_UPDATED: 'workspace:theme:updated',
292
+ } as const;
293
+
294
+ export type ThemeEventType = (typeof THEME_EVENTS)[keyof typeof THEME_EVENTS];
295
+
296
+ // Theme event payload types
297
+ export interface ThemeRequestData {
298
+ requestId: string;
299
+ }
300
+
301
+ export interface ThemeResponseData {
302
+ requestId: string;
303
+ activeThemeId: string;
304
+ accentColor: string;
305
+ mode: 'light' | 'dark';
306
+ }
307
+
308
+ export interface ThemeModeChangedData {
309
+ mode: 'light' | 'dark';
310
+ }
311
+
312
+ export interface ThemeAccentChangedData {
313
+ accent: string;
314
+ }
315
+
316
+ export interface WorkspaceThemeUpdatedData {
317
+ workspaceId: string;
318
+ mode?: 'light' | 'dark' | null;
319
+ accent?: string | null;
320
+ overrides?: string | null;
321
+ }
322
+
323
+ export type ThemeEventData =
324
+ | ThemeRequestData
325
+ | ThemeResponseData
326
+ | ThemeModeChangedData
327
+ | ThemeAccentChangedData
328
+ | WorkspaceThemeUpdatedData;
329
+
330
+ export interface ThemeEvent<T = ThemeEventData> {
331
+ type: ThemeEventType;
332
+ timestamp: number;
333
+ source: 'agent' | 'ui' | 'server';
334
+ data: T;
335
+ }
336
+
337
+ export function createThemeEvent<T extends ThemeEventData>(
338
+ type: ThemeEventType,
339
+ data: T,
340
+ source: 'agent' | 'ui' | 'server' = 'ui'
341
+ ): ThemeEvent<T> {
342
+ return {
343
+ type,
344
+ timestamp: Date.now(),
345
+ source,
346
+ data,
347
+ };
348
+ }
349
+
350
+ // ============================================================================
351
+ // APP EVENTS - Third-party app communication
352
+ // ============================================================================
353
+
354
+ export const APP_EVENTS = {
355
+ APP_MESSAGE: 'app:message', // app → agent (via host bridge)
356
+ APP_RESPONSE: 'app:response', // agent → app (via host bridge)
357
+ APP_DATA: 'app:data', // host → app (real-time data push)
358
+ APP_EMIT: 'app:emit', // strategy → app targeted event
359
+ } as const;
360
+
361
+ export type AppEventType = (typeof APP_EVENTS)[keyof typeof APP_EVENTS];
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared Pino logger instance for the WebSocket server (port 4748)
3
+ *
4
+ * Uses pino-pretty as a synchronous stream (not a worker transport)
5
+ * because Next.js instrumentation context kills worker threads.
6
+ */
7
+
8
+ import pino from 'pino';
9
+ import pretty from 'pino-pretty';
10
+
11
+ const isDev = process.env.NODE_ENV !== 'production';
12
+
13
+ const stream = isDev
14
+ ? pretty({
15
+ colorize: true,
16
+ translateTime: 'HH:MM:ss.l',
17
+ ignore: 'pid,hostname',
18
+ })
19
+ : undefined;
20
+
21
+ export const log = pino(
22
+ { level: process.env.LOG_LEVEL || 'debug' },
23
+ stream,
24
+ );
@@ -0,0 +1,168 @@
1
+ import { prisma } from './db';
2
+ import {
3
+ THEME_EVENTS,
4
+ ThemeEvent,
5
+ ThemeRequestData,
6
+ ThemeResponseData,
7
+ ThemeModeChangedData,
8
+ ThemeAccentChangedData,
9
+ WorkspaceThemeUpdatedData,
10
+ createThemeEvent,
11
+ } from './events';
12
+
13
+ /**
14
+ * Handle incoming theme WebSocket messages
15
+ * Returns a response event if one should be sent back to the sender
16
+ */
17
+ export async function handleThemeMessage(
18
+ msg: ThemeEvent
19
+ ): Promise<ThemeEvent | null> {
20
+ console.log(`[WS] Handling theme message: ${msg.type}`);
21
+
22
+ switch (msg.type) {
23
+ case THEME_EVENTS.THEME_REQUEST:
24
+ return handleThemeRequest(msg.data as ThemeRequestData);
25
+
26
+ case THEME_EVENTS.THEME_MODE_CHANGED:
27
+ await handleThemeModeChanged(msg.data as ThemeModeChangedData);
28
+ return null;
29
+
30
+ case THEME_EVENTS.THEME_ACCENT_CHANGED:
31
+ await handleThemeAccentChanged(msg.data as ThemeAccentChangedData);
32
+ return null;
33
+
34
+ case THEME_EVENTS.WORKSPACE_THEME_UPDATED:
35
+ await handleWorkspaceThemeUpdated(msg.data as WorkspaceThemeUpdatedData);
36
+ return null;
37
+
38
+ default:
39
+ console.warn(`[WS] Unknown theme event type: ${msg.type}`);
40
+ return null;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Ensure the global theme config exists
46
+ */
47
+ async function ensureThemeConfig() {
48
+ const config = await prisma.themeConfig.findUnique({
49
+ where: { id: 'global' },
50
+ });
51
+
52
+ if (!config) {
53
+ await prisma.themeConfig.create({
54
+ data: {
55
+ id: 'global',
56
+ activeThemeId: 'light',
57
+ accentColor: '#ccff00',
58
+ },
59
+ });
60
+ console.log('[Theme] Created default theme config');
61
+ }
62
+
63
+ return config || {
64
+ id: 'global',
65
+ activeThemeId: 'light',
66
+ accentColor: '#ccff00',
67
+ };
68
+ }
69
+
70
+ /**
71
+ * Handle theme:request - return current theme state
72
+ */
73
+ async function handleThemeRequest(
74
+ data: ThemeRequestData
75
+ ): Promise<ThemeEvent<ThemeResponseData>> {
76
+ const config = await ensureThemeConfig();
77
+
78
+ const response: ThemeResponseData = {
79
+ requestId: data.requestId,
80
+ activeThemeId: config.activeThemeId,
81
+ accentColor: config.accentColor,
82
+ mode: config.activeThemeId === 'dark' ? 'dark' : 'light',
83
+ };
84
+
85
+ return createThemeEvent(THEME_EVENTS.THEME_RESPONSE, response, 'server');
86
+ }
87
+
88
+ /**
89
+ * Handle theme:mode:changed - update theme mode (light/dark)
90
+ */
91
+ async function handleThemeModeChanged(data: ThemeModeChangedData): Promise<void> {
92
+ await ensureThemeConfig();
93
+
94
+ await prisma.themeConfig.update({
95
+ where: { id: 'global' },
96
+ data: {
97
+ activeThemeId: data.mode,
98
+ },
99
+ });
100
+
101
+ console.log(`[Theme] Mode changed to: ${data.mode}`);
102
+ }
103
+
104
+ /**
105
+ * Handle theme:accent:changed - update accent color
106
+ */
107
+ async function handleThemeAccentChanged(data: ThemeAccentChangedData): Promise<void> {
108
+ await ensureThemeConfig();
109
+
110
+ await prisma.themeConfig.update({
111
+ where: { id: 'global' },
112
+ data: {
113
+ accentColor: data.accent,
114
+ },
115
+ });
116
+
117
+ console.log(`[Theme] Accent changed to: ${data.accent}`);
118
+ }
119
+
120
+ /**
121
+ * Handle workspace:theme:updated - update per-workspace theme overrides
122
+ */
123
+ async function handleWorkspaceThemeUpdated(data: WorkspaceThemeUpdatedData): Promise<void> {
124
+ const existing = await prisma.workspaceTheme.findUnique({
125
+ where: { workspaceId: data.workspaceId },
126
+ });
127
+
128
+ if (existing) {
129
+ // Update existing
130
+ const updateData: Record<string, unknown> = {};
131
+ if (data.mode !== undefined) updateData.mode = data.mode;
132
+ if (data.accent !== undefined) updateData.accent = data.accent;
133
+ if (data.overrides !== undefined) updateData.overrides = data.overrides;
134
+
135
+ await prisma.workspaceTheme.update({
136
+ where: { workspaceId: data.workspaceId },
137
+ data: updateData,
138
+ });
139
+ } else {
140
+ // Create new
141
+ await prisma.workspaceTheme.create({
142
+ data: {
143
+ workspaceId: data.workspaceId,
144
+ mode: data.mode,
145
+ accent: data.accent,
146
+ overrides: data.overrides,
147
+ },
148
+ });
149
+ }
150
+
151
+ console.log(`[Theme] Workspace theme updated for: ${data.workspaceId}`);
152
+ }
153
+
154
+ /**
155
+ * Get global theme configuration
156
+ */
157
+ export async function getThemeConfig() {
158
+ return ensureThemeConfig();
159
+ }
160
+
161
+ /**
162
+ * Get workspace-specific theme override
163
+ */
164
+ export async function getWorkspaceTheme(workspaceId: string) {
165
+ return prisma.workspaceTheme.findUnique({
166
+ where: { workspaceId },
167
+ });
168
+ }