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,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
|
+
}
|