@elizaos/plugin-steward-app 2.0.3-beta.6 → 2.0.3-beta.7
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/dist/ApprovalQueue.d.ts +18 -0
- package/dist/ApprovalQueue.d.ts.map +1 -0
- package/dist/ApprovalQueue.js +420 -0
- package/dist/ApprovalQueue.js.map +1 -0
- package/dist/StewardLogo.d.ts +11 -0
- package/dist/StewardLogo.d.ts.map +1 -0
- package/dist/StewardLogo.js +36 -0
- package/dist/StewardLogo.js.map +1 -0
- package/dist/StewardView.d.ts +13 -0
- package/dist/StewardView.d.ts.map +1 -0
- package/dist/StewardView.helpers.d.ts +15 -0
- package/dist/StewardView.helpers.d.ts.map +1 -0
- package/dist/StewardView.helpers.js +45 -0
- package/dist/StewardView.helpers.js.map +1 -0
- package/dist/StewardView.interact.d.ts +2 -0
- package/dist/StewardView.interact.d.ts.map +1 -0
- package/dist/StewardView.interact.js +54 -0
- package/dist/StewardView.interact.js.map +1 -0
- package/dist/StewardView.js +249 -0
- package/dist/StewardView.js.map +1 -0
- package/dist/TransactionHistory.d.ts +22 -0
- package/dist/TransactionHistory.d.ts.map +1 -0
- package/dist/TransactionHistory.js +361 -0
- package/dist/TransactionHistory.js.map +1 -0
- package/dist/__fixtures__/steward-sdk-fixtures.d.ts +10 -0
- package/dist/__fixtures__/steward-sdk-fixtures.d.ts.map +1 -0
- package/dist/__fixtures__/steward-sdk-fixtures.js +60 -0
- package/dist/__fixtures__/steward-sdk-fixtures.js.map +1 -0
- package/dist/actions/wallet-action-shared.d.ts +15 -0
- package/dist/actions/wallet-action-shared.d.ts.map +1 -0
- package/dist/actions/wallet-action-shared.js +16 -0
- package/dist/actions/wallet-action-shared.js.map +1 -0
- package/dist/api/binance-skill-helpers.d.ts +21 -0
- package/dist/api/binance-skill-helpers.d.ts.map +1 -0
- package/dist/api/binance-skill-helpers.js +790 -0
- package/dist/api/binance-skill-helpers.js.map +1 -0
- package/dist/api/bsc-trade.d.ts +36 -0
- package/dist/api/bsc-trade.d.ts.map +1 -0
- package/dist/api/bsc-trade.js +796 -0
- package/dist/api/bsc-trade.js.map +1 -0
- package/dist/api/trade-safety.d.ts +35 -0
- package/dist/api/trade-safety.d.ts.map +1 -0
- package/dist/api/trade-safety.js +56 -0
- package/dist/api/trade-safety.js.map +1 -0
- package/dist/api/tx-service.d.ts +53 -0
- package/dist/api/tx-service.d.ts.map +1 -0
- package/dist/api/tx-service.js +206 -0
- package/dist/api/tx-service.js.map +1 -0
- package/dist/api/wallet-bsc-routes.d.ts +63 -0
- package/dist/api/wallet-bsc-routes.d.ts.map +1 -0
- package/dist/api/wallet-bsc-routes.js +337 -0
- package/dist/api/wallet-bsc-routes.js.map +1 -0
- package/dist/api/wallet-capability.d.ts +2 -0
- package/dist/api/wallet-capability.d.ts.map +1 -0
- package/dist/api/wallet-capability.js +15 -0
- package/dist/api/wallet-capability.js.map +1 -0
- package/dist/api/wallet-dex-prices.d.ts +43 -0
- package/dist/api/wallet-dex-prices.d.ts.map +1 -0
- package/dist/api/wallet-dex-prices.js +132 -0
- package/dist/api/wallet-dex-prices.js.map +1 -0
- package/dist/api/wallet-evm-balance.d.ts +72 -0
- package/dist/api/wallet-evm-balance.d.ts.map +1 -0
- package/dist/api/wallet-evm-balance.js +697 -0
- package/dist/api/wallet-evm-balance.js.map +1 -0
- package/dist/api/wallet-routes.d.ts +27 -0
- package/dist/api/wallet-routes.d.ts.map +1 -0
- package/dist/api/wallet-routes.js +556 -0
- package/dist/api/wallet-routes.js.map +1 -0
- package/dist/api/wallet-rpc.d.ts +73 -0
- package/dist/api/wallet-rpc.d.ts.map +1 -0
- package/dist/api/wallet-rpc.js +460 -0
- package/dist/api/wallet-rpc.js.map +1 -0
- package/dist/api/wallet-trade-routes.d.ts +104 -0
- package/dist/api/wallet-trade-routes.d.ts.map +1 -0
- package/dist/api/wallet-trade-routes.js +353 -0
- package/dist/api/wallet-trade-routes.js.map +1 -0
- package/dist/api/wallet-trading-profile.d.ts +31 -0
- package/dist/api/wallet-trading-profile.d.ts.map +1 -0
- package/dist/api/wallet-trading-profile.js +500 -0
- package/dist/api/wallet-trading-profile.js.map +1 -0
- package/dist/api/wallet.d.ts +60 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wallet.js +617 -0
- package/dist/api/wallet.js.map +1 -0
- package/dist/chain-utils.d.ts +10 -0
- package/dist/chain-utils.d.ts.map +1 -0
- package/dist/chain-utils.js +81 -0
- package/dist/chain-utils.js.map +1 -0
- package/dist/components/StewardSpatialView.d.ts +74 -0
- package/dist/components/StewardSpatialView.d.ts.map +1 -0
- package/dist/components/StewardSpatialView.js +309 -0
- package/dist/components/StewardSpatialView.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin.d.ts +21 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +319 -0
- package/dist/plugin.js.map +1 -0
- package/dist/providers/steward-balance.d.ts +12 -0
- package/dist/providers/steward-balance.d.ts.map +1 -0
- package/dist/providers/steward-balance.js +85 -0
- package/dist/providers/steward-balance.js.map +1 -0
- package/dist/providers/steward-receive-address.d.ts +12 -0
- package/dist/providers/steward-receive-address.d.ts.map +1 -0
- package/dist/providers/steward-receive-address.js +47 -0
- package/dist/providers/steward-receive-address.js.map +1 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +6 -0
- package/dist/register-routes.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +34 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/routes/steward-bridge.d.ts +202 -0
- package/dist/routes/steward-bridge.d.ts.map +1 -0
- package/dist/routes/steward-bridge.js +776 -0
- package/dist/routes/steward-bridge.js.map +1 -0
- package/dist/routes/steward-compat-routes.d.ts +21 -0
- package/dist/routes/steward-compat-routes.d.ts.map +1 -0
- package/dist/routes/steward-compat-routes.js +350 -0
- package/dist/routes/steward-compat-routes.js.map +1 -0
- package/dist/routes/wallet-browser-compat-routes.d.ts +6 -0
- package/dist/routes/wallet-browser-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-browser-compat-routes.js +402 -0
- package/dist/routes/wallet-browser-compat-routes.js.map +1 -0
- package/dist/routes/wallet-bsc-core-routes.d.ts +15 -0
- package/dist/routes/wallet-bsc-core-routes.d.ts.map +1 -0
- package/dist/routes/wallet-bsc-core-routes.js +59 -0
- package/dist/routes/wallet-bsc-core-routes.js.map +1 -0
- package/dist/routes/wallet-compat-routes.d.ts +13 -0
- package/dist/routes/wallet-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-compat-routes.js +206 -0
- package/dist/routes/wallet-compat-routes.js.map +1 -0
- package/dist/routes/wallet-core-routes.d.ts +16 -0
- package/dist/routes/wallet-core-routes.d.ts.map +1 -0
- package/dist/routes/wallet-core-routes.js +48 -0
- package/dist/routes/wallet-core-routes.js.map +1 -0
- package/dist/routes/wallet-trade-compat-routes.d.ts +11 -0
- package/dist/routes/wallet-trade-compat-routes.d.ts.map +1 -0
- package/dist/routes/wallet-trade-compat-routes.js +570 -0
- package/dist/routes/wallet-trade-compat-routes.js.map +1 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts +7 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.d.ts.map +1 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.js +43 -0
- package/dist/security/hydrate-wallet-keys-from-platform-store.js.map +1 -0
- package/dist/security/wallet-os-store-actions.d.ts +14 -0
- package/dist/security/wallet-os-store-actions.d.ts.map +1 -0
- package/dist/security/wallet-os-store-actions.js +63 -0
- package/dist/security/wallet-os-store-actions.js.map +1 -0
- package/dist/services/steward-credentials.d.ts +2 -0
- package/dist/services/steward-credentials.d.ts.map +1 -0
- package/dist/services/steward-credentials.js +2 -0
- package/dist/services/steward-credentials.js.map +1 -0
- package/dist/services/steward-evm-account.d.ts +75 -0
- package/dist/services/steward-evm-account.d.ts.map +1 -0
- package/dist/services/steward-evm-account.js +279 -0
- package/dist/services/steward-evm-account.js.map +1 -0
- package/dist/services/steward-evm-bridge.d.ts +36 -0
- package/dist/services/steward-evm-bridge.d.ts.map +1 -0
- package/dist/services/steward-evm-bridge.js +78 -0
- package/dist/services/steward-evm-bridge.js.map +1 -0
- package/dist/services/steward-sidecar/health-check.d.ts +2 -0
- package/dist/services/steward-sidecar/health-check.d.ts.map +1 -0
- package/dist/services/steward-sidecar/health-check.js +2 -0
- package/dist/services/steward-sidecar/health-check.js.map +1 -0
- package/dist/services/steward-sidecar/helpers.d.ts +2 -0
- package/dist/services/steward-sidecar/helpers.d.ts.map +1 -0
- package/dist/services/steward-sidecar/helpers.js +2 -0
- package/dist/services/steward-sidecar/helpers.js.map +1 -0
- package/dist/services/steward-sidecar/process-management.d.ts +2 -0
- package/dist/services/steward-sidecar/process-management.d.ts.map +1 -0
- package/dist/services/steward-sidecar/process-management.js +2 -0
- package/dist/services/steward-sidecar/process-management.js.map +1 -0
- package/dist/services/steward-sidecar/types.d.ts +2 -0
- package/dist/services/steward-sidecar/types.d.ts.map +1 -0
- package/dist/services/steward-sidecar/types.js +2 -0
- package/dist/services/steward-sidecar/types.js.map +1 -0
- package/dist/services/steward-sidecar/wallet-setup.d.ts +2 -0
- package/dist/services/steward-sidecar/wallet-setup.d.ts.map +1 -0
- package/dist/services/steward-sidecar/wallet-setup.js +2 -0
- package/dist/services/steward-sidecar/wallet-setup.js.map +1 -0
- package/dist/services/steward-sidecar.d.ts +2 -0
- package/dist/services/steward-sidecar.d.ts.map +1 -0
- package/dist/services/steward-sidecar.js +2 -0
- package/dist/services/steward-sidecar.js.map +1 -0
- package/dist/services/steward-wallet.d.ts +25 -0
- package/dist/services/steward-wallet.d.ts.map +1 -0
- package/dist/services/steward-wallet.js +333 -0
- package/dist/services/steward-wallet.js.map +1 -0
- package/dist/steward-ui-state.d.ts +14 -0
- package/dist/steward-ui-state.d.ts.map +1 -0
- package/dist/steward-ui-state.js +46 -0
- package/dist/steward-ui-state.js.map +1 -0
- package/dist/steward-view-bundle.d.ts +3 -0
- package/dist/steward-view-bundle.d.ts.map +1 -0
- package/dist/steward-view-bundle.js +7 -0
- package/dist/steward-view-bundle.js.map +1 -0
- package/dist/types/bsc-trade.d.ts +180 -0
- package/dist/types/bsc-trade.d.ts.map +1 -0
- package/dist/types/bsc-trade.js +1 -0
- package/dist/types/bsc-trade.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/steward.d.ts +83 -0
- package/dist/types/steward.d.ts.map +1 -0
- package/dist/types/steward.js +1 -0
- package/dist/types/steward.js.map +1 -0
- package/dist/ui.d.ts +7 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +7 -0
- package/dist/ui.js.map +1 -0
- package/dist/views/bundle.js +601 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1,776 @@
|
|
|
1
|
+
import { loadElizaConfig } from "@elizaos/agent/config/config";
|
|
2
|
+
import {
|
|
3
|
+
loadStewardCredentials,
|
|
4
|
+
resolveEffectiveStewardConfig,
|
|
5
|
+
saveStewardCredentials
|
|
6
|
+
} from "@elizaos/app-core/services/steward-credentials";
|
|
7
|
+
import { fingerprintRandomToken } from "@elizaos/app-core/services/steward-sidecar/helpers";
|
|
8
|
+
import {
|
|
9
|
+
StewardApiError,
|
|
10
|
+
StewardClient
|
|
11
|
+
} from "@stwd/sdk";
|
|
12
|
+
import { fetchSolanaNativeBalanceViaRpc } from "../api/wallet.js";
|
|
13
|
+
import { fetchEvmNativeBalanceViaRpc } from "../api/wallet-evm-balance.js";
|
|
14
|
+
import { resolveWalletRpcReadiness } from "../api/wallet-rpc.js";
|
|
15
|
+
function normalizeEnvValue(value) {
|
|
16
|
+
if (typeof value !== "string") {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const trimmed = value.trim();
|
|
20
|
+
return trimmed || null;
|
|
21
|
+
}
|
|
22
|
+
function resolveStewardConnection(env = process.env) {
|
|
23
|
+
const persisted = resolveEffectiveStewardConfig(env);
|
|
24
|
+
const baseUrl = normalizeEnvValue(env.STEWARD_API_URL) ?? normalizeEnvValue(persisted?.apiUrl) ?? null;
|
|
25
|
+
const apiKey = normalizeEnvValue(env.STEWARD_API_KEY) ?? normalizeEnvValue(persisted?.apiKey) ?? null;
|
|
26
|
+
const tenantId = normalizeEnvValue(env.STEWARD_TENANT_ID) ?? normalizeEnvValue(persisted?.tenantId) ?? null;
|
|
27
|
+
const agentId = normalizeEnvValue(env.STEWARD_AGENT_ID) ?? normalizeEnvValue(env.ELIZA_STEWARD_AGENT_ID) ?? normalizeEnvValue(persisted?.agentId) ?? null;
|
|
28
|
+
const agentToken = normalizeEnvValue(env.STEWARD_AGENT_TOKEN) ?? normalizeEnvValue(persisted?.agentToken) ?? null;
|
|
29
|
+
return {
|
|
30
|
+
baseUrl,
|
|
31
|
+
apiKey,
|
|
32
|
+
tenantId,
|
|
33
|
+
bearerToken: apiKey ? null : agentToken,
|
|
34
|
+
agentId
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function resolveStewardRpcReadinessSafe() {
|
|
38
|
+
try {
|
|
39
|
+
return resolveWalletRpcReadiness(loadElizaConfig());
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function firstRpcUrl(urls) {
|
|
45
|
+
return urls.find((candidate) => typeof candidate === "string" && candidate.trim())?.trim() ?? null;
|
|
46
|
+
}
|
|
47
|
+
function resolveEvmNativeBalanceFallback(chainId, readiness) {
|
|
48
|
+
switch (chainId) {
|
|
49
|
+
case 1: {
|
|
50
|
+
const rpcUrl = firstRpcUrl(readiness.ethereumRpcUrls);
|
|
51
|
+
return rpcUrl ? { rpcUrl, symbol: "ETH", chainId } : null;
|
|
52
|
+
}
|
|
53
|
+
case 8453: {
|
|
54
|
+
const rpcUrl = firstRpcUrl(readiness.baseRpcUrls);
|
|
55
|
+
return rpcUrl ? { rpcUrl, symbol: "ETH", chainId } : null;
|
|
56
|
+
}
|
|
57
|
+
case 56:
|
|
58
|
+
case 97: {
|
|
59
|
+
const rpcUrl = firstRpcUrl(readiness.bscRpcUrls);
|
|
60
|
+
return rpcUrl ? { rpcUrl, symbol: "BNB", chainId } : null;
|
|
61
|
+
}
|
|
62
|
+
case 43114: {
|
|
63
|
+
const rpcUrl = firstRpcUrl(readiness.avalancheRpcUrls);
|
|
64
|
+
return rpcUrl ? { rpcUrl, symbol: "AVAX", chainId } : null;
|
|
65
|
+
}
|
|
66
|
+
default:
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function resolveStewardAgentId(env = process.env, evmAddress) {
|
|
71
|
+
return resolveStewardConnection(env).agentId ?? evmAddress?.trim() ?? null;
|
|
72
|
+
}
|
|
73
|
+
function createStewardClient(options = {}) {
|
|
74
|
+
if (options.client !== void 0) {
|
|
75
|
+
return options.client;
|
|
76
|
+
}
|
|
77
|
+
const env = options.env ?? process.env;
|
|
78
|
+
const connection = resolveStewardConnection(env);
|
|
79
|
+
const baseUrl = connection.baseUrl;
|
|
80
|
+
if (!baseUrl) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return new StewardClient({
|
|
84
|
+
baseUrl,
|
|
85
|
+
bearerToken: connection.bearerToken ?? void 0,
|
|
86
|
+
apiKey: connection.apiKey ?? void 0,
|
|
87
|
+
tenantId: connection.tenantId ?? void 0
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
async function getStewardBridgeStatus(options = {}) {
|
|
91
|
+
const env = options.env ?? process.env;
|
|
92
|
+
const baseUrl = normalizeEnvValue(env.STEWARD_API_URL);
|
|
93
|
+
const evmAddress = options.evmAddress ?? null;
|
|
94
|
+
const agentId = options.agentId ?? resolveStewardAgentId(env, evmAddress);
|
|
95
|
+
const client = createStewardClient(options);
|
|
96
|
+
if (!baseUrl || !client) {
|
|
97
|
+
const persisted = resolveEffectiveStewardConfig(env);
|
|
98
|
+
if (!persisted?.apiUrl) {
|
|
99
|
+
return {
|
|
100
|
+
configured: false,
|
|
101
|
+
available: false,
|
|
102
|
+
connected: false,
|
|
103
|
+
baseUrl,
|
|
104
|
+
agentId,
|
|
105
|
+
evmAddress,
|
|
106
|
+
error: null
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
const fallbackClient = new StewardClient({
|
|
110
|
+
baseUrl: persisted.apiUrl,
|
|
111
|
+
bearerToken: persisted.agentToken || void 0,
|
|
112
|
+
apiKey: persisted.apiKey || void 0,
|
|
113
|
+
tenantId: persisted.tenantId || void 0
|
|
114
|
+
});
|
|
115
|
+
const fallbackAgentId = persisted.agentId || agentId;
|
|
116
|
+
if (!fallbackClient || !fallbackAgentId) {
|
|
117
|
+
return {
|
|
118
|
+
configured: false,
|
|
119
|
+
available: false,
|
|
120
|
+
connected: false,
|
|
121
|
+
baseUrl: persisted.apiUrl,
|
|
122
|
+
agentId: fallbackAgentId,
|
|
123
|
+
evmAddress,
|
|
124
|
+
error: null
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
let agentData = null;
|
|
129
|
+
if (fallbackAgentId) {
|
|
130
|
+
try {
|
|
131
|
+
agentData = await fallbackClient.getAgent(
|
|
132
|
+
fallbackAgentId
|
|
133
|
+
);
|
|
134
|
+
} catch (error) {
|
|
135
|
+
if (!(error instanceof StewardApiError) || error.status !== 404 && error.status !== 400) {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
const walletAddresses = agentData ? {
|
|
141
|
+
evm: agentData.walletAddresses?.evm?.trim() || agentData.walletAddress?.trim() || null,
|
|
142
|
+
solana: agentData.walletAddresses?.solana?.trim() || null
|
|
143
|
+
} : void 0;
|
|
144
|
+
return {
|
|
145
|
+
configured: true,
|
|
146
|
+
available: true,
|
|
147
|
+
connected: true,
|
|
148
|
+
baseUrl: persisted.apiUrl,
|
|
149
|
+
agentId: fallbackAgentId,
|
|
150
|
+
evmAddress: walletAddresses?.evm ?? evmAddress,
|
|
151
|
+
error: null,
|
|
152
|
+
walletAddresses,
|
|
153
|
+
agentName: agentData?.name || void 0,
|
|
154
|
+
vaultHealth: fallbackAgentId && !agentData ? "degraded" : "ok"
|
|
155
|
+
};
|
|
156
|
+
} catch (error) {
|
|
157
|
+
return {
|
|
158
|
+
configured: true,
|
|
159
|
+
available: false,
|
|
160
|
+
connected: false,
|
|
161
|
+
baseUrl: persisted.apiUrl,
|
|
162
|
+
agentId: fallbackAgentId,
|
|
163
|
+
evmAddress,
|
|
164
|
+
error: formatStewardError(error),
|
|
165
|
+
vaultHealth: "error"
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
try {
|
|
170
|
+
let agentData = null;
|
|
171
|
+
if (agentId) {
|
|
172
|
+
try {
|
|
173
|
+
agentData = await client.getAgent(agentId);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (!(error instanceof StewardApiError) || error.status !== 404 && error.status !== 400) {
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
} else {
|
|
180
|
+
await client.listAgents();
|
|
181
|
+
}
|
|
182
|
+
const walletAddresses = agentData ? {
|
|
183
|
+
evm: agentData.walletAddresses?.evm?.trim() || agentData.walletAddress?.trim() || null,
|
|
184
|
+
solana: agentData.walletAddresses?.solana?.trim() || null
|
|
185
|
+
} : void 0;
|
|
186
|
+
const agentName = agentData?.name || void 0;
|
|
187
|
+
let vaultHealth = "ok";
|
|
188
|
+
if (agentId && !agentData) {
|
|
189
|
+
vaultHealth = "degraded";
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
configured: true,
|
|
193
|
+
available: true,
|
|
194
|
+
connected: true,
|
|
195
|
+
baseUrl,
|
|
196
|
+
agentId,
|
|
197
|
+
evmAddress: walletAddresses?.evm ?? evmAddress,
|
|
198
|
+
error: null,
|
|
199
|
+
walletAddresses,
|
|
200
|
+
agentName,
|
|
201
|
+
vaultHealth
|
|
202
|
+
};
|
|
203
|
+
} catch (error) {
|
|
204
|
+
return {
|
|
205
|
+
configured: true,
|
|
206
|
+
available: false,
|
|
207
|
+
connected: false,
|
|
208
|
+
baseUrl,
|
|
209
|
+
agentId,
|
|
210
|
+
evmAddress,
|
|
211
|
+
error: formatStewardError(error),
|
|
212
|
+
vaultHealth: "error"
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
function isStewardConfigured(env = process.env) {
|
|
217
|
+
const connection = resolveStewardConnection(env);
|
|
218
|
+
return Boolean(connection.baseUrl && connection.agentId);
|
|
219
|
+
}
|
|
220
|
+
function formatStewardError(error) {
|
|
221
|
+
if (typeof error === "object" && error !== null && "message" in error && typeof error.message === "string") {
|
|
222
|
+
return error.message;
|
|
223
|
+
}
|
|
224
|
+
return String(error);
|
|
225
|
+
}
|
|
226
|
+
async function signTransactionWithOptionalSteward(params) {
|
|
227
|
+
const env = params.env ?? process.env;
|
|
228
|
+
const evmAddress = params.evmAddress ?? null;
|
|
229
|
+
const agentId = params.agentId ?? resolveStewardAgentId(env, evmAddress) ?? null;
|
|
230
|
+
const client = createStewardClient({
|
|
231
|
+
env,
|
|
232
|
+
evmAddress,
|
|
233
|
+
agentId,
|
|
234
|
+
client: params.client
|
|
235
|
+
});
|
|
236
|
+
if (!client || !agentId) {
|
|
237
|
+
throw new Error(
|
|
238
|
+
"Steward credentials and agent ID must be provided to sign transactions."
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
const tx = params.tx;
|
|
242
|
+
if (!tx || typeof tx !== "object") {
|
|
243
|
+
throw new Error("Transaction input is required and must be an object.");
|
|
244
|
+
}
|
|
245
|
+
if (!("to" in tx) || typeof tx.to !== "string" || !tx.to.trim()) {
|
|
246
|
+
throw new Error("Transaction must include a valid 'to' address.");
|
|
247
|
+
}
|
|
248
|
+
const result = await client.signTransaction(agentId, tx);
|
|
249
|
+
if ("txHash" in result) {
|
|
250
|
+
return {
|
|
251
|
+
mode: "steward",
|
|
252
|
+
pendingApproval: false,
|
|
253
|
+
txHash: result.txHash
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
if ("results" in result) {
|
|
257
|
+
return {
|
|
258
|
+
mode: "steward",
|
|
259
|
+
pendingApproval: true,
|
|
260
|
+
policyResults: result.results
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
throw new Error("Steward returned an unsigned transaction unexpectedly");
|
|
264
|
+
}
|
|
265
|
+
async function getStewardWalletAddresses(options = {}) {
|
|
266
|
+
const env = options.env ?? process.env;
|
|
267
|
+
const evmAddr = options.evmAddress ?? null;
|
|
268
|
+
const agentId = options.agentId ?? resolveStewardAgentId(env, evmAddr) ?? null;
|
|
269
|
+
const client = createStewardClient(options);
|
|
270
|
+
if (!client || !agentId) {
|
|
271
|
+
return { evmAddress: null, solanaAddress: null };
|
|
272
|
+
}
|
|
273
|
+
const agent = await client.getAgent(agentId);
|
|
274
|
+
const evmAddress = agent.walletAddresses?.evm?.trim() || agent.walletAddress?.trim() || null;
|
|
275
|
+
const solanaAddress = agent.walletAddresses?.solana?.trim() || null;
|
|
276
|
+
return { evmAddress, solanaAddress };
|
|
277
|
+
}
|
|
278
|
+
async function getStewardBalance(agentId, chainId, options = {}) {
|
|
279
|
+
const client = createStewardClient(options);
|
|
280
|
+
if (!client) throw new Error("Steward not configured");
|
|
281
|
+
try {
|
|
282
|
+
const result = await client.getBalance(agentId, chainId);
|
|
283
|
+
return {
|
|
284
|
+
balance: result.balances.native,
|
|
285
|
+
formatted: result.balances.nativeFormatted,
|
|
286
|
+
symbol: result.balances.symbol,
|
|
287
|
+
chainId: result.balances.chainId
|
|
288
|
+
};
|
|
289
|
+
} catch (error) {
|
|
290
|
+
const readiness = resolveStewardRpcReadinessSafe();
|
|
291
|
+
const walletAddresses = await getStewardWalletAddresses({
|
|
292
|
+
...options,
|
|
293
|
+
agentId
|
|
294
|
+
});
|
|
295
|
+
if (chainId === 101 && walletAddresses.solanaAddress && readiness && readiness.solanaRpcUrls.length > 0) {
|
|
296
|
+
const result = await fetchSolanaNativeBalanceViaRpc(
|
|
297
|
+
walletAddresses.solanaAddress,
|
|
298
|
+
readiness.solanaRpcUrls
|
|
299
|
+
);
|
|
300
|
+
return {
|
|
301
|
+
balance: result.solBalance,
|
|
302
|
+
formatted: result.solBalance,
|
|
303
|
+
symbol: "SOL",
|
|
304
|
+
chainId
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
const evmFallback = readiness && chainId != null ? resolveEvmNativeBalanceFallback(chainId, readiness) : null;
|
|
308
|
+
if (evmFallback && walletAddresses.evmAddress) {
|
|
309
|
+
const balance = await fetchEvmNativeBalanceViaRpc(
|
|
310
|
+
evmFallback.rpcUrl,
|
|
311
|
+
walletAddresses.evmAddress
|
|
312
|
+
);
|
|
313
|
+
return {
|
|
314
|
+
balance,
|
|
315
|
+
formatted: balance,
|
|
316
|
+
symbol: evmFallback.symbol,
|
|
317
|
+
chainId: evmFallback.chainId
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
async function getStewardTokenBalances(agentId, chainId, options = {}) {
|
|
324
|
+
const env = options.env ?? process.env;
|
|
325
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
326
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
327
|
+
const headers = buildStewardHeaders(env);
|
|
328
|
+
const qs = chainId != null ? `?chainId=${encodeURIComponent(chainId)}` : "";
|
|
329
|
+
try {
|
|
330
|
+
const res = await fetch(
|
|
331
|
+
`${baseUrl}/agents/${encodeURIComponent(agentId)}/tokens${qs}`,
|
|
332
|
+
{ headers }
|
|
333
|
+
);
|
|
334
|
+
if (!res.ok) {
|
|
335
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
336
|
+
throw new Error(
|
|
337
|
+
`Steward token balances failed (${res.status}): ${errText}`
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
const body = await res.json();
|
|
341
|
+
return body.data ?? {
|
|
342
|
+
native: {
|
|
343
|
+
balance: "0",
|
|
344
|
+
formatted: "0",
|
|
345
|
+
symbol: "???",
|
|
346
|
+
chainId: chainId ?? 0
|
|
347
|
+
},
|
|
348
|
+
tokens: []
|
|
349
|
+
};
|
|
350
|
+
} catch (error) {
|
|
351
|
+
const readiness = resolveStewardRpcReadinessSafe();
|
|
352
|
+
const walletAddresses = await getStewardWalletAddresses({
|
|
353
|
+
...options,
|
|
354
|
+
agentId
|
|
355
|
+
});
|
|
356
|
+
if (chainId === 101 && walletAddresses.solanaAddress && readiness && readiness.solanaRpcUrls.length > 0) {
|
|
357
|
+
const native = await fetchSolanaNativeBalanceViaRpc(
|
|
358
|
+
walletAddresses.solanaAddress,
|
|
359
|
+
readiness.solanaRpcUrls
|
|
360
|
+
);
|
|
361
|
+
return {
|
|
362
|
+
native: {
|
|
363
|
+
balance: native.solBalance,
|
|
364
|
+
formatted: native.solBalance,
|
|
365
|
+
symbol: "SOL",
|
|
366
|
+
chainId
|
|
367
|
+
},
|
|
368
|
+
tokens: []
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
const evmFallback = readiness && chainId != null ? resolveEvmNativeBalanceFallback(chainId, readiness) : null;
|
|
372
|
+
if (evmFallback && walletAddresses.evmAddress) {
|
|
373
|
+
const nativeBalance = await fetchEvmNativeBalanceViaRpc(
|
|
374
|
+
evmFallback.rpcUrl,
|
|
375
|
+
walletAddresses.evmAddress
|
|
376
|
+
);
|
|
377
|
+
return {
|
|
378
|
+
native: {
|
|
379
|
+
balance: nativeBalance,
|
|
380
|
+
formatted: nativeBalance,
|
|
381
|
+
symbol: evmFallback.symbol,
|
|
382
|
+
chainId: evmFallback.chainId
|
|
383
|
+
},
|
|
384
|
+
tokens: []
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
throw error;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
function buildStewardHeaders(env = process.env) {
|
|
391
|
+
const headers = new Headers();
|
|
392
|
+
headers.set("Content-Type", "application/json");
|
|
393
|
+
headers.set("Accept", "application/json");
|
|
394
|
+
const connection = resolveStewardConnection(env);
|
|
395
|
+
const bearerToken = connection.bearerToken;
|
|
396
|
+
const apiKey = connection.apiKey;
|
|
397
|
+
const tenantId = connection.tenantId;
|
|
398
|
+
if (bearerToken) {
|
|
399
|
+
headers.set("Authorization", `Bearer ${bearerToken}`);
|
|
400
|
+
} else if (apiKey) {
|
|
401
|
+
headers.set("X-Steward-Key", apiKey);
|
|
402
|
+
}
|
|
403
|
+
if (tenantId) {
|
|
404
|
+
headers.set("X-Steward-Tenant", tenantId);
|
|
405
|
+
}
|
|
406
|
+
return headers;
|
|
407
|
+
}
|
|
408
|
+
function getStewardBaseUrl(env = process.env) {
|
|
409
|
+
return resolveStewardConnection(env).baseUrl;
|
|
410
|
+
}
|
|
411
|
+
async function getStewardPendingApprovals(agentId, env = process.env) {
|
|
412
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
413
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
414
|
+
const headers = buildStewardHeaders(env);
|
|
415
|
+
const res = await fetch(
|
|
416
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/pending`,
|
|
417
|
+
{ headers }
|
|
418
|
+
);
|
|
419
|
+
if (res.status === 404) return [];
|
|
420
|
+
if (!res.ok) {
|
|
421
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
422
|
+
throw new Error(
|
|
423
|
+
`Steward pending approvals failed (${res.status}): ${errText}`
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
const body = await res.json();
|
|
427
|
+
return body.data ?? body ?? [];
|
|
428
|
+
}
|
|
429
|
+
async function approveStewardTransaction(agentId, txId, env = process.env) {
|
|
430
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
431
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
432
|
+
const headers = buildStewardHeaders(env);
|
|
433
|
+
const res = await fetch(
|
|
434
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/approve/${encodeURIComponent(txId)}`,
|
|
435
|
+
{ method: "POST", headers }
|
|
436
|
+
);
|
|
437
|
+
if (!res.ok) {
|
|
438
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
439
|
+
throw new Error(`Steward approve failed (${res.status}): ${errText}`);
|
|
440
|
+
}
|
|
441
|
+
const body = await res.json();
|
|
442
|
+
return body.data ?? body;
|
|
443
|
+
}
|
|
444
|
+
async function denyStewardTransaction(agentId, txId, reason, env = process.env) {
|
|
445
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
446
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
447
|
+
const headers = buildStewardHeaders(env);
|
|
448
|
+
const reqBody = {};
|
|
449
|
+
if (reason) reqBody.reason = reason;
|
|
450
|
+
const res = await fetch(
|
|
451
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/reject/${encodeURIComponent(txId)}`,
|
|
452
|
+
{ method: "POST", headers, body: JSON.stringify(reqBody) }
|
|
453
|
+
);
|
|
454
|
+
if (!res.ok) {
|
|
455
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
456
|
+
throw new Error(`Steward deny failed (${res.status}): ${errText}`);
|
|
457
|
+
}
|
|
458
|
+
const body = await res.json().catch(() => ({}));
|
|
459
|
+
return body.data ?? body ?? { txId };
|
|
460
|
+
}
|
|
461
|
+
async function getStewardHistory(agentId, opts, env = process.env) {
|
|
462
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
463
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
464
|
+
const headers = buildStewardHeaders(env);
|
|
465
|
+
const params = new URLSearchParams();
|
|
466
|
+
if (opts?.limit != null) params.set("limit", String(opts.limit));
|
|
467
|
+
if (opts?.offset != null) params.set("offset", String(opts.offset));
|
|
468
|
+
const qs = params.toString() ? `?${params.toString()}` : "";
|
|
469
|
+
const res = await fetch(
|
|
470
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/history${qs}`,
|
|
471
|
+
{ headers }
|
|
472
|
+
);
|
|
473
|
+
if (!res.ok) {
|
|
474
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
475
|
+
throw new Error(`Steward history failed (${res.status}): ${errText}`);
|
|
476
|
+
}
|
|
477
|
+
const body = await res.json();
|
|
478
|
+
return body.data ?? body ?? [];
|
|
479
|
+
}
|
|
480
|
+
async function provisionStewardWallet(params) {
|
|
481
|
+
const env = params.env ?? process.env;
|
|
482
|
+
const client = createStewardClient({ env });
|
|
483
|
+
if (!client) {
|
|
484
|
+
throw new Error("Steward not configured \u2014 cannot provision wallet");
|
|
485
|
+
}
|
|
486
|
+
const identity = await client.createWallet(
|
|
487
|
+
params.agentId,
|
|
488
|
+
params.agentName,
|
|
489
|
+
params.platformId
|
|
490
|
+
);
|
|
491
|
+
if (params.defaultPolicies && params.defaultPolicies.length > 0) {
|
|
492
|
+
await client.setPolicies(params.agentId, params.defaultPolicies);
|
|
493
|
+
}
|
|
494
|
+
return { walletAddress: identity.walletAddress };
|
|
495
|
+
}
|
|
496
|
+
async function signViaSteward(request, env = process.env) {
|
|
497
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
498
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
499
|
+
const evmAddress = normalizeEnvValue(env.EVM_ADDRESS) ?? normalizeEnvValue(env.ELIZA_EVM_ADDRESS) ?? null;
|
|
500
|
+
const agentId = resolveStewardAgentId(env, evmAddress);
|
|
501
|
+
if (!agentId) throw new Error("Steward agent ID not resolved");
|
|
502
|
+
const headers = buildStewardHeaders(env);
|
|
503
|
+
const res = await fetch(
|
|
504
|
+
`${baseUrl}/vault/${encodeURIComponent(agentId)}/sign`,
|
|
505
|
+
{
|
|
506
|
+
method: "POST",
|
|
507
|
+
headers,
|
|
508
|
+
body: JSON.stringify({
|
|
509
|
+
to: request.to,
|
|
510
|
+
value: request.value,
|
|
511
|
+
chainId: request.chainId,
|
|
512
|
+
data: request.data,
|
|
513
|
+
broadcast: request.broadcast ?? true,
|
|
514
|
+
description: request.description
|
|
515
|
+
})
|
|
516
|
+
}
|
|
517
|
+
);
|
|
518
|
+
const body = await res.json().catch(() => ({}));
|
|
519
|
+
if (res.ok && body.ok === true) {
|
|
520
|
+
const data = body.data ?? {};
|
|
521
|
+
return {
|
|
522
|
+
approved: true,
|
|
523
|
+
txHash: typeof data.txHash === "string" ? data.txHash : void 0
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
if (res.status === 202) {
|
|
527
|
+
const data = body.data ?? {};
|
|
528
|
+
return {
|
|
529
|
+
approved: false,
|
|
530
|
+
pending: true,
|
|
531
|
+
txId: typeof data.txId === "string" ? data.txId : void 0,
|
|
532
|
+
violations: normalizeViolations(data.violations)
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
if (res.status === 403) {
|
|
536
|
+
const data = body.data ?? {};
|
|
537
|
+
return {
|
|
538
|
+
approved: false,
|
|
539
|
+
denied: true,
|
|
540
|
+
violations: normalizeViolations(data.violations)
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
const errMsg = typeof body.error === "string" ? body.error : `Steward sign failed (${res.status})`;
|
|
544
|
+
throw new Error(errMsg);
|
|
545
|
+
}
|
|
546
|
+
function normalizeViolations(raw) {
|
|
547
|
+
if (!Array.isArray(raw)) return void 0;
|
|
548
|
+
return raw.filter(
|
|
549
|
+
(v) => !!v && typeof v === "object" && typeof v.policy === "string" && typeof v.reason === "string"
|
|
550
|
+
).map((v) => ({ policy: v.policy, reason: v.reason }));
|
|
551
|
+
}
|
|
552
|
+
const MAX_WEBHOOK_EVENTS = 200;
|
|
553
|
+
const recentWebhookEvents = [];
|
|
554
|
+
function pushWebhookEvent(event) {
|
|
555
|
+
recentWebhookEvents.push(event);
|
|
556
|
+
if (recentWebhookEvents.length > MAX_WEBHOOK_EVENTS) {
|
|
557
|
+
recentWebhookEvents.splice(
|
|
558
|
+
0,
|
|
559
|
+
recentWebhookEvents.length - MAX_WEBHOOK_EVENTS
|
|
560
|
+
);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
function getRecentWebhookEvents(eventType, sinceIndex = 0) {
|
|
564
|
+
const all = eventType ? recentWebhookEvents.filter((e) => e.event === eventType) : recentWebhookEvents;
|
|
565
|
+
const events = all.slice(sinceIndex);
|
|
566
|
+
return { events, nextIndex: recentWebhookEvents.length };
|
|
567
|
+
}
|
|
568
|
+
async function registerStewardWebhook(webhookUrl, env = process.env) {
|
|
569
|
+
const baseUrl = getStewardBaseUrl(env);
|
|
570
|
+
if (!baseUrl) throw new Error("Steward not configured");
|
|
571
|
+
const tenantId = normalizeEnvValue(env.STEWARD_TENANT_ID);
|
|
572
|
+
if (!tenantId)
|
|
573
|
+
throw new Error("STEWARD_TENANT_ID not set \u2014 cannot register webhook");
|
|
574
|
+
const headers = buildStewardHeaders(env);
|
|
575
|
+
const res = await fetch(
|
|
576
|
+
`${baseUrl}/tenants/${encodeURIComponent(tenantId)}`,
|
|
577
|
+
{
|
|
578
|
+
method: "PUT",
|
|
579
|
+
headers,
|
|
580
|
+
body: JSON.stringify({ webhookUrl })
|
|
581
|
+
}
|
|
582
|
+
);
|
|
583
|
+
if (!res.ok) {
|
|
584
|
+
const errText = await res.text().catch(() => "Unknown error");
|
|
585
|
+
throw new Error(
|
|
586
|
+
`Steward webhook registration failed (${res.status}): ${errText}`
|
|
587
|
+
);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
async function tryRegisterStewardWebhook(port = Number(
|
|
591
|
+
process.env.ELIZA_API_PORT?.trim() || process.env.ELIZA_PORT?.trim() || "31337"
|
|
592
|
+
) || 31337, env = process.env) {
|
|
593
|
+
if (!isStewardConfigured(env)) return;
|
|
594
|
+
const webhookUrl = `http://127.0.0.1:${port}/api/wallet/steward-webhook`;
|
|
595
|
+
try {
|
|
596
|
+
await registerStewardWebhook(webhookUrl, env);
|
|
597
|
+
console.info(`[steward] Webhook registered: ${webhookUrl}`);
|
|
598
|
+
} catch (err) {
|
|
599
|
+
console.warn(
|
|
600
|
+
`[steward] Webhook registration failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
let ensureStewardAgentPromise = null;
|
|
605
|
+
function ensureStewardAgent(options = {}) {
|
|
606
|
+
if (!ensureStewardAgentPromise) {
|
|
607
|
+
ensureStewardAgentPromise = doEnsureStewardAgent(options);
|
|
608
|
+
}
|
|
609
|
+
return ensureStewardAgentPromise;
|
|
610
|
+
}
|
|
611
|
+
async function doEnsureStewardAgent(options = {}) {
|
|
612
|
+
const env = options.env ?? process.env;
|
|
613
|
+
const baseUrl = normalizeEnvValue(env.STEWARD_API_URL);
|
|
614
|
+
if (!baseUrl) {
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
const agentId = options.agentId ?? resolveStewardAgentId(env) ?? null;
|
|
618
|
+
if (!agentId) {
|
|
619
|
+
return null;
|
|
620
|
+
}
|
|
621
|
+
const agentName = options.agentName ?? agentId;
|
|
622
|
+
try {
|
|
623
|
+
const client = createStewardClient({ env });
|
|
624
|
+
if (!client) {
|
|
625
|
+
return null;
|
|
626
|
+
}
|
|
627
|
+
try {
|
|
628
|
+
const agent = await client.getAgent(agentId);
|
|
629
|
+
const result2 = {
|
|
630
|
+
agentId,
|
|
631
|
+
agentName: agent.name || agentName,
|
|
632
|
+
walletAddresses: {
|
|
633
|
+
evm: agent.walletAddresses?.evm?.trim() || agent.walletAddress?.trim() || null,
|
|
634
|
+
solana: agent.walletAddresses?.solana?.trim() || null
|
|
635
|
+
},
|
|
636
|
+
created: false
|
|
637
|
+
};
|
|
638
|
+
persistAgentCredentials(baseUrl, env, result2);
|
|
639
|
+
return result2;
|
|
640
|
+
} catch (err) {
|
|
641
|
+
if (!(err instanceof StewardApiError) || err.status !== 404) {
|
|
642
|
+
throw err;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
console.info(`[steward] Agent "${agentId}" not found, creating...`);
|
|
646
|
+
const tenantId = normalizeEnvValue(env.STEWARD_TENANT_ID);
|
|
647
|
+
const apiKey = normalizeEnvValue(env.STEWARD_API_KEY);
|
|
648
|
+
if (tenantId && apiKey) {
|
|
649
|
+
try {
|
|
650
|
+
const tenantRes = await fetch(`${baseUrl}/tenants`, {
|
|
651
|
+
method: "POST",
|
|
652
|
+
headers: {
|
|
653
|
+
"Content-Type": "application/json",
|
|
654
|
+
"X-Api-Key": normalizeEnvValue(env.STEWARD_MASTER_PASSWORD) ?? ""
|
|
655
|
+
},
|
|
656
|
+
body: JSON.stringify({
|
|
657
|
+
id: tenantId,
|
|
658
|
+
name: "Desktop",
|
|
659
|
+
apiKeyHash: fingerprintRandomToken(apiKey)
|
|
660
|
+
})
|
|
661
|
+
});
|
|
662
|
+
if (!tenantRes.ok) {
|
|
663
|
+
const body = await tenantRes.json().catch(() => ({}));
|
|
664
|
+
if (!body.error?.includes("already exists")) {
|
|
665
|
+
console.warn(
|
|
666
|
+
`[steward] Tenant creation returned ${tenantRes.status}: ${body.error}`
|
|
667
|
+
);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
} catch (tenantErr) {
|
|
671
|
+
console.warn(
|
|
672
|
+
`[steward] Tenant creation failed (non-fatal): ${tenantErr instanceof Error ? tenantErr.message : String(tenantErr)}`
|
|
673
|
+
);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
const headers = buildStewardHeaders(env);
|
|
677
|
+
const agentRes = await fetch(`${baseUrl}/agents`, {
|
|
678
|
+
method: "POST",
|
|
679
|
+
headers,
|
|
680
|
+
body: JSON.stringify({ id: agentId, name: agentName })
|
|
681
|
+
});
|
|
682
|
+
if (!agentRes.ok) {
|
|
683
|
+
const errText = await agentRes.text().catch(() => "Unknown error");
|
|
684
|
+
console.warn(
|
|
685
|
+
`[steward] Agent creation failed (${agentRes.status}): ${errText}`
|
|
686
|
+
);
|
|
687
|
+
return null;
|
|
688
|
+
}
|
|
689
|
+
const agentBody = await agentRes.json();
|
|
690
|
+
if (!agentBody.ok || !agentBody.data) {
|
|
691
|
+
console.warn("[steward] Agent creation returned unexpected response");
|
|
692
|
+
return null;
|
|
693
|
+
}
|
|
694
|
+
let agentToken = "";
|
|
695
|
+
try {
|
|
696
|
+
const tokenRes = await fetch(
|
|
697
|
+
`${baseUrl}/agents/${encodeURIComponent(agentId)}/token`,
|
|
698
|
+
{ method: "POST", headers }
|
|
699
|
+
);
|
|
700
|
+
if (tokenRes.ok) {
|
|
701
|
+
const tokenBody = await tokenRes.json();
|
|
702
|
+
agentToken = tokenBody.data?.token ?? "";
|
|
703
|
+
}
|
|
704
|
+
} catch {
|
|
705
|
+
console.warn("[steward] Token generation failed (non-fatal)");
|
|
706
|
+
}
|
|
707
|
+
const result = {
|
|
708
|
+
agentId,
|
|
709
|
+
agentName,
|
|
710
|
+
walletAddresses: {
|
|
711
|
+
evm: agentBody.data.walletAddresses?.evm?.trim() || agentBody.data.walletAddress?.trim() || null,
|
|
712
|
+
solana: agentBody.data.walletAddresses?.solana?.trim() || null
|
|
713
|
+
},
|
|
714
|
+
created: true
|
|
715
|
+
};
|
|
716
|
+
console.info(
|
|
717
|
+
`[steward] Agent "${agentId}" created with wallet ${result.walletAddresses.evm ?? "(none)"}`
|
|
718
|
+
);
|
|
719
|
+
persistAgentCredentials(baseUrl, env, result, agentToken);
|
|
720
|
+
return result;
|
|
721
|
+
} catch (err) {
|
|
722
|
+
console.warn(
|
|
723
|
+
`[steward] Auto-setup failed (non-fatal): ${err instanceof Error ? err.message : String(err)}`
|
|
724
|
+
);
|
|
725
|
+
return null;
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
function persistAgentCredentials(apiUrl, env, result, agentToken) {
|
|
729
|
+
try {
|
|
730
|
+
const existing = loadStewardCredentials();
|
|
731
|
+
saveStewardCredentials({
|
|
732
|
+
apiUrl,
|
|
733
|
+
tenantId: normalizeEnvValue(env.STEWARD_TENANT_ID) ?? existing?.tenantId ?? "",
|
|
734
|
+
agentId: result.agentId,
|
|
735
|
+
apiKey: normalizeEnvValue(env.STEWARD_API_KEY) ?? existing?.apiKey ?? "",
|
|
736
|
+
agentToken: agentToken ?? normalizeEnvValue(env.STEWARD_AGENT_TOKEN) ?? existing?.agentToken ?? "",
|
|
737
|
+
walletAddresses: {
|
|
738
|
+
evm: result.walletAddresses.evm ?? void 0,
|
|
739
|
+
solana: result.walletAddresses.solana ?? void 0
|
|
740
|
+
},
|
|
741
|
+
agentName: result.agentName
|
|
742
|
+
});
|
|
743
|
+
} catch (credErr) {
|
|
744
|
+
console.warn(
|
|
745
|
+
`[steward] Failed to persist credentials (non-fatal): ${credErr instanceof Error ? credErr.message : String(credErr)}`
|
|
746
|
+
);
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
function __resetStewardAgentEnsured() {
|
|
750
|
+
ensureStewardAgentPromise = null;
|
|
751
|
+
}
|
|
752
|
+
export {
|
|
753
|
+
__resetStewardAgentEnsured,
|
|
754
|
+
approveStewardTransaction,
|
|
755
|
+
buildStewardHeaders,
|
|
756
|
+
createStewardClient,
|
|
757
|
+
denyStewardTransaction,
|
|
758
|
+
ensureStewardAgent,
|
|
759
|
+
formatStewardError,
|
|
760
|
+
getRecentWebhookEvents,
|
|
761
|
+
getStewardBalance,
|
|
762
|
+
getStewardBridgeStatus,
|
|
763
|
+
getStewardHistory,
|
|
764
|
+
getStewardPendingApprovals,
|
|
765
|
+
getStewardTokenBalances,
|
|
766
|
+
getStewardWalletAddresses,
|
|
767
|
+
isStewardConfigured,
|
|
768
|
+
provisionStewardWallet,
|
|
769
|
+
pushWebhookEvent,
|
|
770
|
+
registerStewardWebhook,
|
|
771
|
+
resolveStewardAgentId,
|
|
772
|
+
signTransactionWithOptionalSteward,
|
|
773
|
+
signViaSteward,
|
|
774
|
+
tryRegisterStewardWebhook
|
|
775
|
+
};
|
|
776
|
+
//# sourceMappingURL=steward-bridge.js.map
|