@vultisig/cli 0.15.0 → 0.15.2
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/CHANGELOG.md +13 -0
- package/dist/index.js +180 -55
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @vultisig/cli
|
|
2
2
|
|
|
3
|
+
## 0.15.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#263](https://github.com/vultisig/vultisig-sdk/pull/263) [`6585c38`](https://github.com/vultisig/vultisig-sdk/commit/6585c38431db063f600e133d1a23f84b7c19e934) Thanks [@rcoderdev](https://github.com/rcoderdev)! - fix(cli): align agent executor with backend payloads and harden action handling
|
|
8
|
+
- model `tx_ready` / non-streaming transaction payloads with `TxReadyPayload`
|
|
9
|
+
- optional `vultisig` on agent config for shared SDK state (e.g. address book)
|
|
10
|
+
- executor improvements (chain locks, calldata resolution, EVM gas refresh) and unit tests
|
|
11
|
+
|
|
12
|
+
- Updated dependencies [[`6585c38`](https://github.com/vultisig/vultisig-sdk/commit/6585c38431db063f600e133d1a23f84b7c19e934)]:
|
|
13
|
+
- @vultisig/sdk@0.15.2
|
|
14
|
+
- @vultisig/rujira@10.0.0
|
|
15
|
+
|
|
3
16
|
## 0.15.0
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/dist/index.js
CHANGED
|
@@ -1452,7 +1452,7 @@ var init_formatUnits = __esm({
|
|
|
1452
1452
|
// src/index.ts
|
|
1453
1453
|
import "dotenv/config";
|
|
1454
1454
|
import { promises as fs4 } from "node:fs";
|
|
1455
|
-
import { parseKeygenQR, Vultisig as
|
|
1455
|
+
import { parseKeygenQR, Vultisig as Vultisig6 } from "@vultisig/sdk";
|
|
1456
1456
|
import chalk15 from "chalk";
|
|
1457
1457
|
import { program } from "commander";
|
|
1458
1458
|
import inquirer8 from "inquirer";
|
|
@@ -3934,7 +3934,12 @@ Address Book${options.chain ? ` (${options.chain})` : ""}:
|
|
|
3934
3934
|
}
|
|
3935
3935
|
|
|
3936
3936
|
// src/commands/rujira.ts
|
|
3937
|
-
import {
|
|
3937
|
+
import {
|
|
3938
|
+
getRoutesSummary,
|
|
3939
|
+
listEasyRoutes,
|
|
3940
|
+
RujiraClient,
|
|
3941
|
+
VultisigRujiraProvider
|
|
3942
|
+
} from "@vultisig/rujira";
|
|
3938
3943
|
async function createRujiraClient(ctx2, options = {}) {
|
|
3939
3944
|
const vault = await ctx2.ensureActiveVault();
|
|
3940
3945
|
const provider = new VultisigRujiraProvider(vault);
|
|
@@ -4566,8 +4571,11 @@ var AgentClient = class {
|
|
|
4566
4571
|
case "tx_ready":
|
|
4567
4572
|
if (this.verbose) process.stderr.write(`[SSE:tx_ready] raw: ${data.slice(0, 2e3)}
|
|
4568
4573
|
`);
|
|
4569
|
-
|
|
4570
|
-
|
|
4574
|
+
{
|
|
4575
|
+
const txReady = parsed;
|
|
4576
|
+
result.transactions.push(txReady);
|
|
4577
|
+
callbacks.onTxReady?.(txReady);
|
|
4578
|
+
}
|
|
4571
4579
|
break;
|
|
4572
4580
|
case "message":
|
|
4573
4581
|
result.message = parsed.message || parsed;
|
|
@@ -4782,7 +4790,7 @@ function getNativeTokenDecimals(chain) {
|
|
|
4782
4790
|
}
|
|
4783
4791
|
|
|
4784
4792
|
// src/agent/executor.ts
|
|
4785
|
-
import { Chain as Chain9, Vultisig as
|
|
4793
|
+
import { Chain as Chain9, evmCall, fiatCurrencies as fiatCurrencies3, Vultisig as VultisigSdk } from "@vultisig/sdk";
|
|
4786
4794
|
|
|
4787
4795
|
// node_modules/viem/_esm/index.js
|
|
4788
4796
|
init_formatUnits();
|
|
@@ -4999,6 +5007,8 @@ var EVM_GAS_RPC = {
|
|
|
4999
5007
|
};
|
|
5000
5008
|
var AgentExecutor = class {
|
|
5001
5009
|
vault;
|
|
5010
|
+
/** Owning SDK (optional); used for address book backed by app storage */
|
|
5011
|
+
vultisig;
|
|
5002
5012
|
pendingPayloads = /* @__PURE__ */ new Map();
|
|
5003
5013
|
password = null;
|
|
5004
5014
|
verbose;
|
|
@@ -5007,9 +5017,10 @@ var AgentExecutor = class {
|
|
|
5007
5017
|
chainLockReleases = /* @__PURE__ */ new Map();
|
|
5008
5018
|
/** Backend client for resolving calldata_id references. */
|
|
5009
5019
|
backendClient = null;
|
|
5010
|
-
constructor(vault, verbose = false, vaultId) {
|
|
5020
|
+
constructor(vault, verbose = false, vaultId, vultisig) {
|
|
5011
5021
|
this.vault = vault;
|
|
5012
5022
|
this.verbose = verbose;
|
|
5023
|
+
this.vultisig = vultisig;
|
|
5013
5024
|
if (vaultId) {
|
|
5014
5025
|
this.stateStore = new VaultStateStore(vaultId);
|
|
5015
5026
|
}
|
|
@@ -5023,6 +5034,8 @@ var AgentExecutor = class {
|
|
|
5023
5034
|
/**
|
|
5024
5035
|
* Store a server-built transaction (from tx_ready SSE event).
|
|
5025
5036
|
* This allows sign_tx to find and sign it when the backend requests signing.
|
|
5037
|
+
*
|
|
5038
|
+
* @returns true when a signable payload was stored; false for MCP errors or missing tx body
|
|
5026
5039
|
*/
|
|
5027
5040
|
storeServerTransaction(txReadyData) {
|
|
5028
5041
|
if (this.verbose)
|
|
@@ -5030,11 +5043,17 @@ var AgentExecutor = class {
|
|
|
5030
5043
|
`[executor] storeServerTransaction called, keys: ${Object.keys(txReadyData || {}).join(",")}
|
|
5031
5044
|
`
|
|
5032
5045
|
);
|
|
5033
|
-
const
|
|
5034
|
-
if (
|
|
5046
|
+
const nestedTx = txReadyData?.swap_tx || txReadyData?.send_tx || txReadyData?.tx;
|
|
5047
|
+
if (nestedTx?.status === "error" || nestedTx?.error) {
|
|
5048
|
+
if (this.verbose)
|
|
5049
|
+
process.stderr.write(`[executor] skipping error tx_ready: ${nestedTx.error || "unknown error"}
|
|
5050
|
+
`);
|
|
5051
|
+
return false;
|
|
5052
|
+
}
|
|
5053
|
+
if (!nestedTx) {
|
|
5035
5054
|
if (this.verbose) process.stderr.write(`[executor] storeServerTransaction: no swap_tx/send_tx/tx found in data
|
|
5036
5055
|
`);
|
|
5037
|
-
return;
|
|
5056
|
+
return false;
|
|
5038
5057
|
}
|
|
5039
5058
|
const chain = resolveChainFromTxReady(txReadyData) || Chain9.Ethereum;
|
|
5040
5059
|
this.pendingPayloads.clear();
|
|
@@ -5049,6 +5068,7 @@ var AgentExecutor = class {
|
|
|
5049
5068
|
`[executor] Stored server tx for chain ${chain}, pendingPayloads size=${this.pendingPayloads.size}
|
|
5050
5069
|
`
|
|
5051
5070
|
);
|
|
5071
|
+
return true;
|
|
5052
5072
|
}
|
|
5053
5073
|
hasPendingTransaction() {
|
|
5054
5074
|
return this.pendingPayloads.has("latest");
|
|
@@ -5107,7 +5127,7 @@ var AgentExecutor = class {
|
|
|
5107
5127
|
case "sign_tx":
|
|
5108
5128
|
return this.signTx(params);
|
|
5109
5129
|
case "get_address_book":
|
|
5110
|
-
return this.getAddressBook();
|
|
5130
|
+
return this.getAddressBook(params);
|
|
5111
5131
|
case "address_book_add":
|
|
5112
5132
|
return this.addAddressBookEntry(params);
|
|
5113
5133
|
case "address_book_remove":
|
|
@@ -5153,15 +5173,34 @@ var AgentExecutor = class {
|
|
|
5153
5173
|
}
|
|
5154
5174
|
return { balances: entries };
|
|
5155
5175
|
}
|
|
5156
|
-
async getPortfolio(
|
|
5157
|
-
const
|
|
5158
|
-
const
|
|
5159
|
-
|
|
5176
|
+
async getPortfolio(params) {
|
|
5177
|
+
const currencyRaw = String(params.currency ?? "USD").trim().toLowerCase();
|
|
5178
|
+
const fiatCurrency = fiatCurrencies3.includes(currencyRaw) ? currencyRaw : "usd";
|
|
5179
|
+
const portfolio = await this.vault.portfolio(fiatCurrency);
|
|
5180
|
+
const chainFilter = params.chain;
|
|
5181
|
+
const tickerFilter = params.ticker;
|
|
5182
|
+
let rows = portfolio.balances.map((b) => ({
|
|
5183
|
+
chain: b.chainId || "",
|
|
5160
5184
|
symbol: b.symbol || "",
|
|
5161
5185
|
amount: b.formattedAmount || b.amount?.toString() || "0",
|
|
5162
|
-
decimals: b.decimals
|
|
5186
|
+
decimals: b.decimals ?? 18,
|
|
5187
|
+
raw_amount: b.amount,
|
|
5188
|
+
fiatValue: b.fiatValue,
|
|
5189
|
+
fiatCurrency: b.fiatCurrency ?? portfolio.currency
|
|
5163
5190
|
}));
|
|
5164
|
-
|
|
5191
|
+
if (chainFilter) {
|
|
5192
|
+
const chain = resolveChain(chainFilter);
|
|
5193
|
+
if (!chain) throw new Error(`Unknown chain: ${chainFilter}`);
|
|
5194
|
+
rows = rows.filter((r) => r.chain.toLowerCase() === chain.toLowerCase());
|
|
5195
|
+
}
|
|
5196
|
+
if (tickerFilter) {
|
|
5197
|
+
rows = rows.filter((r) => r.symbol.toLowerCase() === String(tickerFilter).toLowerCase());
|
|
5198
|
+
}
|
|
5199
|
+
return {
|
|
5200
|
+
balances: rows,
|
|
5201
|
+
totalValue: portfolio.totalValue,
|
|
5202
|
+
currency: portfolio.currency
|
|
5203
|
+
};
|
|
5165
5204
|
}
|
|
5166
5205
|
// ============================================================================
|
|
5167
5206
|
// Chain & Token Management
|
|
@@ -5261,13 +5300,28 @@ var AgentExecutor = class {
|
|
|
5261
5300
|
};
|
|
5262
5301
|
const amount = parseAmount(amountStr, balance.decimals);
|
|
5263
5302
|
const memo = params.memo;
|
|
5264
|
-
const payload = await this.vault.prepareSendTx({
|
|
5303
|
+
const payload = await this.vault.prepareSendTx({
|
|
5304
|
+
coin,
|
|
5305
|
+
receiver: toAddress,
|
|
5306
|
+
amount,
|
|
5307
|
+
memo
|
|
5308
|
+
});
|
|
5265
5309
|
await this.patchEvmNonce(chain, payload);
|
|
5266
5310
|
const messageHashes = await this.vault.extractMessageHashes(payload);
|
|
5267
5311
|
this.pendingPayloads.clear();
|
|
5268
5312
|
const payloadId = `tx_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
|
|
5269
|
-
this.pendingPayloads.set(payloadId, {
|
|
5270
|
-
|
|
5313
|
+
this.pendingPayloads.set(payloadId, {
|
|
5314
|
+
payload,
|
|
5315
|
+
coin,
|
|
5316
|
+
chain,
|
|
5317
|
+
timestamp: Date.now()
|
|
5318
|
+
});
|
|
5319
|
+
this.pendingPayloads.set("latest", {
|
|
5320
|
+
payload,
|
|
5321
|
+
coin,
|
|
5322
|
+
chain,
|
|
5323
|
+
timestamp: Date.now()
|
|
5324
|
+
});
|
|
5271
5325
|
return {
|
|
5272
5326
|
keysign_payload: payloadId,
|
|
5273
5327
|
from_chain: chain.toString(),
|
|
@@ -5307,7 +5361,10 @@ var AgentExecutor = class {
|
|
|
5307
5361
|
const fromToken = params.from_contract || params.from_token_id;
|
|
5308
5362
|
const toToken = params.to_contract || params.to_token_id;
|
|
5309
5363
|
const fromCoin = { chain: fromChain, token: fromToken || void 0 };
|
|
5310
|
-
const toCoin = {
|
|
5364
|
+
const toCoin = {
|
|
5365
|
+
chain: toChain || fromChain,
|
|
5366
|
+
token: toToken || void 0
|
|
5367
|
+
};
|
|
5311
5368
|
const quote = await this.vault.getSwapQuote({
|
|
5312
5369
|
fromCoin,
|
|
5313
5370
|
toCoin,
|
|
@@ -5377,11 +5434,14 @@ var AgentExecutor = class {
|
|
|
5377
5434
|
chain: params.chain,
|
|
5378
5435
|
chain_id: params.chain_id
|
|
5379
5436
|
};
|
|
5380
|
-
this.storeServerTransaction({
|
|
5437
|
+
const stored = this.storeServerTransaction({
|
|
5381
5438
|
tx: txData,
|
|
5382
5439
|
chain: params.chain,
|
|
5383
5440
|
from_chain: params.chain
|
|
5384
5441
|
});
|
|
5442
|
+
if (!stored) {
|
|
5443
|
+
throw new Error("Could not stage calldata transaction for signing (invalid or empty tx payload)");
|
|
5444
|
+
}
|
|
5385
5445
|
const chain = resolveChain(params.chain) || Chain9.Ethereum;
|
|
5386
5446
|
const address = await this.vault.address(chain);
|
|
5387
5447
|
return {
|
|
@@ -5454,9 +5514,10 @@ var AgentExecutor = class {
|
|
|
5454
5514
|
}
|
|
5455
5515
|
const { payload, chain } = stored;
|
|
5456
5516
|
if (payload.__serverTx) {
|
|
5517
|
+
let result;
|
|
5457
5518
|
if (chain === "Solana" && (payload.swap_tx || payload.provider)) {
|
|
5458
5519
|
try {
|
|
5459
|
-
|
|
5520
|
+
result = await this.buildAndSignSolanaSwapLocally(payload);
|
|
5460
5521
|
} catch (e) {
|
|
5461
5522
|
if (e._phase === "prepare") {
|
|
5462
5523
|
if (this.verbose)
|
|
@@ -5467,7 +5528,9 @@ var AgentExecutor = class {
|
|
|
5467
5528
|
}
|
|
5468
5529
|
}
|
|
5469
5530
|
}
|
|
5470
|
-
|
|
5531
|
+
if (!result) result = await this.signServerTx(payload, chain, params);
|
|
5532
|
+
if (payload.sequence_id) result.sequence_id = payload.sequence_id;
|
|
5533
|
+
return result;
|
|
5471
5534
|
}
|
|
5472
5535
|
return this.signSdkTx(payload, chain, payloadId);
|
|
5473
5536
|
}
|
|
@@ -5503,7 +5566,7 @@ var AgentExecutor = class {
|
|
|
5503
5566
|
}
|
|
5504
5567
|
await this.releaseEvmLock(chain);
|
|
5505
5568
|
this.pendingPayloads.clear();
|
|
5506
|
-
const explorerUrl =
|
|
5569
|
+
const explorerUrl = VultisigSdk.getTxExplorerUrl(chain, txHash);
|
|
5507
5570
|
return {
|
|
5508
5571
|
tx_hash: txHash,
|
|
5509
5572
|
chain: chain.toString(),
|
|
@@ -5600,7 +5663,7 @@ var AgentExecutor = class {
|
|
|
5600
5663
|
}
|
|
5601
5664
|
await this.releaseEvmLock(chain);
|
|
5602
5665
|
this.pendingPayloads.clear();
|
|
5603
|
-
const explorerUrl =
|
|
5666
|
+
const explorerUrl = VultisigSdk.getTxExplorerUrl(chain, txHash);
|
|
5604
5667
|
return {
|
|
5605
5668
|
tx_hash: txHash,
|
|
5606
5669
|
chain: chain.toString(),
|
|
@@ -5625,9 +5688,15 @@ var AgentExecutor = class {
|
|
|
5625
5688
|
const fromChainName = serverTxData.from_chain || serverTxData.chain || "Solana";
|
|
5626
5689
|
const toChainName = serverTxData.to_chain;
|
|
5627
5690
|
const fromChain = resolveChain(fromChainName);
|
|
5628
|
-
if (!fromChain)
|
|
5691
|
+
if (!fromChain)
|
|
5692
|
+
throw Object.assign(new Error(`Unknown from_chain: ${fromChainName}`), {
|
|
5693
|
+
_phase: "prepare"
|
|
5694
|
+
});
|
|
5629
5695
|
const toChain = toChainName ? resolveChain(toChainName) : fromChain;
|
|
5630
|
-
if (!toChain)
|
|
5696
|
+
if (!toChain)
|
|
5697
|
+
throw Object.assign(new Error(`Unknown to_chain: ${toChainName}`), {
|
|
5698
|
+
_phase: "prepare"
|
|
5699
|
+
});
|
|
5631
5700
|
const amountStr = serverTxData.amount;
|
|
5632
5701
|
if (!amountStr)
|
|
5633
5702
|
throw Object.assign(new Error("Missing amount in tx_ready data for local Solana swap build"), {
|
|
@@ -5694,7 +5763,7 @@ var AgentExecutor = class {
|
|
|
5694
5763
|
signature
|
|
5695
5764
|
});
|
|
5696
5765
|
this.pendingPayloads.clear();
|
|
5697
|
-
const explorerUrl =
|
|
5766
|
+
const explorerUrl = VultisigSdk.getTxExplorerUrl(chain, txHash);
|
|
5698
5767
|
return {
|
|
5699
5768
|
tx_hash: txHash,
|
|
5700
5769
|
chain: chain.toString(),
|
|
@@ -5942,8 +6011,18 @@ var AgentExecutor = class {
|
|
|
5942
6011
|
// ============================================================================
|
|
5943
6012
|
// Address Book
|
|
5944
6013
|
// ============================================================================
|
|
5945
|
-
async getAddressBook() {
|
|
5946
|
-
|
|
6014
|
+
async getAddressBook(params) {
|
|
6015
|
+
if (!this.vultisig) {
|
|
6016
|
+
throw new Error(
|
|
6017
|
+
"get_address_book requires the CLI SDK instance. Ensure AgentConfig.vultisig is set when creating the session."
|
|
6018
|
+
);
|
|
6019
|
+
}
|
|
6020
|
+
const chainName = params.chain || params.chain_name;
|
|
6021
|
+
const chain = chainName ? resolveChain(chainName) : void 0;
|
|
6022
|
+
if (chainName && !chain) {
|
|
6023
|
+
throw new Error(`Unknown chain: ${chainName}`);
|
|
6024
|
+
}
|
|
6025
|
+
return await this.vultisig.getAddressBook(chain);
|
|
5947
6026
|
}
|
|
5948
6027
|
async addAddressBookEntry(_params) {
|
|
5949
6028
|
throw new Error("address_book_add is not yet implemented locally. The backend may handle this action server-side.");
|
|
@@ -5956,8 +6035,34 @@ var AgentExecutor = class {
|
|
|
5956
6035
|
// ============================================================================
|
|
5957
6036
|
// Token Search & Other
|
|
5958
6037
|
// ============================================================================
|
|
5959
|
-
async searchToken(
|
|
5960
|
-
|
|
6038
|
+
async searchToken(params) {
|
|
6039
|
+
const query = String(params.query ?? params.q ?? "").trim().toLowerCase();
|
|
6040
|
+
if (!query) {
|
|
6041
|
+
return { tokens: [] };
|
|
6042
|
+
}
|
|
6043
|
+
const limit = 20;
|
|
6044
|
+
const chainName = params.chain;
|
|
6045
|
+
const tokenMatchesQuery = (t) => {
|
|
6046
|
+
const tick = t.ticker.toLowerCase();
|
|
6047
|
+
const addr = (t.contractAddress ?? "").toLowerCase();
|
|
6048
|
+
const pid = (t.priceProviderId ?? "").toLowerCase();
|
|
6049
|
+
return tick.includes(query) || addr.includes(query) || pid.includes(query);
|
|
6050
|
+
};
|
|
6051
|
+
if (chainName) {
|
|
6052
|
+
const chain = resolveChain(chainName);
|
|
6053
|
+
if (!chain) throw new Error(`Unknown chain: ${chainName}`);
|
|
6054
|
+
const tokens = VultisigSdk.getKnownTokens(chain).filter(tokenMatchesQuery).slice(0, limit);
|
|
6055
|
+
return { tokens };
|
|
6056
|
+
}
|
|
6057
|
+
const out = [];
|
|
6058
|
+
for (const c of Object.values(Chain9)) {
|
|
6059
|
+
for (const t of VultisigSdk.getKnownTokens(c)) {
|
|
6060
|
+
if (!tokenMatchesQuery(t)) continue;
|
|
6061
|
+
out.push(t);
|
|
6062
|
+
if (out.length >= limit) return { tokens: out };
|
|
6063
|
+
}
|
|
6064
|
+
}
|
|
6065
|
+
return { tokens: out };
|
|
5961
6066
|
}
|
|
5962
6067
|
async listVaults() {
|
|
5963
6068
|
return {
|
|
@@ -5974,8 +6079,25 @@ var AgentExecutor = class {
|
|
|
5974
6079
|
async scanTx(_params) {
|
|
5975
6080
|
throw new Error("scan_tx is not yet implemented locally. The backend may handle this action server-side.");
|
|
5976
6081
|
}
|
|
5977
|
-
async readEvmContract(
|
|
5978
|
-
|
|
6082
|
+
async readEvmContract(params) {
|
|
6083
|
+
const chainName = params.chain;
|
|
6084
|
+
if (!chainName) throw new Error("read_evm_contract requires chain");
|
|
6085
|
+
const contractRaw = params.contract_address || params.contractAddress;
|
|
6086
|
+
if (!contractRaw) throw new Error("read_evm_contract requires contract_address");
|
|
6087
|
+
const functionName = params.function_name || params.functionName;
|
|
6088
|
+
if (!functionName) throw new Error("read_evm_contract requires function_name");
|
|
6089
|
+
const chain = resolveChain(chainName);
|
|
6090
|
+
if (!chain) throw new Error(`Unknown chain: ${chainName}`);
|
|
6091
|
+
if (!EVM_CHAINS.has(chain)) {
|
|
6092
|
+
throw new Error(`read_evm_contract only supports EVM chains (got ${chain})`);
|
|
6093
|
+
}
|
|
6094
|
+
const callParams = params.params ?? [];
|
|
6095
|
+
const data = await encodeContractCall(functionName, callParams);
|
|
6096
|
+
const addr = contractRaw.startsWith("0x") ? contractRaw : `0x${contractRaw}`;
|
|
6097
|
+
const to = addr;
|
|
6098
|
+
const from = params.from;
|
|
6099
|
+
const result = await evmCall(chain, { to, data, from });
|
|
6100
|
+
return { result };
|
|
5979
6101
|
}
|
|
5980
6102
|
};
|
|
5981
6103
|
async function encodeContractCall(functionName, params) {
|
|
@@ -6249,7 +6371,10 @@ function parseDERSignature(sigHex) {
|
|
|
6249
6371
|
}
|
|
6250
6372
|
let offset = 0;
|
|
6251
6373
|
if (raw.slice(offset, offset + 2) !== "30") {
|
|
6252
|
-
return {
|
|
6374
|
+
return {
|
|
6375
|
+
r: raw.slice(0, 64).padStart(64, "0"),
|
|
6376
|
+
s: raw.slice(64).padStart(64, "0")
|
|
6377
|
+
};
|
|
6253
6378
|
}
|
|
6254
6379
|
offset += 2;
|
|
6255
6380
|
offset += 2;
|
|
@@ -6459,7 +6584,7 @@ var AgentSession = class {
|
|
|
6459
6584
|
this.config = config;
|
|
6460
6585
|
this.client = new AgentClient(config.backendUrl);
|
|
6461
6586
|
this.client.verbose = !!config.verbose;
|
|
6462
|
-
this.executor = new AgentExecutor(vault, !!config.verbose, vault.publicKeys.ecdsa);
|
|
6587
|
+
this.executor = new AgentExecutor(vault, !!config.verbose, vault.publicKeys.ecdsa, config.vultisig);
|
|
6463
6588
|
this.publicKey = vault.publicKeys.ecdsa;
|
|
6464
6589
|
if (config.password) {
|
|
6465
6590
|
this.executor.setPassword(config.password);
|
|
@@ -6616,6 +6741,7 @@ var AgentSession = class {
|
|
|
6616
6741
|
error: result.error || ""
|
|
6617
6742
|
};
|
|
6618
6743
|
}
|
|
6744
|
+
let serverTxStoredFromStream = 0;
|
|
6619
6745
|
const streamResult = await this.client.sendMessageStream(
|
|
6620
6746
|
this.conversationId,
|
|
6621
6747
|
request,
|
|
@@ -6636,16 +6762,11 @@ var AgentSession = class {
|
|
|
6636
6762
|
ui.onSuggestions(suggestions);
|
|
6637
6763
|
},
|
|
6638
6764
|
onTxReady: (tx) => {
|
|
6639
|
-
|
|
6640
|
-
|
|
6641
|
-
if (this.config.
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
return;
|
|
6645
|
-
}
|
|
6646
|
-
this.executor.storeServerTransaction(tx);
|
|
6647
|
-
if (this.config.password) {
|
|
6648
|
-
this.executor.setPassword(this.config.password);
|
|
6765
|
+
if (this.executor.storeServerTransaction(tx)) {
|
|
6766
|
+
serverTxStoredFromStream++;
|
|
6767
|
+
if (this.config.password) {
|
|
6768
|
+
this.executor.setPassword(this.config.password);
|
|
6769
|
+
}
|
|
6649
6770
|
}
|
|
6650
6771
|
},
|
|
6651
6772
|
onMessage: (_msg) => {
|
|
@@ -6696,10 +6817,12 @@ var AgentSession = class {
|
|
|
6696
6817
|
return;
|
|
6697
6818
|
}
|
|
6698
6819
|
}
|
|
6699
|
-
if (
|
|
6820
|
+
if (serverTxStoredFromStream > 0) {
|
|
6700
6821
|
if (this.config.verbose)
|
|
6701
|
-
process.stderr.write(
|
|
6702
|
-
`
|
|
6822
|
+
process.stderr.write(
|
|
6823
|
+
`[session] ${serverTxStoredFromStream} stored server tx from tx_ready, signing client-side
|
|
6824
|
+
`
|
|
6825
|
+
);
|
|
6703
6826
|
const signAction = {
|
|
6704
6827
|
id: `tx_sign_${Date.now()}`,
|
|
6705
6828
|
type: "sign_tx",
|
|
@@ -7214,6 +7337,7 @@ async function executeAgent(ctx2, options) {
|
|
|
7214
7337
|
const config = {
|
|
7215
7338
|
backendUrl: options.backendUrl || process.env.VULTISIG_AGENT_URL || "https://abe.vultisig.com",
|
|
7216
7339
|
vaultName: vault.name,
|
|
7340
|
+
vultisig: ctx2.sdk,
|
|
7217
7341
|
password: options.password,
|
|
7218
7342
|
viaAgent: options.viaAgent,
|
|
7219
7343
|
sessionId: options.sessionId,
|
|
@@ -7255,6 +7379,7 @@ async function executeAgentAsk(ctx2, message, options) {
|
|
|
7255
7379
|
const config = {
|
|
7256
7380
|
backendUrl: options.backendUrl || process.env.VULTISIG_AGENT_URL || "https://abe.vultisig.com",
|
|
7257
7381
|
vaultName: vault.name,
|
|
7382
|
+
vultisig: ctx2.sdk,
|
|
7258
7383
|
password: options.password,
|
|
7259
7384
|
sessionId: options.session,
|
|
7260
7385
|
verbose: options.verbose,
|
|
@@ -7759,7 +7884,7 @@ var EventBuffer = class {
|
|
|
7759
7884
|
};
|
|
7760
7885
|
|
|
7761
7886
|
// src/interactive/session.ts
|
|
7762
|
-
import { fiatCurrencies as
|
|
7887
|
+
import { fiatCurrencies as fiatCurrencies4 } from "@vultisig/sdk";
|
|
7763
7888
|
import chalk12 from "chalk";
|
|
7764
7889
|
import ora3 from "ora";
|
|
7765
7890
|
import * as readline3 from "readline";
|
|
@@ -8577,9 +8702,9 @@ Error: ${error2.message}`));
|
|
|
8577
8702
|
i++;
|
|
8578
8703
|
}
|
|
8579
8704
|
}
|
|
8580
|
-
if (!
|
|
8705
|
+
if (!fiatCurrencies4.includes(currency)) {
|
|
8581
8706
|
console.log(chalk12.red(`Invalid currency: ${currency}`));
|
|
8582
|
-
console.log(chalk12.yellow(`Supported currencies: ${
|
|
8707
|
+
console.log(chalk12.yellow(`Supported currencies: ${fiatCurrencies4.join(", ")}`));
|
|
8583
8708
|
return;
|
|
8584
8709
|
}
|
|
8585
8710
|
const raw = args.includes("--raw");
|
|
@@ -8828,7 +8953,7 @@ var cachedVersion = null;
|
|
|
8828
8953
|
function getVersion() {
|
|
8829
8954
|
if (cachedVersion) return cachedVersion;
|
|
8830
8955
|
if (true) {
|
|
8831
|
-
cachedVersion = "0.15.
|
|
8956
|
+
cachedVersion = "0.15.2";
|
|
8832
8957
|
return cachedVersion;
|
|
8833
8958
|
}
|
|
8834
8959
|
try {
|
|
@@ -9323,7 +9448,7 @@ async function init(vaultOverride, unlockPassword, passwordTTL) {
|
|
|
9323
9448
|
}
|
|
9324
9449
|
const globalOptions = program.opts();
|
|
9325
9450
|
const serverEndpoints = resolveServerEndpoints(globalOptions);
|
|
9326
|
-
const sdk = new
|
|
9451
|
+
const sdk = new Vultisig6({
|
|
9327
9452
|
onPasswordRequired: createPasswordCallback(),
|
|
9328
9453
|
...serverEndpoints ? { serverEndpoints } : {},
|
|
9329
9454
|
...passwordTTL !== void 0 ? { passwordCache: { defaultTTL: passwordTTL } } : {}
|
|
@@ -9940,7 +10065,7 @@ program.command("update").description("Check for updates and show update command
|
|
|
9940
10065
|
setupCompletionCommand(program);
|
|
9941
10066
|
async function startInteractiveMode() {
|
|
9942
10067
|
const serverEndpoints = resolveServerEndpoints(parseServerEndpointOverridesFromArgv(process.argv.slice(2)));
|
|
9943
|
-
const sdk = new
|
|
10068
|
+
const sdk = new Vultisig6({
|
|
9944
10069
|
onPasswordRequired: createPasswordCallback(),
|
|
9945
10070
|
...serverEndpoints ? { serverEndpoints } : {}
|
|
9946
10071
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vultisig/cli",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.2",
|
|
4
4
|
"description": "Command-line wallet for Vultisig - multi-chain MPC wallet management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@cosmjs/stargate": "^0.38.1",
|
|
56
56
|
"@noble/hashes": "^2.0.1",
|
|
57
57
|
"@vultisig/rujira": "^10.0.0",
|
|
58
|
-
"@vultisig/sdk": "^0.15.
|
|
58
|
+
"@vultisig/sdk": "^0.15.3",
|
|
59
59
|
"chalk": "^5.6.2",
|
|
60
60
|
"cli-table3": "^0.6.5",
|
|
61
61
|
"commander": "^14.0.3",
|