@vess-id/vess 0.0.0-dev-20260917031855 → 0.0.0-dev-20261006110812

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.
@@ -1 +1 @@
1
- {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAMD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDxE"}
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAMD,wBAAsB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDxE"}
package/dist/cli/reset.js CHANGED
@@ -53,6 +53,7 @@ async function runReset(options = {}) {
53
53
  log(' - Daemon OS service (auto-start)');
54
54
  log(` - Config, policy, wallet: ${paths.baseDir}`);
55
55
  log(' - Root key & session token from OS Keychain');
56
+ log(` - Telemetry API key (OS Keychain, or ${paths.secretsDir} on Linux)`);
56
57
  log('');
57
58
  const confirmed = await promptConfirm('Are you sure? (y/N) ');
58
59
  if (!confirmed) {
@@ -76,10 +77,11 @@ async function runReset(options = {}) {
76
77
  await service_manager_1.ServiceManager.uninstall();
77
78
  }
78
79
  // 3. Delete keys from OS Keychain
79
- log('Cleaning Keychain entries...');
80
- const km = new key_manager_1.KeyManager();
80
+ log('Cleaning Keychain entries (and the telemetry API key file)...');
81
+ const km = new key_manager_1.KeyManager({ secretsDir: paths.secretsDir });
81
82
  km.deleteRootKey();
82
83
  km.deleteSessionToken();
84
+ km.deleteTelemetryApiKey();
83
85
  // 4. Delete agent keys listed in wallet.db (best-effort)
84
86
  deleteAgentKeysFromDb(paths, km);
85
87
  // 5. Remove ~/.vess directory
@@ -98,6 +100,7 @@ function deleteAgentKeysFromDb(paths, km) {
98
100
  return;
99
101
  try {
100
102
  // Dynamic import to avoid hard failure if db is corrupt
103
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
101
104
  const Database = require('better-sqlite3');
102
105
  const db = new Database(paths.walletDb, { readonly: true });
103
106
  const rows = db
@@ -116,7 +119,7 @@ function deleteAgentKeysFromDb(paths, km) {
116
119
  }
117
120
  }
118
121
  function promptConfirm(message) {
119
- return new Promise((resolve) => {
122
+ return new Promise(resolve => {
120
123
  if (!process.stdin.isTTY) {
121
124
  resolve(false);
122
125
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,4BAuDC;AAvED,uCAAwB;AACxB,yDAAoD;AACpD,2CAA2C;AAC3C,+DAA0D;AAC1D,2CAA0C;AAQ1C,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAA;AAClC,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,UAAwB,EAAE;IACvD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,iBAAS,EAAE,CAAA;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,KAAK,CAAA;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,qCAAqC;QACrC,GAAG,CAAC,EAAE,CAAC,CAAA;QACP,GAAG,CAAC,yCAAyC,CAAC,CAAA;QAC9C,GAAG,CAAC,+CAA+C,CAAC,CAAA;QACpD,GAAG,CAAC,qCAAqC,CAAC,CAAA;QAC1C,GAAG,CAAC,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QACpD,GAAG,CAAC,gDAAgD,CAAC,CAAA;QACrD,GAAG,CAAC,EAAE,CAAC,CAAA;QACP,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,sBAAsB,CAAC,CAAA;QAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,UAAU,CAAC,CAAA;YACf,OAAM;QACR,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,GAAG,CAAC,qCAAqC,CAAC,CAAA;IAC1C,IAAI,CAAC;QACH,+EAA+E;QAC/E,mFAAmF;QACnF,MAAM,IAAA,wBAAY,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IAED,oEAAoE;IACpE,IAAI,gCAAc,CAAC,WAAW,EAAE,EAAE,CAAC;QACjC,GAAG,CAAC,+BAA+B,CAAC,CAAA;QACpC,MAAM,gCAAc,CAAC,SAAS,EAAE,CAAA;IAClC,CAAC;IAED,kCAAkC;IAClC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,IAAI,wBAAU,EAAE,CAAA;IAC3B,EAAE,CAAC,aAAa,EAAE,CAAA;IAClB,EAAE,CAAC,kBAAkB,EAAE,CAAA;IAEvB,yDAAyD;IACzD,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAEhC,8BAA8B;IAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,KAAK,CAAC,CAAA;QACnC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAA;IACnD,CAAC;IAED,GAAG,CAAC,EAAE,CAAC,CAAA;IACP,GAAG,CAAC,wEAAwE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAgB,EAAE,EAAc;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAM;IAC1C,IAAI,CAAC;QACH,wDAAwD;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;QAC1C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QAC3D,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CACN,0HAA0H,CAC3H;aACA,GAAG,EAAwD,CAAA;QAC9D,EAAE,CAAC,KAAK,EAAE,CAAA;QAEV,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,8BAA8B,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6DAA6D;IAC/D,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAe;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,CAAA;YACd,OAAM;QACR,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC3B,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAC1B,KAAK,CAAC,MAAM,EAAE,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YAClC,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE;YACrB,OAAO,CAAC,KAAK,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/cli/reset.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  export interface TelemetrySetupOptions {
2
2
  /**
3
- * 発行された送信専用の API キー。キーチェーンに保存する。
3
+ * 発行された送信専用の API キー。Linux は 0600 のファイル、それ以外はキーチェーンに保存する。
4
4
  *
5
- * 省略すると、環境変数 → キーチェーンの順で保存済みの鍵を探す。設定を作り直す
5
+ * 省略すると、環境変数 → 保存済みの鍵の順で探す。設定を作り直す
6
6
  * だけの再実行で、キーを発行し直させないため。**空文字を渡した場合は
7
7
  * 探しに行かない** — 打ち間違いなので、黙って別の鍵を使うと何が使われたのかが
8
8
  * 分からなくなる。
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-setup.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqDrF"}
1
+ {"version":3,"file":"telemetry-setup.d.ts","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,qBAAqB;IACpC;;;;;;;OAOG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gDAAgD;IAChD,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wBAAwB;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6DrF"}
@@ -72,10 +72,16 @@ async function runTelemetrySetup(options) {
72
72
  // 鍵の保存を先に済ませる。設定だけ書けて鍵が入らないと、送信は始まるのに
73
73
  // 401 で落ち続ける状態になり、原因が見えにくい。
74
74
  //
75
- // キーチェーンから読んだときだけ書き戻さない。**環境変数の鍵は保存する** —
76
- // あれはこの 1 回しか存在しないので、保存しないとまさに上の状態になる
77
- if (resolved.source !== 'keychain') {
78
- new key_manager_1.KeyManager().storeTelemetryApiKey(resolved.key);
75
+ // 保存済みの鍵を読んだときは書き戻さない。ただし保存形式が古い場合は保存し直す。
76
+ // 環境変数 AIDENTITY_TELEMETRY_API_KEY で渡された鍵は保存する。環境変数はこの実行の
77
+ // シェルにしか無いので、保存しないと次のセッションから送信が 401 で失敗し続ける
78
+ const keyManager = new key_manager_1.KeyManager();
79
+ if (resolved.source !== 'stored' || keyManager.telemetryApiKeyNeedsRestore()) {
80
+ keyManager.storeTelemetryApiKey(resolved.key);
81
+ // 保存し直しても古い形式のままなら、より安全な形で保存できなかったということ
82
+ if (keyManager.telemetryApiKeyNeedsRestore()) {
83
+ process.stderr.write('警告: API キーを暗号化して保存できなかったため、平文 (権限 600) で保存しました。\n');
84
+ }
79
85
  }
80
86
  if (fs.existsSync(settingsPath)) {
81
87
  backup(settingsPath);
@@ -116,9 +122,9 @@ function resolveKey(argument) {
116
122
  const fromEnv = process.env[otel_headers_1.TELEMETRY_API_KEY_ENV]?.trim();
117
123
  if (fromEnv)
118
124
  return { key: fromEnv, source: 'env' };
119
- const fromKeychain = new key_manager_1.KeyManager().getTelemetryApiKey()?.trim();
120
- if (fromKeychain)
121
- return { key: fromKeychain, source: 'keychain' };
125
+ const stored = new key_manager_1.KeyManager().getTelemetryApiKey()?.trim();
126
+ if (stored)
127
+ return { key: stored, source: 'stored' };
122
128
  throw new Error('No API key found on this machine.\n' +
123
129
  'Issue one in the aidentity console (AI 利用状況 → 端末の接続 → キーを発行),\n' +
124
130
  'then run: vess usage connect --key <key>');
@@ -199,15 +205,16 @@ function writeSettings(settingsPath, settings) {
199
205
  }
200
206
  function report(options) {
201
207
  const { settingsPath, endpoint, replaced, keySource, inheritedEndpoint } = options;
208
+ const keyLocation = new key_manager_1.KeyManager().telemetryApiKeyLocation();
202
209
  const lines = [
203
210
  'テレメトリの送信設定を書き込みました。',
204
211
  ` 設定ファイル: ${settingsPath}`,
205
212
  // 黙って送信先が変わるのが一番危ない。引き継いだのかどうかを見せる
206
213
  ` 送信先: ${endpoint}${inheritedEndpoint ? ' (いまの設定から引き継ぎ)' : ''}`,
207
214
  // 🔴 有効性は確かめていない。失効した鍵でも設定は書ける
208
- keySource === 'keychain'
209
- ? ' API キー: 保存済みのものを使いました (有効かどうかは確かめていません)'
210
- : ' API キー: OS のキーチェーンに保存しました',
215
+ keySource === 'stored'
216
+ ? ` API キー: 保存済みのものを使いました (${keyLocation}。有効かどうかは確かめていません)`
217
+ : ` API キー: ${keyLocation} に保存しました`,
211
218
  ];
212
219
  if (replaced) {
213
220
  lines.push(` 切り替え前: ${replaced} (退避ファイルに残しています)`);
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry-setup.js","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telemetry-setup.js","sourceRoot":"","sources":["../../src/cli/telemetry-setup.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare class VessPaths {
4
4
  get configFile(): string;
5
5
  get policyFile(): string;
6
6
  get walletDb(): string;
7
+ get secretsDir(): string;
7
8
  get auditLogDir(): string;
8
9
  }
9
10
  //# sourceMappingURL=paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":"AAGA,qBAAa,SAAS;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAI5B,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;CACF"}
@@ -50,6 +50,9 @@ class VessPaths {
50
50
  get walletDb() {
51
51
  return path.join(this.baseDir, 'wallet.db');
52
52
  }
53
+ get secretsDir() {
54
+ return path.join(this.baseDir, 'secrets');
55
+ }
53
56
  get auditLogDir() {
54
57
  return path.join(this.baseDir, 'logs');
55
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,uCAAwB;AAExB,MAAa,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;CACF;AAtBD,8BAsBC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/config/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4B;AAC5B,uCAAwB;AAExB,MAAa,SAAS;IACX,OAAO,CAAQ;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;IAC/C,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;CACF;AA1BD,8BA0BC"}
@@ -0,0 +1,18 @@
1
+ /** DPAPI の操作。入力も出力も base64。失敗したら null。 */
2
+ export type DpapiRunner = (operation: 'Protect' | 'Unprotect', inputBase64: string) => string | null;
3
+ /** WSL で Windows のプログラムを起動できるか。連携が無効ならこのファイルが無い。 */
4
+ export declare function isWslWithInterop(): boolean;
5
+ /** 値を Windows ユーザーに結びついた DPAPI で暗号化し、`dpapi:v1:<base64>` の形で扱う。 */
6
+ export declare class DpapiCodec {
7
+ private readonly run;
8
+ constructor(run: DpapiRunner);
9
+ isEncoded(stored: string): boolean;
10
+ encode(value: string): string | null;
11
+ decode(stored: string): string | null;
12
+ }
13
+ /**
14
+ * WSL から Windows PowerShell 5.1 で DPAPI を呼ぶ。
15
+ * 秘密は標準入力 (base64) で渡し、コマンドラインに載せない。標準入力の BOM 等は base64 以外として捨てる。
16
+ */
17
+ export declare const runPowershellDpapi: DpapiRunner;
18
+ //# sourceMappingURL=dpapi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpapi.d.ts","sourceRoot":"","sources":["../../src/identity/dpapi.ts"],"names":[],"mappings":"AAGA,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,WAAW,EAAE,WAAW,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAA;AAQpG,oDAAoD;AACpD,wBAAgB,gBAAgB,IAAI,OAAO,CAI1C;AAED,mEAAmE;AACnE,qBAAa,UAAU;IACT,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,WAAW;IAE7C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKpC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAItC;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,WA2BhC,CAAA"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.runPowershellDpapi = exports.DpapiCodec = void 0;
37
+ exports.isWslWithInterop = isWslWithInterop;
38
+ const child_process_1 = require("child_process");
39
+ const fs = __importStar(require("fs"));
40
+ const DPAPI_PREFIX = 'dpapi:v1:';
41
+ const BASE64 = /^[A-Za-z0-9+/]+=*$/;
42
+ // 他のアプリが DPAPI で暗号化した値と取り違えないための固定値
43
+ const ENTROPY = 'com.vess.telemetry-api-key';
44
+ const POWERSHELL_FALLBACK = '/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe';
45
+ /** WSL で Windows のプログラムを起動できるか。連携が無効ならこのファイルが無い。 */
46
+ function isWslWithInterop() {
47
+ return ['/proc/sys/fs/binfmt_misc/WSLInterop', '/proc/sys/fs/binfmt_misc/WSLInterop-late'].some(p => fs.existsSync(p));
48
+ }
49
+ /** 値を Windows ユーザーに結びついた DPAPI で暗号化し、`dpapi:v1:<base64>` の形で扱う。 */
50
+ class DpapiCodec {
51
+ run;
52
+ constructor(run) {
53
+ this.run = run;
54
+ }
55
+ isEncoded(stored) {
56
+ return stored.startsWith(DPAPI_PREFIX);
57
+ }
58
+ encode(value) {
59
+ const out = this.run('Protect', Buffer.from(value, 'utf-8').toString('base64'));
60
+ return out ? DPAPI_PREFIX + out : null;
61
+ }
62
+ decode(stored) {
63
+ const out = this.run('Unprotect', stored.slice(DPAPI_PREFIX.length));
64
+ return out ? Buffer.from(out, 'base64').toString('utf-8') : null;
65
+ }
66
+ }
67
+ exports.DpapiCodec = DpapiCodec;
68
+ /**
69
+ * WSL から Windows PowerShell 5.1 で DPAPI を呼ぶ。
70
+ * 秘密は標準入力 (base64) で渡し、コマンドラインに載せない。標準入力の BOM 等は base64 以外として捨てる。
71
+ */
72
+ const runPowershellDpapi = (operation, inputBase64) => {
73
+ const script = "$ErrorActionPreference='Stop';Add-Type -AssemblyName System.Security;" +
74
+ `$e=[Text.Encoding]::UTF8.GetBytes('${ENTROPY}');` +
75
+ "$i=[Convert]::FromBase64String(([Console]::In.ReadToEnd() -replace '[^A-Za-z0-9+/=]',''));" +
76
+ `$o=[Security.Cryptography.ProtectedData]::${operation}($i,$e,'CurrentUser');` +
77
+ '[Console]::Out.Write([Convert]::ToBase64String($o))';
78
+ for (const exe of ['powershell.exe', POWERSHELL_FALLBACK]) {
79
+ const result = (0, child_process_1.spawnSync)(exe, ['-NoLogo', '-NoProfile', '-NonInteractive', '-Command', script], {
80
+ input: inputBase64,
81
+ encoding: 'utf-8',
82
+ timeout: 10_000,
83
+ windowsHide: true,
84
+ // 9P 越しの作業ディレクトリは遅く、消えていると起動に失敗する
85
+ cwd: fs.existsSync('/mnt/c') ? '/mnt/c' : undefined,
86
+ });
87
+ if (result.error?.code === 'ENOENT')
88
+ continue;
89
+ if (result.error || result.status !== 0)
90
+ return null;
91
+ const out = (result.stdout ?? '').trim();
92
+ return BASE64.test(out) ? out : null;
93
+ }
94
+ return null;
95
+ };
96
+ exports.runPowershellDpapi = runPowershellDpapi;
97
+ //# sourceMappingURL=dpapi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dpapi.js","sourceRoot":"","sources":["../../src/identity/dpapi.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,4CAIC;AAjBD,iDAAyC;AACzC,uCAAwB;AAKxB,MAAM,YAAY,GAAG,WAAW,CAAA;AAChC,MAAM,MAAM,GAAG,oBAAoB,CAAA;AACnC,oCAAoC;AACpC,MAAM,OAAO,GAAG,4BAA4B,CAAA;AAC5C,MAAM,mBAAmB,GAAG,+DAA+D,CAAA;AAE3F,oDAAoD;AACpD,SAAgB,gBAAgB;IAC9B,OAAO,CAAC,qCAAqC,EAAE,0CAA0C,CAAC,CAAC,IAAI,CAC7F,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CACtB,CAAA;AACH,CAAC;AAED,mEAAmE;AACnE,MAAa,UAAU;IACQ;IAA7B,YAA6B,GAAgB;QAAhB,QAAG,GAAH,GAAG,CAAa;IAAG,CAAC;IAEjD,SAAS,CAAC,MAAc;QACtB,OAAO,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC/E,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAA;QACpE,OAAO,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAClE,CAAC;CACF;AAhBD,gCAgBC;AAED;;;GAGG;AACI,MAAM,kBAAkB,GAAgB,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE;IACxE,MAAM,MAAM,GACV,uEAAuE;QACvE,sCAAsC,OAAO,KAAK;QAClD,4FAA4F;QAC5F,6CAA6C,SAAS,wBAAwB;QAC9E,qDAAqD,CAAA;IAEvD,KAAK,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,IAAA,yBAAS,EACtB,GAAG,EACH,CAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,CAAC,EAChE;YACE,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,IAAI;YACjB,kCAAkC;YAClC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;SACpD,CACF,CAAA;QACD,IAAK,MAAM,CAAC,KAA2C,EAAE,IAAI,KAAK,QAAQ;YAAE,SAAQ;QACpF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QACpD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;QACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;IACtC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AA3BY,QAAA,kBAAkB,sBA2B9B"}
@@ -1,6 +1,22 @@
1
+ import { type DpapiRunner } from './dpapi';
2
+ export interface KeyManagerOptions {
3
+ /** 既定は process.platform。 */
4
+ platform?: NodeJS.Platform;
5
+ /** ファイルに置く秘密の値のディレクトリ。既定は ~/.vess/secrets。 */
6
+ secretsDir?: string;
7
+ /** WSL で Windows 連携が使えるか。既定は実環境から判定する。 */
8
+ wsl?: boolean;
9
+ /** DPAPI の呼び出し。既定は powershell.exe。 */
10
+ dpapi?: DpapiRunner;
11
+ }
1
12
  export declare class KeyManager {
13
+ private readonly platform;
14
+ private readonly keychain;
15
+ private readonly files;
16
+ private readonly wsl;
17
+ private readonly dpapi;
18
+ constructor(options?: KeyManagerOptions);
2
19
  static getKeychainRef(keyType: 'root' | 'agent', projectId?: string, clientName?: string): string;
3
- private createEntry;
4
20
  storeRootKey(privateKeyJwk: string): void;
5
21
  getRootKey(): string | null;
6
22
  deleteRootKey(): void;
@@ -13,6 +29,12 @@ export declare class KeyManager {
13
29
  storeTelemetryApiKey(apiKey: string): void;
14
30
  getTelemetryApiKey(): string | null;
15
31
  deleteTelemetryApiKey(): void;
32
+ /** 保存済みの鍵を storeTelemetryApiKey で保存し直すと、より安全な形になるとき true。 */
33
+ telemetryApiKeyNeedsRestore(): boolean;
34
+ /** 送信用 API キーの保存先。利用者への表示用。 */
35
+ telemetryApiKeyLocation(): string;
36
+ /** WSL で、平文のファイル、またはキーチェーンにだけ鍵があるとき true。 */
37
+ private isUnencryptedOnWsl;
16
38
  private envAccount;
17
39
  storeEnvSecret(profile: string, key: string, value: string): void;
18
40
  getEnvSecret(profile: string, key: string): string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"AAIA,qBAAa,UAAU;IACrB,MAAM,CAAC,cAAc,CACnB,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM;IAOT,OAAO,CAAC,WAAW;IAInB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,IAAI,MAAM,GAAG,IAAI;IAQ3B,aAAa,IAAI,IAAI;IAQrB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAKjF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IASjE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAS3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,eAAe,IAAI,MAAM,GAAG,IAAI;IAQhC,kBAAkB,IAAI,IAAI;IAe1B,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI1C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAQnC,qBAAqB,IAAI,IAAI;IAU7B,OAAO,CAAC,UAAU;IAIlB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQzD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAOpD"}
1
+ {"version":3,"file":"key-manager.d.ts","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAoD,KAAK,WAAW,EAAE,MAAM,SAAS,CAAA;AAM5F,MAAM,WAAW,iBAAiB;IAChC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAA;IAC1B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,sCAAsC;IACtC,KAAK,CAAC,EAAE,WAAW,CAAA;CACpB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;gBAEtB,OAAO,GAAE,iBAAsB;IAO3C,MAAM,CAAC,cAAc,CACnB,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM;IAOT,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;IAIzC,UAAU,IAAI,MAAM,GAAG,IAAI;IAI3B,aAAa,IAAI,IAAI;IAIrB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAIjF,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIjE,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAI3D,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,kBAAkB,IAAI,IAAI;IAa1B,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAY1C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IA4BnC,qBAAqB,IAAI,IAAI;IAO7B,6DAA6D;IAC7D,2BAA2B,IAAI,OAAO;IAItC,+BAA+B;IAC/B,uBAAuB,IAAI,MAAM;IASjC,6CAA6C;IAC7C,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,UAAU;IAIlB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjE,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAIzD,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;CAGpD"}
@@ -1,77 +1,55 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.KeyManager = void 0;
4
- const keyring_1 = require("@napi-rs/keyring");
4
+ const paths_1 = require("../config/paths");
5
+ const dpapi_1 = require("./dpapi");
6
+ const secret_store_1 = require("./secret-store");
5
7
  const SERVICE_NAME = 'com.vess';
8
+ const TELEMETRY_API_KEY_ACCOUNT = 'telemetry-api-key';
6
9
  class KeyManager {
10
+ platform;
11
+ keychain = new secret_store_1.KeychainStore(SERVICE_NAME);
12
+ files;
13
+ wsl;
14
+ dpapi;
15
+ constructor(options = {}) {
16
+ this.platform = options.platform ?? process.platform;
17
+ this.files = new secret_store_1.FileStore(options.secretsDir ?? new paths_1.VessPaths().secretsDir);
18
+ this.wsl = this.platform === 'linux' && (options.wsl ?? (0, dpapi_1.isWslWithInterop)());
19
+ this.dpapi = new dpapi_1.DpapiCodec(options.dpapi ?? dpapi_1.runPowershellDpapi);
20
+ }
7
21
  static getKeychainRef(keyType, projectId, clientName) {
8
22
  if (keyType === 'root') {
9
23
  return `${SERVICE_NAME}.root-key`;
10
24
  }
11
25
  return `${SERVICE_NAME}.agent.${projectId}.${clientName}`;
12
26
  }
13
- createEntry(account) {
14
- return new keyring_1.Entry(SERVICE_NAME, account);
15
- }
16
27
  storeRootKey(privateKeyJwk) {
17
- this.createEntry('root-key').setPassword(privateKeyJwk);
28
+ this.keychain.set('root-key', privateKeyJwk);
18
29
  }
19
30
  getRootKey() {
20
- try {
21
- return this.createEntry('root-key').getPassword();
22
- }
23
- catch {
24
- return null;
25
- }
31
+ return this.keychain.get('root-key');
26
32
  }
27
33
  deleteRootKey() {
28
- try {
29
- this.createEntry('root-key').deletePassword();
30
- }
31
- catch {
32
- // Key doesn't exist, ignore
33
- }
34
+ this.keychain.delete('root-key');
34
35
  }
35
36
  storeAgentKey(projectId, clientName, privateKeyJwk) {
36
- const account = `agent.${projectId}.${clientName}`;
37
- this.createEntry(account).setPassword(privateKeyJwk);
37
+ this.keychain.set(`agent.${projectId}.${clientName}`, privateKeyJwk);
38
38
  }
39
39
  getAgentKey(projectId, clientName) {
40
- try {
41
- const account = `agent.${projectId}.${clientName}`;
42
- return this.createEntry(account).getPassword();
43
- }
44
- catch {
45
- return null;
46
- }
40
+ return this.keychain.get(`agent.${projectId}.${clientName}`);
47
41
  }
48
42
  deleteAgentKey(projectId, clientName) {
49
- try {
50
- const account = `agent.${projectId}.${clientName}`;
51
- this.createEntry(account).deletePassword();
52
- }
53
- catch {
54
- // Key doesn't exist, ignore
55
- }
43
+ this.keychain.delete(`agent.${projectId}.${clientName}`);
56
44
  }
57
45
  storeSessionToken(token) {
58
- this.createEntry('session-token').setPassword(token);
46
+ this.keychain.set('session-token', token);
59
47
  }
60
48
  getSessionToken() {
61
- try {
62
- return this.createEntry('session-token').getPassword();
63
- }
64
- catch {
65
- return null;
66
- }
49
+ return this.keychain.get('session-token');
67
50
  }
68
51
  deleteSessionToken() {
69
- try {
70
- this.createEntry('session-token').deletePassword();
71
- }
72
- catch {
73
- // Token doesn't exist, ignore
74
- }
52
+ this.keychain.delete('session-token');
75
53
  }
76
54
  // ── Telemetry API key ──
77
55
  //
@@ -79,47 +57,90 @@ class KeyManager {
79
57
  // key has to be readable by `vess otel-headers` on every export. Keeping it
80
58
  // here rather than in each agent's settings file is the point: those files are
81
59
  // plaintext and show up in the agents' own config dumps.
60
+ // Linux は Secret Service が無いとキーチェーンが再起動で消えるため 0600 ファイルに置く。
61
+ // WSL では Windows の DPAPI で暗号化してから置く。暗号化は保存時だけ行い、読み出しでは復号だけする。
82
62
  storeTelemetryApiKey(apiKey) {
83
- this.createEntry('telemetry-api-key').setPassword(apiKey);
63
+ if (this.platform === 'linux') {
64
+ const encoded = this.wsl ? this.dpapi.encode(apiKey) : null;
65
+ // 暗号化できなければ平文で置く。送信を止めないことを優先する
66
+ this.files.set(TELEMETRY_API_KEY_ACCOUNT, encoded ?? apiKey);
67
+ // 古い鍵を残すと、並行する読み出しの移行処理が新しい鍵を上書きしうる
68
+ this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
69
+ }
70
+ else {
71
+ this.keychain.set(TELEMETRY_API_KEY_ACCOUNT, apiKey);
72
+ }
84
73
  }
85
74
  getTelemetryApiKey() {
75
+ if (this.platform !== 'linux') {
76
+ return this.keychain.get(TELEMETRY_API_KEY_ACCOUNT);
77
+ }
78
+ // 手で編集されたファイルの末尾改行をヘッダーに混ぜない
79
+ const fromFile = this.files.get(TELEMETRY_API_KEY_ACCOUNT)?.trim();
80
+ if (fromFile) {
81
+ if (!this.dpapi.isEncoded(fromFile))
82
+ return fromFile;
83
+ const decoded = this.dpapi.decode(fromFile);
84
+ if (decoded === null) {
85
+ process.stderr.write('警告: DPAPI での復号に失敗しました。vess usage connect を再実行してください。\n');
86
+ }
87
+ return decoded;
88
+ }
89
+ // ファイル保存より前にキーチェーンへ入れた端末。消える前にファイルへ移す
90
+ const legacy = this.keychain.get(TELEMETRY_API_KEY_ACCOUNT);
91
+ if (legacy === null)
92
+ return null;
86
93
  try {
87
- return this.createEntry('telemetry-api-key').getPassword();
94
+ this.files.set(TELEMETRY_API_KEY_ACCOUNT, legacy);
95
+ this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
88
96
  }
89
97
  catch {
90
- return null;
98
+ // 移せなくても今回の読み出しは返す。次の読み出しでまた試す
91
99
  }
100
+ return legacy;
92
101
  }
93
102
  deleteTelemetryApiKey() {
94
- try {
95
- this.createEntry('telemetry-api-key').deletePassword();
96
- }
97
- catch {
98
- // Key doesn't exist, ignore
99
- }
103
+ if (this.platform === 'linux') {
104
+ this.files.delete(TELEMETRY_API_KEY_ACCOUNT);
105
+ }
106
+ this.keychain.delete(TELEMETRY_API_KEY_ACCOUNT);
107
+ }
108
+ /** 保存済みの鍵を storeTelemetryApiKey で保存し直すと、より安全な形になるとき true。 */
109
+ telemetryApiKeyNeedsRestore() {
110
+ return this.isUnencryptedOnWsl();
111
+ }
112
+ /** 送信用 API キーの保存先。利用者への表示用。 */
113
+ telemetryApiKeyLocation() {
114
+ if (this.platform !== 'linux')
115
+ return 'OS のキーチェーン';
116
+ const location = this.files.pathOf(TELEMETRY_API_KEY_ACCOUNT);
117
+ if (!this.wsl)
118
+ return location;
119
+ return this.isUnencryptedOnWsl()
120
+ ? `${location} (暗号化なし)`
121
+ : `${location} (Windows の DPAPI で暗号化)`;
122
+ }
123
+ /** WSL で、平文のファイル、またはキーチェーンにだけ鍵があるとき true。 */
124
+ isUnencryptedOnWsl() {
125
+ if (this.platform !== 'linux' || !this.wsl)
126
+ return false;
127
+ const fromFile = this.files.get(TELEMETRY_API_KEY_ACCOUNT)?.trim();
128
+ if (fromFile)
129
+ return !this.dpapi.isEncoded(fromFile);
130
+ return this.keychain.get(TELEMETRY_API_KEY_ACCOUNT) !== null;
100
131
  }
101
132
  // ── Env secret storage (vess://env/<profile>/<key>) ──
102
133
  envAccount(profile, key) {
103
134
  return `env.${profile}.${key}`;
104
135
  }
105
136
  storeEnvSecret(profile, key, value) {
106
- this.createEntry(this.envAccount(profile, key)).setPassword(value);
137
+ this.keychain.set(this.envAccount(profile, key), value);
107
138
  }
108
139
  getEnvSecret(profile, key) {
109
- try {
110
- return this.createEntry(this.envAccount(profile, key)).getPassword();
111
- }
112
- catch {
113
- return null;
114
- }
140
+ return this.keychain.get(this.envAccount(profile, key));
115
141
  }
116
142
  deleteEnvSecret(profile, key) {
117
- try {
118
- this.createEntry(this.envAccount(profile, key)).deletePassword();
119
- }
120
- catch {
121
- // Secret doesn't exist, ignore
122
- }
143
+ this.keychain.delete(this.envAccount(profile, key));
123
144
  }
124
145
  }
125
146
  exports.KeyManager = KeyManager;
@@ -1 +1 @@
1
- {"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/identity/key-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /** 秘密の値の保存先。account は保存先の中での名前。 */
2
+ export interface SecretStore {
3
+ get(account: string): string | null;
4
+ set(account: string, value: string): void;
5
+ delete(account: string): void;
6
+ }
7
+ /**
8
+ * OS のキーチェーン (macOS Keychain / Windows 資格情報マネージャー / Linux Secret Service)。
9
+ * 🔴 Linux で Secret Service が無いとカーネルのメモリ (keyutils) に黙って切り替わり、再起動で消える。
10
+ */
11
+ export declare class KeychainStore implements SecretStore {
12
+ private readonly service;
13
+ constructor(service: string);
14
+ get(account: string): string | null;
15
+ set(account: string, value: string): void;
16
+ delete(account: string): void;
17
+ }
18
+ /** `<dir>/<account>` に平文で置く。ディレクトリは 0700、ファイルは 0600。 */
19
+ export declare class FileStore implements SecretStore {
20
+ private readonly dir;
21
+ constructor(dir: string);
22
+ pathOf(account: string): string;
23
+ get(account: string): string | null;
24
+ set(account: string, value: string): void;
25
+ delete(account: string): void;
26
+ }
27
+ //# sourceMappingURL=secret-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.d.ts","sourceRoot":"","sources":["../../src/identity/secret-store.ts"],"names":[],"mappings":"AAKA,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED;;;GAGG;AACH,qBAAa,aAAc,YAAW,WAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAO9B;AAID,wDAAwD;AACxD,qBAAa,SAAU,YAAW,WAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAExC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAO/B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQnC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBzC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAG9B"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.FileStore = exports.KeychainStore = void 0;
37
+ const crypto_1 = require("crypto");
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const keyring_1 = require("@napi-rs/keyring");
41
+ /**
42
+ * OS のキーチェーン (macOS Keychain / Windows 資格情報マネージャー / Linux Secret Service)。
43
+ * 🔴 Linux で Secret Service が無いとカーネルのメモリ (keyutils) に黙って切り替わり、再起動で消える。
44
+ */
45
+ class KeychainStore {
46
+ service;
47
+ constructor(service) {
48
+ this.service = service;
49
+ }
50
+ get(account) {
51
+ try {
52
+ return new keyring_1.Entry(this.service, account).getPassword();
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ set(account, value) {
59
+ new keyring_1.Entry(this.service, account).setPassword(value);
60
+ }
61
+ delete(account) {
62
+ try {
63
+ new keyring_1.Entry(this.service, account).deletePassword();
64
+ }
65
+ catch {
66
+ // Doesn't exist, ignore
67
+ }
68
+ }
69
+ }
70
+ exports.KeychainStore = KeychainStore;
71
+ const ACCOUNT_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
72
+ /** `<dir>/<account>` に平文で置く。ディレクトリは 0700、ファイルは 0600。 */
73
+ class FileStore {
74
+ dir;
75
+ constructor(dir) {
76
+ this.dir = dir;
77
+ }
78
+ pathOf(account) {
79
+ if (!ACCOUNT_PATTERN.test(account)) {
80
+ throw new Error(`Invalid secret name: "${account}"`);
81
+ }
82
+ return path.join(this.dir, account);
83
+ }
84
+ get(account) {
85
+ try {
86
+ return fs.readFileSync(this.pathOf(account), 'utf-8');
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ set(account, value) {
93
+ const target = this.pathOf(account);
94
+ fs.mkdirSync(this.dir, { recursive: true, mode: 0o700 });
95
+ // mkdir の mode は umask を受け、既存ディレクトリには効かない
96
+ fs.chmodSync(this.dir, 0o700);
97
+ // 一時ファイルは毎回新規に作る (wx)。既存ファイルやリンクを経由すると 0600 が効かない
98
+ const tmp = `${target}.${process.pid}.${(0, crypto_1.randomBytes)(6).toString('hex')}.tmp`;
99
+ try {
100
+ fs.writeFileSync(tmp, value, { encoding: 'utf-8', mode: 0o600, flag: 'wx' });
101
+ fs.renameSync(tmp, target);
102
+ }
103
+ catch (err) {
104
+ fs.rmSync(tmp, { force: true });
105
+ throw err;
106
+ }
107
+ }
108
+ delete(account) {
109
+ fs.rmSync(this.pathOf(account), { force: true });
110
+ }
111
+ }
112
+ exports.FileStore = FileStore;
113
+ //# sourceMappingURL=secret-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-store.js","sourceRoot":"","sources":["../../src/identity/secret-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vess-id/vess",
3
- "version": "0.0.0-dev-20260917031855",
3
+ "version": "0.0.0-dev-20261006110812",
4
4
  "description": "VESS local AI agent runtime — manages agent identity, permissions, and execution boundaries",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  "better-sqlite3": "^11.10.0",
16
16
  "commander": "^12.1.0",
17
17
  "zod": "^3.25.76",
18
- "@vess-id/ai-identity": "0.0.0-dev-20260917031855"
18
+ "@vess-id/ai-identity": "0.0.0-dev-20261006110812"
19
19
  },
20
20
  "optionalDependencies": {
21
21
  "node-mac-auth": "^1.1.0"