@claude-flow/security 3.0.0-alpha.8 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/CVE-REMEDIATION.d.ts +17 -6
  2. package/dist/CVE-REMEDIATION.d.ts.map +1 -1
  3. package/dist/CVE-REMEDIATION.js +328 -12
  4. package/dist/CVE-REMEDIATION.js.map +1 -1
  5. package/dist/authorization/propagator.d.ts +148 -0
  6. package/dist/authorization/propagator.d.ts.map +1 -0
  7. package/dist/authorization/propagator.js +182 -0
  8. package/dist/authorization/propagator.js.map +1 -0
  9. package/dist/index.d.ts +11 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +36 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/keychain-adapter.d.ts +48 -0
  14. package/dist/keychain-adapter.d.ts.map +1 -0
  15. package/dist/keychain-adapter.js +0 -0
  16. package/dist/keychain-adapter.js.map +1 -0
  17. package/dist/mcp-caller-identity.d.ts +101 -0
  18. package/dist/mcp-caller-identity.d.ts.map +1 -0
  19. package/dist/mcp-caller-identity.js +0 -0
  20. package/dist/mcp-caller-identity.js.map +1 -0
  21. package/dist/mcp-composition-inspector.d.ts +133 -0
  22. package/dist/mcp-composition-inspector.d.ts.map +1 -0
  23. package/dist/mcp-composition-inspector.js +254 -0
  24. package/dist/mcp-composition-inspector.js.map +1 -0
  25. package/dist/oauth/browser.d.ts +31 -0
  26. package/dist/oauth/browser.d.ts.map +1 -0
  27. package/dist/oauth/browser.js +55 -0
  28. package/dist/oauth/browser.js.map +1 -0
  29. package/dist/oauth/callback-server.d.ts +37 -0
  30. package/dist/oauth/callback-server.d.ts.map +1 -0
  31. package/dist/oauth/callback-server.js +86 -0
  32. package/dist/oauth/callback-server.js.map +1 -0
  33. package/dist/oauth/client.d.ts +57 -0
  34. package/dist/oauth/client.d.ts.map +1 -0
  35. package/dist/oauth/client.js +120 -0
  36. package/dist/oauth/client.js.map +1 -0
  37. package/dist/oauth/pkce.d.ts +25 -0
  38. package/dist/oauth/pkce.d.ts.map +1 -0
  39. package/dist/oauth/pkce.js +36 -0
  40. package/dist/oauth/pkce.js.map +1 -0
  41. package/dist/path-validator.d.ts +23 -0
  42. package/dist/path-validator.d.ts.map +1 -1
  43. package/dist/path-validator.js +128 -5
  44. package/dist/path-validator.js.map +1 -1
  45. package/dist/plugins/integrity-verifier.d.ts +125 -0
  46. package/dist/plugins/integrity-verifier.d.ts.map +1 -0
  47. package/dist/plugins/integrity-verifier.js +186 -0
  48. package/dist/plugins/integrity-verifier.js.map +1 -0
  49. package/dist/policy/canonical.d.ts +5 -0
  50. package/dist/policy/canonical.d.ts.map +1 -0
  51. package/dist/policy/canonical.js +30 -0
  52. package/dist/policy/canonical.js.map +1 -0
  53. package/dist/policy/engine.d.ts +34 -0
  54. package/dist/policy/engine.d.ts.map +1 -0
  55. package/dist/policy/engine.js +285 -0
  56. package/dist/policy/engine.js.map +1 -0
  57. package/dist/policy/envelope.d.ts +9 -0
  58. package/dist/policy/envelope.d.ts.map +1 -0
  59. package/dist/policy/envelope.js +90 -0
  60. package/dist/policy/envelope.js.map +1 -0
  61. package/dist/policy/evaluator.d.ts +4 -0
  62. package/dist/policy/evaluator.d.ts.map +1 -0
  63. package/dist/policy/evaluator.js +119 -0
  64. package/dist/policy/evaluator.js.map +1 -0
  65. package/dist/policy/index.d.ts +7 -0
  66. package/dist/policy/index.d.ts.map +1 -0
  67. package/dist/policy/index.js +7 -0
  68. package/dist/policy/index.js.map +1 -0
  69. package/dist/policy/product-plane.d.ts +238 -0
  70. package/dist/policy/product-plane.d.ts.map +1 -0
  71. package/dist/policy/product-plane.js +1022 -0
  72. package/dist/policy/product-plane.js.map +1 -0
  73. package/dist/policy/types.d.ts +169 -0
  74. package/dist/policy/types.d.ts.map +1 -0
  75. package/dist/policy/types.js +2 -0
  76. package/dist/policy/types.js.map +1 -0
  77. package/dist/safe-git.d.ts +22 -0
  78. package/dist/safe-git.d.ts.map +1 -0
  79. package/dist/safe-git.js +63 -0
  80. package/dist/safe-git.js.map +1 -0
  81. package/dist/tool-output-guardrail.d.ts +126 -0
  82. package/dist/tool-output-guardrail.d.ts.map +1 -0
  83. package/dist/tool-output-guardrail.js +257 -0
  84. package/dist/tool-output-guardrail.js.map +1 -0
  85. package/package.json +17 -5
  86. package/__tests__/acceptance/security-compliance.test.ts +0 -674
  87. package/__tests__/credential-generator.test.ts +0 -310
  88. package/__tests__/fixtures/configurations.ts +0 -425
  89. package/__tests__/fixtures/index.ts +0 -21
  90. package/__tests__/helpers/create-mock.ts +0 -469
  91. package/__tests__/helpers/index.ts +0 -32
  92. package/__tests__/input-validator.test.ts +0 -382
  93. package/__tests__/integration/security-flow.test.ts +0 -606
  94. package/__tests__/password-hasher.test.ts +0 -239
  95. package/__tests__/path-validator.test.ts +0 -302
  96. package/__tests__/safe-executor.test.ts +0 -292
  97. package/__tests__/token-generator.test.ts +0 -371
  98. package/__tests__/unit/credential-generator.test.ts +0 -182
  99. package/__tests__/unit/password-hasher.test.ts +0 -359
  100. package/__tests__/unit/path-validator.test.ts +0 -509
  101. package/__tests__/unit/safe-executor.test.ts +0 -667
  102. package/__tests__/unit/token-generator.test.ts +0 -310
  103. package/ruvector.db +0 -0
  104. package/src/CVE-REMEDIATION.ts +0 -251
  105. package/src/application/index.ts +0 -10
  106. package/src/application/services/security-application-service.ts +0 -193
  107. package/src/credential-generator.ts +0 -368
  108. package/src/domain/entities/security-context.ts +0 -173
  109. package/src/domain/index.ts +0 -17
  110. package/src/domain/services/security-domain-service.ts +0 -296
  111. package/src/index.ts +0 -271
  112. package/src/input-validator.ts +0 -466
  113. package/src/password-hasher.ts +0 -277
  114. package/src/path-validator.ts +0 -525
  115. package/src/safe-executor.ts +0 -546
  116. package/src/token-generator.ts +0 -463
  117. package/tmp.json +0 -0
  118. package/tsconfig.json +0 -9
  119. package/tsconfig.tsbuildinfo +0 -1
  120. package/vitest.config.ts +0 -20
@@ -0,0 +1,186 @@
1
+ /**
2
+ * PluginIntegrityVerifier — install-layer security for plugin supply chain.
3
+ *
4
+ * Implements P1 of ADR-145 (ruvnet/ruflo#2254): Stage-1 Ed25519 signature
5
+ * verification at `plugins install`. Stage-2 (semantic-intent scan against
6
+ * SCH attacks) lands in P2; per-namespace write ACLs land in P3-P4.
7
+ *
8
+ * Threat model
9
+ * ------------
10
+ * Ruflo's plugin install path fetches manifests from IPFS via Pinata with
11
+ * NO signature verification and NO intent analysis. Two attacks land today:
12
+ *
13
+ * - DDIPE (arXiv:2604.03081): malicious logic embedded in plugin docs and
14
+ * config templates. 11.6-33.5% bypass rate across 4 frameworks/5 models;
15
+ * 2.5% evade both detection and alignment. Stage-1 signing blocks the
16
+ * static-payload variants.
17
+ *
18
+ * - SCH (arXiv:2605.14460): malicious intent wrapped as natural-language
19
+ * "compliance rules" in plugin descriptions. The agent generates the
20
+ * harmful code at runtime — no static payload exists. 77.67% breach
21
+ * success, 0.00% scanner detection. Stage-2 (P2) catches this; Stage-1
22
+ * does not.
23
+ *
24
+ * Scope (P1)
25
+ * ----------
26
+ * - Ed25519 signature verification of a detached signature over the manifest.
27
+ * - Trust-anchor allowlist: the publisher's signing key fingerprint must be
28
+ * in `trust-anchors.json`, gated on CODEOWNERS review.
29
+ * - Backwards compatible: default mode is warn-only. `CLAUDE_FLOW_STRICT_PLUGINS=true`
30
+ * makes verification a hard gate.
31
+ *
32
+ * Non-goals (P1)
33
+ * --------------
34
+ * - Semantic intent scan (SCH defence). Lands in P2 with a pattern-rule
35
+ * fallback for environments without LLM credentials.
36
+ * - Sandboxing the plugin runtime. Orthogonal blast-radius concern.
37
+ *
38
+ * Reference: ADR-145, arXiv:2605.14460 (SCH), arXiv:2604.03081 (DDIPE),
39
+ * arXiv:2604.16548 (Mnemonic Sovereignty survey).
40
+ */
41
+ import { createHash } from 'node:crypto';
42
+ import * as nodeCrypto from 'node:crypto';
43
+ /**
44
+ * Canonical JSON serialisation for hashing. Deterministic key ordering at
45
+ * every nesting level. Pure; identical input → identical output bytes.
46
+ */
47
+ export function canonicalize(value) {
48
+ if (value === null || typeof value !== 'object')
49
+ return JSON.stringify(value);
50
+ if (Array.isArray(value))
51
+ return '[' + value.map(canonicalize).join(',') + ']';
52
+ const obj = value;
53
+ const keys = Object.keys(obj).sort();
54
+ return '{' + keys.map(k => JSON.stringify(k) + ':' + canonicalize(obj[k])).join(',') + '}';
55
+ }
56
+ /** Hex-encoded SHA-256 of the canonical-JSON manifest. */
57
+ export function hashManifest(manifest) {
58
+ return createHash('sha256').update(canonicalize(manifest)).digest('hex');
59
+ }
60
+ /** Short fingerprint for telemetry — first 16 hex chars of the key. */
61
+ export function fingerprint(publicKey) {
62
+ return publicKey.slice(0, 16);
63
+ }
64
+ /**
65
+ * Find the trust anchor that vouches for a manifest. Returns the matched
66
+ * anchor (with anchor.publicKey === signer.publicKey) or null.
67
+ *
68
+ * Scope-matching uses a minimal glob: `*` at the end of the scope string
69
+ * matches any suffix. Empty/missing scope matches every plugin id.
70
+ */
71
+ export function findAnchor(anchors, pluginId, signerPublicKey, now) {
72
+ for (const a of anchors) {
73
+ if (a.publicKey !== signerPublicKey)
74
+ continue;
75
+ if (a.expiresAt && new Date(a.expiresAt).getTime() <= now)
76
+ continue;
77
+ if (!a.scope || a.scope === '*' || a.scope === pluginId)
78
+ return a;
79
+ if (a.scope.endsWith('*') && pluginId.startsWith(a.scope.slice(0, -1)))
80
+ return a;
81
+ }
82
+ return null;
83
+ }
84
+ /**
85
+ * `PluginIntegrityVerifier` — Stage-1 verifier (signature + trust anchor).
86
+ *
87
+ * Pure-ish: holds the trust-anchor list and clock, no other state. Safe to
88
+ * construct per-invocation or share.
89
+ */
90
+ export class PluginIntegrityVerifier {
91
+ config;
92
+ constructor(config) {
93
+ this.config = config;
94
+ }
95
+ /**
96
+ * Verify a signed manifest. Returns the verification status; the caller
97
+ * decides what to do with `signature-missing` / `manifest-hash-mismatch`
98
+ * etc. based on its strict-mode policy.
99
+ */
100
+ async verify(signed) {
101
+ const now = (this.config.now ?? Date.now)();
102
+ const pluginId = signed.manifest?.id ?? '<unknown>';
103
+ if (!signed.signature || !signed.publicKey) {
104
+ return { status: 'signature-missing', pluginId, ts: now };
105
+ }
106
+ // Re-hash the manifest and compare to the signed hash.
107
+ const recomputed = hashManifest(signed.manifest);
108
+ if (recomputed !== signed.manifestHash) {
109
+ return {
110
+ status: 'manifest-hash-mismatch',
111
+ pluginId,
112
+ signerFingerprint: fingerprint(signed.publicKey),
113
+ ts: now,
114
+ detail: `expected ${signed.manifestHash}, got ${recomputed}`,
115
+ };
116
+ }
117
+ // Find a trust anchor that vouches for this signer + plugin.
118
+ const anchor = findAnchor(this.config.trustAnchors.anchors, pluginId, signed.publicKey, now);
119
+ if (!anchor) {
120
+ return {
121
+ status: 'unknown-signer',
122
+ pluginId,
123
+ signerFingerprint: fingerprint(signed.publicKey),
124
+ ts: now,
125
+ };
126
+ }
127
+ // Ed25519 verify. Probe @noble/ed25519 (already a workspace dep); fall
128
+ // back to the failure status if it isn't resolvable in this environment
129
+ // (mirrors verify.mjs's #1880 precondition pattern).
130
+ const ed = await loadEd25519();
131
+ if (!ed) {
132
+ return {
133
+ status: 'signature-invalid',
134
+ pluginId,
135
+ signerFingerprint: fingerprint(signed.publicKey),
136
+ ts: now,
137
+ detail: '@noble/ed25519 not available — cannot verify',
138
+ };
139
+ }
140
+ // Required by @noble/ed25519 v2 for sync sha512.
141
+ if (!ed.etc.sha512Sync) {
142
+ ed.etc.sha512Sync = (...m) => {
143
+ const h = nodeCrypto.createHash('sha512');
144
+ for (const x of m)
145
+ h.update(x);
146
+ return h.digest();
147
+ };
148
+ }
149
+ let ok = false;
150
+ try {
151
+ const sigBytes = hexToBytes(signed.signature);
152
+ const msgBytes = hexToBytes(signed.manifestHash);
153
+ const pubBytes = hexToBytes(signed.publicKey);
154
+ ok = await ed.verify(sigBytes, msgBytes, pubBytes);
155
+ }
156
+ catch {
157
+ ok = false;
158
+ }
159
+ if (!ok) {
160
+ return {
161
+ status: 'signature-invalid',
162
+ pluginId,
163
+ signerFingerprint: fingerprint(signed.publicKey),
164
+ ts: now,
165
+ };
166
+ }
167
+ return { status: 'pass', pluginId, signerFingerprint: fingerprint(signed.publicKey), ts: now };
168
+ }
169
+ }
170
+ // ─── helpers ────────────────────────────────────────────────────────────
171
+ function hexToBytes(hex) {
172
+ const out = new Uint8Array(hex.length >>> 1);
173
+ for (let i = 0; i < out.length; i++)
174
+ out[i] = parseInt(hex.substr(i * 2, 2), 16);
175
+ return out;
176
+ }
177
+ async function loadEd25519() {
178
+ try {
179
+ const mod = await import('@noble/ed25519');
180
+ return mod;
181
+ }
182
+ catch {
183
+ return null;
184
+ }
185
+ }
186
+ //# sourceMappingURL=integrity-verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrity-verifier.js","sourceRoot":"","sources":["../../src/plugins/integrity-verifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function canonicalizePolicy(value: unknown): string;
2
+ export declare function policyHash(value: unknown): string;
3
+ export declare function signPolicyHash(hash: string, key: string | Buffer): string;
4
+ export declare function verifyPolicySignature(hash: string, signature: string, key: string | Buffer): boolean;
5
+ //# sourceMappingURL=canonical.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/policy/canonical.ts"],"names":[],"mappings":"AAkBA,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEzD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEzE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAIpG"}
@@ -0,0 +1,30 @@
1
+ import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
2
+ function normalize(value) {
3
+ if (Array.isArray(value))
4
+ return value.map(normalize);
5
+ if (value && typeof value === 'object') {
6
+ return Object.fromEntries(Object.entries(value)
7
+ .filter(([, item]) => item !== undefined)
8
+ .sort(([a], [b]) => a.localeCompare(b))
9
+ .map(([key, item]) => [key, normalize(item)]));
10
+ }
11
+ if (typeof value === 'number' && !Number.isFinite(value)) {
12
+ throw new TypeError('Policy canonicalization rejects non-finite numbers');
13
+ }
14
+ return value;
15
+ }
16
+ export function canonicalizePolicy(value) {
17
+ return JSON.stringify(normalize(value));
18
+ }
19
+ export function policyHash(value) {
20
+ return `sha256:${createHash('sha256').update(canonicalizePolicy(value)).digest('hex')}`;
21
+ }
22
+ export function signPolicyHash(hash, key) {
23
+ return createHmac('sha256', key).update(hash).digest('base64url');
24
+ }
25
+ export function verifyPolicySignature(hash, signature, key) {
26
+ const expected = Buffer.from(signPolicyHash(hash, key));
27
+ const actual = Buffer.from(signature);
28
+ return expected.length === actual.length && timingSafeEqual(expected, actual);
29
+ }
30
+ //# sourceMappingURL=canonical.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/policy/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtE,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;aACxC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,oDAAoD,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAoB;IAC/D,OAAO,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,SAAiB,EAAE,GAAoB;IACzF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,QAAQ,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,34 @@
1
+ import type { BudgetLimit, PolicyApproval, PolicyDecision, PolicyEngineOptions, PolicyRequest, PolicyRule, PolicyState } from './types.js';
2
+ export declare class AgenticPolicyEngine {
3
+ private readonly now;
4
+ private readonly signingKey?;
5
+ private readonly keyId?;
6
+ private readonly evidenceVerifier?;
7
+ private readonly approvalIssuerVerifier?;
8
+ private state;
9
+ constructor(options?: PolicyEngineOptions);
10
+ static fromState(state: PolicyState, options?: Omit<PolicyEngineOptions, 'mode' | 'rules' | 'budgets' | 'usage' | 'approvals' | 'receipts'>): AgenticPolicyEngine;
11
+ exportState(): PolicyState;
12
+ setMode(mode: PolicyState['mode']): void;
13
+ setConfiguredMode(mode: PolicyState['mode']): void;
14
+ upsertRule(rule: PolicyRule): void;
15
+ setBudget(limit: BudgetLimit): void;
16
+ issueApproval(approval: Omit<PolicyApproval, 'uses' | 'issuedAt'> & {
17
+ uses?: number;
18
+ issuedAt?: number;
19
+ }): PolicyApproval;
20
+ revokeApproval(id: string): boolean;
21
+ evaluate(request: PolicyRequest): PolicyDecision;
22
+ verifyLedger(): {
23
+ valid: boolean;
24
+ length: number;
25
+ error?: string;
26
+ };
27
+ private applyBudget;
28
+ private applyApproval;
29
+ private consumeBudget;
30
+ private appendReceipt;
31
+ private validateRequest;
32
+ }
33
+ export declare function createLegacyCompatibleState(source?: string): PolicyState;
34
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAEX,cAAc,EACd,cAAc,EAEd,mBAAmB,EAEnB,aAAa,EACb,UAAU,EACV,WAAW,EACZ,MAAM,YAAY,CAAC;AASpB,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAgE;IAClG,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAA8B;IACtE,OAAO,CAAC,KAAK,CAAc;gBAEf,OAAO,GAAE,mBAAwB;IAiB7C,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,GAAG,UAAU,CAAM,GAAG,mBAAmB;IAgBrK,WAAW,IAAI,WAAW;IAI1B,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAIxC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI;IAMlD,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAgBlC,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAWnC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc;IAmBzH,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOnC,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,cAAc;IAoBhD,YAAY,IAAI;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IA0BlE,OAAO,CAAC,WAAW;IA2BnB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,eAAe;CAcxB;AAED,wBAAgB,2BAA2B,CAAC,MAAM,SAAgB,GAAG,WAAW,CAY/E"}
@@ -0,0 +1,285 @@
1
+ import { policyHash, signPolicyHash, verifyPolicySignature } from './canonical.js';
2
+ import { evaluatePolicy } from './evaluator.js';
3
+ import { POLICY_STATE_VERSION } from './types.js';
4
+ function wildcard(pattern, value) {
5
+ if (!pattern)
6
+ return true;
7
+ if (!value)
8
+ return false;
9
+ return pattern === '*' || pattern === value || (pattern.endsWith('*') && value.startsWith(pattern.slice(0, -1)));
10
+ }
11
+ export class AgenticPolicyEngine {
12
+ now;
13
+ signingKey;
14
+ keyId;
15
+ evidenceVerifier;
16
+ approvalIssuerVerifier;
17
+ state;
18
+ constructor(options = {}) {
19
+ this.now = options.now ?? Date.now;
20
+ this.signingKey = options.signingKey;
21
+ this.keyId = options.keyId;
22
+ this.evidenceVerifier = options.evidenceVerifier;
23
+ this.approvalIssuerVerifier = options.approvalIssuerVerifier;
24
+ this.state = {
25
+ version: POLICY_STATE_VERSION,
26
+ mode: options.mode ?? 'legacy',
27
+ rules: [...(options.rules ?? [])],
28
+ budgets: [...(options.budgets ?? [])],
29
+ usage: [...(options.usage ?? [])],
30
+ approvals: [...(options.approvals ?? [])],
31
+ receipts: [...(options.receipts ?? [])],
32
+ };
33
+ }
34
+ static fromState(state, options = {}) {
35
+ const engine = new AgenticPolicyEngine({
36
+ ...options,
37
+ mode: state.mode,
38
+ rules: state.rules,
39
+ budgets: state.budgets,
40
+ usage: state.usage,
41
+ approvals: state.approvals,
42
+ receipts: state.receipts,
43
+ });
44
+ engine.state.migratedAt = state.migratedAt;
45
+ engine.state.migratedFrom = state.migratedFrom;
46
+ engine.state.configuredMode = state.configuredMode;
47
+ return engine;
48
+ }
49
+ exportState() {
50
+ return structuredClone(this.state);
51
+ }
52
+ setMode(mode) {
53
+ this.state.mode = mode;
54
+ }
55
+ setConfiguredMode(mode) {
56
+ this.state.configuredMode = mode;
57
+ const rank = { legacy: 0, observe: 1, enforce: 2 };
58
+ if (rank[mode] > rank[this.state.mode])
59
+ this.state.mode = mode;
60
+ }
61
+ upsertRule(rule) {
62
+ if (!rule.id || !rule.actions.length)
63
+ throw new Error('invalid-policy-rule');
64
+ for (const value of [
65
+ rule.constraints?.maxCostUsd,
66
+ rule.constraints?.maxTokens,
67
+ rule.constraints?.maxConcurrency,
68
+ ]) {
69
+ if (value !== undefined && (!Number.isFinite(value) || value < 0)) {
70
+ throw new Error('invalid-policy-rule-limit');
71
+ }
72
+ }
73
+ const index = this.state.rules.findIndex((item) => item.id === rule.id);
74
+ if (index >= 0)
75
+ this.state.rules[index] = structuredClone(rule);
76
+ else
77
+ this.state.rules.push(structuredClone(rule));
78
+ }
79
+ setBudget(limit) {
80
+ if (limit.periodMs <= 0)
81
+ throw new Error('invalid-budget-period');
82
+ if (!Number.isFinite(limit.periodMs)
83
+ || [limit.maxCostUsd, limit.maxTokens].some((value) => (value !== undefined && (!Number.isFinite(value) || value < 0))))
84
+ throw new Error('invalid-budget-limit');
85
+ const index = this.state.budgets.findIndex((item) => item.id === limit.id);
86
+ if (index >= 0)
87
+ this.state.budgets[index] = structuredClone(limit);
88
+ else
89
+ this.state.budgets.push(structuredClone(limit));
90
+ }
91
+ issueApproval(approval) {
92
+ if (approval.issuedBy === approval.principal)
93
+ throw new Error('self-approval-forbidden');
94
+ if (this.approvalIssuerVerifier?.(approval.issuedBy) !== true) {
95
+ throw new Error('untrusted-approval-issuer');
96
+ }
97
+ const issuedAt = approval.issuedAt ?? this.now();
98
+ const record = { ...approval, issuedAt, uses: approval.uses ?? 0 };
99
+ if (this.state.approvals.some((item) => item.id === record.id))
100
+ throw new Error('duplicate-approval-id');
101
+ if (!record.id
102
+ || record.expiresAt <= issuedAt
103
+ || !Number.isInteger(record.maxUses)
104
+ || record.maxUses <= 0
105
+ || !Number.isInteger(record.uses)
106
+ || record.uses < 0
107
+ || record.uses > record.maxUses)
108
+ throw new Error('invalid-approval');
109
+ this.state.approvals.push(record);
110
+ return structuredClone(record);
111
+ }
112
+ revokeApproval(id) {
113
+ const approval = this.state.approvals.find((item) => item.id === id);
114
+ if (!approval || approval.revokedAt)
115
+ return false;
116
+ approval.revokedAt = this.now();
117
+ return true;
118
+ }
119
+ evaluate(request) {
120
+ const normalized = {
121
+ ...request,
122
+ requestId: request.requestId ?? crypto.randomUUID(),
123
+ // Caller time is evidence only; expiry, budgets, and receipts always use
124
+ // the authority's clock.
125
+ context: { ...request.context, now: this.now() },
126
+ };
127
+ this.validateRequest(normalized);
128
+ const verifiedEvidenceIds = (normalized.context?.evidence ?? [])
129
+ .filter((evidence) => evidence.id && this.evidenceVerifier?.(evidence, normalized) === true)
130
+ .map((evidence) => evidence.id);
131
+ let decision = evaluatePolicy(normalized, this.state.rules, this.state.mode, verifiedEvidenceIds);
132
+ decision = this.applyBudget(normalized, decision);
133
+ decision = this.applyApproval(normalized, decision);
134
+ const receipt = this.appendReceipt(normalized, decision);
135
+ this.consumeBudget(normalized, decision);
136
+ return { ...decision, receiptId: receipt.payload.receiptId };
137
+ }
138
+ verifyLedger() {
139
+ let previous = null;
140
+ for (let i = 0; i < this.state.receipts.length; i++) {
141
+ const receipt = this.state.receipts[i];
142
+ if (receipt.payload.sequence !== i || receipt.payload.previousReceiptHash !== previous) {
143
+ return { valid: false, length: i, error: 'receipt-chain-mismatch' };
144
+ }
145
+ const hash = policyHash(receipt.payload);
146
+ const { receiptId, ...unsignedIdPayload } = receipt.payload;
147
+ if (hash !== receipt.hash || receiptId !== policyHash(unsignedIdPayload)) {
148
+ return { valid: false, length: i, error: 'receipt-hash-mismatch' };
149
+ }
150
+ if (this.signingKey && !receipt.signature) {
151
+ return { valid: false, length: i, error: 'receipt-signature-missing' };
152
+ }
153
+ if (receipt.signature && !this.signingKey) {
154
+ return { valid: false, length: i, error: 'receipt-signing-key-required' };
155
+ }
156
+ if (receipt.signature && this.signingKey && !verifyPolicySignature(hash, receipt.signature, this.signingKey)) {
157
+ return { valid: false, length: i, error: 'receipt-signature-invalid' };
158
+ }
159
+ previous = receipt.hash;
160
+ }
161
+ return { valid: true, length: this.state.receipts.length };
162
+ }
163
+ applyBudget(request, decision) {
164
+ if (decision.outcome === 'denied')
165
+ return decision;
166
+ const now = request.context?.now ?? this.now();
167
+ for (const limit of this.state.budgets) {
168
+ if (!wildcard(limit.principal, request.identity.id)
169
+ || !wildcard(limit.action, request.action.type)
170
+ || !wildcard(limit.resource, request.action.resource))
171
+ continue;
172
+ let usage = this.state.usage.find((item) => item.limitId === limit.id);
173
+ if (!usage || now - usage.windowStartedAt >= limit.periodMs) {
174
+ usage = { limitId: limit.id, windowStartedAt: now, costUsd: 0, tokens: 0 };
175
+ }
176
+ if (limit.maxCostUsd !== undefined && usage.costUsd + (request.action.costUsd ?? 0) > limit.maxCostUsd) {
177
+ return { ...decision, outcome: 'denied', enforcedOutcome: this.state.mode === 'enforce' ? 'denied' : 'allowed', reason: `budget-exceeded:${limit.id}` };
178
+ }
179
+ if (limit.maxCostUsd !== undefined && request.action.costUsd === undefined) {
180
+ return { ...decision, outcome: 'denied', enforcedOutcome: this.state.mode === 'enforce' ? 'denied' : 'allowed', reason: `budget-metering-required:${limit.id}:costUsd` };
181
+ }
182
+ if (limit.maxTokens !== undefined && request.action.tokens === undefined) {
183
+ return { ...decision, outcome: 'denied', enforcedOutcome: this.state.mode === 'enforce' ? 'denied' : 'allowed', reason: `budget-metering-required:${limit.id}:tokens` };
184
+ }
185
+ if (limit.maxTokens !== undefined && usage.tokens + (request.action.tokens ?? 0) > limit.maxTokens) {
186
+ return { ...decision, outcome: 'denied', enforcedOutcome: this.state.mode === 'enforce' ? 'denied' : 'allowed', reason: `budget-exceeded:${limit.id}` };
187
+ }
188
+ }
189
+ return decision;
190
+ }
191
+ applyApproval(request, decision) {
192
+ if (decision.outcome !== 'approval_required')
193
+ return decision;
194
+ const now = request.context?.now ?? this.now();
195
+ const ids = new Set(request.context?.approvalIds ?? []);
196
+ const approval = this.state.approvals.find((item) => (ids.has(item.id)
197
+ && !item.revokedAt
198
+ && item.expiresAt > now
199
+ && item.uses < item.maxUses
200
+ && wildcard(item.principal, request.identity.id)
201
+ && item.actions.some((action) => wildcard(action, request.action.type))
202
+ && (!item.resources?.length || item.resources.some((resource) => wildcard(resource, request.action.resource)))));
203
+ if (!approval)
204
+ return decision;
205
+ approval.uses += 1;
206
+ return {
207
+ ...decision,
208
+ outcome: 'allowed',
209
+ enforcedOutcome: 'allowed',
210
+ reason: `approved-by:${approval.id}`,
211
+ approvalId: approval.id,
212
+ obligations: [],
213
+ };
214
+ }
215
+ consumeBudget(request, decision) {
216
+ if (decision.enforcedOutcome !== 'allowed')
217
+ return;
218
+ const now = request.context?.now ?? this.now();
219
+ for (const limit of this.state.budgets) {
220
+ if (!wildcard(limit.principal, request.identity.id)
221
+ || !wildcard(limit.action, request.action.type)
222
+ || !wildcard(limit.resource, request.action.resource))
223
+ continue;
224
+ let usage = this.state.usage.find((item) => item.limitId === limit.id);
225
+ if (!usage || now - usage.windowStartedAt >= limit.periodMs) {
226
+ usage = { limitId: limit.id, windowStartedAt: now, costUsd: 0, tokens: 0 };
227
+ this.state.usage = this.state.usage.filter((item) => item.limitId !== limit.id);
228
+ this.state.usage.push(usage);
229
+ }
230
+ usage.costUsd += request.action.costUsd ?? 0;
231
+ usage.tokens += request.action.tokens ?? 0;
232
+ }
233
+ }
234
+ appendReceipt(request, decision) {
235
+ const previous = this.state.receipts.at(-1)?.hash ?? null;
236
+ const sequence = this.state.receipts.length;
237
+ const payloadWithoutId = {
238
+ previousReceiptHash: previous,
239
+ sequence,
240
+ issuedAt: request.context?.now ?? this.now(),
241
+ request,
242
+ decision,
243
+ policyHash: policyHash({ mode: this.state.mode, rules: this.state.rules, budgets: this.state.budgets }),
244
+ };
245
+ const receiptId = policyHash(payloadWithoutId);
246
+ const payload = { receiptId, ...payloadWithoutId };
247
+ const hash = policyHash(payload);
248
+ const receipt = {
249
+ payload,
250
+ hash,
251
+ signature: this.signingKey ? signPolicyHash(hash, this.signingKey) : undefined,
252
+ keyId: this.signingKey ? (this.keyId ?? 'local') : undefined,
253
+ };
254
+ this.state.receipts.push(receipt);
255
+ return receipt;
256
+ }
257
+ validateRequest(request) {
258
+ if (!request.identity?.id || !request.identity.type || !request.action?.type) {
259
+ throw new Error('invalid-policy-request');
260
+ }
261
+ for (const [name, value] of [
262
+ ['costUsd', request.action.costUsd],
263
+ ['tokens', request.action.tokens],
264
+ ['concurrency', request.action.concurrency],
265
+ ]) {
266
+ if (value !== undefined && (!Number.isFinite(value) || value < 0)) {
267
+ throw new Error(`invalid-policy-action-${name}`);
268
+ }
269
+ }
270
+ }
271
+ }
272
+ export function createLegacyCompatibleState(source = 'pre-ADR-324') {
273
+ return {
274
+ version: POLICY_STATE_VERSION,
275
+ mode: 'legacy',
276
+ migratedFrom: source,
277
+ migratedAt: Date.now(),
278
+ rules: [],
279
+ budgets: [],
280
+ usage: [],
281
+ approvals: [],
282
+ receipts: [],
283
+ };
284
+ }
285
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/policy/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { CapabilityEnvelope, PolicyAction } from './types.js';
2
+ export interface EnvelopeCheck {
3
+ allowed: boolean;
4
+ reason?: string;
5
+ }
6
+ export declare function checkCapabilityEnvelope(action: PolicyAction, envelope: CapabilityEnvelope | undefined, now?: number): EnvelopeCheck;
7
+ export declare function isEnvelopeReduction(parent: CapabilityEnvelope, child: CapabilityEnvelope): boolean;
8
+ export declare function delegateEnvelope(parent: CapabilityEnvelope, child: CapabilityEnvelope): CapabilityEnvelope;
9
+ //# sourceMappingURL=envelope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../src/policy/envelope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAkBD,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,kBAAkB,GAAG,SAAS,EACxC,GAAG,SAAa,GACf,aAAa,CA+Bf;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAyBlG;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,kBAAkB,GACxB,kBAAkB,CAkBpB"}