agentic-payments 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/README.md +924 -0
  2. package/bin/cli.js +18 -0
  3. package/bin/mcp.js +10 -0
  4. package/completions/agentic-payments.bash +21 -0
  5. package/completions/agentic-payments.fish +9 -0
  6. package/completions/agentic-payments.zsh +17 -0
  7. package/completions/bash.sh +182 -0
  8. package/completions/fish.fish +110 -0
  9. package/completions/zsh.sh +175 -0
  10. package/dist/active-mandate/i18n.d.ts +27 -0
  11. package/dist/active-mandate/i18n.d.ts.map +1 -0
  12. package/dist/active-mandate/i18n.js +35 -0
  13. package/dist/active-mandate/i18n.js.map +1 -0
  14. package/dist/active-mandate/index.d.ts +26 -0
  15. package/dist/active-mandate/index.d.ts.map +1 -0
  16. package/dist/active-mandate/index.js +51 -0
  17. package/dist/active-mandate/index.js.map +1 -0
  18. package/dist/active-mandate/revocation.d.ts +11 -0
  19. package/dist/active-mandate/revocation.d.ts.map +1 -0
  20. package/dist/active-mandate/revocation.js +27 -0
  21. package/dist/active-mandate/revocation.js.map +1 -0
  22. package/dist/active-mandate/schema.d.ts +85 -0
  23. package/dist/active-mandate/schema.d.ts.map +1 -0
  24. package/dist/active-mandate/schema.js +36 -0
  25. package/dist/active-mandate/schema.js.map +1 -0
  26. package/dist/active-mandate/signing.d.ts +8 -0
  27. package/dist/active-mandate/signing.d.ts.map +1 -0
  28. package/dist/active-mandate/signing.js +64 -0
  29. package/dist/active-mandate/signing.js.map +1 -0
  30. package/dist/active-mandate/types.d.ts +59 -0
  31. package/dist/active-mandate/types.d.ts.map +1 -0
  32. package/dist/active-mandate/types.js +6 -0
  33. package/dist/active-mandate/types.js.map +1 -0
  34. package/dist/cli/commands/active-mandate.d.ts +4 -0
  35. package/dist/cli/commands/active-mandate.d.ts.map +1 -0
  36. package/dist/cli/commands/active-mandate.js +218 -0
  37. package/dist/cli/commands/active-mandate.js.map +1 -0
  38. package/dist/cli/commands/generate.d.ts +3 -0
  39. package/dist/cli/commands/generate.d.ts.map +1 -0
  40. package/dist/cli/commands/generate.js +59 -0
  41. package/dist/cli/commands/generate.js.map +1 -0
  42. package/dist/cli/commands/mandate.d.ts +4 -0
  43. package/dist/cli/commands/mandate.d.ts.map +1 -0
  44. package/dist/cli/commands/mandate.js +223 -0
  45. package/dist/cli/commands/mandate.js.map +1 -0
  46. package/dist/cli/commands/system.d.ts +4 -0
  47. package/dist/cli/commands/system.d.ts.map +1 -0
  48. package/dist/cli/commands/system.js +101 -0
  49. package/dist/cli/commands/system.js.map +1 -0
  50. package/dist/cli/commands/verify.d.ts +3 -0
  51. package/dist/cli/commands/verify.d.ts.map +1 -0
  52. package/dist/cli/commands/verify.js +104 -0
  53. package/dist/cli/commands/verify.js.map +1 -0
  54. package/dist/cli/completion.d.ts +3 -0
  55. package/dist/cli/completion.d.ts.map +1 -0
  56. package/dist/cli/completion.js +245 -0
  57. package/dist/cli/completion.js.map +1 -0
  58. package/dist/cli/index.d.ts +3 -0
  59. package/dist/cli/index.d.ts.map +1 -0
  60. package/dist/cli/index.js +79 -0
  61. package/dist/cli/index.js.map +1 -0
  62. package/dist/errors.d.ts +58 -0
  63. package/dist/errors.d.ts.map +1 -0
  64. package/dist/errors.js +100 -0
  65. package/dist/errors.js.map +1 -0
  66. package/dist/identity.d.ts +78 -0
  67. package/dist/identity.d.ts.map +1 -0
  68. package/dist/identity.js +204 -0
  69. package/dist/identity.js.map +1 -0
  70. package/dist/index.d.ts +68 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +79 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/mandate.d.ts +134 -0
  75. package/dist/mandate.d.ts.map +1 -0
  76. package/dist/mandate.js +342 -0
  77. package/dist/mandate.js.map +1 -0
  78. package/dist/mcp/index.d.ts +7 -0
  79. package/dist/mcp/index.d.ts.map +1 -0
  80. package/dist/mcp/index.js +102 -0
  81. package/dist/mcp/index.js.map +1 -0
  82. package/dist/mcp/server.d.ts +38 -0
  83. package/dist/mcp/server.d.ts.map +1 -0
  84. package/dist/mcp/server.js +126 -0
  85. package/dist/mcp/server.js.map +1 -0
  86. package/dist/mcp/tools/agent.d.ts +9 -0
  87. package/dist/mcp/tools/agent.d.ts.map +1 -0
  88. package/dist/mcp/tools/agent.js +34 -0
  89. package/dist/mcp/tools/agent.js.map +1 -0
  90. package/dist/mcp/tools/consensus.d.ts +9 -0
  91. package/dist/mcp/tools/consensus.d.ts.map +1 -0
  92. package/dist/mcp/tools/consensus.js +38 -0
  93. package/dist/mcp/tools/consensus.js.map +1 -0
  94. package/dist/mcp/tools/index.d.ts +45 -0
  95. package/dist/mcp/tools/index.d.ts.map +1 -0
  96. package/dist/mcp/tools/index.js +282 -0
  97. package/dist/mcp/tools/index.js.map +1 -0
  98. package/dist/mcp/tools/mandate.d.ts +31 -0
  99. package/dist/mcp/tools/mandate.d.ts.map +1 -0
  100. package/dist/mcp/tools/mandate.js +165 -0
  101. package/dist/mcp/tools/mandate.js.map +1 -0
  102. package/dist/mcp/tools/payment.d.ts +13 -0
  103. package/dist/mcp/tools/payment.d.ts.map +1 -0
  104. package/dist/mcp/tools/payment.js +66 -0
  105. package/dist/mcp/tools/payment.js.map +1 -0
  106. package/dist/mcp/tools/types.d.ts +63 -0
  107. package/dist/mcp/tools/types.d.ts.map +1 -0
  108. package/dist/mcp/tools/types.js +5 -0
  109. package/dist/mcp/tools/types.js.map +1 -0
  110. package/dist/mcp/transports/http.d.ts +52 -0
  111. package/dist/mcp/transports/http.d.ts.map +1 -0
  112. package/dist/mcp/transports/http.js +234 -0
  113. package/dist/mcp/transports/http.js.map +1 -0
  114. package/dist/types.d.ts +238 -0
  115. package/dist/types.d.ts.map +1 -0
  116. package/dist/types.js +7 -0
  117. package/dist/types.js.map +1 -0
  118. package/dist/verification.d.ts +140 -0
  119. package/dist/verification.d.ts.map +1 -0
  120. package/dist/verification.js +285 -0
  121. package/dist/verification.js.map +1 -0
  122. package/package.json +175 -0
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Active Mandate - Autonomous agent payment authorization
3
+ * Main entry point for Active Mandate functionality
4
+ */
5
+ import { signedMandateSchema } from "./schema.js";
6
+ import { verifyEd25519Signature } from "./signing.js";
7
+ import { isRevoked, revokeMandate } from "./revocation.js";
8
+ export * from "./types.js";
9
+ export { signedMandateSchema, mandateSchema, spendCapSchema } from "./schema.js";
10
+ export { verifyEd25519Signature, canonicalizeJSON, signWithTweetnacl, getPublicKeyBase64 } from "./signing.js";
11
+ export { isRevoked, revokeMandate, getRevocation, clearRevocations, getAllRevocations } from "./revocation.js";
12
+ export { copy, formatAmount, formatPeriod } from "./i18n.js";
13
+ /**
14
+ * Validate schema and verify Ed25519 signature
15
+ */
16
+ export function validateAndVerify(m) {
17
+ const parsed = signedMandateSchema.safeParse(m);
18
+ if (!parsed.success) {
19
+ return { valid: false, reason: parsed.error.message };
20
+ }
21
+ const sm = parsed.data;
22
+ if (isRevoked(sm.payload.mandate_id)) {
23
+ return { valid: false, reason: "mandate revoked" };
24
+ }
25
+ const ok = verifyEd25519Signature(sm.pubkey, sm.signature, sm.payload);
26
+ return ok ? { valid: true, parsed: sm } : { valid: false, reason: "signature invalid" };
27
+ }
28
+ /**
29
+ * Guard mandate execution with time window and revocation checks
30
+ */
31
+ export function guardExecution(m) {
32
+ // time window checks
33
+ const now = Date.now();
34
+ if (m.payload.not_before && Date.parse(m.payload.not_before) > now) {
35
+ return { allowed: false, reason: "before not_before" };
36
+ }
37
+ if (Date.parse(m.payload.expires_at) <= now) {
38
+ return { allowed: false, reason: "expired" };
39
+ }
40
+ if (isRevoked(m.payload.mandate_id)) {
41
+ return { allowed: false, reason: "revoked" };
42
+ }
43
+ return { allowed: true };
44
+ }
45
+ /**
46
+ * Revoke a mandate by ID
47
+ */
48
+ export function revoke(mandate_id, reason) {
49
+ return revokeMandate(mandate_id, reason);
50
+ }
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/active-mandate/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAG3D,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG7D;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAqB,CAAC;IACxC,IAAI,SAAS,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,EAAE,GAAG,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;AAC1F,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,CAAgB;IAC7C,qBAAqB;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,GAAG,EAAE,CAAC;QACnE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,UAAkB,EAAE,MAAe;IACxD,OAAO,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Mandate revocation system
3
+ * In-memory store (swap with database for production)
4
+ */
5
+ import { RevocationRecord } from "./types.js";
6
+ export declare function revokeMandate(mandate_id: string, reason?: string): RevocationRecord;
7
+ export declare function isRevoked(mandate_id: string): boolean;
8
+ export declare function getRevocation(mandate_id: string): RevocationRecord | undefined;
9
+ export declare function clearRevocations(): void;
10
+ export declare function getAllRevocations(): RevocationRecord[];
11
+ //# sourceMappingURL=revocation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revocation.d.ts","sourceRoot":"","sources":["../../src/active-mandate/revocation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAQnF;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9E;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAED,wBAAgB,iBAAiB,IAAI,gBAAgB,EAAE,CAEtD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Mandate revocation system
3
+ * In-memory store (swap with database for production)
4
+ */
5
+ const revoked = new Map();
6
+ export function revokeMandate(mandate_id, reason) {
7
+ const rec = {
8
+ mandate_id,
9
+ revoked_at: new Date().toISOString(),
10
+ reason
11
+ };
12
+ revoked.set(mandate_id, rec);
13
+ return rec;
14
+ }
15
+ export function isRevoked(mandate_id) {
16
+ return revoked.has(mandate_id);
17
+ }
18
+ export function getRevocation(mandate_id) {
19
+ return revoked.get(mandate_id);
20
+ }
21
+ export function clearRevocations() {
22
+ revoked.clear();
23
+ }
24
+ export function getAllRevocations() {
25
+ return Array.from(revoked.values());
26
+ }
27
+ //# sourceMappingURL=revocation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/active-mandate/revocation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;AAEpD,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,MAAe;IAC/D,MAAM,GAAG,GAAG;QACV,UAAU;QACV,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,MAAM;KACP,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,UAAkB;IAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Zod schemas for Active Mandate validation
3
+ */
4
+ import { z } from "zod";
5
+ export declare const spendCapSchema: z.ZodObject<{
6
+ amount: z.ZodNumber;
7
+ currency: z.ZodString;
8
+ period: z.ZodEnum<{
9
+ single: "single";
10
+ daily: "daily";
11
+ weekly: "weekly";
12
+ monthly: "monthly";
13
+ }>;
14
+ }, z.core.$strip>;
15
+ export declare const mandateSchema: z.ZodObject<{
16
+ mandate_id: z.ZodString;
17
+ kind: z.ZodEnum<{
18
+ intent: "intent";
19
+ cart: "cart";
20
+ }>;
21
+ agent: z.ZodString;
22
+ holder: z.ZodString;
23
+ cap: z.ZodObject<{
24
+ amount: z.ZodNumber;
25
+ currency: z.ZodString;
26
+ period: z.ZodEnum<{
27
+ single: "single";
28
+ daily: "daily";
29
+ weekly: "weekly";
30
+ monthly: "monthly";
31
+ }>;
32
+ }, z.core.$strip>;
33
+ merchant_allow: z.ZodOptional<z.ZodArray<z.ZodString>>;
34
+ merchant_block: z.ZodOptional<z.ZodArray<z.ZodString>>;
35
+ not_before: z.ZodOptional<z.ZodString>;
36
+ expires_at: z.ZodString;
37
+ line_items: z.ZodOptional<z.ZodArray<z.ZodObject<{
38
+ sku: z.ZodString;
39
+ qty: z.ZodNumber;
40
+ unit_amount: z.ZodNumber;
41
+ currency: z.ZodString;
42
+ }, z.core.$strip>>>;
43
+ total_amount: z.ZodOptional<z.ZodNumber>;
44
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
45
+ revocation_url: z.ZodOptional<z.ZodString>;
46
+ }, z.core.$strip>;
47
+ export declare const signedMandateSchema: z.ZodObject<{
48
+ alg: z.ZodLiteral<"ed25519">;
49
+ pubkey: z.ZodString;
50
+ signature: z.ZodString;
51
+ payload: z.ZodObject<{
52
+ mandate_id: z.ZodString;
53
+ kind: z.ZodEnum<{
54
+ intent: "intent";
55
+ cart: "cart";
56
+ }>;
57
+ agent: z.ZodString;
58
+ holder: z.ZodString;
59
+ cap: z.ZodObject<{
60
+ amount: z.ZodNumber;
61
+ currency: z.ZodString;
62
+ period: z.ZodEnum<{
63
+ single: "single";
64
+ daily: "daily";
65
+ weekly: "weekly";
66
+ monthly: "monthly";
67
+ }>;
68
+ }, z.core.$strip>;
69
+ merchant_allow: z.ZodOptional<z.ZodArray<z.ZodString>>;
70
+ merchant_block: z.ZodOptional<z.ZodArray<z.ZodString>>;
71
+ not_before: z.ZodOptional<z.ZodString>;
72
+ expires_at: z.ZodString;
73
+ line_items: z.ZodOptional<z.ZodArray<z.ZodObject<{
74
+ sku: z.ZodString;
75
+ qty: z.ZodNumber;
76
+ unit_amount: z.ZodNumber;
77
+ currency: z.ZodString;
78
+ }, z.core.$strip>>>;
79
+ total_amount: z.ZodOptional<z.ZodNumber>;
80
+ meta: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
81
+ revocation_url: z.ZodOptional<z.ZodString>;
82
+ }, z.core.$strip>;
83
+ }, z.core.$strip>;
84
+ export type SignedMandateSchema = z.infer<typeof signedMandateSchema>;
85
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/active-mandate/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,cAAc;;;;;;;;;iBAIzB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmBxB,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAK9B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Zod schemas for Active Mandate validation
3
+ */
4
+ import { z } from "zod";
5
+ export const spendCapSchema = z.object({
6
+ amount: z.number().int().nonnegative(),
7
+ currency: z.string(),
8
+ period: z.enum(["single", "daily", "weekly", "monthly"])
9
+ });
10
+ export const mandateSchema = z.object({
11
+ mandate_id: z.string().min(4),
12
+ kind: z.enum(["intent", "cart"]),
13
+ agent: z.string().min(1),
14
+ holder: z.string().min(1),
15
+ cap: spendCapSchema,
16
+ merchant_allow: z.array(z.string()).optional(),
17
+ merchant_block: z.array(z.string()).optional(),
18
+ not_before: z.string().datetime().optional(),
19
+ expires_at: z.string().datetime(),
20
+ line_items: z.array(z.object({
21
+ sku: z.string(),
22
+ qty: z.number().int().positive(),
23
+ unit_amount: z.number().int().nonnegative(),
24
+ currency: z.string()
25
+ })).optional(),
26
+ total_amount: z.number().int().nonnegative().optional(),
27
+ meta: z.record(z.string(), z.any()).optional(),
28
+ revocation_url: z.string().url().optional()
29
+ });
30
+ export const signedMandateSchema = z.object({
31
+ alg: z.literal("ed25519"),
32
+ pubkey: z.string().min(8),
33
+ signature: z.string().min(8),
34
+ payload: mandateSchema
35
+ });
36
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/active-mandate/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;CACzD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,GAAG,EAAE,cAAc;IACnB,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;QAC3C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CAAC,CAAC,QAAQ,EAAE;IACd,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACvD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CAC5C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,EAAE,aAAa;CACvB,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Canonical JSON signing and Ed25519 verification for Active Mandates
3
+ */
4
+ export declare function canonicalizeJSON(obj: unknown): Uint8Array;
5
+ export declare function verifyEd25519Signature(pubkeyBase64: string, signatureBase64: string, payload: unknown): boolean;
6
+ export declare function signWithTweetnacl(payload: unknown, secretKey: Uint8Array): string;
7
+ export declare function getPublicKeyBase64(secretKey: Uint8Array): string;
8
+ //# sourceMappingURL=signing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../src/active-mandate/signing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAgBzD;AAED,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAS/G;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,GAAG,MAAM,CAIjF;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,CAGhE"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Canonical JSON signing and Ed25519 verification for Active Mandates
3
+ */
4
+ import nacl from "tweetnacl";
5
+ function decodeBase64(s) {
6
+ if (typeof Buffer !== "undefined")
7
+ return new Uint8Array(Buffer.from(s, "base64"));
8
+ // for environments without Buffer
9
+ const bin = atob(s);
10
+ const bytes = new Uint8Array(bin.length);
11
+ for (let i = 0; i < bin.length; i++)
12
+ bytes[i] = bin.charCodeAt(i);
13
+ return bytes;
14
+ }
15
+ function encodeBase64(bytes) {
16
+ if (typeof Buffer !== "undefined")
17
+ return Buffer.from(bytes).toString("base64");
18
+ // for environments without Buffer
19
+ let binary = "";
20
+ for (let i = 0; i < bytes.length; i++) {
21
+ binary += String.fromCharCode(bytes[i] ?? 0);
22
+ }
23
+ return btoa(binary);
24
+ }
25
+ export function canonicalizeJSON(obj) {
26
+ // deterministic JSON stringify by sorting keys recursively
27
+ const stable = (v) => {
28
+ if (Array.isArray(v))
29
+ return v.map(stable);
30
+ if (v && typeof v === "object") {
31
+ return Object.keys(v).sort().reduce((acc, k) => {
32
+ acc[k] = stable(v[k]);
33
+ return acc;
34
+ }, {});
35
+ }
36
+ return v;
37
+ };
38
+ const text = JSON.stringify(stable(obj));
39
+ if (typeof Buffer !== "undefined")
40
+ return new Uint8Array(Buffer.from(text, "utf8"));
41
+ const encoder = new TextEncoder();
42
+ return encoder.encode(text);
43
+ }
44
+ export function verifyEd25519Signature(pubkeyBase64, signatureBase64, payload) {
45
+ try {
46
+ const pub = decodeBase64(pubkeyBase64);
47
+ const sig = decodeBase64(signatureBase64);
48
+ const msg = canonicalizeJSON(payload);
49
+ return nacl.sign.detached.verify(msg, sig, pub);
50
+ }
51
+ catch (error) {
52
+ return false;
53
+ }
54
+ }
55
+ export function signWithTweetnacl(payload, secretKey) {
56
+ const msg = canonicalizeJSON(payload);
57
+ const signature = nacl.sign.detached(msg, secretKey);
58
+ return encodeBase64(signature);
59
+ }
60
+ export function getPublicKeyBase64(secretKey) {
61
+ const keyPair = nacl.sign.keyPair.fromSecretKey(secretKey);
62
+ return encodeBase64(keyPair.publicKey);
63
+ }
64
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.js","sourceRoot":"","sources":["../../src/active-mandate/signing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,SAAS,YAAY,CAAC,CAAS;IAC7B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnF,kCAAkC;IAClC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAiB;IACrC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChF,kCAAkC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,2DAA2D;IAC3D,MAAM,MAAM,GAAG,CAAC,CAAM,EAAO,EAAE;QAC7B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;gBAC7C,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,OAAO,GAAG,CAAC;YACb,CAAC,EAAE,EAA6B,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,YAAoB,EAAE,eAAuB,EAAE,OAAgB;IACpG,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,SAAqB;IACvE,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACrD,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAqB;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Active Mandate types for autonomous agent payment authorization
3
+ * Based on ACP (Agent Commerce Protocol) specification
4
+ */
5
+ export type Currency = "USD" | "CAD" | "EUR" | string;
6
+ export interface SpendCap {
7
+ amount: number;
8
+ currency: Currency;
9
+ period: "single" | "daily" | "weekly" | "monthly";
10
+ }
11
+ export interface MandateCap {
12
+ cap: SpendCap;
13
+ }
14
+ export interface MandateParty {
15
+ agent: string;
16
+ holder: string;
17
+ }
18
+ export interface MerchantRules {
19
+ merchant_allow?: string[];
20
+ merchant_block?: string[];
21
+ }
22
+ export interface TimeWindow {
23
+ not_before?: string;
24
+ expires_at: string;
25
+ }
26
+ export type MandateKind = "intent" | "cart";
27
+ export interface MandateBody extends MandateParty, MandateCap, MerchantRules, TimeWindow {
28
+ mandate_id: string;
29
+ kind: MandateKind;
30
+ line_items?: Array<{
31
+ sku: string;
32
+ qty: number;
33
+ unit_amount: number;
34
+ currency: Currency;
35
+ }>;
36
+ total_amount?: number;
37
+ meta?: Record<string, unknown>;
38
+ revocation_url?: string;
39
+ }
40
+ export interface SignedMandate {
41
+ alg: "ed25519";
42
+ pubkey: string;
43
+ signature: string;
44
+ payload: MandateBody;
45
+ }
46
+ export interface VerificationResult {
47
+ valid: boolean;
48
+ reason?: string;
49
+ }
50
+ export interface RevocationRecord {
51
+ mandate_id: string;
52
+ revoked_at: string;
53
+ reason?: string;
54
+ }
55
+ export interface ExecutionGuard {
56
+ allowed: boolean;
57
+ reason?: string;
58
+ }
59
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/active-mandate/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU;IACtF,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,WAAW,CAAC;IAElB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,QAAQ,CAAC;KACpB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,SAAS,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Active Mandate types for autonomous agent payment authorization
3
+ * Based on ACP (Agent Commerce Protocol) specification
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/active-mandate/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ declare const activeMandateCommand: Command;
3
+ export { activeMandateCommand };
4
+ //# sourceMappingURL=active-mandate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-mandate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/active-mandate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,QAAA,MAAM,oBAAoB,SAE4C,CAAC;AAyOvE,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
@@ -0,0 +1,218 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { readFile, writeFile } from 'fs/promises';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import { validateAndVerify, guardExecution, revoke, getAllRevocations, formatAmount, formatPeriod, copy } from '../../active-mandate/index.js';
7
+ import nacl from 'tweetnacl';
8
+ const activeMandateCommand = new Command('active-mandate')
9
+ .alias('am')
10
+ .description('Manage Active Mandates for autonomous agent payments');
11
+ // Create subcommand
12
+ activeMandateCommand
13
+ .command('create')
14
+ .description('Create a new Active Mandate')
15
+ .requiredOption('-a, --agent <name>', 'Agent identifier (e.g., claude-shopbot@agentics)')
16
+ .requiredOption('-h, --holder <name>', 'Holder/user identifier')
17
+ .requiredOption('--amount <number>', 'Spend cap amount in minor units (e.g., 12000 = $120.00)', parseInt)
18
+ .option('--currency <code>', 'Currency code', 'USD')
19
+ .option('--period <type>', 'Spend period: single, daily, weekly, monthly', 'single')
20
+ .option('-k, --kind <type>', 'Mandate kind: intent or cart', 'intent')
21
+ .option('--merchant-allow <hosts>', 'Comma-separated list of allowed merchant hostnames')
22
+ .option('--merchant-block <hosts>', 'Comma-separated list of blocked merchant hostnames')
23
+ .option('--expires <iso>', 'Expiration date (ISO8601)', new Date(Date.now() + 86400000).toISOString())
24
+ .option('--not-before <iso>', 'Not valid before date (ISO8601)')
25
+ .option('-o, --output <file>', 'Save mandate to file')
26
+ .action(async (options) => {
27
+ const spinner = ora('Creating Active Mandate...').start();
28
+ try {
29
+ const mandateBody = {
30
+ mandate_id: `mandate_${uuidv4()}`,
31
+ kind: options.kind,
32
+ agent: options.agent,
33
+ holder: options.holder,
34
+ cap: {
35
+ amount: options.amount,
36
+ currency: options.currency,
37
+ period: options.period
38
+ },
39
+ expires_at: options.expires,
40
+ ...(options.notBefore && { not_before: options.notBefore }),
41
+ ...(options.merchantAllow && { merchant_allow: options.merchantAllow.split(',') }),
42
+ ...(options.merchantBlock && { merchant_block: options.merchantBlock.split(',') })
43
+ };
44
+ spinner.succeed(chalk.green('Active Mandate created'));
45
+ const output = JSON.stringify(mandateBody, null, 2);
46
+ if (options.output) {
47
+ await writeFile(options.output, output, 'utf-8');
48
+ console.log(chalk.blue(`\n✓ Mandate saved to: ${options.output}`));
49
+ }
50
+ else {
51
+ console.log('\n' + chalk.cyan.bold('Active Mandate:'));
52
+ console.log(chalk.white(output));
53
+ }
54
+ // Display summary
55
+ console.log('\n' + chalk.yellow.bold('Summary:'));
56
+ console.log(chalk.gray(` ${copy.en.mandateId}: ${mandateBody.mandate_id}`));
57
+ console.log(chalk.gray(` ${copy.en.agent}: ${mandateBody.agent}`));
58
+ console.log(chalk.gray(` ${copy.en.holder}: ${mandateBody.holder}`));
59
+ console.log(chalk.gray(` ${copy.en.spendCap}: ${formatAmount(mandateBody.cap.amount, mandateBody.cap.currency)} ${formatPeriod(mandateBody.cap.period)}`));
60
+ console.log(chalk.gray(` ${copy.en.expires}: ${new Date(mandateBody.expires_at).toLocaleString()}\n`));
61
+ }
62
+ catch (error) {
63
+ spinner.fail(chalk.red('Failed to create mandate'));
64
+ console.error(chalk.red('\nError:'), error.message);
65
+ process.exit(1);
66
+ }
67
+ });
68
+ // Sign subcommand
69
+ activeMandateCommand
70
+ .command('sign')
71
+ .description('Sign an Active Mandate with Ed25519')
72
+ .requiredOption('-f, --file <path>', 'Mandate file to sign')
73
+ .requiredOption('-k, --key <hex>', 'Private key (hex format, 64 bytes)')
74
+ .option('-o, --output <file>', 'Save signed mandate to file')
75
+ .action(async (options) => {
76
+ const spinner = ora('Signing mandate...').start();
77
+ try {
78
+ // Load mandate
79
+ const content = await readFile(options.file, 'utf-8');
80
+ const mandateBody = JSON.parse(content);
81
+ // Parse private key
82
+ const keyHex = options.key.replace(/^0x/, '');
83
+ const privateKeyBytes = new Uint8Array(keyHex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
84
+ if (privateKeyBytes.length !== 64) {
85
+ throw new Error('Private key must be 64 bytes (128 hex characters)');
86
+ }
87
+ // Generate keypair and sign
88
+ const keyPair = nacl.sign.keyPair.fromSecretKey(privateKeyBytes);
89
+ // Import signing functions
90
+ const { canonicalizeJSON } = await import('../../active-mandate/signing.js');
91
+ const msg = canonicalizeJSON(mandateBody);
92
+ const signature = nacl.sign.detached(msg, privateKeyBytes);
93
+ const signedMandate = {
94
+ alg: 'ed25519',
95
+ pubkey: Buffer.from(keyPair.publicKey).toString('base64'),
96
+ signature: Buffer.from(signature).toString('base64'),
97
+ payload: mandateBody
98
+ };
99
+ spinner.succeed(chalk.green('Mandate signed successfully'));
100
+ const output = JSON.stringify(signedMandate, null, 2);
101
+ if (options.output) {
102
+ await writeFile(options.output, output, 'utf-8');
103
+ console.log(chalk.blue(`\n✓ Signed mandate saved to: ${options.output}\n`));
104
+ }
105
+ else {
106
+ console.log('\n' + chalk.cyan.bold('Signed Mandate:'));
107
+ console.log(chalk.white(output) + '\n');
108
+ }
109
+ }
110
+ catch (error) {
111
+ spinner.fail(chalk.red('Failed to sign mandate'));
112
+ console.error(chalk.red('\nError:'), error.message);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ // Verify subcommand
117
+ activeMandateCommand
118
+ .command('verify')
119
+ .description('Verify an Active Mandate signature and validity')
120
+ .requiredOption('-f, --file <path>', 'Signed mandate file')
121
+ .option('-v, --verbose', 'Show detailed validation results')
122
+ .action(async (options) => {
123
+ const spinner = ora('Verifying mandate...').start();
124
+ try {
125
+ const content = await readFile(options.file, 'utf-8');
126
+ const signedMandate = JSON.parse(content);
127
+ const result = validateAndVerify(signedMandate);
128
+ spinner.stop();
129
+ if (result.valid && result.parsed) {
130
+ console.log(chalk.green.bold('\n✓ MANDATE VALID\n'));
131
+ const guard = guardExecution(result.parsed);
132
+ if (guard.allowed) {
133
+ console.log(chalk.green('✓ Execution allowed'));
134
+ }
135
+ else {
136
+ console.log(chalk.red(`✗ Execution blocked: ${guard.reason}`));
137
+ }
138
+ if (options.verbose) {
139
+ console.log('\n' + chalk.white.bold('Mandate Details:'));
140
+ console.log(chalk.gray(` ${copy.en.mandateId}: ${result.parsed.payload.mandate_id}`));
141
+ console.log(chalk.gray(` ${copy.en.agent}: ${result.parsed.payload.agent}`));
142
+ console.log(chalk.gray(` ${copy.en.holder}: ${result.parsed.payload.holder}`));
143
+ console.log(chalk.gray(` ${copy.en.spendCap}: ${formatAmount(result.parsed.payload.cap.amount, result.parsed.payload.cap.currency)} ${formatPeriod(result.parsed.payload.cap.period)}`));
144
+ console.log(chalk.gray(` ${copy.en.expires}: ${new Date(result.parsed.payload.expires_at).toLocaleString()}`));
145
+ if (result.parsed.payload.merchant_allow) {
146
+ console.log(chalk.gray(` ${copy.en.allowed}: ${result.parsed.payload.merchant_allow.join(', ')}`));
147
+ }
148
+ }
149
+ console.log();
150
+ process.exit(0);
151
+ }
152
+ else {
153
+ console.log(chalk.red.bold('\n✗ MANDATE INVALID\n'));
154
+ console.log(chalk.red(`Reason: ${result.reason}\n`));
155
+ process.exit(1);
156
+ }
157
+ }
158
+ catch (error) {
159
+ spinner.fail(chalk.red('Verification failed'));
160
+ console.error(chalk.red('\nError:'), error.message);
161
+ process.exit(1);
162
+ }
163
+ });
164
+ // Revoke subcommand
165
+ activeMandateCommand
166
+ .command('revoke')
167
+ .description('Revoke an Active Mandate')
168
+ .requiredOption('-i, --id <mandate_id>', 'Mandate ID to revoke')
169
+ .option('-r, --reason <text>', 'Revocation reason')
170
+ .action(async (options) => {
171
+ const spinner = ora('Revoking mandate...').start();
172
+ try {
173
+ const record = revoke(options.id, options.reason);
174
+ spinner.succeed(chalk.green('Mandate revoked'));
175
+ console.log('\n' + chalk.yellow.bold('Revocation Record:'));
176
+ console.log(chalk.gray(` Mandate ID: ${record.mandate_id}`));
177
+ console.log(chalk.gray(` Revoked at: ${new Date(record.revoked_at).toLocaleString()}`));
178
+ if (record.reason) {
179
+ console.log(chalk.gray(` Reason: ${record.reason}`));
180
+ }
181
+ console.log();
182
+ }
183
+ catch (error) {
184
+ spinner.fail(chalk.red('Failed to revoke mandate'));
185
+ console.error(chalk.red('\nError:'), error.message);
186
+ process.exit(1);
187
+ }
188
+ });
189
+ // List revocations subcommand
190
+ activeMandateCommand
191
+ .command('revocations')
192
+ .alias('list-revoked')
193
+ .description('List all revoked mandates')
194
+ .action(async () => {
195
+ try {
196
+ const revocations = getAllRevocations();
197
+ if (revocations.length === 0) {
198
+ console.log(chalk.gray('\nNo revoked mandates found.\n'));
199
+ return;
200
+ }
201
+ console.log('\n' + chalk.cyan.bold(`Revoked Mandates (${revocations.length}):`));
202
+ console.log(chalk.cyan.bold('═'.repeat(60)) + '\n');
203
+ revocations.forEach((rec, idx) => {
204
+ console.log(chalk.white(`${idx + 1}. ${rec.mandate_id}`));
205
+ console.log(chalk.gray(` Revoked: ${new Date(rec.revoked_at).toLocaleString()}`));
206
+ if (rec.reason) {
207
+ console.log(chalk.gray(` Reason: ${rec.reason}`));
208
+ }
209
+ console.log();
210
+ });
211
+ }
212
+ catch (error) {
213
+ console.error(chalk.red('Error:'), error.message);
214
+ process.exit(1);
215
+ }
216
+ });
217
+ export { activeMandateCommand };
218
+ //# sourceMappingURL=active-mandate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"active-mandate.js","sourceRoot":"","sources":["../../../src/cli/commands/active-mandate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,IAAI,EACL,MAAM,+BAA+B,CAAC;AAEvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,oBAAoB,GAAG,IAAI,OAAO,CAAC,gBAAgB,CAAC;KACvD,KAAK,CAAC,IAAI,CAAC;KACX,WAAW,CAAC,sDAAsD,CAAC,CAAC;AAEvE,oBAAoB;AACpB,oBAAoB;KACjB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,6BAA6B,CAAC;KAC1C,cAAc,CAAC,oBAAoB,EAAE,kDAAkD,CAAC;KACxF,cAAc,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;KAC/D,cAAc,CAAC,mBAAmB,EAAE,yDAAyD,EAAE,QAAQ,CAAC;KACxG,MAAM,CAAC,mBAAmB,EAAE,eAAe,EAAE,KAAK,CAAC;KACnD,MAAM,CAAC,iBAAiB,EAAE,8CAA8C,EAAE,QAAQ,CAAC;KACnF,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,QAAQ,CAAC;KACrE,MAAM,CAAC,0BAA0B,EAAE,oDAAoD,CAAC;KACxF,MAAM,CAAC,0BAA0B,EAAE,oDAAoD,CAAC;KACxF,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;KACrG,MAAM,CAAC,oBAAoB,EAAE,iCAAiC,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAE1D,IAAI,CAAC;QACH,MAAM,WAAW,GAAgB;YAC/B,UAAU,EAAE,WAAW,MAAM,EAAE,EAAE;YACjC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE;gBACH,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB;YACD,UAAU,EAAE,OAAO,CAAC,OAAO;YAC3B,GAAG,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;YAC3D,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAClF,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;SACnF,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,kBAAkB;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,QAAQ,KAAK,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5J,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1G,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,kBAAkB;AAClB,oBAAoB;KACjB,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,qCAAqC,CAAC;KAClD,cAAc,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;KAC3D,cAAc,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KACvE,MAAM,CAAC,qBAAqB,EAAE,6BAA6B,CAAC;KAC5D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC,KAAK,EAAE,CAAC;IAElD,IAAI,CAAC;QACH,eAAe;QACf,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;QAEvD,oBAAoB;QACpB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,IAAI,UAAU,CACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CACnE,CAAC;QAEF,IAAI,eAAe,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QAED,4BAA4B;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QAEjE,2BAA2B;QAC3B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAE3D,MAAM,aAAa,GAAkB;YACnC,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzD,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpD,OAAO,EAAE,WAAW;SACrB,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;QAE5D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1C,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oBAAoB;AACpB,oBAAoB;KACjB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,cAAc,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;KAC1D,MAAM,CAAC,eAAe,EAAE,kCAAkC,CAAC;KAC3D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,sBAAsB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,MAAM,GAAG,iBAAiB,CAAC,aAAa,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAErD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,SAAS,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC9E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,QAAQ,KAAK,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC1L,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;gBAChH,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;oBACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACtG,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IAEH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,oBAAoB;AACpB,oBAAoB;KACjB,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,0BAA0B,CAAC;KACvC,cAAc,CAAC,uBAAuB,EAAE,sBAAsB,CAAC;KAC/D,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAEhD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACpD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,8BAA8B;AAC9B,oBAAoB;KACjB,OAAO,CAAC,aAAa,CAAC;KACtB,KAAK,CAAC,cAAc,CAAC;KACrB,WAAW,CAAC,2BAA2B,CAAC;KACxC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,iBAAiB,EAAE,CAAC;QAExC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAEpD,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC;YACpF,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;IAEL,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,EAAE,oBAAoB,EAAE,CAAC"}