@kya-os/mcp-i-cloudflare 1.13.2 → 1.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dist/agent.d.ts +7 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +73 -7
- package/dist/agent.js.map +1 -1
- package/dist/constants/storage-keys.d.ts +37 -0
- package/dist/constants/storage-keys.d.ts.map +1 -1
- package/dist/constants/storage-keys.js +50 -0
- package/dist/constants/storage-keys.js.map +1 -1
- package/dist/runtime/oauth-handler.d.ts.map +1 -1
- package/dist/runtime/oauth-handler.js +91 -12
- package/dist/runtime/oauth-handler.js.map +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +17 -0
- package/dist/runtime.js.map +1 -1
- package/dist/services/batch-queue.d.ts +3 -1
- package/dist/services/batch-queue.d.ts.map +1 -1
- package/dist/services/batch-queue.js +16 -10
- package/dist/services/batch-queue.js.map +1 -1
- package/dist/services/consent.service.d.ts +117 -0
- package/dist/services/consent.service.d.ts.map +1 -1
- package/dist/services/consent.service.js +482 -41
- package/dist/services/consent.service.js.map +1 -1
- package/dist/services/delegation.service.d.ts.map +1 -1
- package/dist/services/delegation.service.js +4 -0
- package/dist/services/delegation.service.js.map +1 -1
- package/dist/utils/hidden-consent-tools.d.ts +37 -0
- package/dist/utils/hidden-consent-tools.d.ts.map +1 -0
- package/dist/utils/hidden-consent-tools.js +60 -0
- package/dist/utils/hidden-consent-tools.js.map +1 -0
- package/package.json +6 -5
|
@@ -83,6 +83,7 @@ export declare class ConsentService {
|
|
|
83
83
|
delegationToken: string;
|
|
84
84
|
delegationId: string;
|
|
85
85
|
userDid?: string;
|
|
86
|
+
authorizationType?: string;
|
|
86
87
|
}, serverOrigin?: string): Promise<boolean>;
|
|
87
88
|
/**
|
|
88
89
|
* Initialize audit service - fetches config from remote API
|
|
@@ -391,6 +392,14 @@ export declare class ConsentService {
|
|
|
391
392
|
* convention used for `MCPI_HTTP_CHALLENGE` in config.ts.
|
|
392
393
|
*/
|
|
393
394
|
private isIdentityRequired;
|
|
395
|
+
/**
|
|
396
|
+
* 403 returned by `handleApproval` when a credential/OAuth clickwrap mint is
|
|
397
|
+
* attempted without a valid, grant-bound identity assertion (A3, spec §3.2).
|
|
398
|
+
* A distinct `error_code` from the plain `identity_required` gate so callers
|
|
399
|
+
* and tests can tell "no server-signed proof of authentication" apart from
|
|
400
|
+
* "no identity resolved at all".
|
|
401
|
+
*/
|
|
402
|
+
private identityAssertionRequiredResponse;
|
|
394
403
|
/**
|
|
395
404
|
* Handle consent approval
|
|
396
405
|
*
|
|
@@ -441,6 +450,11 @@ export declare class ConsentService {
|
|
|
441
450
|
* @param delegationId - Delegation ID
|
|
442
451
|
* @param providedUserDid - Optional userDid passed directly (bypasses KV read for consistency)
|
|
443
452
|
* @param serverOrigin - Server origin for DO URL construction
|
|
453
|
+
* @param authorizationType - The delegation's authorization type as recorded
|
|
454
|
+
* at mint (raw provider_type / authorization.type). Normalized here before
|
|
455
|
+
* persisting so the call-time enforcement gate (Task B2/B3) reads a
|
|
456
|
+
* consistent value ("password" | "oauth2" | "none" | …). Undefined → the
|
|
457
|
+
* field is omitted and the gate fails safe (never satisfies a typed tool).
|
|
444
458
|
*/
|
|
445
459
|
private storeDelegationToken;
|
|
446
460
|
/**
|
|
@@ -553,6 +567,109 @@ export declare class ConsentService {
|
|
|
553
567
|
* Constant-time string comparison to prevent timing attacks
|
|
554
568
|
*/
|
|
555
569
|
private constantTimeCompare;
|
|
570
|
+
/**
|
|
571
|
+
* Whether local/miniflare testing may relax consent security checks.
|
|
572
|
+
*
|
|
573
|
+
* Mirrors `consent-anchor-bridge.ts`'s `isTestConsentMode` verbatim: requires
|
|
574
|
+
* BOTH `MCPI_TEST_CONSENT === "true"` AND an explicit `development`
|
|
575
|
+
* environment. The flag alone must NEVER relax a check on a
|
|
576
|
+
* production/staging/unset deployment.
|
|
577
|
+
*
|
|
578
|
+
* NOT used by `mintIdentityAssertion`/`verifyIdentityAssertion` — those are
|
|
579
|
+
* strictly fail-closed with no dev relaxation of any kind (a review found
|
|
580
|
+
* that signing/verifying under an attacker-known empty key when this flag
|
|
581
|
+
* is active was a latent total-forgery bypass if the two dev flags ever
|
|
582
|
+
* co-occurred in production). If a dev bypass for the identity-assertion
|
|
583
|
+
* requirement is ever needed, it belongs at the CALL SITE (mirroring how
|
|
584
|
+
* the anchor bridge bypasses CSRF via this flag at the handler, before
|
|
585
|
+
* `validateCsrfToken` is even invoked — never inside the crypto itself).
|
|
586
|
+
* Public so the OAuth callback path (runtime/oauth-handler.ts) can gate its
|
|
587
|
+
* own redirect mint on the identical dev/test relaxation used by the
|
|
588
|
+
* credential redirect above, rather than re-deriving the two-flag check.
|
|
589
|
+
*/
|
|
590
|
+
isDevConsentTestMode(): boolean;
|
|
591
|
+
/**
|
|
592
|
+
* SHA-256 hex digest of the given scopes, sorted ascending and
|
|
593
|
+
* JSON-array-encoded. Used as the identity assertion's `scopesHash` so the
|
|
594
|
+
* signed grant binds to the scope *set* regardless of the order scopes
|
|
595
|
+
* arrive in the request body. Mirrors the digest-to-hex shape already used
|
|
596
|
+
* elsewhere in this codebase (e.g. `DelegationService.hashToken`).
|
|
597
|
+
*
|
|
598
|
+
* `JSON.stringify` (not a `\n`-joined string) is required for injectivity:
|
|
599
|
+
* a plain join collides distinct scope sets that share the same joined
|
|
600
|
+
* bytes — e.g. `["a\nb"]` and `["a", "b"]` both join to `"a\nb"`. JSON
|
|
601
|
+
* array encoding preserves each element's boundary (quoting + `,`
|
|
602
|
+
* separators), so distinct scope sets can never hash identically.
|
|
603
|
+
*/
|
|
604
|
+
private hashScopes;
|
|
605
|
+
/**
|
|
606
|
+
* Compute HMAC-SHA256 for identity-assertion generation/validation.
|
|
607
|
+
*
|
|
608
|
+
* Structurally identical to `computeCsrfHmac`, but `computeCsrfHmac`
|
|
609
|
+
* hardcodes the `csrf:` key prefix internally so it cannot be reused for a
|
|
610
|
+
* different domain — this mirrors its shape with an `identity:` prefix
|
|
611
|
+
* instead, so a CSRF token and an identity assertion are signed under
|
|
612
|
+
* disjoint keys and can never validate as one another.
|
|
613
|
+
*/
|
|
614
|
+
private computeIdentityHmac;
|
|
615
|
+
/**
|
|
616
|
+
* Mint a grant-bound, domain-separated HMAC identity assertion.
|
|
617
|
+
*
|
|
618
|
+
* Carries the `userDid` resolved by a completed authentication step
|
|
619
|
+
* (credential or OAuth) across the consent redirect, replacing the
|
|
620
|
+
* caller-forgeable `user_did` body field (see
|
|
621
|
+
* docs/superpowers/specs/2026-07-29-consent-approve-auth-gate-design.md
|
|
622
|
+
* §3.1). Format mirrors `storeCredentialCsrfToken`:
|
|
623
|
+
* `${hmacB64url}.${payloadB64url}`.
|
|
624
|
+
*
|
|
625
|
+
* Binds the grant, not just the identity: `agentDid`, `tool`, `scopesHash`
|
|
626
|
+
* (SHA-256 of the sorted scope set), and `projectId` are signed in and must
|
|
627
|
+
* be re-checked against the request body at mint time by the caller — a
|
|
628
|
+
* leaked assertion must not be replayable to mint an arbitrary grant under
|
|
629
|
+
* the victim's `userDid` within the 10-minute window.
|
|
630
|
+
*
|
|
631
|
+
* FAIL-CLOSED, ALWAYS: throws if `OAUTH_ENCRYPTION_SECRET` is unset or
|
|
632
|
+
* empty. There is deliberately NO dev/test relaxation inside this helper —
|
|
633
|
+
* signing under a predictable key (e.g. an empty-string fallback) would be
|
|
634
|
+
* an attacker-known key and a latent total-forgery bypass if a dev flag
|
|
635
|
+
* were ever misconfigured in production. A mint must never silently
|
|
636
|
+
* produce an unsigned/unverifiable token — unlike
|
|
637
|
+
* `storeCredentialCsrfToken`'s legacy "graceful degradation," which this
|
|
638
|
+
* assertion deliberately does not inherit. Any future dev/test bypass
|
|
639
|
+
* belongs at the call site (see `isDevConsentTestMode`'s docstring).
|
|
640
|
+
*
|
|
641
|
+
* Public so both authenticated redirect sites can mint under this service's
|
|
642
|
+
* `identity:`-keyed secret: the credential redirect (in-class) and the OAuth
|
|
643
|
+
* callback redirect (runtime/oauth-handler.ts, a separate module).
|
|
644
|
+
*/
|
|
645
|
+
mintIdentityAssertion(params: {
|
|
646
|
+
sid: string;
|
|
647
|
+
userDid: string;
|
|
648
|
+
provider: string;
|
|
649
|
+
agentDid: string;
|
|
650
|
+
tool: string;
|
|
651
|
+
scopes: string[];
|
|
652
|
+
projectId: string;
|
|
653
|
+
}): Promise<string>;
|
|
654
|
+
/**
|
|
655
|
+
* Verify a grant-bound identity assertion minted by `mintIdentityAssertion`.
|
|
656
|
+
*
|
|
657
|
+
* Returns the payload's `userDid` iff: the HMAC matches (constant-time),
|
|
658
|
+
* the assertion has not expired, and every bound field (`sid`, `agentDid`,
|
|
659
|
+
* `tool`, `projectId`, and `scopesHash` recomputed from `expected.scopes`)
|
|
660
|
+
* equals the caller-supplied `expected` values. Any mismatch, tamper, or
|
|
661
|
+
* expiry returns `null` — never throws, so callers can treat `null`
|
|
662
|
+
* uniformly as "no verified identity."
|
|
663
|
+
*
|
|
664
|
+
* FAIL-CLOSED, ALWAYS: returns `null` if `OAUTH_ENCRYPTION_SECRET` is unset
|
|
665
|
+
* or empty. There is deliberately NO dev/test relaxation inside this
|
|
666
|
+
* helper — mirrors `consent-anchor-bridge.ts`'s `validateCsrfToken`, NOT
|
|
667
|
+
* `validateCredentialCsrfToken`'s legacy "return true to allow flow to
|
|
668
|
+
* continue" behavior (the fail-open this PR closes). Any future dev/test
|
|
669
|
+
* bypass belongs at the call site (see `isDevConsentTestMode`'s
|
|
670
|
+
* docstring), never as a predictable/empty signing key inside this helper.
|
|
671
|
+
*/
|
|
672
|
+
private verifyIdentityAssertion;
|
|
556
673
|
/**
|
|
557
674
|
* Build full DelegationRecord format request (future format)
|
|
558
675
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consent.service.d.ts","sourceRoot":"","sources":["../../src/services/consent.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"consent.service.d.ts","sourceRoot":"","sources":["../../src/services/consent.service.ts"],"names":[],"mappings":"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"}
|