@vultisig/client-shared 0.2.16 → 0.3.0

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,35 @@
1
1
  # @vultisig/client-shared
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#1179](https://github.com/vultisig/vultisig-sdk/pull/1179) [`0c80a06`](https://github.com/vultisig/vultisig-sdk/commit/0c80a062bde65c4938a29ce8c1fb6052028615e1) Thanks [@gomesalexandre](https://github.com/gomesalexandre)! - Route the CLI version cache, version output, and VaultStateStore local state through `VULTISIG_CONFIG_DIR` so they stay co-located with SDK vault storage and other shared CLI state.
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`69e2fc2`](https://github.com/vultisig/vultisig-sdk/commit/69e2fc2f92c053294b0276440306be5871988be9), [`0c80a06`](https://github.com/vultisig/vultisig-sdk/commit/0c80a062bde65c4938a29ce8c1fb6052028615e1), [`aa47b4a`](https://github.com/vultisig/vultisig-sdk/commit/aa47b4a03c7391d13c738cba68b13a1526d1c502), [`32e5d36`](https://github.com/vultisig/vultisig-sdk/commit/32e5d369ae4723299a6cb8f694da1782dbf207c2)]:
12
+ - @vultisig/sdk@2.21.1
13
+
14
+ ## 0.2.17
15
+
16
+ ### Patch Changes
17
+
18
+ - [#878](https://github.com/vultisig/vultisig-sdk/pull/878) [`26dd218`](https://github.com/vultisig/vultisig-sdk/commit/26dd218282b198fdea9c1118e7fe5bc800c071fb) Thanks [@neavra](https://github.com/neavra)! - Harden the vault-registry config store (`config-store.ts`):
19
+
20
+ - `loadConfig` now warns to stderr (naming the path and parse error) when
21
+ `config.json` is corrupted instead of silently reverting to an empty
22
+ registry, and leaves the bad file intact at load time (the next saveConfig
23
+ still overwrites it once the user mutates state — this is not durable
24
+ recovery). A missing file is still treated as the normal first-run case (no
25
+ warning).
26
+ - `saveConfig` now writes `config.json` with `0o600` perms (and `chmod`s on
27
+ every write, since the mode is only honored on create) and creates the
28
+ config dir with `0o700`, mirroring credential-store's hardening.
29
+
30
+ - Updated dependencies [[`69bb830`](https://github.com/vultisig/vultisig-sdk/commit/69bb8307de72883f0c7693871a6ca040b7a0756c)]:
31
+ - @vultisig/sdk@2.8.4
32
+
3
33
  ## 0.2.16
4
34
 
5
35
  ### Patch Changes
@@ -1,3 +1,4 @@
1
+ export declare function getVultisigConfigDir(): string;
1
2
  export type VaultEntry = {
2
3
  id: string;
3
4
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAOtD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAeA,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAMD,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CA4BtD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBlE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -8,21 +8,58 @@ import * as path from 'node:path';
8
8
  function getConfigDir() {
9
9
  return process.env.VULTISIG_CONFIG_DIR || path.join(os.homedir(), '.vultisig');
10
10
  }
11
+ // Public form of the resolver above, for CLI state that must stay co-located
12
+ // with the config store (version cache, vault state). Same call-time contract.
13
+ export function getVultisigConfigDir() {
14
+ return getConfigDir();
15
+ }
11
16
  function getConfigFilePath() {
12
17
  return path.join(getConfigDir(), 'config.json');
13
18
  }
14
19
  export async function loadConfig() {
20
+ const filePath = getConfigFilePath();
21
+ let raw;
22
+ try {
23
+ raw = await fs.readFile(filePath, 'utf-8');
24
+ }
25
+ catch (err) {
26
+ // A missing file is the normal first-run case — stay silent. Any other
27
+ // read failure (e.g. EACCES) is worth surfacing before falling back.
28
+ if (err?.code !== 'ENOENT') {
29
+ console.warn(`[vultisig] Could not read config at ${filePath}: ${err?.message ?? String(err)}. Using an empty registry.`);
30
+ }
31
+ return { vaults: [] };
32
+ }
15
33
  try {
16
- const raw = await fs.readFile(getConfigFilePath(), 'utf-8');
17
34
  return JSON.parse(raw);
18
35
  }
19
- catch {
36
+ catch (err) {
37
+ // Corrupted config (e.g. partial write or single-byte corruption): warn
38
+ // loudly instead of silently factory-resetting, which would vanish the
39
+ // user's vault registry. The bad file is left intact AT LOAD TIME (the next
40
+ // saveConfig still overwrites it when the user mutates state) — this is not
41
+ // durable recovery, just a chance to inspect the file before the next write.
42
+ console.warn(`[vultisig] Config at ${filePath} is corrupted (${err?.message ?? String(err)}); using an empty registry. The file was left intact at load time.`);
20
43
  return { vaults: [] };
21
44
  }
22
45
  }
23
46
  export async function saveConfig(config) {
24
- await fs.mkdir(getConfigDir(), { recursive: true });
25
- await fs.writeFile(getConfigFilePath(), JSON.stringify(config, null, 2), 'utf-8');
47
+ const dir = getConfigDir();
48
+ const filePath = getConfigFilePath();
49
+ // 0o700 dir / 0o600 file: the registry maps vault IDs to on-disk vault file
50
+ // paths and lives alongside credentials. Mirror credential-store's hardening
51
+ // (commit 7bafd71a).
52
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
53
+ await fs.writeFile(filePath, JSON.stringify(config, null, 2), { mode: 0o600 });
54
+ // writeFile's `mode` is honored only when the file is CREATED; an existing
55
+ // config.json keeps its old perms. chmod every write so a pre-existing (or
56
+ // out-of-band) file can't retain looser, world-readable perms.
57
+ try {
58
+ await fs.chmod(filePath, 0o600);
59
+ }
60
+ catch {
61
+ /* best-effort: non-POSIX FS (e.g. Windows) ignores perms */
62
+ }
26
63
  }
27
64
  export function getConfigPath() {
28
65
  return getConfigFilePath();
@@ -1 +1 @@
1
- {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAE1E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,4EAA4E;AAC5E,mFAAmF;AACnF,SAAS,YAAY;IACnB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;AAChF,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,OAAO,CAAC,CAAA;QAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkB;IACjD,MAAM,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACnD,MAAM,EAAE,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AACnF,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,iBAAiB,EAAE,CAAA;AAC5B,CAAC"}
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAE1E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,4EAA4E;AAC5E,mFAAmF;AACnF,SAAS,YAAY;IACnB,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;AAChF,CAAC;AAED,6EAA6E;AAC7E,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB;IAClC,OAAO,YAAY,EAAE,CAAA;AACvB,CAAC;AAED,SAAS,iBAAiB;IACxB,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAA;AACjD,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,uEAAuE;QACvE,qEAAqE;QACrE,IAAK,GAA6B,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CACV,uCAAuC,QAAQ,KAAM,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,4BAA4B,CACvH,CAAA;QACH,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAA;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,wEAAwE;QACxE,uEAAuE;QACvE,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,OAAO,CAAC,IAAI,CACV,wBAAwB,QAAQ,kBAAmB,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,oEAAoE,CAC7J,CAAA;QACD,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkB;IACjD,MAAM,GAAG,GAAG,YAAY,EAAE,CAAA;IAC1B,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAA;IACpC,4EAA4E;IAC5E,6EAA6E;IAC7E,qBAAqB;IACrB,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9E,2EAA2E;IAC3E,2EAA2E;IAC3E,+DAA+D;IAC/D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,iBAAiB,EAAE,CAAA;AAC5B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { executeAuthLogout, executeAuthSetup, executeAuthStatus } from './auth-setup.js';
2
- export { getConfigPath, loadConfig, saveConfig, type VaultEntry, type VsigConfig } from './config-store.js';
2
+ export { getConfigPath, getVultisigConfigDir, loadConfig, saveConfig, type VaultEntry, type VsigConfig, } from './config-store.js';
3
3
  export { _resetAll, clearCredentials, getCredentialsPath, getDecryptionPassword, getServerPassword, getStoredServerPassword, isUsingFileFallback, setDecryptionPassword, setFilePassphrase, setServerPassword, } from './credential-store.js';
4
4
  export * as descriptions from './descriptions.js';
5
5
  export { discoverVaultFiles, SEARCH_DIRS } from './vault-discovery.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC3G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,UAAU,EACV,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { executeAuthLogout, executeAuthSetup, executeAuthStatus } from './auth-setup.js';
2
- export { getConfigPath, loadConfig, saveConfig } from './config-store.js';
2
+ export { getConfigPath, getVultisigConfigDir, loadConfig, saveConfig, } from './config-store.js';
3
3
  export { _resetAll, clearCredentials, getCredentialsPath, getDecryptionPassword, getServerPassword, getStoredServerPassword, isUsingFileFallback, setDecryptionPassword, setFilePassphrase, setServerPassword, } from './credential-store.js';
4
4
  export * as descriptions from './descriptions.js';
5
5
  export { discoverVaultFiles, SEARCH_DIRS } from './vault-discovery.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAoC,MAAM,mBAAmB,CAAA;AAC3G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,UAAU,GAGX,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vultisig/client-shared",
3
- "version": "0.2.16",
3
+ "version": "0.3.0",
4
4
  "description": "Shared client infrastructure for Vultisig CLI and MCP — auth, config, tool descriptions",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -31,11 +31,11 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@napi-rs/keyring": "^1.3.0",
34
- "@vultisig/sdk": "^2.7.0",
34
+ "@vultisig/sdk": "^2.21.1",
35
35
  "inquirer": "^14.0.2"
36
36
  },
37
37
  "devDependencies": {
38
- "@types/node": "^26.0.0",
38
+ "@types/node": "^26.1.1",
39
39
  "typescript": "^6.0.3"
40
40
  },
41
41
  "publishConfig": {