@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.
- package/README.md +363 -0
- package/dist/audit.d.ts +26 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +107 -0
- package/dist/audit.js.map +1 -0
- package/dist/cascade-containment.d.ts +84 -0
- package/dist/cascade-containment.d.ts.map +1 -0
- package/dist/cascade-containment.js +387 -0
- package/dist/cascade-containment.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +112 -0
- package/dist/client.js.map +1 -0
- package/dist/context-poisoning.d.ts +58 -0
- package/dist/context-poisoning.d.ts.map +1 -0
- package/dist/context-poisoning.js +410 -0
- package/dist/context-poisoning.js.map +1 -0
- package/dist/credential-vault.d.ts +213 -0
- package/dist/credential-vault.d.ts.map +1 -0
- package/dist/credential-vault.js +567 -0
- package/dist/credential-vault.js.map +1 -0
- package/dist/discovery.d.ts +80 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +404 -0
- package/dist/discovery.js.map +1 -0
- package/dist/encryption/channel.d.ts +29 -0
- package/dist/encryption/channel.d.ts.map +1 -0
- package/dist/encryption/channel.js +78 -0
- package/dist/encryption/channel.js.map +1 -0
- package/dist/encryption/index.d.ts +9 -0
- package/dist/encryption/index.d.ts.map +1 -0
- package/dist/encryption/index.js +23 -0
- package/dist/encryption/index.js.map +1 -0
- package/dist/encryption/mesh-client.d.ts +281 -0
- package/dist/encryption/mesh-client.d.ts.map +1 -0
- package/dist/encryption/mesh-client.js +1110 -0
- package/dist/encryption/mesh-client.js.map +1 -0
- package/dist/encryption/ratchet.d.ts +38 -0
- package/dist/encryption/ratchet.d.ts.map +1 -0
- package/dist/encryption/ratchet.js +223 -0
- package/dist/encryption/ratchet.js.map +1 -0
- package/dist/encryption/registry-client.d.ts +136 -0
- package/dist/encryption/registry-client.d.ts.map +1 -0
- package/dist/encryption/registry-client.js +369 -0
- package/dist/encryption/registry-client.js.map +1 -0
- package/dist/encryption/x3dh.d.ts +80 -0
- package/dist/encryption/x3dh.d.ts.map +1 -0
- package/dist/encryption/x3dh.js +238 -0
- package/dist/encryption/x3dh.js.map +1 -0
- package/dist/framework-adapter.d.ts +63 -0
- package/dist/framework-adapter.d.ts.map +1 -0
- package/dist/framework-adapter.js +253 -0
- package/dist/framework-adapter.js.map +1 -0
- package/dist/identity.d.ts +124 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +446 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +39 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +95 -0
- package/dist/index.js.map +1 -0
- package/dist/kill-switch.d.ts +22 -0
- package/dist/kill-switch.d.ts.map +1 -0
- package/dist/kill-switch.js +60 -0
- package/dist/kill-switch.js.map +1 -0
- package/dist/lifecycle.d.ts +50 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +113 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/mcp.d.ts +41 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +233 -0
- package/dist/mcp.js.map +1 -0
- package/dist/metrics.d.ts +123 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +289 -0
- package/dist/metrics.js.map +1 -0
- package/dist/oci-manifest.d.ts +49 -0
- package/dist/oci-manifest.d.ts.map +1 -0
- package/dist/oci-manifest.js +182 -0
- package/dist/oci-manifest.js.map +1 -0
- package/dist/policy-backends/cedar.d.ts +15 -0
- package/dist/policy-backends/cedar.d.ts.map +1 -0
- package/dist/policy-backends/cedar.js +88 -0
- package/dist/policy-backends/cedar.js.map +1 -0
- package/dist/policy-backends/opa.d.ts +17 -0
- package/dist/policy-backends/opa.d.ts.map +1 -0
- package/dist/policy-backends/opa.js +74 -0
- package/dist/policy-backends/opa.js.map +1 -0
- package/dist/policy.d.ts +77 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +760 -0
- package/dist/policy.js.map +1 -0
- package/dist/prompt-defense.d.ts +37 -0
- package/dist/prompt-defense.d.ts.map +1 -0
- package/dist/prompt-defense.js +229 -0
- package/dist/prompt-defense.js.map +1 -0
- package/dist/protocol-facets.d.ts +87 -0
- package/dist/protocol-facets.d.ts.map +1 -0
- package/dist/protocol-facets.js +728 -0
- package/dist/protocol-facets.js.map +1 -0
- package/dist/rings.d.ts +17 -0
- package/dist/rings.d.ts.map +1 -0
- package/dist/rings.js +61 -0
- package/dist/rings.js.map +1 -0
- package/dist/sandbox.d.ts +61 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +199 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/surface-parity.d.ts +45 -0
- package/dist/surface-parity.d.ts.map +1 -0
- package/dist/surface-parity.js +216 -0
- package/dist/surface-parity.js.map +1 -0
- package/dist/trust.d.ts +28 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +209 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +422 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +29 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +135 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +356 -0
- package/dist/verify.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.OciManifestAdapter = void 0;
|
|
6
|
+
const crypto_1 = require("crypto");
|
|
7
|
+
const AI_CARD_MEDIA_TYPE = 'application/vnd.ai-card.agent.v1+json';
|
|
8
|
+
const POLICY_MEDIA_TYPE = 'application/vnd.agt.policy.v1+json';
|
|
9
|
+
const OCI_MANIFEST_MEDIA_TYPE = 'application/vnd.oci.image.manifest.v2+json';
|
|
10
|
+
const OCI_CONFIG_MEDIA_TYPE = 'application/vnd.oci.image.config.v1+json';
|
|
11
|
+
/**
|
|
12
|
+
* Converts AGT agent manifests to/from OCI manifest format with AI Card
|
|
13
|
+
* compatibility. Enables registry-based discovery and verification of
|
|
14
|
+
* agent metadata.
|
|
15
|
+
*/
|
|
16
|
+
class OciManifestAdapter {
|
|
17
|
+
/**
|
|
18
|
+
* Convert an AGT agent identity to an AI Card.
|
|
19
|
+
*/
|
|
20
|
+
identityToAICard(identity, extra) {
|
|
21
|
+
const card = {
|
|
22
|
+
name: identity.name ?? identity.did,
|
|
23
|
+
version: '1.0.0',
|
|
24
|
+
description: identity.description,
|
|
25
|
+
author: identity.organization ?? identity.sponsor,
|
|
26
|
+
capabilities: this.capabilitiesToAICard(identity.capabilities),
|
|
27
|
+
metadata: {
|
|
28
|
+
did: identity.did,
|
|
29
|
+
status: identity.status ?? 'active',
|
|
30
|
+
createdAt: identity.createdAt,
|
|
31
|
+
expiresAt: identity.expiresAt,
|
|
32
|
+
parentDid: identity.parentDid,
|
|
33
|
+
delegationDepth: identity.delegationDepth,
|
|
34
|
+
},
|
|
35
|
+
...extra,
|
|
36
|
+
};
|
|
37
|
+
return card;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Convert an AI Card back to an AGT agent identity.
|
|
41
|
+
*/
|
|
42
|
+
aiCardToIdentity(card, publicKey) {
|
|
43
|
+
const metadata = (card.metadata ?? {});
|
|
44
|
+
return {
|
|
45
|
+
did: metadata.did ?? `did:agent:${card.name}`,
|
|
46
|
+
publicKey,
|
|
47
|
+
capabilities: this.aiCardToCapabilities(card.capabilities),
|
|
48
|
+
name: card.name,
|
|
49
|
+
description: card.description,
|
|
50
|
+
organization: card.author,
|
|
51
|
+
status: metadata.status ?? 'active',
|
|
52
|
+
createdAt: metadata.createdAt,
|
|
53
|
+
expiresAt: metadata.expiresAt,
|
|
54
|
+
parentDid: metadata.parentDid,
|
|
55
|
+
delegationDepth: metadata.delegationDepth,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Package an agent identity and optional policy rules into an OCI manifest.
|
|
60
|
+
*/
|
|
61
|
+
package(identity, policyRules, extra) {
|
|
62
|
+
const aiCard = this.identityToAICard(identity, extra);
|
|
63
|
+
const aiCardJson = JSON.stringify(aiCard, null, 2);
|
|
64
|
+
const aiCardDescriptor = this.createDescriptor(aiCardJson, AI_CARD_MEDIA_TYPE, {
|
|
65
|
+
'org.opencontainers.image.title': 'ai-card.json',
|
|
66
|
+
});
|
|
67
|
+
const layers = [
|
|
68
|
+
{ descriptor: aiCardDescriptor, content: aiCardJson },
|
|
69
|
+
];
|
|
70
|
+
if (policyRules && policyRules.length > 0) {
|
|
71
|
+
const policyJson = JSON.stringify({ rules: policyRules }, null, 2);
|
|
72
|
+
const policyDescriptor = this.createDescriptor(policyJson, POLICY_MEDIA_TYPE, {
|
|
73
|
+
'org.opencontainers.image.title': 'policy.json',
|
|
74
|
+
});
|
|
75
|
+
layers.push({ descriptor: policyDescriptor, content: policyJson });
|
|
76
|
+
}
|
|
77
|
+
const configContent = JSON.stringify({
|
|
78
|
+
created: new Date().toISOString(),
|
|
79
|
+
author: identity.organization ?? identity.sponsor ?? 'unknown',
|
|
80
|
+
agent: { did: identity.did, name: identity.name },
|
|
81
|
+
});
|
|
82
|
+
const configDescriptor = this.createDescriptor(configContent, OCI_CONFIG_MEDIA_TYPE);
|
|
83
|
+
const manifest = {
|
|
84
|
+
schemaVersion: 2,
|
|
85
|
+
mediaType: OCI_MANIFEST_MEDIA_TYPE,
|
|
86
|
+
config: configDescriptor,
|
|
87
|
+
layers: layers.map((l) => l.descriptor),
|
|
88
|
+
annotations: {
|
|
89
|
+
'org.opencontainers.image.title': identity.name ?? identity.did,
|
|
90
|
+
'org.opencontainers.image.description': identity.description ?? '',
|
|
91
|
+
'org.opencontainers.image.vendor': identity.organization ?? '',
|
|
92
|
+
'dev.ai-card.version': aiCard.version,
|
|
93
|
+
'dev.agt.did': identity.did,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
return { manifest, aiCard, configBlob: configContent, layers };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Extract an AI Card from an OCI manifest's layers.
|
|
100
|
+
*/
|
|
101
|
+
unpackAICard(layers) {
|
|
102
|
+
const aiCardLayer = layers.find((l) => l.descriptor.mediaType === AI_CARD_MEDIA_TYPE);
|
|
103
|
+
if (!aiCardLayer)
|
|
104
|
+
return null;
|
|
105
|
+
try {
|
|
106
|
+
return JSON.parse(aiCardLayer.content);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Extract policy rules from an OCI manifest's layers.
|
|
114
|
+
*/
|
|
115
|
+
unpackPolicies(layers) {
|
|
116
|
+
const policyLayer = layers.find((l) => l.descriptor.mediaType === POLICY_MEDIA_TYPE);
|
|
117
|
+
if (!policyLayer)
|
|
118
|
+
return [];
|
|
119
|
+
try {
|
|
120
|
+
const parsed = JSON.parse(policyLayer.content);
|
|
121
|
+
return parsed.rules ?? [];
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
return [];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Verify the integrity of an OCI manifest by checking layer digests.
|
|
129
|
+
*/
|
|
130
|
+
verifyManifest(manifest, layers, configContent) {
|
|
131
|
+
const errors = [];
|
|
132
|
+
if (manifest.schemaVersion !== 2) {
|
|
133
|
+
errors.push(`Unsupported schema version: ${manifest.schemaVersion}`);
|
|
134
|
+
}
|
|
135
|
+
// Verify config digest
|
|
136
|
+
if (configContent) {
|
|
137
|
+
const expectedDigest = this.sha256Digest(configContent);
|
|
138
|
+
if (manifest.config.digest !== expectedDigest) {
|
|
139
|
+
errors.push(`Config digest mismatch: expected ${expectedDigest}, got ${manifest.config.digest}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Verify layer digests
|
|
143
|
+
for (const layer of layers) {
|
|
144
|
+
const expectedDigest = this.sha256Digest(layer.content);
|
|
145
|
+
if (layer.descriptor.digest !== expectedDigest) {
|
|
146
|
+
errors.push(`Layer digest mismatch for ${layer.descriptor.annotations?.['org.opencontainers.image.title'] ?? 'unknown'}: expected ${expectedDigest}, got ${layer.descriptor.digest}`);
|
|
147
|
+
}
|
|
148
|
+
const expectedSize = Buffer.byteLength(layer.content, 'utf-8');
|
|
149
|
+
if (layer.descriptor.size !== expectedSize) {
|
|
150
|
+
errors.push(`Layer size mismatch: expected ${expectedSize}, got ${layer.descriptor.size}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return { valid: errors.length === 0, errors };
|
|
154
|
+
}
|
|
155
|
+
// ── Internal helpers ──
|
|
156
|
+
createDescriptor(content, mediaType, annotations) {
|
|
157
|
+
return {
|
|
158
|
+
mediaType,
|
|
159
|
+
digest: this.sha256Digest(content),
|
|
160
|
+
size: Buffer.byteLength(content, 'utf-8'),
|
|
161
|
+
annotations,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
sha256Digest(content) {
|
|
165
|
+
const hash = (0, crypto_1.createHash)('sha256').update(content, 'utf-8').digest('hex');
|
|
166
|
+
return `sha256:${hash}`;
|
|
167
|
+
}
|
|
168
|
+
capabilitiesToAICard(capabilities) {
|
|
169
|
+
return {
|
|
170
|
+
domains: capabilities,
|
|
171
|
+
input_modes: ['text'],
|
|
172
|
+
output_modes: ['text', 'json'],
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
aiCardToCapabilities(capabilities) {
|
|
176
|
+
if (!capabilities)
|
|
177
|
+
return [];
|
|
178
|
+
return capabilities.domains ?? [];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.OciManifestAdapter = OciManifestAdapter;
|
|
182
|
+
//# sourceMappingURL=oci-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oci-manifest.js","sourceRoot":"","sources":["../src/oci-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BackendDecision, ExternalPolicyBackend } from '../types';
|
|
2
|
+
interface CedarBackendConfig {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
fetchImpl?: typeof fetch;
|
|
5
|
+
}
|
|
6
|
+
export declare class CedarBackend implements ExternalPolicyBackend {
|
|
7
|
+
readonly name = "cedar";
|
|
8
|
+
private readonly endpoint;
|
|
9
|
+
private readonly fetchImpl;
|
|
10
|
+
constructor(config: CedarBackendConfig);
|
|
11
|
+
evaluateAction(action: string, context: Record<string, unknown>): Promise<BackendDecision>;
|
|
12
|
+
evaluatePolicy(agentDid: string, context: Record<string, unknown>): Promise<BackendDecision>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=cedar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cedar.d.ts","sourceRoot":"","sources":["../../src/policy-backends/cedar.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AA4ClE,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAED,qBAAa,YAAa,YAAW,qBAAqB;IACxD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,EAAE,kBAAkB;IAShC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA+BhG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAM7F"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.CedarBackend = void 0;
|
|
6
|
+
/** Hostnames and IP prefixes that must never be used as Cedar endpoints. */
|
|
7
|
+
const SSRF_BLOCKLIST = [
|
|
8
|
+
'169.254.169.254', // AWS/Azure IMDS
|
|
9
|
+
'169.254.170.2', // ECS task metadata
|
|
10
|
+
'168.63.129.16', // Azure Wire Server
|
|
11
|
+
'metadata.google.internal',
|
|
12
|
+
'metadata.google',
|
|
13
|
+
'100.100.100.200', // Alibaba Cloud IMDS
|
|
14
|
+
'fd00::', // IPv6 unique-local prefix
|
|
15
|
+
'::1', // IPv6 loopback
|
|
16
|
+
];
|
|
17
|
+
const SSRF_PRIVATE_RANGES = [
|
|
18
|
+
/^127\./, // IPv4 loopback
|
|
19
|
+
/^10\./, // RFC 1918
|
|
20
|
+
/^172\.(1[6-9]|2\d|3[01])\./,
|
|
21
|
+
/^192\.168\./, // RFC 1918
|
|
22
|
+
/^0\./, // "this" network
|
|
23
|
+
];
|
|
24
|
+
function isBlockedEndpoint(endpoint) {
|
|
25
|
+
let hostname;
|
|
26
|
+
try {
|
|
27
|
+
const url = new URL(endpoint);
|
|
28
|
+
hostname = url.hostname.replace(/^\[|\]$/g, '');
|
|
29
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
const lower = hostname.toLowerCase();
|
|
37
|
+
if (lower === 'localhost' || SSRF_BLOCKLIST.some(b => lower === b || lower.endsWith('.' + b))) {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (SSRF_PRIVATE_RANGES.some(re => re.test(hostname))) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
class CedarBackend {
|
|
46
|
+
name = 'cedar';
|
|
47
|
+
endpoint;
|
|
48
|
+
fetchImpl;
|
|
49
|
+
constructor(config) {
|
|
50
|
+
const cleaned = config.endpoint.replace(/\/$/, '');
|
|
51
|
+
if (isBlockedEndpoint(cleaned)) {
|
|
52
|
+
throw new Error('Cedar endpoint blocked: URL points to a reserved or private address');
|
|
53
|
+
}
|
|
54
|
+
this.endpoint = cleaned;
|
|
55
|
+
this.fetchImpl = config.fetchImpl ?? fetch;
|
|
56
|
+
}
|
|
57
|
+
async evaluateAction(action, context) {
|
|
58
|
+
const response = await this.fetchImpl(this.endpoint, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: {
|
|
61
|
+
'content-type': 'application/json',
|
|
62
|
+
},
|
|
63
|
+
body: JSON.stringify({
|
|
64
|
+
action,
|
|
65
|
+
entities: context,
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
68
|
+
if (!response.ok) {
|
|
69
|
+
throw new Error(`Cedar backend request failed with status ${response.status}`);
|
|
70
|
+
}
|
|
71
|
+
const body = await response.json();
|
|
72
|
+
if (body.decision === 'allow' || body.decision === 'deny' || body.decision === 'review') {
|
|
73
|
+
return body.decision;
|
|
74
|
+
}
|
|
75
|
+
if (typeof body.allow === 'boolean') {
|
|
76
|
+
return body.allow ? 'allow' : 'deny';
|
|
77
|
+
}
|
|
78
|
+
throw new Error('Cedar backend returned an unsupported result shape');
|
|
79
|
+
}
|
|
80
|
+
evaluatePolicy(agentDid, context) {
|
|
81
|
+
return this.evaluateAction('policy.evaluate', {
|
|
82
|
+
...context,
|
|
83
|
+
principal: agentDid,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.CedarBackend = CedarBackend;
|
|
88
|
+
//# sourceMappingURL=cedar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cedar.js","sourceRoot":"","sources":["../../src/policy-backends/cedar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { BackendDecision, ExternalPolicyBackend } from '../types';
|
|
2
|
+
interface OPABackendConfig {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
policyPath?: string;
|
|
5
|
+
fetchImpl?: typeof fetch;
|
|
6
|
+
}
|
|
7
|
+
export declare class OPABackend implements ExternalPolicyBackend {
|
|
8
|
+
readonly name = "opa";
|
|
9
|
+
private readonly endpoint;
|
|
10
|
+
private readonly policyPath;
|
|
11
|
+
private readonly fetchImpl;
|
|
12
|
+
constructor(config: OPABackendConfig);
|
|
13
|
+
evaluateAction(action: string, context: Record<string, unknown>): Promise<BackendDecision>;
|
|
14
|
+
evaluatePolicy(agentDid: string, context: Record<string, unknown>): Promise<BackendDecision>;
|
|
15
|
+
}
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=opa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opa.d.ts","sourceRoot":"","sources":["../../src/policy-backends/opa.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAElE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAwBD,qBAAa,UAAW,YAAW,qBAAqB;IACtD,QAAQ,CAAC,IAAI,SAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,EAAE,gBAAgB;IAO9B,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAsChG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;CAM7F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.OPABackend = void 0;
|
|
6
|
+
const BLOCKED_HOSTS = new Set([
|
|
7
|
+
'169.254.169.254',
|
|
8
|
+
'metadata.google.internal',
|
|
9
|
+
]);
|
|
10
|
+
function validateOpaUrl(endpoint) {
|
|
11
|
+
let parsed;
|
|
12
|
+
try {
|
|
13
|
+
parsed = new URL(endpoint);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
throw new Error(`Invalid OPA endpoint URL: ${endpoint}`);
|
|
17
|
+
}
|
|
18
|
+
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
19
|
+
throw new Error(`Unsupported OPA URL scheme '${parsed.protocol}': only http and https are allowed`);
|
|
20
|
+
}
|
|
21
|
+
if (BLOCKED_HOSTS.has(parsed.hostname)) {
|
|
22
|
+
throw new Error(`OPA URL host '${parsed.hostname}' is blocked to prevent SSRF`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
class OPABackend {
|
|
26
|
+
name = 'opa';
|
|
27
|
+
endpoint;
|
|
28
|
+
policyPath;
|
|
29
|
+
fetchImpl;
|
|
30
|
+
constructor(config) {
|
|
31
|
+
validateOpaUrl(config.endpoint);
|
|
32
|
+
this.endpoint = config.endpoint.replace(/\/$/, '');
|
|
33
|
+
this.policyPath = config.policyPath ?? 'agentmesh/allow';
|
|
34
|
+
this.fetchImpl = config.fetchImpl ?? fetch;
|
|
35
|
+
}
|
|
36
|
+
async evaluateAction(action, context) {
|
|
37
|
+
const response = await this.fetchImpl(`${this.endpoint}/v1/data/${this.policyPath}`, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: {
|
|
40
|
+
'content-type': 'application/json',
|
|
41
|
+
},
|
|
42
|
+
body: JSON.stringify({
|
|
43
|
+
input: {
|
|
44
|
+
...context,
|
|
45
|
+
action,
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
});
|
|
49
|
+
if (!response.ok) {
|
|
50
|
+
throw new Error(`OPA backend request failed with status ${response.status}`);
|
|
51
|
+
}
|
|
52
|
+
const body = await response.json();
|
|
53
|
+
if (typeof body.result === 'boolean') {
|
|
54
|
+
return body.result ? 'allow' : 'deny';
|
|
55
|
+
}
|
|
56
|
+
if (body.result && typeof body.result === 'object') {
|
|
57
|
+
if (typeof body.result.allow === 'boolean') {
|
|
58
|
+
return body.result.allow ? 'allow' : 'deny';
|
|
59
|
+
}
|
|
60
|
+
if (body.result.decision === 'allow' || body.result.decision === 'deny' || body.result.decision === 'review') {
|
|
61
|
+
return body.result.decision;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
throw new Error('OPA backend returned an unsupported result shape');
|
|
65
|
+
}
|
|
66
|
+
evaluatePolicy(agentDid, context) {
|
|
67
|
+
return this.evaluateAction('policy.evaluate', {
|
|
68
|
+
...context,
|
|
69
|
+
agentDid,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.OPABackend = OPABackend;
|
|
74
|
+
//# sourceMappingURL=opa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opa.js","sourceRoot":"","sources":["../../src/policy-backends/opa.ts"],"names":[],"mappings":"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"}
|
package/dist/policy.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { PolicyRule, Policy, PolicyDecisionResult, CandidateDecision, ExternalPolicyBackend, PolicyBackendEvaluationResult, ResolutionResult, ConflictResolutionStrategy, LegacyPolicyDecision } from './types';
|
|
2
|
+
export type PolicyDecision = LegacyPolicyDecision;
|
|
3
|
+
/**
|
|
4
|
+
* Resolves conflicts between competing policy candidate decisions.
|
|
5
|
+
*/
|
|
6
|
+
export declare class PolicyConflictResolver {
|
|
7
|
+
readonly strategy: ConflictResolutionStrategy;
|
|
8
|
+
constructor(strategy: ConflictResolutionStrategy);
|
|
9
|
+
resolve(candidates: CandidateDecision[]): ResolutionResult;
|
|
10
|
+
private denyOverrides;
|
|
11
|
+
private allowOverrides;
|
|
12
|
+
private priorityFirstMatch;
|
|
13
|
+
private mostSpecificWins;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Declarative policy engine with full parity to the Python/NET SDK.
|
|
17
|
+
*
|
|
18
|
+
* Features:
|
|
19
|
+
* - Rich policy document model with apiVersion, scope, default_action
|
|
20
|
+
* - Expression-based condition evaluation (equality, comparison, in, and/or)
|
|
21
|
+
* - Configurable conflict resolution (deny-overrides, allow-overrides, priority-first-match, most-specific-wins)
|
|
22
|
+
* - Rate limiting support
|
|
23
|
+
* - Approval workflows
|
|
24
|
+
* - Backward-compatible with v0.1 flat rules
|
|
25
|
+
*/
|
|
26
|
+
export declare class PolicyEngine {
|
|
27
|
+
private _policies;
|
|
28
|
+
private _rateLimits;
|
|
29
|
+
private _resolver;
|
|
30
|
+
private _backends;
|
|
31
|
+
/** Legacy flat rules for backward compatibility. */
|
|
32
|
+
private _legacyRules;
|
|
33
|
+
constructor(rules?: PolicyRule[], conflictStrategy?: ConflictResolutionStrategy);
|
|
34
|
+
/** Load a Policy document into the engine. */
|
|
35
|
+
loadPolicy(policy: Policy): void;
|
|
36
|
+
/** Parse and load a YAML string as a Policy document. */
|
|
37
|
+
loadYaml(yamlContent: string): Policy;
|
|
38
|
+
/** Parse and load a JSON string as a Policy document. */
|
|
39
|
+
loadJson(jsonContent: string): Policy;
|
|
40
|
+
/** Get a loaded policy by name. */
|
|
41
|
+
getPolicy(name: string): Policy | undefined;
|
|
42
|
+
/** List all loaded policy names. */
|
|
43
|
+
listPolicies(): string[];
|
|
44
|
+
/** Remove a policy by name. Returns true if found and removed. */
|
|
45
|
+
removePolicy(name: string): boolean;
|
|
46
|
+
/** Clear all loaded policies. */
|
|
47
|
+
clearPolicies(): void;
|
|
48
|
+
registerBackend(backend: ExternalPolicyBackend): void;
|
|
49
|
+
listBackends(): string[];
|
|
50
|
+
clearBackends(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Evaluate all applicable policies for an agent action.
|
|
53
|
+
* Returns a rich PolicyDecisionResult with matched rule, timing, etc.
|
|
54
|
+
*/
|
|
55
|
+
evaluatePolicy(agentDid: string, context: Record<string, unknown>): PolicyDecisionResult;
|
|
56
|
+
evaluateWithBackends(action: string, context?: Record<string, unknown>): Promise<PolicyBackendEvaluationResult>;
|
|
57
|
+
evaluatePolicyWithBackends(agentDid: string, context: Record<string, unknown>): Promise<PolicyBackendEvaluationResult>;
|
|
58
|
+
/** Load policy rules from a YAML file (legacy flat format). */
|
|
59
|
+
loadFromYAML(yamlPath: string): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Evaluate using legacy flat rules (v0.1 compatible).
|
|
62
|
+
* First match wins; default is 'deny'.
|
|
63
|
+
*/
|
|
64
|
+
evaluate(action: string, context?: Record<string, unknown>): PolicyDecision;
|
|
65
|
+
/** Append a legacy flat rule. */
|
|
66
|
+
addRule(rule: PolicyRule): void;
|
|
67
|
+
/** Return a snapshot of legacy flat rules. */
|
|
68
|
+
getRules(): readonly PolicyRule[];
|
|
69
|
+
private matchAction;
|
|
70
|
+
private matchLegacyConditions;
|
|
71
|
+
private findRule;
|
|
72
|
+
private isRateLimited;
|
|
73
|
+
private incrementRateLimit;
|
|
74
|
+
private runActionBackend;
|
|
75
|
+
private runPolicyBackend;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,UAAU,EACV,MAAM,EAEN,oBAAoB,EACpB,iBAAiB,EAGjB,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,0BAA0B,EAE1B,oBAAoB,EACrB,MAAM,SAAS,CAAC;AAGjB,MAAM,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAmBlD;;GAEG;AACH,qBAAa,sBAAsB;IACrB,QAAQ,CAAC,QAAQ,EAAE,0BAA0B;gBAApC,QAAQ,EAAE,0BAA0B;IAEzD,OAAO,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,gBAAgB;IAqC1D,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,cAAc;IAmBtB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,gBAAgB;CAezB;AAoND;;;;;;;;;;GAUG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,SAAS,CAA+B;IAEhD,oDAAoD;IACpD,OAAO,CAAC,YAAY,CAAoB;gBAE5B,KAAK,CAAC,EAAE,UAAU,EAAE,EAAE,gBAAgB,CAAC,EAAE,0BAA0B;IAW/E,8CAA8C;IAC9C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IASrC,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAOrC,mCAAmC;IACnC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI3C,oCAAoC;IACpC,YAAY,IAAI,MAAM,EAAE;IAIxB,kEAAkE;IAClE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAInC,iCAAiC;IACjC,aAAa,IAAI,IAAI;IAKrB,eAAe,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAIrD,YAAY,IAAI,MAAM,EAAE;IAIxB,aAAa,IAAI,IAAI;IAIrB;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB;IAwGlF,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC,OAAO,CAAC,6BAA6B,CAAC;IA0BnC,0BAA0B,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,6BAA6B,CAAC;IAgDzC,+DAA+D;IACzD,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnD;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,cAAc;IAsB/E,iCAAiC;IACjC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAI/B,8CAA8C;IAC9C,QAAQ,IAAI,SAAS,UAAU,EAAE;IAMjC,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,kBAAkB;YAWZ,gBAAgB;YAyBhB,gBAAgB;CAwB/B"}
|