@embassys/ambassador 0.0.0 → 0.2.6

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 (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -2
  3. package/dist/agent-capabilities.d.ts +35 -0
  4. package/dist/agent-capabilities.js +221 -0
  5. package/dist/agent-capabilities.js.map +1 -0
  6. package/dist/ambassador-options.d.ts +9 -0
  7. package/dist/ambassador-options.js +31 -0
  8. package/dist/ambassador-options.js.map +1 -0
  9. package/dist/central-credential.d.ts +41 -0
  10. package/dist/central-credential.js +355 -0
  11. package/dist/central-credential.js.map +1 -0
  12. package/dist/central-enrollment.d.ts +31 -0
  13. package/dist/central-enrollment.js +278 -0
  14. package/dist/central-enrollment.js.map +1 -0
  15. package/dist/central-json.d.ts +8 -0
  16. package/dist/central-json.js +259 -0
  17. package/dist/central-json.js.map +1 -0
  18. package/dist/central-protected-transport.d.ts +21 -0
  19. package/dist/central-protected-transport.js +217 -0
  20. package/dist/central-protected-transport.js.map +1 -0
  21. package/dist/central-rest.d.ts +50 -0
  22. package/dist/central-rest.js +401 -0
  23. package/dist/central-rest.js.map +1 -0
  24. package/dist/cli.d.ts +26 -0
  25. package/dist/cli.js +131 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/credential-store.d.ts +18 -0
  28. package/dist/credential-store.js +517 -0
  29. package/dist/credential-store.js.map +1 -0
  30. package/dist/delivery-profile.d.ts +43 -0
  31. package/dist/delivery-profile.js +253 -0
  32. package/dist/delivery-profile.js.map +1 -0
  33. package/dist/direct-delivery.d.ts +38 -0
  34. package/dist/direct-delivery.js +315 -0
  35. package/dist/direct-delivery.js.map +1 -0
  36. package/dist/dpop.d.ts +28 -0
  37. package/dist/dpop.js +119 -0
  38. package/dist/dpop.js.map +1 -0
  39. package/dist/errors.d.ts +5 -0
  40. package/dist/errors.js +11 -0
  41. package/dist/errors.js.map +1 -0
  42. package/dist/gateway-application.d.ts +32 -0
  43. package/dist/gateway-application.js +256 -0
  44. package/dist/gateway-application.js.map +1 -0
  45. package/dist/gateway-paths.d.ts +10 -0
  46. package/dist/gateway-paths.js +28 -0
  47. package/dist/gateway-paths.js.map +1 -0
  48. package/dist/guided-registration.d.ts +23 -0
  49. package/dist/guided-registration.js +117 -0
  50. package/dist/guided-registration.js.map +1 -0
  51. package/dist/identity.d.ts +20 -0
  52. package/dist/identity.js +54 -0
  53. package/dist/identity.js.map +1 -0
  54. package/dist/local-mcp.d.ts +28 -0
  55. package/dist/local-mcp.js +420 -0
  56. package/dist/local-mcp.js.map +1 -0
  57. package/dist/local-tool-result.d.ts +4 -0
  58. package/dist/local-tool-result.js +17 -0
  59. package/dist/local-tool-result.js.map +1 -0
  60. package/dist/mcp-contract.d.ts +10 -0
  61. package/dist/mcp-contract.js +63 -0
  62. package/dist/mcp-contract.js.map +1 -0
  63. package/dist/notification-journal.d.ts +24 -0
  64. package/dist/notification-journal.js +194 -0
  65. package/dist/notification-journal.js.map +1 -0
  66. package/dist/notification-relay.d.ts +31 -0
  67. package/dist/notification-relay.js +203 -0
  68. package/dist/notification-relay.js.map +1 -0
  69. package/dist/process-lock.d.ts +8 -0
  70. package/dist/process-lock.js +122 -0
  71. package/dist/process-lock.js.map +1 -0
  72. package/dist/sqlite-artifact.d.ts +7 -0
  73. package/dist/sqlite-artifact.js +121 -0
  74. package/dist/sqlite-artifact.js.map +1 -0
  75. package/dist/webhook-delivery.d.ts +23 -0
  76. package/dist/webhook-delivery.js +122 -0
  77. package/dist/webhook-delivery.js.map +1 -0
  78. package/docs/getting-started-claude.md +94 -0
  79. package/docs/getting-started-codex.md +103 -0
  80. package/docs/getting-started-gemini.md +87 -0
  81. package/docs/getting-started-hermes.md +84 -0
  82. package/docs/getting-started-openclaw.md +83 -0
  83. package/docs/live-qualification.md +174 -0
  84. package/package.json +48 -7
  85. package/index.js +0 -1
@@ -0,0 +1,517 @@
1
+ import { execFile } from "node:child_process";
2
+ import { createCipheriv, createDecipheriv, randomBytes, scrypt } from "node:crypto";
3
+ import { constants } from "node:fs";
4
+ import { link, lstat, mkdir, open, rename, unlink } from "node:fs/promises";
5
+ import { dirname, resolve } from "node:path";
6
+ import { TextDecoder } from "node:util";
7
+ import { parseCentralCredential } from "./central-credential.js";
8
+ const FILE_FORMAT = 1;
9
+ const SCRYPT_N = 131_072;
10
+ const SCRYPT_R = 8;
11
+ const SCRYPT_P = 1;
12
+ const SCRYPT_MAXMEM = 256 * 1024 * 1024;
13
+ const KEY_BYTES = 32;
14
+ const SALT_BYTES = 16;
15
+ const IV_BYTES = 12;
16
+ const TAG_BYTES = 16;
17
+ const MAX_PLAINTEXT_BYTES = 8_192;
18
+ const MAX_FILE_BYTES = 16_384;
19
+ const SYSTEM_SID = "S-1-5-18";
20
+ const LOCAL_TOKEN = /^[0-9a-f]{48}$/u;
21
+ const BASE64 = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/u;
22
+ const ENVELOPE_KEYS = [
23
+ "cipher",
24
+ "ciphertext",
25
+ "iv",
26
+ "kdf",
27
+ "n",
28
+ "p",
29
+ "r",
30
+ "salt",
31
+ "tag",
32
+ "version",
33
+ ];
34
+ const AAD_METADATA = {
35
+ kdf: "scrypt",
36
+ n: SCRYPT_N,
37
+ r: SCRYPT_R,
38
+ p: SCRYPT_P,
39
+ cipher: "aes-256-gcm",
40
+ };
41
+ const savingPaths = new Set();
42
+ function invalidCredential() {
43
+ return new Error("The credential store is invalid or cannot be decrypted");
44
+ }
45
+ function credentialExists() {
46
+ return new Error("A central identity is already stored");
47
+ }
48
+ function errorCode(error) {
49
+ return error !== null && typeof error === "object" && "code" in error
50
+ ? String(error.code)
51
+ : undefined;
52
+ }
53
+ function sameArtifact(left, right) {
54
+ return left.dev === right.dev && left.ino === right.ino;
55
+ }
56
+ function isRecord(value) {
57
+ return value !== null && typeof value === "object" && !Array.isArray(value);
58
+ }
59
+ function decodeBase64(value, expectedBytes) {
60
+ if (typeof value !== "string" || !BASE64.test(value))
61
+ throw invalidCredential();
62
+ const decoded = Buffer.from(value, "base64");
63
+ if (decoded.toString("base64") !== value)
64
+ throw invalidCredential();
65
+ if (expectedBytes !== undefined && decoded.length !== expectedBytes)
66
+ throw invalidCredential();
67
+ return decoded;
68
+ }
69
+ function parseEnvelope(bytes) {
70
+ let value;
71
+ try {
72
+ value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
73
+ }
74
+ catch {
75
+ throw invalidCredential();
76
+ }
77
+ if (!isRecord(value))
78
+ throw invalidCredential();
79
+ const keys = Object.keys(value).sort();
80
+ if (keys.length !== ENVELOPE_KEYS.length ||
81
+ !ENVELOPE_KEYS.every((key, index) => keys[index] === key) ||
82
+ value.version !== FILE_FORMAT ||
83
+ value.kdf !== "scrypt" ||
84
+ value.n !== SCRYPT_N ||
85
+ value.r !== SCRYPT_R ||
86
+ value.p !== SCRYPT_P ||
87
+ value.cipher !== "aes-256-gcm") {
88
+ throw invalidCredential();
89
+ }
90
+ const ciphertext = decodeBase64(value.ciphertext);
91
+ if (ciphertext.length < 1 || ciphertext.length > MAX_PLAINTEXT_BYTES) {
92
+ throw invalidCredential();
93
+ }
94
+ return {
95
+ salt: decodeBase64(value.salt, SALT_BYTES),
96
+ iv: decodeBase64(value.iv, IV_BYTES),
97
+ tag: decodeBase64(value.tag, TAG_BYTES),
98
+ ciphertext,
99
+ };
100
+ }
101
+ function deriveKey(localToken, salt) {
102
+ return new Promise((resolveKey, reject) => {
103
+ scrypt(localToken, salt, KEY_BYTES, { N: SCRYPT_N, r: SCRYPT_R, p: SCRYPT_P, maxmem: SCRYPT_MAXMEM }, (error, key) => (error === null ? resolveKey(key) : reject(error)));
104
+ });
105
+ }
106
+ function assertSid(value) {
107
+ if (!/^S-1-(?:0|[1-9][0-9]*)(?:-(?:0|[1-9][0-9]*)){1,15}$/u.test(value)) {
108
+ throw new Error("Current Windows identity is unavailable");
109
+ }
110
+ const components = value.split("-").slice(2);
111
+ const authority = components.shift();
112
+ if (authority === undefined || BigInt(authority) > 281474976710655n) {
113
+ throw new Error("Current Windows identity is unavailable");
114
+ }
115
+ if (components.some((component) => BigInt(component) > 4294967295n)) {
116
+ throw new Error("Current Windows identity is unavailable");
117
+ }
118
+ return value;
119
+ }
120
+ function runExecutable(file, arguments_) {
121
+ return new Promise((resolveOutput, reject) => {
122
+ execFile(file, arguments_, { encoding: "utf8", maxBuffer: 32 * 1024, windowsHide: true }, (error, stdout, stderr) => {
123
+ if (error !== null || stderr.length !== 0) {
124
+ reject(new Error("Windows credential access control failed"));
125
+ return;
126
+ }
127
+ resolveOutput(stdout);
128
+ });
129
+ });
130
+ }
131
+ const WINDOWS_ACL_SCRIPT = `
132
+ $ErrorActionPreference = 'Stop'
133
+ if ($args.Count -ne 3) { exit 41 }
134
+ $target = $args[0]
135
+ $userSid = $args[1]
136
+ $kind = $args[2]
137
+ $item = Get-Item -LiteralPath $target -Force
138
+ if (($kind -eq 'directory') -ne $item.PSIsContainer) { exit 42 }
139
+ if ($kind -ne 'directory' -and $kind -ne 'file') { exit 43 }
140
+ $security = if ($kind -eq 'directory') {
141
+ New-Object System.Security.AccessControl.DirectorySecurity
142
+ } else {
143
+ New-Object System.Security.AccessControl.FileSecurity
144
+ }
145
+ $security.SetAccessRuleProtection($true, $false)
146
+ $inheritance = if ($kind -eq 'directory') {
147
+ [System.Security.AccessControl.InheritanceFlags]'ContainerInherit,ObjectInherit'
148
+ } else {
149
+ [System.Security.AccessControl.InheritanceFlags]::None
150
+ }
151
+ $expected = @($userSid, '${SYSTEM_SID}') | Select-Object -Unique
152
+ foreach ($sid in $expected) {
153
+ $identity = New-Object System.Security.Principal.SecurityIdentifier($sid)
154
+ $rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
155
+ $identity,
156
+ [System.Security.AccessControl.FileSystemRights]::FullControl,
157
+ $inheritance,
158
+ [System.Security.AccessControl.PropagationFlags]::None,
159
+ [System.Security.AccessControl.AccessControlType]::Allow
160
+ )
161
+ [void]$security.AddAccessRule($rule)
162
+ }
163
+ Set-Acl -LiteralPath $target -AclObject $security
164
+ $actual = Get-Acl -LiteralPath $target
165
+ if (-not $actual.AreAccessRulesProtected) { exit 44 }
166
+ $rules = @($actual.GetAccessRules($true, $true, [System.Security.Principal.SecurityIdentifier]))
167
+ if ($rules.Count -ne $expected.Count) { exit 45 }
168
+ foreach ($rule in $rules) {
169
+ if ($expected -notcontains $rule.IdentityReference.Value) { exit 46 }
170
+ if ($rule.IsInherited) { exit 47 }
171
+ if ($rule.AccessControlType -ne [System.Security.AccessControl.AccessControlType]::Allow) { exit 48 }
172
+ if ([int]$rule.FileSystemRights -ne [int][System.Security.AccessControl.FileSystemRights]::FullControl) { exit 49 }
173
+ if ($rule.InheritanceFlags -ne $inheritance) { exit 50 }
174
+ if ($rule.PropagationFlags -ne [System.Security.AccessControl.PropagationFlags]::None) { exit 51 }
175
+ }
176
+ [Console]::Out.Write('A2A_ACL_OK')
177
+ `;
178
+ class BuiltInWindowsCredentialAccessControl {
179
+ #userSid;
180
+ async secure(path, kind) {
181
+ this.#userSid ??= this.#readUserSid();
182
+ const sid = await this.#userSid;
183
+ const output = await runExecutable("powershell.exe", [
184
+ "-NoLogo",
185
+ "-NoProfile",
186
+ "-NonInteractive",
187
+ "-Command",
188
+ WINDOWS_ACL_SCRIPT,
189
+ path,
190
+ sid,
191
+ kind,
192
+ ]);
193
+ if (output !== "A2A_ACL_OK")
194
+ throw new Error("Windows credential access control failed");
195
+ }
196
+ async #readUserSid() {
197
+ const output = await runExecutable("whoami.exe", ["/user", "/fo", "csv", "/nh"]);
198
+ const match = /^(?:"(?:[^"]|"")*"),"([^"]+)"\r?\n?$/u.exec(output);
199
+ if (match?.[1] === undefined)
200
+ throw new Error("Current Windows identity is unavailable");
201
+ return assertSid(match[1]);
202
+ }
203
+ }
204
+ export class EncryptedFileCredentialStore {
205
+ #path;
206
+ #directoryPath;
207
+ #localToken;
208
+ #credentialScope;
209
+ #platform;
210
+ #windowsAccessControl;
211
+ constructor(path, localToken, credentialScope, options = {}) {
212
+ if (!LOCAL_TOKEN.test(localToken))
213
+ throw new Error("The local token format is invalid");
214
+ if (typeof credentialScope !== "string" || credentialScope.length < 1) {
215
+ throw new Error("The credential scope is invalid");
216
+ }
217
+ this.#path = resolve(path);
218
+ this.#directoryPath = dirname(this.#path);
219
+ this.#localToken = Buffer.from(localToken, "hex");
220
+ this.#credentialScope = credentialScope;
221
+ this.#platform = options.platform ?? process.platform;
222
+ if (this.#platform === "win32") {
223
+ this.#windowsAccessControl =
224
+ options.windowsAccessControl ?? new BuiltInWindowsCredentialAccessControl();
225
+ }
226
+ }
227
+ async load() {
228
+ const directory = await this.#openDirectory(false);
229
+ if (directory === undefined)
230
+ return undefined;
231
+ try {
232
+ try {
233
+ const plaintext = await this.#readCredentialPath(this.#path);
234
+ await this.#verifyDirectory(directory);
235
+ return plaintext;
236
+ }
237
+ catch (error) {
238
+ if (errorCode(error) === "ENOENT") {
239
+ await this.#verifyDirectory(directory);
240
+ return undefined;
241
+ }
242
+ throw error;
243
+ }
244
+ }
245
+ finally {
246
+ await directory.handle?.close();
247
+ }
248
+ }
249
+ async save(plaintext) {
250
+ if (typeof plaintext !== "string" ||
251
+ plaintext.length < 1 ||
252
+ Buffer.byteLength(plaintext, "utf8") > MAX_PLAINTEXT_BYTES) {
253
+ throw new Error("The central credential is invalid");
254
+ }
255
+ parseCentralCredential(plaintext);
256
+ if (savingPaths.has(this.#path))
257
+ throw credentialExists();
258
+ savingPaths.add(this.#path);
259
+ let directory;
260
+ let temporaryPath;
261
+ let temporaryFile;
262
+ let temporaryCreated = false;
263
+ let finalCreated = false;
264
+ let committed = false;
265
+ try {
266
+ directory = await this.#openDirectory(true);
267
+ if (directory === undefined)
268
+ throw invalidCredential();
269
+ await this.#assertCredentialAbsent();
270
+ const salt = randomBytes(SALT_BYTES);
271
+ const iv = randomBytes(IV_BYTES);
272
+ let key;
273
+ let ciphertext;
274
+ let tag;
275
+ try {
276
+ key = await deriveKey(this.#localToken, salt);
277
+ const cipher = createCipheriv("aes-256-gcm", key, iv, { authTagLength: TAG_BYTES });
278
+ cipher.setAAD(this.#additionalData());
279
+ ciphertext = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
280
+ tag = cipher.getAuthTag();
281
+ }
282
+ finally {
283
+ key?.fill(0);
284
+ }
285
+ const envelope = {
286
+ version: FILE_FORMAT,
287
+ kdf: "scrypt",
288
+ n: SCRYPT_N,
289
+ r: SCRYPT_R,
290
+ p: SCRYPT_P,
291
+ salt: salt.toString("base64"),
292
+ cipher: "aes-256-gcm",
293
+ iv: iv.toString("base64"),
294
+ tag: tag.toString("base64"),
295
+ ciphertext: ciphertext.toString("base64"),
296
+ };
297
+ const serialized = Buffer.from(JSON.stringify(envelope), "ascii");
298
+ await this.#verifyDirectory(directory);
299
+ temporaryPath = `${this.#path}.tmp-${process.pid}-${randomBytes(16).toString("hex")}`;
300
+ const noFollow = this.#platform === "win32" ? 0 : constants.O_NOFOLLOW;
301
+ temporaryFile = await open(temporaryPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | noFollow, 0o600);
302
+ temporaryCreated = true;
303
+ await this.#verifyOpenFile(temporaryPath, temporaryFile, undefined, false);
304
+ if (this.#platform === "win32") {
305
+ await this.#windowsAccessControl?.secure(temporaryPath, "file");
306
+ }
307
+ else {
308
+ await temporaryFile.chmod(0o600);
309
+ }
310
+ await this.#verifyOpenFile(temporaryPath, temporaryFile);
311
+ await temporaryFile.writeFile(serialized);
312
+ await temporaryFile.sync();
313
+ await temporaryFile.close();
314
+ temporaryFile = undefined;
315
+ if ((await this.#readCredentialPath(temporaryPath)) !== plaintext)
316
+ throw invalidCredential();
317
+ await this.#verifyDirectory(directory);
318
+ await this.#assertCredentialAbsent();
319
+ if (this.#platform === "win32") {
320
+ await rename(temporaryPath, this.#path);
321
+ temporaryCreated = false;
322
+ finalCreated = true;
323
+ }
324
+ else {
325
+ await link(temporaryPath, this.#path);
326
+ finalCreated = true;
327
+ await unlink(temporaryPath);
328
+ temporaryCreated = false;
329
+ }
330
+ const finalFile = await this.#openExistingFile(this.#path, true);
331
+ try {
332
+ await finalFile.sync();
333
+ }
334
+ finally {
335
+ await finalFile.close();
336
+ }
337
+ await this.#verifyDirectory(directory);
338
+ await directory.handle?.sync();
339
+ if ((await this.#readCredentialPath(this.#path)) !== plaintext)
340
+ throw invalidCredential();
341
+ committed = true;
342
+ }
343
+ finally {
344
+ savingPaths.delete(this.#path);
345
+ await temporaryFile?.close().catch(() => undefined);
346
+ if (!committed && finalCreated)
347
+ await unlink(this.#path).catch(() => undefined);
348
+ if (!committed && temporaryCreated && temporaryPath !== undefined) {
349
+ await unlink(temporaryPath).catch(() => undefined);
350
+ }
351
+ await directory?.handle?.close().catch(() => undefined);
352
+ }
353
+ }
354
+ #additionalData() {
355
+ return Buffer.from(JSON.stringify({
356
+ version: FILE_FORMAT,
357
+ ...AAD_METADATA,
358
+ credentialScope: this.#credentialScope,
359
+ }), "utf8");
360
+ }
361
+ async #readCredentialPath(path) {
362
+ const file = await this.#openExistingFile(path, false);
363
+ try {
364
+ const stats = await file.stat({ bigint: true });
365
+ if (stats.size < 1n || stats.size > BigInt(MAX_FILE_BYTES))
366
+ throw invalidCredential();
367
+ const bytes = await file.readFile();
368
+ const currentStats = await file.stat({ bigint: true });
369
+ if (bytes.length !== Number(stats.size) || !sameArtifact(stats, currentStats)) {
370
+ throw invalidCredential();
371
+ }
372
+ const envelope = parseEnvelope(bytes);
373
+ let key;
374
+ let decoded;
375
+ try {
376
+ key = await deriveKey(this.#localToken, envelope.salt);
377
+ const decipher = createDecipheriv("aes-256-gcm", key, envelope.iv, {
378
+ authTagLength: TAG_BYTES,
379
+ });
380
+ decipher.setAAD(this.#additionalData());
381
+ decipher.setAuthTag(envelope.tag);
382
+ decoded = Buffer.concat([decipher.update(envelope.ciphertext), decipher.final()]);
383
+ const plaintext = new TextDecoder("utf-8", { fatal: true }).decode(decoded);
384
+ parseCentralCredential(plaintext);
385
+ return plaintext;
386
+ }
387
+ catch {
388
+ throw invalidCredential();
389
+ }
390
+ finally {
391
+ key?.fill(0);
392
+ decoded?.fill(0);
393
+ }
394
+ }
395
+ finally {
396
+ await file.close();
397
+ }
398
+ }
399
+ async #openDirectory(create) {
400
+ if (create)
401
+ await mkdir(this.#directoryPath, { recursive: true, mode: 0o700 });
402
+ let initialStats;
403
+ try {
404
+ initialStats = await lstat(this.#directoryPath, { bigint: true });
405
+ }
406
+ catch (error) {
407
+ if (!create && errorCode(error) === "ENOENT")
408
+ return undefined;
409
+ throw error;
410
+ }
411
+ if (!initialStats.isDirectory())
412
+ throw invalidCredential();
413
+ if (this.#platform === "win32") {
414
+ await this.#windowsAccessControl?.secure(this.#directoryPath, "directory");
415
+ const currentStats = await lstat(this.#directoryPath, { bigint: true });
416
+ if (!currentStats.isDirectory() || !sameArtifact(initialStats, currentStats)) {
417
+ throw invalidCredential();
418
+ }
419
+ return { stats: currentStats };
420
+ }
421
+ const handle = await open(this.#directoryPath, constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW);
422
+ try {
423
+ const descriptorStats = await handle.stat({ bigint: true });
424
+ const pathStats = await lstat(this.#directoryPath, { bigint: true });
425
+ if (!descriptorStats.isDirectory() ||
426
+ !pathStats.isDirectory() ||
427
+ !sameArtifact(initialStats, descriptorStats) ||
428
+ !sameArtifact(descriptorStats, pathStats) ||
429
+ (typeof process.getuid === "function" && descriptorStats.uid !== BigInt(process.getuid()))) {
430
+ throw invalidCredential();
431
+ }
432
+ await handle.chmod(0o700);
433
+ const securedStats = await handle.stat({ bigint: true });
434
+ if ((securedStats.mode & 4095n) !== 448n)
435
+ throw invalidCredential();
436
+ return { stats: securedStats, handle };
437
+ }
438
+ catch (error) {
439
+ await handle.close().catch(() => undefined);
440
+ throw error;
441
+ }
442
+ }
443
+ async #verifyDirectory(directory) {
444
+ const pathStats = await lstat(this.#directoryPath, { bigint: true });
445
+ const descriptorStats = directory.handle === undefined
446
+ ? directory.stats
447
+ : await directory.handle.stat({ bigint: true });
448
+ if (!pathStats.isDirectory() ||
449
+ !descriptorStats.isDirectory() ||
450
+ !sameArtifact(directory.stats, descriptorStats) ||
451
+ !sameArtifact(descriptorStats, pathStats)) {
452
+ throw invalidCredential();
453
+ }
454
+ if (this.#platform === "win32") {
455
+ await this.#windowsAccessControl?.secure(this.#directoryPath, "directory");
456
+ }
457
+ else if ((descriptorStats.mode & 4095n) !== 448n ||
458
+ (typeof process.getuid === "function" && descriptorStats.uid !== BigInt(process.getuid()))) {
459
+ throw invalidCredential();
460
+ }
461
+ }
462
+ async #assertCredentialAbsent() {
463
+ try {
464
+ await lstat(this.#path, { bigint: true });
465
+ }
466
+ catch (error) {
467
+ if (errorCode(error) === "ENOENT")
468
+ return;
469
+ throw error;
470
+ }
471
+ throw credentialExists();
472
+ }
473
+ async #openExistingFile(path, writable) {
474
+ const initialStats = await lstat(path, { bigint: true });
475
+ if (!initialStats.isFile() || initialStats.nlink !== 1n)
476
+ throw invalidCredential();
477
+ const noFollow = this.#platform === "win32" ? 0 : constants.O_NOFOLLOW;
478
+ const file = await open(path, (writable ? constants.O_RDWR : constants.O_RDONLY) | noFollow);
479
+ try {
480
+ await this.#verifyOpenFile(path, file, initialStats, false);
481
+ if (this.#platform === "win32") {
482
+ await this.#windowsAccessControl?.secure(path, "file");
483
+ }
484
+ else {
485
+ if (typeof process.getuid === "function" && initialStats.uid !== BigInt(process.getuid())) {
486
+ throw invalidCredential();
487
+ }
488
+ await file.chmod(0o600);
489
+ }
490
+ await this.#verifyOpenFile(path, file, initialStats);
491
+ return file;
492
+ }
493
+ catch (error) {
494
+ await file.close().catch(() => undefined);
495
+ throw error;
496
+ }
497
+ }
498
+ async #verifyOpenFile(path, file, initialStats, requireMode = true) {
499
+ const descriptorStats = await file.stat({ bigint: true });
500
+ const pathStats = await lstat(path, { bigint: true });
501
+ if (!descriptorStats.isFile() ||
502
+ !pathStats.isFile() ||
503
+ descriptorStats.nlink !== 1n ||
504
+ pathStats.nlink !== 1n ||
505
+ (initialStats !== undefined && !sameArtifact(initialStats, descriptorStats)) ||
506
+ !sameArtifact(descriptorStats, pathStats)) {
507
+ throw invalidCredential();
508
+ }
509
+ if (requireMode &&
510
+ this.#platform !== "win32" &&
511
+ ((descriptorStats.mode & 4095n) !== 384n ||
512
+ (typeof process.getuid === "function" && descriptorStats.uid !== BigInt(process.getuid())))) {
513
+ throw invalidCredential();
514
+ }
515
+ }
516
+ }
517
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { type AgentCapability, type DeliveryMode } from "./agent-capabilities.js";
2
+ export type DeliveryProfileErrorCode = "incompatible_profile" | "invalid_profile" | "missing_secret" | "profile_conflict" | "profile_store_failed";
3
+ export declare class DeliveryProfileError extends Error {
4
+ readonly code: DeliveryProfileErrorCode;
5
+ constructor(code: DeliveryProfileErrorCode);
6
+ }
7
+ export interface DirectDeliveryInput {
8
+ readonly mode: "direct";
9
+ }
10
+ export interface WebhookDeliveryInput {
11
+ readonly mode: "webhook";
12
+ readonly url: string;
13
+ readonly secret_env: string;
14
+ }
15
+ export type DeliveryInput = DirectDeliveryInput | WebhookDeliveryInput;
16
+ export interface DirectDeliveryProfile {
17
+ readonly version: 1;
18
+ readonly mode: "direct";
19
+ readonly agent_kind: string;
20
+ readonly working_directory: string;
21
+ }
22
+ export interface WebhookDeliveryProfile {
23
+ readonly version: 1;
24
+ readonly mode: "webhook";
25
+ readonly agent_kind: string;
26
+ readonly url: string;
27
+ readonly secret_env: string;
28
+ }
29
+ export type DeliveryProfile = DirectDeliveryProfile | WebhookDeliveryProfile;
30
+ export declare function canonicalWebhookUrl(value: string): string;
31
+ export declare function resolveWebhookSecret(environment: NodeJS.ProcessEnv, variableName: string): string;
32
+ export declare function createDeliveryProfile(capability: AgentCapability, delivery: DeliveryInput, workingDirectory: string, environment: NodeJS.ProcessEnv): Promise<DeliveryProfile>;
33
+ export declare function validateStoredDeliveryProfile(profile: DeliveryProfile, workingDirectory: string): Promise<{
34
+ readonly profile: DeliveryProfile;
35
+ readonly capability: AgentCapability;
36
+ }>;
37
+ export declare class DeliveryProfileStore {
38
+ readonly path: string;
39
+ constructor(path: string);
40
+ load(): Promise<DeliveryProfile | undefined>;
41
+ save(profile: DeliveryProfile): Promise<void>;
42
+ }
43
+ export declare function deliveryMode(profile: DeliveryProfile): DeliveryMode;