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.
- package/LICENSE +26 -0
- package/README.md +112 -0
- package/bin/aurawallet.js +121 -0
- package/docs/ADAPTERS.md +467 -0
- package/docs/API.md +2679 -0
- package/docs/APPS.md +198 -0
- package/docs/ARCHITECTURE.md +350 -0
- package/docs/AUTH.md +698 -0
- package/docs/BEST-PRACTICES.md +121 -0
- package/docs/CLI.md +61 -0
- package/docs/DEVELOPING-APPS.md +452 -0
- package/docs/EXTENSION.md +97 -0
- package/docs/JOBS.md +33 -0
- package/docs/MCP.md +76 -0
- package/docs/PROTOCOL.md +142 -0
- package/docs/SETUP.md +219 -0
- package/docs/WORKSPACE.md +672 -0
- package/docs/agent-auth.md +63 -0
- package/docs/aura-file.md +48 -0
- package/docs/credentials.md +53 -0
- package/docs/external/getting-started.md +65 -0
- package/docs/external/overview.md +45 -0
- package/docs/external/use-cases.md +48 -0
- package/docs/external/why-aura.md +35 -0
- package/docs/jobs/connect-agent.md +77 -0
- package/docs/jobs/migrate-from-dotenv.md +79 -0
- package/docs/jobs/recover-from-lockout.md +72 -0
- package/docs/jobs/secure-ci.md +63 -0
- package/docs/oauth2.md +42 -0
- package/docs/passkeys.md +60 -0
- package/docs/security.md +540 -0
- package/docs/specs/aura-open-protocol.md +61 -0
- package/docs/specs/aura-provider-plugin.md +24 -0
- package/docs/specs/aura-registry-model.md +31 -0
- package/docs/specs/fixtures/invalid-bad-key.aura +1 -0
- package/docs/specs/fixtures/invalid-bad-unicode-escape.aura +1 -0
- package/docs/specs/fixtures/invalid-duplicate-key.aura +2 -0
- package/docs/specs/fixtures/valid-basic.aura +4 -0
- package/docs/specs/fixtures/valid-provider-ref.aura +1 -0
- package/docs/specs/fixtures/valid-quoted-escapes.aura +2 -0
- package/docs/templates/RELEASE_NOTES_TEMPLATE.md +22 -0
- package/docs/totp.md +40 -0
- package/docs/wallet/AI.md +508 -0
- package/docs/wallet/DEVELOPING-STRATEGIES.md +713 -0
- package/docs/wallet/README.md +47 -0
- package/docs/wallet/STRATEGY.md +89 -0
- package/next.config.ts +21 -0
- package/package.json +151 -0
- package/postcss.config.mjs +8 -0
- package/prisma/migrations/20260214170000_baseline/migration.sql +511 -0
- package/prisma/migrations/20260216214537_add_passkey_model/migration.sql +18 -0
- package/prisma/migrations/20260217150500_add_credential_access_audit/migration.sql +31 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +447 -0
- package/public/logo-chevron.svg +31 -0
- package/public/logo-concentric.svg +31 -0
- package/public/logo-crosshatch.svg +39 -0
- package/public/logo-dashed.svg +39 -0
- package/public/logo-horizontal.svg +31 -0
- package/public/logo-m56.svg +64 -0
- package/public/logo.webp +0 -0
- package/scripts/add-app.js +245 -0
- package/scripts/init.sh +57 -0
- package/scripts/migrate-apikeys-to-credentials.ts +35 -0
- package/scripts/sandbox-agent-flow.sh +235 -0
- package/scripts/sandbox.sh +175 -0
- package/scripts/validate-job-docs.mjs +125 -0
- package/server/abi/SwapHelper.json +438 -0
- package/server/cli/approval.ts +447 -0
- package/server/cli/commands/app.ts +204 -0
- package/server/cli/commands/cron.ts +24 -0
- package/server/cli/commands/doctor.ts +1007 -0
- package/server/cli/commands/env.ts +456 -0
- package/server/cli/commands/init.ts +752 -0
- package/server/cli/commands/mcp.ts +125 -0
- package/server/cli/commands/restore.ts +314 -0
- package/server/cli/commands/shell-hook.ts +468 -0
- package/server/cli/commands/start.ts +62 -0
- package/server/cli/commands/status.ts +59 -0
- package/server/cli/commands/stop.ts +14 -0
- package/server/cli/commands/token.ts +180 -0
- package/server/cli/commands/unlock.ts +49 -0
- package/server/cli/commands/vault.ts +417 -0
- package/server/cli/index.ts +328 -0
- package/server/cli/lib/aura-parser.ts +64 -0
- package/server/cli/lib/credential-create.ts +74 -0
- package/server/cli/lib/credential-resolve.ts +254 -0
- package/server/cli/lib/dotenv-migrate.ts +116 -0
- package/server/cli/lib/dotenv-parser.ts +146 -0
- package/server/cli/lib/http.ts +91 -0
- package/server/cli/lib/init-steps.ts +76 -0
- package/server/cli/lib/local-agent-trust.ts +45 -0
- package/server/cli/lib/process.ts +136 -0
- package/server/cli/lib/prompt.ts +85 -0
- package/server/cli/lib/theme.ts +240 -0
- package/server/cli/socket.ts +570 -0
- package/server/cli/transport-client.ts +50 -0
- package/server/cron/index.ts +137 -0
- package/server/cron/job.ts +31 -0
- package/server/cron/jobs/balance-sync.ts +436 -0
- package/server/cron/jobs/incoming-scan.ts +506 -0
- package/server/cron/jobs/native-price.ts +70 -0
- package/server/cron/jobs/orphan-cleanup.ts +40 -0
- package/server/cron/jobs/strategy-runner.ts +175 -0
- package/server/cron/scheduler.ts +125 -0
- package/server/index.ts +406 -0
- package/server/lib/adapters/factory.ts +110 -0
- package/server/lib/adapters/index.ts +19 -0
- package/server/lib/adapters/router.ts +297 -0
- package/server/lib/adapters/telegram.ts +645 -0
- package/server/lib/adapters/types.ts +89 -0
- package/server/lib/adapters/webhook.ts +95 -0
- package/server/lib/address.ts +49 -0
- package/server/lib/agent-auth/contracts.ts +1194 -0
- package/server/lib/agent-profiles.ts +328 -0
- package/server/lib/ai.ts +285 -0
- package/server/lib/api-registry/contracts.ts +86 -0
- package/server/lib/api-registry/validation.ts +172 -0
- package/server/lib/apikey-migration.ts +189 -0
- package/server/lib/app-installer.ts +505 -0
- package/server/lib/app-tokens.ts +247 -0
- package/server/lib/auth.ts +314 -0
- package/server/lib/batch.ts +242 -0
- package/server/lib/cold.ts +874 -0
- package/server/lib/config.ts +381 -0
- package/server/lib/credential-access-audit.ts +85 -0
- package/server/lib/credential-access-policy.ts +110 -0
- package/server/lib/credential-health.ts +343 -0
- package/server/lib/credential-import.ts +487 -0
- package/server/lib/credential-scope.ts +87 -0
- package/server/lib/credential-shares.ts +190 -0
- package/server/lib/credential-transport.ts +342 -0
- package/server/lib/credential-vault.ts +77 -0
- package/server/lib/credentials.ts +333 -0
- package/server/lib/crypto.ts +8 -0
- package/server/lib/db.ts +15 -0
- package/server/lib/defaults.ts +366 -0
- package/server/lib/dex/index.ts +80 -0
- package/server/lib/dex/relay.ts +235 -0
- package/server/lib/dex/types.ts +59 -0
- package/server/lib/dex/uniswap.ts +370 -0
- package/server/lib/e2e-agent/artifacts.ts +36 -0
- package/server/lib/e2e-agent/contracts.ts +112 -0
- package/server/lib/e2e-agent/validation.ts +135 -0
- package/server/lib/encrypt.ts +128 -0
- package/server/lib/error.ts +20 -0
- package/server/lib/events.ts +205 -0
- package/server/lib/hot.ts +357 -0
- package/server/lib/key-fingerprint.ts +28 -0
- package/server/lib/logger.ts +331 -0
- package/server/lib/network.ts +137 -0
- package/server/lib/notifications.ts +219 -0
- package/server/lib/oauth2-refresh.ts +241 -0
- package/server/lib/oursecret.ts +54 -0
- package/server/lib/passkey-credential.ts +360 -0
- package/server/lib/passkey.ts +68 -0
- package/server/lib/permissions.ts +248 -0
- package/server/lib/pino.ts +24 -0
- package/server/lib/policy-preview.ts +138 -0
- package/server/lib/price.ts +338 -0
- package/server/lib/prices.ts +34 -0
- package/server/lib/project-scope.ts +239 -0
- package/server/lib/resolve-action.ts +427 -0
- package/server/lib/resolve.ts +36 -0
- package/server/lib/sessions.ts +632 -0
- package/server/lib/solana/connection.ts +26 -0
- package/server/lib/solana/jupiter.ts +128 -0
- package/server/lib/solana/transfer.ts +108 -0
- package/server/lib/solana/wallet.ts +136 -0
- package/server/lib/strategy/emits.ts +21 -0
- package/server/lib/strategy/engine.ts +1305 -0
- package/server/lib/strategy/executor.ts +115 -0
- package/server/lib/strategy/hook-context.ts +158 -0
- package/server/lib/strategy/hooks.ts +990 -0
- package/server/lib/strategy/index.ts +28 -0
- package/server/lib/strategy/installer.ts +305 -0
- package/server/lib/strategy/loader.ts +256 -0
- package/server/lib/strategy/message.ts +235 -0
- package/server/lib/strategy/repository.ts +218 -0
- package/server/lib/strategy/session-logger.ts +693 -0
- package/server/lib/strategy/sources.ts +288 -0
- package/server/lib/strategy/state.ts +189 -0
- package/server/lib/strategy/templates.ts +403 -0
- package/server/lib/strategy/tick.ts +404 -0
- package/server/lib/strategy/types.ts +230 -0
- package/server/lib/swap.ts +3 -0
- package/server/lib/temp.ts +86 -0
- package/server/lib/token-metadata.ts +86 -0
- package/server/lib/token-safety.ts +200 -0
- package/server/lib/token-search.ts +444 -0
- package/server/lib/totp.ts +194 -0
- package/server/lib/transactions.ts +123 -0
- package/server/lib/transport.ts +75 -0
- package/server/lib/txhistory/decoder.ts +262 -0
- package/server/lib/txhistory/enricher.ts +652 -0
- package/server/lib/txhistory/index.ts +391 -0
- package/server/lib/txhistory/signatures.ts +59 -0
- package/server/lib/verified-summary.ts +421 -0
- package/server/mcp/profile-policy.ts +30 -0
- package/server/mcp/server.ts +619 -0
- package/server/mcp/tools.ts +523 -0
- package/server/middleware/auth.ts +119 -0
- package/server/middleware/requestLogger.ts +84 -0
- package/server/routes/actions.ts +459 -0
- package/server/routes/adapters.ts +703 -0
- package/server/routes/addressbook.ts +113 -0
- package/server/routes/ai.ts +34 -0
- package/server/routes/apikeys.ts +295 -0
- package/server/routes/apps.ts +601 -0
- package/server/routes/auth.ts +457 -0
- package/server/routes/backup.ts +340 -0
- package/server/routes/batch.ts +270 -0
- package/server/routes/bookmarks.ts +162 -0
- package/server/routes/credential-shares.ts +198 -0
- package/server/routes/credential-vaults.ts +154 -0
- package/server/routes/credentials.ts +1290 -0
- package/server/routes/dashboard.ts +71 -0
- package/server/routes/defaults.ts +124 -0
- package/server/routes/fund.ts +229 -0
- package/server/routes/import.ts +352 -0
- package/server/routes/launch.ts +665 -0
- package/server/routes/lock.ts +54 -0
- package/server/routes/logs.ts +68 -0
- package/server/routes/nuke.ts +111 -0
- package/server/routes/passkey-credentials.ts +99 -0
- package/server/routes/passkey.ts +346 -0
- package/server/routes/portfolio.ts +217 -0
- package/server/routes/price.ts +63 -0
- package/server/routes/resolve.ts +31 -0
- package/server/routes/security.ts +45 -0
- package/server/routes/send-evm.ts +241 -0
- package/server/routes/send-solana.ts +281 -0
- package/server/routes/send.ts +178 -0
- package/server/routes/setup.ts +210 -0
- package/server/routes/strategy.ts +894 -0
- package/server/routes/swap-evm.ts +353 -0
- package/server/routes/swap-solana.ts +177 -0
- package/server/routes/swap.ts +356 -0
- package/server/routes/token.ts +247 -0
- package/server/routes/unlock.ts +403 -0
- package/server/routes/wallet-assets.ts +361 -0
- package/server/routes/wallet-transactions.ts +515 -0
- package/server/routes/wallet.ts +710 -0
- package/server/types.ts +146 -0
- package/skills/aurawallet/SKILL.md +739 -0
- package/skills/aurawallet-setup/SKILL.md +74 -0
- package/skills/security-review/SKILL.md +148 -0
- package/src/app/api/agent-requests/route.ts +30 -0
- package/src/app/api/apps/install/route.ts +126 -0
- package/src/app/api/apps/manifests/route.ts +16 -0
- package/src/app/api/apps/static/[...path]/route.ts +57 -0
- package/src/app/api/events/route.ts +92 -0
- package/src/app/api/page.tsx +212 -0
- package/src/app/api/workspace/[id]/apps/[wid]/route.ts +119 -0
- package/src/app/api/workspace/[id]/apps/route.ts +81 -0
- package/src/app/api/workspace/[id]/export/route.ts +67 -0
- package/src/app/api/workspace/[id]/route.ts +168 -0
- package/src/app/api/workspace/auth.ts +34 -0
- package/src/app/api/workspace/config/route.ts +106 -0
- package/src/app/api/workspace/import/route.ts +127 -0
- package/src/app/api/workspace/route.ts +116 -0
- package/src/app/app/page.tsx +2122 -0
- package/src/app/apple-icon.png +0 -0
- package/src/app/docs/page.tsx +178 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +572 -0
- package/src/app/health/page.tsx +5 -0
- package/src/app/hello/page.tsx +15 -0
- package/src/app/icon.png +0 -0
- package/src/app/layout.tsx +34 -0
- package/src/app/page.tsx +986 -0
- package/src/app/providers.tsx +90 -0
- package/src/app/share/[token]/page.tsx +295 -0
- package/src/components/ChainSelector.tsx +144 -0
- package/src/components/HumanActionBar.tsx +695 -0
- package/src/components/NotificationDrawer.tsx +129 -0
- package/src/components/apps/AgentKeysApp.tsx +490 -0
- package/src/components/apps/App.tsx +153 -0
- package/src/components/apps/AppGrid.tsx +15 -0
- package/src/components/apps/DetailedAddressDrawer.tsx +325 -0
- package/src/components/apps/DraggableApp.tsx +562 -0
- package/src/components/apps/IFrameApp.tsx +73 -0
- package/src/components/apps/LogsApp.tsx +360 -0
- package/src/components/apps/SendApp.tsx +394 -0
- package/src/components/apps/SetupWizardApp.tsx +1004 -0
- package/src/components/apps/SystemDefaultsApp.tsx +845 -0
- package/src/components/apps/ThirdPartyApp.tsx +428 -0
- package/src/components/apps/TokenApp.tsx +319 -0
- package/src/components/apps/TransactionsApp.tsx +438 -0
- package/src/components/apps/WalletDetailApp.tsx +1505 -0
- package/src/components/apps/index.ts +13 -0
- package/src/components/design-system/Button.tsx +53 -0
- package/src/components/design-system/ChainIndicator.tsx +65 -0
- package/src/components/design-system/ChainSelector.tsx +137 -0
- package/src/components/design-system/ConfirmationModal.tsx +106 -0
- package/src/components/design-system/ConfirmationPopover.tsx +81 -0
- package/src/components/design-system/Drawer.tsx +123 -0
- package/src/components/design-system/FilterDropdown.tsx +72 -0
- package/src/components/design-system/Modal.tsx +206 -0
- package/src/components/design-system/Popover.tsx +142 -0
- package/src/components/design-system/TextInput.tsx +85 -0
- package/src/components/design-system/Toggle.tsx +58 -0
- package/src/components/design-system/index.ts +11 -0
- package/src/components/docs/DocsThemeToggle.tsx +49 -0
- package/src/components/health/CredentialHealthDashboard.tsx +214 -0
- package/src/components/icons/ChainIcons.tsx +72 -0
- package/src/components/layout/AppStoreDrawer.tsx +369 -0
- package/src/components/layout/ContentArea.tsx +21 -0
- package/src/components/layout/TabBar.tsx +278 -0
- package/src/components/layout/WalletSidebar.tsx +1033 -0
- package/src/components/layout/index.ts +4 -0
- package/src/components/marketing/AuraWalletSpecOverlay.tsx +635 -0
- package/src/components/marketing/DeviceMorphExperience.tsx +216 -0
- package/src/components/vault/ApiKeysConsole.tsx +1080 -0
- package/src/components/vault/AuditConsole.tsx +584 -0
- package/src/components/vault/CredentialDetail.tsx +455 -0
- package/src/components/vault/CredentialEmpty.tsx +55 -0
- package/src/components/vault/CredentialField.tsx +361 -0
- package/src/components/vault/CredentialForm.tsx +1212 -0
- package/src/components/vault/CredentialList.tsx +165 -0
- package/src/components/vault/CredentialRow.tsx +97 -0
- package/src/components/vault/CredentialShareModal.tsx +178 -0
- package/src/components/vault/CredentialVault.tsx +754 -0
- package/src/components/vault/CredentialWalletWidget.tsx +103 -0
- package/src/components/vault/ImportCredentialsModal.tsx +515 -0
- package/src/components/vault/LargeTypeModal.tsx +64 -0
- package/src/components/vault/PasswordGenerator.tsx +224 -0
- package/src/components/vault/TOTPDisplay.tsx +123 -0
- package/src/components/vault/VaultSidebar.tsx +413 -0
- package/src/components/vault/types.ts +54 -0
- package/src/context/AuthContext.tsx +337 -0
- package/src/context/PriceContext.tsx +113 -0
- package/src/context/ThemeContext.tsx +164 -0
- package/src/context/WebSocketContext.tsx +269 -0
- package/src/context/WorkspaceContext.tsx +668 -0
- package/src/hooks/index.ts +3 -0
- package/src/hooks/useAgentActions.ts +368 -0
- package/src/hooks/useBalance.ts +103 -0
- package/src/hooks/useBalances.ts +129 -0
- package/src/instrumentation.ts +12 -0
- package/src/lib/api.ts +449 -0
- package/src/lib/app-loader.ts +148 -0
- package/src/lib/app-registry.ts +178 -0
- package/src/lib/app-sdk.ts +157 -0
- package/src/lib/audit-console-adapter.ts +151 -0
- package/src/lib/auth-client.ts +75 -0
- package/src/lib/config.ts +74 -0
- package/src/lib/crypto.ts +112 -0
- package/src/lib/db.ts +21 -0
- package/src/lib/docs.ts +390 -0
- package/src/lib/events.ts +361 -0
- package/src/lib/pino.ts +24 -0
- package/src/lib/theme-handlers.ts +168 -0
- package/src/lib/theme.ts +351 -0
- package/src/lib/tokenData.ts +378 -0
- package/src/lib/vault-crypto.ts +129 -0
- package/src/lib/websocket-server.ts +302 -0
- package/src/lib/websocket-setup.ts +79 -0
- package/src/lib/wordlist.ts +2050 -0
- package/src/lib/workspace-handlers.ts +285 -0
- package/start.sh +80 -0
- package/tailwind.config.ts +99 -0
- 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];
|
package/src/lib/pino.ts
ADDED
|
@@ -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
|
+
}
|