@ninelives/agent-governance-sdk 5.0.1

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 (126) hide show
  1. package/README.md +363 -0
  2. package/dist/audit.d.ts +26 -0
  3. package/dist/audit.d.ts.map +1 -0
  4. package/dist/audit.js +107 -0
  5. package/dist/audit.js.map +1 -0
  6. package/dist/cascade-containment.d.ts +84 -0
  7. package/dist/cascade-containment.d.ts.map +1 -0
  8. package/dist/cascade-containment.js +387 -0
  9. package/dist/cascade-containment.js.map +1 -0
  10. package/dist/client.d.ts +34 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +112 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/context-poisoning.d.ts +58 -0
  15. package/dist/context-poisoning.d.ts.map +1 -0
  16. package/dist/context-poisoning.js +410 -0
  17. package/dist/context-poisoning.js.map +1 -0
  18. package/dist/credential-vault.d.ts +213 -0
  19. package/dist/credential-vault.d.ts.map +1 -0
  20. package/dist/credential-vault.js +567 -0
  21. package/dist/credential-vault.js.map +1 -0
  22. package/dist/discovery.d.ts +80 -0
  23. package/dist/discovery.d.ts.map +1 -0
  24. package/dist/discovery.js +404 -0
  25. package/dist/discovery.js.map +1 -0
  26. package/dist/encryption/channel.d.ts +29 -0
  27. package/dist/encryption/channel.d.ts.map +1 -0
  28. package/dist/encryption/channel.js +78 -0
  29. package/dist/encryption/channel.js.map +1 -0
  30. package/dist/encryption/index.d.ts +9 -0
  31. package/dist/encryption/index.d.ts.map +1 -0
  32. package/dist/encryption/index.js +23 -0
  33. package/dist/encryption/index.js.map +1 -0
  34. package/dist/encryption/mesh-client.d.ts +281 -0
  35. package/dist/encryption/mesh-client.d.ts.map +1 -0
  36. package/dist/encryption/mesh-client.js +1110 -0
  37. package/dist/encryption/mesh-client.js.map +1 -0
  38. package/dist/encryption/ratchet.d.ts +38 -0
  39. package/dist/encryption/ratchet.d.ts.map +1 -0
  40. package/dist/encryption/ratchet.js +223 -0
  41. package/dist/encryption/ratchet.js.map +1 -0
  42. package/dist/encryption/registry-client.d.ts +136 -0
  43. package/dist/encryption/registry-client.d.ts.map +1 -0
  44. package/dist/encryption/registry-client.js +369 -0
  45. package/dist/encryption/registry-client.js.map +1 -0
  46. package/dist/encryption/x3dh.d.ts +80 -0
  47. package/dist/encryption/x3dh.d.ts.map +1 -0
  48. package/dist/encryption/x3dh.js +238 -0
  49. package/dist/encryption/x3dh.js.map +1 -0
  50. package/dist/framework-adapter.d.ts +63 -0
  51. package/dist/framework-adapter.d.ts.map +1 -0
  52. package/dist/framework-adapter.js +253 -0
  53. package/dist/framework-adapter.js.map +1 -0
  54. package/dist/identity.d.ts +124 -0
  55. package/dist/identity.d.ts.map +1 -0
  56. package/dist/identity.js +446 -0
  57. package/dist/identity.js.map +1 -0
  58. package/dist/index.d.ts +39 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +95 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/kill-switch.d.ts +22 -0
  63. package/dist/kill-switch.d.ts.map +1 -0
  64. package/dist/kill-switch.js +60 -0
  65. package/dist/kill-switch.js.map +1 -0
  66. package/dist/lifecycle.d.ts +50 -0
  67. package/dist/lifecycle.d.ts.map +1 -0
  68. package/dist/lifecycle.js +113 -0
  69. package/dist/lifecycle.js.map +1 -0
  70. package/dist/mcp.d.ts +41 -0
  71. package/dist/mcp.d.ts.map +1 -0
  72. package/dist/mcp.js +233 -0
  73. package/dist/mcp.js.map +1 -0
  74. package/dist/metrics.d.ts +123 -0
  75. package/dist/metrics.d.ts.map +1 -0
  76. package/dist/metrics.js +289 -0
  77. package/dist/metrics.js.map +1 -0
  78. package/dist/oci-manifest.d.ts +49 -0
  79. package/dist/oci-manifest.d.ts.map +1 -0
  80. package/dist/oci-manifest.js +182 -0
  81. package/dist/oci-manifest.js.map +1 -0
  82. package/dist/policy-backends/cedar.d.ts +15 -0
  83. package/dist/policy-backends/cedar.d.ts.map +1 -0
  84. package/dist/policy-backends/cedar.js +88 -0
  85. package/dist/policy-backends/cedar.js.map +1 -0
  86. package/dist/policy-backends/opa.d.ts +17 -0
  87. package/dist/policy-backends/opa.d.ts.map +1 -0
  88. package/dist/policy-backends/opa.js +74 -0
  89. package/dist/policy-backends/opa.js.map +1 -0
  90. package/dist/policy.d.ts +77 -0
  91. package/dist/policy.d.ts.map +1 -0
  92. package/dist/policy.js +760 -0
  93. package/dist/policy.js.map +1 -0
  94. package/dist/prompt-defense.d.ts +37 -0
  95. package/dist/prompt-defense.d.ts.map +1 -0
  96. package/dist/prompt-defense.js +229 -0
  97. package/dist/prompt-defense.js.map +1 -0
  98. package/dist/protocol-facets.d.ts +87 -0
  99. package/dist/protocol-facets.d.ts.map +1 -0
  100. package/dist/protocol-facets.js +728 -0
  101. package/dist/protocol-facets.js.map +1 -0
  102. package/dist/rings.d.ts +17 -0
  103. package/dist/rings.d.ts.map +1 -0
  104. package/dist/rings.js +61 -0
  105. package/dist/rings.js.map +1 -0
  106. package/dist/sandbox.d.ts +61 -0
  107. package/dist/sandbox.d.ts.map +1 -0
  108. package/dist/sandbox.js +199 -0
  109. package/dist/sandbox.js.map +1 -0
  110. package/dist/surface-parity.d.ts +45 -0
  111. package/dist/surface-parity.d.ts.map +1 -0
  112. package/dist/surface-parity.js +216 -0
  113. package/dist/surface-parity.js.map +1 -0
  114. package/dist/trust.d.ts +28 -0
  115. package/dist/trust.d.ts.map +1 -0
  116. package/dist/trust.js +209 -0
  117. package/dist/trust.js.map +1 -0
  118. package/dist/types.d.ts +422 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +29 -0
  121. package/dist/types.js.map +1 -0
  122. package/dist/verify.d.ts +135 -0
  123. package/dist/verify.d.ts.map +1 -0
  124. package/dist/verify.js +356 -0
  125. package/dist/verify.js.map +1 -0
  126. package/package.json +66 -0
@@ -0,0 +1,567 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ /**
5
+ * Credential vault, scoping, and injection for agent tool calls.
6
+ *
7
+ * TypeScript port of the Python `agent_os.credential_vault` primitive
8
+ * (issue #2481, PR #2534). Tracking issue: #2535.
9
+ *
10
+ * Design goals (identical to the Python reference):
11
+ *
12
+ * 1. **Value boundary** — agents never receive resolved secret values. They
13
+ * reference credentials by opaque handle names; only the injector ever
14
+ * holds the resolved value, and only long enough to render a payload.
15
+ * 2. **Authority boundary** — every resolution is gated by a per-agent
16
+ * {@link CredentialProfile} that binds an *action capability* (not just
17
+ * an agent identity) to a specific credential handle.
18
+ * 3. **Policy-first** — placeholder substitution happens *after* the
19
+ * workflow policy callback returns `allow=true`.
20
+ * 4. **Deterministic deny** — denied resolutions emit the same opaque
21
+ * {@link DenyReceipt} regardless of whether the handle is missing,
22
+ * bound to a different agent, or denied by policy.
23
+ * 5. **Untrusted server metadata** — only placeholders whose names appear
24
+ * in the caller-supplied `allowedHandles` set are eligible for
25
+ * substitution. Anything else is treated as injection.
26
+ * 6. **Rotation without rebinding** — credential values rotate in place;
27
+ * the handle name is stable so prompts, MCP descriptions, and saved
28
+ * plans never need to change.
29
+ *
30
+ * Encrypted-at-rest persistence uses AES-256-GCM (`@noble/ciphers`) with
31
+ * a 12-byte random nonce prefixed to the ciphertext. If no persistence
32
+ * path is configured the vault is memory-only.
33
+ *
34
+ * Wire-format note: this SDK uses AES-256-GCM; the Python SDK uses Fernet.
35
+ * A cross-language interop spec is tracked in issue #2535 and the two
36
+ * formats are not currently interchangeable.
37
+ */
38
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
39
+ if (k2 === undefined) k2 = k;
40
+ var desc = Object.getOwnPropertyDescriptor(m, k);
41
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
42
+ desc = { enumerable: true, get: function() { return m[k]; } };
43
+ }
44
+ Object.defineProperty(o, k2, desc);
45
+ }) : (function(o, m, k, k2) {
46
+ if (k2 === undefined) k2 = k;
47
+ o[k2] = m[k];
48
+ }));
49
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
50
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
51
+ }) : function(o, v) {
52
+ o["default"] = v;
53
+ });
54
+ var __importStar = (this && this.__importStar) || (function () {
55
+ var ownKeys = function(o) {
56
+ ownKeys = Object.getOwnPropertyNames || function (o) {
57
+ var ar = [];
58
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
59
+ return ar;
60
+ };
61
+ return ownKeys(o);
62
+ };
63
+ return function (mod) {
64
+ if (mod && mod.__esModule) return mod;
65
+ var result = {};
66
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
67
+ __setModuleDefault(result, mod);
68
+ return result;
69
+ };
70
+ })();
71
+ Object.defineProperty(exports, "__esModule", { value: true });
72
+ exports.CredentialInjector = exports.CredentialVault = exports.DenyReceipt = exports.CredentialProfile = exports.CredentialHandle = exports.CredentialError = exports.DENY_REASON = exports.PLACEHOLDER_RE = void 0;
73
+ exports.auditDigest = auditDigest;
74
+ const node_fs_1 = require("node:fs");
75
+ const path = __importStar(require("node:path"));
76
+ const aes_js_1 = require("@noble/ciphers/aes.js");
77
+ const hmac_js_1 = require("@noble/hashes/hmac.js");
78
+ const sha2_js_1 = require("@noble/hashes/sha2.js");
79
+ const utils_js_1 = require("@noble/hashes/utils.js");
80
+ // ---------------------------------------------------------------------------
81
+ // Public constants
82
+ // ---------------------------------------------------------------------------
83
+ /** Regex matching the credential placeholder syntax `{{cred:NAME}}`. */
84
+ exports.PLACEHOLDER_RE = /\{\{\s*cred:([A-Za-z0-9_.\-]{1,128})\s*\}\}/g;
85
+ /** Stable string returned in audit/deny records when a request is refused. */
86
+ exports.DENY_REASON = 'credential_denied';
87
+ /** AES-GCM key length (bytes). */
88
+ const KEY_LENGTH = 32;
89
+ /** AES-GCM nonce length (bytes). */
90
+ const NONCE_LENGTH = 12;
91
+ // ---------------------------------------------------------------------------
92
+ // Errors
93
+ // ---------------------------------------------------------------------------
94
+ class CredentialError extends Error {
95
+ constructor(message) {
96
+ super(message);
97
+ this.name = 'CredentialError';
98
+ }
99
+ }
100
+ exports.CredentialError = CredentialError;
101
+ /**
102
+ * Opaque handle an agent may reference. Holding a handle does **not** grant
103
+ * access to the underlying value; resolution requires the vault, the
104
+ * agent's DID, and an action capability binding.
105
+ */
106
+ class CredentialHandle {
107
+ name;
108
+ constructor(name) {
109
+ this.name = name;
110
+ }
111
+ /** Return the `{{cred:NAME}}` placeholder for this handle. */
112
+ placeholder() {
113
+ return `{{cred:${this.name}}}`;
114
+ }
115
+ toString() {
116
+ return `<CredentialHandle ${this.name}>`;
117
+ }
118
+ }
119
+ exports.CredentialHandle = CredentialHandle;
120
+ /**
121
+ * Per-agent capability binding.
122
+ *
123
+ * A profile maps action capabilities (e.g. `github:read_issues`,
124
+ * `github:push_code`) to the credential handle name that may be used to
125
+ * fulfil that capability. Two capabilities that share an underlying
126
+ * credential are still modelled as separate bindings so revoking one does
127
+ * not implicitly revoke the other.
128
+ */
129
+ class CredentialProfile {
130
+ agentDid;
131
+ _bindings;
132
+ constructor(agentDid, bindings) {
133
+ if (!agentDid) {
134
+ throw new TypeError('agentDid must be a non-empty string');
135
+ }
136
+ this.agentDid = agentDid;
137
+ const entries = bindings instanceof Map ? [...bindings.entries()] : Object.entries(bindings);
138
+ this._bindings = new Map(entries);
139
+ }
140
+ /** Return the handle name bound to `actionClass`, or undefined. */
141
+ capabilityFor(actionClass) {
142
+ return this._bindings.get(actionClass);
143
+ }
144
+ /** Snapshot of bindings (read-only). */
145
+ get bindings() {
146
+ return this._bindings;
147
+ }
148
+ }
149
+ exports.CredentialProfile = CredentialProfile;
150
+ /** Deterministic deny output returned in place of a rendered payload. */
151
+ class DenyReceipt {
152
+ reason;
153
+ actionClass;
154
+ targetService;
155
+ constructor(opts = {}) {
156
+ this.reason = opts.reason ?? exports.DENY_REASON;
157
+ this.actionClass = opts.actionClass ?? '';
158
+ this.targetService = opts.targetService ?? '';
159
+ }
160
+ toJSON() {
161
+ return {
162
+ reason: this.reason,
163
+ actionClass: this.actionClass,
164
+ targetService: this.targetService,
165
+ };
166
+ }
167
+ equals(other) {
168
+ return (this.reason === other.reason &&
169
+ this.actionClass === other.actionClass &&
170
+ this.targetService === other.targetService);
171
+ }
172
+ }
173
+ exports.DenyReceipt = DenyReceipt;
174
+ // ---------------------------------------------------------------------------
175
+ // Vault
176
+ // ---------------------------------------------------------------------------
177
+ const NAME_RE = /^[A-Za-z0-9_.\-]{1,128}$/;
178
+ /**
179
+ * Encrypted-at-rest credential store and scoped resolver.
180
+ *
181
+ * Exposes two surfaces:
182
+ *
183
+ * - **Admin** (`put`, `rotate`, `delete`, `listHandles`, `registerProfile`)
184
+ * — for operators provisioning credentials.
185
+ * - **Resolver** (`checkAccess`, `_resolveInternal`) — for the injector.
186
+ * Agents are never expected to call these directly.
187
+ */
188
+ class CredentialVault {
189
+ records = new Map();
190
+ profiles = new Map();
191
+ _audit = [];
192
+ persistPath;
193
+ key;
194
+ loaded = false;
195
+ constructor(options = {}) {
196
+ this.persistPath = options.persistPath ?? null;
197
+ this.key = options.encryptionKey ?? null;
198
+ if (this.persistPath !== null) {
199
+ if (this.key === null) {
200
+ throw new TypeError('encryptionKey is required when persistPath is set');
201
+ }
202
+ if (this.key.length !== KEY_LENGTH) {
203
+ throw new TypeError(`encryptionKey must be exactly ${KEY_LENGTH} bytes`);
204
+ }
205
+ }
206
+ }
207
+ /** Generate a fresh AES-256-GCM key (32 random bytes). */
208
+ static generateKey() {
209
+ return (0, utils_js_1.randomBytes)(KEY_LENGTH);
210
+ }
211
+ /** Load persisted records from disk. Idempotent. */
212
+ async load() {
213
+ if (this.loaded || this.persistPath === null) {
214
+ this.loaded = true;
215
+ return;
216
+ }
217
+ try {
218
+ const buf = await node_fs_1.promises.readFile(this.persistPath);
219
+ if (buf.length === 0) {
220
+ this.loaded = true;
221
+ return;
222
+ }
223
+ const decoded = this.decrypt(new Uint8Array(buf));
224
+ const payload = JSON.parse(new TextDecoder().decode(decoded));
225
+ for (const r of payload.records ?? []) {
226
+ this.records.set(r.name, r);
227
+ }
228
+ }
229
+ catch (err) {
230
+ if (err.code !== 'ENOENT') {
231
+ throw err;
232
+ }
233
+ }
234
+ this.loaded = true;
235
+ }
236
+ // -- Admin surface ------------------------------------------------------
237
+ async put(name, value, credType = 'secret') {
238
+ if (!NAME_RE.test(name)) {
239
+ throw new TypeError('Credential name must match [A-Za-z0-9_.-]{1,128}');
240
+ }
241
+ await this.load();
242
+ const existing = this.records.get(name);
243
+ const now = Date.now() / 1000;
244
+ const record = {
245
+ name,
246
+ value,
247
+ credType,
248
+ version: existing ? existing.version + 1 : 1,
249
+ createdAt: existing ? existing.createdAt : now,
250
+ rotatedAt: existing ? now : null,
251
+ };
252
+ this.records.set(name, record);
253
+ await this.flush();
254
+ return new CredentialHandle(name);
255
+ }
256
+ async rotate(name, newValue) {
257
+ await this.load();
258
+ const old = this.records.get(name);
259
+ if (!old) {
260
+ throw new CredentialError(`unknown credential: ${name}`);
261
+ }
262
+ const updated = {
263
+ ...old,
264
+ value: newValue,
265
+ version: old.version + 1,
266
+ rotatedAt: Date.now() / 1000,
267
+ };
268
+ this.records.set(name, updated);
269
+ await this.flush();
270
+ return new CredentialHandle(name);
271
+ }
272
+ async delete(name) {
273
+ await this.load();
274
+ const present = this.records.delete(name);
275
+ if (present) {
276
+ await this.flush();
277
+ }
278
+ return present;
279
+ }
280
+ async listHandles() {
281
+ await this.load();
282
+ return [...this.records.keys()].sort();
283
+ }
284
+ async getMetadata(name) {
285
+ await this.load();
286
+ const r = this.records.get(name);
287
+ if (!r)
288
+ return null;
289
+ const { value: _ignored, ...meta } = r;
290
+ return meta;
291
+ }
292
+ registerProfile(profile) {
293
+ this.profiles.set(profile.agentDid, profile);
294
+ }
295
+ revokeProfile(agentDid) {
296
+ return this.profiles.delete(agentDid);
297
+ }
298
+ // -- Resolver surface ---------------------------------------------------
299
+ /** True iff `agentDid` may use `handleName` for `actionClass`. */
300
+ checkAccess(agentDid, handleName, actionClass) {
301
+ const profile = this.profiles.get(agentDid);
302
+ if (!profile)
303
+ return false;
304
+ const bound = profile.capabilityFor(actionClass);
305
+ if (bound === undefined || bound !== handleName)
306
+ return false;
307
+ return this.records.has(handleName);
308
+ }
309
+ /**
310
+ * Internal: resolve a credential value and emit an audit event.
311
+ * Returns `[value, event]`; on deny `value` is null.
312
+ *
313
+ * Callers must ensure `value` never crosses the agent trust boundary.
314
+ * Use {@link CredentialInjector} rather than calling this directly.
315
+ */
316
+ _resolveInternal(agentDid, handleName, actionClass, targetService, policyVersion) {
317
+ const allowed = this.checkAccess(agentDid, handleName, actionClass);
318
+ if (allowed) {
319
+ const value = this.records.get(handleName).value;
320
+ const event = {
321
+ timestamp: Date.now() / 1000,
322
+ agentDid,
323
+ handleName,
324
+ targetService,
325
+ actionClass,
326
+ decision: 'allow',
327
+ policyVersion,
328
+ reason: '',
329
+ };
330
+ this._audit.push(event);
331
+ return [value, event];
332
+ }
333
+ const event = {
334
+ timestamp: Date.now() / 1000,
335
+ agentDid,
336
+ handleName,
337
+ targetService,
338
+ actionClass,
339
+ decision: 'deny',
340
+ policyVersion,
341
+ reason: exports.DENY_REASON,
342
+ };
343
+ this._audit.push(event);
344
+ return [null, event];
345
+ }
346
+ /** Immutable snapshot of audit events. */
347
+ auditLog() {
348
+ return [...this._audit];
349
+ }
350
+ clearAudit() {
351
+ this._audit.length = 0;
352
+ }
353
+ // Internal helper for the injector to append an audit event when a
354
+ // request is rejected before any vault read happens (out-of-scope
355
+ // placeholder or policy deny).
356
+ _recordReject(event) {
357
+ this._audit.push(event);
358
+ }
359
+ // -- Persistence --------------------------------------------------------
360
+ async flush() {
361
+ if (this.persistPath === null || this.key === null)
362
+ return;
363
+ const payload = JSON.stringify({ records: [...this.records.values()] });
364
+ const ciphertext = this.encrypt((0, utils_js_1.utf8ToBytes)(payload));
365
+ const tmp = `${this.persistPath}.tmp`;
366
+ await node_fs_1.promises.mkdir(path.dirname(this.persistPath) || '.', { recursive: true });
367
+ await node_fs_1.promises.writeFile(tmp, ciphertext);
368
+ await node_fs_1.promises.rename(tmp, this.persistPath);
369
+ }
370
+ encrypt(plaintext) {
371
+ if (this.key === null)
372
+ throw new CredentialError('no encryption key');
373
+ const nonce = (0, utils_js_1.randomBytes)(NONCE_LENGTH);
374
+ const ct = (0, aes_js_1.gcm)(this.key, nonce).encrypt(plaintext);
375
+ const out = new Uint8Array(NONCE_LENGTH + ct.length);
376
+ out.set(nonce, 0);
377
+ out.set(ct, NONCE_LENGTH);
378
+ return out;
379
+ }
380
+ decrypt(blob) {
381
+ if (this.key === null)
382
+ throw new CredentialError('no encryption key');
383
+ if (blob.length < NONCE_LENGTH) {
384
+ throw new CredentialError('persisted vault is corrupt (too short)');
385
+ }
386
+ const nonce = blob.slice(0, NONCE_LENGTH);
387
+ const ct = blob.slice(NONCE_LENGTH);
388
+ return (0, aes_js_1.gcm)(this.key, nonce).decrypt(ct);
389
+ }
390
+ }
391
+ exports.CredentialVault = CredentialVault;
392
+ /**
393
+ * Render `{{cred:NAME}}` placeholders into HTTP, MCP, and env payloads.
394
+ *
395
+ * The injector is the *only* component that ever holds resolved credential
396
+ * values, and only long enough to render an outbound payload.
397
+ *
398
+ * For every injection call:
399
+ *
400
+ * - `allowedHandles` is the workflow-policy allowlist of handle names
401
+ * eligible for substitution on this call. A placeholder whose name is
402
+ * not in this set causes the entire call to be denied — this is the
403
+ * "MCP server metadata is untrusted" boundary.
404
+ * - `policyCheck` is invoked *before* any value is read from the vault.
405
+ * - On any deny, `payload` is a {@link DenyReceipt} (deterministic shape).
406
+ */
407
+ class CredentialInjector {
408
+ vault;
409
+ constructor(vault) {
410
+ this.vault = vault;
411
+ }
412
+ async injectHeaders(agentDid, headers, opts) {
413
+ return this._inject(agentDid, { ...headers }, opts);
414
+ }
415
+ async injectToolArgs(agentDid, args, opts) {
416
+ return this._inject(agentDid, args, opts);
417
+ }
418
+ async injectEnv(agentDid, env, opts) {
419
+ return this._inject(agentDid, { ...env }, opts);
420
+ }
421
+ async _inject(agentDid, payload, opts) {
422
+ const allowlist = new Set(opts.allowedHandles);
423
+ const requested = collectPlaceholders(payload);
424
+ const policyVersion = opts.policyVersion ?? 'v0';
425
+ // 1. Reject anything outside the workflow-supplied allowlist.
426
+ const outside = [...requested].filter(n => !allowlist.has(n));
427
+ if (outside.length > 0) {
428
+ const event = {
429
+ timestamp: Date.now() / 1000,
430
+ agentDid,
431
+ handleName: outside[0],
432
+ targetService: opts.targetService,
433
+ actionClass: opts.actionClass,
434
+ decision: 'deny',
435
+ policyVersion,
436
+ reason: exports.DENY_REASON,
437
+ };
438
+ this.vault._recordReject(event);
439
+ const receipt = new DenyReceipt({
440
+ actionClass: opts.actionClass,
441
+ targetService: opts.targetService,
442
+ });
443
+ return { allowed: false, payload: receipt, denyReceipt: receipt, auditEvents: [event] };
444
+ }
445
+ // 2. Run policy *before* any vault read.
446
+ if (opts.policyCheck) {
447
+ const ctx = {
448
+ agentDid,
449
+ actionClass: opts.actionClass,
450
+ targetService: opts.targetService,
451
+ requestedHandles: [...requested].sort(),
452
+ policyVersion,
453
+ };
454
+ const outcome = await opts.policyCheck(ctx);
455
+ if (!outcome.allow) {
456
+ const event = {
457
+ timestamp: Date.now() / 1000,
458
+ agentDid,
459
+ handleName: [...requested][0] ?? '',
460
+ targetService: opts.targetService,
461
+ actionClass: opts.actionClass,
462
+ decision: 'deny',
463
+ policyVersion,
464
+ reason: exports.DENY_REASON,
465
+ };
466
+ this.vault._recordReject(event);
467
+ const receipt = new DenyReceipt({
468
+ actionClass: opts.actionClass,
469
+ targetService: opts.targetService,
470
+ });
471
+ return { allowed: false, payload: receipt, denyReceipt: receipt, auditEvents: [event] };
472
+ }
473
+ }
474
+ // 3. Resolve. Any single deny aborts the whole call.
475
+ const resolved = new Map();
476
+ const events = [];
477
+ for (const name of requested) {
478
+ const [value, ev] = this.vault._resolveInternal(agentDid, name, opts.actionClass, opts.targetService, policyVersion);
479
+ events.push(ev);
480
+ if (value === null) {
481
+ const receipt = new DenyReceipt({
482
+ actionClass: opts.actionClass,
483
+ targetService: opts.targetService,
484
+ });
485
+ return { allowed: false, payload: receipt, denyReceipt: receipt, auditEvents: events };
486
+ }
487
+ resolved.set(name, value);
488
+ }
489
+ const rendered = substitute(payload, resolved);
490
+ return { allowed: true, payload: rendered, denyReceipt: null, auditEvents: events };
491
+ }
492
+ }
493
+ exports.CredentialInjector = CredentialInjector;
494
+ // ---------------------------------------------------------------------------
495
+ // Placeholder helpers
496
+ // ---------------------------------------------------------------------------
497
+ function collectPlaceholders(payload) {
498
+ const out = new Set();
499
+ walk(payload, s => {
500
+ exports.PLACEHOLDER_RE.lastIndex = 0;
501
+ let m;
502
+ while ((m = exports.PLACEHOLDER_RE.exec(s)) !== null) {
503
+ out.add(m[1]);
504
+ }
505
+ });
506
+ return out;
507
+ }
508
+ function substitute(payload, resolved) {
509
+ return mapStrings(payload, s => s.replace(exports.PLACEHOLDER_RE, (match, name) => resolved.get(name) ?? match));
510
+ }
511
+ function walk(payload, visit) {
512
+ if (typeof payload === 'string') {
513
+ visit(payload);
514
+ }
515
+ else if (Array.isArray(payload)) {
516
+ for (const item of payload)
517
+ walk(item, visit);
518
+ }
519
+ else if (payload && typeof payload === 'object') {
520
+ for (const [k, v] of Object.entries(payload)) {
521
+ visit(k);
522
+ walk(v, visit);
523
+ }
524
+ }
525
+ }
526
+ function mapStrings(payload, fn) {
527
+ if (typeof payload === 'string')
528
+ return fn(payload);
529
+ if (Array.isArray(payload))
530
+ return payload.map(v => mapStrings(v, fn));
531
+ if (payload && typeof payload === 'object') {
532
+ const out = {};
533
+ for (const [k, v] of Object.entries(payload)) {
534
+ out[fn(k)] = mapStrings(v, fn);
535
+ }
536
+ return out;
537
+ }
538
+ return payload;
539
+ }
540
+ // ---------------------------------------------------------------------------
541
+ // Audit-log integrity helper
542
+ // ---------------------------------------------------------------------------
543
+ /**
544
+ * Stable HMAC-SHA256 digest of an audit-event sequence.
545
+ *
546
+ * The digest covers handle names and decisions but never resolved
547
+ * credential values (the vault never stores them in events).
548
+ */
549
+ function auditDigest(events, key) {
550
+ const h = hmac_js_1.hmac.create(sha2_js_1.sha256, key);
551
+ for (const ev of events) {
552
+ const json = JSON.stringify({
553
+ timestamp: ev.timestamp,
554
+ agentDid: ev.agentDid,
555
+ handleName: ev.handleName,
556
+ targetService: ev.targetService,
557
+ actionClass: ev.actionClass,
558
+ decision: ev.decision,
559
+ policyVersion: ev.policyVersion,
560
+ reason: ev.reason,
561
+ });
562
+ h.update((0, utils_js_1.utf8ToBytes)(json));
563
+ h.update(new Uint8Array([0x1f]));
564
+ }
565
+ return (0, utils_js_1.bytesToHex)(h.digest());
566
+ }
567
+ //# sourceMappingURL=credential-vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-vault.js","sourceRoot":"","sources":["../src/credential-vault.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ export type DetectionBasis = 'config_file' | 'container_reference' | 'source_pattern' | 'manual';
2
+ export type DiscoveryStatus = 'registered' | 'unregistered' | 'shadow' | 'unknown';
3
+ export type DiscoveryRiskLevel = 'critical' | 'high' | 'medium' | 'low' | 'info';
4
+ export interface DiscoveryEvidence {
5
+ scanner: string;
6
+ basis: DetectionBasis;
7
+ source: string;
8
+ detail: string;
9
+ rawData: Record<string, unknown>;
10
+ confidence: number;
11
+ timestamp: string;
12
+ }
13
+ export interface DiscoveredAgent {
14
+ fingerprint: string;
15
+ name: string;
16
+ agentType: string;
17
+ description: string;
18
+ did?: string;
19
+ owner?: string;
20
+ status: DiscoveryStatus;
21
+ evidence: DiscoveryEvidence[];
22
+ confidence: number;
23
+ mergeKeys: Record<string, string>;
24
+ firstSeenAt: string;
25
+ lastSeenAt: string;
26
+ tags: Record<string, string>;
27
+ }
28
+ export interface DiscoveryRiskAssessment {
29
+ level: DiscoveryRiskLevel;
30
+ score: number;
31
+ factors: string[];
32
+ assessedAt: string;
33
+ }
34
+ export interface ShadowAgentRecord {
35
+ agent: DiscoveredAgent;
36
+ risk: DiscoveryRiskAssessment;
37
+ recommendedActions: string[];
38
+ }
39
+ export interface RegisteredAgentRecord {
40
+ did?: string;
41
+ name?: string;
42
+ fingerprint?: string;
43
+ configPath?: string;
44
+ owner?: string;
45
+ }
46
+ export interface ShadowDiscoveryOptions {
47
+ paths: string[];
48
+ registry?: RegisteredAgentRecord[];
49
+ maxDepth?: number;
50
+ includeSourcePatterns?: boolean;
51
+ maxFileReadBytes?: number;
52
+ }
53
+ export interface DiscoveryScanResult {
54
+ agents: DiscoveredAgent[];
55
+ shadowAgents: ShadowAgentRecord[];
56
+ errors: string[];
57
+ startedAt: string;
58
+ completedAt: string;
59
+ scannedTargets: number;
60
+ agentCount: number;
61
+ }
62
+ export declare class ShadowDiscovery {
63
+ private readonly registeredAgents;
64
+ constructor(registeredAgents?: RegisteredAgentRecord[]);
65
+ scan(options: ShadowDiscoveryOptions): DiscoveryScanResult;
66
+ reconcile(agents: DiscoveredAgent[], registry?: RegisteredAgentRecord[]): ShadowAgentRecord[];
67
+ private walkDirectory;
68
+ private scanConfigFile;
69
+ private scanContainerFile;
70
+ private scanSourceFile;
71
+ private addObservation;
72
+ private scoreRisk;
73
+ private riskLevelForScore;
74
+ private recommendActions;
75
+ private matchRegisteredAgent;
76
+ private readTextSafely;
77
+ private computeFingerprint;
78
+ private normalizePath;
79
+ }
80
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"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"}