@kya-os/consent 0.1.38 → 0.1.39

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 (179) hide show
  1. package/dist/bundle/index.d.ts +12 -0
  2. package/dist/bundle/index.d.ts.map +1 -1
  3. package/dist/bundle/index.js +12 -0
  4. package/dist/bundle/index.js.map +1 -1
  5. package/dist/bundle/inline.d.ts.map +1 -1
  6. package/dist/bundle/inline.js +2 -2
  7. package/dist/bundle/inline.js.map +1 -1
  8. package/dist/bundle/shell.d.ts +23 -0
  9. package/dist/bundle/shell.d.ts.map +1 -1
  10. package/dist/bundle/shell.js +25 -1
  11. package/dist/bundle/shell.js.map +1 -1
  12. package/dist/capabilities/index.d.ts +7 -0
  13. package/dist/capabilities/index.d.ts.map +1 -0
  14. package/dist/capabilities/index.js +7 -0
  15. package/dist/capabilities/index.js.map +1 -0
  16. package/dist/capabilities/registry.d.ts +29 -0
  17. package/dist/capabilities/registry.d.ts.map +1 -0
  18. package/dist/capabilities/registry.js +178 -0
  19. package/dist/capabilities/registry.js.map +1 -0
  20. package/dist/cedar/compile.d.ts +30 -0
  21. package/dist/cedar/compile.d.ts.map +1 -0
  22. package/dist/cedar/compile.js +55 -0
  23. package/dist/cedar/compile.js.map +1 -0
  24. package/dist/cedar/explain.d.ts +22 -0
  25. package/dist/cedar/explain.d.ts.map +1 -0
  26. package/dist/cedar/explain.js +72 -0
  27. package/dist/cedar/explain.js.map +1 -0
  28. package/dist/cedar/index.d.ts +8 -0
  29. package/dist/cedar/index.d.ts.map +1 -0
  30. package/dist/cedar/index.js +8 -0
  31. package/dist/cedar/index.js.map +1 -0
  32. package/dist/cjs/bundle/index.js +19 -1
  33. package/dist/cjs/bundle/index.js.map +1 -1
  34. package/dist/cjs/bundle/inline.js +2 -2
  35. package/dist/cjs/bundle/inline.js.map +1 -1
  36. package/dist/cjs/bundle/shell.js +25 -1
  37. package/dist/cjs/bundle/shell.js.map +1 -1
  38. package/dist/cjs/capabilities/index.js +12 -0
  39. package/dist/cjs/capabilities/index.js.map +1 -0
  40. package/dist/cjs/capabilities/registry.js +182 -0
  41. package/dist/cjs/capabilities/registry.js.map +1 -0
  42. package/dist/cjs/cedar/compile.js +59 -0
  43. package/dist/cjs/cedar/compile.js.map +1 -0
  44. package/dist/cjs/cedar/explain.js +75 -0
  45. package/dist/cjs/cedar/explain.js.map +1 -0
  46. package/dist/cjs/cedar/index.js +14 -0
  47. package/dist/cjs/cedar/index.js.map +1 -0
  48. package/dist/cjs/components/consent-action-bar.js +138 -0
  49. package/dist/cjs/components/consent-action-bar.js.map +1 -0
  50. package/dist/cjs/components/consent-agent-header.js +205 -0
  51. package/dist/cjs/components/consent-agent-header.js.map +1 -0
  52. package/dist/cjs/components/consent-capabilities-screen.js +309 -0
  53. package/dist/cjs/components/consent-capabilities-screen.js.map +1 -0
  54. package/dist/cjs/components/consent-capability-card.js +340 -0
  55. package/dist/cjs/components/consent-capability-card.js.map +1 -0
  56. package/dist/cjs/components/consent-footer.js +99 -0
  57. package/dist/cjs/components/consent-footer.js.map +1 -0
  58. package/dist/cjs/components/consent-revocation-notice.js +101 -0
  59. package/dist/cjs/components/consent-revocation-notice.js.map +1 -0
  60. package/dist/cjs/components/index.js +14 -1
  61. package/dist/cjs/components/index.js.map +1 -1
  62. package/dist/cjs/components/mcp-consent.js +176 -7
  63. package/dist/cjs/components/mcp-consent.js.map +1 -1
  64. package/dist/cjs/copy/index.js +12 -0
  65. package/dist/cjs/copy/index.js.map +1 -0
  66. package/dist/cjs/copy/tokens.js +101 -0
  67. package/dist/cjs/copy/tokens.js.map +1 -0
  68. package/dist/cjs/index.js +8 -0
  69. package/dist/cjs/index.js.map +1 -1
  70. package/dist/cjs/mcp-app/inline.js +2 -2
  71. package/dist/cjs/mcp-app/inline.js.map +1 -1
  72. package/dist/cjs/popup/index.js +15 -0
  73. package/dist/cjs/popup/index.js.map +1 -0
  74. package/dist/cjs/popup/launcher.js +77 -0
  75. package/dist/cjs/popup/launcher.js.map +1 -0
  76. package/dist/cjs/schemas/capabilities.schemas.js +129 -0
  77. package/dist/cjs/schemas/capabilities.schemas.js.map +1 -0
  78. package/dist/cjs/schemas/config.schemas.js +18 -0
  79. package/dist/cjs/schemas/config.schemas.js.map +1 -1
  80. package/dist/cjs/schemas/index.js +1 -0
  81. package/dist/cjs/schemas/index.js.map +1 -1
  82. package/dist/cjs/styles/index.js +1 -0
  83. package/dist/cjs/styles/index.js.map +1 -1
  84. package/dist/cjs/styles/theme.js +86 -0
  85. package/dist/cjs/styles/theme.js.map +1 -0
  86. package/dist/cjs/types/capabilities.types.js +12 -0
  87. package/dist/cjs/types/capabilities.types.js.map +1 -0
  88. package/dist/cjs/types/index.js +1 -0
  89. package/dist/cjs/types/index.js.map +1 -1
  90. package/dist/components/consent-action-bar.d.ts +30 -0
  91. package/dist/components/consent-action-bar.d.ts.map +1 -0
  92. package/dist/components/consent-action-bar.js +135 -0
  93. package/dist/components/consent-action-bar.js.map +1 -0
  94. package/dist/components/consent-agent-header.d.ts +31 -0
  95. package/dist/components/consent-agent-header.d.ts.map +1 -0
  96. package/dist/components/consent-agent-header.js +202 -0
  97. package/dist/components/consent-agent-header.js.map +1 -0
  98. package/dist/components/consent-capabilities-screen.d.ts +62 -0
  99. package/dist/components/consent-capabilities-screen.d.ts.map +1 -0
  100. package/dist/components/consent-capabilities-screen.js +306 -0
  101. package/dist/components/consent-capabilities-screen.js.map +1 -0
  102. package/dist/components/consent-capability-card.d.ts +44 -0
  103. package/dist/components/consent-capability-card.d.ts.map +1 -0
  104. package/dist/components/consent-capability-card.js +337 -0
  105. package/dist/components/consent-capability-card.js.map +1 -0
  106. package/dist/components/consent-footer.d.ts +22 -0
  107. package/dist/components/consent-footer.d.ts.map +1 -0
  108. package/dist/components/consent-footer.js +96 -0
  109. package/dist/components/consent-footer.js.map +1 -0
  110. package/dist/components/consent-revocation-notice.d.ts +22 -0
  111. package/dist/components/consent-revocation-notice.d.ts.map +1 -0
  112. package/dist/components/consent-revocation-notice.js +98 -0
  113. package/dist/components/consent-revocation-notice.js.map +1 -0
  114. package/dist/components/index.d.ts +6 -0
  115. package/dist/components/index.d.ts.map +1 -1
  116. package/dist/components/index.js +7 -0
  117. package/dist/components/index.js.map +1 -1
  118. package/dist/components/mcp-consent.d.ts +41 -0
  119. package/dist/components/mcp-consent.d.ts.map +1 -1
  120. package/dist/components/mcp-consent.js +176 -7
  121. package/dist/components/mcp-consent.js.map +1 -1
  122. package/dist/consent.js +1374 -7
  123. package/dist/consent.min.js +727 -96
  124. package/dist/copy/index.d.ts +8 -0
  125. package/dist/copy/index.d.ts.map +1 -0
  126. package/dist/copy/index.js +7 -0
  127. package/dist/copy/index.js.map +1 -0
  128. package/dist/copy/tokens.d.ts +93 -0
  129. package/dist/copy/tokens.d.ts.map +1 -0
  130. package/dist/copy/tokens.js +97 -0
  131. package/dist/copy/tokens.js.map +1 -0
  132. package/dist/index.d.ts +4 -0
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +8 -0
  135. package/dist/index.js.map +1 -1
  136. package/dist/mcp-app/inline.d.ts.map +1 -1
  137. package/dist/mcp-app/inline.js +2 -2
  138. package/dist/mcp-app/inline.js.map +1 -1
  139. package/dist/popup/index.d.ts +8 -0
  140. package/dist/popup/index.d.ts.map +1 -0
  141. package/dist/popup/index.js +7 -0
  142. package/dist/popup/index.js.map +1 -0
  143. package/dist/popup/launcher.d.ts +81 -0
  144. package/dist/popup/launcher.d.ts.map +1 -0
  145. package/dist/popup/launcher.js +71 -0
  146. package/dist/popup/launcher.js.map +1 -0
  147. package/dist/schemas/api.schemas.d.ts +354 -150
  148. package/dist/schemas/api.schemas.d.ts.map +1 -1
  149. package/dist/schemas/capabilities.schemas.d.ts +186 -0
  150. package/dist/schemas/capabilities.schemas.d.ts.map +1 -0
  151. package/dist/schemas/capabilities.schemas.js +123 -0
  152. package/dist/schemas/capabilities.schemas.js.map +1 -0
  153. package/dist/schemas/config.schemas.d.ts +452 -156
  154. package/dist/schemas/config.schemas.d.ts.map +1 -1
  155. package/dist/schemas/config.schemas.js +18 -0
  156. package/dist/schemas/config.schemas.js.map +1 -1
  157. package/dist/schemas/index.d.ts +1 -0
  158. package/dist/schemas/index.d.ts.map +1 -1
  159. package/dist/schemas/index.js +1 -0
  160. package/dist/schemas/index.js.map +1 -1
  161. package/dist/styles/index.d.ts +1 -0
  162. package/dist/styles/index.d.ts.map +1 -1
  163. package/dist/styles/index.js +1 -0
  164. package/dist/styles/index.js.map +1 -1
  165. package/dist/styles/theme.d.ts +72 -0
  166. package/dist/styles/theme.d.ts.map +1 -0
  167. package/dist/styles/theme.js +81 -0
  168. package/dist/styles/theme.js.map +1 -0
  169. package/dist/types/capabilities.types.d.ts +126 -0
  170. package/dist/types/capabilities.types.d.ts.map +1 -0
  171. package/dist/types/capabilities.types.js +11 -0
  172. package/dist/types/capabilities.types.js.map +1 -0
  173. package/dist/types/config.types.d.ts +33 -0
  174. package/dist/types/config.types.d.ts.map +1 -1
  175. package/dist/types/index.d.ts +1 -0
  176. package/dist/types/index.d.ts.map +1 -1
  177. package/dist/types/index.js +1 -0
  178. package/dist/types/index.js.map +1 -1
  179. package/package.json +1 -1
package/dist/consent.js CHANGED
@@ -2616,6 +2616,1229 @@ ConsentOTPInput = __decorateClass([
2616
2616
  t3("consent-otp-input")
2617
2617
  ], ConsentOTPInput);
2618
2618
 
2619
+ // src/copy/tokens.ts
2620
+ var CONSENT_COPY_TOKENS = {
2621
+ eyebrow: {
2622
+ /** Light theme (consent screen). */
2623
+ permissionRequest: "PERMISSION REQUEST",
2624
+ /** Dark theme (gateway). `{Brand}` → operator-set brand name. */
2625
+ gatewayBrand: "{Brand} Gateway"
2626
+ },
2627
+ headline: {
2628
+ /**
2629
+ * `{Agent}` → agent display name (serif italic at render time).
2630
+ * `{Verb}` → operator verb, default "use".
2631
+ * `{Org}` → organization display name (serif italic at render time).
2632
+ */
2633
+ template: "{Agent} would like to {Verb} at {Org} for you."
2634
+ },
2635
+ subhead: {
2636
+ /** `{Agent}` → agent display name. */
2637
+ template: "Pick what {Agent} is allowed to do on your behalf. You stay in charge \u2014 change or cancel anytime."
2638
+ },
2639
+ agentTile: {
2640
+ verifiedPill: "Verified",
2641
+ unverifiedPill: "UNVERIFIED",
2642
+ /** `{Vendor}` → vendor name. `{Surface}` → surface label. */
2643
+ metaTemplate: "Made by {Vendor} \xB7 Asking from your {Surface} \xB7 {Connected}",
2644
+ connectedJustNow: "Connected just now",
2645
+ /** `{Minutes}` → minutes since connection. */
2646
+ connectedMinutesAgo: "Connected {Minutes} min ago"
2647
+ },
2648
+ section: {
2649
+ /** `{Agent}` → agent display name (uppercased at render time). */
2650
+ capabilitiesHeader: "WHAT {Agent} CAN DO FOR YOU",
2651
+ tapToToggle: "Tap to toggle",
2652
+ /** Used in the dark gateway theme. */
2653
+ permissionsRequested: "PERMISSIONS REQUESTED"
2654
+ },
2655
+ capabilityRow: {
2656
+ higherRiskChip: "HIGHER RISK",
2657
+ viewPolicyLink: "View policy",
2658
+ /** Disclosure title above the raw Cedar. */
2659
+ rawPolicyTitle: "Cedar policy",
2660
+ /** Disclosure title above the plain-language gloss. */
2661
+ glossTitle: "What this allows",
2662
+ /** Used in the gloss when no resource is extractable. */
2663
+ glossUnknownResource: "this deployment"
2664
+ },
2665
+ footer: {
2666
+ /**
2667
+ * `{RevocationPath}` → e.g. "Account → Connected Agents".
2668
+ * `{Org}` → organization display name.
2669
+ */
2670
+ revocationTemplate: "You can change or revoke any of these permissions anytime under {RevocationPath} at {Org}.",
2671
+ /** `{Days}` → inactivity days, default 90. */
2672
+ inactivityTemplate: "Permissions automatically expire after {Days} days of inactivity."
2673
+ },
2674
+ actions: {
2675
+ /** Light theme primary. `{Agent}` → agent display name. */
2676
+ allowAgentTemplate: "Allow {Agent}",
2677
+ /** Dark theme primary. */
2678
+ allowAccess: "Allow access",
2679
+ /** Light theme secondary. */
2680
+ notNow: "Not now",
2681
+ /** Dark theme secondary. */
2682
+ deny: "Deny"
2683
+ },
2684
+ attribution: {
2685
+ /** Light theme. */
2686
+ protectedBy: "Protected by Checkpoint",
2687
+ /** Dark theme. */
2688
+ securedBy: "Secured by Checkpoint",
2689
+ howThisWorks: "How does this work?"
2690
+ }
2691
+ };
2692
+ function formatToken(template, values) {
2693
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
2694
+ const value = values[key];
2695
+ return value === void 0 ? match : String(value);
2696
+ });
2697
+ }
2698
+
2699
+ // src/components/consent-agent-header.ts
2700
+ var ConsentAgentHeader = class extends i4 {
2701
+ constructor() {
2702
+ super(...arguments);
2703
+ this.agentName = "";
2704
+ this.vendor = "";
2705
+ this.surfaceLabel = "";
2706
+ this.verified = false;
2707
+ this.logoUrl = "";
2708
+ this.connectedAt = "";
2709
+ }
2710
+ renderConnectedFragment() {
2711
+ if (!this.connectedAt) {
2712
+ return CONSENT_COPY_TOKENS.agentTile.connectedJustNow;
2713
+ }
2714
+ const ts = Date.parse(this.connectedAt);
2715
+ if (Number.isNaN(ts)) {
2716
+ return CONSENT_COPY_TOKENS.agentTile.connectedJustNow;
2717
+ }
2718
+ const minutes = Math.max(0, Math.floor((Date.now() - ts) / 6e4));
2719
+ if (minutes < 1) {
2720
+ return CONSENT_COPY_TOKENS.agentTile.connectedJustNow;
2721
+ }
2722
+ return formatToken(CONSENT_COPY_TOKENS.agentTile.connectedMinutesAgo, {
2723
+ Minutes: minutes
2724
+ });
2725
+ }
2726
+ renderMeta() {
2727
+ if (!this.vendor && !this.surfaceLabel) {
2728
+ return this.renderConnectedFragment();
2729
+ }
2730
+ return formatToken(CONSENT_COPY_TOKENS.agentTile.metaTemplate, {
2731
+ Vendor: this.vendor || "\u2014",
2732
+ Surface: this.surfaceLabel || "this device",
2733
+ Connected: this.renderConnectedFragment()
2734
+ });
2735
+ }
2736
+ render() {
2737
+ const initial = (this.agentName || "?").trim().charAt(0).toUpperCase();
2738
+ const verifiedLabel = this.verified ? CONSENT_COPY_TOKENS.agentTile.verifiedPill : CONSENT_COPY_TOKENS.agentTile.unverifiedPill;
2739
+ const verifiedClass = this.verified ? "verified" : "unverified";
2740
+ return b2`
2741
+ <div class="tile" part="tile">
2742
+ <div class="logo" aria-hidden="true">
2743
+ ${this.logoUrl ? b2`<img src="${this.logoUrl}" alt="" />` : b2`<div class="placeholder">${initial}</div>`}
2744
+ </div>
2745
+ <div class="body">
2746
+ <div class="row-name">
2747
+ <span class="name">${this.agentName || A}</span>
2748
+ <span class="pill ${verifiedClass}" part="pill">
2749
+ ${verifiedLabel}
2750
+ </span>
2751
+ </div>
2752
+ <div class="meta">${this.renderMeta()}</div>
2753
+ </div>
2754
+ </div>
2755
+ `;
2756
+ }
2757
+ };
2758
+ ConsentAgentHeader.styles = i`
2759
+ :host {
2760
+ display: block;
2761
+ width: 100%;
2762
+ }
2763
+
2764
+ .tile {
2765
+ display: flex;
2766
+ align-items: center;
2767
+ gap: 16px;
2768
+ padding: 16px 18px;
2769
+ border-radius: 14px;
2770
+ background: var(--cs-surface-inset, transparent);
2771
+ border: 1px solid var(--cs-surface-border, transparent);
2772
+ }
2773
+
2774
+ .logo {
2775
+ width: 44px;
2776
+ height: 44px;
2777
+ border-radius: 12px;
2778
+ flex-shrink: 0;
2779
+ background: var(--cs-surface-card, #fff);
2780
+ display: flex;
2781
+ align-items: center;
2782
+ justify-content: center;
2783
+ overflow: hidden;
2784
+ border: 1px solid var(--cs-surface-border, transparent);
2785
+ }
2786
+
2787
+ .logo img {
2788
+ width: 100%;
2789
+ height: 100%;
2790
+ object-fit: cover;
2791
+ }
2792
+
2793
+ .logo .placeholder {
2794
+ width: 100%;
2795
+ height: 100%;
2796
+ background: var(--cs-surface-accent, #0F172A);
2797
+ color: var(--cs-surface-accent-text, #fff);
2798
+ display: flex;
2799
+ align-items: center;
2800
+ justify-content: center;
2801
+ font-weight: 600;
2802
+ font-size: 18px;
2803
+ }
2804
+
2805
+ .body {
2806
+ display: flex;
2807
+ flex-direction: column;
2808
+ gap: 4px;
2809
+ min-width: 0;
2810
+ }
2811
+
2812
+ .row-name {
2813
+ display: flex;
2814
+ align-items: center;
2815
+ gap: 10px;
2816
+ flex-wrap: wrap;
2817
+ }
2818
+
2819
+ .name {
2820
+ font-size: 16px;
2821
+ font-weight: 600;
2822
+ color: var(--cs-text-primary, #0F172A);
2823
+ letter-spacing: -0.01em;
2824
+ }
2825
+
2826
+ .pill {
2827
+ display: inline-flex;
2828
+ align-items: center;
2829
+ gap: 4px;
2830
+ padding: 2px 8px;
2831
+ border-radius: 999px;
2832
+ font-size: 11px;
2833
+ font-weight: 600;
2834
+ letter-spacing: 0.04em;
2835
+ }
2836
+
2837
+ .pill.verified {
2838
+ background: var(--cs-pill-verified-bg, #DCFCE7);
2839
+ color: var(--cs-pill-verified-text, #166534);
2840
+ }
2841
+
2842
+ .pill.unverified {
2843
+ background: var(--cs-pill-unverified-bg, #F1F5F9);
2844
+ color: var(--cs-pill-unverified-text, #475569);
2845
+ letter-spacing: 0.08em;
2846
+ }
2847
+
2848
+ .meta {
2849
+ font-size: 12px;
2850
+ color: var(--cs-text-tertiary, #64748B);
2851
+ line-height: 1.5;
2852
+ }
2853
+ `;
2854
+ __decorateClass([
2855
+ n4({ type: String })
2856
+ ], ConsentAgentHeader.prototype, "agentName", 2);
2857
+ __decorateClass([
2858
+ n4({ type: String })
2859
+ ], ConsentAgentHeader.prototype, "vendor", 2);
2860
+ __decorateClass([
2861
+ n4({ type: String })
2862
+ ], ConsentAgentHeader.prototype, "surfaceLabel", 2);
2863
+ __decorateClass([
2864
+ n4({ type: Boolean })
2865
+ ], ConsentAgentHeader.prototype, "verified", 2);
2866
+ __decorateClass([
2867
+ n4({ type: String })
2868
+ ], ConsentAgentHeader.prototype, "logoUrl", 2);
2869
+ __decorateClass([
2870
+ n4({ type: String })
2871
+ ], ConsentAgentHeader.prototype, "connectedAt", 2);
2872
+ ConsentAgentHeader = __decorateClass([
2873
+ t3("consent-agent-header")
2874
+ ], ConsentAgentHeader);
2875
+
2876
+ // src/cedar/explain.ts
2877
+ var ACTION_SINGLE = /action\s*==\s*Action::"([^"]+)"/g;
2878
+ var ACTION_LIST = /action\s+in\s*\[([^\]]+)\]/g;
2879
+ var ACTION_STRING_IN_LIST = /Action::"([^"]+)"/g;
2880
+ var RESOURCE_IN = /resource\s+in\s+([^,)\n]+)/i;
2881
+ var RESOURCE_EQ = /resource\s*==\s*([^,)\n]+)/i;
2882
+ var CONDITION_BLOCK = /(when|unless)\s*\{([^}]+)\}/g;
2883
+ function explainCedarFragment(cedar) {
2884
+ return {
2885
+ actions: extractActions(cedar),
2886
+ resource: extractResource(cedar),
2887
+ conditions: extractConditions(cedar)
2888
+ };
2889
+ }
2890
+ function extractActions(cedar) {
2891
+ const actions = /* @__PURE__ */ new Set();
2892
+ for (const match of cedar.matchAll(ACTION_SINGLE)) {
2893
+ if (match[1]) actions.add(match[1]);
2894
+ }
2895
+ for (const listMatch of cedar.matchAll(ACTION_LIST)) {
2896
+ const inner = listMatch[1];
2897
+ if (!inner) continue;
2898
+ for (const stringMatch of inner.matchAll(ACTION_STRING_IN_LIST)) {
2899
+ if (stringMatch[1]) actions.add(stringMatch[1]);
2900
+ }
2901
+ }
2902
+ return Array.from(actions);
2903
+ }
2904
+ function extractResource(cedar) {
2905
+ const inMatch = RESOURCE_IN.exec(cedar);
2906
+ if (inMatch && inMatch[1]) {
2907
+ return inMatch[1].trim();
2908
+ }
2909
+ const eqMatch = RESOURCE_EQ.exec(cedar);
2910
+ if (eqMatch && eqMatch[1]) {
2911
+ return eqMatch[1].trim();
2912
+ }
2913
+ return "";
2914
+ }
2915
+ function extractConditions(cedar) {
2916
+ const conditions = [];
2917
+ for (const match of cedar.matchAll(CONDITION_BLOCK)) {
2918
+ const keyword = match[1];
2919
+ const body = match[2];
2920
+ if (!keyword || !body) continue;
2921
+ conditions.push(`${keyword} ${body.trim().replace(/\s+/g, " ")}`);
2922
+ }
2923
+ return conditions;
2924
+ }
2925
+
2926
+ // src/components/consent-capability-card.ts
2927
+ var ConsentCapabilityCard = class extends i4 {
2928
+ constructor() {
2929
+ super(...arguments);
2930
+ this.capabilityId = "";
2931
+ this.label = "";
2932
+ this.description = "";
2933
+ this.icon = "neutral";
2934
+ this.riskLevel = "low";
2935
+ this.checked = false;
2936
+ this.compiledCedar = "";
2937
+ this.policyOpen = false;
2938
+ }
2939
+ toggleChecked() {
2940
+ this.checked = !this.checked;
2941
+ const detail = {
2942
+ id: this.capabilityId,
2943
+ checked: this.checked
2944
+ };
2945
+ this.dispatchEvent(
2946
+ new CustomEvent("capability-toggle", {
2947
+ detail,
2948
+ bubbles: true,
2949
+ composed: true
2950
+ })
2951
+ );
2952
+ }
2953
+ togglePolicy() {
2954
+ this.policyOpen = !this.policyOpen;
2955
+ }
2956
+ isHigherRisk() {
2957
+ return this.riskLevel === "high" || this.riskLevel === "critical";
2958
+ }
2959
+ renderIcon() {
2960
+ return iconSvgFor(this.icon);
2961
+ }
2962
+ renderPolicy() {
2963
+ if (!this.policyOpen) return A;
2964
+ if (!this.compiledCedar) return A;
2965
+ const explanation = explainCedarFragment(this.compiledCedar);
2966
+ const tokens = CONSENT_COPY_TOKENS.capabilityRow;
2967
+ return b2`
2968
+ <div class="policy-disclosure" part="policy">
2969
+ <h4>${tokens.glossTitle}</h4>
2970
+ <ul>
2971
+ ${explanation.actions.length === 0 ? b2`<li>—</li>` : explanation.actions.map(
2972
+ (action) => b2`<li><code>${action}</code></li>`
2973
+ )}
2974
+ </ul>
2975
+ ${explanation.resource ? b2`<p>
2976
+ On <code>${explanation.resource}</code>
2977
+ </p>` : b2`<p>On ${tokens.glossUnknownResource}</p>`}
2978
+ <h4>${tokens.rawPolicyTitle}</h4>
2979
+ <pre><code>${this.compiledCedar}</code></pre>
2980
+ </div>
2981
+ `;
2982
+ }
2983
+ render() {
2984
+ const tokens = CONSENT_COPY_TOKENS.capabilityRow;
2985
+ return b2`
2986
+ <div class="row" part="row">
2987
+ <button
2988
+ class="checkbox"
2989
+ part="checkbox"
2990
+ role="checkbox"
2991
+ aria-checked="${String(this.checked)}"
2992
+ aria-label="${this.label}"
2993
+ @click=${this.toggleChecked}
2994
+ type="button"
2995
+ >
2996
+ ${this.checked ? b2`<span class="check-mark">✓</span>` : A}
2997
+ </button>
2998
+ <div class="icon-tile" aria-hidden="true">${this.renderIcon()}</div>
2999
+ <div class="body">
3000
+ <div class="row-label">
3001
+ <span><strong>${this.label}</strong> <span class="description">${this.description}</span></span>
3002
+ ${this.isHigherRisk() ? b2`<span class="risk-chip">${tokens.higherRiskChip}</span>` : A}
3003
+ </div>
3004
+ <button
3005
+ class="policy-toggle"
3006
+ type="button"
3007
+ @click=${this.togglePolicy}
3008
+ aria-expanded="${String(this.policyOpen)}"
3009
+ >
3010
+ ${tokens.viewPolicyLink}
3011
+ </button>
3012
+ ${this.renderPolicy()}
3013
+ </div>
3014
+ </div>
3015
+ `;
3016
+ }
3017
+ };
3018
+ ConsentCapabilityCard.styles = i`
3019
+ :host {
3020
+ display: block;
3021
+ border-bottom: 1px solid var(--cs-surface-border, rgba(15, 23, 42, 0.08));
3022
+ }
3023
+
3024
+ :host(:last-of-type) {
3025
+ border-bottom: none;
3026
+ }
3027
+
3028
+ .row {
3029
+ display: grid;
3030
+ grid-template-columns: 22px 36px 1fr;
3031
+ gap: 14px;
3032
+ padding: 16px 0;
3033
+ align-items: flex-start;
3034
+ }
3035
+
3036
+ .checkbox {
3037
+ width: 22px;
3038
+ height: 22px;
3039
+ border-radius: 6px;
3040
+ border: 1.5px solid var(--cs-text-secondary, #334155);
3041
+ background: transparent;
3042
+ cursor: pointer;
3043
+ display: flex;
3044
+ align-items: center;
3045
+ justify-content: center;
3046
+ padding: 0;
3047
+ transition: background 0.12s ease, border-color 0.12s ease;
3048
+ }
3049
+
3050
+ .checkbox[aria-checked="true"] {
3051
+ background: var(--cs-surface-accent, #0F172A);
3052
+ border-color: var(--cs-surface-accent, #0F172A);
3053
+ }
3054
+
3055
+ .checkbox:focus-visible {
3056
+ outline: 2px solid var(--cs-focus-ring, #0F172A);
3057
+ outline-offset: 2px;
3058
+ }
3059
+
3060
+ .check-mark {
3061
+ color: var(--cs-surface-accent-text, #fff);
3062
+ font-size: 14px;
3063
+ line-height: 1;
3064
+ }
3065
+
3066
+ .icon-tile {
3067
+ width: 36px;
3068
+ height: 36px;
3069
+ border-radius: 10px;
3070
+ background: var(--cs-surface-inset, #F1ECE2);
3071
+ display: flex;
3072
+ align-items: center;
3073
+ justify-content: center;
3074
+ color: var(--cs-text-secondary, #334155);
3075
+ }
3076
+
3077
+ .icon-tile svg {
3078
+ width: 18px;
3079
+ height: 18px;
3080
+ }
3081
+
3082
+ .body {
3083
+ display: flex;
3084
+ flex-direction: column;
3085
+ gap: 6px;
3086
+ min-width: 0;
3087
+ }
3088
+
3089
+ .row-label {
3090
+ display: flex;
3091
+ align-items: center;
3092
+ gap: 10px;
3093
+ flex-wrap: wrap;
3094
+ font-size: 14.5px;
3095
+ color: var(--cs-text-primary, #0F172A);
3096
+ line-height: 1.45;
3097
+ }
3098
+
3099
+ .row-label strong {
3100
+ font-weight: 600;
3101
+ }
3102
+
3103
+ .description {
3104
+ color: var(--cs-text-secondary, #334155);
3105
+ }
3106
+
3107
+ .risk-chip {
3108
+ display: inline-flex;
3109
+ padding: 2px 8px;
3110
+ border-radius: 999px;
3111
+ font-size: 10.5px;
3112
+ font-weight: 700;
3113
+ letter-spacing: 0.06em;
3114
+ background: var(--cs-chip-risk-bg, #FCE7B6);
3115
+ color: var(--cs-chip-risk-text, #7A4F00);
3116
+ }
3117
+
3118
+ .policy-toggle {
3119
+ align-self: flex-start;
3120
+ background: none;
3121
+ border: none;
3122
+ padding: 0;
3123
+ font-size: 12px;
3124
+ font-weight: 500;
3125
+ color: var(--cs-text-tertiary, #64748B);
3126
+ text-decoration: underline;
3127
+ text-underline-offset: 2px;
3128
+ cursor: pointer;
3129
+ }
3130
+
3131
+ .policy-toggle:focus-visible {
3132
+ outline: 2px solid var(--cs-focus-ring, #0F172A);
3133
+ outline-offset: 2px;
3134
+ }
3135
+
3136
+ .policy-disclosure {
3137
+ margin-top: 8px;
3138
+ border-radius: 10px;
3139
+ background: var(--cs-surface-inset, #F1ECE2);
3140
+ padding: 10px 12px;
3141
+ font-size: 12px;
3142
+ color: var(--cs-text-secondary, #334155);
3143
+ display: flex;
3144
+ flex-direction: column;
3145
+ gap: 8px;
3146
+ }
3147
+
3148
+ .policy-disclosure h4 {
3149
+ margin: 0;
3150
+ font-size: 11px;
3151
+ letter-spacing: 0.08em;
3152
+ text-transform: uppercase;
3153
+ color: var(--cs-text-tertiary, #64748B);
3154
+ }
3155
+
3156
+ .policy-disclosure pre {
3157
+ margin: 0;
3158
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
3159
+ font-size: 11.5px;
3160
+ line-height: 1.5;
3161
+ white-space: pre-wrap;
3162
+ word-break: break-word;
3163
+ color: var(--cs-text-primary, #0F172A);
3164
+ }
3165
+
3166
+ .policy-disclosure ul {
3167
+ margin: 0;
3168
+ padding-left: 18px;
3169
+ }
3170
+ `;
3171
+ __decorateClass([
3172
+ n4({ type: String })
3173
+ ], ConsentCapabilityCard.prototype, "capabilityId", 2);
3174
+ __decorateClass([
3175
+ n4({ type: String })
3176
+ ], ConsentCapabilityCard.prototype, "label", 2);
3177
+ __decorateClass([
3178
+ n4({ type: String })
3179
+ ], ConsentCapabilityCard.prototype, "description", 2);
3180
+ __decorateClass([
3181
+ n4({ type: String })
3182
+ ], ConsentCapabilityCard.prototype, "icon", 2);
3183
+ __decorateClass([
3184
+ n4({ type: String })
3185
+ ], ConsentCapabilityCard.prototype, "riskLevel", 2);
3186
+ __decorateClass([
3187
+ n4({ type: Boolean, reflect: true })
3188
+ ], ConsentCapabilityCard.prototype, "checked", 2);
3189
+ __decorateClass([
3190
+ n4({ type: String, attribute: "compiled-cedar" })
3191
+ ], ConsentCapabilityCard.prototype, "compiledCedar", 2);
3192
+ __decorateClass([
3193
+ r5()
3194
+ ], ConsentCapabilityCard.prototype, "policyOpen", 2);
3195
+ ConsentCapabilityCard = __decorateClass([
3196
+ t3("consent-capability-card")
3197
+ ], ConsentCapabilityCard);
3198
+ function iconSvgFor(icon) {
3199
+ switch (icon) {
3200
+ case "search":
3201
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="5.25"/><path d="m13.25 13.25 3.5 3.5"/></svg>`;
3202
+ case "cart":
3203
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3h2l1.4 9.4a1.5 1.5 0 0 0 1.5 1.3h7.6a1.5 1.5 0 0 0 1.5-1.2L18 6H6"/><circle cx="9" cy="17" r="1.2"/><circle cx="15" cy="17" r="1.2"/></svg>`;
3204
+ case "card":
3205
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="2.5" y="4.5" width="15" height="11" rx="2"/><path d="M2.5 9h15"/><path d="M5.5 13h3"/></svg>`;
3206
+ case "pin":
3207
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M10 17s-5.5-5-5.5-9a5.5 5.5 0 1 1 11 0c0 4-5.5 9-5.5 9z"/><circle cx="10" cy="8" r="2"/></svg>`;
3208
+ case "pin-new":
3209
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M10 17s-5.5-5-5.5-9a5.5 5.5 0 1 1 11 0c0 4-5.5 9-5.5 9z"/><path d="M10 6v4"/><path d="M8 8h4"/></svg>`;
3210
+ case "shield":
3211
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M10 2.5 4 5v5.5C4 14 6.5 16.5 10 17.5c3.5-1 6-3.5 6-7V5z"/></svg>`;
3212
+ case "key":
3213
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="7" cy="13" r="3.25"/><path d="m9.5 11 6.5-6.5"/><path d="m13.5 7 2 2"/></svg>`;
3214
+ case "tools":
3215
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="m4 4 6 6"/><path d="m10 4 6 6"/><path d="m4 16 12-12"/></svg>`;
3216
+ case "user":
3217
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="7" r="3"/><path d="M3 17a7 7 0 0 1 14 0"/></svg>`;
3218
+ case "calendar":
3219
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="14" height="13" rx="2"/><path d="M3 8h14"/><path d="M7 2v4M13 2v4"/></svg>`;
3220
+ case "lock":
3221
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="9" width="12" height="8" rx="2"/><path d="M7 9V6a3 3 0 0 1 6 0v3"/></svg>`;
3222
+ case "eye":
3223
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M2 10s3-6 8-6 8 6 8 6-3 6-8 6-8-6-8-6z"/><circle cx="10" cy="10" r="2.25"/></svg>`;
3224
+ case "send":
3225
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="m17 3-7 7-2 7-3-9z"/></svg>`;
3226
+ case "package":
3227
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="m10 2 7 4v8l-7 4-7-4V6z"/><path d="m3 6 7 4 7-4"/><path d="M10 18V10"/></svg>`;
3228
+ default:
3229
+ return b2`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="10" cy="10" r="5"/></svg>`;
3230
+ }
3231
+ }
3232
+
3233
+ // src/components/consent-action-bar.ts
3234
+ var ConsentActionBar = class extends i4 {
3235
+ constructor() {
3236
+ super(...arguments);
3237
+ this.agentName = "";
3238
+ this.theme = "light";
3239
+ this.disabled = false;
3240
+ this.loading = false;
3241
+ }
3242
+ emitAllow() {
3243
+ if (this.disabled || this.loading) return;
3244
+ this.dispatchEvent(
3245
+ new CustomEvent("consent-allow", { bubbles: true, composed: true })
3246
+ );
3247
+ }
3248
+ emitDeny() {
3249
+ if (this.loading) return;
3250
+ this.dispatchEvent(
3251
+ new CustomEvent("consent-deny", { bubbles: true, composed: true })
3252
+ );
3253
+ }
3254
+ render() {
3255
+ const allowLabel = this.theme === "dark" ? CONSENT_COPY_TOKENS.actions.allowAccess : `${formatToken(CONSENT_COPY_TOKENS.actions.allowAgentTemplate, {
3256
+ Agent: this.agentName || "this agent"
3257
+ })} \u2192`;
3258
+ const denyLabel = this.theme === "dark" ? CONSENT_COPY_TOKENS.actions.deny : CONSENT_COPY_TOKENS.actions.notNow;
3259
+ return b2`
3260
+ <button
3261
+ class="primary"
3262
+ type="button"
3263
+ ?disabled=${this.disabled || this.loading}
3264
+ @click=${this.emitAllow}
3265
+ >
3266
+ ${allowLabel}
3267
+ </button>
3268
+ <button
3269
+ class="secondary"
3270
+ type="button"
3271
+ ?disabled=${this.loading}
3272
+ @click=${this.emitDeny}
3273
+ >
3274
+ ${denyLabel}
3275
+ </button>
3276
+ `;
3277
+ }
3278
+ };
3279
+ ConsentActionBar.styles = i`
3280
+ :host {
3281
+ display: flex;
3282
+ flex-direction: column;
3283
+ gap: 4px;
3284
+ width: 100%;
3285
+ }
3286
+
3287
+ button {
3288
+ width: 100%;
3289
+ padding: 14px 18px;
3290
+ border-radius: 999px;
3291
+ font-size: 15px;
3292
+ font-weight: 500;
3293
+ font-family: inherit;
3294
+ cursor: pointer;
3295
+ transition: opacity 0.15s ease, transform 0.05s ease;
3296
+ border: none;
3297
+ }
3298
+
3299
+ button:disabled {
3300
+ opacity: 0.5;
3301
+ cursor: not-allowed;
3302
+ }
3303
+
3304
+ button:focus-visible {
3305
+ outline: 2px solid var(--cs-focus-ring, #0F172A);
3306
+ outline-offset: 3px;
3307
+ }
3308
+
3309
+ .primary {
3310
+ background: var(--cs-surface-accent, #0F172A);
3311
+ color: var(--cs-surface-accent-text, #FFFFFF);
3312
+ }
3313
+
3314
+ .primary:hover:not(:disabled) {
3315
+ opacity: 0.92;
3316
+ }
3317
+
3318
+ .secondary {
3319
+ background: transparent;
3320
+ color: var(--cs-text-secondary, #334155);
3321
+ padding: 10px 18px;
3322
+ font-weight: 500;
3323
+ }
3324
+
3325
+ .secondary:hover:not(:disabled) {
3326
+ color: var(--cs-text-primary, #0F172A);
3327
+ }
3328
+ `;
3329
+ __decorateClass([
3330
+ n4({ type: String })
3331
+ ], ConsentActionBar.prototype, "agentName", 2);
3332
+ __decorateClass([
3333
+ n4({ type: String })
3334
+ ], ConsentActionBar.prototype, "theme", 2);
3335
+ __decorateClass([
3336
+ n4({ type: Boolean })
3337
+ ], ConsentActionBar.prototype, "disabled", 2);
3338
+ __decorateClass([
3339
+ n4({ type: Boolean })
3340
+ ], ConsentActionBar.prototype, "loading", 2);
3341
+ ConsentActionBar = __decorateClass([
3342
+ t3("consent-action-bar")
3343
+ ], ConsentActionBar);
3344
+
3345
+ // src/components/consent-footer.ts
3346
+ var ConsentFooter = class extends i4 {
3347
+ constructor() {
3348
+ super(...arguments);
3349
+ this.theme = "light";
3350
+ this.howItWorksUrl = "";
3351
+ }
3352
+ render() {
3353
+ const attribution = this.theme === "dark" ? CONSENT_COPY_TOKENS.attribution.securedBy : CONSENT_COPY_TOKENS.attribution.protectedBy;
3354
+ return b2`
3355
+ <span class="left">
3356
+ <svg
3357
+ class="check"
3358
+ viewBox="0 0 16 16"
3359
+ fill="none"
3360
+ stroke="currentColor"
3361
+ stroke-width="1.8"
3362
+ stroke-linecap="round"
3363
+ stroke-linejoin="round"
3364
+ aria-hidden="true"
3365
+ >
3366
+ <path d="m3.5 8.5 3 3 6-6.5" />
3367
+ </svg>
3368
+ ${attribution}
3369
+ </span>
3370
+ ${this.howItWorksUrl ? b2`<a href="${this.howItWorksUrl}" target="_blank" rel="noopener">
3371
+ ${CONSENT_COPY_TOKENS.attribution.howThisWorks}
3372
+ </a>` : b2`<span>${CONSENT_COPY_TOKENS.attribution.howThisWorks}</span>`}
3373
+ `;
3374
+ }
3375
+ };
3376
+ ConsentFooter.styles = i`
3377
+ :host {
3378
+ display: flex;
3379
+ align-items: center;
3380
+ justify-content: space-between;
3381
+ gap: 16px;
3382
+ padding-top: 12px;
3383
+ font-size: 12px;
3384
+ color: var(--cs-text-tertiary, #64748B);
3385
+ border-top: 1px solid var(--cs-surface-border, transparent);
3386
+ }
3387
+
3388
+ .left {
3389
+ display: inline-flex;
3390
+ align-items: center;
3391
+ gap: 6px;
3392
+ }
3393
+
3394
+ .check {
3395
+ width: 14px;
3396
+ height: 14px;
3397
+ color: var(--cs-text-secondary, #334155);
3398
+ }
3399
+
3400
+ a {
3401
+ color: inherit;
3402
+ text-decoration: underline;
3403
+ text-underline-offset: 2px;
3404
+ }
3405
+
3406
+ a:hover {
3407
+ color: var(--cs-text-primary, #0F172A);
3408
+ }
3409
+ `;
3410
+ __decorateClass([
3411
+ n4({ type: String })
3412
+ ], ConsentFooter.prototype, "theme", 2);
3413
+ __decorateClass([
3414
+ n4({ type: String })
3415
+ ], ConsentFooter.prototype, "howItWorksUrl", 2);
3416
+ ConsentFooter = __decorateClass([
3417
+ t3("consent-footer")
3418
+ ], ConsentFooter);
3419
+
3420
+ // src/components/consent-revocation-notice.ts
3421
+ var ConsentRevocationNotice = class extends i4 {
3422
+ constructor() {
3423
+ super(...arguments);
3424
+ this.revocationPath = "Account \u2192 Connected Agents";
3425
+ this.orgName = "this site";
3426
+ this.inactivityDays = 90;
3427
+ }
3428
+ render() {
3429
+ const revoke = formatToken(CONSENT_COPY_TOKENS.footer.revocationTemplate, {
3430
+ RevocationPath: this.revocationPath,
3431
+ Org: this.orgName
3432
+ });
3433
+ const inactivity = formatToken(
3434
+ CONSENT_COPY_TOKENS.footer.inactivityTemplate,
3435
+ { Days: this.inactivityDays }
3436
+ );
3437
+ return b2`
3438
+ <svg
3439
+ class="icon"
3440
+ viewBox="0 0 20 20"
3441
+ fill="none"
3442
+ stroke="currentColor"
3443
+ stroke-width="1.6"
3444
+ stroke-linecap="round"
3445
+ stroke-linejoin="round"
3446
+ aria-hidden="true"
3447
+ >
3448
+ <circle cx="10" cy="10" r="7.5" />
3449
+ <path d="M10 6v4l2.5 1.5" />
3450
+ </svg>
3451
+ <div class="content">
3452
+ <span>${revoke}</span>
3453
+ <span>${inactivity}</span>
3454
+ </div>
3455
+ `;
3456
+ }
3457
+ };
3458
+ ConsentRevocationNotice.styles = i`
3459
+ :host {
3460
+ display: flex;
3461
+ align-items: flex-start;
3462
+ gap: 10px;
3463
+ padding: 12px 14px;
3464
+ border-radius: 12px;
3465
+ background: var(--cs-surface-inset, #F1ECE2);
3466
+ color: var(--cs-text-secondary, #334155);
3467
+ font-size: 12.5px;
3468
+ line-height: 1.5;
3469
+ }
3470
+
3471
+ .icon {
3472
+ width: 16px;
3473
+ height: 16px;
3474
+ flex-shrink: 0;
3475
+ margin-top: 2px;
3476
+ color: var(--cs-text-tertiary, #64748B);
3477
+ }
3478
+
3479
+ .content {
3480
+ display: flex;
3481
+ flex-direction: column;
3482
+ gap: 4px;
3483
+ }
3484
+
3485
+ em {
3486
+ font-style: normal;
3487
+ color: var(--cs-text-primary, #0F172A);
3488
+ font-weight: 500;
3489
+ }
3490
+ `;
3491
+ __decorateClass([
3492
+ n4({ type: String })
3493
+ ], ConsentRevocationNotice.prototype, "revocationPath", 2);
3494
+ __decorateClass([
3495
+ n4({ type: String })
3496
+ ], ConsentRevocationNotice.prototype, "orgName", 2);
3497
+ __decorateClass([
3498
+ n4({ type: Number })
3499
+ ], ConsentRevocationNotice.prototype, "inactivityDays", 2);
3500
+ ConsentRevocationNotice = __decorateClass([
3501
+ t3("consent-revocation-notice")
3502
+ ], ConsentRevocationNotice);
3503
+
3504
+ // src/styles/theme.ts
3505
+ var FIXED_RISK_CHIP_BG = "#FCE7B6";
3506
+ var FIXED_RISK_CHIP_TEXT = "#7A4F00";
3507
+ var lightTheme = {
3508
+ surfaceBg: "#F4F1EA",
3509
+ surfaceCard: "#FFFFFF",
3510
+ surfaceBorder: "rgba(15, 23, 42, 0.10)",
3511
+ surfaceInset: "#F1ECE2",
3512
+ textPrimary: "#0F172A",
3513
+ textSecondary: "#334155",
3514
+ textTertiary: "#64748B",
3515
+ surfaceAccent: "#0F172A",
3516
+ surfaceAccentText: "#FFFFFF",
3517
+ pillVerifiedBg: "#DCFCE7",
3518
+ pillVerifiedText: "#166534",
3519
+ pillUnverifiedBg: "#F1F5F9",
3520
+ pillUnverifiedText: "#475569",
3521
+ chipRiskBg: FIXED_RISK_CHIP_BG,
3522
+ chipRiskText: FIXED_RISK_CHIP_TEXT,
3523
+ focusRing: "rgba(15, 23, 42, 0.35)",
3524
+ cardShadow: "0 30px 80px -40px rgba(15, 23, 42, 0.40)"
3525
+ };
3526
+ var darkTheme = {
3527
+ surfaceBg: "#0B0808",
3528
+ surfaceCard: "rgba(20, 20, 22, 0.92)",
3529
+ surfaceBorder: "rgba(255, 255, 255, 0.08)",
3530
+ surfaceInset: "rgba(255, 255, 255, 0.04)",
3531
+ textPrimary: "#F8FAFC",
3532
+ textSecondary: "#CBD5E1",
3533
+ textTertiary: "#94A3B8",
3534
+ surfaceAccent: "#F8FAFC",
3535
+ surfaceAccentText: "#0F172A",
3536
+ pillVerifiedBg: "rgba(34, 197, 94, 0.16)",
3537
+ pillVerifiedText: "#86EFAC",
3538
+ pillUnverifiedBg: "rgba(148, 163, 184, 0.18)",
3539
+ pillUnverifiedText: "#CBD5E1",
3540
+ chipRiskBg: FIXED_RISK_CHIP_BG,
3541
+ chipRiskText: FIXED_RISK_CHIP_TEXT,
3542
+ focusRing: "rgba(248, 250, 252, 0.55)",
3543
+ cardShadow: "0 40px 90px -40px rgba(0, 0, 0, 0.85)"
3544
+ };
3545
+ function getConsentTheme(theme) {
3546
+ return theme === "dark" ? darkTheme : lightTheme;
3547
+ }
3548
+ function themeToCssVariables(tokens) {
3549
+ const declarations = [];
3550
+ for (const [key, value] of Object.entries(tokens)) {
3551
+ declarations.push(` --cs-${camelToKebab(key)}: ${value};`);
3552
+ }
3553
+ return declarations.join("\n");
3554
+ }
3555
+ function camelToKebab(value) {
3556
+ return value.replace(/[A-Z]/g, (c4) => `-${c4.toLowerCase()}`);
3557
+ }
3558
+
3559
+ // src/cedar/compile.ts
3560
+ var PLACEHOLDER_PATTERN = /\{\{\s*(agent_did|user_did|org|deployment)\s*\}\}/g;
3561
+ function compileSingleCapability(capability, context) {
3562
+ const compiled = capability.cedar.replace(PLACEHOLDER_PATTERN, (_2, key) => {
3563
+ const value = context[key];
3564
+ if (typeof value !== "string" || value.length === 0) {
3565
+ throw new Error(
3566
+ `Cedar template context missing required value for placeholder \`${key}\``
3567
+ );
3568
+ }
3569
+ return value;
3570
+ });
3571
+ if (compiled.trim().length === 0) {
3572
+ throw new Error(
3573
+ `Cedar fragment for capability \`${capability.id}\` is empty after compilation`
3574
+ );
3575
+ }
3576
+ return compiled;
3577
+ }
3578
+
3579
+ // src/components/consent-capabilities-screen.ts
3580
+ var ConsentCapabilitiesScreen = class extends i4 {
3581
+ constructor() {
3582
+ super(...arguments);
3583
+ this.capabilities = [];
3584
+ this.orgName = "";
3585
+ this.headlineVerb = "use";
3586
+ this.revocationPath = "Account \u2192 Connected Agents";
3587
+ this.inactivityDays = 90;
3588
+ this.theme = "light";
3589
+ this.howItWorksUrl = "";
3590
+ this.loading = false;
3591
+ this.selected = /* @__PURE__ */ new Set();
3592
+ this.onCapabilityToggle = (event) => {
3593
+ const detail = event.detail;
3594
+ const next = new Set(this.selected);
3595
+ if (detail.checked) next.add(detail.id);
3596
+ else next.delete(detail.id);
3597
+ this.selected = next;
3598
+ };
3599
+ this.onAllow = () => {
3600
+ if (this.loading) return;
3601
+ const selectedIds = Array.from(this.selected);
3602
+ const selectedScopes = this.capabilities.filter((c4) => this.selected.has(c4.id)).flatMap((c4) => c4.scopes);
3603
+ const detail = {
3604
+ selectedCapabilityIds: selectedIds,
3605
+ selectedScopes
3606
+ };
3607
+ this.dispatchEvent(
3608
+ new CustomEvent("capabilities-allow", {
3609
+ detail,
3610
+ bubbles: true,
3611
+ composed: true
3612
+ })
3613
+ );
3614
+ };
3615
+ this.onDeny = () => {
3616
+ this.dispatchEvent(
3617
+ new CustomEvent("capabilities-deny", { bubbles: true, composed: true })
3618
+ );
3619
+ };
3620
+ }
3621
+ connectedCallback() {
3622
+ super.connectedCallback();
3623
+ this.seedDefaults();
3624
+ }
3625
+ willUpdate(changed) {
3626
+ if (changed.has("capabilities")) {
3627
+ this.seedDefaults();
3628
+ }
3629
+ }
3630
+ seedDefaults() {
3631
+ const next = /* @__PURE__ */ new Set();
3632
+ for (const capability of this.capabilities) {
3633
+ if (capability.defaultOn) next.add(capability.id);
3634
+ }
3635
+ this.selected = next;
3636
+ }
3637
+ hostStyle() {
3638
+ return `:host { ${themeToCssVariables(getConsentTheme(this.theme))} }`;
3639
+ }
3640
+ compileCapabilityCedar(capability) {
3641
+ if (!this.cedarContext) {
3642
+ return capability.cedar;
3643
+ }
3644
+ try {
3645
+ return compileSingleCapability(capability, this.cedarContext);
3646
+ } catch {
3647
+ return capability.cedar;
3648
+ }
3649
+ }
3650
+ renderHeadline() {
3651
+ const agentName = this.agentMetadata?.name || "this agent";
3652
+ const tokens = CONSENT_COPY_TOKENS;
3653
+ const raw = formatToken(tokens.headline.template, {
3654
+ Agent: "@@AGENT@@",
3655
+ Verb: this.headlineVerb || "use",
3656
+ Org: "@@ORG@@"
3657
+ });
3658
+ const escaped = escapeHtml(raw);
3659
+ const withSerifEntities = escaped.replace("@@AGENT@@", `<em>${escapeHtml(agentName)}</em>`).replace("@@ORG@@", `<em>${escapeHtml(this.orgName || "this site")}</em>`);
3660
+ return b2`<h1
3661
+ class="headline"
3662
+ .innerHTML=${withSerifEntities}
3663
+ ></h1>`;
3664
+ }
3665
+ render() {
3666
+ const tokens = CONSENT_COPY_TOKENS;
3667
+ const agentName = this.agentMetadata?.name || "this agent";
3668
+ const subhead = formatToken(tokens.subhead.template, { Agent: agentName });
3669
+ const sectionHeader = formatToken(tokens.section.capabilitiesHeader, {
3670
+ Agent: agentName.toUpperCase()
3671
+ });
3672
+ return b2`
3673
+ <style>
3674
+ ${this.hostStyle()}
3675
+ </style>
3676
+ <div class="card" part="card">
3677
+ <span class="eyebrow">${tokens.eyebrow.permissionRequest}</span>
3678
+ ${this.renderHeadline()}
3679
+ <p class="subhead">${subhead}</p>
3680
+ ${this.agentMetadata ? b2`<consent-agent-header
3681
+ agentName="${this.agentMetadata.name}"
3682
+ vendor="${this.agentMetadata.vendor || ""}"
3683
+ surfaceLabel="${this.agentMetadata.surfaceLabel || ""}"
3684
+ ?verified=${this.agentMetadata.verified}
3685
+ logoUrl="${this.agentMetadata.logoUrl || ""}"
3686
+ connectedAt="${this.agentMetadata.connectedAt || ""}"
3687
+ ></consent-agent-header>` : A}
3688
+ <div>
3689
+ <div class="section-header">
3690
+ <span>${sectionHeader}</span>
3691
+ <span class="hint">${tokens.section.tapToToggle}</span>
3692
+ </div>
3693
+ <div class="rows" @capability-toggle=${this.onCapabilityToggle}>
3694
+ ${this.capabilities.map(
3695
+ (capability) => b2`
3696
+ <consent-capability-card
3697
+ capabilityId="${capability.id}"
3698
+ label="${capability.label}"
3699
+ description="${capability.description}"
3700
+ icon="${capability.icon}"
3701
+ riskLevel="${capability.riskLevel}"
3702
+ ?checked=${this.selected.has(capability.id)}
3703
+ compiled-cedar="${this.compileCapabilityCedar(capability)}"
3704
+ ></consent-capability-card>
3705
+ `
3706
+ )}
3707
+ </div>
3708
+ </div>
3709
+ <consent-revocation-notice
3710
+ revocationPath="${this.revocationPath}"
3711
+ orgName="${this.orgName || "this site"}"
3712
+ inactivityDays=${this.inactivityDays}
3713
+ ></consent-revocation-notice>
3714
+ <consent-action-bar
3715
+ agentName="${agentName}"
3716
+ theme="${this.theme}"
3717
+ ?loading=${this.loading}
3718
+ ?disabled=${this.selected.size === 0}
3719
+ @consent-allow=${this.onAllow}
3720
+ @consent-deny=${this.onDeny}
3721
+ ></consent-action-bar>
3722
+ <consent-footer
3723
+ theme="${this.theme}"
3724
+ howItWorksUrl="${this.howItWorksUrl}"
3725
+ ></consent-footer>
3726
+ </div>
3727
+ `;
3728
+ }
3729
+ };
3730
+ ConsentCapabilitiesScreen.styles = i`
3731
+ :host {
3732
+ display: block;
3733
+ box-sizing: border-box;
3734
+ width: 100%;
3735
+ max-width: 560px;
3736
+ margin: 0 auto;
3737
+ }
3738
+
3739
+ .card {
3740
+ background: var(--cs-surface-card);
3741
+ border: 1px solid var(--cs-surface-border);
3742
+ border-radius: 22px;
3743
+ box-shadow: var(--cs-card-shadow);
3744
+ padding: 28px 28px 22px;
3745
+ display: flex;
3746
+ flex-direction: column;
3747
+ gap: 22px;
3748
+ color: var(--cs-text-primary);
3749
+ }
3750
+
3751
+ .eyebrow {
3752
+ font-size: 11px;
3753
+ letter-spacing: 0.16em;
3754
+ font-weight: 600;
3755
+ color: var(--cs-text-tertiary);
3756
+ text-transform: uppercase;
3757
+ }
3758
+
3759
+ .headline {
3760
+ font-family: "Times New Roman", Georgia, serif;
3761
+ font-size: 30px;
3762
+ line-height: 1.18;
3763
+ letter-spacing: -0.01em;
3764
+ color: var(--cs-text-primary);
3765
+ margin: 0;
3766
+ }
3767
+
3768
+ .headline em {
3769
+ font-style: italic;
3770
+ }
3771
+
3772
+ .subhead {
3773
+ font-size: 14.5px;
3774
+ color: var(--cs-text-secondary);
3775
+ line-height: 1.55;
3776
+ margin: 0;
3777
+ }
3778
+
3779
+ .section-header {
3780
+ display: flex;
3781
+ align-items: center;
3782
+ justify-content: space-between;
3783
+ font-size: 11px;
3784
+ letter-spacing: 0.14em;
3785
+ font-weight: 600;
3786
+ color: var(--cs-text-tertiary);
3787
+ text-transform: uppercase;
3788
+ }
3789
+
3790
+ .section-header .hint {
3791
+ letter-spacing: 0;
3792
+ font-weight: 400;
3793
+ text-transform: none;
3794
+ font-size: 12px;
3795
+ }
3796
+
3797
+ .rows {
3798
+ display: flex;
3799
+ flex-direction: column;
3800
+ }
3801
+ `;
3802
+ __decorateClass([
3803
+ n4({ type: Array })
3804
+ ], ConsentCapabilitiesScreen.prototype, "capabilities", 2);
3805
+ __decorateClass([
3806
+ n4({ type: Object })
3807
+ ], ConsentCapabilitiesScreen.prototype, "agentMetadata", 2);
3808
+ __decorateClass([
3809
+ n4({ type: Object })
3810
+ ], ConsentCapabilitiesScreen.prototype, "cedarContext", 2);
3811
+ __decorateClass([
3812
+ n4({ type: String })
3813
+ ], ConsentCapabilitiesScreen.prototype, "orgName", 2);
3814
+ __decorateClass([
3815
+ n4({ type: String })
3816
+ ], ConsentCapabilitiesScreen.prototype, "headlineVerb", 2);
3817
+ __decorateClass([
3818
+ n4({ type: String })
3819
+ ], ConsentCapabilitiesScreen.prototype, "revocationPath", 2);
3820
+ __decorateClass([
3821
+ n4({ type: Number })
3822
+ ], ConsentCapabilitiesScreen.prototype, "inactivityDays", 2);
3823
+ __decorateClass([
3824
+ n4({ type: String })
3825
+ ], ConsentCapabilitiesScreen.prototype, "theme", 2);
3826
+ __decorateClass([
3827
+ n4({ type: String, attribute: "how-it-works-url" })
3828
+ ], ConsentCapabilitiesScreen.prototype, "howItWorksUrl", 2);
3829
+ __decorateClass([
3830
+ n4({ type: Boolean })
3831
+ ], ConsentCapabilitiesScreen.prototype, "loading", 2);
3832
+ __decorateClass([
3833
+ r5()
3834
+ ], ConsentCapabilitiesScreen.prototype, "selected", 2);
3835
+ ConsentCapabilitiesScreen = __decorateClass([
3836
+ t3("consent-capabilities-screen")
3837
+ ], ConsentCapabilitiesScreen);
3838
+ function escapeHtml(value) {
3839
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#39;");
3840
+ }
3841
+
2619
3842
  // src/types/modes.types.ts
2620
3843
  var AUTH_MODES = {
2621
3844
  /** Simple consent with no authentication - Consent → Success (2 screens) */
@@ -2950,6 +4173,13 @@ var McpConsent = class extends i4 {
2950
4173
  this.credentialUserEmail = "";
2951
4174
  this.credentialProviderUserId = "";
2952
4175
  this.oauthUrl = "";
4176
+ this.capabilities = [];
4177
+ this.orgName = "";
4178
+ this.headlineVerb = "use";
4179
+ this.revocationPath = "Account \u2192 Connected Agents";
4180
+ this.inactivityDays = 90;
4181
+ this.consentTheme = "light";
4182
+ this.howItWorksUrl = "";
2953
4183
  this.authorizationType = "password";
2954
4184
  this.oauthProviderType = "";
2955
4185
  this.currentMode = AUTH_MODES.CONSENT_ONLY;
@@ -2959,6 +4189,13 @@ var McpConsent = class extends i4 {
2959
4189
  this.formData = {};
2960
4190
  this.resendCooldown = 0;
2961
4191
  this.selectedScopes = [];
4192
+ this.closeFailed = false;
4193
+ this.onCapabilitiesAllow = (event) => {
4194
+ const detail = event.detail;
4195
+ this.selectedScopes = Array.from(new Set(detail.selectedScopes));
4196
+ this.termsAccepted = true;
4197
+ void this.handleApprove();
4198
+ };
2962
4199
  }
2963
4200
  // === LIFECYCLE ===
2964
4201
  connectedCallback() {
@@ -3153,6 +4390,12 @@ var McpConsent = class extends i4 {
3153
4390
  );
3154
4391
  window.close();
3155
4392
  }
4393
+ handleClose() {
4394
+ window.close();
4395
+ setTimeout(() => {
4396
+ this.closeFailed = true;
4397
+ }, 300);
4398
+ }
3156
4399
  handleTermsChange(e8) {
3157
4400
  this.termsAccepted = e8.detail.checked;
3158
4401
  }
@@ -3568,13 +4811,15 @@ var McpConsent = class extends i4 {
3568
4811
 
3569
4812
  <!-- Footer with Continue Button -->
3570
4813
  <div class="success-footer">
3571
- <consent-button
3572
- variant="primary"
3573
- full-width
3574
- @click=${() => window.close()}
3575
- >
3576
- ${success?.continueButtonText ?? "Continue"}
3577
- </consent-button>
4814
+ ${this.closeFailed ? b2`<p class="close-message">You can safely close this tab.</p>` : b2`
4815
+ <consent-button
4816
+ variant="primary"
4817
+ full-width
4818
+ @click=${this.handleClose}
4819
+ >
4820
+ ${success?.continueButtonText ?? "Continue"}
4821
+ </consent-button>
4822
+ `}
3578
4823
  </div>
3579
4824
  </div>
3580
4825
  `;
@@ -3585,6 +4830,9 @@ var McpConsent = class extends i4 {
3585
4830
  if (displayStep === "success") {
3586
4831
  return this.renderSuccess();
3587
4832
  }
4833
+ if (this.capabilities.length > 0 && this.currentMode === AUTH_MODES.CONSENT_ONLY) {
4834
+ return this.renderCapabilitiesScreen();
4835
+ }
3588
4836
  switch (this.currentMode) {
3589
4837
  case AUTH_MODES.CREDENTIALS:
3590
4838
  return this.renderCredentials();
@@ -3599,6 +4847,39 @@ var McpConsent = class extends i4 {
3599
4847
  return this.renderConsentOnly();
3600
4848
  }
3601
4849
  }
4850
+ /**
4851
+ * Render the new humanized capability layout. Selection state is owned by
4852
+ * `<consent-capabilities-screen>`; on `capabilities-allow`, we hydrate the
4853
+ * legacy form-data path (selectedScopes, terms accepted) and reuse the
4854
+ * existing handleApprove submission logic.
4855
+ */
4856
+ renderCapabilitiesScreen() {
4857
+ const flatCapabilities = this.capabilities.flatMap(
4858
+ (group) => group.capabilities
4859
+ );
4860
+ return b2`
4861
+ ${this.error ? b2`<div role="alert" style="
4862
+ color: var(--cs-text-danger, #b91c1c);
4863
+ margin: 0 auto 12px;
4864
+ max-width: 560px;
4865
+ font-size: 13px;
4866
+ ">${this.error}</div>` : A}
4867
+ <consent-capabilities-screen
4868
+ .capabilities=${flatCapabilities}
4869
+ .agentMetadata=${this.agentMetadata}
4870
+ .cedarContext=${this.cedarContext}
4871
+ orgName="${this.orgName}"
4872
+ headlineVerb="${this.headlineVerb}"
4873
+ revocationPath="${this.revocationPath}"
4874
+ inactivityDays=${this.inactivityDays}
4875
+ theme="${this.consentTheme}"
4876
+ how-it-works-url="${this.howItWorksUrl}"
4877
+ ?loading=${this.loading}
4878
+ @capabilities-allow=${this.onCapabilitiesAllow}
4879
+ @capabilities-deny=${this.handleDeny}
4880
+ ></consent-capabilities-screen>
4881
+ `;
4882
+ }
3602
4883
  };
3603
4884
  McpConsent.styles = i`
3604
4885
  :host {
@@ -3920,6 +5201,14 @@ McpConsent.styles = i`
3920
5201
  margin-top: 1.5rem;
3921
5202
  }
3922
5203
 
5204
+ .close-message {
5205
+ text-align: center;
5206
+ color: #6b7280;
5207
+ font-size: 0.875rem;
5208
+ margin: 0;
5209
+ padding: 0.75rem 0;
5210
+ }
5211
+
3923
5212
  /* OTP section */
3924
5213
  .otp-section {
3925
5214
  text-align: center;
@@ -4034,6 +5323,75 @@ __decorateClass([
4034
5323
  __decorateClass([
4035
5324
  n4({ type: String, attribute: "oauth-url" })
4036
5325
  ], McpConsent.prototype, "oauthUrl", 2);
5326
+ __decorateClass([
5327
+ n4({
5328
+ type: Array,
5329
+ converter: {
5330
+ fromAttribute: (value) => {
5331
+ if (!value) return [];
5332
+ try {
5333
+ const parsed = JSON.parse(value);
5334
+ return Array.isArray(parsed) ? parsed : [];
5335
+ } catch {
5336
+ return [];
5337
+ }
5338
+ },
5339
+ toAttribute: (value) => JSON.stringify(value)
5340
+ }
5341
+ })
5342
+ ], McpConsent.prototype, "capabilities", 2);
5343
+ __decorateClass([
5344
+ n4({
5345
+ type: Object,
5346
+ attribute: "agent-metadata",
5347
+ converter: {
5348
+ fromAttribute: (value) => {
5349
+ if (!value) return void 0;
5350
+ try {
5351
+ return JSON.parse(value);
5352
+ } catch {
5353
+ return void 0;
5354
+ }
5355
+ },
5356
+ toAttribute: (value) => value ? JSON.stringify(value) : ""
5357
+ }
5358
+ })
5359
+ ], McpConsent.prototype, "agentMetadata", 2);
5360
+ __decorateClass([
5361
+ n4({ type: String, attribute: "org-name" })
5362
+ ], McpConsent.prototype, "orgName", 2);
5363
+ __decorateClass([
5364
+ n4({ type: String, attribute: "headline-verb" })
5365
+ ], McpConsent.prototype, "headlineVerb", 2);
5366
+ __decorateClass([
5367
+ n4({ type: String, attribute: "revocation-path" })
5368
+ ], McpConsent.prototype, "revocationPath", 2);
5369
+ __decorateClass([
5370
+ n4({ type: Number, attribute: "inactivity-days" })
5371
+ ], McpConsent.prototype, "inactivityDays", 2);
5372
+ __decorateClass([
5373
+ n4({ type: String, attribute: "consent-theme" })
5374
+ ], McpConsent.prototype, "consentTheme", 2);
5375
+ __decorateClass([
5376
+ n4({ type: String, attribute: "how-it-works-url" })
5377
+ ], McpConsent.prototype, "howItWorksUrl", 2);
5378
+ __decorateClass([
5379
+ n4({
5380
+ type: Object,
5381
+ attribute: "cedar-context",
5382
+ converter: {
5383
+ fromAttribute: (value) => {
5384
+ if (!value) return void 0;
5385
+ try {
5386
+ return JSON.parse(value);
5387
+ } catch {
5388
+ return void 0;
5389
+ }
5390
+ },
5391
+ toAttribute: (value) => value ? JSON.stringify(value) : ""
5392
+ }
5393
+ })
5394
+ ], McpConsent.prototype, "cedarContext", 2);
4037
5395
  __decorateClass([
4038
5396
  n4({ type: String, attribute: "authorization-type" })
4039
5397
  ], McpConsent.prototype, "authorizationType", 2);
@@ -4086,16 +5444,25 @@ __decorateClass([
4086
5444
  __decorateClass([
4087
5445
  r5()
4088
5446
  ], McpConsent.prototype, "selectedScopes", 2);
5447
+ __decorateClass([
5448
+ r5()
5449
+ ], McpConsent.prototype, "closeFailed", 2);
4089
5450
  McpConsent = __decorateClass([
4090
5451
  t3("mcp-consent")
4091
5452
  ], McpConsent);
4092
5453
  export {
5454
+ ConsentActionBar,
5455
+ ConsentAgentHeader,
4093
5456
  ConsentButton,
5457
+ ConsentCapabilitiesScreen,
5458
+ ConsentCapabilityCard,
4094
5459
  ConsentCheckbox,
5460
+ ConsentFooter,
4095
5461
  ConsentInput,
4096
5462
  ConsentOAuthButton,
4097
5463
  ConsentOTPInput,
4098
5464
  ConsentPermissions,
5465
+ ConsentRevocationNotice,
4099
5466
  ConsentShell,
4100
5467
  ConsentTerms,
4101
5468
  McpConsent