@vultisig/cli 2.19.14 → 2.19.18

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # @vultisig/cli
2
2
 
3
+ ## 2.19.18
4
+
5
+ ### Patch Changes
6
+
7
+ - [#1223](https://github.com/vultisig/vultisig-sdk/pull/1223) [`6296248`](https://github.com/vultisig/vultisig-sdk/commit/62962482d8499f697e0634260a2e6083b944e649) Thanks [@neavra](https://github.com/neavra)! - Fix `agent ask` headless signing so a vault unlocked via `VAULT_PASSWORD` (or the OS keyring) can sign without also passing `--password`. The sign-time gate now keys off whether a password is actually needed — an encrypted vault that is still locked with no password in hand — and retries the same non-interactive chain (cache → keyring → `VAULT_PASSWORDS`/`VAULT_PASSWORD`) before prompting, instead of always re-prompting when `--password` was absent. Unencrypted vaults skip the gate entirely. The transaction confirmation gate is unchanged. Also corrects the `VAULT_PASSWORD` help text.
8
+
3
9
  ## 2.19.14
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -10496,6 +10496,14 @@ var AgentExecutor = class {
10496
10496
  setPassword(password) {
10497
10497
  this.password = password;
10498
10498
  }
10499
+ /**
10500
+ * Whether a password is already held (set at unlock via the keyring/env chain
10501
+ * or `--password`). The sign gate consults this so a session unlocked
10502
+ * non-interactively doesn't get re-prompted for a secret it already has.
10503
+ */
10504
+ hasPassword() {
10505
+ return this.password != null;
10506
+ }
10499
10507
  /** Opt out of the persistent broadcast-journal duplicate guard (`--force`). */
10500
10508
  setForceBroadcast(force) {
10501
10509
  this.forceBroadcast = force;
@@ -13833,28 +13841,37 @@ var AgentSession = class {
13833
13841
  }
13834
13842
  let promptedPassword;
13835
13843
  if (PASSWORD_REQUIRED_TOOLS.has(toolName) && !this.config.password) {
13836
- try {
13837
- promptedPassword = await ui.requestPassword();
13838
- this.executor.setPassword(promptedPassword);
13839
- } catch {
13840
- const failure = {
13841
- tool: toolName,
13842
- success: false,
13843
- data: {
13844
- error: "Password not provided",
13845
- code: "PASSWORD_REQUIRED" /* PASSWORD_REQUIRED */
13844
+ const vaultLocked = this.vault.isEncrypted && !this.vault.isUnlocked();
13845
+ const needsPassword = vaultLocked && !this.executor.hasPassword();
13846
+ if (needsPassword) {
13847
+ const resolved = await resolvePasswordNonInteractive(this.vault.id, this.vault.name);
13848
+ if (resolved) {
13849
+ this.executor.setPassword(resolved);
13850
+ } else {
13851
+ try {
13852
+ promptedPassword = await ui.requestPassword();
13853
+ this.executor.setPassword(promptedPassword);
13854
+ } catch {
13855
+ const failure = {
13856
+ tool: toolName,
13857
+ success: false,
13858
+ data: {
13859
+ error: "Password not provided",
13860
+ code: "PASSWORD_REQUIRED" /* PASSWORD_REQUIRED */
13861
+ }
13862
+ };
13863
+ ui.onToolCall(toolCallId, toolName, input);
13864
+ ui.onToolResult(
13865
+ toolCallId,
13866
+ toolName,
13867
+ false,
13868
+ failure.data,
13869
+ "Password not provided",
13870
+ "PASSWORD_REQUIRED" /* PASSWORD_REQUIRED */
13871
+ );
13872
+ return failure;
13846
13873
  }
13847
- };
13848
- ui.onToolCall(toolCallId, toolName, input);
13849
- ui.onToolResult(
13850
- toolCallId,
13851
- toolName,
13852
- false,
13853
- failure.data,
13854
- "Password not provided",
13855
- "PASSWORD_REQUIRED" /* PASSWORD_REQUIRED */
13856
- );
13857
- return failure;
13874
+ }
13858
13875
  }
13859
13876
  }
13860
13877
  ui.onToolCall(toolCallId, toolName, input);
@@ -14671,7 +14688,7 @@ var cachedVersion = null;
14671
14688
  function getVersion() {
14672
14689
  if (cachedVersion) return cachedVersion;
14673
14690
  if (true) {
14674
- cachedVersion = "2.19.14";
14691
+ cachedVersion = "2.19.18";
14675
14692
  return cachedVersion;
14676
14693
  }
14677
14694
  try {
@@ -16718,7 +16735,7 @@ program.name("vultisig").description("Vultisig CLI - Secure multi-party crypto w
16718
16735
  process.stdout.isTTY ? "table" : "json"
16719
16736
  ).option("-q, --quiet", "Strip empty/zero fields from output").option("--fields <fields>", "Comma-separated list of fields to include in output").option("--non-interactive", "Disable interactive prompts (fail instead of asking)").option("--ci", "CI/automation mode (equivalent to --output json --non-interactive --quiet)").option("-i, --interactive", "Start interactive shell mode").option("--vault <nameOrId>", "Specify vault by name or ID").option("--server-url <url>", "Base Vultisig API URL for FastVault and relay endpoints").addHelpText(
16720
16737
  "after",
16721
- "\nExit codes:\n" + Object.entries(EXIT_CODE_DESCRIPTIONS).map(([k, v]) => ` ${k} ${v}`).join("\n") + "\n\nEnvironment variables:\n VAULT_PASSWORD Vault password for signing (bypasses prompt)\n VULTISIG_PASSWORD Alias for VAULT_PASSWORD\n VAULT_PASSWORDS Space-separated VaultName:password pairs\n VULTISIG_VAULT Default vault name or ID\n VULTISIG_CONFIG_DIR Override config directory (~/.vultisig)\n VULTISIG_SILENT Set to 1 for silent mode\n VULTISIG_HTTP_TIMEOUT_MS Agent-backend request timeout in ms (default 30000)\n NO_COLOR Disable colored output"
16738
+ "\nExit codes:\n" + Object.entries(EXIT_CODE_DESCRIPTIONS).map(([k, v]) => ` ${k} ${v}`).join("\n") + "\n\nEnvironment variables:\n VAULT_PASSWORD Vault password \u2014 unlocks the vault for reads and signing (no prompt)\n VULTISIG_PASSWORD Alias for VAULT_PASSWORD\n VAULT_PASSWORDS Space-separated VaultName:password pairs\n VULTISIG_VAULT Default vault name or ID\n VULTISIG_CONFIG_DIR Override config directory (~/.vultisig)\n VULTISIG_SILENT Set to 1 for silent mode\n VULTISIG_HTTP_TIMEOUT_MS Agent-backend request timeout in ms (default 30000)\n NO_COLOR Disable colored output"
16722
16739
  ).hook("preAction", (thisCommand) => {
16723
16740
  const opts = thisCommand.opts();
16724
16741
  if (opts.ci) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vultisig/cli",
3
- "version": "2.19.14",
3
+ "version": "2.19.18",
4
4
  "description": "The self-custody MPC wallet CLI for AI coding agents (Claude Code, Cursor, OpenCode). Natural-language agent mode, 36+ chains, DKLS23 threshold signatures. Seedless.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -74,9 +74,9 @@
74
74
  "@napi-rs/keyring": "^1.3.0",
75
75
  "@noble/hashes": "^2.2.0",
76
76
  "@vultisig/client-shared": "^0.2.17",
77
- "@vultisig/core-chain": "^2.24.3",
77
+ "@vultisig/core-chain": "^2.25.1",
78
78
  "@vultisig/rujira": "^52.0.0",
79
- "@vultisig/sdk": "^2.19.14",
79
+ "@vultisig/sdk": "^2.19.17",
80
80
  "chalk": "^5.6.2",
81
81
  "cli-table3": "^0.6.5",
82
82
  "commander": "^15.0.0",