auramaxx 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +26 -0
- package/README.md +77 -0
- package/apps/desktop-electron/main.js +428 -0
- package/bin/auramaxx.js +1063 -0
- package/docs/ADAPTERS.md +466 -0
- package/docs/AGENT_SETUP.md +159 -0
- package/docs/API.md +127 -0
- package/docs/APPS.md +199 -0
- package/docs/ARCHITECTURE.md +235 -0
- package/docs/AUTH.md +318 -0
- package/docs/BEST-PRACTICES.md +82 -0
- package/docs/CLI.md +141 -0
- package/docs/DESKTOP_ELECTRON.md +26 -0
- package/docs/DEVELOPING-APPS.md +453 -0
- package/docs/MCP.md +122 -0
- package/docs/PACKAGING_POLICY.md +19 -0
- package/docs/PERMISSION.md +137 -0
- package/docs/PROTOCOL.md +142 -0
- package/docs/README.md +50 -0
- package/docs/SKILLS.md +132 -0
- package/docs/TROUBLESHOOTING.md +376 -0
- package/docs/WORKSPACE.md +673 -0
- package/docs/agent-auth.md +14 -0
- package/docs/api/authentication.md +79 -0
- package/docs/api/secrets/api-keys.md +28 -0
- package/docs/api/secrets/credentials.md +80 -0
- package/docs/api/secrets/sharing.md +48 -0
- package/docs/api/system.md +41 -0
- package/docs/api/wallets/apps-strategies.md +66 -0
- package/docs/api/wallets/core.md +46 -0
- package/docs/api/wallets/data-portfolio.md +42 -0
- package/docs/aura-file.md +48 -0
- package/docs/core-concepts/FEATURES.md +114 -0
- package/docs/credentials.md +120 -0
- package/docs/external/HOW_TO_AURAMAXX/GETTING_SECRETS.md +33 -0
- package/docs/external/HOW_TO_AURAMAXX/README.md +45 -0
- package/docs/external/getting-started.md +10 -0
- package/docs/external/overview.md +19 -0
- package/docs/external/persona-paths.md +7 -0
- package/docs/external/share-secret.md +76 -0
- package/docs/external/why-aura.md +7 -0
- package/docs/security.md +227 -0
- package/docs/templates/RELEASE_NOTES_TEMPLATE.md +22 -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 +28 -0
- package/package.json +167 -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/20260222090000_update_admin_ttl_default/migration.sql +10 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +447 -0
- package/public/logo.webp +0 -0
- package/scripts/add-app.js +245 -0
- package/server/abi/SwapHelper.json +438 -0
- package/server/cli/approval.ts +447 -0
- package/server/cli/commands/actions.ts +474 -0
- package/server/cli/commands/api.ts +220 -0
- package/server/cli/commands/apikey.ts +277 -0
- package/server/cli/commands/app.ts +204 -0
- package/server/cli/commands/auth.ts +464 -0
- package/server/cli/commands/cron.ts +24 -0
- package/server/cli/commands/diary.ts +274 -0
- package/server/cli/commands/doctor.ts +1247 -0
- package/server/cli/commands/env.ts +476 -0
- package/server/cli/commands/experimental.ts +69 -0
- package/server/cli/commands/init.ts +798 -0
- package/server/cli/commands/lock.ts +157 -0
- package/server/cli/commands/mcp.ts +285 -0
- package/server/cli/commands/quickhack.ts +86 -0
- package/server/cli/commands/release-check.ts +231 -0
- package/server/cli/commands/restore.ts +314 -0
- package/server/cli/commands/service.ts +320 -0
- package/server/cli/commands/shell-hook.ts +512 -0
- package/server/cli/commands/skill.ts +216 -0
- package/server/cli/commands/start.ts +139 -0
- package/server/cli/commands/status.ts +59 -0
- package/server/cli/commands/stop.ts +36 -0
- package/server/cli/commands/token.ts +180 -0
- package/server/cli/commands/unlock.ts +50 -0
- package/server/cli/commands/vault.ts +1323 -0
- package/server/cli/commands/wallet.ts +209 -0
- package/server/cli/index.ts +280 -0
- package/server/cli/lib/approval-poll.ts +94 -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 +280 -0
- package/server/cli/lib/dotenv-migrate.ts +116 -0
- package/server/cli/lib/dotenv-parser.ts +146 -0
- package/server/cli/lib/escalation.ts +57 -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/lock-unlock-helper.ts +71 -0
- package/server/cli/lib/process.ts +162 -0
- package/server/cli/lib/prompt.ts +294 -0
- package/server/cli/lib/theme.ts +240 -0
- package/server/cli/socket.ts +579 -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 +420 -0
- package/server/lib/adapters/factory.ts +119 -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 +419 -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 +258 -0
- package/server/lib/app-installer.ts +505 -0
- package/server/lib/app-tokens.ts +247 -0
- package/server/lib/approval-link.ts +27 -0
- package/server/lib/auth.ts +314 -0
- package/server/lib/auto-execute.ts +160 -0
- package/server/lib/batch.ts +242 -0
- package/server/lib/cold.ts +1048 -0
- package/server/lib/config.ts +408 -0
- package/server/lib/credential-access-audit.ts +85 -0
- package/server/lib/credential-access-policy.ts +111 -0
- package/server/lib/credential-health.ts +343 -0
- package/server/lib/credential-import.ts +608 -0
- package/server/lib/credential-scope.ts +102 -0
- package/server/lib/credential-shares.ts +190 -0
- package/server/lib/credential-transport.ts +533 -0
- package/server/lib/credential-vault.ts +77 -0
- package/server/lib/credentials.ts +422 -0
- package/server/lib/crypto.ts +8 -0
- package/server/lib/db.ts +58 -0
- package/server/lib/defaults.ts +386 -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/diary.ts +34 -0
- package/server/lib/dont-ask-again-policy.ts +41 -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 +114 -0
- package/server/lib/error.ts +20 -0
- package/server/lib/events.ts +217 -0
- package/server/lib/feature-flags.ts +93 -0
- package/server/lib/hot.ts +357 -0
- package/server/lib/human-action-summary.ts +80 -0
- package/server/lib/key-fingerprint.ts +28 -0
- package/server/lib/logger.ts +340 -0
- package/server/lib/network.ts +137 -0
- package/server/lib/notifications.ts +230 -0
- package/server/lib/oauth2-refresh.ts +241 -0
- package/server/lib/oursecret.ts +71 -0
- package/server/lib/passkey-credential.ts +360 -0
- package/server/lib/passkey.ts +68 -0
- package/server/lib/permissions.ts +299 -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 +297 -0
- package/server/lib/resolve-action.ts +328 -0
- package/server/lib/resolve.ts +36 -0
- package/server/lib/secret-gist-share.ts +296 -0
- package/server/lib/sessions.ts +634 -0
- package/server/lib/socket-path.ts +56 -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 +159 -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 +237 -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 +84 -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/update-check.ts +35 -0
- package/server/lib/verified-summary.ts +414 -0
- package/server/lib/view-registry.ts +80 -0
- package/server/mcp/profile-policy.ts +30 -0
- package/server/mcp/server.ts +1589 -0
- package/server/mcp/tools.ts +276 -0
- package/server/middleware/auth.ts +119 -0
- package/server/middleware/requestLogger.ts +84 -0
- package/server/routes/actions.ts +539 -0
- package/server/routes/adapters.ts +711 -0
- package/server/routes/addressbook.ts +113 -0
- package/server/routes/ai.ts +34 -0
- package/server/routes/apikeys.ts +343 -0
- package/server/routes/apps.ts +601 -0
- package/server/routes/auth.ts +406 -0
- package/server/routes/backup.ts +404 -0
- package/server/routes/batch.ts +270 -0
- package/server/routes/bookmarks.ts +162 -0
- package/server/routes/credential-shares.ts +380 -0
- package/server/routes/credential-vaults.ts +159 -0
- package/server/routes/credentials.ts +1782 -0
- package/server/routes/dashboard.ts +97 -0
- package/server/routes/defaults.ts +124 -0
- package/server/routes/flags.ts +11 -0
- package/server/routes/fund.ts +225 -0
- package/server/routes/heartbeat.ts +375 -0
- package/server/routes/import.ts +364 -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 +366 -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 +352 -0
- package/server/routes/swap-solana.ts +176 -0
- package/server/routes/swap.ts +356 -0
- package/server/routes/token.ts +247 -0
- package/server/routes/unlock.ts +467 -0
- package/server/routes/views.ts +41 -0
- package/server/routes/wallet-assets.ts +361 -0
- package/server/routes/wallet-transactions.ts +515 -0
- package/server/routes/wallet.ts +709 -0
- package/server/types.ts +146 -0
- package/shared/credential-field-schema.ts +248 -0
- package/skills/auramaxx/HEARTBEAT.md +78 -0
- package/skills/auramaxx/SKILL.md +745 -0
- package/skills/auramaxx/docs/AGENT_SETUP.md +155 -0
- package/skills/auramaxx/docs/API.md +127 -0
- package/skills/auramaxx/docs/AUTH.md +318 -0
- package/skills/auramaxx/docs/CLI.md +130 -0
- package/skills/auramaxx/docs/MCP.md +122 -0
- package/skills/auramaxx/docs/TROUBLESHOOTING.md +357 -0
- package/skills/auramaxx/docs/WORKSPACE.md +673 -0
- package/skills/auramaxx/docs/security.md +227 -0
- package/skills/task-lifecycle/SKILL.md +378 -0
- package/src/app/api/[...doc]/page.tsx +36 -0
- package/src/app/api/agent-requests/route.ts +30 -0
- package/src/app/api/apps/install/route.ts +132 -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/docs/plain/route.ts +74 -0
- package/src/app/api/events/route.ts +92 -0
- package/src/app/api/page.tsx +290 -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 +40 -0
- package/src/app/api/workspace/config/route.ts +121 -0
- package/src/app/api/workspace/import/route.ts +127 -0
- package/src/app/api/workspace/route.ts +116 -0
- package/src/app/app-legacy-do-not-use/page.tsx +2245 -0
- package/src/app/apple-icon.png +0 -0
- package/src/app/approve/[actionId]/page.tsx +409 -0
- package/src/app/docs/DocsPageContent.tsx +269 -0
- package/src/app/docs/[...doc]/page.tsx +41 -0
- package/src/app/docs/page.tsx +38 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +819 -0
- package/src/app/health/page.tsx +5 -0
- package/src/app/hello/page.tsx +102 -0
- package/src/app/icon.png +0 -0
- package/src/app/layout.tsx +39 -0
- package/src/app/page.tsx +1964 -0
- package/src/app/privacy/page.tsx +63 -0
- package/src/app/providers.tsx +87 -0
- package/src/app/share/[token]/page.tsx +295 -0
- package/src/app/terms/page.tsx +80 -0
- package/src/components/ChainSelector.tsx +44 -0
- package/src/components/HumanActionBar.tsx +697 -0
- package/src/components/NotificationDrawer.tsx +387 -0
- package/src/components/PasskeyEnrollmentPrompt.tsx +235 -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 +88 -0
- package/src/components/design-system/ChainIndicator.tsx +65 -0
- package/src/components/design-system/ChainSelector.tsx +147 -0
- package/src/components/design-system/ConfirmationModal.tsx +107 -0
- package/src/components/design-system/ConfirmationPopover.tsx +81 -0
- package/src/components/design-system/DownloadButton.tsx +149 -0
- package/src/components/design-system/Drawer.tsx +133 -0
- package/src/components/design-system/FilterDropdown.tsx +183 -0
- package/src/components/design-system/ItemPicker.tsx +157 -0
- package/src/components/design-system/Modal.tsx +296 -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 +65 -0
- package/src/components/design-system/TyvekCollapsibleSection.tsx +55 -0
- package/src/components/design-system/index.ts +14 -0
- package/src/components/docs/ClientSideMarkdown.tsx +51 -0
- package/src/components/docs/DocsSearchBar.tsx +118 -0
- package/src/components/docs/DocsThemeToggle.tsx +38 -0
- package/src/components/docs/PersistentDocGroup.tsx +91 -0
- package/src/components/docs/ShareUrlButton.tsx +33 -0
- package/src/components/docs/SidebarScrollMemory.tsx +56 -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/CreateViewModal.tsx +88 -0
- package/src/components/layout/LeftRail.tsx +114 -0
- package/src/components/layout/TabBar.tsx +284 -0
- package/src/components/layout/WalletSidebar.tsx +1030 -0
- package/src/components/layout/index.ts +6 -0
- package/src/components/marketing/AuraMaxxSpecOverlay.tsx +653 -0
- package/src/components/marketing/DeviceMorphExperience.tsx +216 -0
- package/src/components/vault/ApiKeysConsole.tsx +1272 -0
- package/src/components/vault/AuditConsole.tsx +600 -0
- package/src/components/vault/CredentialDetail.tsx +625 -0
- package/src/components/vault/CredentialEmpty.tsx +55 -0
- package/src/components/vault/CredentialField.tsx +583 -0
- package/src/components/vault/CredentialForm.tsx +1484 -0
- package/src/components/vault/CredentialList.tsx +265 -0
- package/src/components/vault/CredentialRow.tsx +130 -0
- package/src/components/vault/CredentialShareModal.tsx +273 -0
- package/src/components/vault/CredentialVault.tsx +1662 -0
- package/src/components/vault/CredentialWalletWidget.tsx +103 -0
- package/src/components/vault/DocsConsole.tsx +113 -0
- package/src/components/vault/ImportCredentialsModal.tsx +578 -0
- package/src/components/vault/LargeTypeModal.tsx +88 -0
- package/src/components/vault/PasswordGenerator.tsx +232 -0
- package/src/components/vault/TOTPDisplay.tsx +108 -0
- package/src/components/vault/TotpSetupPanel.tsx +198 -0
- package/src/components/vault/VaultSidebar.tsx +881 -0
- package/src/components/vault/credentialFormName.ts +91 -0
- package/src/components/vault/hooks/useVaultKeyboardShortcuts.ts +69 -0
- package/src/components/vault/types.ts +56 -0
- package/src/context/AuthContext.tsx +365 -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 +4 -0
- package/src/hooks/useAgentActions.ts +552 -0
- package/src/hooks/useBalance.ts +103 -0
- package/src/hooks/useBalances.ts +129 -0
- package/src/hooks/useTheme.ts +156 -0
- package/src/instrumentation.ts +12 -0
- package/src/lib/api-docs.ts +154 -0
- package/src/lib/api.ts +474 -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/credential-field-schema.ts +11 -0
- package/src/lib/crypto.ts +112 -0
- package/src/lib/db.ts +21 -0
- package/src/lib/docs.ts +544 -0
- package/src/lib/events.ts +363 -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/totp-import.ts +57 -0
- package/src/lib/vault-crypto.ts +129 -0
- package/src/lib/view-registry.ts +57 -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 +170 -0
- package/tailwind.config.ts +99 -0
- package/tsconfig.json +42 -0
|
Binary file
|
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
4
|
+
import Link from 'next/link';
|
|
5
|
+
import { useParams } from 'next/navigation';
|
|
6
|
+
import { useAuth } from '@/context/AuthContext';
|
|
7
|
+
import { api, Api, unlockWallet } from '@/lib/api';
|
|
8
|
+
import { generateVaultKeypair } from '@/lib/vault-crypto';
|
|
9
|
+
|
|
10
|
+
interface ActionSummary {
|
|
11
|
+
success: boolean;
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
status: string;
|
|
15
|
+
action: string;
|
|
16
|
+
scope?: string[];
|
|
17
|
+
impact?: string[];
|
|
18
|
+
risk?: string;
|
|
19
|
+
profile?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
type PageState = 'loading' | 'locked' | 'ready';
|
|
23
|
+
|
|
24
|
+
export default function ApproveActionPage() {
|
|
25
|
+
const { actionId } = useParams<{ actionId: string }>();
|
|
26
|
+
const { setToken } = useAuth();
|
|
27
|
+
|
|
28
|
+
const [pageState, setPageState] = useState<PageState>('loading');
|
|
29
|
+
const [action, setAction] = useState<ActionSummary | null>(null);
|
|
30
|
+
|
|
31
|
+
// Unlock form state
|
|
32
|
+
const [password, setPassword] = useState('');
|
|
33
|
+
const [trustDevice, setTrustDevice] = useState(false);
|
|
34
|
+
const [unlockLoading, setUnlockLoading] = useState(false);
|
|
35
|
+
const [resolving, setResolving] = useState(false);
|
|
36
|
+
const [error, setError] = useState<string | null>(null);
|
|
37
|
+
|
|
38
|
+
const fetchAction = useCallback(async () => {
|
|
39
|
+
try {
|
|
40
|
+
const data = await api.get<ActionSummary>(Api.Wallet, `/actions/${encodeURIComponent(actionId)}/summary`);
|
|
41
|
+
setAction(data);
|
|
42
|
+
} catch {
|
|
43
|
+
setAction(null);
|
|
44
|
+
}
|
|
45
|
+
}, [actionId]);
|
|
46
|
+
|
|
47
|
+
// Check setup status on mount
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
let cancelled = false;
|
|
50
|
+
(async () => {
|
|
51
|
+
try {
|
|
52
|
+
const setup = await api.get<{ hasWallet: boolean; unlocked: boolean }>(Api.Wallet, '/setup');
|
|
53
|
+
if (cancelled) return;
|
|
54
|
+
if (!setup.hasWallet) {
|
|
55
|
+
window.location.href = '/';
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (!setup.unlocked) {
|
|
59
|
+
setPageState('locked');
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// Unlocked — fetch action and show approval
|
|
63
|
+
await fetchAction();
|
|
64
|
+
if (!cancelled) setPageState('ready');
|
|
65
|
+
} catch {
|
|
66
|
+
if (!cancelled) setPageState('locked');
|
|
67
|
+
}
|
|
68
|
+
})();
|
|
69
|
+
return () => { cancelled = true; };
|
|
70
|
+
}, [fetchAction]);
|
|
71
|
+
|
|
72
|
+
const handleUnlock = async (e: React.FormEvent) => {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
if (!password) return;
|
|
75
|
+
|
|
76
|
+
setUnlockLoading(true);
|
|
77
|
+
setError(null);
|
|
78
|
+
try {
|
|
79
|
+
const { publicKeyBase64 } = await generateVaultKeypair();
|
|
80
|
+
const data = await unlockWallet(password, undefined, publicKeyBase64);
|
|
81
|
+
if (data.token) {
|
|
82
|
+
setToken(data.token, { persist: trustDevice ? 'local' : 'session' });
|
|
83
|
+
}
|
|
84
|
+
setPassword('');
|
|
85
|
+
// Fetch action summary now that we're unlocked
|
|
86
|
+
await fetchAction();
|
|
87
|
+
setPageState('ready');
|
|
88
|
+
} catch (err) {
|
|
89
|
+
setError((err as Error).message || 'Unlock failed');
|
|
90
|
+
} finally {
|
|
91
|
+
setUnlockLoading(false);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const handleResolve = async (approved: boolean) => {
|
|
96
|
+
setResolving(true);
|
|
97
|
+
setError(null);
|
|
98
|
+
try {
|
|
99
|
+
await api.post(Api.Wallet, `/actions/${encodeURIComponent(actionId)}/resolve`, { approved });
|
|
100
|
+
// Re-fetch action to get the resolved status from the server
|
|
101
|
+
await fetchAction();
|
|
102
|
+
} catch (err) {
|
|
103
|
+
setError((err as Error).message || 'Failed to resolve action');
|
|
104
|
+
} finally {
|
|
105
|
+
setResolving(false);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
// Derive display state from action status
|
|
110
|
+
const state: string = action?.status === 'approved' ? 'approved' : action?.status === 'rejected' ? 'denied' : action?.status === 'expired' ? 'expired' : 'pending';
|
|
111
|
+
|
|
112
|
+
const actionName = action?.action || 'Unspecified action';
|
|
113
|
+
const scopeItems = action?.scope || [];
|
|
114
|
+
const impactItems = action?.impact || [];
|
|
115
|
+
const riskLevel = (action?.risk || 'unknown').toUpperCase();
|
|
116
|
+
const profileName = action?.profile;
|
|
117
|
+
|
|
118
|
+
const hasScopeContext = scopeItems.length > 0 || impactItems.length > 0;
|
|
119
|
+
|
|
120
|
+
const isResolved = state === 'approved' || state === 'denied' || state === 'expired';
|
|
121
|
+
|
|
122
|
+
const statusLabel =
|
|
123
|
+
state === 'approved' ? 'APPROVED'
|
|
124
|
+
: state === 'denied' ? 'DENIED'
|
|
125
|
+
: state === 'expired' ? 'EXPIRED'
|
|
126
|
+
: 'PENDING';
|
|
127
|
+
|
|
128
|
+
const copy =
|
|
129
|
+
state === 'approved'
|
|
130
|
+
? { title: 'ACTION APPROVED', body: 'This request has been approved. Return to your CLI/agent and retry.' }
|
|
131
|
+
: state === 'denied'
|
|
132
|
+
? { title: 'ACTION DENIED', body: 'This request was denied. You can close this page.' }
|
|
133
|
+
: state === 'expired'
|
|
134
|
+
? { title: 'ACTION EXPIRED', body: 'This approval link has expired. Generate a new approval request.' }
|
|
135
|
+
: {
|
|
136
|
+
title: 'REVIEW PERMISSION REQUEST',
|
|
137
|
+
body: 'Confirm what this action can do before choosing Approve or Deny.',
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<div className="min-h-screen bg-[var(--color-background,#f4f4f5)] relative flex items-center justify-center p-4">
|
|
142
|
+
{/* Background — sterile field */}
|
|
143
|
+
<div className="fixed inset-0 pointer-events-none z-0 overflow-hidden">
|
|
144
|
+
<div className="absolute inset-0 bg-grid-adaptive bg-[size:4rem_4rem] opacity-30" />
|
|
145
|
+
<div className="absolute inset-0 tyvek-texture opacity-40 mix-blend-multiply" />
|
|
146
|
+
|
|
147
|
+
{/* Giant background typography */}
|
|
148
|
+
<div className="absolute bottom-[5%] right-[5%] opacity-5 select-none">
|
|
149
|
+
<div className="text-[15vw] font-bold leading-none text-[var(--color-text,#0a0a0a)] font-mono tracking-tighter text-right">
|
|
150
|
+
AURAMAXX
|
|
151
|
+
</div>
|
|
152
|
+
</div>
|
|
153
|
+
|
|
154
|
+
{/* Corner finder patterns */}
|
|
155
|
+
<div className="absolute top-10 left-10 w-32 h-32 border-l-4 border-t-4 border-[var(--color-text,#0a0a0a)] opacity-10">
|
|
156
|
+
<div className="absolute top-2 left-2 w-4 h-4 bg-[var(--color-text,#0a0a0a)]" />
|
|
157
|
+
</div>
|
|
158
|
+
<div className="absolute bottom-10 right-10 w-32 h-32 border-r-4 border-b-4 border-[var(--color-text,#0a0a0a)] opacity-10 flex items-end justify-end">
|
|
159
|
+
<div className="absolute bottom-2 right-2 w-4 h-4 bg-[var(--color-text,#0a0a0a)]" />
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
|
|
163
|
+
{/* Logo header */}
|
|
164
|
+
<div className="fixed top-6 left-6 z-50 flex items-center gap-3">
|
|
165
|
+
<div className="w-10 h-10">
|
|
166
|
+
<img src="/logo.webp" alt="AuraMaxx" className="w-full h-full object-contain" />
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
{/* Nav */}
|
|
171
|
+
<div className="fixed top-7 right-6 z-50 flex items-center gap-3 font-mono text-[10px] tracking-widest">
|
|
172
|
+
<Link href="/docs" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">DOCS</Link>
|
|
173
|
+
<Link href="/api" className="text-[var(--color-text-muted,#6b7280)] hover:text-[var(--color-text,#0a0a0a)] transition-colors">API</Link>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
{/* Main card */}
|
|
177
|
+
<div className="relative z-10 w-full max-w-[420px]">
|
|
178
|
+
{/* Vertical specimen label */}
|
|
179
|
+
<div className="absolute -left-8 top-1/2 -translate-y-1/2 text-vertical label-specimen-sm text-[var(--color-text-faint,#9ca3af)] select-none hidden sm:block">
|
|
180
|
+
PERMISSION REVIEW
|
|
181
|
+
</div>
|
|
182
|
+
<div className="bg-[var(--color-surface,#f4f4f2)] clip-specimen border-mech shadow-mech overflow-hidden font-mono corner-marks">
|
|
183
|
+
{/* Loading state */}
|
|
184
|
+
{pageState === 'loading' && (
|
|
185
|
+
<div className="p-6 flex items-center justify-center gap-2">
|
|
186
|
+
<div className="w-3 h-3 border border-[var(--color-text,#0a0a0a)] border-t-transparent animate-spin" />
|
|
187
|
+
<span className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-widest">LOADING...</span>
|
|
188
|
+
</div>
|
|
189
|
+
)}
|
|
190
|
+
|
|
191
|
+
{/* Locked — unlock form */}
|
|
192
|
+
{pageState === 'locked' && (
|
|
193
|
+
<>
|
|
194
|
+
<div className="px-5 py-3 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
|
|
195
|
+
<span className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
|
|
196
|
+
UNLOCK VAULT
|
|
197
|
+
</span>
|
|
198
|
+
<span className="text-[9px] font-bold tracking-widest text-[var(--color-warning,#ff4d00)]">
|
|
199
|
+
LOCKED
|
|
200
|
+
</span>
|
|
201
|
+
</div>
|
|
202
|
+
<div className="p-6">
|
|
203
|
+
<div className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-wider mb-4">
|
|
204
|
+
Unlock your vault to review this permission request.
|
|
205
|
+
</div>
|
|
206
|
+
<form onSubmit={handleUnlock} className="space-y-4">
|
|
207
|
+
<div>
|
|
208
|
+
<label className="block text-[8px] text-[var(--color-text-faint,#9ca3af)] tracking-widest mb-1.5 uppercase">
|
|
209
|
+
Password
|
|
210
|
+
</label>
|
|
211
|
+
<input
|
|
212
|
+
type="password"
|
|
213
|
+
value={password}
|
|
214
|
+
onChange={(e) => { setPassword(e.target.value); setError(null); }}
|
|
215
|
+
placeholder="Enter vault password"
|
|
216
|
+
className="w-full px-3 py-2.5 border border-[var(--color-border,#d4d4d8)] font-mono text-sm text-[var(--color-text,#0a0a0a)] focus:outline-none focus:border-[var(--color-text,#0a0a0a)] bg-[var(--color-surface,#ffffff)] placeholder-[var(--color-text-faint,#9ca3af)] transition-colors"
|
|
217
|
+
autoFocus
|
|
218
|
+
/>
|
|
219
|
+
</div>
|
|
220
|
+
<label className="flex items-center justify-between gap-3 text-[8px] tracking-widest uppercase text-[var(--color-text-muted,#6b7280)]">
|
|
221
|
+
<span className="inline-flex items-center gap-2">
|
|
222
|
+
<input
|
|
223
|
+
type="checkbox"
|
|
224
|
+
checked={trustDevice}
|
|
225
|
+
onChange={(e) => setTrustDevice(e.target.checked)}
|
|
226
|
+
className="h-3.5 w-3.5 border border-[var(--color-border,#d4d4d8)] accent-[var(--color-text,#0a0a0a)]"
|
|
227
|
+
/>
|
|
228
|
+
Trusted device
|
|
229
|
+
</span>
|
|
230
|
+
<span>{trustDevice ? 'PERSISTENT' : 'TAB ONLY'}</span>
|
|
231
|
+
</label>
|
|
232
|
+
|
|
233
|
+
{error && (
|
|
234
|
+
<div
|
|
235
|
+
data-testid="unlock-error-banner"
|
|
236
|
+
className="text-[9px] text-[var(--color-danger,#ef4444)] px-3 py-2 border"
|
|
237
|
+
style={{
|
|
238
|
+
borderColor: 'color-mix(in srgb, var(--color-danger,#ef4444) 35%, transparent)',
|
|
239
|
+
background: 'color-mix(in srgb, var(--color-danger,#ef4444) 12%, transparent)',
|
|
240
|
+
}}
|
|
241
|
+
>
|
|
242
|
+
{error}
|
|
243
|
+
</div>
|
|
244
|
+
)}
|
|
245
|
+
|
|
246
|
+
<button
|
|
247
|
+
type="submit"
|
|
248
|
+
disabled={unlockLoading || !password}
|
|
249
|
+
className="w-full py-2.5 bg-[var(--color-text,#0a0a0a)] text-[var(--color-surface,#ffffff)] font-mono text-xs tracking-widest font-bold hover:opacity-90 transition-opacity disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center gap-2"
|
|
250
|
+
>
|
|
251
|
+
{unlockLoading ? (
|
|
252
|
+
<>
|
|
253
|
+
<div className="w-3 h-3 border border-[var(--color-surface,#ffffff)] border-t-transparent animate-spin" />
|
|
254
|
+
UNLOCKING...
|
|
255
|
+
</>
|
|
256
|
+
) : (
|
|
257
|
+
'UNLOCK'
|
|
258
|
+
)}
|
|
259
|
+
</button>
|
|
260
|
+
</form>
|
|
261
|
+
</div>
|
|
262
|
+
</>
|
|
263
|
+
)}
|
|
264
|
+
|
|
265
|
+
{/* Ready — approval content */}
|
|
266
|
+
{pageState === 'ready' && (
|
|
267
|
+
<>
|
|
268
|
+
{/* Card header bar */}
|
|
269
|
+
<div className="px-5 py-3 border-b border-[var(--color-border,#d4d4d8)] bg-[var(--color-surface-alt,#fafafa)] flex items-center justify-between">
|
|
270
|
+
<span className="font-sans font-bold text-sm text-[var(--color-text,#0a0a0a)] uppercase tracking-tight">
|
|
271
|
+
{copy.title}
|
|
272
|
+
</span>
|
|
273
|
+
<span className={`text-[9px] font-bold tracking-widest ${state === 'approved' ? 'text-[var(--color-info,#0047ff)]'
|
|
274
|
+
: state === 'denied' ? 'text-[var(--color-danger,#ef4444)]'
|
|
275
|
+
: state === 'expired' ? 'text-[var(--color-text-faint,#9ca3af)]'
|
|
276
|
+
: 'text-[var(--color-warning,#ff4d00)]'
|
|
277
|
+
}`}>
|
|
278
|
+
{statusLabel}
|
|
279
|
+
</span>
|
|
280
|
+
</div>
|
|
281
|
+
|
|
282
|
+
<div className="p-6 space-y-4">
|
|
283
|
+
{/* Status message */}
|
|
284
|
+
<p className="text-[10px] text-[var(--color-text-muted,#6b7280)] tracking-wider">
|
|
285
|
+
{copy.body}
|
|
286
|
+
</p>
|
|
287
|
+
|
|
288
|
+
{/* Action details */}
|
|
289
|
+
<div className="space-y-2">
|
|
290
|
+
<div className="flex items-baseline justify-between gap-2">
|
|
291
|
+
<span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">ACTION</span>
|
|
292
|
+
<span className="text-[11px] text-[var(--color-text,#0a0a0a)] font-bold tracking-wider text-right">{actionName}</span>
|
|
293
|
+
</div>
|
|
294
|
+
{profileName && (
|
|
295
|
+
<div className="flex items-baseline justify-between gap-2">
|
|
296
|
+
<span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">PROFILE</span>
|
|
297
|
+
<span className="text-[11px] text-[var(--color-text,#0a0a0a)] tracking-wider text-right">{profileName}</span>
|
|
298
|
+
</div>
|
|
299
|
+
)}
|
|
300
|
+
<div className="flex items-baseline justify-between gap-2">
|
|
301
|
+
<span className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)]">RISK</span>
|
|
302
|
+
<span className={`text-[11px] font-bold tracking-wider ${riskLevel === 'HIGH' ? 'text-[var(--color-danger,#ef4444)]'
|
|
303
|
+
: riskLevel === 'MEDIUM' ? 'text-[var(--color-warning,#ff4d00)]'
|
|
304
|
+
: 'text-[var(--color-text,#0a0a0a)]'
|
|
305
|
+
}`}>{riskLevel}</span>
|
|
306
|
+
</div>
|
|
307
|
+
<div className="text-[8px] text-[var(--color-text-faint,#9ca3af)] tracking-widest break-all">
|
|
308
|
+
ID: {actionId}
|
|
309
|
+
</div>
|
|
310
|
+
</div>
|
|
311
|
+
|
|
312
|
+
{/* Scope + Impact */}
|
|
313
|
+
{hasScopeContext && (
|
|
314
|
+
<div className="border-t border-[var(--color-border,#d4d4d8)] pt-3 space-y-3">
|
|
315
|
+
{scopeItems.length > 0 && (
|
|
316
|
+
<div>
|
|
317
|
+
<div className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)] mb-1.5">PERMISSIONS</div>
|
|
318
|
+
<div className="space-y-1">
|
|
319
|
+
{scopeItems.map((item) => (
|
|
320
|
+
<div key={item} className="text-[10px] text-[var(--color-text,#0a0a0a)] tracking-wider pl-2 border-l-2 border-[var(--color-border,#d4d4d8)]">
|
|
321
|
+
{item}
|
|
322
|
+
</div>
|
|
323
|
+
))}
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
)}
|
|
327
|
+
{impactItems.length > 0 && (
|
|
328
|
+
<div>
|
|
329
|
+
<div className="label-specimen-sm text-[var(--color-text-faint,#9ca3af)] mb-1.5">IMPACT</div>
|
|
330
|
+
<div className="space-y-1">
|
|
331
|
+
{impactItems.map((item) => (
|
|
332
|
+
<div key={item} className="text-[10px] text-[var(--color-text,#0a0a0a)] tracking-wider pl-2 border-l-2 border-[var(--color-border,#d4d4d8)]">
|
|
333
|
+
{item}
|
|
334
|
+
</div>
|
|
335
|
+
))}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
)}
|
|
339
|
+
</div>
|
|
340
|
+
)}
|
|
341
|
+
|
|
342
|
+
{/* Missing scope warning */}
|
|
343
|
+
{!hasScopeContext && !action && (
|
|
344
|
+
<div className="text-[9px] text-[var(--color-warning,#ff4d00)] bg-[var(--color-warning,#ff4d00)]/10 px-3 py-2 border border-[var(--color-warning,#ff4d00)]/20">
|
|
345
|
+
Could not load action details. Use extra caution and deny if this request is unexpected.
|
|
346
|
+
</div>
|
|
347
|
+
)}
|
|
348
|
+
|
|
349
|
+
{/* Resolve error */}
|
|
350
|
+
{error && (
|
|
351
|
+
<div
|
|
352
|
+
className="text-[9px] text-[var(--color-danger,#ef4444)] px-3 py-2 border"
|
|
353
|
+
style={{
|
|
354
|
+
borderColor: 'color-mix(in srgb, var(--color-danger,#ef4444) 35%, transparent)',
|
|
355
|
+
background: 'color-mix(in srgb, var(--color-danger,#ef4444) 12%, transparent)',
|
|
356
|
+
}}
|
|
357
|
+
>
|
|
358
|
+
{error}
|
|
359
|
+
</div>
|
|
360
|
+
)}
|
|
361
|
+
|
|
362
|
+
{/* Approve / Deny buttons */}
|
|
363
|
+
{!isResolved && (
|
|
364
|
+
<div className="flex gap-2 pt-2">
|
|
365
|
+
<button
|
|
366
|
+
type="button"
|
|
367
|
+
onClick={() => handleResolve(true)}
|
|
368
|
+
disabled={resolving}
|
|
369
|
+
className="flex-1 py-2.5 bg-[var(--color-text,#0a0a0a)] text-[var(--color-surface,#ffffff)] font-mono text-[10px] tracking-widest font-bold text-center hover:opacity-90 transition-opacity clip-specimen-sm disabled:opacity-30 disabled:cursor-not-allowed flex items-center justify-center gap-2"
|
|
370
|
+
>
|
|
371
|
+
{resolving ? (
|
|
372
|
+
<>
|
|
373
|
+
<div className="w-3 h-3 border border-[var(--color-surface,#ffffff)] border-t-transparent animate-spin" />
|
|
374
|
+
RESOLVING...
|
|
375
|
+
</>
|
|
376
|
+
) : (
|
|
377
|
+
'APPROVE'
|
|
378
|
+
)}
|
|
379
|
+
</button>
|
|
380
|
+
<button
|
|
381
|
+
type="button"
|
|
382
|
+
onClick={() => handleResolve(false)}
|
|
383
|
+
disabled={resolving}
|
|
384
|
+
className="flex-1 py-2.5 border border-[var(--color-border,#d4d4d8)] text-[var(--color-text-muted,#6b7280)] font-mono text-[10px] tracking-widest font-bold text-center hover:border-[var(--color-text,#0a0a0a)] hover:text-[var(--color-text,#0a0a0a)] transition-colors disabled:opacity-30 disabled:cursor-not-allowed"
|
|
385
|
+
>
|
|
386
|
+
DENY
|
|
387
|
+
</button>
|
|
388
|
+
</div>
|
|
389
|
+
)}
|
|
390
|
+
|
|
391
|
+
{/* Resolved — link back */}
|
|
392
|
+
{isResolved && (
|
|
393
|
+
<div className="pt-2">
|
|
394
|
+
<Link
|
|
395
|
+
href="/"
|
|
396
|
+
className="block w-full py-2.5 border border-[var(--color-border,#d4d4d8)] text-[var(--color-text-muted,#6b7280)] font-mono text-[10px] tracking-widest font-bold text-center hover:border-[var(--color-text,#0a0a0a)] hover:text-[var(--color-text,#0a0a0a)] transition-colors"
|
|
397
|
+
>
|
|
398
|
+
RETURN TO DASHBOARD
|
|
399
|
+
</Link>
|
|
400
|
+
</div>
|
|
401
|
+
)}
|
|
402
|
+
</div>
|
|
403
|
+
</>
|
|
404
|
+
)}
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
</div>
|
|
408
|
+
);
|
|
409
|
+
}
|