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
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
# Developing Apps
|
|
2
|
+
|
|
3
|
+
Detailed reference for building AuraMaxx UI apps — manifest format, SDK API, theming, security, and storage.
|
|
4
|
+
|
|
5
|
+
For a high-level overview and installation guide, see [APPS.md](./APPS.md). For building strategy apps (tick-based and message-based), see [DEVELOPING-STRATEGIES.md](./wallet/DEVELOPING-STRATEGIES.md). For AI engine internals, see [AI.md](./wallet/AI.md).
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
1. [File Structure](#file-structure)
|
|
10
|
+
2. [App SDK API (window.AuraApp)](#app-sdk-api-windowauraapp)
|
|
11
|
+
3. [Theming](#theming)
|
|
12
|
+
4. [Manifest Reference](#manifest-reference)
|
|
13
|
+
5. [Security Model](#security-model)
|
|
14
|
+
6. [Storage API (REST)](#storage-api-rest)
|
|
15
|
+
7. [Example: Annotated Kanban App](#example-annotated-kanban-app)
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## File Structure
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
apps/
|
|
23
|
+
my-app/
|
|
24
|
+
app.md # Manifest (YAML frontmatter + description)
|
|
25
|
+
index.html # UI entry point (HTML + inline JS/CSS)
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
- `app.md` is required. The engine discovers apps by scanning `apps/*/app.md`.
|
|
29
|
+
- `index.html` is optional. Apps without it show a default placeholder on the dashboard. Strategy-only (headless) apps commonly omit it.
|
|
30
|
+
- The folder name becomes the app `id`.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## App SDK API (`window.AuraApp`)
|
|
35
|
+
|
|
36
|
+
The SDK is automatically injected into every installed app iframe. It is available as `window.AuraApp` (or just `AuraApp`). Storage methods and `fetch()` use direct HTTP calls with an injected Bearer token; `send()` uses direct HTTP; `on()` uses postMessage to communicate with the host.
|
|
37
|
+
|
|
38
|
+
### `AuraApp.storage.get(key)`
|
|
39
|
+
|
|
40
|
+
Read a value from persistent storage.
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
var data = await AuraApp.storage.get('myKey');
|
|
44
|
+
// data is the parsed JSON value, or null if not found
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
- **Parameters:** `key` (string) -- the storage key
|
|
48
|
+
- **Returns:** `Promise<any>` -- the stored value, or `null` if the key does not exist
|
|
49
|
+
|
|
50
|
+
### `AuraApp.storage.set(key, value)`
|
|
51
|
+
|
|
52
|
+
Write a value to persistent storage. Values are JSON-serialized.
|
|
53
|
+
|
|
54
|
+
```javascript
|
|
55
|
+
await AuraApp.storage.set('myKey', { count: 42, items: ['a', 'b'] });
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
- **Parameters:** `key` (string), `value` (any JSON-serializable value)
|
|
59
|
+
- **Returns:** `Promise<any>` -- the stored value on success
|
|
60
|
+
- **Behavior:** Upserts -- creates the key if it does not exist, updates if it does
|
|
61
|
+
|
|
62
|
+
### `AuraApp.storage.delete(key)`
|
|
63
|
+
|
|
64
|
+
Delete a key from persistent storage.
|
|
65
|
+
|
|
66
|
+
```javascript
|
|
67
|
+
var ok = await AuraApp.storage.delete('myKey');
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
- **Parameters:** `key` (string)
|
|
71
|
+
- **Returns:** `Promise<boolean>` -- `true` on success
|
|
72
|
+
- **Error:** Rejects if the key does not exist
|
|
73
|
+
|
|
74
|
+
### `AuraApp.send(message)`
|
|
75
|
+
|
|
76
|
+
Send a natural language message to the app's AI and receive a reply.
|
|
77
|
+
|
|
78
|
+
```javascript
|
|
79
|
+
var reply = await AuraApp.send('Check the ETH balance on my hot wallet');
|
|
80
|
+
console.log(reply); // "Your hot wallet has 2.5 ETH"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- **Parameters:** `message` (string) -- natural language instruction
|
|
84
|
+
- **Returns:** `Promise<string | null>` -- the AI's text reply, or `null` if no reply was generated
|
|
85
|
+
- **Rate limit:** 10 messages per 60 seconds per app
|
|
86
|
+
- **Requires:** App must have a `hooks.message` field in its manifest
|
|
87
|
+
|
|
88
|
+
### `AuraApp.fetch(url, options)`
|
|
89
|
+
|
|
90
|
+
Fetch an external URL via the server-side proxy. Apps run in sandboxed `blob:` iframes with an opaque origin, so direct `fetch()` calls to external APIs will fail with CORS errors. This method proxies the request through the wallet server.
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
// Simple GET
|
|
94
|
+
var data = await AuraApp.fetch('https://api.example.com/prices');
|
|
95
|
+
|
|
96
|
+
// POST with headers
|
|
97
|
+
var result = await AuraApp.fetch('https://api.example.com/submit', {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: { 'Content-Type': 'application/json' },
|
|
100
|
+
body: JSON.stringify({ token: '0xABC' })
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
- **Parameters:**
|
|
105
|
+
- `url` (string) -- the external URL to fetch (must be HTTP or HTTPS)
|
|
106
|
+
- `options` (object, optional): `method`, `headers`, `body`
|
|
107
|
+
- **Returns:** `Promise<any>` -- parsed JSON or text string
|
|
108
|
+
- **Rate limit:** 60 requests per 60 seconds per app
|
|
109
|
+
- **Restrictions:** Only HTTP/HTTPS; private IPs blocked (SSRF prevention); 10s timeout
|
|
110
|
+
|
|
111
|
+
### `AuraApp.action(params)`
|
|
112
|
+
|
|
113
|
+
Request human approval for a privileged operation. Creates a pending action request. On approval, a temporary scoped token is created and the action auto-executes.
|
|
114
|
+
|
|
115
|
+
```javascript
|
|
116
|
+
var result = await AuraApp.action({
|
|
117
|
+
summary: 'Buy $DOGE2 for 0.005 ETH',
|
|
118
|
+
permissions: ['swap'],
|
|
119
|
+
limits: { swap: 0.005 },
|
|
120
|
+
walletAccess: ['0x...'],
|
|
121
|
+
ttl: 60
|
|
122
|
+
});
|
|
123
|
+
// result = { success: true, requestId: '...', secret: '...' }
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- **Parameters:** `params` (object): `summary` (string, required), `permissions` (string[], required), `limits` (object), `walletAccess` (string[]), `ttl` (number)
|
|
127
|
+
- **Returns:** `Promise<{ success, requestId, secret }>`
|
|
128
|
+
- **Requires:** `action:create` permission in the manifest
|
|
129
|
+
|
|
130
|
+
**Event sequence on approval:** `action:resolved` → `action:executed` → `agent:message`
|
|
131
|
+
|
|
132
|
+
### `AuraApp.on(channel, callback)`
|
|
133
|
+
|
|
134
|
+
Subscribe to a real-time event channel. Events are forwarded from the WebSocket to your iframe via postMessage.
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
var unsub = AuraApp.on('tx:created', function(data) {
|
|
138
|
+
console.log('New transaction:', data);
|
|
139
|
+
});
|
|
140
|
+
unsub(); // unsubscribe
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
- **Parameters:** `channel` (string), `callback` (function)
|
|
144
|
+
- **Returns:** unsubscribe function
|
|
145
|
+
|
|
146
|
+
#### Common Event Channels
|
|
147
|
+
|
|
148
|
+
| Channel | Data | Description |
|
|
149
|
+
|---------|------|-------------|
|
|
150
|
+
| `tx:created` | `{walletAddress, id, type, txHash, amount}` | New transaction |
|
|
151
|
+
| `asset:changed` | `{walletAddress, tokenAddress, symbol}` | Asset added/removed |
|
|
152
|
+
| `wallet:created` | `{address, tier, chain}` | New wallet created |
|
|
153
|
+
| `strategy:tick` | `{strategyId, intents, duration, state}` | Strategy tick completed |
|
|
154
|
+
| `strategy:error` | `{strategyId, error, phase}` | Strategy error |
|
|
155
|
+
| `action:executed` | `{requestId, approved, status, result}` | Action auto-executed (app-scoped) |
|
|
156
|
+
| `agent:message` | `{message}` | AI follow-up after action (app-scoped) |
|
|
157
|
+
|
|
158
|
+
Strategy hooks can emit custom app-scoped events via the `emit` field in hook responses:
|
|
159
|
+
|
|
160
|
+
```json
|
|
161
|
+
{ "emit": { "channel": "price-update", "data": { "price": 42 } } }
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Theming
|
|
167
|
+
|
|
168
|
+
The host injects CSS variables from the current theme into every app iframe. Use these to match the dashboard in both light and dark modes.
|
|
169
|
+
|
|
170
|
+
### CSS Variables
|
|
171
|
+
|
|
172
|
+
| Variable | Purpose | Fallback |
|
|
173
|
+
|----------|---------|----------|
|
|
174
|
+
| `--color-background` | Page background | `#fafafa` |
|
|
175
|
+
| `--color-background-alt` | Alternate background | `#f4f4f5` |
|
|
176
|
+
| `--color-surface` | App/card background | `#ffffff` |
|
|
177
|
+
| `--color-surface-alt` | Alternate surface | `#f9fafb` |
|
|
178
|
+
| `--color-text` | Primary text | `#0a0a0a` |
|
|
179
|
+
| `--color-text-muted` | Secondary text | `#6b7280` |
|
|
180
|
+
| `--color-text-faint` | Tertiary text | `#9ca3af` |
|
|
181
|
+
| `--color-border` | Standard borders | `#d4d4d8` |
|
|
182
|
+
| `--color-border-muted` | Subtle borders | `#e4e4e7` |
|
|
183
|
+
| `--color-border-focus` | Focused borders | `#0a0a0a` |
|
|
184
|
+
| `--color-accent` | Accent/highlight | `#ccff00` |
|
|
185
|
+
| `--color-info` | Info accent | `#0047ff` |
|
|
186
|
+
| `--color-success` | Success state | `#22c55e` |
|
|
187
|
+
| `--color-warning` | Warning state | `#ff4d00` |
|
|
188
|
+
| `--color-danger` | Error/danger state | `#ef4444` |
|
|
189
|
+
|
|
190
|
+
Always provide fallback values:
|
|
191
|
+
|
|
192
|
+
```css
|
|
193
|
+
body {
|
|
194
|
+
background: var(--color-surface, #fff);
|
|
195
|
+
color: var(--color-text, #0a0a0a);
|
|
196
|
+
font-family: ui-monospace, monospace;
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Injected Base Styles
|
|
201
|
+
|
|
202
|
+
The host injects a base reset into every app:
|
|
203
|
+
|
|
204
|
+
```css
|
|
205
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
206
|
+
body {
|
|
207
|
+
font-family: ui-monospace, monospace;
|
|
208
|
+
overflow: auto;
|
|
209
|
+
background: var(--color-surface, #fff);
|
|
210
|
+
color: var(--color-text, #0a0a0a);
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Your app's own `<style>` blocks are applied after this reset.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Manifest Reference
|
|
219
|
+
|
|
220
|
+
The manifest is a Markdown file with YAML frontmatter. The body text after `---` is the description shown in the App Store.
|
|
221
|
+
|
|
222
|
+
```markdown
|
|
223
|
+
---
|
|
224
|
+
name: My App
|
|
225
|
+
icon: Zap
|
|
226
|
+
# ...fields...
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
Description shown in the App Store listing.
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Base Fields
|
|
233
|
+
|
|
234
|
+
| Field | Type | Required | Default | Description |
|
|
235
|
+
|-------|------|:---:|---------|-------------|
|
|
236
|
+
| `name` | string | yes | folder name | Display name |
|
|
237
|
+
| `icon` | string | no | `Box` | [Lucide](https://lucide.dev) icon name |
|
|
238
|
+
| `category` | string | no | `general` | App Store category filter |
|
|
239
|
+
| `size` | string | no | `1x1` | Default grid size `WxH` (1=320x280, 2=640x560, 3=960x840) |
|
|
240
|
+
| `permissions` | string[] | no | `[]` | Wallet permissions the app needs |
|
|
241
|
+
| `data` | string[] | no | `[]` | Real-time WebSocket channels to subscribe to (informational) |
|
|
242
|
+
|
|
243
|
+
### Permissions
|
|
244
|
+
|
|
245
|
+
Declare the permissions your app needs. Apps with permissions or limits require human approval before the engine creates auth tokens for them. Zero-permission apps skip approval.
|
|
246
|
+
|
|
247
|
+
Valid permission strings (see [AUTH.md](./AUTH.md) for full details):
|
|
248
|
+
|
|
249
|
+
| Permission | Description |
|
|
250
|
+
|------------|-------------|
|
|
251
|
+
| `wallet:list` | List/view wallets and balances |
|
|
252
|
+
| `wallet:create:hot` | Create hot wallets |
|
|
253
|
+
| `wallet:create:temp` | Create temp wallets |
|
|
254
|
+
| `wallet:rename` | Rename wallets |
|
|
255
|
+
| `wallet:export` | Export private keys |
|
|
256
|
+
| `send:hot` | Send from hot wallets |
|
|
257
|
+
| `send:temp` | Send from temp wallets |
|
|
258
|
+
| `swap` | Execute token swaps |
|
|
259
|
+
| `fund` | Transfer cold to hot |
|
|
260
|
+
| `launch` | Launch tokens via Doppler |
|
|
261
|
+
| `action:create` | Create human action requests |
|
|
262
|
+
| `apikey:get` | Read API keys |
|
|
263
|
+
| `apikey:set` | Manage API keys |
|
|
264
|
+
| `strategy:read` | View strategies |
|
|
265
|
+
| `strategy:manage` | Enable/disable strategies |
|
|
266
|
+
| `trade:all` | Compound: all trading + apikey:get |
|
|
267
|
+
| `wallet:write` | Compound: all wallet write ops |
|
|
268
|
+
|
|
269
|
+
### Extending Your App with Strategy Fields
|
|
270
|
+
|
|
271
|
+
Any app can become AI-powered by adding strategy fields to its `app.md` manifest. A strategy is just an app that activates the AI engine — there is no separate directory or manifest format.
|
|
272
|
+
|
|
273
|
+
The strategy-specific fields are:
|
|
274
|
+
|
|
275
|
+
| Field | Purpose |
|
|
276
|
+
|-------|---------|
|
|
277
|
+
| `ticker` | Schedule tick interval (`sniper`, `active`, `standard`, `slow`, `maintenance`) |
|
|
278
|
+
| `jobs` | Multi-interval scheduling (alternative to `ticker`) |
|
|
279
|
+
| `hooks` | Natural-language AI instructions (`tick`, `message`, `init`, `execute`, `result`, `shutdown`) |
|
|
280
|
+
| `sources` | External data endpoints fetched each tick |
|
|
281
|
+
| `keys` | API key declarations |
|
|
282
|
+
| `config` | Strategy configuration passed to hooks |
|
|
283
|
+
| `limits` | Spending caps (`fund`, `send`) |
|
|
284
|
+
| `allowedHosts` | Hostnames allowed for external fetches |
|
|
285
|
+
|
|
286
|
+
Adding any of these fields turns your app into a strategy. The base fields (`name`, `icon`, `category`, `size`, `permissions`, `data`) remain the same.
|
|
287
|
+
|
|
288
|
+
See [DEVELOPING-STRATEGIES.md](./wallet/DEVELOPING-STRATEGIES.md) for the full reference on these fields, hook lifecycle, sources, intents, and examples.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Security Model
|
|
293
|
+
|
|
294
|
+
Installed apps run in a strict sandbox with isolation guarantees.
|
|
295
|
+
|
|
296
|
+
### Sandbox Restrictions
|
|
297
|
+
|
|
298
|
+
The iframe is created with `sandbox="allow-scripts"` **without** `allow-same-origin`:
|
|
299
|
+
|
|
300
|
+
| Capability | Allowed? | Reason |
|
|
301
|
+
|-----------|----------|--------|
|
|
302
|
+
| JavaScript execution | Yes | `allow-scripts` is set |
|
|
303
|
+
| Access parent DOM | No | No `allow-same-origin` |
|
|
304
|
+
| Read/write cookies | No | Opaque origin |
|
|
305
|
+
| Use localStorage/sessionStorage | No | Opaque origin |
|
|
306
|
+
| Submit forms | No | No `allow-forms` |
|
|
307
|
+
| Open popups | No | No `allow-popups` |
|
|
308
|
+
| Navigate top frame | No | No `allow-top-navigation` |
|
|
309
|
+
|
|
310
|
+
Apps are loaded via blob URLs (opaque origin `null`). Each app runs in complete isolation from the parent page and other apps.
|
|
311
|
+
|
|
312
|
+
### Communication Model
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
App iframe --fetch()--------> Express :4242/apps/<id>/storage/* (Bearer token)
|
|
316
|
+
App iframe --fetch()--------> Express :4242/apps/<id>/message (Bearer token)
|
|
317
|
+
App iframe --fetch()--------> Express :4242/apps/<id>/fetch (Bearer token, proxied)
|
|
318
|
+
App iframe --postMessage--> Host (subscriptions via on())
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
The Bearer token is injected as `window.__AURA_TOKEN__` before the SDK loads. Tokens are scoped per-app and carry only `app:storage` permission by default.
|
|
322
|
+
|
|
323
|
+
### What Apps Cannot Do
|
|
324
|
+
|
|
325
|
+
- Access the parent page's DOM, JavaScript scope, or React state
|
|
326
|
+
- Read admin tokens or wallet credentials (apps get scoped tokens)
|
|
327
|
+
- Access other apps' storage (tokens scoped by app ID)
|
|
328
|
+
- Load external scripts (`<script src="...">` tags are stripped)
|
|
329
|
+
- Fetch private/internal IPs (SSRF prevention)
|
|
330
|
+
|
|
331
|
+
---
|
|
332
|
+
|
|
333
|
+
## Storage API (REST)
|
|
334
|
+
|
|
335
|
+
The SDK wraps these endpoints, but they can also be called directly with a Bearer token.
|
|
336
|
+
|
|
337
|
+
### Endpoints (Express :4242)
|
|
338
|
+
|
|
339
|
+
| Endpoint | Method | Permission | Description |
|
|
340
|
+
|----------|--------|------------|-------------|
|
|
341
|
+
| `/apps/:appId/storage` | GET | `app:storage` | List all keys and values |
|
|
342
|
+
| `/apps/:appId/storage/:key` | GET | `app:storage` | Read a single value |
|
|
343
|
+
| `/apps/:appId/storage/:key` | PUT | `app:storage` | Write a value (upsert) |
|
|
344
|
+
| `/apps/:appId/storage/:key` | DELETE | `app:storage` | Delete a key |
|
|
345
|
+
| `/apps/:appId/apikey/:keyName` | GET | `app:accesskey` | Read an API key |
|
|
346
|
+
| `/apps/:appId/approve` | POST | `strategy:manage` | Approve app permissions |
|
|
347
|
+
| `/apps/:appId/approve` | DELETE | `strategy:manage` | Revoke app approval |
|
|
348
|
+
| `/apps/:appId/token` | GET | admin | Get app's Bearer token |
|
|
349
|
+
|
|
350
|
+
Storage is scoped by `appId`. A token with `app:storage` can only access storage matching its own `agentId`. Use `app:storage:all` for cross-app access.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Example: Annotated Kanban App
|
|
355
|
+
|
|
356
|
+
A complete UI app (`apps/example-kanban/`) demonstrating storage, theming, and vanilla JS patterns.
|
|
357
|
+
|
|
358
|
+
### Manifest (`app.md`)
|
|
359
|
+
|
|
360
|
+
```markdown
|
|
361
|
+
---
|
|
362
|
+
name: Kanban Board
|
|
363
|
+
icon: LayoutGrid
|
|
364
|
+
category: productivity
|
|
365
|
+
size: 2x2
|
|
366
|
+
permissions:
|
|
367
|
+
data:
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
A simple kanban board for tracking tasks. Demonstrates app storage
|
|
371
|
+
persistence -- your cards survive page reloads.
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Entry Point (`index.html`)
|
|
375
|
+
|
|
376
|
+
```html
|
|
377
|
+
<!DOCTYPE html>
|
|
378
|
+
<html>
|
|
379
|
+
<head>
|
|
380
|
+
<style>
|
|
381
|
+
body {
|
|
382
|
+
font-family: ui-monospace, monospace;
|
|
383
|
+
background: var(--color-surface, #fff);
|
|
384
|
+
color: var(--color-text, #0a0a0a);
|
|
385
|
+
padding: 8px;
|
|
386
|
+
font-size: 10px;
|
|
387
|
+
}
|
|
388
|
+
.column {
|
|
389
|
+
border: 1px solid var(--color-border, #d4d4d8);
|
|
390
|
+
background: var(--color-background-alt, #f4f4f5);
|
|
391
|
+
}
|
|
392
|
+
.card {
|
|
393
|
+
background: var(--color-surface, #fff);
|
|
394
|
+
border: 1px solid var(--color-border, #d4d4d8);
|
|
395
|
+
}
|
|
396
|
+
.card:hover {
|
|
397
|
+
border-color: var(--color-border-focus, #0a0a0a);
|
|
398
|
+
}
|
|
399
|
+
</style>
|
|
400
|
+
</head>
|
|
401
|
+
<body>
|
|
402
|
+
<div class="header">
|
|
403
|
+
<span class="title">Kanban</span>
|
|
404
|
+
<button class="add-btn" onclick="showAddForm()">+ ADD</button>
|
|
405
|
+
</div>
|
|
406
|
+
<div class="columns" id="columns"></div>
|
|
407
|
+
|
|
408
|
+
<script>
|
|
409
|
+
var app = window.AuraApp;
|
|
410
|
+
var state = { cards: [] };
|
|
411
|
+
|
|
412
|
+
function save() {
|
|
413
|
+
if (app && app.storage) {
|
|
414
|
+
app.storage.set('kanban', state).catch(function() {});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function init() {
|
|
419
|
+
if (app && app.storage) {
|
|
420
|
+
app.storage.get('kanban').then(function(data) {
|
|
421
|
+
if (data && data.cards) { state = data; }
|
|
422
|
+
render();
|
|
423
|
+
}).catch(function() { render(); });
|
|
424
|
+
} else {
|
|
425
|
+
render();
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function escapeHtml(str) {
|
|
430
|
+
var div = document.createElement('div');
|
|
431
|
+
div.textContent = str;
|
|
432
|
+
return div.innerHTML;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function render() {
|
|
436
|
+
// Build columns, cards, drag-and-drop handlers
|
|
437
|
+
// Each state change calls save() then render()
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
init();
|
|
441
|
+
</script>
|
|
442
|
+
</body>
|
|
443
|
+
</html>
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
### Key Patterns
|
|
447
|
+
|
|
448
|
+
1. **Theme integration** -- All colors use `var(--color-*)` with fallbacks
|
|
449
|
+
2. **Storage persistence** -- `storage.get()` on init, `storage.set()` on every change
|
|
450
|
+
3. **Graceful degradation** -- Works even if `AuraApp` is not available
|
|
451
|
+
4. **XSS prevention** -- User input escaped via `textContent`/`innerHTML`
|
|
452
|
+
5. **Vanilla JS only** -- No build step, no external dependencies
|
|
453
|
+
6. **Inline everything** -- All CSS and JS in a single file (external `<script src>` tags are stripped)
|
package/docs/MCP.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# MCP
|
|
2
|
+
|
|
3
|
+
AuraMaxx MCP server exposes credential vault and wallet APIs to MCP clients over stdio.
|
|
4
|
+
|
|
5
|
+
## Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
auramaxx
|
|
9
|
+
auramaxx mcp
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`auramaxx` starts the API server on `http://localhost:4242` and dashboard UI on `http://localhost:4747`.
|
|
13
|
+
|
|
14
|
+
Auto-configure local IDE MCP files:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
auramaxx mcp --install
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Per-client setup (exact locations + JSON)
|
|
21
|
+
|
|
22
|
+
Use the client-specific setup guide:
|
|
23
|
+
|
|
24
|
+
- `docs/AGENT_SETUP.md`
|
|
25
|
+
|
|
26
|
+
It includes exact config locations, copy-paste JSON, restart steps, and quick verification for Cursor, Codex, Claude Desktop, OpenClaw, and generic MCP clients.
|
|
27
|
+
|
|
28
|
+
## MCP Resources
|
|
29
|
+
|
|
30
|
+
- `docs://api`
|
|
31
|
+
- `docs://auth`
|
|
32
|
+
- `docs://guide`
|
|
33
|
+
|
|
34
|
+
## Tools (12)
|
|
35
|
+
|
|
36
|
+
| # | Tool | Description |
|
|
37
|
+
|---|------|-------------|
|
|
38
|
+
| 1 | `get_secret` | Look up a credential by name/tag, decrypt and return all fields |
|
|
39
|
+
| 2 | `put_secret` | Store a new credential (note type) in the default vault |
|
|
40
|
+
| 3 | `list_secrets` | List credentials with optional query/tag/vault/lifecycle filters |
|
|
41
|
+
| 4 | `del_secret` | Delete a credential by name |
|
|
42
|
+
| 5 | `inject_secret` | Read a credential and inject its value as an env var (or into a child process) |
|
|
43
|
+
| 6 | `share_secret` | Create a time-limited shareable link for a credential |
|
|
44
|
+
| 7 | `api` | Generic AuraMaxx API caller (any endpoint, any method) |
|
|
45
|
+
| 8 | `auth` | Request an authenticated session token (ephemeral RSA + human approval polling) |
|
|
46
|
+
| 9 | `get_token` | Check if session has an active token (poll after `auth` for approval status) |
|
|
47
|
+
| 10 | `status` | Get server setup/unlock health state |
|
|
48
|
+
| 11 | `start` | Start the AuraMaxx server in headless mode if not already running |
|
|
49
|
+
| 12 | `write_diary` | Append an entry to a daily diary note |
|
|
50
|
+
|
|
51
|
+
`api` is the generic fallback for any endpoint; the other tools provide typed, higher-level operations.
|
|
52
|
+
|
|
53
|
+
## Skill Install
|
|
54
|
+
|
|
55
|
+
Install AuraMaxx skills for your AI agents:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npx auramaxx skill
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This auto-installs skills for Claude, Codex, and OpenClaw. Verify with:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx auramaxx skill --doctor
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
If auto-install fails, use the fallback:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
cd <your-codebase> && npx -y skills add Aura-Industry/auramaxx
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
For a pushed GitHub ref (branch or commit):
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
python3 ~/.codex/skills/.system/skill-installer/scripts/install-skill-from-github.py \
|
|
77
|
+
--repo Aura-Industry/auramaxx \
|
|
78
|
+
--path skills/auramaxx \
|
|
79
|
+
--ref <branch-or-commit>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`write_diary` appends to `{YYYY-MM-DD}_LOGS` notes using agent vault by default, with fallback to primary vault.
|
|
83
|
+
Diary notes use canonical note field key `content` (`value` is accepted as a legacy alias and normalized).
|
|
84
|
+
|
|
85
|
+
## Credential read flow via MCP
|
|
86
|
+
|
|
87
|
+
1. Obtain token (`auth` tool, or socket bootstrap, or `AURA_TOKEN` env var)
|
|
88
|
+
2. If using `auth`, poll with `get_token` until `hasToken: true` (approval is async)
|
|
89
|
+
3. Call `get_secret` (high-level) or `api` POST `/credentials/:id/read` (low-level)
|
|
90
|
+
4. Decrypt returned `encrypted` payload in your MCP host
|
|
91
|
+
|
|
92
|
+
Note:
|
|
93
|
+
- Typed tools (`get_secret`, `put_secret`, `del_secret`, `share_secret`, `inject_secret`, `write_diary`) use the active MCP token directly.
|
|
94
|
+
- Typed helpers have **built-in 403 escalation** — on permission denied they automatically return a structured `requiresHumanApproval` response. You do not need to detect 403s yourself for typed tools.
|
|
95
|
+
- The generic `api` tool does **not** auto-escalate — on 403, check the error response and request appropriate permissions via `auth`.
|
|
96
|
+
|
|
97
|
+
## 403 escalation ladder
|
|
98
|
+
|
|
99
|
+
1. Call the typed tool or `api`.
|
|
100
|
+
2. If 403, typed tools auto-return a `nextStep` with the `api` call params — follow it.
|
|
101
|
+
For `api`, request a new token via `auth` with the required profile/permissions.
|
|
102
|
+
3. Tell the human to approve in the dashboard at `http://localhost:4747` (or via Telegram/CLI adapter).
|
|
103
|
+
4. **Never** retry the same blocked call without escalating first.
|
|
104
|
+
|
|
105
|
+
## Safety pattern
|
|
106
|
+
|
|
107
|
+
- Start with least privilege (`secret:read`, narrow `credentialAccess.read` scopes)
|
|
108
|
+
- Typed tools auto-escalate on 403; for `api`, use `auth` to request a new token
|
|
109
|
+
- Tell the human to approve at `http://localhost:4747`
|
|
110
|
+
- Avoid broad long-lived tokens
|
|
111
|
+
|
|
112
|
+
## Example call
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"method": "POST",
|
|
117
|
+
"endpoint": "/credentials/cred-123/read",
|
|
118
|
+
"body": {}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
See also: [GETTING_SECRETS](./external/HOW_TO_AURAMAXX/GETTING_SECRETS.md), [AUTH](./AUTH.md), and [Troubleshooting](./TROUBLESHOOTING.md).
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Packaging Policy (npm publish)
|
|
2
|
+
|
|
3
|
+
Published package should include only runtime-required code and public docs.
|
|
4
|
+
|
|
5
|
+
## Intentionally excluded
|
|
6
|
+
- `pipeline/**` tasking artifacts
|
|
7
|
+
- `docs/internal/**` internal-only runbooks
|
|
8
|
+
- `docs/specs/**` draft/spec docs not needed at runtime
|
|
9
|
+
- test folders/data (`server/tests/**`, `server/test-data/**`, `src/__tests__/**`)
|
|
10
|
+
- local/dev DB files under `prisma/**.db*`
|
|
11
|
+
|
|
12
|
+
## Validation rule
|
|
13
|
+
Before release, run:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm pack --dry-run --json
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Review tarball file list for accidental internal/dev leakage.
|