@kya-os/mcp 1.4.0 → 1.6.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 (90) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/dist/authz/accountability.d.ts +35 -0
  3. package/dist/authz/accountability.d.ts.map +1 -0
  4. package/dist/authz/accountability.js +28 -0
  5. package/dist/authz/accountability.js.map +1 -0
  6. package/dist/authz/adapter.d.ts +47 -0
  7. package/dist/authz/adapter.d.ts.map +1 -0
  8. package/dist/authz/adapter.js +10 -0
  9. package/dist/authz/adapter.js.map +1 -0
  10. package/dist/authz/examples/inmemory-oidc.d.ts +29 -0
  11. package/dist/authz/examples/inmemory-oidc.d.ts.map +1 -0
  12. package/dist/authz/examples/inmemory-oidc.js +68 -0
  13. package/dist/authz/examples/inmemory-oidc.js.map +1 -0
  14. package/dist/authz/index.d.ts +19 -0
  15. package/dist/authz/index.d.ts.map +1 -0
  16. package/dist/authz/index.js +19 -0
  17. package/dist/authz/index.js.map +1 -0
  18. package/dist/authz/oidc/authorize.d.ts +25 -0
  19. package/dist/authz/oidc/authorize.d.ts.map +1 -0
  20. package/dist/authz/oidc/authorize.js +24 -0
  21. package/dist/authz/oidc/authorize.js.map +1 -0
  22. package/dist/authz/oidc/metadata.d.ts +43 -0
  23. package/dist/authz/oidc/metadata.d.ts.map +1 -0
  24. package/dist/authz/oidc/metadata.js +32 -0
  25. package/dist/authz/oidc/metadata.js.map +1 -0
  26. package/dist/authz/oidc/oidc-adapter.d.ts +52 -0
  27. package/dist/authz/oidc/oidc-adapter.d.ts.map +1 -0
  28. package/dist/authz/oidc/oidc-adapter.js +131 -0
  29. package/dist/authz/oidc/oidc-adapter.js.map +1 -0
  30. package/dist/authz/oidc/pkce.d.ts +20 -0
  31. package/dist/authz/oidc/pkce.d.ts.map +1 -0
  32. package/dist/authz/oidc/pkce.js +29 -0
  33. package/dist/authz/oidc/pkce.js.map +1 -0
  34. package/dist/authz/registry.d.ts +29 -0
  35. package/dist/authz/registry.d.ts.map +1 -0
  36. package/dist/authz/registry.js +48 -0
  37. package/dist/authz/registry.js.map +1 -0
  38. package/dist/authz/requirement.d.ts +38 -0
  39. package/dist/authz/requirement.d.ts.map +1 -0
  40. package/dist/authz/requirement.js +45 -0
  41. package/dist/authz/requirement.js.map +1 -0
  42. package/dist/delegation/chain-enforcement.d.ts +86 -0
  43. package/dist/delegation/chain-enforcement.d.ts.map +1 -0
  44. package/dist/delegation/chain-enforcement.js +224 -0
  45. package/dist/delegation/chain-enforcement.js.map +1 -0
  46. package/dist/delegation/holder-binding.d.ts +128 -0
  47. package/dist/delegation/holder-binding.d.ts.map +1 -0
  48. package/dist/delegation/holder-binding.js +175 -0
  49. package/dist/delegation/holder-binding.js.map +1 -0
  50. package/dist/delegation/index.d.ts +2 -0
  51. package/dist/delegation/index.d.ts.map +1 -1
  52. package/dist/delegation/index.js +2 -0
  53. package/dist/delegation/index.js.map +1 -1
  54. package/dist/errors.d.ts +1 -0
  55. package/dist/errors.d.ts.map +1 -1
  56. package/dist/errors.js +1 -0
  57. package/dist/errors.js.map +1 -1
  58. package/dist/index.d.ts +2 -1
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +2 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/middleware/with-kya-os.d.ts +35 -1
  63. package/dist/middleware/with-kya-os.d.ts.map +1 -1
  64. package/dist/middleware/with-kya-os.js +100 -200
  65. package/dist/middleware/with-kya-os.js.map +1 -1
  66. package/dist/policy/index.d.ts +1 -0
  67. package/dist/policy/index.d.ts.map +1 -1
  68. package/dist/policy/index.js +1 -0
  69. package/dist/policy/index.js.map +1 -1
  70. package/dist/policy/projection.d.ts +47 -0
  71. package/dist/policy/projection.d.ts.map +1 -0
  72. package/dist/policy/projection.js +33 -0
  73. package/dist/policy/projection.js.map +1 -0
  74. package/dist/providers/grant-store.d.ts +98 -0
  75. package/dist/providers/grant-store.d.ts.map +1 -0
  76. package/dist/providers/grant-store.js +92 -0
  77. package/dist/providers/grant-store.js.map +1 -0
  78. package/dist/providers/index.d.ts +2 -0
  79. package/dist/providers/index.d.ts.map +1 -1
  80. package/dist/providers/index.js +2 -0
  81. package/dist/providers/index.js.map +1 -1
  82. package/dist/providers/runtime-fetch.d.ts +14 -0
  83. package/dist/providers/runtime-fetch.d.ts.map +1 -1
  84. package/dist/providers/runtime-fetch.js +22 -0
  85. package/dist/providers/runtime-fetch.js.map +1 -1
  86. package/dist/providers/web-crypto.d.ts +35 -0
  87. package/dist/providers/web-crypto.d.ts.map +1 -0
  88. package/dist/providers/web-crypto.js +91 -0
  89. package/dist/providers/web-crypto.js.map +1 -0
  90. package/package.json +14 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -30,6 +30,7 @@ export { verifyDelegationAudience, } from './delegation/audience-validator.js';
30
30
  export { buildDelegationProofJWT, buildChainString, } from './delegation/outbound-proof.js';
31
31
  export { buildOutboundDelegationHeaders, OUTBOUND_HEADER_NAMES, } from './delegation/outbound-headers.js';
32
32
  export { canonicalizeJSON, createUnsignedVCJWT, completeVCJWT, parseVCJWT, } from './delegation/utils.js';
33
+ export { assertHolderBinding, generateRequestProof, toHolderBindingRequest, isHolderBindingApplicable, isKyaOsControlArg, HOLDER_BINDING_ERROR, } from './delegation/holder-binding.js';
33
34
  export { MemoryStatusListStorage } from './delegation/storage/memory-statuslist-storage.js';
34
35
  export { MemoryDelegationGraphStorage } from './delegation/storage/memory-graph-storage.js';
35
36
  export { createDidKeyResolver, resolveDidKeySync, isEd25519DidKey, extractPublicKeyFromDidKey, publicKeyToJwk, } from './delegation/did-key-resolver.js';
@@ -50,7 +51,7 @@ export { CryptoProvider, ClockProvider, FetchProvider, StorageProvider, NonceCac
50
51
  export { MemoryStorageProvider, MemoryNonceCacheProvider, MemoryIdentityProvider, } from './providers/memory.js';
51
52
  export { NodeCryptoProvider } from './providers/node-crypto.js';
52
53
  export { SystemClockProvider } from './providers/system-clock.js';
53
- export { RuntimeFetchProvider } from './providers/runtime-fetch.js';
54
+ export { RuntimeFetchProvider, NoopFetchProvider } from './providers/runtime-fetch.js';
54
55
  export { AuditLogProvider, MemoryAuditLogProvider, NoopAuditLogProvider, buildAuditRecord, } from './providers/audit-log.js';
55
56
  // Middleware
56
57
  export { createKyaOsMiddleware, withKyaOs, generateIdentity, } from './middleware/index.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -14,11 +14,12 @@
14
14
  * internally by `withKyaOs()` and for advanced use cases like the
15
15
  * low-level `Server` API or custom request handler patterns.
16
16
  */
17
- import { type CryptoProvider, type FetchProvider } from "../providers/base.js";
17
+ import { type CryptoProvider, type FetchProvider, type NonceCacheProvider } from "../providers/base.js";
18
18
  import { AuditLogProvider } from "../providers/audit-log.js";
19
19
  import { SessionManager, type SessionConfig } from "../session/manager.js";
20
20
  import { ProofGenerator } from "../proof/generator.js";
21
21
  import { type DIDResolver, type StatusListResolver } from "../delegation/vc-verifier.js";
22
+ import { type RevocationChecker } from "../delegation/chain-enforcement.js";
22
23
  import { type DelegationCredential, type NeedsAuthorizationError } from "../types/protocol.js";
23
24
  import { RiskClassifier } from "../policy/classifier.js";
24
25
  import { type ApprovalGrant } from "../policy/approval.js";
@@ -52,12 +53,45 @@ export interface KyaOsDelegationConfig {
52
53
  * contain only ancestors (root -> parent) or the full chain (root -> leaf).
53
54
  */
54
55
  resolveDelegationChain?: (leafCredential: DelegationCredential) => Promise<DelegationCredential[]>;
56
+ /**
57
+ * Graph-backed ancestor-revocation check. When provided, the chain walk also
58
+ * verifies the leaf is not revoked via a cascade-revoked ANCESTOR — caught
59
+ * independently of how `resolveDelegationChain` hydrated the chain (it walks
60
+ * the delegation graph + StatusList). `CascadingRevocationManager` is the
61
+ * reference adapter. Omit to keep the prior per-credential-status behavior.
62
+ */
63
+ revocationChecker?: RevocationChecker;
64
+ /**
65
+ * Holder-of-key enforcement for inbound calls (spec §11.8). A valid delegation
66
+ * is a *bearer* credential; holder binding additionally requires the caller to
67
+ * present a per-request proof (`_kyaos_proof`) signed by the delegation
68
+ * SUBJECT's key, closing theft-replay for the key-bearing population.
69
+ *
70
+ * - `'off'` (default): no holder-binding check — current behavior, unchanged.
71
+ * - `'warn'`: check and log failures (missing/unbound proof), but still allow.
72
+ * - `'enforce'`: reject calls whose proof is missing or does not bind the
73
+ * subject. **Breaking for callers that don't yet send `_kyaos_proof`** — opt
74
+ * in only once your agents mint request proofs.
75
+ *
76
+ * Scope is did:key subjects (the DID encodes the key). did:web and other
77
+ * subjects are deferred to cnf-based binding (phase 2) and logged, never
78
+ * rejected — so enabling `'enforce'` never breaks did:web traffic.
79
+ */
80
+ holderBinding?: "off" | "warn" | "enforce";
55
81
  }
56
82
  export interface KyaOsConfig {
57
83
  /** Agent identity (DID + key material) */
58
84
  identity: KyaOsIdentityConfig;
59
85
  /** Session configuration overrides */
60
86
  session?: Omit<SessionConfig, "nonceCache">;
87
+ /**
88
+ * Replay-protection store, shared by the session handshake AND inbound holder
89
+ * binding so both draw on one nonce namespace. Defaults to an in-memory store
90
+ * (single-process only); inject a Redis / Durable Object / KV-backed
91
+ * {@link NonceCacheProvider} for multi-instance deployments. Set here, not on
92
+ * `session`, so there is exactly one cache and the two cannot diverge.
93
+ */
94
+ nonceCache?: NonceCacheProvider;
61
95
  /** Delegation verification overrides */
62
96
  delegation?: KyaOsDelegationConfig;
63
97
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"with-kya-os.d.ts","sourceRoot":"","sources":["../../src/middleware/with-kya-os.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"with-kya-os.d.ts","sourceRoot":"","sources":["../../src/middleware/with-kya-os.ts"],"names":[],"mappings":"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"}
@@ -14,35 +14,30 @@
14
14
  * internally by `withKyaOs()` and for advanced use cases like the
15
15
  * low-level `Server` API or custom request handler patterns.
16
16
  */
17
- import { RuntimeFetchProvider } from "../providers/runtime-fetch.js";
17
+ import { RuntimeFetchProvider, NoopFetchProvider } from "../providers/runtime-fetch.js";
18
18
  import { NoopAuditLogProvider } from "../providers/audit-log.js";
19
19
  import { SessionManager, } from "../session/manager.js";
20
20
  import { ProofGenerator, } from "../proof/generator.js";
21
21
  import { validateHandshakeFormat } from "../session/manager.js";
22
22
  import { DelegationCredentialVerifier, } from "../delegation/vc-verifier.js";
23
23
  import { createDidKeyResolver } from "../delegation/did-key-resolver.js";
24
+ import { assertHolderBinding, isHolderBindingApplicable, isKyaOsControlArg, toHolderBindingRequest, } from "../delegation/holder-binding.js";
25
+ import { ProofVerifier } from "../proof/verifier.js";
26
+ import { SystemClockProvider } from "../providers/system-clock.js";
27
+ import { MemoryNonceCacheProvider } from "../providers/memory.js";
24
28
  import { scopeSatisfies } from "../delegation/scope-matcher.js";
25
29
  import { createDidWebResolver } from "../delegation/did-web-resolver.js";
26
- import { verifyDelegationAudience } from "../delegation/audience-validator.js";
27
- import { createNeedsAuthorizationError, createNeedsApprovalError, extractDelegationFromVC, } from "../types/protocol.js";
30
+ import { validateDelegationChain as validateDelegationChainCore, getDelegationScopes, } from "../delegation/chain-enforcement.js";
31
+ import { createNeedsAuthorizationError, createNeedsApprovalError, } from "../types/protocol.js";
28
32
  import { logger } from "../logging/index.js";
29
33
  import { RiskClassifier } from "../policy/classifier.js";
30
34
  import { DefaultPolicyEngine } from "../policy/default-engine.js";
31
35
  import { verifyApprovalQuorum } from "../policy/approval.js";
36
+ import { buildPolicyRequest } from "../policy/projection.js";
32
37
  import { KYA_OS_ERROR_CODES } from "../errors.js";
33
38
  import { canonicalizeJSON, parseVCJWT } from "../delegation/utils.js";
34
39
  import { base64urlDecodeToBytes, base64urlEncodeFromBytes, bytesToBase64 } from "../utils/base64.js";
35
40
  export const KYA_OS_ACTIONS = ["handshake", "identity", "reputation"];
36
- function getDelegationScopes(credential) {
37
- const scopes = new Set();
38
- for (const scope of credential.credentialSubject.delegation.scopes ?? []) {
39
- scopes.add(scope);
40
- }
41
- for (const scope of credential.credentialSubject.delegation.constraints?.scopes ?? []) {
42
- scopes.add(scope);
43
- }
44
- return Array.from(scopes);
45
- }
46
41
  /**
47
42
  * Strip control characters and cap length on caller-derived values before they
48
43
  * are interpolated into client-facing reasons or log lines. A hostile
@@ -91,44 +86,6 @@ function extractPolicyPrincipal(del) {
91
86
  return { agentDid: "unknown", delegatedScopes: [] };
92
87
  }
93
88
  }
94
- function validateScopeAttenuation(parentCredential, childCredential) {
95
- const parentScopes = getDelegationScopes(parentCredential);
96
- const childScopes = getDelegationScopes(childCredential);
97
- const childDelegation = childCredential.credentialSubject.delegation;
98
- // CRISP matcher attenuation: getDelegationScopes does NOT see constraints.crisp.scopes,
99
- // so a re-delegation could otherwise widen authority by introducing a broad
100
- // prefix/regex matcher (e.g. resource:"" matches every scope). Require the child's
101
- // crisp matchers to be a subset of the parent's (by matcher+resource). Fail closed.
102
- const crispKey = (s) => `${s.matcher}\u0000${s.resource}`;
103
- const parentCrisp = new Set((parentCredential.credentialSubject.delegation.constraints.crisp?.scopes ?? []).map(crispKey));
104
- const widenedCrisp = (childDelegation.constraints.crisp?.scopes ?? []).filter((s) => !parentCrisp.has(crispKey(s)));
105
- if (widenedCrisp.length > 0) {
106
- return {
107
- valid: false,
108
- reason: `Delegation ${childDelegation.id} introduces crisp scope matcher(s) absent from parent ${parentCredential.credentialSubject.delegation.id}: ${widenedCrisp
109
- .map((s) => `${s.matcher}:${s.resource}`)
110
- .join(", ")}`,
111
- };
112
- }
113
- if (parentScopes.length === 0) {
114
- return { valid: true };
115
- }
116
- if (childScopes.length === 0) {
117
- return {
118
- valid: false,
119
- reason: `Delegation ${childDelegation.id} omits scopes required to prove attenuation from parent ${parentCredential.credentialSubject.delegation.id}`,
120
- };
121
- }
122
- const parentScopeSet = new Set(parentScopes);
123
- const widenedScopes = childScopes.filter((scope) => !parentScopeSet.has(scope));
124
- if (widenedScopes.length > 0) {
125
- return {
126
- valid: false,
127
- reason: `Delegation ${childDelegation.id} widens scopes beyond parent ${parentCredential.credentialSubject.delegation.id}: ${widenedScopes.join(", ")}`,
128
- };
129
- }
130
- return { valid: true };
131
- }
132
89
  /**
133
90
  * Create KYA-OS middleware for a standard MCP SDK Server.
134
91
  *
@@ -158,13 +115,33 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
158
115
  privateKey: config.identity.privateKey,
159
116
  publicKey: config.identity.publicKey,
160
117
  };
118
+ // One replay-protection store, shared by the handshake and holder binding.
119
+ // Defaults to in-memory; SessionManager.cleanup() drives its expiry sweep.
120
+ const nonceCache = config.nonceCache ?? new MemoryNonceCacheProvider();
161
121
  const sessionManager = new SessionManager(cryptoProvider, {
162
122
  ...config.session,
163
123
  serverDid: identity.did,
124
+ nonceCache,
164
125
  });
165
126
  const proofGenerator = new ProofGenerator(identity, cryptoProvider);
166
127
  const delegationConfig = config.delegation;
167
128
  const auditLog = config.auditLog ?? new NoopAuditLogProvider();
129
+ // Holder binding (spec §11.8). Built once so all tools share one replay cache.
130
+ // The verifier derives the subject key from the did:key DID directly, so its
131
+ // fetchProvider is unused on the phase-1 path — a never-called stub keeps
132
+ // enforcement active even where a runtime fetch is absent.
133
+ const holderBindingMode = delegationConfig?.holderBinding ?? "off";
134
+ const holderBindingVerifier = holderBindingMode === "off"
135
+ ? undefined
136
+ : new ProofVerifier({
137
+ cryptoProvider,
138
+ clockProvider: new SystemClockProvider(),
139
+ nonceCacheProvider: nonceCache,
140
+ fetchProvider: delegationConfig?.fetchProvider ??
141
+ (typeof globalThis.fetch === "function"
142
+ ? new RuntimeFetchProvider()
143
+ : new NoopFetchProvider()),
144
+ });
168
145
  // Session map: sessionId → last nonce (for proof generation)
169
146
  const sessionNonces = new Map();
170
147
  // Active session tracking — set after handshake (manual or auto)
@@ -526,143 +503,17 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
526
503
  ],
527
504
  isError: true,
528
505
  });
529
- const validateDelegationChain = async (leafCredential, options) => {
530
- // Shape guard (validate* never-throw contract): a structurally malformed
531
- // leaf returns a { valid, reason } result rather than letting
532
- // extractDelegationFromVC OR the downstream scopeSatisfies check throw.
533
- // Requires both credentialSubject.delegation AND .constraints (the
534
- // verifier's own invariant) — the legacy-unsafe path can reach
535
- // scopeSatisfies, which runs OUTSIDE the wrapper's try/catch backstop, so a
536
- // constraints-less leaf must be rejected here. A hostile getter/Proxy
537
- // accessor still throws → caught by the backstop, by design.
538
- const leafDelegationObj = leafCredential?.credentialSubject?.delegation;
539
- if (!leafDelegationObj ||
540
- typeof leafDelegationObj !== "object" ||
541
- !leafDelegationObj.constraints ||
542
- typeof leafDelegationObj.constraints !== "object") {
543
- return {
544
- valid: false,
545
- reason: "Malformed delegation credential: missing credentialSubject.delegation or its constraints",
546
- };
547
- }
548
- const leafDelegation = extractDelegationFromVC(leafCredential);
549
- let chain = [leafCredential];
550
- if (leafDelegation.parentId) {
551
- if (!delegationConfig?.resolveDelegationChain) {
552
- return {
553
- valid: false,
554
- reason: `Delegation ${leafDelegation.id} references parent ${leafDelegation.parentId} but no resolveDelegationChain handler is configured`,
555
- };
556
- }
557
- let resolvedChain;
558
- try {
559
- resolvedChain =
560
- await delegationConfig.resolveDelegationChain(leafCredential);
561
- }
562
- catch (error) {
563
- return {
564
- valid: false,
565
- reason: `Failed to resolve delegation chain: ${error instanceof Error ? error.message : "Unknown error"}`,
566
- };
567
- }
568
- if (resolvedChain.length === 0) {
569
- return {
570
- valid: false,
571
- reason: `Delegation ${leafDelegation.id} references parent ${leafDelegation.parentId} but the resolved chain is empty`,
572
- };
573
- }
574
- const leafIndex = resolvedChain.findIndex((credential) => credential.credentialSubject.delegation.id === leafDelegation.id);
575
- if (leafIndex !== -1 && leafIndex !== resolvedChain.length - 1) {
576
- return {
577
- valid: false,
578
- reason: `Resolved delegation chain for ${leafDelegation.id} must end with the leaf credential`,
579
- };
580
- }
581
- chain =
582
- leafIndex === -1 ? [...resolvedChain, leafCredential] : resolvedChain;
583
- }
584
- const seenIds = new Set();
585
- let previousDelegation;
586
- let previousCredential;
587
- for (const credential of chain) {
588
- const delegation = extractDelegationFromVC(credential);
589
- if (seenIds.has(delegation.id)) {
590
- return {
591
- valid: false,
592
- reason: `Delegation chain contains a circular reference at ${delegation.id}`,
593
- };
594
- }
595
- seenIds.add(delegation.id);
596
- if (credential.credentialStatus && !delegationConfig?.statusListResolver) {
597
- return {
598
- valid: false,
599
- reason: `Delegation ${delegation.id} has credentialStatus but no statusListResolver is configured`,
600
- };
601
- }
602
- const credentialVerification = await verifier.verifyDelegationCredential(credential, {
603
- ...(options?.skipSignature ? { skipSignature: true } : {}),
604
- });
605
- if (!credentialVerification.valid) {
606
- return {
607
- valid: false,
608
- reason: `Delegation ${delegation.id} invalid: ${credentialVerification.reason}`,
609
- };
610
- }
611
- if (!verifyDelegationAudience(delegation, identity.did)) {
612
- return {
613
- valid: false,
614
- reason: `Delegation ${delegation.id} audience does not include server DID ${identity.did}`,
615
- };
616
- }
617
- // Every non-root credential in the chain MUST carry an `audience`
618
- // constraint binding it to the verifying server. This closes the
619
- // confused-deputy class where a re-delegated credential is forwarded
620
- // to an unintended server (KYA-OS §11.6). Unconditional as of 1.4.0.
621
- if (delegation.parentId && !delegation.constraints.audience) {
622
- return {
623
- valid: false,
624
- reason: `Delegation ${delegation.id} is a re-delegation (parentId: ${delegation.parentId}) but has no audience constraint. Re-delegations MUST include an audience constraint (KYA-OS §11.6)`,
625
- };
626
- }
627
- if (!previousDelegation || !previousCredential) {
628
- if (delegation.parentId) {
629
- return {
630
- valid: false,
631
- reason: `Resolved delegation chain is incomplete: root delegation ${delegation.id} still references parent ${delegation.parentId}`,
632
- };
633
- }
634
- previousDelegation = delegation;
635
- previousCredential = credential;
636
- continue;
637
- }
638
- if (delegation.parentId !== previousDelegation.id) {
639
- return {
640
- valid: false,
641
- reason: `Delegation ${delegation.id} references parent ${delegation.parentId} but expected ${previousDelegation.id}`,
642
- };
643
- }
644
- if (delegation.issuerDid !== previousDelegation.subjectDid) {
645
- return {
646
- valid: false,
647
- reason: `Delegation ${delegation.id} issued by ${delegation.issuerDid} but parent subject is ${previousDelegation.subjectDid}`,
648
- };
649
- }
650
- const scopeValidation = validateScopeAttenuation(previousCredential, credential);
651
- if (!scopeValidation.valid) {
652
- return scopeValidation;
653
- }
654
- previousDelegation = delegation;
655
- previousCredential = credential;
656
- }
657
- const finalDelegation = extractDelegationFromVC(chain[chain.length - 1]);
658
- if (finalDelegation.id !== leafDelegation.id) {
659
- return {
660
- valid: false,
661
- reason: `Resolved delegation chain ended at ${finalDelegation.id} instead of leaf ${leafDelegation.id}`,
662
- };
663
- }
664
- return { valid: true };
665
- };
506
+ // Thin adapter over the framework-agnostic core (E3.1 · chain-enforcement.ts).
507
+ // The walk/attenuation/audience/§11.6/revocation rules live in one place;
508
+ // this binds the host's injected verifier + server DID + resolver + the
509
+ // optional graph-backed RevocationChecker.
510
+ const validateDelegationChain = (leafCredential, options) => validateDelegationChainCore(leafCredential, {
511
+ serverDid: identity.did,
512
+ verifier,
513
+ resolveDelegationChain: delegationConfig?.resolveDelegationChain,
514
+ statusListConfigured: !!delegationConfig?.statusListResolver,
515
+ revocationChecker: delegationConfig?.revocationChecker,
516
+ }, options);
666
517
  return async (args, sessionId) => {
667
518
  const delegationArg = args["_kyaos_delegation"];
668
519
  if (delegationArg === undefined || delegationArg === null) {
@@ -763,6 +614,55 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
763
614
  logger.warn(`[kya-os] Delegation verification failed for "${toolName}": ${sanitizeForMessage(reason)}`);
764
615
  return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.delegation_invalid, reason), toolName, args, sessionId, reason);
765
616
  }
617
+ // Holder binding (spec §11.8): the delegation is valid, but a valid
618
+ // *credential* is a bearer token until we also prove the caller holds the
619
+ // delegation SUBJECT's key. Opt-in via `delegation.holderBinding`. did:key
620
+ // subjects are bound here; did:web is deferred to cnf binding (phase 2) and
621
+ // logged, never rejected. Runs after identity is established, before scope.
622
+ if (holderBindingMode !== "off" && holderBindingVerifier) {
623
+ const subjectDid = vc.credentialSubject?.id;
624
+ if (subjectDid && isHolderBindingApplicable(subjectDid)) {
625
+ const proofArg = args["_kyaos_proof"];
626
+ if (proofArg === undefined) {
627
+ const reason = "Holder-of-key proof (_kyaos_proof) is required for this delegation subject";
628
+ logger.warn(`[kya-os] Holder binding: "${toolName}" called without _kyaos_proof`);
629
+ if (holderBindingMode === "enforce") {
630
+ return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.holder_binding_failed, reason), toolName, args, sessionId, reason);
631
+ }
632
+ }
633
+ else {
634
+ let parsedProof = proofArg;
635
+ if (typeof proofArg === "string") {
636
+ try {
637
+ parsedProof = JSON.parse(proofArg);
638
+ }
639
+ catch {
640
+ parsedProof = {};
641
+ }
642
+ }
643
+ const binding = await assertHolderBinding({
644
+ proof: parsedProof,
645
+ subjectDid,
646
+ request: toHolderBindingRequest(toolName, args),
647
+ expectedAudience: identity.did,
648
+ proofVerifier: holderBindingVerifier,
649
+ });
650
+ if (binding.status !== "bound") {
651
+ const reason = binding.reason ??
652
+ "Holder-of-key proof did not bind the delegation subject";
653
+ logger.warn(`[kya-os] Holder binding ${binding.status} for "${toolName}": ${sanitizeForMessage(reason)}`);
654
+ if (holderBindingMode === "enforce") {
655
+ return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.holder_binding_failed, reason), toolName, args, sessionId, reason);
656
+ }
657
+ }
658
+ }
659
+ }
660
+ else if (subjectDid) {
661
+ // Non-did:key subject — phase 1 cannot pin its key; defer to cnf
662
+ // binding (phase 2) rather than reject legitimate traffic.
663
+ logger.warn(`[kya-os] Holder binding: subject "${subjectDid}" is not did:key; deferring to cnf binding (phase 2)`);
664
+ }
665
+ }
766
666
  // Safe to call directly: the structural guard + validateDelegationChain
767
667
  // above guarantee a well-formed credential here, and scopeSatisfies is
768
668
  // bounded (ReDoS-guarded) and returns rather than throws.
@@ -776,10 +676,12 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
776
676
  logger.warn(`[kya-os] Delegation missing required scope "${config.scopeId}" for "${toolName}"`);
777
677
  return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.insufficient_scope, reason), toolName, args, sessionId, reason);
778
678
  }
779
- // Strip _kyaos_delegation from args before passing to handler
679
+ // Strip the reserved _kyaos* control namespace before passing to the
680
+ // handler — same predicate the bound request hash uses, so the handler
681
+ // receives exactly the call the subject signed (no smuggled control arg).
780
682
  const cleanArgs = {};
781
683
  for (const [k, v] of Object.entries(args)) {
782
- if (k !== "_kyaos_delegation")
684
+ if (!isKyaOsControlArg(k))
783
685
  cleanArgs[k] = v;
784
686
  }
785
687
  logger.debug(`[kya-os] Delegation verified for "${toolName}", scope "${config.scopeId}"`);
@@ -802,16 +704,17 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
802
704
  const approvalsKey = opts.approvalsArgKey ?? "_kyaos_approvals";
803
705
  const isValidApprovalSignature = opts.isValidApprovalSignature ?? (async () => false);
804
706
  return async (args, sessionId) => {
805
- const controlKeys = new Set(["_kyaos_delegation", approvalsKey]);
707
+ // Drop the reserved _kyaos* namespace plus the (possibly custom) approvals
708
+ // key, so no control arg reaches the handler.
806
709
  const cleanArgs = {};
807
710
  for (const [k, v] of Object.entries(args)) {
808
- if (!controlKeys.has(k))
711
+ if (!isKyaOsControlArg(k) && k !== approvalsKey)
809
712
  cleanArgs[k] = v;
810
713
  }
811
714
  const namespace = opts.resolveNamespace?.(args) ?? toolName;
812
715
  const risk = classifier.classify({ toolName, namespace });
813
716
  const principal = extractPolicyPrincipal(args["_kyaos_delegation"]);
814
- const policyRequest = {
717
+ const policyRequest = buildPolicyRequest({
815
718
  principal: {
816
719
  agentDid: principal.agentDid,
817
720
  ...(principal.responsibleParty
@@ -820,13 +723,10 @@ export function createKyaOsMiddleware(config, cryptoProvider) {
820
723
  },
821
724
  action: { toolName },
822
725
  resource: { namespace },
823
- context: {
824
- delegatedScopes: principal.delegatedScopes,
825
- scopeMatched: opts.scopeMatched ?? false,
826
- humanApprovals: [],
827
- ...risk,
828
- },
829
- };
726
+ delegatedScopes: principal.delegatedScopes,
727
+ scopeMatched: opts.scopeMatched ?? false,
728
+ risk,
729
+ });
830
730
  const decision = await engine.evaluate(policyRequest);
831
731
  if (decision.decision === "allow") {
832
732
  return handler(cleanArgs, sessionId);