@kya-os/mcp 1.6.1 → 1.9.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.
- package/CHANGELOG.md +117 -0
- package/README.md +228 -3
- package/dist/authz/index.d.ts +1 -0
- package/dist/authz/index.d.ts.map +1 -1
- package/dist/authz/index.js +1 -0
- package/dist/authz/index.js.map +1 -1
- package/dist/authz/oidc/oidc-adapter.d.ts +10 -2
- package/dist/authz/oidc/oidc-adapter.d.ts.map +1 -1
- package/dist/authz/oidc/oidc-adapter.js +18 -9
- package/dist/authz/oidc/oidc-adapter.js.map +1 -1
- package/dist/authz/oidc/pending-flow-store.d.ts +80 -0
- package/dist/authz/oidc/pending-flow-store.d.ts.map +1 -0
- package/dist/authz/oidc/pending-flow-store.js +82 -0
- package/dist/authz/oidc/pending-flow-store.js.map +1 -0
- package/dist/card/build.d.ts +41 -0
- package/dist/card/build.d.ts.map +1 -0
- package/dist/card/build.js +47 -0
- package/dist/card/build.js.map +1 -0
- package/dist/card/builder.d.ts +99 -0
- package/dist/card/builder.d.ts.map +1 -0
- package/dist/card/builder.js +147 -0
- package/dist/card/builder.js.map +1 -0
- package/dist/card/cimd.d.ts +92 -0
- package/dist/card/cimd.d.ts.map +1 -0
- package/dist/card/cimd.js +225 -0
- package/dist/card/cimd.js.map +1 -0
- package/dist/card/delegation.d.ts +145 -0
- package/dist/card/delegation.d.ts.map +1 -0
- package/dist/card/delegation.js +293 -0
- package/dist/card/delegation.js.map +1 -0
- package/dist/card/emit.d.ts +133 -0
- package/dist/card/emit.d.ts.map +1 -0
- package/dist/card/emit.js +127 -0
- package/dist/card/emit.js.map +1 -0
- package/dist/card/index.d.ts +43 -0
- package/dist/card/index.d.ts.map +1 -0
- package/dist/card/index.js +46 -0
- package/dist/card/index.js.map +1 -0
- package/dist/card/middleware.d.ts +112 -0
- package/dist/card/middleware.d.ts.map +1 -0
- package/dist/card/middleware.js +121 -0
- package/dist/card/middleware.js.map +1 -0
- package/dist/card/proof/build.d.ts +22 -0
- package/dist/card/proof/build.d.ts.map +1 -0
- package/dist/card/proof/build.js +55 -0
- package/dist/card/proof/build.js.map +1 -0
- package/dist/card/proof/canonical.d.ts +66 -0
- package/dist/card/proof/canonical.d.ts.map +1 -0
- package/dist/card/proof/canonical.js +131 -0
- package/dist/card/proof/canonical.js.map +1 -0
- package/dist/card/proof/http-sig.d.ts +69 -0
- package/dist/card/proof/http-sig.d.ts.map +1 -0
- package/dist/card/proof/http-sig.js +101 -0
- package/dist/card/proof/http-sig.js.map +1 -0
- package/dist/card/proof/index.d.ts +25 -0
- package/dist/card/proof/index.d.ts.map +1 -0
- package/dist/card/proof/index.js +25 -0
- package/dist/card/proof/index.js.map +1 -0
- package/dist/card/proof/nonce-cache.d.ts +67 -0
- package/dist/card/proof/nonce-cache.d.ts.map +1 -0
- package/dist/card/proof/nonce-cache.js +88 -0
- package/dist/card/proof/nonce-cache.js.map +1 -0
- package/dist/card/proof/signer.d.ts +32 -0
- package/dist/card/proof/signer.d.ts.map +1 -0
- package/dist/card/proof/signer.js +59 -0
- package/dist/card/proof/signer.js.map +1 -0
- package/dist/card/proof/types.d.ts +219 -0
- package/dist/card/proof/types.d.ts.map +1 -0
- package/dist/card/proof/types.js +87 -0
- package/dist/card/proof/types.js.map +1 -0
- package/dist/card/proof/verify.d.ts +27 -0
- package/dist/card/proof/verify.d.ts.map +1 -0
- package/dist/card/proof/verify.js +236 -0
- package/dist/card/proof/verify.js.map +1 -0
- package/dist/card/resolve.d.ts +97 -0
- package/dist/card/resolve.d.ts.map +1 -0
- package/dist/card/resolve.js +223 -0
- package/dist/card/resolve.js.map +1 -0
- package/dist/card/revocation.d.ts +96 -0
- package/dist/card/revocation.d.ts.map +1 -0
- package/dist/card/revocation.js +190 -0
- package/dist/card/revocation.js.map +1 -0
- package/dist/card/schema.d.ts +177 -0
- package/dist/card/schema.d.ts.map +1 -0
- package/dist/card/schema.js +119 -0
- package/dist/card/schema.js.map +1 -0
- package/dist/card/verify.d.ts +144 -0
- package/dist/card/verify.d.ts.map +1 -0
- package/dist/card/verify.js +132 -0
- package/dist/card/verify.js.map +1 -0
- package/dist/delegation/bitstring.d.ts +9 -7
- package/dist/delegation/bitstring.d.ts.map +1 -1
- package/dist/delegation/bitstring.js +70 -37
- package/dist/delegation/bitstring.js.map +1 -1
- package/dist/delegation/did-linkage.d.ts +23 -0
- package/dist/delegation/did-linkage.d.ts.map +1 -0
- package/dist/delegation/did-linkage.js +57 -0
- package/dist/delegation/did-linkage.js.map +1 -0
- package/dist/delegation/did-resolver-registry.d.ts +7 -0
- package/dist/delegation/did-resolver-registry.d.ts.map +1 -0
- package/dist/delegation/did-resolver-registry.js +20 -0
- package/dist/delegation/did-resolver-registry.js.map +1 -0
- package/dist/delegation/did-web-resolver.d.ts +29 -18
- package/dist/delegation/did-web-resolver.d.ts.map +1 -1
- package/dist/delegation/did-web-resolver.js +65 -35
- package/dist/delegation/did-web-resolver.js.map +1 -1
- package/dist/delegation/index.d.ts +3 -0
- package/dist/delegation/index.d.ts.map +1 -1
- package/dist/delegation/index.js +3 -0
- package/dist/delegation/index.js.map +1 -1
- package/dist/delegation/statuslist-manager.d.ts.map +1 -1
- package/dist/delegation/statuslist-manager.js +16 -1
- package/dist/delegation/statuslist-manager.js.map +1 -1
- package/dist/delegation/vc-jwt-verify.d.ts +61 -0
- package/dist/delegation/vc-jwt-verify.d.ts.map +1 -0
- package/dist/delegation/vc-jwt-verify.js +131 -0
- package/dist/delegation/vc-jwt-verify.js.map +1 -0
- package/dist/delegation/vc-verification-checks.d.ts +50 -0
- package/dist/delegation/vc-verification-checks.d.ts.map +1 -0
- package/dist/delegation/vc-verification-checks.js +212 -0
- package/dist/delegation/vc-verification-checks.js.map +1 -0
- package/dist/delegation/vc-verifier.d.ts +24 -61
- package/dist/delegation/vc-verifier.d.ts.map +1 -1
- package/dist/delegation/vc-verifier.js +57 -180
- package/dist/delegation/vc-verifier.js.map +1 -1
- package/dist/delegation/vc-verifier.types.d.ts +88 -0
- package/dist/delegation/vc-verifier.types.d.ts.map +1 -0
- package/dist/delegation/vc-verifier.types.js +9 -0
- package/dist/delegation/vc-verifier.types.js.map +1 -0
- package/dist/index.d.ts +8 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -3
- package/dist/index.js.map +1 -1
- package/dist/integrations/cheqd/dlr.d.ts +44 -0
- package/dist/integrations/cheqd/dlr.d.ts.map +1 -0
- package/dist/integrations/cheqd/dlr.js +86 -0
- package/dist/integrations/cheqd/dlr.js.map +1 -0
- package/dist/integrations/cheqd/index.d.ts +5 -0
- package/dist/integrations/cheqd/index.d.ts.map +1 -0
- package/dist/integrations/cheqd/index.js +5 -0
- package/dist/integrations/cheqd/index.js.map +1 -0
- package/dist/integrations/cheqd/linkage.d.ts +20 -0
- package/dist/integrations/cheqd/linkage.d.ts.map +1 -0
- package/dist/integrations/cheqd/linkage.js +32 -0
- package/dist/integrations/cheqd/linkage.js.map +1 -0
- package/dist/integrations/cheqd/registrar.d.ts +85 -0
- package/dist/integrations/cheqd/registrar.d.ts.map +1 -0
- package/dist/integrations/cheqd/registrar.js +304 -0
- package/dist/integrations/cheqd/registrar.js.map +1 -0
- package/dist/integrations/cheqd/resolver.d.ts +38 -0
- package/dist/integrations/cheqd/resolver.d.ts.map +1 -0
- package/dist/integrations/cheqd/resolver.js +156 -0
- package/dist/integrations/cheqd/resolver.js.map +1 -0
- package/dist/middleware/index.d.ts +2 -0
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +5 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/kya-os-transport.d.ts +2 -1
- package/dist/middleware/kya-os-transport.d.ts.map +1 -1
- package/dist/middleware/kya-os-transport.js +2 -1
- package/dist/middleware/kya-os-transport.js.map +1 -1
- package/dist/middleware/with-kya-os-server.d.ts +21 -4
- package/dist/middleware/with-kya-os-server.d.ts.map +1 -1
- package/dist/middleware/with-kya-os-server.js +4 -0
- package/dist/middleware/with-kya-os-server.js.map +1 -1
- package/dist/middleware/with-kya-os.config-types.d.ts +139 -0
- package/dist/middleware/with-kya-os.config-types.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.config-types.js +9 -0
- package/dist/middleware/with-kya-os.config-types.js.map +1 -0
- package/dist/middleware/with-kya-os.d.ts +10 -238
- package/dist/middleware/with-kya-os.d.ts.map +1 -1
- package/dist/middleware/with-kya-os.delegation-gate.d.ts +19 -0
- package/dist/middleware/with-kya-os.delegation-gate.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.delegation-gate.js +175 -0
- package/dist/middleware/with-kya-os.delegation-gate.js.map +1 -0
- package/dist/middleware/with-kya-os.delegation-verify.d.ts +51 -0
- package/dist/middleware/with-kya-os.delegation-verify.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.delegation-verify.js +165 -0
- package/dist/middleware/with-kya-os.delegation-verify.js.map +1 -0
- package/dist/middleware/with-kya-os.deps.d.ts +40 -0
- package/dist/middleware/with-kya-os.deps.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.deps.js +9 -0
- package/dist/middleware/with-kya-os.deps.js.map +1 -0
- package/dist/middleware/with-kya-os.grants.d.ts +30 -0
- package/dist/middleware/with-kya-os.grants.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.grants.js +145 -0
- package/dist/middleware/with-kya-os.grants.js.map +1 -0
- package/dist/middleware/with-kya-os.helpers.d.ts +24 -0
- package/dist/middleware/with-kya-os.helpers.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.helpers.js +57 -0
- package/dist/middleware/with-kya-os.helpers.js.map +1 -0
- package/dist/middleware/with-kya-os.js +65 -703
- package/dist/middleware/with-kya-os.js.map +1 -1
- package/dist/middleware/with-kya-os.policy-gate.d.ts +16 -0
- package/dist/middleware/with-kya-os.policy-gate.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.policy-gate.js +98 -0
- package/dist/middleware/with-kya-os.policy-gate.js.map +1 -0
- package/dist/middleware/with-kya-os.protocol.d.ts +29 -0
- package/dist/middleware/with-kya-os.protocol.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.protocol.js +121 -0
- package/dist/middleware/with-kya-os.protocol.js.map +1 -0
- package/dist/middleware/with-kya-os.session.d.ts +32 -0
- package/dist/middleware/with-kya-os.session.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.session.js +201 -0
- package/dist/middleware/with-kya-os.session.js.map +1 -0
- package/dist/middleware/with-kya-os.types.d.ts +178 -0
- package/dist/middleware/with-kya-os.types.d.ts.map +1 -0
- package/dist/middleware/with-kya-os.types.js +13 -0
- package/dist/middleware/with-kya-os.types.js.map +1 -0
- package/dist/proof/generator.d.ts +21 -0
- package/dist/proof/generator.d.ts.map +1 -1
- package/dist/proof/generator.js +21 -0
- package/dist/proof/generator.js.map +1 -1
- package/dist/proof/index.d.ts +1 -1
- package/dist/proof/index.d.ts.map +1 -1
- package/dist/proof/index.js +1 -1
- package/dist/proof/index.js.map +1 -1
- package/dist/proof/verifier.d.ts +26 -3
- package/dist/proof/verifier.d.ts.map +1 -1
- package/dist/proof/verifier.js +54 -24
- package/dist/proof/verifier.js.map +1 -1
- package/dist/providers/grant-store.d.ts +10 -1
- package/dist/providers/grant-store.d.ts.map +1 -1
- package/dist/providers/grant-store.js.map +1 -1
- package/dist/providers/runtime-fetch.d.ts +8 -0
- package/dist/providers/runtime-fetch.d.ts.map +1 -1
- package/dist/providers/runtime-fetch.js +17 -0
- package/dist/providers/runtime-fetch.js.map +1 -1
- package/dist/providers/web-crypto.d.ts.map +1 -1
- package/dist/providers/web-crypto.js +15 -7
- package/dist/providers/web-crypto.js.map +1 -1
- package/dist/session/index.d.ts +1 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +1 -0
- package/dist/session/index.js.map +1 -1
- package/dist/session/manager.d.ts +17 -6
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +16 -26
- package/dist/session/manager.js.map +1 -1
- package/dist/session/session-store.d.ts +78 -0
- package/dist/session/session-store.d.ts.map +1 -0
- package/dist/session/session-store.js +79 -0
- package/dist/session/session-store.js.map +1 -0
- package/dist/types/protocol.d.ts +9 -3
- package/dist/types/protocol.d.ts.map +1 -1
- package/dist/types/protocol.js.map +1 -1
- package/dist/utils/guards.d.ts +2 -0
- package/dist/utils/guards.d.ts.map +1 -0
- package/dist/utils/guards.js +4 -0
- package/dist/utils/guards.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +3 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/ip-classifier.d.ts +12 -0
- package/dist/utils/ip-classifier.d.ts.map +1 -0
- package/dist/utils/ip-classifier.js +153 -0
- package/dist/utils/ip-classifier.js.map +1 -0
- package/dist/utils/safe-fetch-transports.d.ts +40 -0
- package/dist/utils/safe-fetch-transports.d.ts.map +1 -0
- package/dist/utils/safe-fetch-transports.js +121 -0
- package/dist/utils/safe-fetch-transports.js.map +1 -0
- package/dist/utils/safe-fetch-types.d.ts +66 -0
- package/dist/utils/safe-fetch-types.d.ts.map +1 -0
- package/dist/utils/safe-fetch-types.js +10 -0
- package/dist/utils/safe-fetch-types.js.map +1 -0
- package/dist/utils/safe-fetch.d.ts +40 -0
- package/dist/utils/safe-fetch.d.ts.map +1 -0
- package/dist/utils/safe-fetch.js +188 -0
- package/dist/utils/safe-fetch.js.map +1 -0
- package/dist/utils/statuslist-purpose.d.ts +12 -0
- package/dist/utils/statuslist-purpose.d.ts.map +1 -0
- package/dist/utils/statuslist-purpose.js +19 -0
- package/dist/utils/statuslist-purpose.js.map +1 -0
- package/dist/utils/url.d.ts +2 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/url.js +8 -0
- package/dist/utils/url.js.map +1 -0
- package/package.json +25 -5
- package/schemas/README.md +2 -1
- package/schemas/card-delegation-credential.json +239 -0
- package/schemas/kya-os-card.schema.json +284 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — the delegation gate (`wrapWithDelegation`).
|
|
3
|
+
*
|
|
4
|
+
* Requires a valid W3C Delegation Credential (or a durable grant / no-paste
|
|
5
|
+
* retry), enforces holder-of-key binding (spec §11.8) and scope, then strips the
|
|
6
|
+
* `_kyaos*` control namespace and runs the handler. Extracted from
|
|
7
|
+
* `./with-kya-os.ts`; verification plumbing lives in `./with-kya-os.delegation-verify.ts`.
|
|
8
|
+
*/
|
|
9
|
+
import { isHolderBindingApplicable, isKyaOsControlArg, assertHolderBinding, toHolderBindingRequest, } from "../delegation/holder-binding.js";
|
|
10
|
+
import { scopeSatisfies } from "../delegation/scope-matcher.js";
|
|
11
|
+
import { parseVCJWT } from "../delegation/utils.js";
|
|
12
|
+
import { logger } from "../logging/index.js";
|
|
13
|
+
import { KYA_OS_ERROR_CODES } from "../errors.js";
|
|
14
|
+
import { sanitizeForMessage } from "./with-kya-os.helpers.js";
|
|
15
|
+
import { createDelegationVerification, } from "./with-kya-os.delegation-verify.js";
|
|
16
|
+
export function createDelegationGate(deps, wiring) {
|
|
17
|
+
const { identity, holderBindingMode, holderBindingVerifier } = deps;
|
|
18
|
+
const { attachOutcomeProof, resolveExistingGrant, bindGrantOnSuccess } = wiring;
|
|
19
|
+
const { validateDelegationChain, buildDelegationErrorResponse, buildNeedsAuthorizationChallenge, } = createDelegationVerification(deps);
|
|
20
|
+
function wrapWithDelegation(toolName, config, handler) {
|
|
21
|
+
return async (args, sessionId) => {
|
|
22
|
+
const delegationArg = args["_kyaos_delegation"];
|
|
23
|
+
if (delegationArg === undefined || delegationArg === null) {
|
|
24
|
+
// No delegation pasted — a durable grant may already authorize this call
|
|
25
|
+
// (the no-paste retry), even on a fresh instance with empty memory.
|
|
26
|
+
// Holder-of-key first (agent-anchored, proof-gated), then the session
|
|
27
|
+
// bearer capability. On a hit, skip the challenge and run the handler
|
|
28
|
+
// with exactly the call shape a verified delegation would have produced.
|
|
29
|
+
const existingGrant = await resolveExistingGrant(toolName, args, sessionId, config.scopeId);
|
|
30
|
+
if (existingGrant) {
|
|
31
|
+
const grantArgs = {};
|
|
32
|
+
for (const [k, v] of Object.entries(args)) {
|
|
33
|
+
if (!isKyaOsControlArg(k))
|
|
34
|
+
grantArgs[k] = v;
|
|
35
|
+
}
|
|
36
|
+
logger.debug(`[kya-os] Grant resolved for "${toolName}" (scope "${config.scopeId}") — no re-paste required`);
|
|
37
|
+
return handler(grantArgs, sessionId, { scopeId: config.scopeId });
|
|
38
|
+
}
|
|
39
|
+
// No delegation provided — sign & return the needs_authorization
|
|
40
|
+
// challenge. The proof binds a responseHash over the EMITTED challenge
|
|
41
|
+
// content (incl. the authorizationUrl), so a verifier that recomputes it
|
|
42
|
+
// over the content it received detects a tampered/MITM-swapped consent
|
|
43
|
+
// URL. Best-effort: attachOutcomeProof no-ops if no session resolves.
|
|
44
|
+
const { challengeContent, message } = await buildNeedsAuthorizationChallenge(toolName, config);
|
|
45
|
+
return attachOutcomeProof({ content: challengeContent }, toolName, args, sessionId, message, "needs_authorization", undefined, challengeContent);
|
|
46
|
+
}
|
|
47
|
+
// Accept delegation as either a JSON object (embedded proof) or a
|
|
48
|
+
// VC-JWT string (compact JWT). The Cloudflare consent service issues
|
|
49
|
+
// VC-JWTs; examples use embedded proofs. Support both transparently.
|
|
50
|
+
let vc;
|
|
51
|
+
let isVCJWT = false;
|
|
52
|
+
if (typeof delegationArg === "string") {
|
|
53
|
+
const parsed = parseVCJWT(delegationArg);
|
|
54
|
+
if (!parsed || !parsed.payload.vc) {
|
|
55
|
+
return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.delegation_invalid, "Invalid VC-JWT format"), toolName, args, sessionId, "Invalid VC-JWT format");
|
|
56
|
+
}
|
|
57
|
+
vc = parsed.payload.vc;
|
|
58
|
+
// VC-JWTs don't have an embedded proof — the JWT signature is the
|
|
59
|
+
// proof. Add a marker so basic validation (which checks for proof
|
|
60
|
+
// presence) passes. The actual signature is in the JWT envelope.
|
|
61
|
+
if (!vc.proof) {
|
|
62
|
+
vc = { ...vc, proof: { type: 'JwtProof2020', jwt: delegationArg } };
|
|
63
|
+
}
|
|
64
|
+
isVCJWT = true;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
vc = delegationArg;
|
|
68
|
+
}
|
|
69
|
+
// For VC-JWTs the embedded-signature check is skipped (the JWT envelope
|
|
70
|
+
// signature is the proof); schema/expiry/status/scope checks still apply.
|
|
71
|
+
// validateDelegationChain performs the shape check and returns
|
|
72
|
+
// { valid, reason } for malformed input, never throwing on normal or
|
|
73
|
+
// structurally-malformed credentials. This try/catch is therefore a PURE
|
|
74
|
+
// BACKSTOP — it fires only on a truly unexpected throw (e.g. a hostile
|
|
75
|
+
// getter/Proxy accessor or a provider fault): it logs the detail
|
|
76
|
+
// server-side and returns a GENERIC reason, so no internal/implementation
|
|
77
|
+
// detail (stack, raw error text) leaks to the client or the signed proof.
|
|
78
|
+
const verificationResult = await (async () => {
|
|
79
|
+
try {
|
|
80
|
+
return await validateDelegationChain(vc, { skipSignature: isVCJWT });
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error("[kya-os] Unexpected error verifying delegation", {
|
|
84
|
+
tool: toolName,
|
|
85
|
+
error: error instanceof Error ? error.message : String(error),
|
|
86
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
87
|
+
});
|
|
88
|
+
return { valid: false, reason: "Delegation credential could not be verified" };
|
|
89
|
+
}
|
|
90
|
+
})();
|
|
91
|
+
if (!verificationResult.valid) {
|
|
92
|
+
const reason = verificationResult.reason ?? "Unknown delegation validation error";
|
|
93
|
+
logger.warn(`[kya-os] Delegation verification failed for "${toolName}": ${sanitizeForMessage(reason)}`);
|
|
94
|
+
return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.delegation_invalid, reason), toolName, args, sessionId, reason);
|
|
95
|
+
}
|
|
96
|
+
// Holder binding (spec §11.8): the delegation is valid, but a valid
|
|
97
|
+
// *credential* is a bearer token until we also prove the caller holds the
|
|
98
|
+
// delegation SUBJECT's key. Opt-in via `delegation.holderBinding`. did:key
|
|
99
|
+
// subjects are bound here; did:web is deferred to cnf binding (phase 2) and
|
|
100
|
+
// logged, never rejected. Runs after identity is established, before scope.
|
|
101
|
+
if (holderBindingMode !== "off" && holderBindingVerifier) {
|
|
102
|
+
const subjectDid = vc.credentialSubject?.id;
|
|
103
|
+
if (subjectDid && isHolderBindingApplicable(subjectDid)) {
|
|
104
|
+
const proofArg = args["_kyaos_proof"];
|
|
105
|
+
if (proofArg === undefined) {
|
|
106
|
+
const reason = "Holder-of-key proof (_kyaos_proof) is required for this delegation subject";
|
|
107
|
+
logger.warn(`[kya-os] Holder binding: "${toolName}" called without _kyaos_proof`);
|
|
108
|
+
if (holderBindingMode === "enforce") {
|
|
109
|
+
return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.holder_binding_failed, reason), toolName, args, sessionId, reason);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
let parsedProof = proofArg;
|
|
114
|
+
if (typeof proofArg === "string") {
|
|
115
|
+
try {
|
|
116
|
+
parsedProof = JSON.parse(proofArg);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
parsedProof = {};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const binding = await assertHolderBinding({
|
|
123
|
+
proof: parsedProof,
|
|
124
|
+
subjectDid,
|
|
125
|
+
request: toHolderBindingRequest(toolName, args),
|
|
126
|
+
expectedAudience: identity.did,
|
|
127
|
+
proofVerifier: holderBindingVerifier,
|
|
128
|
+
});
|
|
129
|
+
if (binding.status !== "bound") {
|
|
130
|
+
const reason = binding.reason ??
|
|
131
|
+
"Holder-of-key proof did not bind the delegation subject";
|
|
132
|
+
logger.warn(`[kya-os] Holder binding ${binding.status} for "${toolName}": ${sanitizeForMessage(reason)}`);
|
|
133
|
+
if (holderBindingMode === "enforce") {
|
|
134
|
+
return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.holder_binding_failed, reason), toolName, args, sessionId, reason);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (subjectDid) {
|
|
140
|
+
// Non-did:key subject — phase 1 cannot pin its key; defer to cnf
|
|
141
|
+
// binding (phase 2) rather than reject legitimate traffic.
|
|
142
|
+
logger.warn(`[kya-os] Holder binding: subject "${subjectDid}" is not did:key; deferring to cnf binding (phase 2)`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Safe to call directly: the structural guard + validateDelegationChain
|
|
146
|
+
// above guarantee a well-formed credential here, and scopeSatisfies is
|
|
147
|
+
// bounded (ReDoS-guarded) and returns rather than throws.
|
|
148
|
+
const scopeResult = scopeSatisfies(config.scopeId, vc);
|
|
149
|
+
if (scopeResult.usedNonExactMatcher) {
|
|
150
|
+
logger.warn(`[kya-os] Scope "${config.scopeId}" for "${toolName}" granted via a non-exact ` +
|
|
151
|
+
`(prefix/regex) matcher. Verify this is intended — non-exact matchers widen authority.`);
|
|
152
|
+
}
|
|
153
|
+
if (!scopeResult.satisfied) {
|
|
154
|
+
const reason = `Required scope "${config.scopeId}" not in delegation scopes`;
|
|
155
|
+
logger.warn(`[kya-os] Delegation missing required scope "${config.scopeId}" for "${toolName}"`);
|
|
156
|
+
return attachOutcomeProof(buildDelegationErrorResponse(KYA_OS_ERROR_CODES.insufficient_scope, reason), toolName, args, sessionId, reason);
|
|
157
|
+
}
|
|
158
|
+
// Strip the reserved _kyaos* control namespace before passing to the
|
|
159
|
+
// handler — same predicate the bound request hash uses, so the handler
|
|
160
|
+
// receives exactly the call the subject signed (no smuggled control arg).
|
|
161
|
+
const cleanArgs = {};
|
|
162
|
+
for (const [k, v] of Object.entries(args)) {
|
|
163
|
+
if (!isKyaOsControlArg(k))
|
|
164
|
+
cleanArgs[k] = v;
|
|
165
|
+
}
|
|
166
|
+
// Mint a durable grant from this verified delegation so the next call —
|
|
167
|
+
// on any instance — resolves via resolveExistingGrant with no re-paste.
|
|
168
|
+
await bindGrantOnSuccess(vc, delegationArg, isVCJWT, sessionId, config.scopeId);
|
|
169
|
+
logger.debug(`[kya-os] Delegation verified for "${toolName}", scope "${config.scopeId}"`);
|
|
170
|
+
return handler(cleanArgs, sessionId, { scopeId: config.scopeId });
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
return { wrapWithDelegation };
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=with-kya-os.delegation-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.delegation-gate.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAKpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAOlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,4BAA4B,GAE7B,MAAM,oCAAoC,CAAC;AAS5C,MAAM,UAAU,oBAAoB,CAClC,IAAoB,EACpB,MAA4B;IAE5B,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,GAAG,IAAI,CAAC;IACpE,MAAM,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,GACpE,MAAM,CAAC;IACT,MAAM,EACJ,uBAAuB,EACvB,4BAA4B,EAC5B,gCAAgC,GACjC,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAEvC,SAAS,kBAAkB,CACzB,QAAgB,EAChB,MAA4B,EAC5B,OAAyB;QAEzB,OAAO,KAAK,EAAE,IAA6B,EAAE,SAAkB,EAAE,EAAE;YACjE,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAEhD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC1D,yEAAyE;gBACzE,oEAAoE;gBACpE,sEAAsE;gBACtE,sEAAsE;gBACtE,yEAAyE;gBACzE,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC9C,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,CAAC,OAAO,CACf,CAAC;gBACF,IAAI,aAAa,EAAE,CAAC;oBAClB,MAAM,SAAS,GAA4B,EAAE,CAAC;oBAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBAC1C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;4BAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC9C,CAAC;oBACD,MAAM,CAAC,KAAK,CACV,gCAAgC,QAAQ,aAAa,MAAM,CAAC,OAAO,2BAA2B,CAC/F,CAAC;oBACF,OAAO,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACpE,CAAC;gBAED,iEAAiE;gBACjE,uEAAuE;gBACvE,yEAAyE;gBACzE,uEAAuE;gBACvE,sEAAsE;gBACtE,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,GACjC,MAAM,gCAAgC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC3D,OAAO,kBAAkB,CACvB,EAAE,OAAO,EAAE,gBAAgB,EAAE,EAC7B,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,OAAO,EACP,qBAAqB,EACrB,SAAS,EACT,gBAAgB,CACjB,CAAC;YACJ,CAAC;YAED,kEAAkE;YAClE,qEAAqE;YACrE,qEAAqE;YACrE,IAAI,EAAwB,CAAC;YAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;gBACzC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;oBAClC,OAAO,kBAAkB,CACvB,4BAA4B,CAC1B,kBAAkB,CAAC,kBAAkB,EACrC,uBAAuB,CACxB,EACD,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,uBAAuB,CACxB,CAAC;gBACJ,CAAC;gBACD,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAA0B,CAAC;gBAC/C,kEAAkE;gBAClE,kEAAkE;gBAClE,iEAAiE;gBACjE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;oBACd,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC;gBACtE,CAAC;gBACD,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,aAAqC,CAAC;YAC7C,CAAC;YAED,wEAAwE;YACxE,0EAA0E;YAC1E,+DAA+D;YAC/D,qEAAqE;YACrE,yEAAyE;YACzE,uEAAuE;YACvE,iEAAiE;YACjE,0EAA0E;YAC1E,0EAA0E;YAC1E,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,IAGpC,EAAE;gBACH,IAAI,CAAC;oBACH,OAAO,MAAM,uBAAuB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE;wBAC7D,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;wBAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;qBACxD,CAAC,CAAC;oBACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,6CAA6C,EAAE,CAAC;gBACjF,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,IAAI,qCAAqC,CAAC;gBAClF,MAAM,CAAC,IAAI,CACT,gDAAgD,QAAQ,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAC3F,CAAC;gBACF,OAAO,kBAAkB,CACvB,4BAA4B,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAC3E,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,CACP,CAAC;YACJ,CAAC;YAED,oEAAoE;YACpE,0EAA0E;YAC1E,2EAA2E;YAC3E,4EAA4E;YAC5E,4EAA4E;YAC5E,IAAI,iBAAiB,KAAK,KAAK,IAAI,qBAAqB,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBAC5C,IAAI,UAAU,IAAI,yBAAyB,CAAC,UAAU,CAAC,EAAE,CAAC;oBACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;oBACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC3B,MAAM,MAAM,GACV,4EAA4E,CAAC;wBAC/E,MAAM,CAAC,IAAI,CACT,6BAA6B,QAAQ,+BAA+B,CACrE,CAAC;wBACF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;4BACpC,OAAO,kBAAkB,CACvB,4BAA4B,CAC1B,kBAAkB,CAAC,qBAAqB,EACxC,MAAM,CACP,EACD,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,CACP,CAAC;wBACJ,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,IAAI,WAAW,GAAY,QAAQ,CAAC;wBACpC,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;4BACjC,IAAI,CAAC;gCACH,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;4BACrC,CAAC;4BAAC,MAAM,CAAC;gCACP,WAAW,GAAG,EAAE,CAAC;4BACnB,CAAC;wBACH,CAAC;wBACD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;4BACxC,KAAK,EAAE,WAA4B;4BACnC,UAAU;4BACV,OAAO,EAAE,sBAAsB,CAAC,QAAQ,EAAE,IAAI,CAAC;4BAC/C,gBAAgB,EAAE,QAAQ,CAAC,GAAG;4BAC9B,aAAa,EAAE,qBAAqB;yBACrC,CAAC,CAAC;wBACH,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;4BAC/B,MAAM,MAAM,GACV,OAAO,CAAC,MAAM;gCACd,yDAAyD,CAAC;4BAC5D,MAAM,CAAC,IAAI,CACT,2BAA2B,OAAO,CAAC,MAAM,SAAS,QAAQ,MAAM,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAC7F,CAAC;4BACF,IAAI,iBAAiB,KAAK,SAAS,EAAE,CAAC;gCACpC,OAAO,kBAAkB,CACvB,4BAA4B,CAC1B,kBAAkB,CAAC,qBAAqB,EACxC,MAAM,CACP,EACD,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,CACP,CAAC;4BACJ,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;qBAAM,IAAI,UAAU,EAAE,CAAC;oBACtB,iEAAiE;oBACjE,2DAA2D;oBAC3D,MAAM,CAAC,IAAI,CACT,qCAAqC,UAAU,sDAAsD,CACtG,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,uEAAuE;YACvE,0DAA0D;YAC1D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACvD,IAAI,WAAW,CAAC,mBAAmB,EAAE,CAAC;gBACpC,MAAM,CAAC,IAAI,CACT,mBAAmB,MAAM,CAAC,OAAO,UAAU,QAAQ,4BAA4B;oBAC7E,uFAAuF,CAC1F,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,mBAAmB,MAAM,CAAC,OAAO,4BAA4B,CAAC;gBAC7E,MAAM,CAAC,IAAI,CACT,+CAA+C,MAAM,CAAC,OAAO,UAAU,QAAQ,GAAG,CACnF,CAAC;gBACF,OAAO,kBAAkB,CACvB,4BAA4B,CAAC,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,CAAC,EAC3E,QAAQ,EACR,IAAI,EACJ,SAAS,EACT,MAAM,CACP,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,uEAAuE;YACvE,0EAA0E;YAC1E,MAAM,SAAS,GAA4B,EAAE,CAAC;YAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBAAE,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC;YAED,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,kBAAkB,CAAC,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAEhF,MAAM,CAAC,KAAK,CACV,qCAAqC,QAAQ,aAAa,MAAM,CAAC,OAAO,GAAG,CAC5E,CAAC;YACF,OAAO,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — delegation verification plumbing.
|
|
3
|
+
*
|
|
4
|
+
* Builds the DID resolver, the embedded-proof signature verifier, the
|
|
5
|
+
* `DelegationCredentialVerifier`, and the framework-agnostic chain-validation
|
|
6
|
+
* adapter (chain-enforcement.ts) once per middleware instance. Extracted from
|
|
7
|
+
* `wrapWithDelegation` so the gate module holds only the request flow.
|
|
8
|
+
*/
|
|
9
|
+
import { type DelegationCredential, type NeedsAuthorizationError } from "../types/protocol.js";
|
|
10
|
+
import type { KyaOsToolHandler } from "./with-kya-os.types.js";
|
|
11
|
+
import type { MiddlewareDeps } from "./with-kya-os.deps.js";
|
|
12
|
+
/** Per-tool delegation-gate config shared by the gate + its challenge builder. */
|
|
13
|
+
export interface DelegationGateConfig {
|
|
14
|
+
scopeId: string;
|
|
15
|
+
consentUrl: string;
|
|
16
|
+
formatChallenge?: (challenge: NeedsAuthorizationError) => Array<{
|
|
17
|
+
type: "text";
|
|
18
|
+
text: string;
|
|
19
|
+
}>;
|
|
20
|
+
}
|
|
21
|
+
export interface DelegationVerification {
|
|
22
|
+
/**
|
|
23
|
+
* Thin adapter over the framework-agnostic core (chain-enforcement.ts): binds
|
|
24
|
+
* the host's injected verifier + server DID + resolver + the optional
|
|
25
|
+
* graph-backed RevocationChecker. Returns `{ valid, reason }`, never throws on
|
|
26
|
+
* normal or structurally-malformed credentials.
|
|
27
|
+
*/
|
|
28
|
+
validateDelegationChain(leafCredential: DelegationCredential, options?: {
|
|
29
|
+
skipSignature?: boolean;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
valid: boolean;
|
|
32
|
+
reason?: string;
|
|
33
|
+
}>;
|
|
34
|
+
/** A structured `{ error, reason }` tool response with a sanitized reason. */
|
|
35
|
+
buildDelegationErrorResponse(error: string, reason: string): Awaited<ReturnType<KyaOsToolHandler>>;
|
|
36
|
+
/**
|
|
37
|
+
* Build the signed-later `needs_authorization` challenge for a call that
|
|
38
|
+
* arrived without a delegation or resolvable grant: a fresh resume token, a
|
|
39
|
+
* 5-minute expiry, and the emitted content (respecting `config.formatChallenge`,
|
|
40
|
+
* which falls back to the default JSON challenge if it throws).
|
|
41
|
+
*/
|
|
42
|
+
buildNeedsAuthorizationChallenge(toolName: string, config: DelegationGateConfig): Promise<{
|
|
43
|
+
challengeContent: Array<{
|
|
44
|
+
type: "text";
|
|
45
|
+
text: string;
|
|
46
|
+
}>;
|
|
47
|
+
message: string;
|
|
48
|
+
}>;
|
|
49
|
+
}
|
|
50
|
+
export declare function createDelegationVerification(deps: MiddlewareDeps): DelegationVerification;
|
|
51
|
+
//# sourceMappingURL=with-kya-os.delegation-verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.delegation-verify.d.ts","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAiBH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAG5D,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,CAChB,SAAS,EAAE,uBAAuB,KAC/B,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,uBAAuB,CACrB,cAAc,EAAE,oBAAoB,EACpC,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GACpC,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,8EAA8E;IAC9E,4BAA4B,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACzC;;;;;OAKG;IACH,gCAAgC,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC;QACT,gBAAgB,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxD,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,cAAc,GACnB,sBAAsB,CAuLxB"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — delegation verification plumbing.
|
|
3
|
+
*
|
|
4
|
+
* Builds the DID resolver, the embedded-proof signature verifier, the
|
|
5
|
+
* `DelegationCredentialVerifier`, and the framework-agnostic chain-validation
|
|
6
|
+
* adapter (chain-enforcement.ts) once per middleware instance. Extracted from
|
|
7
|
+
* `wrapWithDelegation` so the gate module holds only the request flow.
|
|
8
|
+
*/
|
|
9
|
+
import { createDidKeyResolver } from "../delegation/did-key-resolver.js";
|
|
10
|
+
import { createDidWebResolver } from "../delegation/did-web-resolver.js";
|
|
11
|
+
import { buildDidResolverRegistry, } from "../delegation/did-resolver-registry.js";
|
|
12
|
+
import { getDidMethod } from "../utils/did-helpers.js";
|
|
13
|
+
import { DelegationCredentialVerifier, } from "../delegation/vc-verifier.js";
|
|
14
|
+
import { validateDelegationChain as validateDelegationChainCore } from "../delegation/chain-enforcement.js";
|
|
15
|
+
import { RuntimeFetchProvider } from "../providers/runtime-fetch.js";
|
|
16
|
+
import { canonicalizeJSON } from "../delegation/utils.js";
|
|
17
|
+
import { base64urlDecodeToBytes, bytesToBase64 } from "../utils/base64.js";
|
|
18
|
+
import { createNeedsAuthorizationError, } from "../types/protocol.js";
|
|
19
|
+
import { logger } from "../logging/index.js";
|
|
20
|
+
import { sanitizeForMessage } from "./with-kya-os.helpers.js";
|
|
21
|
+
export function createDelegationVerification(deps) {
|
|
22
|
+
const { identity, cryptoProvider, delegationConfig } = deps;
|
|
23
|
+
const didKeyResolver = createDidKeyResolver();
|
|
24
|
+
const fetchProvider = delegationConfig?.fetchProvider ??
|
|
25
|
+
(typeof globalThis.fetch === "function"
|
|
26
|
+
? new RuntimeFetchProvider()
|
|
27
|
+
: undefined);
|
|
28
|
+
const didWebResolver = fetchProvider
|
|
29
|
+
? createDidWebResolver(fetchProvider)
|
|
30
|
+
: undefined;
|
|
31
|
+
const configuredDidResolvers = buildDidResolverRegistry(delegationConfig?.didResolvers, fetchProvider);
|
|
32
|
+
const didResolver = {
|
|
33
|
+
async resolve(did) {
|
|
34
|
+
const customResolver = delegationConfig?.didResolver;
|
|
35
|
+
if (customResolver) {
|
|
36
|
+
const resolved = await customResolver.resolve(did);
|
|
37
|
+
if (resolved) {
|
|
38
|
+
return resolved;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const method = getDidMethod(did);
|
|
42
|
+
const configuredResolver = method ? configuredDidResolvers[method] : undefined;
|
|
43
|
+
if (configuredResolver) {
|
|
44
|
+
try {
|
|
45
|
+
const resolved = await configuredResolver.resolve(did);
|
|
46
|
+
if (resolved) {
|
|
47
|
+
return resolved;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (did.startsWith("did:key:")) {
|
|
55
|
+
return didKeyResolver.resolve(did);
|
|
56
|
+
}
|
|
57
|
+
if (did.startsWith("did:web:")) {
|
|
58
|
+
return didWebResolver?.resolve(did) ?? null;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
const signatureVerifier = async (vc, publicKeyJwk) => {
|
|
64
|
+
const proof = vc.proof;
|
|
65
|
+
if (!proof) {
|
|
66
|
+
return { valid: false, reason: "Missing proof" };
|
|
67
|
+
}
|
|
68
|
+
const proofValue = proof["proofValue"];
|
|
69
|
+
if (!proofValue) {
|
|
70
|
+
return { valid: false, reason: "Missing proofValue in proof" };
|
|
71
|
+
}
|
|
72
|
+
// Reconstruct the unsigned VC (without proof) for signature verification
|
|
73
|
+
const vcRecord = vc;
|
|
74
|
+
const vcWithoutProof = {};
|
|
75
|
+
for (const [k, v] of Object.entries(vcRecord)) {
|
|
76
|
+
if (k !== "proof")
|
|
77
|
+
vcWithoutProof[k] = v;
|
|
78
|
+
}
|
|
79
|
+
const canonical = canonicalizeJSON(vcWithoutProof);
|
|
80
|
+
const data = new TextEncoder().encode(canonical);
|
|
81
|
+
// Decode signature from base64url proof value
|
|
82
|
+
const sigBytes = base64urlDecodeToBytes(proofValue);
|
|
83
|
+
// Get public key from JWK (x is base64url-encoded raw key bytes)
|
|
84
|
+
const jwk = publicKeyJwk;
|
|
85
|
+
if (!jwk.x) {
|
|
86
|
+
return { valid: false, reason: "No x field in publicKeyJwk" };
|
|
87
|
+
}
|
|
88
|
+
// Convert base64url key to standard base64 for the crypto provider
|
|
89
|
+
const pubKeyBytes = base64urlDecodeToBytes(jwk.x);
|
|
90
|
+
const pubKeyBase64 = bytesToBase64(pubKeyBytes);
|
|
91
|
+
const valid = await cryptoProvider.verify(data, sigBytes, pubKeyBase64);
|
|
92
|
+
return {
|
|
93
|
+
valid,
|
|
94
|
+
reason: valid ? undefined : "Signature verification failed",
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
const verifier = new DelegationCredentialVerifier({
|
|
98
|
+
didResolver,
|
|
99
|
+
signatureVerifier,
|
|
100
|
+
statusListResolver: delegationConfig?.statusListResolver,
|
|
101
|
+
});
|
|
102
|
+
const buildDelegationErrorResponse = (error, reason) => ({
|
|
103
|
+
content: [
|
|
104
|
+
{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: JSON.stringify({ error, reason: sanitizeForMessage(reason) }),
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
isError: true,
|
|
110
|
+
});
|
|
111
|
+
const validateDelegationChain = (leafCredential, options) => validateDelegationChainCore(leafCredential, {
|
|
112
|
+
serverDid: identity.did,
|
|
113
|
+
verifier,
|
|
114
|
+
resolveDelegationChain: delegationConfig?.resolveDelegationChain,
|
|
115
|
+
statusListConfigured: !!delegationConfig?.statusListResolver,
|
|
116
|
+
revocationChecker: delegationConfig?.revocationChecker,
|
|
117
|
+
}, options);
|
|
118
|
+
async function buildNeedsAuthorizationChallenge(toolName, config) {
|
|
119
|
+
const tokenBytes = await cryptoProvider.randomBytes(16);
|
|
120
|
+
const hex = Array.from(tokenBytes)
|
|
121
|
+
.map((b) => b.toString(16).padStart(2, "0"))
|
|
122
|
+
.join("");
|
|
123
|
+
const resumeToken = [
|
|
124
|
+
hex.slice(0, 8),
|
|
125
|
+
hex.slice(8, 12),
|
|
126
|
+
hex.slice(12, 16),
|
|
127
|
+
hex.slice(16, 20),
|
|
128
|
+
hex.slice(20),
|
|
129
|
+
].join("-");
|
|
130
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 300;
|
|
131
|
+
const authError = createNeedsAuthorizationError({
|
|
132
|
+
message: `Tool "${toolName}" requires delegation with scope: ${config.scopeId}`,
|
|
133
|
+
authorizationUrl: config.consentUrl,
|
|
134
|
+
resumeToken,
|
|
135
|
+
expiresAt,
|
|
136
|
+
scopes: [config.scopeId],
|
|
137
|
+
});
|
|
138
|
+
// config.formatChallenge lets a server render the challenge (e.g. a markdown
|
|
139
|
+
// link for LLM clients) BEFORE it is signed, so the proof binds exactly what
|
|
140
|
+
// the client receives. A throwing hook falls back to the default challenge.
|
|
141
|
+
const defaultChallengeContent = [
|
|
142
|
+
{ type: "text", text: JSON.stringify(authError) },
|
|
143
|
+
];
|
|
144
|
+
let challengeContent = defaultChallengeContent;
|
|
145
|
+
if (config.formatChallenge) {
|
|
146
|
+
try {
|
|
147
|
+
challengeContent = config.formatChallenge(authError);
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
logger.error("[kya-os] formatChallenge threw; using the default challenge", {
|
|
151
|
+
tool: toolName,
|
|
152
|
+
error: error instanceof Error ? error.message : String(error),
|
|
153
|
+
});
|
|
154
|
+
challengeContent = defaultChallengeContent;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return { challengeContent, message: authError.message };
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
validateDelegationChain,
|
|
161
|
+
buildDelegationErrorResponse,
|
|
162
|
+
buildNeedsAuthorizationChallenge,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=with-kya-os.delegation-verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.delegation-verify.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — the internal dependency bag.
|
|
3
|
+
*
|
|
4
|
+
* `createKyaOsMiddleware` constructs these collaborators once and threads this
|
|
5
|
+
* bag into each sub-factory (session/proof, grant-resolution, delegation-gate,
|
|
6
|
+
* policy-gate). Internal to the middleware package — not part of the public API.
|
|
7
|
+
*/
|
|
8
|
+
import type { CryptoProvider } from "../providers/base.js";
|
|
9
|
+
import type { AuditLogProvider } from "../providers/audit-log.js";
|
|
10
|
+
import type { GrantStore } from "../providers/grant-store.js";
|
|
11
|
+
import type { SessionManager } from "../session/manager.js";
|
|
12
|
+
import type { ProofGenerator, ProofAgentIdentity } from "../proof/generator.js";
|
|
13
|
+
import type { ProofVerifier } from "../proof/verifier.js";
|
|
14
|
+
import type { KyaOsConfig, KyaOsDelegationConfig, KyaOsToolHandler } from "./with-kya-os.types.js";
|
|
15
|
+
/**
|
|
16
|
+
* Attach a signed proof recording an authorization OUTCOME (denied / step-up /
|
|
17
|
+
* needs-authorization) to a response. Provided by the session/proof sub-factory
|
|
18
|
+
* and consumed by the delegation- and policy-gate sub-factories, so it is typed
|
|
19
|
+
* here as the shared internal contract between them.
|
|
20
|
+
*/
|
|
21
|
+
export type AttachOutcomeProof = (response: Awaited<ReturnType<KyaOsToolHandler>>, toolName: string, args: Record<string, unknown>, sessionId: string | undefined, reason: string, outcome?: "denied" | "step_up_required" | "needs_authorization", paramsOverride?: Record<string, unknown>, responseData?: unknown) => Promise<Awaited<ReturnType<KyaOsToolHandler>>>;
|
|
22
|
+
/** The constructed dependencies shared across the middleware sub-factories. */
|
|
23
|
+
export interface MiddlewareDeps {
|
|
24
|
+
/** Proof-generation identity (DID + key material). */
|
|
25
|
+
identity: ProofAgentIdentity;
|
|
26
|
+
/** The full user config (for `identity.agentName`, `autoSession`, …). */
|
|
27
|
+
config: KyaOsConfig;
|
|
28
|
+
cryptoProvider: CryptoProvider;
|
|
29
|
+
sessionManager: SessionManager;
|
|
30
|
+
proofGenerator: ProofGenerator;
|
|
31
|
+
auditLog: AuditLogProvider;
|
|
32
|
+
grantStore: GrantStore;
|
|
33
|
+
delegationConfig: KyaOsDelegationConfig | undefined;
|
|
34
|
+
holderBindingMode: "off" | "warn" | "enforce";
|
|
35
|
+
/** Present iff holder binding is enabled; the inbound per-request proof verifier. */
|
|
36
|
+
holderBindingVerifier: ProofVerifier | undefined;
|
|
37
|
+
/** Mirror the proof under the legacy bare `_meta.proof` key (pre-1.1 back-compat). */
|
|
38
|
+
emitLegacyProofKey: boolean;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=with-kya-os.deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.deps.d.ts","sourceRoot":"","sources":["../../src/middleware/with-kya-os.deps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAC/C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,QAAQ,GAAG,kBAAkB,GAAG,qBAAqB,EAC/D,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,YAAY,CAAC,EAAE,OAAO,KACnB,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEpD,+EAA+E;AAC/E,MAAM,WAAW,cAAc;IAC7B,sDAAsD;IACtD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,yEAAyE;IACzE,MAAM,EAAE,WAAW,CAAC;IACpB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,UAAU,CAAC;IACvB,gBAAgB,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACpD,iBAAiB,EAAE,KAAK,GAAG,MAAM,GAAG,SAAS,CAAC;IAC9C,qFAAqF;IACrF,qBAAqB,EAAE,aAAa,GAAG,SAAS,CAAC;IACjD,sFAAsF;IACtF,kBAAkB,EAAE,OAAO,CAAC;CAC7B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — the internal dependency bag.
|
|
3
|
+
*
|
|
4
|
+
* `createKyaOsMiddleware` constructs these collaborators once and threads this
|
|
5
|
+
* bag into each sub-factory (session/proof, grant-resolution, delegation-gate,
|
|
6
|
+
* policy-gate). Internal to the middleware package — not part of the public API.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=with-kya-os.deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.deps.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.deps.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KYA-OS Middleware — durable-grant resolution (the no-paste retry).
|
|
3
|
+
*
|
|
4
|
+
* Resolves and mints agent-anchored / session-bound authorization grants so a
|
|
5
|
+
* verified delegation need not be re-pasted on the next call — even on a fresh
|
|
6
|
+
* instance with empty memory. Extracted from `./with-kya-os.ts`; depends only on
|
|
7
|
+
* the immutable {@link MiddlewareDeps} (no shared session state).
|
|
8
|
+
*/
|
|
9
|
+
import type { Grant } from "../providers/grant-store.js";
|
|
10
|
+
import type { DelegationCredential } from "../types/protocol.js";
|
|
11
|
+
import type { MiddlewareDeps } from "./with-kya-os.deps.js";
|
|
12
|
+
export interface GrantResolution {
|
|
13
|
+
/**
|
|
14
|
+
* Resolve an existing durable grant for a no-delegation (retry) call, so a
|
|
15
|
+
* fresh instance with empty memory authorizes the retry from the shared store.
|
|
16
|
+
* Fail-closed, holder-of-key first (agent-anchored, portable), then the
|
|
17
|
+
* session bearer capability. Returns undefined to fall through to the
|
|
18
|
+
* needs_authorization challenge.
|
|
19
|
+
*/
|
|
20
|
+
resolveExistingGrant(toolName: string, args: Record<string, unknown>, sessionId: string | undefined, scopeId: string): Promise<Grant | undefined>;
|
|
21
|
+
/**
|
|
22
|
+
* Mint a durable grant from a freshly-verified delegation so the NEXT call —
|
|
23
|
+
* on any instance — resolves via {@link resolveExistingGrant} without
|
|
24
|
+
* re-pasting the VC. Best-effort: a store failure must not break the
|
|
25
|
+
* already-authorized response.
|
|
26
|
+
*/
|
|
27
|
+
bindGrantOnSuccess(vc: DelegationCredential, delegationArg: unknown, isVCJWT: boolean, sessionId: string | undefined, scopeId: string): Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export declare function createGrantResolution(deps: MiddlewareDeps): GrantResolution;
|
|
30
|
+
//# sourceMappingURL=with-kya-os.grants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-kya-os.grants.d.ts","sourceRoot":"","sources":["../../src/middleware/with-kya-os.grants.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EACV,oBAAoB,EAErB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,oBAAoB,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAC9B;;;;;OAKG;IACH,kBAAkB,CAChB,EAAE,EAAE,oBAAoB,EACxB,aAAa,EAAE,OAAO,EACtB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,CAiK3E"}
|