@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,410 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ContextPoisoningDetector = void 0;
6
+ const crypto_1 = require("crypto");
7
+ const DEFAULT_PATTERNS = [
8
+ {
9
+ id: 'prompt-injection-ignore',
10
+ name: 'Prompt injection: ignore previous instructions',
11
+ description: 'Detects attempts to override system instructions via "ignore" directives',
12
+ detector: 'regex',
13
+ pattern: '(?:ignore|disregard|forget|override)\\s+(?:all\\s+)?(?:previous|prior|above|earlier|system)\\s+(?:instructions|rules|prompts|context)',
14
+ severity: 'critical',
15
+ },
16
+ {
17
+ id: 'prompt-injection-roleplay',
18
+ name: 'Prompt injection: role assumption',
19
+ description: 'Detects attempts to make the agent assume a different role or persona',
20
+ detector: 'regex',
21
+ pattern: '(?:you\\s+are\\s+now|act\\s+as|pretend\\s+(?:to\\s+be|you\\s+are)|from\\s+now\\s+on\\s+you\\s+are|new\\s+instructions?:)',
22
+ severity: 'high',
23
+ },
24
+ {
25
+ id: 'prompt-injection-system-override',
26
+ name: 'Prompt injection: system prompt extraction',
27
+ description: 'Detects attempts to extract or modify system prompts',
28
+ detector: 'regex',
29
+ pattern: '(?:show|reveal|display|output|print|repeat)\\s+(?:your|the)?\\s*(?:system\\s+(?:prompt|message|instructions)|initial\\s+(?:prompt|instructions))',
30
+ severity: 'high',
31
+ },
32
+ {
33
+ id: 'context-stuffing',
34
+ name: 'Context window stuffing',
35
+ description: 'Detects abnormally large entries that may attempt to push important context out of the window',
36
+ detector: 'size',
37
+ severity: 'medium',
38
+ },
39
+ {
40
+ id: 'high-entropy-payload',
41
+ name: 'High entropy payload',
42
+ description: 'Detects entries with abnormally high entropy that may contain encoded/obfuscated payloads',
43
+ detector: 'entropy',
44
+ severity: 'medium',
45
+ },
46
+ {
47
+ id: 'repetition-attack',
48
+ name: 'Repetition flooding',
49
+ description: 'Detects repeated identical or near-identical entries that may attempt to bias agent behavior',
50
+ detector: 'repetition',
51
+ severity: 'medium',
52
+ },
53
+ {
54
+ id: 'injection-delimiter',
55
+ name: 'Delimiter injection',
56
+ description: 'Detects use of common prompt delimiters to break context boundaries',
57
+ detector: 'injection',
58
+ pattern: '(?:```\\s*system|<\\|(?:im_start|system|end)\\|>|\\[INST\\]|<<SYS>>|###\\s*(?:System|Instruction|Human|Assistant):)',
59
+ severity: 'critical',
60
+ },
61
+ ];
62
+ const DEFAULT_CONFIG = {
63
+ maxContextSizeBytes: 100_000,
64
+ maxEntriesPerSession: 200,
65
+ entropyThreshold: 5.5,
66
+ similarityThreshold: 0.9,
67
+ enableIsolation: true,
68
+ };
69
+ /**
70
+ * Detects context poisoning attacks in agent memory stores (OWASP ASI-06).
71
+ *
72
+ * Scans context entries for known attack patterns including prompt injection,
73
+ * context window stuffing, high-entropy payloads, and repetition flooding.
74
+ * Also validates memory isolation between agent sessions.
75
+ */
76
+ class ContextPoisoningDetector {
77
+ config;
78
+ patterns;
79
+ compiledRegex = new Map();
80
+ contextStore = new Map();
81
+ integrityHashes = new Map();
82
+ static MAX_CONTEXT_KEYS = 10_000;
83
+ static MAX_ENTRIES_PER_KEY = 1_000;
84
+ constructor(config) {
85
+ this.config = { ...DEFAULT_CONFIG, ...config };
86
+ this.patterns = [...DEFAULT_PATTERNS, ...(config?.knownPatterns ?? [])];
87
+ for (const p of this.patterns) {
88
+ if (p.detector === 'regex' && p.pattern) {
89
+ try {
90
+ this.compiledRegex.set(p.id, new RegExp(p.pattern, 'i'));
91
+ }
92
+ catch {
93
+ // Skip patterns that fail to compile
94
+ }
95
+ }
96
+ else if (p.detector === 'injection' && p.pattern) {
97
+ try {
98
+ this.compiledRegex.set(p.id, new RegExp(p.pattern, 'i'));
99
+ }
100
+ catch {
101
+ // Skip patterns that fail to compile
102
+ }
103
+ }
104
+ }
105
+ }
106
+ /**
107
+ * Add a context entry to the store and compute its integrity hash.
108
+ */
109
+ addEntry(entry) {
110
+ const key = `${entry.agentId}:${entry.sessionId}`;
111
+ const entries = this.contextStore.get(key) ?? [];
112
+ if (entries.length >= ContextPoisoningDetector.MAX_ENTRIES_PER_KEY) {
113
+ entries.shift();
114
+ }
115
+ entries.push(entry);
116
+ if (!this.contextStore.has(key) && this.contextStore.size >= ContextPoisoningDetector.MAX_CONTEXT_KEYS) {
117
+ // Evict oldest key (first inserted).
118
+ const oldest = this.contextStore.keys().next().value;
119
+ if (oldest !== undefined) {
120
+ this.contextStore.delete(oldest);
121
+ }
122
+ }
123
+ this.contextStore.set(key, entries);
124
+ const hash = this.computeHash(entry);
125
+ this.integrityHashes.set(entry.entryId, hash);
126
+ }
127
+ /**
128
+ * Scan all stored context entries for poisoning indicators.
129
+ */
130
+ scan() {
131
+ const findings = [];
132
+ let entriesScanned = 0;
133
+ for (const entries of this.contextStore.values()) {
134
+ for (const entry of entries) {
135
+ entriesScanned++;
136
+ const entryFindings = this.scanEntry(entry);
137
+ findings.push(...entryFindings);
138
+ }
139
+ // Check repetition across entries in the same session
140
+ const repetitionFindings = this.checkRepetition(entries);
141
+ findings.push(...repetitionFindings);
142
+ }
143
+ const isolationViolations = this.config.enableIsolation
144
+ ? this.checkIsolation()
145
+ : [];
146
+ const integrityValid = this.verifyIntegrity();
147
+ const riskLevel = this.assessRisk(findings, isolationViolations);
148
+ return {
149
+ scannedAt: new Date().toISOString(),
150
+ entriesScanned,
151
+ findings,
152
+ integrityValid,
153
+ isolationViolations,
154
+ riskLevel,
155
+ };
156
+ }
157
+ /**
158
+ * Scan a single context entry for poisoning patterns.
159
+ */
160
+ scanEntry(entry) {
161
+ const findings = [];
162
+ for (const pattern of this.patterns) {
163
+ const finding = this.checkPattern(entry, pattern);
164
+ if (finding) {
165
+ findings.push(finding);
166
+ }
167
+ }
168
+ return findings;
169
+ }
170
+ /**
171
+ * Verify integrity of all stored entries.
172
+ * Returns false if any entry has been tampered with.
173
+ */
174
+ verifyIntegrity() {
175
+ for (const entries of this.contextStore.values()) {
176
+ for (const entry of entries) {
177
+ const storedHash = this.integrityHashes.get(entry.entryId);
178
+ if (!storedHash)
179
+ continue;
180
+ const currentHash = this.computeHash(entry);
181
+ if (currentHash !== storedHash)
182
+ return false;
183
+ }
184
+ }
185
+ return true;
186
+ }
187
+ /**
188
+ * Check memory isolation between sessions for the same agent.
189
+ */
190
+ checkIsolation() {
191
+ const violations = [];
192
+ // Group by agentId
193
+ const agentSessions = new Map();
194
+ for (const [key, entries] of this.contextStore) {
195
+ const [agentId] = key.split(':');
196
+ if (!agentSessions.has(agentId)) {
197
+ agentSessions.set(agentId, new Map());
198
+ }
199
+ const sessions = agentSessions.get(agentId);
200
+ const sessionId = entries[0]?.sessionId;
201
+ if (sessionId) {
202
+ sessions.set(sessionId, entries);
203
+ }
204
+ }
205
+ // Check for content leaking between sessions
206
+ for (const [agentId, sessions] of agentSessions) {
207
+ const sessionIds = [...sessions.keys()];
208
+ for (let i = 0; i < sessionIds.length; i++) {
209
+ for (let j = i + 1; j < sessionIds.length; j++) {
210
+ const entriesA = sessions.get(sessionIds[i]);
211
+ const entriesB = sessions.get(sessionIds[j]);
212
+ const shared = this.findSharedContent(entriesA, entriesB);
213
+ if (shared.length > 0) {
214
+ violations.push({
215
+ sourceSessionId: sessionIds[i],
216
+ targetSessionId: sessionIds[j],
217
+ agentId,
218
+ sharedEntryIds: shared,
219
+ description: `${shared.length} context entries shared between sessions, violating memory isolation`,
220
+ });
221
+ }
222
+ }
223
+ }
224
+ }
225
+ return violations;
226
+ }
227
+ /**
228
+ * Get all stored entries for a specific agent/session.
229
+ */
230
+ getEntries(agentId, sessionId) {
231
+ return [...(this.contextStore.get(`${agentId}:${sessionId}`) ?? [])];
232
+ }
233
+ /**
234
+ * Clear all entries for a specific agent/session.
235
+ */
236
+ clearSession(agentId, sessionId) {
237
+ const key = `${agentId}:${sessionId}`;
238
+ const entries = this.contextStore.get(key);
239
+ if (entries) {
240
+ for (const entry of entries) {
241
+ this.integrityHashes.delete(entry.entryId);
242
+ }
243
+ }
244
+ this.contextStore.delete(key);
245
+ }
246
+ // ── Internal helpers ──
247
+ checkPattern(entry, pattern) {
248
+ switch (pattern.detector) {
249
+ case 'regex':
250
+ case 'injection':
251
+ return this.checkRegex(entry, pattern);
252
+ case 'entropy':
253
+ return this.checkEntropy(entry, pattern);
254
+ case 'size':
255
+ return this.checkSize(entry, pattern);
256
+ case 'repetition':
257
+ return null; // Handled separately across entries
258
+ default:
259
+ return null;
260
+ }
261
+ }
262
+ checkRegex(entry, pattern) {
263
+ const regex = this.compiledRegex.get(pattern.id);
264
+ if (!regex)
265
+ return null;
266
+ const match = regex.exec(entry.content);
267
+ if (!match)
268
+ return null;
269
+ return {
270
+ findingId: (0, crypto_1.randomUUID)(),
271
+ patternId: pattern.id,
272
+ patternName: pattern.name,
273
+ severity: pattern.severity,
274
+ entryId: entry.entryId,
275
+ sessionId: entry.sessionId,
276
+ agentId: entry.agentId,
277
+ description: pattern.description,
278
+ evidence: match[0].substring(0, 200),
279
+ recommendation: this.getRecommendation(pattern),
280
+ };
281
+ }
282
+ checkEntropy(entry, pattern) {
283
+ if (entry.content.length < 50)
284
+ return null;
285
+ const entropy = this.shannonEntropy(entry.content);
286
+ if (entropy < this.config.entropyThreshold)
287
+ return null;
288
+ return {
289
+ findingId: (0, crypto_1.randomUUID)(),
290
+ patternId: pattern.id,
291
+ patternName: pattern.name,
292
+ severity: pattern.severity,
293
+ entryId: entry.entryId,
294
+ sessionId: entry.sessionId,
295
+ agentId: entry.agentId,
296
+ description: `Entry has abnormally high entropy (${entropy.toFixed(2)} bits/char, threshold: ${this.config.entropyThreshold})`,
297
+ evidence: `First 100 chars: ${entry.content.substring(0, 100)}`,
298
+ recommendation: 'Review entry for encoded or obfuscated payloads. Consider rejecting high-entropy inputs.',
299
+ };
300
+ }
301
+ checkSize(entry, pattern) {
302
+ const sizeBytes = Buffer.byteLength(entry.content, 'utf-8');
303
+ if (sizeBytes <= this.config.maxContextSizeBytes)
304
+ return null;
305
+ return {
306
+ findingId: (0, crypto_1.randomUUID)(),
307
+ patternId: pattern.id,
308
+ patternName: pattern.name,
309
+ severity: pattern.severity,
310
+ entryId: entry.entryId,
311
+ sessionId: entry.sessionId,
312
+ agentId: entry.agentId,
313
+ description: `Entry size (${sizeBytes} bytes) exceeds maximum (${this.config.maxContextSizeBytes} bytes)`,
314
+ evidence: `Size: ${sizeBytes} bytes, limit: ${this.config.maxContextSizeBytes} bytes`,
315
+ recommendation: 'Truncate or reject oversized context entries to prevent context window stuffing.',
316
+ };
317
+ }
318
+ checkRepetition(entries) {
319
+ const findings = [];
320
+ const contentCounts = new Map();
321
+ for (const entry of entries) {
322
+ const normalized = entry.content.trim().toLowerCase();
323
+ const existing = contentCounts.get(normalized) ?? [];
324
+ existing.push(entry);
325
+ contentCounts.set(normalized, existing);
326
+ }
327
+ const repetitionPattern = this.patterns.find((p) => p.id === 'repetition-attack');
328
+ if (!repetitionPattern)
329
+ return findings;
330
+ for (const [, duplicates] of contentCounts) {
331
+ if (duplicates.length >= 3) {
332
+ findings.push({
333
+ findingId: (0, crypto_1.randomUUID)(),
334
+ patternId: repetitionPattern.id,
335
+ patternName: repetitionPattern.name,
336
+ severity: repetitionPattern.severity,
337
+ entryId: duplicates[0].entryId,
338
+ sessionId: duplicates[0].sessionId,
339
+ agentId: duplicates[0].agentId,
340
+ description: `Content repeated ${duplicates.length} times in session, possible repetition flooding`,
341
+ evidence: `Repeated content (first 100 chars): ${duplicates[0].content.substring(0, 100)}`,
342
+ recommendation: 'Deduplicate repeated context entries. Rate-limit identical submissions.',
343
+ });
344
+ }
345
+ }
346
+ return findings;
347
+ }
348
+ findSharedContent(entriesA, entriesB) {
349
+ const shared = [];
350
+ const contentMapA = new Map();
351
+ for (const entry of entriesA) {
352
+ contentMapA.set(entry.content.trim(), entry.entryId);
353
+ }
354
+ for (const entry of entriesB) {
355
+ const normalizedContent = entry.content.trim();
356
+ if (contentMapA.has(normalizedContent) && normalizedContent.length > 20) {
357
+ shared.push(contentMapA.get(normalizedContent), entry.entryId);
358
+ }
359
+ }
360
+ return shared;
361
+ }
362
+ shannonEntropy(text) {
363
+ const freq = new Map();
364
+ for (const char of text) {
365
+ freq.set(char, (freq.get(char) ?? 0) + 1);
366
+ }
367
+ let entropy = 0;
368
+ const len = text.length;
369
+ for (const count of freq.values()) {
370
+ const p = count / len;
371
+ if (p > 0) {
372
+ entropy -= p * Math.log2(p);
373
+ }
374
+ }
375
+ return entropy;
376
+ }
377
+ computeHash(entry) {
378
+ return (0, crypto_1.createHash)('sha256')
379
+ .update(`${entry.entryId}:${entry.sessionId}:${entry.agentId}:${entry.role}:${entry.content}:${entry.timestamp}`)
380
+ .digest('hex');
381
+ }
382
+ getRecommendation(pattern) {
383
+ switch (pattern.severity) {
384
+ case 'critical':
385
+ return 'Block this input immediately. Log the attempt and quarantine the session.';
386
+ case 'high':
387
+ return 'Flag for review and consider blocking. Monitor the source for repeated attempts.';
388
+ case 'medium':
389
+ return 'Log the anomaly and apply additional validation before processing.';
390
+ default:
391
+ return 'Monitor for repeated occurrences and consider adding to block list.';
392
+ }
393
+ }
394
+ assessRisk(findings, violations) {
395
+ if (findings.length === 0 && violations.length === 0)
396
+ return 'none';
397
+ const hasCritical = findings.some((f) => f.severity === 'critical');
398
+ const hasHigh = findings.some((f) => f.severity === 'high');
399
+ const hasMedium = findings.some((f) => f.severity === 'medium');
400
+ if (hasCritical || violations.length > 0)
401
+ return 'critical';
402
+ if (hasHigh)
403
+ return 'high';
404
+ if (hasMedium)
405
+ return 'medium';
406
+ return 'low';
407
+ }
408
+ }
409
+ exports.ContextPoisoningDetector = ContextPoisoningDetector;
410
+ //# sourceMappingURL=context-poisoning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-poisoning.js","sourceRoot":"","sources":["../src/context-poisoning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Credential vault, scoping, and injection for agent tool calls.
3
+ *
4
+ * TypeScript port of the Python `agent_os.credential_vault` primitive
5
+ * (issue #2481, PR #2534). Tracking issue: #2535.
6
+ *
7
+ * Design goals (identical to the Python reference):
8
+ *
9
+ * 1. **Value boundary** — agents never receive resolved secret values. They
10
+ * reference credentials by opaque handle names; only the injector ever
11
+ * holds the resolved value, and only long enough to render a payload.
12
+ * 2. **Authority boundary** — every resolution is gated by a per-agent
13
+ * {@link CredentialProfile} that binds an *action capability* (not just
14
+ * an agent identity) to a specific credential handle.
15
+ * 3. **Policy-first** — placeholder substitution happens *after* the
16
+ * workflow policy callback returns `allow=true`.
17
+ * 4. **Deterministic deny** — denied resolutions emit the same opaque
18
+ * {@link DenyReceipt} regardless of whether the handle is missing,
19
+ * bound to a different agent, or denied by policy.
20
+ * 5. **Untrusted server metadata** — only placeholders whose names appear
21
+ * in the caller-supplied `allowedHandles` set are eligible for
22
+ * substitution. Anything else is treated as injection.
23
+ * 6. **Rotation without rebinding** — credential values rotate in place;
24
+ * the handle name is stable so prompts, MCP descriptions, and saved
25
+ * plans never need to change.
26
+ *
27
+ * Encrypted-at-rest persistence uses AES-256-GCM (`@noble/ciphers`) with
28
+ * a 12-byte random nonce prefixed to the ciphertext. If no persistence
29
+ * path is configured the vault is memory-only.
30
+ *
31
+ * Wire-format note: this SDK uses AES-256-GCM; the Python SDK uses Fernet.
32
+ * A cross-language interop spec is tracked in issue #2535 and the two
33
+ * formats are not currently interchangeable.
34
+ */
35
+ /** Regex matching the credential placeholder syntax `{{cred:NAME}}`. */
36
+ export declare const PLACEHOLDER_RE: RegExp;
37
+ /** Stable string returned in audit/deny records when a request is refused. */
38
+ export declare const DENY_REASON = "credential_denied";
39
+ /** Outcome of a credential resolution attempt. */
40
+ export type CredentialDecision = 'allow' | 'deny';
41
+ export declare class CredentialError extends Error {
42
+ constructor(message: string);
43
+ }
44
+ export interface CredentialRecord {
45
+ readonly name: string;
46
+ readonly value: string;
47
+ readonly credType: string;
48
+ readonly version: number;
49
+ readonly createdAt: number;
50
+ readonly rotatedAt: number | null;
51
+ }
52
+ /**
53
+ * Opaque handle an agent may reference. Holding a handle does **not** grant
54
+ * access to the underlying value; resolution requires the vault, the
55
+ * agent's DID, and an action capability binding.
56
+ */
57
+ export declare class CredentialHandle {
58
+ readonly name: string;
59
+ constructor(name: string);
60
+ /** Return the `{{cred:NAME}}` placeholder for this handle. */
61
+ placeholder(): string;
62
+ toString(): string;
63
+ }
64
+ /**
65
+ * Per-agent capability binding.
66
+ *
67
+ * A profile maps action capabilities (e.g. `github:read_issues`,
68
+ * `github:push_code`) to the credential handle name that may be used to
69
+ * fulfil that capability. Two capabilities that share an underlying
70
+ * credential are still modelled as separate bindings so revoking one does
71
+ * not implicitly revoke the other.
72
+ */
73
+ export declare class CredentialProfile {
74
+ readonly agentDid: string;
75
+ private readonly _bindings;
76
+ constructor(agentDid: string, bindings: Record<string, string> | Map<string, string>);
77
+ /** Return the handle name bound to `actionClass`, or undefined. */
78
+ capabilityFor(actionClass: string): string | undefined;
79
+ /** Snapshot of bindings (read-only). */
80
+ get bindings(): ReadonlyMap<string, string>;
81
+ }
82
+ export interface VaultAuditEvent {
83
+ readonly timestamp: number;
84
+ readonly agentDid: string;
85
+ readonly handleName: string;
86
+ readonly targetService: string;
87
+ readonly actionClass: string;
88
+ readonly decision: CredentialDecision;
89
+ readonly policyVersion: string;
90
+ readonly reason: string;
91
+ }
92
+ /** Deterministic deny output returned in place of a rendered payload. */
93
+ export declare class DenyReceipt {
94
+ readonly reason: string;
95
+ readonly actionClass: string;
96
+ readonly targetService: string;
97
+ constructor(opts?: {
98
+ actionClass?: string;
99
+ targetService?: string;
100
+ reason?: string;
101
+ });
102
+ toJSON(): Record<string, string>;
103
+ equals(other: DenyReceipt): boolean;
104
+ }
105
+ export interface CredentialVaultOptions {
106
+ /** Optional filesystem path for encrypted persistence. */
107
+ persistPath?: string;
108
+ /** AES-256-GCM key (exactly 32 bytes). Required when `persistPath` is set. */
109
+ encryptionKey?: Uint8Array;
110
+ }
111
+ /**
112
+ * Encrypted-at-rest credential store and scoped resolver.
113
+ *
114
+ * Exposes two surfaces:
115
+ *
116
+ * - **Admin** (`put`, `rotate`, `delete`, `listHandles`, `registerProfile`)
117
+ * — for operators provisioning credentials.
118
+ * - **Resolver** (`checkAccess`, `_resolveInternal`) — for the injector.
119
+ * Agents are never expected to call these directly.
120
+ */
121
+ export declare class CredentialVault {
122
+ private readonly records;
123
+ private readonly profiles;
124
+ private readonly _audit;
125
+ private readonly persistPath;
126
+ private readonly key;
127
+ private loaded;
128
+ constructor(options?: CredentialVaultOptions);
129
+ /** Generate a fresh AES-256-GCM key (32 random bytes). */
130
+ static generateKey(): Uint8Array;
131
+ /** Load persisted records from disk. Idempotent. */
132
+ load(): Promise<void>;
133
+ put(name: string, value: string, credType?: string): Promise<CredentialHandle>;
134
+ rotate(name: string, newValue: string): Promise<CredentialHandle>;
135
+ delete(name: string): Promise<boolean>;
136
+ listHandles(): Promise<string[]>;
137
+ getMetadata(name: string): Promise<Omit<CredentialRecord, 'value'> | null>;
138
+ registerProfile(profile: CredentialProfile): void;
139
+ revokeProfile(agentDid: string): boolean;
140
+ /** True iff `agentDid` may use `handleName` for `actionClass`. */
141
+ checkAccess(agentDid: string, handleName: string, actionClass: string): boolean;
142
+ /**
143
+ * Internal: resolve a credential value and emit an audit event.
144
+ * Returns `[value, event]`; on deny `value` is null.
145
+ *
146
+ * Callers must ensure `value` never crosses the agent trust boundary.
147
+ * Use {@link CredentialInjector} rather than calling this directly.
148
+ */
149
+ _resolveInternal(agentDid: string, handleName: string, actionClass: string, targetService: string, policyVersion: string): [string | null, VaultAuditEvent];
150
+ /** Immutable snapshot of audit events. */
151
+ auditLog(): readonly VaultAuditEvent[];
152
+ clearAudit(): void;
153
+ _recordReject(event: VaultAuditEvent): void;
154
+ private flush;
155
+ private encrypt;
156
+ private decrypt;
157
+ }
158
+ export interface InjectionContext {
159
+ readonly agentDid: string;
160
+ readonly actionClass: string;
161
+ readonly targetService: string;
162
+ readonly requestedHandles: readonly string[];
163
+ readonly policyVersion: string;
164
+ }
165
+ export interface PolicyOutcome {
166
+ readonly allow: boolean;
167
+ readonly reason?: string;
168
+ }
169
+ export type PolicyCheck = (ctx: InjectionContext) => PolicyOutcome | Promise<PolicyOutcome>;
170
+ export interface InjectionResult<T> {
171
+ readonly allowed: boolean;
172
+ readonly payload: T | DenyReceipt;
173
+ readonly denyReceipt: DenyReceipt | null;
174
+ readonly auditEvents: readonly VaultAuditEvent[];
175
+ }
176
+ export interface InjectionOptions {
177
+ actionClass: string;
178
+ targetService: string;
179
+ allowedHandles: Iterable<string>;
180
+ policyVersion?: string;
181
+ policyCheck?: PolicyCheck;
182
+ }
183
+ /**
184
+ * Render `{{cred:NAME}}` placeholders into HTTP, MCP, and env payloads.
185
+ *
186
+ * The injector is the *only* component that ever holds resolved credential
187
+ * values, and only long enough to render an outbound payload.
188
+ *
189
+ * For every injection call:
190
+ *
191
+ * - `allowedHandles` is the workflow-policy allowlist of handle names
192
+ * eligible for substitution on this call. A placeholder whose name is
193
+ * not in this set causes the entire call to be denied — this is the
194
+ * "MCP server metadata is untrusted" boundary.
195
+ * - `policyCheck` is invoked *before* any value is read from the vault.
196
+ * - On any deny, `payload` is a {@link DenyReceipt} (deterministic shape).
197
+ */
198
+ export declare class CredentialInjector {
199
+ private readonly vault;
200
+ constructor(vault: CredentialVault);
201
+ injectHeaders(agentDid: string, headers: Record<string, string>, opts: InjectionOptions): Promise<InjectionResult<Record<string, string>>>;
202
+ injectToolArgs<T>(agentDid: string, args: T, opts: InjectionOptions): Promise<InjectionResult<T>>;
203
+ injectEnv(agentDid: string, env: Record<string, string>, opts: InjectionOptions): Promise<InjectionResult<Record<string, string>>>;
204
+ private _inject;
205
+ }
206
+ /**
207
+ * Stable HMAC-SHA256 digest of an audit-event sequence.
208
+ *
209
+ * The digest covers handle names and decisions but never resolved
210
+ * credential values (the vault never stores them in events).
211
+ */
212
+ export declare function auditDigest(events: readonly VaultAuditEvent[], key: Uint8Array): string;
213
+ //# sourceMappingURL=credential-vault.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-vault.d.ts","sourceRoot":"","sources":["../src/credential-vault.ts"],"names":[],"mappings":"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"}