@vectle/cli 1.0.0 → 1.1.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.
Files changed (105) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +15 -8
  3. package/dist/activity.d.ts +10 -0
  4. package/dist/activity.js +10 -0
  5. package/dist/activity.js.map +1 -0
  6. package/dist/adapters/claude.d.ts +4 -0
  7. package/dist/adapters/claude.js +279 -0
  8. package/dist/adapters/claude.js.map +1 -0
  9. package/dist/adapters/codex.d.ts +16 -0
  10. package/dist/adapters/codex.js +410 -0
  11. package/dist/adapters/codex.js.map +1 -0
  12. package/dist/adapters/common.d.ts +80 -0
  13. package/dist/adapters/common.js +249 -0
  14. package/dist/adapters/common.js.map +1 -0
  15. package/dist/adapters/cursor.d.ts +4 -0
  16. package/dist/adapters/cursor.js +240 -0
  17. package/dist/adapters/cursor.js.map +1 -0
  18. package/dist/adapters/vscode.d.ts +4 -0
  19. package/dist/adapters/vscode.js +240 -0
  20. package/dist/adapters/vscode.js.map +1 -0
  21. package/dist/agent-policy.d.ts +50 -0
  22. package/dist/agent-policy.js +83 -0
  23. package/dist/agent-policy.js.map +1 -0
  24. package/dist/client.d.ts +69 -10
  25. package/dist/client.js +247 -24
  26. package/dist/client.js.map +1 -1
  27. package/dist/constants.d.ts +12 -2
  28. package/dist/constants.js +7 -1
  29. package/dist/constants.js.map +1 -1
  30. package/dist/contracts.d.ts +53 -0
  31. package/dist/contracts.js +68 -0
  32. package/dist/contracts.js.map +1 -0
  33. package/dist/delivery.d.ts +80 -0
  34. package/dist/delivery.js +304 -0
  35. package/dist/delivery.js.map +1 -0
  36. package/dist/findings.d.ts +12 -0
  37. package/dist/findings.js +41 -0
  38. package/dist/findings.js.map +1 -0
  39. package/dist/help.d.ts +1 -0
  40. package/dist/help.js +53 -0
  41. package/dist/help.js.map +1 -0
  42. package/dist/index.js +370 -72
  43. package/dist/index.js.map +1 -1
  44. package/dist/integrations.d.ts +126 -0
  45. package/dist/integrations.js +173 -0
  46. package/dist/integrations.js.map +1 -0
  47. package/dist/legacy-compat.d.ts +45 -0
  48. package/dist/legacy-compat.js +149 -0
  49. package/dist/legacy-compat.js.map +1 -0
  50. package/dist/lifecycle.d.ts +50 -0
  51. package/dist/lifecycle.js +146 -0
  52. package/dist/lifecycle.js.map +1 -0
  53. package/dist/locator.d.ts +58 -0
  54. package/dist/locator.js +233 -0
  55. package/dist/locator.js.map +1 -0
  56. package/dist/mcp.d.ts +12 -2
  57. package/dist/mcp.js +194 -48
  58. package/dist/mcp.js.map +1 -1
  59. package/dist/modes.d.ts +37 -0
  60. package/dist/modes.js +32 -0
  61. package/dist/modes.js.map +1 -0
  62. package/dist/outbox.d.ts +9 -0
  63. package/dist/outbox.js +188 -0
  64. package/dist/outbox.js.map +1 -0
  65. package/dist/parser.d.ts +10 -0
  66. package/dist/parser.js +99 -0
  67. package/dist/parser.js.map +1 -0
  68. package/dist/pulse.d.ts +122 -0
  69. package/dist/pulse.js +412 -0
  70. package/dist/pulse.js.map +1 -0
  71. package/dist/release-manifest.d.ts +123 -0
  72. package/dist/release-manifest.js +226 -0
  73. package/dist/release-manifest.js.map +1 -0
  74. package/dist/release.d.ts +1 -1
  75. package/dist/response.d.ts +17 -0
  76. package/dist/response.js +15 -0
  77. package/dist/response.js.map +1 -1
  78. package/dist/rollout.d.ts +8 -0
  79. package/dist/rollout.js +27 -0
  80. package/dist/rollout.js.map +1 -0
  81. package/dist/runtime.d.ts +60 -0
  82. package/dist/runtime.js +276 -0
  83. package/dist/runtime.js.map +1 -0
  84. package/dist/secure-store.d.ts +36 -0
  85. package/dist/secure-store.js +282 -0
  86. package/dist/secure-store.js.map +1 -0
  87. package/dist/setup.d.ts +159 -0
  88. package/dist/setup.js +629 -0
  89. package/dist/setup.js.map +1 -0
  90. package/dist/state.d.ts +98 -0
  91. package/dist/state.js +226 -0
  92. package/dist/state.js.map +1 -0
  93. package/dist/status.d.ts +282 -0
  94. package/dist/status.js +213 -0
  95. package/dist/status.js.map +1 -0
  96. package/dist/store.d.ts +44 -2
  97. package/dist/store.js +222 -44
  98. package/dist/store.js.map +1 -1
  99. package/dist/update.d.ts +33 -1
  100. package/dist/update.js +88 -16
  101. package/dist/update.js.map +1 -1
  102. package/dist/write-journal.d.ts +71 -0
  103. package/dist/write-journal.js +175 -0
  104. package/dist/write-journal.js.map +1 -0
  105. package/package.json +7 -2
@@ -0,0 +1,276 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmodSync, cpSync, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, realpathSync, renameSync, statSync, unlinkSync } from 'node:fs';
3
+ import { dirname, isAbsolute, join, relative, sep } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { atomicWriteJson } from './state.js';
6
+ import { CLI_VERSION } from './constants.js';
7
+ const forbiddenSegments = [
8
+ '/.npm/_npx/',
9
+ '/node_modules/.cache/',
10
+ '/.cache/node/',
11
+ '/npm/_cacache/',
12
+ '/.volta/tools/image/',
13
+ '/.asdf/installs/nodejs/',
14
+ '/.nvm/versions/node/',
15
+ '/.mise/installs/node/',
16
+ '/homebrew/cellar/',
17
+ '/tmp/',
18
+ '/var/folders/',
19
+ ];
20
+ function normalizedPath(value) { return value.replaceAll('\\', '/').toLowerCase(); }
21
+ export function digestFile(path) {
22
+ const hash = createHash('sha256');
23
+ hash.update(readFileSync(path));
24
+ return `sha256:${hash.digest('hex')}`;
25
+ }
26
+ export function isEphemeralPath(path) {
27
+ const normalized = normalizedPath(path);
28
+ return forbiddenSegments.some(segment => normalized.includes(segment));
29
+ }
30
+ function nodeMajor(version) {
31
+ const match = /^v?(\d+)(?:\.|$)/u.exec(version);
32
+ return match ? Number(match[1]) : 0;
33
+ }
34
+ function safeRealpath(path) {
35
+ try {
36
+ if (!isAbsolute(path) || !existsSync(path))
37
+ return null;
38
+ const resolved = realpathSync(path);
39
+ const stats = statSync(resolved);
40
+ return stats.isFile() ? resolved : null;
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ function stableParentChain(path, boundary) {
47
+ const boundaryReal = boundary ? (() => { try {
48
+ return realpathSync(boundary);
49
+ }
50
+ catch {
51
+ return null;
52
+ } })() : null;
53
+ let current = dirname(path);
54
+ for (let index = 0; index < 32; index += 1) {
55
+ try {
56
+ const stats = statSync(current);
57
+ if (process.platform !== 'win32' && typeof process.getuid === 'function' && stats.uid !== process.getuid() && stats.uid !== 0)
58
+ return false;
59
+ if (process.platform !== 'win32' && (stats.mode & 0o022) !== 0)
60
+ return false;
61
+ if (boundaryReal && current === boundaryReal)
62
+ return true;
63
+ const parent = dirname(current);
64
+ if (parent === current)
65
+ return true;
66
+ current = parent;
67
+ }
68
+ catch {
69
+ return false;
70
+ }
71
+ }
72
+ return false;
73
+ }
74
+ function pathWithin(root, candidate) {
75
+ try {
76
+ const rootReal = realpathSync(root);
77
+ const candidateReal = realpathSync(candidate);
78
+ const remainder = relative(rootReal, candidateReal);
79
+ return remainder !== '' && remainder !== '..' && !remainder.startsWith(`..${sep}`) && !isAbsolute(remainder);
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ export function classifyPackageSource(entryPath = process.argv[1] ?? fileURLToPath(import.meta.url)) {
86
+ const real = safeRealpath(entryPath) ?? entryPath;
87
+ const normalized = normalizedPath(real);
88
+ if (normalized.includes('/.npm/_npx/') || normalized.includes('/node_modules/.cache/'))
89
+ return 'npx_cache';
90
+ if (normalized.includes('/runtime/cli/'))
91
+ return 'managed';
92
+ if (normalized.includes('/node_modules/'))
93
+ return normalized.includes('/node_modules/@vectle/cli/') ? 'stable_local' : 'unknown';
94
+ if (normalized.includes('/bin/') || normalized.includes('/lib/'))
95
+ return 'global';
96
+ return 'unknown';
97
+ }
98
+ export function inspectCurrentRuntime(options = {}) {
99
+ const nodePath = options.nodePath ?? process.execPath;
100
+ const cliEntry = options.cliEntry ?? fileURLToPath(import.meta.url);
101
+ const nodeReal = safeRealpath(nodePath);
102
+ const cliReal = safeRealpath(cliEntry);
103
+ const packageSource = classifyPackageSource(cliEntry);
104
+ const nodeVersion = process.version;
105
+ const versionOkay = nodeMajor(nodeVersion) >= 20;
106
+ const managed = Boolean(options.stateRoot && nodeReal && cliReal && pathWithin(join(options.stateRoot, 'runtime'), nodeReal) && pathWithin(join(options.stateRoot, 'runtime'), cliReal));
107
+ const nodeEphemeral = !managed && (!nodeReal || isEphemeralPath(nodeReal) || !stableParentChain(nodeReal));
108
+ const packageEphemeral = !managed && (!cliReal || isEphemeralPath(cliReal) || packageSource === 'npx_cache');
109
+ const managedBoundary = managed && options.stateRoot ? options.stateRoot : undefined;
110
+ const provider = managed ? 'vectle_managed' : nodeEphemeral || packageEphemeral ? 'ephemeral' : 'stable_external';
111
+ let reason_code = 'verified';
112
+ if (!versionOkay)
113
+ reason_code = 'node_version_unsupported';
114
+ else if (!nodeReal || !cliReal)
115
+ reason_code = 'missing_entry';
116
+ else if (nodeEphemeral)
117
+ reason_code = 'ephemeral_node';
118
+ else if (packageEphemeral)
119
+ reason_code = 'ephemeral_package';
120
+ else if (!stableParentChain(cliReal, managedBoundary))
121
+ reason_code = 'unsafe_path';
122
+ let nodeSha = null;
123
+ let cliSha = null;
124
+ try {
125
+ if (nodeReal)
126
+ nodeSha = digestFile(nodeReal);
127
+ if (cliReal)
128
+ cliSha = digestFile(cliReal);
129
+ }
130
+ catch {
131
+ reason_code = 'unreadable';
132
+ }
133
+ return {
134
+ schema_version: 'runtime-descriptor-v1',
135
+ provider,
136
+ package_source: packageSource,
137
+ node_path: nodeReal ?? nodePath,
138
+ node_version: nodeVersion,
139
+ platform: process.platform,
140
+ architecture: process.arch,
141
+ node_sha256: nodeSha,
142
+ cli_entry: cliReal ?? cliEntry,
143
+ cli_sha256: cliSha,
144
+ durable: versionOkay && reason_code === 'verified' && (provider === 'stable_external' || provider === 'vectle_managed'),
145
+ reason_code,
146
+ };
147
+ }
148
+ export function managedRuntimeRoot(stateRoot) { return join(stateRoot, 'runtime'); }
149
+ export function managedRuntimePointerPath(stateRoot) { return join(managedRuntimeRoot(stateRoot), 'current.json'); }
150
+ function validPointer(value) {
151
+ if (!value || typeof value !== 'object' || Array.isArray(value))
152
+ return false;
153
+ const item = value;
154
+ return Object.keys(item).length === 8
155
+ && item.schema_version === 'managed-runtime-v1'
156
+ && typeof item.state_root === 'string' && isAbsolute(item.state_root)
157
+ && typeof item.node_path === 'string' && isAbsolute(item.node_path)
158
+ && typeof item.cli_entry === 'string' && isAbsolute(item.cli_entry)
159
+ && /^sha256:[0-9a-f]{64}$/u.test(String(item.node_sha256))
160
+ && /^sha256:[0-9a-f]{64}$/u.test(String(item.cli_sha256))
161
+ && typeof item.cli_version === 'string' && /^\d+\.\d+\.\d+$/u.test(item.cli_version)
162
+ && typeof item.updated_at === 'string' && Number.isFinite(Date.parse(item.updated_at));
163
+ }
164
+ export function readManagedRuntime(stateRoot) {
165
+ try {
166
+ const value = JSON.parse(readFileSync(managedRuntimePointerPath(stateRoot), 'utf8'));
167
+ if (!validPointer(value) || value.state_root !== stateRoot)
168
+ return null;
169
+ const node = safeRealpath(value.node_path);
170
+ const entry = safeRealpath(value.cli_entry);
171
+ if (!node || !entry || digestFile(node) !== value.node_sha256 || digestFile(entry) !== value.cli_sha256)
172
+ return null;
173
+ return value;
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ }
179
+ export function writeManagedRuntimePointer(pointer) {
180
+ if (!validPointer(pointer))
181
+ throw new Error('invalid_managed_runtime_pointer');
182
+ if (!isAbsolute(pointer.state_root))
183
+ throw new Error('unsafe_managed_runtime_root');
184
+ if (!safeRealpath(pointer.node_path) || !safeRealpath(pointer.cli_entry))
185
+ throw new Error('managed_runtime_missing');
186
+ if (digestFile(pointer.node_path) !== pointer.node_sha256 || digestFile(pointer.cli_entry) !== pointer.cli_sha256)
187
+ throw new Error('managed_runtime_digest_mismatch');
188
+ mkdirSync(managedRuntimeRoot(pointer.state_root), { recursive: true, mode: 0o700 });
189
+ atomicWriteJson(managedRuntimePointerPath(pointer.state_root), pointer);
190
+ }
191
+ export function durableRuntimeForSetup(stateRoot) {
192
+ const managed = readManagedRuntime(stateRoot);
193
+ if (managed)
194
+ return { descriptor: { ...inspectCurrentRuntime({ nodePath: managed.node_path, cliEntry: managed.cli_entry, stateRoot }), provider: 'vectle_managed', durable: true, reason_code: 'verified' }, action: null };
195
+ const current = inspectCurrentRuntime({ stateRoot });
196
+ if (current.durable)
197
+ return { descriptor: current, action: null };
198
+ try {
199
+ const provisioned = provisionManagedRuntime(stateRoot, { nodePath: current.node_path, cliEntry: current.cli_entry });
200
+ const descriptor = inspectCurrentRuntime({ nodePath: provisioned.node_path, cliEntry: provisioned.cli_entry, stateRoot });
201
+ return { descriptor: { ...descriptor, provider: 'vectle_managed', durable: true, reason_code: 'verified' }, action: null };
202
+ }
203
+ catch {
204
+ return { descriptor: current, action: 'Install a stable Node.js runtime or rerun `vectle setup --repair` after one is available.' };
205
+ }
206
+ }
207
+ /**
208
+ * Copy the currently resolved runtime into a Vectle-owned, digest-addressed
209
+ * directory. This is deliberately local-only: setup never downloads code or
210
+ * changes a user's package manager. A valid pointer makes later setup/status
211
+ * runs independent of npx caches, Homebrew upgrades, or version-manager GC.
212
+ */
213
+ export function provisionManagedRuntime(stateRoot, source) {
214
+ if (!isAbsolute(stateRoot) || !isAbsolute(source.nodePath) || !isAbsolute(source.cliEntry))
215
+ throw new Error('runtime_not_durable');
216
+ const nodeSource = safeRealpath(source.nodePath);
217
+ const cliSource = safeRealpath(source.cliEntry);
218
+ if (!nodeSource || !cliSource)
219
+ throw new Error('runtime_not_durable');
220
+ const nodeDigest = digestFile(nodeSource);
221
+ const cliDigest = digestFile(cliSource);
222
+ const versionRoot = join(managedRuntimeRoot(stateRoot), 'versions', `${nodeDigest.slice(7, 23)}-${cliDigest.slice(7, 23)}`);
223
+ const nodePrefix = join(versionRoot, 'node');
224
+ const nodeTarget = join(nodePrefix, 'bin', process.platform === 'win32' ? 'node.exe' : 'node');
225
+ const cliTargetDir = join(versionRoot, 'cli');
226
+ const cliTarget = join(cliTargetDir, 'index.js');
227
+ const pointer = { schema_version: 'managed-runtime-v1', state_root: stateRoot, node_path: nodeTarget, cli_entry: cliTarget, node_sha256: nodeDigest, cli_sha256: cliDigest, cli_version: CLI_VERSION, updated_at: new Date().toISOString() };
228
+ const existing = readManagedRuntime(stateRoot);
229
+ if (existing && existing.node_sha256 === nodeDigest && existing.cli_sha256 === cliDigest)
230
+ return existing;
231
+ const temporary = `${versionRoot}.tmp-${Date.now().toString(36)}`;
232
+ mkdirSync(temporary, { recursive: true, mode: 0o700 });
233
+ try {
234
+ const sourcePrefix = dirname(dirname(nodeSource));
235
+ const temporaryNodePrefix = nodePrefix.replace(versionRoot, temporary);
236
+ if (existsSync(join(sourcePrefix, 'lib')) && sourcePrefix !== dirname(sourcePrefix) && sourcePrefix !== '/usr' && sourcePrefix !== '/opt' && sourcePrefix !== '/System') {
237
+ cpSync(sourcePrefix, temporaryNodePrefix, { recursive: true, dereference: true });
238
+ }
239
+ else {
240
+ mkdirSync(join(temporaryNodePrefix, 'bin'), { recursive: true, mode: 0o700 });
241
+ cpSync(nodeSource, nodeTarget.replace(versionRoot, temporary), { dereference: true });
242
+ }
243
+ const copiedNode = nodeTarget.replace(versionRoot, temporary);
244
+ try {
245
+ const copiedStats = lstatSync(copiedNode);
246
+ if (copiedStats.isSymbolicLink() || !copiedStats.isFile())
247
+ unlinkSync(copiedNode);
248
+ }
249
+ catch { /* copyFileSync below reports the missing target */ }
250
+ if (!existsSync(copiedNode) || digestFile(copiedNode) !== nodeDigest)
251
+ copyFileSync(nodeSource, copiedNode);
252
+ chmodSync(copiedNode, 0o700);
253
+ if (!pathWithin(temporary, copiedNode))
254
+ throw new Error('runtime_copy_failed');
255
+ cpSync(dirname(cliSource), cliTargetDir.replace(versionRoot, temporary), { recursive: true, dereference: true });
256
+ const copiedCli = join(cliTargetDir.replace(versionRoot, temporary), 'index.js');
257
+ if (!existsSync(copiedCli) || digestFile(copiedCli) !== cliDigest)
258
+ throw new Error('runtime_copy_failed');
259
+ renameSync(temporary, versionRoot);
260
+ }
261
+ catch (error) {
262
+ try {
263
+ renameSync(temporary, `${temporary}.failed`);
264
+ }
265
+ catch { /* best effort; the temp name is unique */ }
266
+ throw error;
267
+ }
268
+ writeManagedRuntimePointer(pointer);
269
+ return pointer;
270
+ }
271
+ export function runtimeTestPaths(stateRoot, version, platform = process.platform, architecture = process.arch) {
272
+ if (!isAbsolute(stateRoot) || !/^\d+\.\d+\.\d+$/u.test(version))
273
+ throw new Error('invalid_runtime_path');
274
+ return { node: join(stateRoot, 'runtime', 'node', `${version}-${platform}-${architecture}`), cli: join(stateRoot, 'runtime', 'cli', version), launcher: join(stateRoot, 'runtime', 'bin', 'vectle') };
275
+ }
276
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export type SecureBackend = 'keychain' | 'secret_service' | 'credential_manager' | 'file' | 'environment';
2
+ export type InstallationCredentialBackend = 'macos_keychain' | 'linux_secret_service' | 'windows_credential_manager' | 'file';
3
+ export type SecurePurpose = 'refresh' | 'access' | 'device_code' | 'setup_report' | 'rotation_candidate';
4
+ export type SecureStoreHandle = {
5
+ schema_version: 'secure-store-handle-v1';
6
+ backend: SecureBackend;
7
+ account: string;
8
+ purpose: SecurePurpose;
9
+ expires_at: string | null;
10
+ };
11
+ export declare function credentialAccountHandle(origin: string, supportCode: string): string;
12
+ export declare function legacyCredentialHandle(source: SecureBackend, token: string, selectedRoot: string): string;
13
+ export declare function windowsCredentialTarget(account: string): string;
14
+ export declare function installationBackendName(backend: SecureBackend): InstallationCredentialBackend;
15
+ export declare function secureBackendForInstallationName(name: InstallationCredentialBackend): SecureBackend;
16
+ export declare function availableSecureBackend(options?: {
17
+ allowFileFallback?: boolean;
18
+ preferEnvironment?: boolean;
19
+ }): SecureBackend | null;
20
+ export declare function writeLegacyNativeSecret(secret: string, backend: SecureBackend, purpose: SecurePurpose): void;
21
+ export declare function readLegacyNativeSecret(backend: SecureBackend, purpose: SecurePurpose): string | null;
22
+ export declare function deleteLegacyNativeSecret(backend: SecureBackend): void;
23
+ export type SecureStoreOptions = {
24
+ baseDirectory: string;
25
+ account: string;
26
+ purpose: SecurePurpose;
27
+ operationId?: string;
28
+ expiresAt?: string | null;
29
+ backend?: SecureBackend;
30
+ allowFileFallback?: boolean;
31
+ };
32
+ export declare function writeSecureSecret(secret: string, options: SecureStoreOptions): SecureStoreHandle;
33
+ export declare function readSecureSecret(options: SecureStoreOptions): string | null;
34
+ export declare function deleteSecureSecret(options: SecureStoreOptions): void;
35
+ export declare function secureStoreFilePath(options: SecureStoreOptions): string;
36
+ export declare function removeCredentialTree(baseDirectory: string, account: string): void;
@@ -0,0 +1,282 @@
1
+ import { createHash, randomBytes } from 'node:crypto';
2
+ import { execFileSync, spawnSync } from 'node:child_process';
3
+ import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
4
+ import { dirname, isAbsolute, join } from 'node:path';
5
+ const INSTALLATION_SERVICE = 'com.vectle.cli.installation';
6
+ const LEGACY_SERVICE = 'com.vectle.cli';
7
+ const FILE_SCHEMA = 'secure-store-entry-v1';
8
+ const tokenPattern = /^(?:(?:vctd|vctk|vctir|vctia|vctis)_[A-Za-z0-9_-]{43}|vro_[A-Za-z0-9_-]{22})$/u;
9
+ const accountPattern = /^vci-[0-9a-f]{32}$/u;
10
+ const purposePrefixes = {
11
+ refresh: /^vctir_[A-Za-z0-9_-]{43}$/u,
12
+ access: /^vctia_[A-Za-z0-9_-]{43}$/u,
13
+ device_code: /^vctd_[A-Za-z0-9_-]{43}$/u,
14
+ setup_report: /^vctis_[A-Za-z0-9_-]{43}$/u,
15
+ rotation_candidate: /^vctir_[A-Za-z0-9_-]{43}$/u,
16
+ };
17
+ export function credentialAccountHandle(origin, supportCode) {
18
+ const normalizedOrigin = new URL(origin).origin;
19
+ if (!/^vci_[A-Za-z0-9_-]{22}$/u.test(supportCode))
20
+ throw new Error('invalid_installation_support_code');
21
+ const preimage = `secure-credential-binding-v1\0${normalizedOrigin}\0${supportCode}`;
22
+ return `vci-${createHash('sha256').update(preimage, 'utf8').digest('hex').slice(0, 32)}`;
23
+ }
24
+ export function legacyCredentialHandle(source, token, selectedRoot) {
25
+ return `sha256:${createHash('sha256').update(`${source}\0${token}\0${selectedRoot}`, 'utf8').digest('hex')}`;
26
+ }
27
+ export function windowsCredentialTarget(account) {
28
+ if (!accountPattern.test(account))
29
+ throw new Error('invalid_secure_store_account');
30
+ return `Vectle/CLI/${account}`;
31
+ }
32
+ export function installationBackendName(backend) {
33
+ if (backend === 'keychain')
34
+ return 'macos_keychain';
35
+ if (backend === 'secret_service')
36
+ return 'linux_secret_service';
37
+ if (backend === 'credential_manager')
38
+ return 'windows_credential_manager';
39
+ if (backend === 'file')
40
+ return 'file';
41
+ throw new Error('unsupported_secure_backend');
42
+ }
43
+ export function secureBackendForInstallationName(name) {
44
+ if (name === 'macos_keychain')
45
+ return 'keychain';
46
+ if (name === 'linux_secret_service')
47
+ return 'secret_service';
48
+ if (name === 'windows_credential_manager')
49
+ return 'credential_manager';
50
+ return 'file';
51
+ }
52
+ const operationPattern = /^[A-Za-z][A-Za-z0-9-]{1,95}$/u;
53
+ function fileBase(baseDirectory) {
54
+ if (!isAbsolute(baseDirectory))
55
+ throw new Error('unsafe_secure_store_root');
56
+ return join(baseDirectory, 'credentials');
57
+ }
58
+ function currentFile(baseDirectory, account) { return join(fileBase(baseDirectory), 'current', `${account}.json`); }
59
+ function pendingFile(baseDirectory, purpose, operationId) {
60
+ if (!operationPattern.test(operationId))
61
+ throw new Error('invalid_secure_store_operation');
62
+ return join(fileBase(baseDirectory), 'pending', purpose, `${operationId}.json`);
63
+ }
64
+ function privateMkdir(path) { mkdirSync(path, { recursive: true, mode: 0o700 }); try {
65
+ chmodSync(path, 0o700);
66
+ }
67
+ catch { /* Windows ACLs are inherited. */ } }
68
+ function atomicSecretFile(path, value, expiresAt, purpose, account) {
69
+ privateMkdir(dirname(path));
70
+ const temporary = `${path}.tmp-${randomBytes(8).toString('hex')}`;
71
+ const fd = openSync(temporary, 'wx', 0o600);
72
+ try {
73
+ writeFileSync(fd, `${JSON.stringify({ schema_version: FILE_SCHEMA, purpose, account, secret: value, expires_at: expiresAt })}\n`, { encoding: 'utf8' });
74
+ fsyncSync(fd);
75
+ }
76
+ finally {
77
+ closeSync(fd);
78
+ }
79
+ const parent = dirname(path);
80
+ // Rename is intentionally same-directory: a crash leaves either the old
81
+ // slot or the new slot, never a partially written credential.
82
+ renameSync(temporary, path);
83
+ chmodSync(path, 0o600);
84
+ try {
85
+ const directoryFd = openSync(parent, 'r');
86
+ fsyncSync(directoryFd);
87
+ closeSync(directoryFd);
88
+ }
89
+ catch { /* Windows. */ }
90
+ }
91
+ function fileSecret(path, purpose, account) {
92
+ try {
93
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
94
+ if (Object.keys(raw).length !== 5 || raw.schema_version !== FILE_SCHEMA || raw.purpose !== purpose || raw.account !== account || typeof raw.secret !== 'string' || !purposePrefixes[purpose].test(raw.secret) || (raw.expires_at !== null && typeof raw.expires_at !== 'string'))
95
+ return null;
96
+ if (typeof raw.expires_at === 'string' && Date.parse(raw.expires_at) <= Date.now())
97
+ return null;
98
+ const mode = statSync(path).mode & 0o777;
99
+ if (process.platform !== 'win32' && mode !== 0o600)
100
+ return null;
101
+ return raw.secret;
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ function backendFromEnvironment() {
108
+ if (process.env.VECTLE_TEST_CREDENTIAL_BACKEND === 'file')
109
+ return 'file';
110
+ if (process.platform === 'darwin')
111
+ return existsSync('/usr/bin/security') ? 'keychain' : null;
112
+ if (process.platform === 'linux') {
113
+ const result = spawnSync('secret-tool', ['--help'], { stdio: 'ignore' });
114
+ return result.status === 0 ? 'secret_service' : null;
115
+ }
116
+ if (process.platform === 'win32')
117
+ return 'credential_manager';
118
+ return null;
119
+ }
120
+ export function availableSecureBackend(options = {}) {
121
+ if (options.preferEnvironment && typeof process.env.VECTLE_TOKEN === 'string' && process.env.VECTLE_TOKEN.trim())
122
+ return 'environment';
123
+ return backendFromEnvironment() ?? (options.allowFileFallback ? 'file' : null);
124
+ }
125
+ function keychainWrite(backend, account, secret, service = INSTALLATION_SERVICE) {
126
+ if (backend === 'keychain') {
127
+ execFileSync('/usr/bin/security', ['add-generic-password', '-a', account, '-s', service, '-w', secret, '-U'], { stdio: 'ignore' });
128
+ return;
129
+ }
130
+ if (backend === 'secret_service') {
131
+ const result = spawnSync('secret-tool', ['store', '--label=Vectle CLI installation', 'service', service, 'account', account], { input: secret, encoding: 'utf8', stdio: ['pipe', 'ignore', 'ignore'] });
132
+ if (result.status !== 0)
133
+ throw new Error('secure_store_write_failed');
134
+ return;
135
+ }
136
+ if (backend === 'credential_manager') {
137
+ const target = service === INSTALLATION_SERVICE ? windowsCredentialTarget(account) : `${service}/${account}`;
138
+ const result = spawnSync('cmdkey.exe', [`/generic:${target}`, '/user:', `/pass:${secret}`], { stdio: 'ignore' });
139
+ if (result.status !== 0)
140
+ throw new Error('secure_store_write_failed');
141
+ return;
142
+ }
143
+ throw new Error('unsupported_secure_backend');
144
+ }
145
+ function keychainRead(backend, account, service = INSTALLATION_SERVICE) {
146
+ if (backend === 'keychain') {
147
+ try {
148
+ return execFileSync('/usr/bin/security', ['find-generic-password', '-a', account, '-s', service, '-w'], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).trim() || null;
149
+ }
150
+ catch {
151
+ return null;
152
+ }
153
+ }
154
+ if (backend === 'secret_service') {
155
+ const result = spawnSync('secret-tool', ['lookup', 'service', service, 'account', account], { encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
156
+ return result.status === 0 ? result.stdout.trim() || null : null;
157
+ }
158
+ // Windows Credential Manager deliberately has no portable command-line
159
+ // read API. The native adapter is represented by the target contract; a
160
+ // host implementation can replace this function without changing callers.
161
+ return null;
162
+ }
163
+ function keychainDelete(backend, account, service = INSTALLATION_SERVICE) {
164
+ if (backend === 'keychain') {
165
+ try {
166
+ execFileSync('/usr/bin/security', ['delete-generic-password', '-a', account, '-s', service], { stdio: 'ignore' });
167
+ }
168
+ catch { /* already absent */ }
169
+ return;
170
+ }
171
+ if (backend === 'secret_service') {
172
+ spawnSync('secret-tool', ['clear', 'service', service, 'account', account], { stdio: 'ignore' });
173
+ return;
174
+ }
175
+ if (backend === 'credential_manager') {
176
+ const target = service === INSTALLATION_SERVICE ? windowsCredentialTarget(account) : `${service}/${account}`;
177
+ spawnSync('cmdkey.exe', [`/delete:${target}`], { stdio: 'ignore' });
178
+ }
179
+ }
180
+ function validateNativeSecret(secret, purpose) {
181
+ if (!purposePrefixes[purpose].test(secret))
182
+ throw new Error('invalid_secure_secret');
183
+ }
184
+ export function writeLegacyNativeSecret(secret, backend, purpose) {
185
+ validateNativeSecret(secret, purpose);
186
+ if (!['keychain', 'secret_service', 'credential_manager'].includes(backend))
187
+ throw new Error('unsupported_secure_backend');
188
+ keychainWrite(backend, 'default', secret, LEGACY_SERVICE);
189
+ }
190
+ export function readLegacyNativeSecret(backend, purpose) {
191
+ if (!['keychain', 'secret_service', 'credential_manager'].includes(backend))
192
+ return null;
193
+ const value = keychainRead(backend, 'default', LEGACY_SERVICE);
194
+ return value && purposePrefixes[purpose].test(value) ? value : null;
195
+ }
196
+ export function deleteLegacyNativeSecret(backend) {
197
+ if (['keychain', 'secret_service', 'credential_manager'].includes(backend))
198
+ keychainDelete(backend, 'default', LEGACY_SERVICE);
199
+ }
200
+ function chooseBackend(options) {
201
+ if (options.backend)
202
+ return options.backend;
203
+ const selected = availableSecureBackend({ allowFileFallback: options.allowFileFallback });
204
+ if (!selected || selected === 'environment')
205
+ throw new Error('secure_store_unavailable');
206
+ return selected;
207
+ }
208
+ export function writeSecureSecret(secret, options) {
209
+ if (!purposePrefixes[options.purpose].test(secret))
210
+ throw new Error('invalid_secure_secret');
211
+ if (!accountPattern.test(options.account))
212
+ throw new Error('invalid_secure_store_account');
213
+ const backend = chooseBackend(options);
214
+ const expiresAt = options.expiresAt ?? null;
215
+ if (backend === 'file') {
216
+ const path = options.operationId ? pendingFile(options.baseDirectory, options.purpose, options.operationId) : currentFile(options.baseDirectory, options.account);
217
+ atomicSecretFile(path, secret, expiresAt, options.purpose, options.account);
218
+ }
219
+ else
220
+ keychainWrite(backend, options.operationId ? `${options.account}:${options.purpose}:${options.operationId}` : options.account, secret);
221
+ return { schema_version: 'secure-store-handle-v1', backend, account: options.account, purpose: options.purpose, expires_at: expiresAt };
222
+ }
223
+ export function readSecureSecret(options) {
224
+ if (!accountPattern.test(options.account))
225
+ return null;
226
+ const backend = options.backend ?? availableSecureBackend({ allowFileFallback: true });
227
+ if (!backend || backend === 'environment')
228
+ return null;
229
+ if (backend === 'file')
230
+ return fileSecret(options.operationId ? pendingFile(options.baseDirectory, options.purpose, options.operationId) : currentFile(options.baseDirectory, options.account), options.purpose, options.account);
231
+ const value = keychainRead(backend, options.operationId ? `${options.account}:${options.purpose}:${options.operationId}` : options.account);
232
+ return value && tokenPattern.test(value) ? value : null;
233
+ }
234
+ export function deleteSecureSecret(options) {
235
+ if (!accountPattern.test(options.account))
236
+ return;
237
+ const backend = options.backend ?? availableSecureBackend({ allowFileFallback: true });
238
+ if (!backend || backend === 'environment')
239
+ return;
240
+ if (backend === 'file') {
241
+ const path = options.operationId ? pendingFile(options.baseDirectory, options.purpose, options.operationId) : currentFile(options.baseDirectory, options.account);
242
+ try {
243
+ unlinkSync(path);
244
+ }
245
+ catch { /* idempotent removal */ }
246
+ return;
247
+ }
248
+ keychainDelete(backend, options.operationId ? `${options.account}:${options.purpose}:${options.operationId}` : options.account);
249
+ }
250
+ export function secureStoreFilePath(options) {
251
+ if (!accountPattern.test(options.account))
252
+ throw new Error('invalid_secure_store_account');
253
+ return options.operationId ? pendingFile(options.baseDirectory, options.purpose, options.operationId) : currentFile(options.baseDirectory, options.account);
254
+ }
255
+ export function removeCredentialTree(baseDirectory, account) {
256
+ if (!accountPattern.test(account))
257
+ throw new Error('invalid_secure_store_account');
258
+ const root = fileBase(baseDirectory);
259
+ const current = currentFile(baseDirectory, account);
260
+ try {
261
+ rmSync(current, { force: true });
262
+ }
263
+ catch { /* idempotent */ }
264
+ // Only the selected account's pending children are removed. No recursive
265
+ // delete is performed over the credentials root.
266
+ for (const purpose of ['refresh', 'access', 'device_code', 'setup_report', 'rotation_candidate']) {
267
+ const directory = join(root, 'pending', purpose);
268
+ try {
269
+ for (const entry of readdirSync(directory)) {
270
+ const path = join(directory, entry);
271
+ try {
272
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
273
+ if (raw.account === account)
274
+ rmSync(path, { force: true });
275
+ }
276
+ catch { /* ignore malformed/unrelated transient entries */ }
277
+ }
278
+ }
279
+ catch { /* absent */ }
280
+ }
281
+ }
282
+ //# sourceMappingURL=secure-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-store.js","sourceRoot":"","sources":["../src/secure-store.ts"],"names":[],"mappings":"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"}