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,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core interfaces for the approval adapter system.
|
|
3
|
+
*
|
|
4
|
+
* Adapters receive action notifications and relay human decisions
|
|
5
|
+
* back to the wallet server via POST /actions/:id/resolve.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { VerifiedSummary } from '../verified-summary';
|
|
9
|
+
|
|
10
|
+
/** Notification sent to adapters when an action is created */
|
|
11
|
+
export interface ActionNotification {
|
|
12
|
+
id: string;
|
|
13
|
+
type: string;
|
|
14
|
+
source: string;
|
|
15
|
+
summary: string;
|
|
16
|
+
expiresAt: number | null;
|
|
17
|
+
metadata?: Record<string, unknown>;
|
|
18
|
+
verifiedSummary?: VerifiedSummary;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Resolution sent to adapters when an action is resolved (by any channel) */
|
|
22
|
+
export interface ActionResolution {
|
|
23
|
+
id: string;
|
|
24
|
+
type: string;
|
|
25
|
+
approved: boolean;
|
|
26
|
+
resolvedBy: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Incoming chat message from an adapter */
|
|
30
|
+
export interface ChatMessage {
|
|
31
|
+
/** Raw text from the user */
|
|
32
|
+
text: string;
|
|
33
|
+
/** Adapter-specific sender ID (Telegram chat ID, etc.) */
|
|
34
|
+
senderId: string;
|
|
35
|
+
/** Optional: explicit app target (e.g., "/app-name" prefix) */
|
|
36
|
+
targetApp?: string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Reply from the AI engine to an adapter chat message */
|
|
40
|
+
export interface ChatReply {
|
|
41
|
+
text: string;
|
|
42
|
+
/** Optional metadata for rich formatting */
|
|
43
|
+
metadata?: Record<string, unknown>;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Options passed when resolving an action */
|
|
47
|
+
export interface ResolveOptions {
|
|
48
|
+
walletAccess?: string[];
|
|
49
|
+
limits?: { fund?: number; send?: number; swap?: number };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Result of a resolve call */
|
|
53
|
+
export interface ResolveResult {
|
|
54
|
+
success: boolean;
|
|
55
|
+
error?: string;
|
|
56
|
+
token?: string;
|
|
57
|
+
agentId?: string;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Context provided to adapters on start */
|
|
61
|
+
export interface AdapterContext {
|
|
62
|
+
/** Resolve an action by ID */
|
|
63
|
+
resolve(actionId: string, approved: boolean, opts?: ResolveOptions): Promise<ResolveResult>;
|
|
64
|
+
/** Base URL of the wallet server */
|
|
65
|
+
serverUrl: string;
|
|
66
|
+
/** Route a chat message to a app's AI */
|
|
67
|
+
sendMessage(appId: string, text: string, onProgress?: (status: string) => void, adapter?: string): Promise<{ reply: string | null; error?: string }>;
|
|
68
|
+
/** Resolve which app should handle a message */
|
|
69
|
+
resolveApp(targetApp?: string): Promise<string | null>;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Approval adapter interface — implement this for new channels */
|
|
73
|
+
export interface ApprovalAdapter {
|
|
74
|
+
/** Unique name for this adapter instance */
|
|
75
|
+
name: string;
|
|
76
|
+
/** Start the adapter (called once with context) */
|
|
77
|
+
start(ctx: AdapterContext): Promise<void>;
|
|
78
|
+
/** Called when an action is created and needs human review */
|
|
79
|
+
notify(action: ActionNotification): Promise<void>;
|
|
80
|
+
/** Called when an action is resolved (so adapter can clean up UI) */
|
|
81
|
+
resolved(resolution: ActionResolution): Promise<void>;
|
|
82
|
+
/** Stop the adapter and clean up resources */
|
|
83
|
+
stop(): Promise<void>;
|
|
84
|
+
/** Optional: handle incoming chat messages (adapters that support chat) */
|
|
85
|
+
onMessage?(message: ChatMessage): Promise<ChatReply | null>;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Factory function type for creating adapters */
|
|
89
|
+
export type AdapterFactory = (config: Record<string, unknown>) => ApprovalAdapter;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook adapter — notification-only.
|
|
3
|
+
*
|
|
4
|
+
* POSTs action notifications and resolutions to a configured URL.
|
|
5
|
+
* Useful for Slack incoming webhooks, Discord webhooks, ntfy, or
|
|
6
|
+
* any HTTP endpoint that wants to receive approval events.
|
|
7
|
+
*
|
|
8
|
+
* This adapter does NOT handle responses — it only pushes events out.
|
|
9
|
+
* To approve/reject from a webhook target, build a bidirectional adapter
|
|
10
|
+
* (like the Telegram adapter) or have the target POST to /actions/:id/resolve.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { createHmac } from 'crypto';
|
|
14
|
+
import { validateExternalUrl } from '../network';
|
|
15
|
+
import type {
|
|
16
|
+
ApprovalAdapter,
|
|
17
|
+
AdapterContext,
|
|
18
|
+
ActionNotification,
|
|
19
|
+
ActionResolution,
|
|
20
|
+
} from './types';
|
|
21
|
+
import { getErrorMessage } from '../error';
|
|
22
|
+
|
|
23
|
+
export interface WebhookAdapterConfig {
|
|
24
|
+
/** URL to POST notifications to */
|
|
25
|
+
url: string;
|
|
26
|
+
/** Optional HMAC-SHA256 secret for signing payloads */
|
|
27
|
+
secret?: string;
|
|
28
|
+
/** Optional custom headers to include */
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class WebhookAdapter implements ApprovalAdapter {
|
|
33
|
+
readonly name: string;
|
|
34
|
+
private config: WebhookAdapterConfig;
|
|
35
|
+
|
|
36
|
+
constructor(config: WebhookAdapterConfig) {
|
|
37
|
+
this.name = `webhook:${new URL(config.url).hostname}`;
|
|
38
|
+
this.config = config;
|
|
39
|
+
// Validate URL synchronously at construction — DNS check happens at send time
|
|
40
|
+
const parsed = new URL(config.url);
|
|
41
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
42
|
+
throw new Error(`Webhook URL must use http: or https: (got ${parsed.protocol})`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async start(_ctx: AdapterContext): Promise<void> {
|
|
47
|
+
// Nothing to initialize
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async notify(action: ActionNotification): Promise<void> {
|
|
51
|
+
await this.post('action:created', action);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async resolved(resolution: ActionResolution): Promise<void> {
|
|
55
|
+
await this.post('action:resolved', resolution);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async stop(): Promise<void> {
|
|
59
|
+
// Nothing to clean up
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private async post(eventType: string, data: unknown): Promise<void> {
|
|
63
|
+
const payload = JSON.stringify({ type: eventType, data, timestamp: Date.now() });
|
|
64
|
+
|
|
65
|
+
const headers: Record<string, string> = {
|
|
66
|
+
'Content-Type': 'application/json',
|
|
67
|
+
...this.config.headers,
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
// Add HMAC signature if secret is configured
|
|
71
|
+
if (this.config.secret) {
|
|
72
|
+
const signature = createHmac('sha256', this.config.secret)
|
|
73
|
+
.update(payload)
|
|
74
|
+
.digest('hex');
|
|
75
|
+
headers['X-Signature-256'] = `sha256=${signature}`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
try {
|
|
79
|
+
await validateExternalUrl(this.config.url);
|
|
80
|
+
const response = await fetch(this.config.url, {
|
|
81
|
+
method: 'POST',
|
|
82
|
+
headers,
|
|
83
|
+
body: payload,
|
|
84
|
+
redirect: 'error',
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
if (!response.ok) {
|
|
88
|
+
console.error(`[adapters] ${this.name} POST failed: ${response.status}`);
|
|
89
|
+
}
|
|
90
|
+
} catch (err) {
|
|
91
|
+
const msg = getErrorMessage(err);
|
|
92
|
+
console.error(`[adapters] ${this.name} POST error:`, msg);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Address normalization utilities for multi-chain support.
|
|
3
|
+
* EVM addresses are case-insensitive (lowercase), Solana addresses are case-sensitive (base58).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Native token addresses by chain type
|
|
7
|
+
export const NATIVE_ADDRESSES = {
|
|
8
|
+
ETH: '0x0000000000000000000000000000000000000000',
|
|
9
|
+
SOL: 'So11111111111111111111111111111111111111112',
|
|
10
|
+
} as const;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Check if a chain identifier refers to a Solana chain.
|
|
14
|
+
*/
|
|
15
|
+
export function isSolanaChain(chain: string): boolean {
|
|
16
|
+
return chain === 'solana' || chain === 'solana-devnet';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Normalize an address for the given chain.
|
|
21
|
+
* EVM: lowercase (case-insensitive)
|
|
22
|
+
* Solana: no-op (base58 is case-sensitive)
|
|
23
|
+
*/
|
|
24
|
+
export function normalizeAddress(addr: string, chain?: string): string {
|
|
25
|
+
if (chain && isSolanaChain(chain)) {
|
|
26
|
+
return addr; // base58 is case-sensitive
|
|
27
|
+
}
|
|
28
|
+
return addr.toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Get the native token address for a chain.
|
|
33
|
+
*/
|
|
34
|
+
export function getNativeAddress(chain: string): string {
|
|
35
|
+
if (isSolanaChain(chain)) {
|
|
36
|
+
return NATIVE_ADDRESSES.SOL;
|
|
37
|
+
}
|
|
38
|
+
return NATIVE_ADDRESSES.ETH;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Get the native currency symbol for a chain.
|
|
43
|
+
*/
|
|
44
|
+
export function getNativeCurrency(chain: string): string {
|
|
45
|
+
if (isSolanaChain(chain)) {
|
|
46
|
+
return 'SOL';
|
|
47
|
+
}
|
|
48
|
+
return 'ETH';
|
|
49
|
+
}
|