@nevermined-io/payments 1.0.10 → 1.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 (53) hide show
  1. package/dist/a2a/paymentsClient.d.ts +3 -1
  2. package/dist/a2a/paymentsClient.d.ts.map +1 -1
  3. package/dist/a2a/paymentsClient.js +13 -4
  4. package/dist/a2a/paymentsClient.js.map +1 -1
  5. package/dist/a2a/paymentsRequestHandler.d.ts.map +1 -1
  6. package/dist/a2a/paymentsRequestHandler.js +8 -3
  7. package/dist/a2a/paymentsRequestHandler.js.map +1 -1
  8. package/dist/a2a/server.d.ts.map +1 -1
  9. package/dist/a2a/server.js +5 -3
  10. package/dist/a2a/server.js.map +1 -1
  11. package/dist/common/types.d.ts +42 -3
  12. package/dist/common/types.d.ts.map +1 -1
  13. package/dist/common/types.js +13 -0
  14. package/dist/common/types.js.map +1 -1
  15. package/dist/index.d.ts +3 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -1
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp/core/auth.d.ts.map +1 -1
  20. package/dist/mcp/core/auth.js +3 -0
  21. package/dist/mcp/core/auth.js.map +1 -1
  22. package/dist/mcp/core/paywall.d.ts.map +1 -1
  23. package/dist/mcp/core/paywall.js +13 -4
  24. package/dist/mcp/core/paywall.js.map +1 -1
  25. package/dist/payments.d.ts +7 -0
  26. package/dist/payments.d.ts.map +1 -1
  27. package/dist/payments.js +14 -0
  28. package/dist/payments.js.map +1 -1
  29. package/dist/x402/delegation-api.d.ts +43 -0
  30. package/dist/x402/delegation-api.d.ts.map +1 -0
  31. package/dist/x402/delegation-api.js +54 -0
  32. package/dist/x402/delegation-api.js.map +1 -0
  33. package/dist/x402/express/middleware.d.ts +4 -2
  34. package/dist/x402/express/middleware.d.ts.map +1 -1
  35. package/dist/x402/express/middleware.js +5 -2
  36. package/dist/x402/express/middleware.js.map +1 -1
  37. package/dist/x402/facilitator-api.d.ts +14 -1
  38. package/dist/x402/facilitator-api.d.ts.map +1 -1
  39. package/dist/x402/facilitator-api.js +39 -3
  40. package/dist/x402/facilitator-api.js.map +1 -1
  41. package/dist/x402/index.d.ts +5 -1
  42. package/dist/x402/index.d.ts.map +1 -1
  43. package/dist/x402/index.js +4 -1
  44. package/dist/x402/index.js.map +1 -1
  45. package/dist/x402/token.d.ts +2 -2
  46. package/dist/x402/token.d.ts.map +1 -1
  47. package/dist/x402/token.js +25 -16
  48. package/dist/x402/token.js.map +1 -1
  49. package/dist/x402/visa-token-api.d.ts +14 -7
  50. package/dist/x402/visa-token-api.d.ts.map +1 -1
  51. package/dist/x402/visa-token-api.js +27 -16
  52. package/dist/x402/visa-token-api.js.map +1 -1
  53. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
1
  import { Payments } from '../index.js';
2
+ import type { CardDelegationConfig } from '../common/types.js';
2
3
  import { MessageSendParams, SendMessageResponse, TaskQueryParams, GetTaskResponse, TaskPushNotificationConfig, SetTaskPushNotificationConfigResponse, TaskIdParams, GetTaskPushNotificationConfigResponse, JSONRPCResponse, JSONRPCErrorResponse } from '@a2a-js/sdk';
3
4
  import { A2AClient } from '@a2a-js/sdk/client';
4
5
  /**
@@ -9,6 +10,7 @@ export declare class PaymentsClient extends A2AClient {
9
10
  payments: Payments;
10
11
  private readonly agentId;
11
12
  private readonly planId;
13
+ private readonly delegationConfig?;
12
14
  private accessToken;
13
15
  /**
14
16
  * Creates a new PaymentsClient instance.
@@ -23,7 +25,7 @@ export declare class PaymentsClient extends A2AClient {
23
25
  * Creates a PaymentsClient by fetching the AgentCard first and then
24
26
  * constructing the underlying A2AClient with the AgentCard object.
25
27
  */
26
- static create(agentBaseUrl: string, payments: Payments, agentId: string, planId: string, agentCardPath?: string): Promise<PaymentsClient>;
28
+ static create(agentBaseUrl: string, payments: Payments, agentId: string, planId: string, agentCardPath?: string, delegationConfig?: CardDelegationConfig): Promise<PaymentsClient>;
27
29
  /**
28
30
  * Gets and caches the access token for this client instance.
29
31
  * @returns The access token string.
@@ -1 +1 @@
1
- {"version":3,"file":"paymentsClient.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,qCAAqC,EACrC,YAAY,EACZ,qCAAqC,EACrC,eAAe,EACf,oBAAoB,EACrB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAI9C;;;GAGG;AACH,qBAAa,cAAe,SAAQ,SAAS;IACpC,QAAQ,EAAE,QAAQ,CAAA;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,WAAW,CAAe;IAElC;;;;;;;OAOG;IACH,OAAO;IAQP;;;OAGG;WACiB,MAAM,CACxB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,aAAa,SAA2B,GACvC,OAAO,CAAC,cAAc,CAAC;IAO1B;;;OAGG;YACW,mBAAmB;IASjC;;OAEG;IACI,UAAU;IAIjB;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,IAAI,oBAAoB;IAI5E;;;;OAIG;IACU,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUpF;;;;;;;;OAQG;IACW,oBAAoB,CAChC,MAAM,EAAE,iBAAiB,GACxB,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;IAsDvC;;;;;;;;OAQG;YACY,eAAe;IAoD9B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;;;;;OAMG;IACW,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;IAsD5F;;;;OAIG;IACU,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAU1E;;;;OAIG;IACU,gCAAgC,CAC3C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,qCAAqC,CAAC;IASjD;;;;OAIG;IACU,gCAAgC,CAC3C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,qCAAqC,CAAC;IAUjD;;;;;;OAMG;cACa,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAC3D,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC;CA2CtB;AAED,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,qCAAqC,EACrC,YAAY,EACZ,qCAAqC,GACtC,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"paymentsClient.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,OAAO,KAAK,EAAoB,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,qCAAqC,EACrC,YAAY,EACZ,qCAAqC,EACrC,eAAe,EACf,oBAAoB,EACrB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAI9C;;;GAGG;AACH,qBAAa,cAAe,SAAQ,SAAS;IACpC,QAAQ,EAAE,QAAQ,CAAA;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAsB;IACxD,OAAO,CAAC,WAAW,CAAe;IAElC;;;;;;;OAOG;IACH,OAAO;IAeP;;;OAGG;WACiB,MAAM,CACxB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,aAAa,SAA2B,EACxC,gBAAgB,CAAC,EAAE,oBAAoB,GACtC,OAAO,CAAC,cAAc,CAAC;IAO1B;;;OAGG;YACW,mBAAmB;IA0BjC;;OAEG;IACI,UAAU;IAIjB;;;;OAIG;IACH,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,QAAQ,IAAI,oBAAoB;IAI5E;;;;OAIG;IACU,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUpF;;;;;;;;OAQG;IACW,oBAAoB,CAChC,MAAM,EAAE,iBAAiB,GACxB,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;IAsDvC;;;;;;;;OAQG;YACY,eAAe;IAoD9B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;;;;;OAMG;IACW,kBAAkB,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC;IAsD5F;;;;OAIG;IACU,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAU1E;;;;OAIG;IACU,gCAAgC,CAC3C,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC,qCAAqC,CAAC;IASjD;;;;OAIG;IACU,gCAAgC,CAC3C,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,qCAAqC,CAAC;IAUjD;;;;;;OAMG;cACa,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAC3D,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,OAAO,EACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,SAAS,CAAC;CA2CtB;AAED,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,0BAA0B,EAC1B,qCAAqC,EACrC,YAAY,EACZ,qCAAqC,GACtC,MAAM,aAAa,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { PaymentsError } from '../common/payments.error.js';
2
+ import { resolveScheme } from '../x402/facilitator-api.js';
2
3
  import { A2AClient } from '@a2a-js/sdk/client';
3
4
  import { v4 as uuidv4 } from 'uuid';
4
5
  /**
@@ -14,22 +15,23 @@ export class PaymentsClient extends A2AClient {
14
15
  * @param planId - The ID of the plan.
15
16
  * @param agentCardPath - Optional path to the agent card relative to base URL (defaults to '.well-known/agent.json').
16
17
  */
17
- constructor(agentCard, payments, agentId, planId) {
18
+ constructor(agentCard, payments, agentId, planId, delegationConfig) {
18
19
  super(agentCard);
19
20
  this.payments = payments;
20
21
  this.agentId = agentId;
21
22
  this.planId = planId;
23
+ this.delegationConfig = delegationConfig;
22
24
  this.accessToken = null;
23
25
  }
24
26
  /**
25
27
  * Creates a PaymentsClient by fetching the AgentCard first and then
26
28
  * constructing the underlying A2AClient with the AgentCard object.
27
29
  */
28
- static async create(agentBaseUrl, payments, agentId, planId, agentCardPath = '.well-known/agent.json') {
30
+ static async create(agentBaseUrl, payments, agentId, planId, agentCardPath = '.well-known/agent.json', delegationConfig) {
29
31
  const agentCardUrl = new URL(agentCardPath, agentBaseUrl).toString();
30
32
  const a2a = await A2AClient.fromCardUrl(agentCardUrl);
31
33
  const agentCard = await a2a.getAgentCard();
32
- return new PaymentsClient(agentCard, payments, agentId, planId);
34
+ return new PaymentsClient(agentCard, payments, agentId, planId, delegationConfig);
33
35
  }
34
36
  /**
35
37
  * Gets and caches the access token for this client instance.
@@ -39,7 +41,14 @@ export class PaymentsClient extends A2AClient {
39
41
  if (this.accessToken) {
40
42
  return this.accessToken;
41
43
  }
42
- const accessParams = await this.payments.x402.getX402AccessToken(this.planId, this.agentId);
44
+ const scheme = await resolveScheme(this.payments, this.planId);
45
+ if (scheme === 'nvm:card-delegation' && !this.delegationConfig) {
46
+ throw PaymentsError.internal('Card delegation scheme requires delegationConfig. Pass it to PaymentsClient.create().');
47
+ }
48
+ const tokenOptions = scheme !== 'nvm:erc4337'
49
+ ? { scheme, delegationConfig: this.delegationConfig }
50
+ : undefined;
51
+ const accessParams = await this.payments.x402.getX402AccessToken(this.planId, this.agentId, undefined, undefined, undefined, tokenOptions);
43
52
  this.accessToken = accessParams.accessToken;
44
53
  return this.accessToken;
45
54
  }
@@ -1 +1 @@
1
- {"version":3,"file":"paymentsClient.js","sourceRoot":"","sources":["../../src/a2a/paymentsClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAa3D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAA;AAGnC;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,SAAS;IAM3C;;;;;;;OAOG;IACH,YAAoB,SAAoB,EAAE,QAAkB,EAAE,OAAe,EAAE,MAAc;QAC3F,KAAK,CAAC,SAAS,CAAC,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,MAAM,CACxB,YAAoB,EACpB,QAAkB,EAClB,OAAe,EACf,MAAc,EACd,aAAa,GAAG,wBAAwB;QAExC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAA;QACpE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QACrD,MAAM,SAAS,GAAG,MAAO,GAAW,CAAC,YAAY,EAAE,CAAA;QACnD,OAAO,IAAI,cAAc,CAAC,SAAsB,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IAC9E,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,WAAW,CAAA;QACzB,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAC3F,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAA;QAC3C,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAED;;OAEG;IACI,UAAU;QACf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACH,eAAe,CAAC,QAAyB;QACvC,OAAO,QAAQ,IAAI,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,IAAI,QAAQ,CAAA;IAChF,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,cAAc,CAAC,MAAyB;QACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;QACpD,OAAO,IAAI,CAAC,0BAA0B,CACpC,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAA;IACH,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,CAAC,oBAAoB,CAChC,MAAyB;QAEzB,MAAM,SAAS,GAAG,MAAO,IAAY,CAAC,gBAAgB,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAA;QACH,CAAC;QACD,MAAM,QAAQ,GAAG,MAAO,IAAY,CAAC,mBAAmB,EAAE,CAAA;QAC1D,MAAM,eAAe,GAAG,MAAM,EAAE,CAAA;QAChC,MAAM,UAAU,GAAG;YACjB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,MAAgC;YACxC,EAAE,EAAE,eAAe;SACpB,CAAA;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,mBAAmB;gBAC3B,mBAAmB,EAAE,WAAW;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACjC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,SAAS,GAAG,EAAE,CAAA;YAClB,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;gBACvC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CACb,sDAAsD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CACtK,CAAA;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,gCAAgC,CAAC;oBAAE,MAAM,CAAC,CAAA;gBACnE,MAAM,IAAI,KAAK,CACb,sDAAsD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,eAAe,SAAS,IAAI,SAAS,EAAE,CACpI,CAAA;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sDAAsD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC/F,CAAA;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC,CAAA;QAChG,CAAC;QACD,6BAA6B;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACK,KAAK,CAAC,CAAC,eAAe,CAC5B,QAAkB,EAClB,iBAAyC;QAEzC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;QACxE,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,iBAAiB,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QAC7E,IAAI,MAAM,GAAG,EAAE,CAAA,CAAC,yCAAyC;QACzD,IAAI,eAAe,GAAG,EAAE,CAAA,CAAC,wDAAwD;QAEjF,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;gBAC3C,IAAI,IAAI,EAAE,CAAC;oBACT,yFAAyF;oBACzF,IAAI,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAc,eAAe,EAAE,iBAAiB,CAAC,CAAA;wBACtF,MAAM,MAAM,CAAA;oBACd,CAAC;oBACD,MAAK,CAAC,kBAAkB;gBAC1B,CAAC;gBAED,MAAM,IAAI,KAAK,CAAA,CAAC,6BAA6B;gBAC7C,IAAI,YAAY,CAAA;gBAChB,2CAA2C;gBAC3C,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA,CAAC,wBAAwB;oBAC9E,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA,CAAC,oCAAoC;oBAEhF,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;wBAChB,4CAA4C;wBAC5C,IAAI,eAAe,EAAE,CAAC;4BACpB,2CAA2C;4BAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAc,eAAe,EAAE,iBAAiB,CAAC,CAAA;4BACtF,MAAM,MAAM,CAAA;4BACZ,eAAe,GAAG,EAAE,CAAA,CAAC,kCAAkC;wBACzD,CAAC;oBACH,CAAC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBACpC,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,IAAI,CAAA,CAAC,4CAA4C;oBACtG,CAAC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBAChC,4CAA4C;oBAC9C,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;QAC1D,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAA,CAAC,qCAAqC;QAC5D,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,iBAAiB,CACvB,QAAgB,EAChB,iBAAyC;QAEzC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC/D,CAAC;QACD,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;YAElE,qGAAqG;YACrG,MAAM,iBAAiB,GAAQ,kBAAkB,CAAA;YAEjD,IAAI,iBAAiB,CAAC,EAAE,KAAK,iBAAiB,EAAE,CAAC;gBAC/C,oGAAoG;gBACpG,oGAAoG;gBACpG,MAAM,IAAI,aAAa,CACrB,iEAAiE,iBAAiB,wBAAwB,iBAAiB,CAAC,EAAE,GAAG,EACjI,gBAAgB,CACjB,CAAA;YACH,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBACpE,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAA;gBACnC,MAAM,IAAI,aAAa,CACrB,iCAAiC,GAAG,CAAC,OAAO,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CACrG,CAAA;YACH,CAAC;YAED,gFAAgF;YAChF,IAAI,CAAC,CAAC,QAAQ,IAAI,iBAAiB,CAAC,IAAI,OAAO,iBAAiB,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBACxF,MAAM,IAAI,aAAa,CACrB,gEAAgE,QAAQ,EAAE,EAC1E,gBAAgB,CACjB,CAAA;YACH,CAAC;YAED,OAAO,iBAAgC,CAAA;QACzC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,6FAA6F;YAC7F,IACE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,8BAA8B,CAAC;gBACpD,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,uDAAuD,CAAC,EAC7E,CAAC;gBACD,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAA;YACtD,CAAC;YAED,MAAM,IAAI,aAAa,CACrB,oCAAoC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,yBAAyB,CAAC,CAAC,OAAO,EAAE,EAClG,gBAAgB,CACjB,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,CAAC,kBAAkB,CAAC,MAAoB;QACnD,MAAM,SAAS,GAAG,MAAO,IAAY,CAAC,gBAAgB,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;QACvF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAO,IAAY,CAAC,mBAAmB,EAAE,CAAA;QAC1D,MAAM,eAAe,GAAG,MAAM,EAAE,CAAA;QAChC,MAAM,UAAU,GAAG;YACjB,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,MAAgC;YACxC,EAAE,EAAE,eAAe;SACpB,CAAA;QACD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,mBAAmB;gBAC3B,mBAAmB,EAAE,WAAW;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACjC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,SAAS,GAAG,EAAE,CAAA;YAClB,IAAI,CAAC;gBACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACjC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;gBACvC,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBACpB,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,gBAAgB,SAAS,CAAC,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,CACzK,CAAA;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,gCAAgC,CAAC;oBAAE,MAAM,CAAC,CAAA;gBACnE,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,eAAe,SAAS,IAAI,SAAS,EAAE,CACvI,CAAA;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CACb,yDAAyD,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAClG,CAAA;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAA;QACH,CAAC;QACD,6BAA6B;QAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,CAAC;YAC1E,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU,CAAC,MAAuB;QAC7C,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;QACpD,OAAO,IAAI,CAAC,0BAA0B,CACpC,WAAW,EACX,MAAM,EACN,OAAO,CACR,CAAA;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,gCAAgC,CAC3C,MAAkC;QAElC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;QACpD,OAAO,IAAI,CAAC,0BAA0B,CAGpC,kCAAkC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACxD,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,gCAAgC,CAC3C,MAAoB;QAEpB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAA;QACpD,MAAM,OAAO,GAAG,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAA;QACpD,OAAO,IAAI,CAAC,0BAA0B,CACpC,kCAAkC,EAClC,MAAM,EACN,OAAO,CACR,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,0BAA0B,CACxC,MAAc,EACd,MAAe,EACf,OAAgC;QAEhC,MAAM,QAAQ,GAAG,MAAO,IAAY,CAAC,mBAAmB,EAAE,CAAA;QAC1D,MAAM,SAAS,GAAG,MAAM,EAAE,CAAA;QAC1B,MAAM,UAAU,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,CAAA;QACpE,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACzC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;aACnB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;SACjC,CAAC,CAAA;QACF,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;YACrB,IAAI,aAAa,GAAG,8BAA8B,CAAA;YAClD,IAAI,CAAC;gBACH,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAA;gBACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;gBAC3C,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;oBAC1C,MAAM,IAAI,KAAK,CACb,iBAAiB,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,OAAO,WAAW,SAAS,CAAC,KAAK,CAAC,IAAI,kBAAkB,YAAY,CAAC,MAAM,WAAW,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CACzK,CAAA;gBACH,CAAC;qBAAM,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC9B,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,aAAa,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,eAAe,aAAa,EAAE,CAClH,CAAA;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC;oBAAE,MAAM,CAAC,CAAA;gBAC5F,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,aAAa,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,UAAU,eAAe,aAAa,EAAE,CAClH,CAAA;YACH,CAAC;QACH,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAA;QAC7C,IAAI,WAAW,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,aAAa,CACrB,iDAAiD,MAAM,cAAc,SAAS,SAAS,WAAW,CAAC,EAAE,iDAAiD,EACtJ,gBAAgB,CACjB,CAAA;QACH,CAAC;QACD,OAAO,WAAwB,CAAA;IACjC,CAAC;CACF","sourcesContent":["import { Payments } from '../index.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport {\n MessageSendParams,\n SendMessageResponse,\n TaskQueryParams,\n GetTaskResponse,\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse,\n TaskIdParams,\n GetTaskPushNotificationConfigResponse,\n JSONRPCResponse,\n JSONRPCErrorResponse,\n} from '@a2a-js/sdk'\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { AgentCard } from './types.js'\n\n/**\n * PaymentsClient is a high-level client for A2A agents with payments integration.\n * Each instance is bound to a specific agentId and planId.\n */\nexport class PaymentsClient extends A2AClient {\n public payments: Payments\n private readonly agentId: string\n private readonly planId: string\n private accessToken: string | null\n\n /**\n * Creates a new PaymentsClient instance.\n * @param agentBaseUrl - The base URL of the agent (e.g. http://localhost:3005/a2a/).\n * @param payments - The Payments object.\n * @param agentId - The ID of the agent.\n * @param planId - The ID of the plan.\n * @param agentCardPath - Optional path to the agent card relative to base URL (defaults to '.well-known/agent.json').\n */\n private constructor(agentCard: AgentCard, payments: Payments, agentId: string, planId: string) {\n super(agentCard)\n this.payments = payments\n this.agentId = agentId\n this.planId = planId\n this.accessToken = null\n }\n\n /**\n * Creates a PaymentsClient by fetching the AgentCard first and then\n * constructing the underlying A2AClient with the AgentCard object.\n */\n public static async create(\n agentBaseUrl: string,\n payments: Payments,\n agentId: string,\n planId: string,\n agentCardPath = '.well-known/agent.json',\n ): Promise<PaymentsClient> {\n const agentCardUrl = new URL(agentCardPath, agentBaseUrl).toString()\n const a2a = await A2AClient.fromCardUrl(agentCardUrl)\n const agentCard = await (a2a as any).getAgentCard()\n return new PaymentsClient(agentCard as AgentCard, payments, agentId, planId)\n }\n\n /**\n * Gets and caches the access token for this client instance.\n * @returns The access token string.\n */\n private async _getX402AccessToken(): Promise<string> {\n if (this.accessToken) {\n return this.accessToken\n }\n const accessParams = await this.payments.x402.getX402AccessToken(this.planId, this.agentId)\n this.accessToken = accessParams.accessToken\n return this.accessToken\n }\n\n /**\n * Clears the cached access token for this client instance.\n */\n public clearToken() {\n this.accessToken = null\n }\n\n /**\n * Type guard to check if a JSON-RPC response is an error response.\n * @param response - The JSON-RPC response to check\n * @returns true if the response contains an error, false otherwise\n */\n isErrorResponse(response: JSONRPCResponse): response is JSONRPCErrorResponse {\n return response != null && typeof response === 'object' && 'error' in response\n }\n\n /**\n * Sends a message to the agent, managing authentication automatically.\n * @param params - The parameters for sending the message.\n * @returns The response from the agent.\n */\n public async sendA2AMessage(params: MessageSendParams): Promise<SendMessageResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<MessageSendParams, SendMessageResponse>(\n 'message/send',\n params,\n headers,\n )\n }\n\n /**\n * Sends a message to the agent and streams back responses using Server-Sent Events (SSE).\n * Push notification configuration can be specified in `params.configuration`.\n * Optionally, `params.message.contextId` or `params.message.taskId` can be provided.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params - The parameters for sending the message.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n * The generator throws an error if streaming is not supported or if an HTTP/SSE error occurs.\n */\n public async *sendA2AMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<any, void, undefined> {\n const agentCard = await (this as any).agentCardPromise\n if (!agentCard.capabilities?.streaming) {\n throw new Error(\n 'Agent does not support streaming (AgentCard.capabilities.streaming is not true).',\n )\n }\n const endpoint = await (this as any)._getServiceEndpoint()\n const clientRequestId = uuidv4()\n const rpcRequest = {\n jsonrpc: '2.0',\n method: 'message/stream',\n params: params as { [key: string]: any },\n id: clientRequestId,\n }\n const accessToken = await this._getX402AccessToken()\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n 'payment-signature': accessToken,\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!response.ok) {\n let errorBody = ''\n try {\n errorBody = await response.text()\n const errorJson = JSON.parse(errorBody)\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`,\n )\n }\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}`,\n )\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\"Invalid response Content-Type for SSE stream. Expected 'text/event-stream'.\")\n }\n // Parse and yield SSE events\n for await (const event of this._parseA2AStream(response, clientRequestId)) {\n yield event\n }\n }\n\n /**\n * Parses an HTTP response body as an A2A Server-Sent Event stream.\n * Each 'data' field of an SSE event is expected to be a JSON-RPC 2.0 Response object,\n * specifically a SendStreamingMessageResponse (or similar structure for resubscribe).\n * @param response -The HTTP Response object whose body is the SSE stream.\n * @param originalRequestId - The ID of the client's JSON-RPC request that initiated this stream.\n * Used to validate the `id` in the streamed JSON-RPC responses.\n * @returns An AsyncGenerator yielding the `result` field of each valid JSON-RPC success response from the stream.\n */\n private async *_parseA2AStream<TStreamItem>(\n response: Response,\n originalRequestId: number | string | null,\n ): AsyncGenerator<TStreamItem, void, undefined> {\n if (!response.body) {\n throw new Error('SSE response body is undefined. Cannot read stream.')\n }\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()\n let buffer = '' // Holds incomplete lines from the stream\n let eventDataBuffer = '' // Holds accumulated 'data:' lines for the current event\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n // Process any final buffered event data if the stream ends abruptly after a 'data:' line\n if (eventDataBuffer.trim()) {\n const result = this._processEventData<TStreamItem>(eventDataBuffer, originalRequestId)\n yield result\n }\n break // Stream finished\n }\n\n buffer += value // Append new chunk to buffer\n let lineEndIndex\n // Process all complete lines in the buffer\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.substring(0, lineEndIndex).trim() // Get and trim the line\n buffer = buffer.substring(lineEndIndex + 1) // Remove processed line from buffer\n\n if (line === '') {\n // Empty line: signifies the end of an event\n if (eventDataBuffer) {\n // If we have accumulated data for an event\n const result = this._processEventData<TStreamItem>(eventDataBuffer, originalRequestId)\n yield result\n eventDataBuffer = '' // Reset buffer for the next event\n }\n } else if (line.startsWith('data:')) {\n eventDataBuffer += line.substring(5).trimStart() + '\\n' // Append data (multi-line data is possible)\n } else if (line.startsWith(':')) {\n // This is a comment line in SSE, ignore it.\n }\n }\n }\n } catch (error: any) {\n throw new PaymentsError(error.message, 'payments_error')\n } finally {\n reader.releaseLock() // Ensure the reader lock is released\n }\n }\n\n /**\n * Processes a single SSE event's data string, expecting it to be a JSON-RPC response.\n * @param jsonData - The string content from one or more 'data:' lines of an SSE event.\n * @param originalRequestId - The ID of the client's request that initiated the stream.\n * @returns The `result` field of the parsed JSON-RPC success response.\n * @throws Error if data is not valid JSON, not a valid JSON-RPC response, an error response, or ID mismatch.\n */\n private _processEventData<TStreamItem>(\n jsonData: string,\n originalRequestId: number | string | null,\n ): TStreamItem {\n if (!jsonData.trim()) {\n throw new Error('Attempted to process empty SSE event data.')\n }\n try {\n // SSE data can be multi-line, ensure it's treated as a single JSON string.\n const sseJsonRpcResponse = JSON.parse(jsonData.replace(/\\n$/, ''))\n\n // Type assertion to SendStreamingMessageResponse, as this is the expected structure for A2A streams.\n const a2aStreamResponse: any = sseJsonRpcResponse\n\n if (a2aStreamResponse.id !== originalRequestId) {\n // According to JSON-RPC spec, notifications (which SSE events can be seen as) might not have an ID,\n // or if they do, it should match. A2A spec implies streamed events are tied to the initial request.\n throw new PaymentsError(\n `SSE Event's JSON-RPC response ID mismatch. Client request ID: ${originalRequestId}, event response ID: ${a2aStreamResponse.id}.`,\n 'payments_error',\n )\n }\n\n if (this.isErrorResponse && this.isErrorResponse(a2aStreamResponse)) {\n const err = a2aStreamResponse.error\n throw new PaymentsError(\n `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data)}`,\n )\n }\n\n // Check if 'result' exists, as it's mandatory for successful JSON-RPC responses\n if (!('result' in a2aStreamResponse) || typeof a2aStreamResponse.result === 'undefined') {\n throw new PaymentsError(\n `SSE event JSON-RPC response is missing 'result' field. Data: ${jsonData}`,\n 'payments_error',\n )\n }\n\n return a2aStreamResponse as TStreamItem\n } catch (e: any) {\n // Catch errors from JSON.parse or if it's an error response that was thrown by this function\n if (\n e.message.startsWith('SSE event contained an error') ||\n e.message.startsWith(\"SSE event JSON-RPC response is missing 'result' field\")\n ) {\n throw new PaymentsError(e.message, 'payments_error')\n }\n\n throw new PaymentsError(\n `Failed to parse SSE event data: \"${jsonData.substring(0, 100)}...\". Original error: ${e.message}`,\n 'payments_error',\n )\n }\n }\n\n /**\n * Resubscribes to a task's event stream using Server-Sent Events (SSE).\n * This is used if a previous SSE connection for an active task was broken.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params - Parameters containing the taskId.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n */\n public async *resubscribeA2ATask(params: TaskIdParams): AsyncGenerator<any, void, undefined> {\n const agentCard = await (this as any).agentCardPromise\n if (!agentCard.capabilities?.streaming) {\n throw new Error('Agent does not support streaming (required for tasks/resubscribe).')\n }\n const endpoint = await (this as any)._getServiceEndpoint()\n const clientRequestId = uuidv4()\n const rpcRequest = {\n jsonrpc: '2.0',\n method: 'tasks/resubscribe',\n params: params as { [key: string]: any },\n id: clientRequestId,\n }\n const accessToken = await this._getX402AccessToken()\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n 'payment-signature': accessToken,\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!response.ok) {\n let errorBody = ''\n try {\n errorBody = await response.text()\n const errorJson = JSON.parse(errorBody)\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`,\n )\n }\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}`,\n )\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\n \"Invalid response Content-Type for SSE stream on resubscribe. Expected 'text/event-stream'.\",\n )\n }\n // Parse and yield SSE events\n for await (const event of this._parseA2AStream(response, clientRequestId)) {\n yield event\n }\n }\n\n /**\n * Retrieves a task by its ID, managing authentication automatically.\n * @param params - The parameters for the task query.\n * @returns The task response.\n */\n public async getA2ATask(params: TaskQueryParams): Promise<GetTaskResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<TaskQueryParams, GetTaskResponse>(\n 'tasks/get',\n params,\n headers,\n )\n }\n\n /**\n * Sets or updates the push notification configuration for a given task, managing authentication automatically.\n * @param params - The parameters for the task push notification configuration.\n * @returns The response from the agent.\n */\n public async setA2ATaskPushNotificationConfig(\n params: TaskPushNotificationConfig,\n ): Promise<SetTaskPushNotificationConfigResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse\n >('tasks/pushNotificationConfig/set', params, headers)\n }\n\n /**\n * Gets the push notification configuration for a given task, managing authentication automatically.\n * @param params - The parameters for the task push notification configuration.\n * @returns The response from the agent.\n */\n public async getA2ATaskPushNotificationConfig(\n params: TaskIdParams,\n ): Promise<GetTaskPushNotificationConfigResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<TaskIdParams, GetTaskPushNotificationConfigResponse>(\n 'tasks/pushNotificationConfig/get',\n params,\n headers,\n )\n }\n\n /**\n * Internal helper to make a JSON-RPC POST request with custom headers.\n * @param method - The RPC method name.\n * @param params - The parameters for the RPC method.\n * @param headers - Optional custom headers.\n * @returns The response from the agent.\n */\n protected async _postRpcRequestWithHeaders<TParams, TResponse>(\n method: string,\n params: TParams,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const endpoint = await (this as any)._getServiceEndpoint()\n const requestId = uuidv4()\n const rpcRequest = { jsonrpc: '2.0', method, params, id: requestId }\n const httpResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(headers || {}),\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!httpResponse.ok) {\n let errorBodyText = '(empty or non-JSON response)'\n try {\n errorBodyText = await httpResponse.text()\n const errorJson = JSON.parse(errorBodyText)\n if (!errorJson.jsonrpc && errorJson.error) {\n throw new Error(\n `RPC error for ${method}: ${errorJson.error.message} (Code: ${errorJson.error.code}, HTTP Status: ${httpResponse.status}) Data: ${JSON.stringify(errorJson.error.data)}`,\n )\n } else if (!errorJson.jsonrpc) {\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('RPC error for') || e.message.startsWith('HTTP error for')) throw e\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`,\n )\n }\n }\n const rpcResponse = await httpResponse.json()\n if (rpcResponse.id !== requestId) {\n throw new PaymentsError(\n `CRITICAL: RPC response ID mismatch for method ${method}. Expected ${requestId}, got ${rpcResponse.id}. This may lead to incorrect response handling.`,\n 'payments_error',\n )\n }\n return rpcResponse as TResponse\n }\n}\n\nexport type {\n MessageSendParams,\n SendMessageResponse,\n TaskQueryParams,\n GetTaskResponse,\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse,\n TaskIdParams,\n GetTaskPushNotificationConfigResponse,\n} from '@a2a-js/sdk'\n"]}
1
+ {"version":3,"file":"paymentsClient.js","sourceRoot":"","sources":["../../src/a2a/paymentsClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { Payments } from '../index.js'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { resolveScheme } from '../x402/facilitator-api.js'\nimport type { X402TokenOptions, CardDelegationConfig } from '../common/types.js'\nimport {\n MessageSendParams,\n SendMessageResponse,\n TaskQueryParams,\n GetTaskResponse,\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse,\n TaskIdParams,\n GetTaskPushNotificationConfigResponse,\n JSONRPCResponse,\n JSONRPCErrorResponse,\n} from '@a2a-js/sdk'\nimport { A2AClient } from '@a2a-js/sdk/client'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { AgentCard } from './types.js'\n\n/**\n * PaymentsClient is a high-level client for A2A agents with payments integration.\n * Each instance is bound to a specific agentId and planId.\n */\nexport class PaymentsClient extends A2AClient {\n public payments: Payments\n private readonly agentId: string\n private readonly planId: string\n private readonly delegationConfig?: CardDelegationConfig\n private accessToken: string | null\n\n /**\n * Creates a new PaymentsClient instance.\n * @param agentBaseUrl - The base URL of the agent (e.g. http://localhost:3005/a2a/).\n * @param payments - The Payments object.\n * @param agentId - The ID of the agent.\n * @param planId - The ID of the plan.\n * @param agentCardPath - Optional path to the agent card relative to base URL (defaults to '.well-known/agent.json').\n */\n private constructor(\n agentCard: AgentCard,\n payments: Payments,\n agentId: string,\n planId: string,\n delegationConfig?: CardDelegationConfig,\n ) {\n super(agentCard)\n this.payments = payments\n this.agentId = agentId\n this.planId = planId\n this.delegationConfig = delegationConfig\n this.accessToken = null\n }\n\n /**\n * Creates a PaymentsClient by fetching the AgentCard first and then\n * constructing the underlying A2AClient with the AgentCard object.\n */\n public static async create(\n agentBaseUrl: string,\n payments: Payments,\n agentId: string,\n planId: string,\n agentCardPath = '.well-known/agent.json',\n delegationConfig?: CardDelegationConfig,\n ): Promise<PaymentsClient> {\n const agentCardUrl = new URL(agentCardPath, agentBaseUrl).toString()\n const a2a = await A2AClient.fromCardUrl(agentCardUrl)\n const agentCard = await (a2a as any).getAgentCard()\n return new PaymentsClient(agentCard as AgentCard, payments, agentId, planId, delegationConfig)\n }\n\n /**\n * Gets and caches the access token for this client instance.\n * @returns The access token string.\n */\n private async _getX402AccessToken(): Promise<string> {\n if (this.accessToken) {\n return this.accessToken\n }\n const scheme = await resolveScheme(this.payments, this.planId)\n if (scheme === 'nvm:card-delegation' && !this.delegationConfig) {\n throw PaymentsError.internal(\n 'Card delegation scheme requires delegationConfig. Pass it to PaymentsClient.create().',\n )\n }\n const tokenOptions: X402TokenOptions | undefined =\n scheme !== 'nvm:erc4337'\n ? { scheme, delegationConfig: this.delegationConfig }\n : undefined\n const accessParams = await this.payments.x402.getX402AccessToken(\n this.planId,\n this.agentId,\n undefined,\n undefined,\n undefined,\n tokenOptions,\n )\n this.accessToken = accessParams.accessToken\n return this.accessToken\n }\n\n /**\n * Clears the cached access token for this client instance.\n */\n public clearToken() {\n this.accessToken = null\n }\n\n /**\n * Type guard to check if a JSON-RPC response is an error response.\n * @param response - The JSON-RPC response to check\n * @returns true if the response contains an error, false otherwise\n */\n isErrorResponse(response: JSONRPCResponse): response is JSONRPCErrorResponse {\n return response != null && typeof response === 'object' && 'error' in response\n }\n\n /**\n * Sends a message to the agent, managing authentication automatically.\n * @param params - The parameters for sending the message.\n * @returns The response from the agent.\n */\n public async sendA2AMessage(params: MessageSendParams): Promise<SendMessageResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<MessageSendParams, SendMessageResponse>(\n 'message/send',\n params,\n headers,\n )\n }\n\n /**\n * Sends a message to the agent and streams back responses using Server-Sent Events (SSE).\n * Push notification configuration can be specified in `params.configuration`.\n * Optionally, `params.message.contextId` or `params.message.taskId` can be provided.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params - The parameters for sending the message.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n * The generator throws an error if streaming is not supported or if an HTTP/SSE error occurs.\n */\n public async *sendA2AMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<any, void, undefined> {\n const agentCard = await (this as any).agentCardPromise\n if (!agentCard.capabilities?.streaming) {\n throw new Error(\n 'Agent does not support streaming (AgentCard.capabilities.streaming is not true).',\n )\n }\n const endpoint = await (this as any)._getServiceEndpoint()\n const clientRequestId = uuidv4()\n const rpcRequest = {\n jsonrpc: '2.0',\n method: 'message/stream',\n params: params as { [key: string]: any },\n id: clientRequestId,\n }\n const accessToken = await this._getX402AccessToken()\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n 'payment-signature': accessToken,\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!response.ok) {\n let errorBody = ''\n try {\n errorBody = await response.text()\n const errorJson = JSON.parse(errorBody)\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`,\n )\n }\n throw new Error(\n `HTTP error establishing stream for message/stream: ${response.status} ${response.statusText}`,\n )\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\"Invalid response Content-Type for SSE stream. Expected 'text/event-stream'.\")\n }\n // Parse and yield SSE events\n for await (const event of this._parseA2AStream(response, clientRequestId)) {\n yield event\n }\n }\n\n /**\n * Parses an HTTP response body as an A2A Server-Sent Event stream.\n * Each 'data' field of an SSE event is expected to be a JSON-RPC 2.0 Response object,\n * specifically a SendStreamingMessageResponse (or similar structure for resubscribe).\n * @param response -The HTTP Response object whose body is the SSE stream.\n * @param originalRequestId - The ID of the client's JSON-RPC request that initiated this stream.\n * Used to validate the `id` in the streamed JSON-RPC responses.\n * @returns An AsyncGenerator yielding the `result` field of each valid JSON-RPC success response from the stream.\n */\n private async *_parseA2AStream<TStreamItem>(\n response: Response,\n originalRequestId: number | string | null,\n ): AsyncGenerator<TStreamItem, void, undefined> {\n if (!response.body) {\n throw new Error('SSE response body is undefined. Cannot read stream.')\n }\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()\n let buffer = '' // Holds incomplete lines from the stream\n let eventDataBuffer = '' // Holds accumulated 'data:' lines for the current event\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) {\n // Process any final buffered event data if the stream ends abruptly after a 'data:' line\n if (eventDataBuffer.trim()) {\n const result = this._processEventData<TStreamItem>(eventDataBuffer, originalRequestId)\n yield result\n }\n break // Stream finished\n }\n\n buffer += value // Append new chunk to buffer\n let lineEndIndex\n // Process all complete lines in the buffer\n while ((lineEndIndex = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.substring(0, lineEndIndex).trim() // Get and trim the line\n buffer = buffer.substring(lineEndIndex + 1) // Remove processed line from buffer\n\n if (line === '') {\n // Empty line: signifies the end of an event\n if (eventDataBuffer) {\n // If we have accumulated data for an event\n const result = this._processEventData<TStreamItem>(eventDataBuffer, originalRequestId)\n yield result\n eventDataBuffer = '' // Reset buffer for the next event\n }\n } else if (line.startsWith('data:')) {\n eventDataBuffer += line.substring(5).trimStart() + '\\n' // Append data (multi-line data is possible)\n } else if (line.startsWith(':')) {\n // This is a comment line in SSE, ignore it.\n }\n }\n }\n } catch (error: any) {\n throw new PaymentsError(error.message, 'payments_error')\n } finally {\n reader.releaseLock() // Ensure the reader lock is released\n }\n }\n\n /**\n * Processes a single SSE event's data string, expecting it to be a JSON-RPC response.\n * @param jsonData - The string content from one or more 'data:' lines of an SSE event.\n * @param originalRequestId - The ID of the client's request that initiated the stream.\n * @returns The `result` field of the parsed JSON-RPC success response.\n * @throws Error if data is not valid JSON, not a valid JSON-RPC response, an error response, or ID mismatch.\n */\n private _processEventData<TStreamItem>(\n jsonData: string,\n originalRequestId: number | string | null,\n ): TStreamItem {\n if (!jsonData.trim()) {\n throw new Error('Attempted to process empty SSE event data.')\n }\n try {\n // SSE data can be multi-line, ensure it's treated as a single JSON string.\n const sseJsonRpcResponse = JSON.parse(jsonData.replace(/\\n$/, ''))\n\n // Type assertion to SendStreamingMessageResponse, as this is the expected structure for A2A streams.\n const a2aStreamResponse: any = sseJsonRpcResponse\n\n if (a2aStreamResponse.id !== originalRequestId) {\n // According to JSON-RPC spec, notifications (which SSE events can be seen as) might not have an ID,\n // or if they do, it should match. A2A spec implies streamed events are tied to the initial request.\n throw new PaymentsError(\n `SSE Event's JSON-RPC response ID mismatch. Client request ID: ${originalRequestId}, event response ID: ${a2aStreamResponse.id}.`,\n 'payments_error',\n )\n }\n\n if (this.isErrorResponse && this.isErrorResponse(a2aStreamResponse)) {\n const err = a2aStreamResponse.error\n throw new PaymentsError(\n `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data)}`,\n )\n }\n\n // Check if 'result' exists, as it's mandatory for successful JSON-RPC responses\n if (!('result' in a2aStreamResponse) || typeof a2aStreamResponse.result === 'undefined') {\n throw new PaymentsError(\n `SSE event JSON-RPC response is missing 'result' field. Data: ${jsonData}`,\n 'payments_error',\n )\n }\n\n return a2aStreamResponse as TStreamItem\n } catch (e: any) {\n // Catch errors from JSON.parse or if it's an error response that was thrown by this function\n if (\n e.message.startsWith('SSE event contained an error') ||\n e.message.startsWith(\"SSE event JSON-RPC response is missing 'result' field\")\n ) {\n throw new PaymentsError(e.message, 'payments_error')\n }\n\n throw new PaymentsError(\n `Failed to parse SSE event data: \"${jsonData.substring(0, 100)}...\". Original error: ${e.message}`,\n 'payments_error',\n )\n }\n }\n\n /**\n * Resubscribes to a task's event stream using Server-Sent Events (SSE).\n * This is used if a previous SSE connection for an active task was broken.\n * Requires the agent to support streaming (`capabilities.streaming: true` in AgentCard).\n * @param params - Parameters containing the taskId.\n * @returns An AsyncGenerator yielding A2AStreamEventData (Message, Task, TaskStatusUpdateEvent, or TaskArtifactUpdateEvent).\n */\n public async *resubscribeA2ATask(params: TaskIdParams): AsyncGenerator<any, void, undefined> {\n const agentCard = await (this as any).agentCardPromise\n if (!agentCard.capabilities?.streaming) {\n throw new Error('Agent does not support streaming (required for tasks/resubscribe).')\n }\n const endpoint = await (this as any)._getServiceEndpoint()\n const clientRequestId = uuidv4()\n const rpcRequest = {\n jsonrpc: '2.0',\n method: 'tasks/resubscribe',\n params: params as { [key: string]: any },\n id: clientRequestId,\n }\n const accessToken = await this._getX402AccessToken()\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'text/event-stream',\n 'payment-signature': accessToken,\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!response.ok) {\n let errorBody = ''\n try {\n errorBody = await response.text()\n const errorJson = JSON.parse(errorBody)\n if (errorJson.error) {\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. RPC Error: ${errorJson.error.message} (Code: ${errorJson.error.code})`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('HTTP error establishing stream')) throw e\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}. Response: ${errorBody || '(empty)'}`,\n )\n }\n throw new Error(\n `HTTP error establishing stream for tasks/resubscribe: ${response.status} ${response.statusText}`,\n )\n }\n if (!response.headers.get('Content-Type')?.startsWith('text/event-stream')) {\n throw new Error(\n \"Invalid response Content-Type for SSE stream on resubscribe. Expected 'text/event-stream'.\",\n )\n }\n // Parse and yield SSE events\n for await (const event of this._parseA2AStream(response, clientRequestId)) {\n yield event\n }\n }\n\n /**\n * Retrieves a task by its ID, managing authentication automatically.\n * @param params - The parameters for the task query.\n * @returns The task response.\n */\n public async getA2ATask(params: TaskQueryParams): Promise<GetTaskResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<TaskQueryParams, GetTaskResponse>(\n 'tasks/get',\n params,\n headers,\n )\n }\n\n /**\n * Sets or updates the push notification configuration for a given task, managing authentication automatically.\n * @param params - The parameters for the task push notification configuration.\n * @returns The response from the agent.\n */\n public async setA2ATaskPushNotificationConfig(\n params: TaskPushNotificationConfig,\n ): Promise<SetTaskPushNotificationConfigResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse\n >('tasks/pushNotificationConfig/set', params, headers)\n }\n\n /**\n * Gets the push notification configuration for a given task, managing authentication automatically.\n * @param params - The parameters for the task push notification configuration.\n * @returns The response from the agent.\n */\n public async getA2ATaskPushNotificationConfig(\n params: TaskIdParams,\n ): Promise<GetTaskPushNotificationConfigResponse> {\n const accessToken = await this._getX402AccessToken()\n const headers = { 'payment-signature': accessToken }\n return this._postRpcRequestWithHeaders<TaskIdParams, GetTaskPushNotificationConfigResponse>(\n 'tasks/pushNotificationConfig/get',\n params,\n headers,\n )\n }\n\n /**\n * Internal helper to make a JSON-RPC POST request with custom headers.\n * @param method - The RPC method name.\n * @param params - The parameters for the RPC method.\n * @param headers - Optional custom headers.\n * @returns The response from the agent.\n */\n protected async _postRpcRequestWithHeaders<TParams, TResponse>(\n method: string,\n params: TParams,\n headers?: Record<string, string>,\n ): Promise<TResponse> {\n const endpoint = await (this as any)._getServiceEndpoint()\n const requestId = uuidv4()\n const rpcRequest = { jsonrpc: '2.0', method, params, id: requestId }\n const httpResponse = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(headers || {}),\n },\n body: JSON.stringify(rpcRequest),\n })\n if (!httpResponse.ok) {\n let errorBodyText = '(empty or non-JSON response)'\n try {\n errorBodyText = await httpResponse.text()\n const errorJson = JSON.parse(errorBodyText)\n if (!errorJson.jsonrpc && errorJson.error) {\n throw new Error(\n `RPC error for ${method}: ${errorJson.error.message} (Code: ${errorJson.error.code}, HTTP Status: ${httpResponse.status}) Data: ${JSON.stringify(errorJson.error.data)}`,\n )\n } else if (!errorJson.jsonrpc) {\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`,\n )\n }\n } catch (e: any) {\n if (e.message.startsWith('RPC error for') || e.message.startsWith('HTTP error for')) throw e\n throw new Error(\n `HTTP error for ${method}! Status: ${httpResponse.status} ${httpResponse.statusText}. Response: ${errorBodyText}`,\n )\n }\n }\n const rpcResponse = await httpResponse.json()\n if (rpcResponse.id !== requestId) {\n throw new PaymentsError(\n `CRITICAL: RPC response ID mismatch for method ${method}. Expected ${requestId}, got ${rpcResponse.id}. This may lead to incorrect response handling.`,\n 'payments_error',\n )\n }\n return rpcResponse as TResponse\n }\n}\n\nexport type {\n MessageSendParams,\n SendMessageResponse,\n TaskQueryParams,\n GetTaskResponse,\n TaskPushNotificationConfig,\n SetTaskPushNotificationConfigResponse,\n TaskIdParams,\n GetTaskPushNotificationConfigResponse,\n} from '@a2a-js/sdk'\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"paymentsRequestHandler.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paymentsRequestHandler.d.ts","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { A2AError, DefaultRequestHandler, ExecutionEventQueue, ResultManager, } from '@a2a-js/sdk/server';
2
2
  import { v4 as uuidv4 } from 'uuid';
3
3
  import { PaymentsError } from '../common/payments.error.js';
4
+ import { isValidScheme } from '../common/types.js';
4
5
  import { decodeAccessToken } from '../utils.js';
5
6
  import { buildPaymentRequired } from '../x402/facilitator-api.js';
6
7
  const terminalStates = ['completed', 'failed', 'canceled', 'rejected'];
@@ -108,10 +109,12 @@ export class PaymentsRequestHandler extends DefaultRequestHandler {
108
109
  throw PaymentsError.unauthorized('Cannot determine subscriberAddress from token (expected payload.authorization.from)');
109
110
  }
110
111
  const agentId = paymentExtension?.params?.agentId;
112
+ const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337';
111
113
  const paymentRequired = buildPaymentRequired(planId, {
112
114
  endpoint: endpoint || '',
113
115
  agentId,
114
- httpVerb: httpVerb,
116
+ httpVerb,
117
+ scheme,
115
118
  });
116
119
  const result = await this.paymentsService.facilitator.verifyPermissions({
117
120
  paymentRequired,
@@ -123,8 +126,8 @@ export class PaymentsRequestHandler extends DefaultRequestHandler {
123
126
  }
124
127
  return {
125
128
  success: true,
126
- planId: planId,
127
- subscriberAddress: subscriberAddress,
129
+ planId,
130
+ subscriberAddress,
128
131
  balance: { isSubscriber: true },
129
132
  };
130
133
  }
@@ -168,11 +171,13 @@ export class PaymentsRequestHandler extends DefaultRequestHandler {
168
171
  if (!planId) {
169
172
  throw PaymentsError.unauthorized('Plan ID not found in agent card.');
170
173
  }
174
+ const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337';
171
175
  // Build paymentRequired using the helper
172
176
  const paymentRequired = buildPaymentRequired(planId, {
173
177
  endpoint: httpContext?.urlRequested,
174
178
  agentId,
175
179
  httpVerb: httpContext?.httpMethodRequested,
180
+ scheme,
176
181
  });
177
182
  return await this.paymentsService.facilitator.settlePermissions({
178
183
  paymentRequired,
@@ -1 +1 @@
1
- {"version":3,"file":"paymentsRequestHandler.js","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentCard,\n Message,\n MessageSendParams,\n PushNotificationConfig,\n Task,\n TaskArtifactUpdateEvent,\n TaskIdParams,\n TaskState,\n TaskStatusUpdateEvent,\n} from '@a2a-js/sdk'\nimport type { ExecutionEventBusManager, TaskStore } from '@a2a-js/sdk/server'\nimport {\n A2AError,\n AgentExecutor,\n DefaultRequestHandler,\n ExecutionEventBus,\n ExecutionEventQueue,\n ResultManager,\n} from '@a2a-js/sdk/server'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { StartAgentRequest } from '../common/types.js'\nimport { Payments } from '../payments.js'\nimport { decodeAccessToken } from '../utils.js'\nimport { buildPaymentRequired, type X402PaymentRequired } from '../x402/facilitator-api.js'\nimport type {\n A2AAuthResult,\n A2AStreamEvent,\n AgentRequestContext,\n HttpRequestContext,\n PaymentRedemptionConfig,\n PaymentsRequestContext,\n} from './types.js'\n\nconst terminalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n\n/**\n * Options for configuring the PaymentsRequestHandler\n */\nexport interface PaymentsRequestHandlerOptions {\n /** Whether to execute tasks asynchronously */\n asyncExecution?: boolean\n /** Default batch mode for all requests (can be overridden per-request) */\n defaultBatch?: boolean\n /** Default margin percentage for all requests (can be overridden per-request) */\n defaultMarginPercent?: number\n}\n\n/**\n * PaymentsRequestHandler extends DefaultRequestHandler to add payments validation and burning.\n * It validates credits before executing a task and burns credits after successful execution.\n * It also sends push notifications when a task reaches a terminal state.\n * @param options - Handler options, including asyncExecution, defaultBatch, and defaultMarginPercent\n */\nexport class PaymentsRequestHandler extends DefaultRequestHandler {\n private paymentsService: Payments\n private httpContextByTaskId: Map<string, HttpRequestContext> = new Map()\n private httpContextByMessageId: Map<string, HttpRequestContext> = new Map()\n private asyncExecution: boolean\n private defaultBatch: boolean\n private defaultMarginPercent?: number\n\n /**\n * Store HTTP context temporarily by messageId (used in middleware when taskId is not yet available).\n * @param messageId - The messageId from the incoming message\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForMessage(messageId: string, ctx: HttpRequestContext) {\n this.httpContextByMessageId.set(messageId, ctx)\n }\n\n /**\n * Store HTTP context by taskId (used in middleware when taskId is available).\n * @param taskId - The taskId of the task\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForTask(taskId: string, ctx: HttpRequestContext) {\n this.httpContextByTaskId.set(taskId, ctx)\n }\n\n /**\n * @param agentCard - The agent card\n * @param taskStore - The task store\n * @param agentExecutor - The business logic executor\n * @param paymentsService - The payments service for validation and burning\n * @param eventBusManager - The event bus manager (optional)\n * @param options - Handler options (asyncExecution, defaultBatch, defaultMarginPercent)\n */\n constructor(\n agentCard: AgentCard,\n taskStore: TaskStore,\n agentExecutor: AgentExecutor,\n paymentsService: any,\n eventBusManager?: ExecutionEventBusManager,\n options?: PaymentsRequestHandlerOptions,\n ) {\n super(agentCard, taskStore, agentExecutor, eventBusManager)\n this.paymentsService = paymentsService\n this.asyncExecution = options?.asyncExecution ?? false\n this.defaultBatch = options?.defaultBatch ?? false\n this.defaultMarginPercent = options?.defaultMarginPercent\n }\n\n /**\n * Retrieve the HTTP context for a given taskId.\n * @param taskId - The taskId of the task\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForTask(taskId: string): HttpRequestContext | undefined {\n return this.httpContextByTaskId.get(taskId)\n }\n\n /**\n * Retrieve the HTTP context for a given messageId.\n * @param messageId - The messageId of the message\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForMessage(messageId: string): HttpRequestContext | undefined {\n return this.httpContextByMessageId.get(messageId)\n }\n\n /**\n * Deletes the HTTP context associated with a taskId.\n * @param taskId - The taskId to delete context for\n */\n public deleteHttpRequestContextForTask(taskId: string): void {\n this.httpContextByTaskId.delete(taskId)\n }\n\n /**\n * Get the handler options (defaultBatch, defaultMarginPercent).\n * Used by middleware to determine default redemption behavior.\n * @returns The handler options\n */\n public getHandlerOptions(): PaymentsRequestHandlerOptions {\n return {\n asyncExecution: this.asyncExecution,\n defaultBatch: this.defaultBatch,\n defaultMarginPercent: this.defaultMarginPercent,\n }\n }\n\n /**\n * Validates a request using the x402 payments service.\n * This method is used by the middleware to validate credits before processing requests.\n *\n * @param bearerToken - The bearer token for authentication\n * @param endpoint - Optional endpoint URL being requested\n * @param httpVerb - Optional HTTP method being used\n * @returns Promise resolving to the validation result\n */\n public async validateRequest(\n bearerToken: string,\n endpoint?: string,\n httpVerb?: string,\n ): Promise<any> {\n let planId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string\n }\n\n const decodedAccessToken = decodeAccessToken(bearerToken)\n\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n // Extract subscriberAddress from token (payload.authorization.from per x402 spec)\n const subscriberAddress = decodedAccessToken.payload?.authorization?.from\n\n if (!subscriberAddress) {\n throw PaymentsError.unauthorized(\n 'Cannot determine subscriberAddress from token (expected payload.authorization.from)',\n )\n }\n\n const agentId = paymentExtension?.params?.agentId as string | undefined\n\n const paymentRequired: X402PaymentRequired = buildPaymentRequired(planId, {\n endpoint: endpoint || '',\n agentId,\n httpVerb: httpVerb,\n })\n\n const result = await this.paymentsService.facilitator.verifyPermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: 1n,\n })\n if (!result.isValid) {\n throw PaymentsError.unauthorized('Permission verification failed.')\n }\n return {\n success: true,\n planId: planId,\n subscriberAddress: subscriberAddress,\n balance: { isSubscriber: true },\n }\n }\n\n /**\n * Gets redemption configuration for a task based on AgentCard and handler defaults.\n * The configuration is determined by the server, not by client metadata.\n *\n * @returns The redemption configuration\n */\n private async getRedemptionConfig(): Promise<PaymentRedemptionConfig> {\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n\n const agentConfig =\n (paymentExtension?.params?.redemptionConfig as PaymentRedemptionConfig) || {}\n\n return {\n useBatch: agentConfig.useBatch ?? this.defaultBatch ?? false,\n useMargin: agentConfig.useMargin ?? false,\n marginPercent: agentConfig.marginPercent ?? this.defaultMarginPercent,\n }\n }\n\n /**\n * Determines the appropriate redemption method based on server configuration.\n *\n * @param bearerToken - The bearer token for authentication\n * @param creditsUsed - The number of credits to burn\n * @param httpContext - Optional HTTP context with endpoint and method information\n * @returns Promise resolving to the redemption result\n */\n private async executeRedemption(\n bearerToken: string,\n creditsUsed: bigint | number,\n httpContext?: HttpRequestContext,\n ): Promise<any> {\n const decodedAccessToken = decodeAccessToken(bearerToken)\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n let planId: string | undefined\n let agentId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string | undefined\n agentId = paymentExtension.params?.agentId as string | undefined\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n // Build paymentRequired using the helper\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: httpContext?.urlRequested,\n agentId,\n httpVerb: httpContext?.httpMethodRequested,\n })\n\n return await this.paymentsService.facilitator.settlePermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: BigInt(creditsUsed),\n })\n }\n\n /**\n * Creates PaymentsRequestContext from message parameters.\n * This method handles HTTP context retrieval, validation, and context creation.\n * @param params - Message send parameters\n * @param isStreaming - Whether this is for streaming (affects createRequestContext call)\n * @returns Object containing PaymentsRequestContext and related data\n */\n private async createPaymentsRequestContext(\n params: MessageSendParams,\n isStreaming = false,\n ): Promise<{\n paymentsRequestContext: PaymentsRequestContext\n taskId: string\n httpContext: HttpRequestContext\n bearerToken: string\n validation: StartAgentRequest\n requestContext: any\n finalMessageForAgent: Message\n eventBus: ExecutionEventBus\n eventQueue: ExecutionEventQueue\n resultManager: ResultManager\n }> {\n // Validate required parameters before any processing\n const missingParam = !params.message\n ? 'message'\n : !params.message.messageId\n ? 'message.messageId'\n : null\n if (missingParam) {\n throw A2AError.invalidParams(`${missingParam} is required.`)\n }\n\n // 1. Get HTTP context for the task or message\n let taskId = params.message.taskId\n let httpContext: HttpRequestContext | undefined\n if (taskId) {\n httpContext = this.getHttpRequestContextForTask(taskId)\n } else {\n const messageId = params.message.messageId\n httpContext = this.getHttpRequestContextForMessage(messageId)\n }\n\n if (!httpContext) {\n throw A2AError.internalError('HTTP context not found for task or message.')\n }\n\n // 2. Extract bearer token and validate presence of required fields\n const { bearerToken, validation } = httpContext\n if (!bearerToken) {\n throw PaymentsError.unauthorized('Missing bearer token for payment validation.')\n }\n\n // 3. Validate credits before executing the task\n const agentCard = await this.getAgentCard()\n const agentId = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )?.params?.agentId\n if (!agentId) {\n throw A2AError.internalError('Agent ID not found in payment extension.')\n }\n\n // 4. Generate taskId if not present and migrate HTTP context\n const incomingMessage = params.message\n if (!taskId) {\n taskId = uuidv4()\n this.migrateHttpRequestContextFromMessageToTask(params.message.messageId, taskId)\n }\n\n // 5. Instantiate ResultManager and eventBus\n const resultManager = new ResultManager(this.getTaskStore())\n resultManager.setContext(incomingMessage)\n const requestContext = await this.callCreateRequestContext(incomingMessage, taskId, isStreaming)\n const finalMessageForAgent = requestContext.userMessage\n const eventBus = this.getEventBusManager().createOrGetByTaskId(taskId)\n const eventQueue = new ExecutionEventQueue(eventBus)\n\n // 6. Create PaymentsRequestContext\n const authResult: A2AAuthResult = {\n requestId: validation.agentRequestId,\n token: bearerToken,\n agentId: validation.agentId,\n agentRequest: validation,\n }\n\n const agentRequestContext: AgentRequestContext = {\n authResult,\n httpContext,\n paymentsService: this.paymentsService,\n }\n\n // 7. Create extended request context with agent request data\n const paymentsRequestContext: PaymentsRequestContext = {\n ...requestContext,\n payments: agentRequestContext,\n }\n\n return {\n paymentsRequestContext,\n taskId,\n httpContext,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n }\n }\n\n /**\n * Processes streaming events with finalization (credits burning and push notifications).\n * Similar to processEventsWithFinalization but yields events for streaming.\n * @param taskId - The task ID\n * @param resultManager - The result manager\n * @param eventQueue - The event queue\n * @param bearerToken - The bearer token\n * @param validation - The validation result\n * @returns Async generator yielding processed events\n */\n protected async *processStreamingEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n try {\n for await (const event of eventQueue.events()) {\n await resultManager.processEvent(event)\n yield event\n\n if (\n event.kind === 'status-update' &&\n event.final &&\n event?.metadata?.creditsUsed !== undefined &&\n event?.metadata?.creditsUsed !== null &&\n bearerToken &&\n (typeof event.metadata.creditsUsed === 'string' ||\n typeof event.metadata.creditsUsed === 'number' ||\n typeof event.metadata.creditsUsed === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(event.metadata.creditsUsed),\n httpContext,\n )\n\n // Update event metadata with response data\n if (response && event.metadata) {\n event.metadata.txHash = response.txHash\n event.metadata.creditsCharged = response.amountOfCredits\n ? Number(response.amountOfCredits)\n : event.metadata.creditsUsed\n }\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n // Handle push notification\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.status?.state &&\n terminalStates.includes(event.status.state)\n ) {\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n {\n contextId: event.contextId,\n },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n }\n } finally {\n // Cleanup when the stream is fully consumed or breaks\n //this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Processes all events, calling handleTaskFinalization when a terminal status-update event is received.\n * In async mode, it can be launched in background.\n */\n protected async processEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n validation: StartAgentRequest,\n options?: {\n firstResultResolver?: (event: any) => void\n firstResultRejector?: (err: any) => void\n },\n ) {\n let firstResultSent = false\n try {\n for await (const event of eventQueue.events()) {\n // Handle redemption before processing the event\n if (\n event.kind === 'status-update' &&\n event.final &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n\n await resultManager.processEvent(event)\n if (options?.firstResultResolver && !firstResultSent) {\n if (event.kind === 'message' || event.kind === 'task') {\n options.firstResultResolver(event)\n firstResultSent = true\n }\n }\n }\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(\n A2AError.internalError('Execution finished before a message or task was produced.'),\n )\n }\n } catch (error) {\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(error)\n }\n throw error\n } finally {\n this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Sends a message, validating credits before execution and burning credits after.\n * Also sends a push notification if the task reaches a terminal state.\n * This method overrides the parent implementation to allow eventBus subscription before agent execution.\n * @param params - Message send parameters\n * @returns The resulting message or task\n */\n async sendMessage(params: MessageSendParams): Promise<Message | Task> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, false)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n const errorTask: Task = {\n id: requestContext.task?.id || uuidv4(),\n contextId: finalMessageForAgent.contextId || uuidv4(),\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId: finalMessageForAgent.contextId,\n },\n timestamp: new Date().toISOString(),\n },\n history: requestContext.task?.history ? [...requestContext.task.history] : [],\n kind: 'task',\n }\n if (finalMessageForAgent) {\n if (\n !errorTask.history?.find((m: any) => m.messageId === finalMessageForAgent.messageId)\n ) {\n errorTask.history?.push(finalMessageForAgent)\n }\n }\n eventBus.publish(errorTask)\n eventBus.publish({\n kind: 'status-update',\n taskId: errorTask.id,\n contextId: errorTask.contextId,\n status: errorTask.status,\n final: true,\n })\n eventBus.finished()\n })\n\n // Determine if execution should be blocking based on client request\n // The blocking parameter comes from params.configuration.blocking\n const isBlocking = params.configuration?.blocking !== false // Default to blocking if not specified\n\n if (isBlocking) {\n await this.processEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n )\n const finalResult = resultManager.getFinalResult()\n if (!finalResult) {\n throw A2AError.internalError(\n 'Agent execution finished without a result, and no task context found.',\n )\n }\n return finalResult\n } else {\n // Non-blocking execution - return immediately with first result\n if (!taskId) {\n throw A2AError.internalError('Task ID is required for non-blocking execution.')\n }\n const validTaskId = taskId\n return new Promise((resolve, reject) => {\n this.processEventsWithFinalization(\n validTaskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n {\n firstResultResolver: resolve,\n firstResultRejector: reject,\n },\n )\n })\n }\n }\n\n /**\n * Handles credits burning and push notification when a task reaches a terminal state.\n * This is called asynchronously from the eventBus listener.\n * Supports batch and margin-based redemptions based on server configuration.\n * @param resultManager - The result manager\n * @param event - The status-update event with final state\n * @param bearerToken - The bearer token for payment validation\n * @param validation - The validation result from the request\n */\n private async handleTaskFinalization(\n resultManager: ResultManager,\n event: TaskStatusUpdateEvent,\n bearerToken: string,\n httpContext?: HttpRequestContext,\n ) {\n const creditsToBurn = event.metadata?.creditsUsed\n if (\n creditsToBurn !== undefined &&\n creditsToBurn !== null &&\n bearerToken &&\n (typeof creditsToBurn === 'string' ||\n typeof creditsToBurn === 'number' ||\n typeof creditsToBurn === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(creditsToBurn),\n httpContext,\n )\n\n // Update event metadata with redemption results\n event.metadata = {\n ...event.metadata,\n txHash: response.txHash,\n // Store the actual credits charged (especially important for margin-based)\n creditsCharged: response.amountOfCredits\n ? Number(response.amountOfCredits)\n : creditsToBurn,\n }\n }\n\n // Always update task metadata and process the task\n const task = resultManager.getCurrentTask()\n if (task) {\n // Update task metadata with current event metadata (from executor or redemption)\n task.metadata = {\n ...task.metadata,\n ...event.metadata,\n }\n\n await resultManager.processEvent(task)\n // Delete http context associated with the task\n this.deleteHttpRequestContextForTask(event.taskId)\n }\n } catch (err) {\n // Do nothing\n }\n }\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n { contextId: event.contextId },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n /**\n * Streams messages and events for a task, with payments validation.\n * Also sends a push notification if a terminal status-update event is emitted.\n * @param params - Message send parameters\n * @returns Async generator of events\n */\n async *sendMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, true)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n console.error(\n `Agent execution failed for stream message ${finalMessageForAgent.messageId}:`,\n err,\n )\n const contextId = finalMessageForAgent.contextId || uuidv4()\n const errorTaskStatus: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: requestContext.task?.id || uuidv4(),\n contextId,\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId,\n },\n timestamp: new Date().toISOString(),\n },\n final: true,\n }\n eventBus.publish(errorTaskStatus)\n })\n\n // Process streaming events with finalization\n yield* this.processStreamingEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n )\n }\n\n /**\n * Sends a push notification when a task reaches a terminal state.\n * @param taskId - The task ID\n * @param state - The terminal state\n * @param pushNotificationConfig - The push notification configuration\n * @param payload - Additional payload to include in the notification\n */\n private async sendPushNotification(\n taskId: string,\n state: TaskState,\n pushNotificationConfig: PushNotificationConfig,\n payload: Record<string, any> = {},\n ) {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (pushNotificationConfig.authentication) {\n if (pushNotificationConfig.authentication.schemes.includes('basic')) {\n const basic = Buffer.from(`${pushNotificationConfig.authentication.credentials}`).toString(\n 'base64',\n )\n headers['Authorization'] = `Basic ${basic}`\n } else if (pushNotificationConfig.authentication.schemes.includes('bearer')) {\n headers['Authorization'] = `Bearer ${pushNotificationConfig.authentication.credentials}`\n } else if (pushNotificationConfig.authentication.schemes.includes('custom')) {\n Object.assign(headers, pushNotificationConfig.authentication.credentials)\n }\n }\n const body = JSON.stringify({\n taskId,\n state,\n payload,\n })\n const response = await fetch(pushNotificationConfig.url, {\n method: 'POST',\n headers,\n body,\n })\n if (!response.ok) {\n throw A2AError.internalError('Failed to send push notification.')\n }\n }\n\n /**\n * Migrates the HTTP context from a messageId to a taskId and deletes the temporary messageId context.\n * @param messageId - The messageId to migrate from\n * @param taskId - The taskId to migrate to\n */\n public migrateHttpRequestContextFromMessageToTask(messageId: string, taskId: string): void {\n const ctx = this.getHttpRequestContextForMessage(messageId)\n if (ctx) {\n this.setHttpRequestContextForTask(taskId, ctx)\n this.deleteHttpRequestContextForMessage(messageId)\n }\n }\n\n /**\n * Deletes the HTTP context associated with a messageId.\n * @param messageId - The messageId to delete context for\n */\n public deleteHttpRequestContextForMessage(messageId: string): void {\n this.httpContextByMessageId.delete(messageId)\n }\n\n /**\n * Protected getter to access the private taskStore property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getTaskStore(): TaskStore {\n return (this as any).taskStore as TaskStore\n }\n\n /**\n * Protected getter to access the private eventBusManager property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getEventBusManager(): ExecutionEventBusManager {\n return (this as any).eventBusManager as ExecutionEventBusManager\n }\n\n /**\n * Protected getter to access the private _createRequestContext method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected async callCreateRequestContext(\n incomingMessage: any,\n taskId: string,\n isStream: boolean,\n ): Promise<any> {\n return await (this as any)._createRequestContext(incomingMessage, taskId, isStream)\n }\n\n /**\n * Protected getter to access the private _processEvents method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected callProcessEvents(...args: any[]): any {\n return (this as any)._processEvents.apply(this, args)\n }\n\n /**\n * Resubscribes to a task's event stream, ensuring the task has updated metadata before yielding.\n * This method overrides the parent implementation to ensure metadata is updated before yielding.\n * @param params - Parameters containing the taskId\n * @returns Async generator of events\n */\n async *resubscribe(\n params: TaskIdParams,\n ): AsyncGenerator<Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, void, undefined> {\n const task = await this.getTaskStore().load(params.id)\n if (!task) {\n throw A2AError.taskNotFound(params.id)\n }\n\n // Yield task immediately (with current metadata)\n yield task\n\n const finalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n if (finalStates.includes(task.status.state)) {\n return\n }\n\n const eventBus = this.getEventBusManager().getByTaskId(params.id)\n if (!eventBus) {\n console.warn(`Resubscribe: No active event bus for task ${params.id}.`)\n return\n }\n\n const eventQueue = new ExecutionEventQueue(eventBus)\n try {\n for await (const event of eventQueue.events()) {\n // Process event with ResultManager to ensure task is saved\n const resultManager = new ResultManager(this.getTaskStore())\n // Set context from task history if available\n if (task.history && task.history.length > 0) {\n resultManager.setContext(task.history[0])\n }\n await resultManager.processEvent(event)\n\n // Handle redemption and push notification for final status-update events\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.taskId === params.id &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context for this task\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n if (httpContext) {\n const { bearerToken, validation } = httpContext\n if (bearerToken && validation) {\n // Handle task finalization (redemption and push notification)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n }\n }\n\n // Yield event after processing (so metadata is updated)\n if (event.kind === 'status-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'artifact-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'task' && event.id === params.id) {\n yield event\n }\n }\n } finally {\n eventQueue.stop()\n }\n }\n}\n"]}
1
+ {"version":3,"file":"paymentsRequestHandler.js","sourceRoot":"","sources":["../../src/a2a/paymentsRequestHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AgentCard,\n Message,\n MessageSendParams,\n PushNotificationConfig,\n Task,\n TaskArtifactUpdateEvent,\n TaskIdParams,\n TaskState,\n TaskStatusUpdateEvent,\n} from '@a2a-js/sdk'\nimport type { ExecutionEventBusManager, TaskStore } from '@a2a-js/sdk/server'\nimport {\n A2AError,\n AgentExecutor,\n DefaultRequestHandler,\n ExecutionEventBus,\n ExecutionEventQueue,\n ResultManager,\n} from '@a2a-js/sdk/server'\nimport { v4 as uuidv4 } from 'uuid'\nimport { PaymentsError } from '../common/payments.error.js'\nimport { StartAgentRequest, isValidScheme } from '../common/types.js'\nimport { Payments } from '../payments.js'\nimport { decodeAccessToken } from '../utils.js'\nimport { buildPaymentRequired, type X402PaymentRequired } from '../x402/facilitator-api.js'\nimport type {\n A2AAuthResult,\n A2AStreamEvent,\n AgentRequestContext,\n HttpRequestContext,\n PaymentRedemptionConfig,\n PaymentsRequestContext,\n} from './types.js'\n\nconst terminalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n\n/**\n * Options for configuring the PaymentsRequestHandler\n */\nexport interface PaymentsRequestHandlerOptions {\n /** Whether to execute tasks asynchronously */\n asyncExecution?: boolean\n /** Default batch mode for all requests (can be overridden per-request) */\n defaultBatch?: boolean\n /** Default margin percentage for all requests (can be overridden per-request) */\n defaultMarginPercent?: number\n}\n\n/**\n * PaymentsRequestHandler extends DefaultRequestHandler to add payments validation and burning.\n * It validates credits before executing a task and burns credits after successful execution.\n * It also sends push notifications when a task reaches a terminal state.\n * @param options - Handler options, including asyncExecution, defaultBatch, and defaultMarginPercent\n */\nexport class PaymentsRequestHandler extends DefaultRequestHandler {\n private paymentsService: Payments\n private httpContextByTaskId: Map<string, HttpRequestContext> = new Map()\n private httpContextByMessageId: Map<string, HttpRequestContext> = new Map()\n private asyncExecution: boolean\n private defaultBatch: boolean\n private defaultMarginPercent?: number\n\n /**\n * Store HTTP context temporarily by messageId (used in middleware when taskId is not yet available).\n * @param messageId - The messageId from the incoming message\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForMessage(messageId: string, ctx: HttpRequestContext) {\n this.httpContextByMessageId.set(messageId, ctx)\n }\n\n /**\n * Store HTTP context by taskId (used in middleware when taskId is available).\n * @param taskId - The taskId of the task\n * @param ctx - The HTTP context (bearerToken, url, method)\n */\n public setHttpRequestContextForTask(taskId: string, ctx: HttpRequestContext) {\n this.httpContextByTaskId.set(taskId, ctx)\n }\n\n /**\n * @param agentCard - The agent card\n * @param taskStore - The task store\n * @param agentExecutor - The business logic executor\n * @param paymentsService - The payments service for validation and burning\n * @param eventBusManager - The event bus manager (optional)\n * @param options - Handler options (asyncExecution, defaultBatch, defaultMarginPercent)\n */\n constructor(\n agentCard: AgentCard,\n taskStore: TaskStore,\n agentExecutor: AgentExecutor,\n paymentsService: any,\n eventBusManager?: ExecutionEventBusManager,\n options?: PaymentsRequestHandlerOptions,\n ) {\n super(agentCard, taskStore, agentExecutor, eventBusManager)\n this.paymentsService = paymentsService\n this.asyncExecution = options?.asyncExecution ?? false\n this.defaultBatch = options?.defaultBatch ?? false\n this.defaultMarginPercent = options?.defaultMarginPercent\n }\n\n /**\n * Retrieve the HTTP context for a given taskId.\n * @param taskId - The taskId of the task\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForTask(taskId: string): HttpRequestContext | undefined {\n return this.httpContextByTaskId.get(taskId)\n }\n\n /**\n * Retrieve the HTTP context for a given messageId.\n * @param messageId - The messageId of the message\n * @returns The HTTP context (bearerToken, url, method) or undefined\n */\n private getHttpRequestContextForMessage(messageId: string): HttpRequestContext | undefined {\n return this.httpContextByMessageId.get(messageId)\n }\n\n /**\n * Deletes the HTTP context associated with a taskId.\n * @param taskId - The taskId to delete context for\n */\n public deleteHttpRequestContextForTask(taskId: string): void {\n this.httpContextByTaskId.delete(taskId)\n }\n\n /**\n * Get the handler options (defaultBatch, defaultMarginPercent).\n * Used by middleware to determine default redemption behavior.\n * @returns The handler options\n */\n public getHandlerOptions(): PaymentsRequestHandlerOptions {\n return {\n asyncExecution: this.asyncExecution,\n defaultBatch: this.defaultBatch,\n defaultMarginPercent: this.defaultMarginPercent,\n }\n }\n\n /**\n * Validates a request using the x402 payments service.\n * This method is used by the middleware to validate credits before processing requests.\n *\n * @param bearerToken - The bearer token for authentication\n * @param endpoint - Optional endpoint URL being requested\n * @param httpVerb - Optional HTTP method being used\n * @returns Promise resolving to the validation result\n */\n public async validateRequest(\n bearerToken: string,\n endpoint?: string,\n httpVerb?: string,\n ): Promise<any> {\n let planId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string\n }\n\n const decodedAccessToken = decodeAccessToken(bearerToken)\n\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n // Extract subscriberAddress from token (payload.authorization.from per x402 spec)\n const subscriberAddress = decodedAccessToken.payload?.authorization?.from\n\n if (!subscriberAddress) {\n throw PaymentsError.unauthorized(\n 'Cannot determine subscriberAddress from token (expected payload.authorization.from)',\n )\n }\n\n const agentId = paymentExtension?.params?.agentId as string | undefined\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n const paymentRequired: X402PaymentRequired = buildPaymentRequired(planId, {\n endpoint: endpoint || '',\n agentId,\n httpVerb,\n scheme,\n })\n\n const result = await this.paymentsService.facilitator.verifyPermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: 1n,\n })\n if (!result.isValid) {\n throw PaymentsError.unauthorized('Permission verification failed.')\n }\n return {\n success: true,\n planId,\n subscriberAddress,\n balance: { isSubscriber: true },\n }\n }\n\n /**\n * Gets redemption configuration for a task based on AgentCard and handler defaults.\n * The configuration is determined by the server, not by client metadata.\n *\n * @returns The redemption configuration\n */\n private async getRedemptionConfig(): Promise<PaymentRedemptionConfig> {\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n\n const agentConfig =\n (paymentExtension?.params?.redemptionConfig as PaymentRedemptionConfig) || {}\n\n return {\n useBatch: agentConfig.useBatch ?? this.defaultBatch ?? false,\n useMargin: agentConfig.useMargin ?? false,\n marginPercent: agentConfig.marginPercent ?? this.defaultMarginPercent,\n }\n }\n\n /**\n * Determines the appropriate redemption method based on server configuration.\n *\n * @param bearerToken - The bearer token for authentication\n * @param creditsUsed - The number of credits to burn\n * @param httpContext - Optional HTTP context with endpoint and method information\n * @returns Promise resolving to the redemption result\n */\n private async executeRedemption(\n bearerToken: string,\n creditsUsed: bigint | number,\n httpContext?: HttpRequestContext,\n ): Promise<any> {\n const decodedAccessToken = decodeAccessToken(bearerToken)\n if (!decodedAccessToken) {\n throw PaymentsError.unauthorized('Invalid access token.')\n }\n\n let planId: string | undefined\n let agentId: string | undefined\n const agentCard = await this.getAgentCard()\n const paymentExtension = agentCard.capabilities?.extensions?.find(\n (ext: any) => ext.uri === 'urn:nevermined:payment',\n )\n if (paymentExtension) {\n planId = paymentExtension.params?.planId as string | undefined\n agentId = paymentExtension.params?.agentId as string | undefined\n }\n\n if (!planId) {\n throw PaymentsError.unauthorized('Plan ID not found in agent card.')\n }\n\n const scheme = isValidScheme(decodedAccessToken.accepted?.scheme) ? decodedAccessToken.accepted.scheme : 'nvm:erc4337'\n\n // Build paymentRequired using the helper\n const paymentRequired = buildPaymentRequired(planId, {\n endpoint: httpContext?.urlRequested,\n agentId,\n httpVerb: httpContext?.httpMethodRequested,\n scheme,\n })\n\n return await this.paymentsService.facilitator.settlePermissions({\n paymentRequired,\n x402AccessToken: bearerToken,\n maxAmount: BigInt(creditsUsed),\n })\n }\n\n /**\n * Creates PaymentsRequestContext from message parameters.\n * This method handles HTTP context retrieval, validation, and context creation.\n * @param params - Message send parameters\n * @param isStreaming - Whether this is for streaming (affects createRequestContext call)\n * @returns Object containing PaymentsRequestContext and related data\n */\n private async createPaymentsRequestContext(\n params: MessageSendParams,\n isStreaming = false,\n ): Promise<{\n paymentsRequestContext: PaymentsRequestContext\n taskId: string\n httpContext: HttpRequestContext\n bearerToken: string\n validation: StartAgentRequest\n requestContext: any\n finalMessageForAgent: Message\n eventBus: ExecutionEventBus\n eventQueue: ExecutionEventQueue\n resultManager: ResultManager\n }> {\n // Validate required parameters before any processing\n const missingParam = !params.message\n ? 'message'\n : !params.message.messageId\n ? 'message.messageId'\n : null\n if (missingParam) {\n throw A2AError.invalidParams(`${missingParam} is required.`)\n }\n\n // 1. Get HTTP context for the task or message\n let taskId = params.message.taskId\n let httpContext: HttpRequestContext | undefined\n if (taskId) {\n httpContext = this.getHttpRequestContextForTask(taskId)\n } else {\n const messageId = params.message.messageId\n httpContext = this.getHttpRequestContextForMessage(messageId)\n }\n\n if (!httpContext) {\n throw A2AError.internalError('HTTP context not found for task or message.')\n }\n\n // 2. Extract bearer token and validate presence of required fields\n const { bearerToken, validation } = httpContext\n if (!bearerToken) {\n throw PaymentsError.unauthorized('Missing bearer token for payment validation.')\n }\n\n // 3. Validate credits before executing the task\n const agentCard = await this.getAgentCard()\n const agentId = agentCard.capabilities?.extensions?.find(\n (ext) => ext.uri === 'urn:nevermined:payment',\n )?.params?.agentId\n if (!agentId) {\n throw A2AError.internalError('Agent ID not found in payment extension.')\n }\n\n // 4. Generate taskId if not present and migrate HTTP context\n const incomingMessage = params.message\n if (!taskId) {\n taskId = uuidv4()\n this.migrateHttpRequestContextFromMessageToTask(params.message.messageId, taskId)\n }\n\n // 5. Instantiate ResultManager and eventBus\n const resultManager = new ResultManager(this.getTaskStore())\n resultManager.setContext(incomingMessage)\n const requestContext = await this.callCreateRequestContext(incomingMessage, taskId, isStreaming)\n const finalMessageForAgent = requestContext.userMessage\n const eventBus = this.getEventBusManager().createOrGetByTaskId(taskId)\n const eventQueue = new ExecutionEventQueue(eventBus)\n\n // 6. Create PaymentsRequestContext\n const authResult: A2AAuthResult = {\n requestId: validation.agentRequestId,\n token: bearerToken,\n agentId: validation.agentId,\n agentRequest: validation,\n }\n\n const agentRequestContext: AgentRequestContext = {\n authResult,\n httpContext,\n paymentsService: this.paymentsService,\n }\n\n // 7. Create extended request context with agent request data\n const paymentsRequestContext: PaymentsRequestContext = {\n ...requestContext,\n payments: agentRequestContext,\n }\n\n return {\n paymentsRequestContext,\n taskId,\n httpContext,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n }\n }\n\n /**\n * Processes streaming events with finalization (credits burning and push notifications).\n * Similar to processEventsWithFinalization but yields events for streaming.\n * @param taskId - The task ID\n * @param resultManager - The result manager\n * @param eventQueue - The event queue\n * @param bearerToken - The bearer token\n * @param validation - The validation result\n * @returns Async generator yielding processed events\n */\n protected async *processStreamingEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n try {\n for await (const event of eventQueue.events()) {\n await resultManager.processEvent(event)\n yield event\n\n if (\n event.kind === 'status-update' &&\n event.final &&\n event?.metadata?.creditsUsed !== undefined &&\n event?.metadata?.creditsUsed !== null &&\n bearerToken &&\n (typeof event.metadata.creditsUsed === 'string' ||\n typeof event.metadata.creditsUsed === 'number' ||\n typeof event.metadata.creditsUsed === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(event.metadata.creditsUsed),\n httpContext,\n )\n\n // Update event metadata with response data\n if (response && event.metadata) {\n event.metadata.txHash = response.txHash\n event.metadata.creditsCharged = response.amountOfCredits\n ? Number(response.amountOfCredits)\n : event.metadata.creditsUsed\n }\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n // Handle push notification\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.status?.state &&\n terminalStates.includes(event.status.state)\n ) {\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n {\n contextId: event.contextId,\n },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n }\n } finally {\n // Cleanup when the stream is fully consumed or breaks\n //this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Processes all events, calling handleTaskFinalization when a terminal status-update event is received.\n * In async mode, it can be launched in background.\n */\n protected async processEventsWithFinalization(\n taskId: string,\n resultManager: ResultManager,\n eventQueue: ExecutionEventQueue,\n bearerToken: string,\n validation: StartAgentRequest,\n options?: {\n firstResultResolver?: (event: any) => void\n firstResultRejector?: (err: any) => void\n },\n ) {\n let firstResultSent = false\n try {\n for await (const event of eventQueue.events()) {\n // Handle redemption before processing the event\n if (\n event.kind === 'status-update' &&\n event.final &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context if available\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n\n await resultManager.processEvent(event)\n if (options?.firstResultResolver && !firstResultSent) {\n if (event.kind === 'message' || event.kind === 'task') {\n options.firstResultResolver(event)\n firstResultSent = true\n }\n }\n }\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(\n A2AError.internalError('Execution finished before a message or task was produced.'),\n )\n }\n } catch (error) {\n if (options?.firstResultRejector && !firstResultSent) {\n options.firstResultRejector(error)\n }\n throw error\n } finally {\n this.getEventBusManager().cleanupByTaskId(taskId)\n }\n }\n\n /**\n * Sends a message, validating credits before execution and burning credits after.\n * Also sends a push notification if the task reaches a terminal state.\n * This method overrides the parent implementation to allow eventBus subscription before agent execution.\n * @param params - Message send parameters\n * @returns The resulting message or task\n */\n async sendMessage(params: MessageSendParams): Promise<Message | Task> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n validation,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, false)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n const errorTask: Task = {\n id: requestContext.task?.id || uuidv4(),\n contextId: finalMessageForAgent.contextId || uuidv4(),\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId: finalMessageForAgent.contextId,\n },\n timestamp: new Date().toISOString(),\n },\n history: requestContext.task?.history ? [...requestContext.task.history] : [],\n kind: 'task',\n }\n if (finalMessageForAgent) {\n if (\n !errorTask.history?.find((m: any) => m.messageId === finalMessageForAgent.messageId)\n ) {\n errorTask.history?.push(finalMessageForAgent)\n }\n }\n eventBus.publish(errorTask)\n eventBus.publish({\n kind: 'status-update',\n taskId: errorTask.id,\n contextId: errorTask.contextId,\n status: errorTask.status,\n final: true,\n })\n eventBus.finished()\n })\n\n // Determine if execution should be blocking based on client request\n // The blocking parameter comes from params.configuration.blocking\n const isBlocking = params.configuration?.blocking !== false // Default to blocking if not specified\n\n if (isBlocking) {\n await this.processEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n )\n const finalResult = resultManager.getFinalResult()\n if (!finalResult) {\n throw A2AError.internalError(\n 'Agent execution finished without a result, and no task context found.',\n )\n }\n return finalResult\n } else {\n // Non-blocking execution - return immediately with first result\n if (!taskId) {\n throw A2AError.internalError('Task ID is required for non-blocking execution.')\n }\n const validTaskId = taskId\n return new Promise((resolve, reject) => {\n this.processEventsWithFinalization(\n validTaskId,\n resultManager,\n eventQueue,\n bearerToken,\n validation,\n {\n firstResultResolver: resolve,\n firstResultRejector: reject,\n },\n )\n })\n }\n }\n\n /**\n * Handles credits burning and push notification when a task reaches a terminal state.\n * This is called asynchronously from the eventBus listener.\n * Supports batch and margin-based redemptions based on server configuration.\n * @param resultManager - The result manager\n * @param event - The status-update event with final state\n * @param bearerToken - The bearer token for payment validation\n * @param validation - The validation result from the request\n */\n private async handleTaskFinalization(\n resultManager: ResultManager,\n event: TaskStatusUpdateEvent,\n bearerToken: string,\n httpContext?: HttpRequestContext,\n ) {\n const creditsToBurn = event.metadata?.creditsUsed\n if (\n creditsToBurn !== undefined &&\n creditsToBurn !== null &&\n bearerToken &&\n (typeof creditsToBurn === 'string' ||\n typeof creditsToBurn === 'number' ||\n typeof creditsToBurn === 'bigint')\n ) {\n try {\n // Get redemption configuration from server (not from client metadata)\n const redemptionConfig = await this.getRedemptionConfig()\n\n if (!redemptionConfig.useBatch) {\n // Execute redemption with server configuration for non-batch requests\n const response = await this.executeRedemption(\n bearerToken,\n BigInt(creditsToBurn),\n httpContext,\n )\n\n // Update event metadata with redemption results\n event.metadata = {\n ...event.metadata,\n txHash: response.txHash,\n // Store the actual credits charged (especially important for margin-based)\n creditsCharged: response.amountOfCredits\n ? Number(response.amountOfCredits)\n : creditsToBurn,\n }\n }\n\n // Always update task metadata and process the task\n const task = resultManager.getCurrentTask()\n if (task) {\n // Update task metadata with current event metadata (from executor or redemption)\n task.metadata = {\n ...task.metadata,\n ...event.metadata,\n }\n\n await resultManager.processEvent(task)\n // Delete http context associated with the task\n this.deleteHttpRequestContextForTask(event.taskId)\n }\n } catch (err) {\n // Do nothing\n }\n }\n try {\n const taskPushNotificationConfig = await this.getTaskPushNotificationConfig({\n id: event.taskId,\n })\n if (taskPushNotificationConfig) {\n await this.sendPushNotification(\n event.taskId,\n event.status.state,\n taskPushNotificationConfig.pushNotificationConfig,\n { contextId: event.contextId },\n )\n }\n } catch (err) {\n // Do nothing\n }\n }\n\n /**\n * Streams messages and events for a task, with payments validation.\n * Also sends a push notification if a terminal status-update event is emitted.\n * @param params - Message send parameters\n * @returns Async generator of events\n */\n async *sendMessageStream(\n params: MessageSendParams,\n ): AsyncGenerator<A2AStreamEvent, void, undefined> {\n // Create PaymentsRequestContext and related data\n const {\n paymentsRequestContext,\n taskId,\n bearerToken,\n requestContext,\n finalMessageForAgent,\n eventBus,\n eventQueue,\n resultManager,\n } = await this.createPaymentsRequestContext(params, true)\n\n // Execute agent with extended context\n ;(this as any).agentExecutor\n .execute(paymentsRequestContext as any, eventBus)\n .catch((err: any) => {\n console.error(\n `Agent execution failed for stream message ${finalMessageForAgent.messageId}:`,\n err,\n )\n const contextId = finalMessageForAgent.contextId || uuidv4()\n const errorTaskStatus: TaskStatusUpdateEvent = {\n kind: 'status-update',\n taskId: requestContext.task?.id || uuidv4(),\n contextId,\n status: {\n state: 'failed',\n message: {\n kind: 'message',\n role: 'agent',\n messageId: uuidv4(),\n parts: [{ kind: 'text', text: `Agent execution error: ${err.message}` }],\n taskId: requestContext.task?.id,\n contextId,\n },\n timestamp: new Date().toISOString(),\n },\n final: true,\n }\n eventBus.publish(errorTaskStatus)\n })\n\n // Process streaming events with finalization\n yield* this.processStreamingEventsWithFinalization(\n taskId,\n resultManager,\n eventQueue,\n bearerToken,\n )\n }\n\n /**\n * Sends a push notification when a task reaches a terminal state.\n * @param taskId - The task ID\n * @param state - The terminal state\n * @param pushNotificationConfig - The push notification configuration\n * @param payload - Additional payload to include in the notification\n */\n private async sendPushNotification(\n taskId: string,\n state: TaskState,\n pushNotificationConfig: PushNotificationConfig,\n payload: Record<string, any> = {},\n ) {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n if (pushNotificationConfig.authentication) {\n if (pushNotificationConfig.authentication.schemes.includes('basic')) {\n const basic = Buffer.from(`${pushNotificationConfig.authentication.credentials}`).toString(\n 'base64',\n )\n headers['Authorization'] = `Basic ${basic}`\n } else if (pushNotificationConfig.authentication.schemes.includes('bearer')) {\n headers['Authorization'] = `Bearer ${pushNotificationConfig.authentication.credentials}`\n } else if (pushNotificationConfig.authentication.schemes.includes('custom')) {\n Object.assign(headers, pushNotificationConfig.authentication.credentials)\n }\n }\n const body = JSON.stringify({\n taskId,\n state,\n payload,\n })\n const response = await fetch(pushNotificationConfig.url, {\n method: 'POST',\n headers,\n body,\n })\n if (!response.ok) {\n throw A2AError.internalError('Failed to send push notification.')\n }\n }\n\n /**\n * Migrates the HTTP context from a messageId to a taskId and deletes the temporary messageId context.\n * @param messageId - The messageId to migrate from\n * @param taskId - The taskId to migrate to\n */\n public migrateHttpRequestContextFromMessageToTask(messageId: string, taskId: string): void {\n const ctx = this.getHttpRequestContextForMessage(messageId)\n if (ctx) {\n this.setHttpRequestContextForTask(taskId, ctx)\n this.deleteHttpRequestContextForMessage(messageId)\n }\n }\n\n /**\n * Deletes the HTTP context associated with a messageId.\n * @param messageId - The messageId to delete context for\n */\n public deleteHttpRequestContextForMessage(messageId: string): void {\n this.httpContextByMessageId.delete(messageId)\n }\n\n /**\n * Protected getter to access the private taskStore property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getTaskStore(): TaskStore {\n return (this as any).taskStore as TaskStore\n }\n\n /**\n * Protected getter to access the private eventBusManager property from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected getEventBusManager(): ExecutionEventBusManager {\n return (this as any).eventBusManager as ExecutionEventBusManager\n }\n\n /**\n * Protected getter to access the private _createRequestContext method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected async callCreateRequestContext(\n incomingMessage: any,\n taskId: string,\n isStream: boolean,\n ): Promise<any> {\n return await (this as any)._createRequestContext(incomingMessage, taskId, isStream)\n }\n\n /**\n * Protected getter to access the private _processEvents method from the parent class.\n * This is a workaround due to SDK limitations.\n */\n protected callProcessEvents(...args: any[]): any {\n return (this as any)._processEvents.apply(this, args)\n }\n\n /**\n * Resubscribes to a task's event stream, ensuring the task has updated metadata before yielding.\n * This method overrides the parent implementation to ensure metadata is updated before yielding.\n * @param params - Parameters containing the taskId\n * @returns Async generator of events\n */\n async *resubscribe(\n params: TaskIdParams,\n ): AsyncGenerator<Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, void, undefined> {\n const task = await this.getTaskStore().load(params.id)\n if (!task) {\n throw A2AError.taskNotFound(params.id)\n }\n\n // Yield task immediately (with current metadata)\n yield task\n\n const finalStates: TaskState[] = ['completed', 'failed', 'canceled', 'rejected']\n if (finalStates.includes(task.status.state)) {\n return\n }\n\n const eventBus = this.getEventBusManager().getByTaskId(params.id)\n if (!eventBus) {\n console.warn(`Resubscribe: No active event bus for task ${params.id}.`)\n return\n }\n\n const eventQueue = new ExecutionEventQueue(eventBus)\n try {\n for await (const event of eventQueue.events()) {\n // Process event with ResultManager to ensure task is saved\n const resultManager = new ResultManager(this.getTaskStore())\n // Set context from task history if available\n if (task.history && task.history.length > 0) {\n resultManager.setContext(task.history[0])\n }\n await resultManager.processEvent(event)\n\n // Handle redemption and push notification for final status-update events\n if (\n event.kind === 'status-update' &&\n event.final &&\n event.taskId === params.id &&\n terminalStates.includes(event.status?.state)\n ) {\n // Get HTTP context for this task\n const httpContext = this.getHttpRequestContextForTask(event.taskId)\n if (httpContext) {\n const { bearerToken, validation } = httpContext\n if (bearerToken && validation) {\n // Handle task finalization (redemption and push notification)\n await this.handleTaskFinalization(resultManager, event, bearerToken, httpContext)\n }\n }\n }\n\n // Yield event after processing (so metadata is updated)\n if (event.kind === 'status-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'artifact-update' && event.taskId === params.id) {\n yield event\n } else if (event.kind === 'task' && event.id === params.id) {\n yield event\n }\n }\n } finally {\n eventQueue.stop()\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAA8C,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAsCpE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,SAAS,EAAE,SAAS,CAAA;IACpB,uDAAuD;IACvD,QAAQ,EAAE,aAAa,CAAA;IACvB,kEAAkE;IAClE,eAAe,EAAE,GAAG,CAAA;IACpB,wCAAwC;IACxC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,GAAG,CAAA;IAC1B,kEAAkE;IAClE,cAAc,CAAC,EAAE;QACf,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAC9B,CAAA;IACD,8DAA8D;IAC9D,KAAK,CAAC,EAAE;QACN,oDAAoD;QACpD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACpF,mDAAmD;QACnD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACnF,2CAA2C;QAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAChF,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,sBAAsB,CAAA;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AA8GD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB;CA0KzE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/a2a/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAA8C,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAsB,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;AAuCpE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,oEAAoE;IACpE,SAAS,EAAE,SAAS,CAAA;IACpB,uDAAuD;IACvD,QAAQ,EAAE,aAAa,CAAA;IACvB,kEAAkE;IAClE,eAAe,EAAE,GAAG,CAAA;IACpB,wCAAwC;IACxC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAA;IACZ,uEAAuE;IACvE,SAAS,CAAC,EAAE,GAAG,CAAA;IACf,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oDAAoD;IACpD,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC,OAAO,CAAA;IAC5B,kEAAkE;IAClE,oBAAoB,CAAC,EAAE,GAAG,CAAA;IAC1B,kEAAkE;IAClE,cAAc,CAAC,EAAE;QACf,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,oBAAoB,CAAC,EAAE,MAAM,CAAA;KAC9B,CAAA;IACD,8DAA8D;IAC9D,KAAK,CAAC,EAAE;QACN,oDAAoD;QACpD,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACpF,mDAAmD;QACnD,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACnF,2CAA2C;QAC3C,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAChF,CAAA;CACF;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,+BAA+B;IAC/B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;IACnB,+DAA+D;IAC/D,OAAO,EAAE,sBAAsB,CAAA;IAC/B,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AAiHD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,qBAAa,iBAAiB;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,wBAAwB,GAAG,uBAAuB;CA0KzE"}
@@ -14,7 +14,7 @@ import express from 'express';
14
14
  import http from 'http';
15
15
  import { InMemoryTaskStore, JsonRpcTransportHandler } from '@a2a-js/sdk/server';
16
16
  import { PaymentsRequestHandler } from './paymentsRequestHandler.js';
17
- import { buildPaymentRequired } from '../x402/facilitator-api.js';
17
+ import { buildPaymentRequired, resolveScheme } from '../x402/facilitator-api.js';
18
18
  import { X402_HEADERS } from '../x402/express/middleware.js';
19
19
  /**
20
20
  * Checks if a value is an AsyncIterable (used to detect streaming responses)
@@ -62,7 +62,7 @@ async function sendRpcResult(res, result) {
62
62
  * @param res - Express response object
63
63
  * @param next - Express next function
64
64
  */
65
- async function bearerTokenMiddleware(handler, req, res, next) {
65
+ async function bearerTokenMiddleware(handler, paymentsService, req, res, next) {
66
66
  // Only process POST requests (A2A uses POST for all operations)
67
67
  if (req.method !== 'POST') {
68
68
  return next();
@@ -83,10 +83,12 @@ async function bearerTokenMiddleware(handler, req, res, next) {
83
83
  // Build paymentRequired for 402 responses
84
84
  const planId = paymentExtension.params?.planId || '';
85
85
  const agentId = paymentExtension.params?.agentId;
86
+ const scheme = await resolveScheme(paymentsService, planId);
86
87
  const paymentRequired = buildPaymentRequired(planId, {
87
88
  endpoint: absoluteUrl,
88
89
  agentId,
89
90
  httpVerb: 'POST',
91
+ scheme,
90
92
  });
91
93
  const paymentRequiredHeader = Buffer.from(JSON.stringify(paymentRequired)).toString('base64');
92
94
  // x402 HTTP spec v2: payment-signature header
@@ -219,7 +221,7 @@ export class PaymentsA2AServer {
219
221
  if (exposeDefaultRoutes) {
220
222
  // Apply bearer token middleware for all requests under basePath
221
223
  app.use(basePath, express.json(), (req, res, next) => {
222
- bearerTokenMiddleware(handler, req, res, next).catch(next);
224
+ bearerTokenMiddleware(handler, paymentsService, req, res, next).catch(next);
223
225
  });
224
226
  // Apply hooks middleware after body parsing and validation
225
227
  if (hooks) {