awal 2.2.0 → 2.8.1

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 (90) hide show
  1. package/README.md +16 -3
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +10 -5
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/__tests__/balance.test.d.ts +2 -0
  6. package/dist/commands/__tests__/balance.test.d.ts.map +1 -0
  7. package/dist/commands/__tests__/balance.test.js +245 -0
  8. package/dist/commands/__tests__/balance.test.js.map +1 -0
  9. package/dist/commands/__tests__/telemetry.test.d.ts +2 -0
  10. package/dist/commands/__tests__/telemetry.test.d.ts.map +1 -0
  11. package/dist/commands/__tests__/telemetry.test.js +79 -0
  12. package/dist/commands/__tests__/telemetry.test.js.map +1 -0
  13. package/dist/commands/__tests__/trade.test.d.ts +2 -0
  14. package/dist/commands/__tests__/trade.test.d.ts.map +1 -0
  15. package/dist/commands/__tests__/trade.test.js +147 -0
  16. package/dist/commands/__tests__/trade.test.js.map +1 -0
  17. package/dist/commands/auth.d.ts.map +1 -1
  18. package/dist/commands/auth.js +48 -5
  19. package/dist/commands/auth.js.map +1 -1
  20. package/dist/commands/balance.d.ts +16 -0
  21. package/dist/commands/balance.d.ts.map +1 -1
  22. package/dist/commands/balance.js +53 -22
  23. package/dist/commands/balance.js.map +1 -1
  24. package/dist/commands/bazaar.d.ts.map +1 -1
  25. package/dist/commands/bazaar.js +51 -22
  26. package/dist/commands/bazaar.js.map +1 -1
  27. package/dist/commands/persistence.d.ts +3 -0
  28. package/dist/commands/persistence.d.ts.map +1 -0
  29. package/dist/commands/persistence.js +75 -0
  30. package/dist/commands/persistence.js.map +1 -0
  31. package/dist/commands/quit.d.ts +3 -0
  32. package/dist/commands/quit.d.ts.map +1 -0
  33. package/dist/commands/quit.js +91 -0
  34. package/dist/commands/quit.js.map +1 -0
  35. package/dist/commands/send.d.ts.map +1 -1
  36. package/dist/commands/send.js +23 -14
  37. package/dist/commands/send.js.map +1 -1
  38. package/dist/commands/telemetry.d.ts +3 -0
  39. package/dist/commands/telemetry.d.ts.map +1 -0
  40. package/dist/commands/telemetry.js +41 -0
  41. package/dist/commands/telemetry.js.map +1 -0
  42. package/dist/commands/trade.d.ts +13 -0
  43. package/dist/commands/trade.d.ts.map +1 -1
  44. package/dist/commands/trade.js +22 -20
  45. package/dist/commands/trade.js.map +1 -1
  46. package/dist/constants.d.ts +11 -0
  47. package/dist/constants.d.ts.map +1 -0
  48. package/dist/constants.js +22 -0
  49. package/dist/constants.js.map +1 -0
  50. package/dist/formatters/output.d.ts +3 -2
  51. package/dist/formatters/output.d.ts.map +1 -1
  52. package/dist/formatters/output.js +13 -6
  53. package/dist/formatters/output.js.map +1 -1
  54. package/dist/index.js +0 -0
  55. package/dist/ipcClient.d.ts.map +1 -1
  56. package/dist/ipcClient.js +9 -5
  57. package/dist/ipcClient.js.map +1 -1
  58. package/dist/utils/__tests__/errors.test.d.ts +2 -0
  59. package/dist/utils/__tests__/errors.test.d.ts.map +1 -0
  60. package/dist/utils/__tests__/errors.test.js +27 -0
  61. package/dist/utils/__tests__/errors.test.js.map +1 -0
  62. package/dist/utils/chainValidation.d.ts +11 -0
  63. package/dist/utils/chainValidation.d.ts.map +1 -0
  64. package/dist/utils/chainValidation.js +29 -0
  65. package/dist/utils/chainValidation.js.map +1 -0
  66. package/dist/utils/configManager.d.ts +9 -0
  67. package/dist/utils/configManager.d.ts.map +1 -0
  68. package/dist/utils/configManager.js +46 -0
  69. package/dist/utils/configManager.js.map +1 -0
  70. package/dist/utils/errors.d.ts +5 -0
  71. package/dist/utils/errors.d.ts.map +1 -1
  72. package/dist/utils/errors.js +28 -10
  73. package/dist/utils/errors.js.map +1 -1
  74. package/dist/utils/parseAmount.d.ts +11 -1
  75. package/dist/utils/parseAmount.d.ts.map +1 -1
  76. package/dist/utils/parseAmount.js +36 -1
  77. package/dist/utils/parseAmount.js.map +1 -1
  78. package/dist/utils/serverManager.js +1 -1
  79. package/package.json +15 -6
  80. package/server-bundle/bundle-electron.js +43 -42
  81. package/server-bundle/package.json +1 -1
  82. package/server-bundle/preload.js +1 -1
  83. package/dist/commands/discover.d.ts +0 -3
  84. package/dist/commands/discover.d.ts.map +0 -1
  85. package/dist/commands/discover.js +0 -76
  86. package/dist/commands/discover.js.map +0 -1
  87. package/dist/utils/bazaarCache.d.ts +0 -36
  88. package/dist/utils/bazaarCache.d.ts.map +0 -1
  89. package/dist/utils/bazaarCache.js +0 -246
  90. package/dist/utils/bazaarCache.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coinbase/payments-mcp",
3
- "version": "2.2.0",
3
+ "version": "2.8.1",
4
4
  "description": "Payments MCP server and companion wallet",
5
5
  "github": "https://github.com/coinbase/payments-mcp",
6
6
  "author": "Coinbase",
@@ -1 +1 @@
1
- "use strict";const{contextBridge,ipcRenderer}=require("electron");contextBridge.exposeInMainWorld("electron",{sendIPC:(n,...s)=>ipcRenderer.send(n,...s),invokeIPC:(n,...s)=>ipcRenderer.invoke(n,...s),OnBazaarList:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("bazaar-list-response",e)}).catch(e=>{console.error("bazaar-list failed:",e.message),ipcRenderer.send("bazaar-list-response",{error:e.message})})};return ipcRenderer.on("bazaar-list",s),()=>ipcRenderer.removeListener("bazaar-list",s)},OnBazaarSearch:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("bazaar-search-response",e)}).catch(e=>{console.error("bazaar-search failed:",e.message),ipcRenderer.send("bazaar-search-response",{error:e.message})})};return ipcRenderer.on("bazaar-search",s),()=>ipcRenderer.removeListener("bazaar-search",s)},OnBazaarGetResourceDetails:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("bazaar-get-resource-details-response",e)}).catch(e=>{console.error("bazaar-get-resource-details failed:",e.message),ipcRenderer.send("bazaar-get-resource-details-response",{error:e.message})})};return ipcRenderer.on("bazaar-get-resource-details",s),()=>ipcRenderer.removeListener("bazaar-get-resource-details",s)},OnMakeX402Request:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("make-x402-request-response",e)}).catch(e=>{console.error("make-x402-request failed:",e.message),ipcRenderer.send("make-x402-request-response",{error:e.message})})};return ipcRenderer.on("make-x402-request",s),()=>ipcRenderer.removeListener("make-x402-request",s)},OnGetWalletAddress:n=>{const s=(r,a)=>{console.log("get-wallet-address"),n(a).then(e=>{ipcRenderer.send("get-wallet-address-response",{data:e})}).catch(e=>{console.error("get-wallet-address-error",e),ipcRenderer.send("get-wallet-address-response",{error:e.message})})};return ipcRenderer.on("get-wallet-address",s),()=>ipcRenderer.removeListener("get-wallet-address",s)},OnGetWalletBalance:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("get-wallet-balance-response",{data:e})}).catch(e=>{console.error("get-wallet-balance-error",e),ipcRenderer.send("get-wallet-balance-response",{error:e.message})})};return ipcRenderer.on("get-wallet-balance",s),()=>ipcRenderer.removeListener("get-wallet-balance",s)},OnCheckSessionStatus:n=>{const s=()=>{n().then(r=>{console.info("check-session-status-response",r),ipcRenderer.send("check-session-status-response",{data:r})}).catch(r=>{console.error("check-session-status-error",r),ipcRenderer.send("check-session-status-response",{error:r.message})})};return ipcRenderer.on("check-session-status",s),()=>ipcRenderer.removeListener("check-session-status",s)},OnMcpServerVersion:n=>{const s=(r,a)=>{n(a)};return ipcRenderer.on("mcp-server-version",s),()=>ipcRenderer.removeListener("mcp-server-version",s)},OnUpdateAvailable:n=>{const s=(r,a)=>{n(a)};return ipcRenderer.on("update-available",s),()=>ipcRenderer.removeListener("update-available",s)},OnSignInWithEmail:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("sign-in-with-email-response",{data:e})}).catch(e=>{console.error("sign-in-with-email failed:",e.message),ipcRenderer.send("sign-in-with-email-response",{error:e.message})})};return ipcRenderer.on("sign-in-with-email",s),()=>ipcRenderer.removeListener("sign-in-with-email",s)},OnVerifyEmailOTP:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("verify-email-otp-response",{data:e})}).catch(e=>{console.error("verify-email-otp failed:",e.message),ipcRenderer.send("verify-email-otp-response",{error:e.message})})};return ipcRenderer.on("verify-email-otp",s),()=>ipcRenderer.removeListener("verify-email-otp",s)},OnSendTransaction:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("send-transaction-response",{data:e})}).catch(e=>{console.error("send-transaction failed:",e.message),ipcRenderer.send("send-transaction-response",{error:e.message})})};return ipcRenderer.on("send-transaction",s),()=>ipcRenderer.removeListener("send-transaction",s)},OnExecuteSwap:n=>{const s=(r,a)=>{n(a).then(e=>{ipcRenderer.send("execute-swap-response",{data:e})}).catch(e=>{console.error("execute-swap failed:",e.message),ipcRenderer.send("execute-swap-response",{error:e.message})})};return ipcRenderer.on("execute-swap",s),()=>ipcRenderer.removeListener("execute-swap",s)}});
1
+ "use strict";const{contextBridge,ipcRenderer}=require("electron");contextBridge.exposeInMainWorld("electron",{sendIPC:(n,...s)=>ipcRenderer.send(n,...s),invokeIPC:(n,...s)=>ipcRenderer.invoke(n,...s),OnBazaarList:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("bazaar-list-response",e)}).catch(e=>{console.error("bazaar-list failed:",e.message),ipcRenderer.send("bazaar-list-response",{error:e.message})})};return ipcRenderer.on("bazaar-list",s),()=>ipcRenderer.removeListener("bazaar-list",s)},OnBazaarSearch:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("bazaar-search-response",e)}).catch(e=>{console.error("bazaar-search failed:",e.message),ipcRenderer.send("bazaar-search-response",{error:e.message})})};return ipcRenderer.on("bazaar-search",s),()=>ipcRenderer.removeListener("bazaar-search",s)},OnBazaarGetResourceDetails:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("bazaar-get-resource-details-response",e)}).catch(e=>{console.error("bazaar-get-resource-details failed:",e.message),ipcRenderer.send("bazaar-get-resource-details-response",{error:e.message})})};return ipcRenderer.on("bazaar-get-resource-details",s),()=>ipcRenderer.removeListener("bazaar-get-resource-details",s)},OnMakeX402Request:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("make-x402-request-response",e)}).catch(e=>{console.error("make-x402-request failed:",e.message),ipcRenderer.send("make-x402-request-response",{error:e.message})})};return ipcRenderer.on("make-x402-request",s),()=>ipcRenderer.removeListener("make-x402-request",s)},OnDiscoverX402Requirements:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("discover-x402-requirements-response",e)}).catch(e=>{console.error("discover-x402-requirements failed:",e.message),ipcRenderer.send("discover-x402-requirements-response",{error:e.message})})};return ipcRenderer.on("discover-x402-requirements",s),()=>ipcRenderer.removeListener("discover-x402-requirements",s)},OnGetWalletAddress:n=>{const s=(a,r)=>{console.log("get-wallet-address"),n(r).then(e=>{ipcRenderer.send("get-wallet-address-response",{data:e})}).catch(e=>{console.error("get-wallet-address-error",e),ipcRenderer.send("get-wallet-address-response",{error:e.message})})};return ipcRenderer.on("get-wallet-address",s),()=>ipcRenderer.removeListener("get-wallet-address",s)},OnGetWalletBalance:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("get-wallet-balance-response",{data:e})}).catch(e=>{console.error("get-wallet-balance-error",e),ipcRenderer.send("get-wallet-balance-response",{error:e.message})})};return ipcRenderer.on("get-wallet-balance",s),()=>ipcRenderer.removeListener("get-wallet-balance",s)},OnCheckSessionStatus:n=>{const s=()=>{n().then(a=>{console.info("check-session-status-response",a),ipcRenderer.send("check-session-status-response",{data:a})}).catch(a=>{console.error("check-session-status-error",a),ipcRenderer.send("check-session-status-response",{error:a.message})})};return ipcRenderer.on("check-session-status",s),()=>ipcRenderer.removeListener("check-session-status",s)},OnMcpServerVersion:n=>{const s=(a,r)=>{n(r)};return ipcRenderer.on("mcp-server-version",s),()=>ipcRenderer.removeListener("mcp-server-version",s)},OnUpdateAvailable:n=>{const s=(a,r)=>{n(r)};return ipcRenderer.on("update-available",s),()=>ipcRenderer.removeListener("update-available",s)},OnSignInWithEmail:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("sign-in-with-email-response",{data:e})}).catch(e=>{console.error("sign-in-with-email failed:",e.message),ipcRenderer.send("sign-in-with-email-response",{error:e.message})})};return ipcRenderer.on("sign-in-with-email",s),()=>ipcRenderer.removeListener("sign-in-with-email",s)},OnVerifyEmailOTP:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("verify-email-otp-response",{data:e})}).catch(e=>{console.error("verify-email-otp failed:",e.message),ipcRenderer.send("verify-email-otp-response",{error:e.message})})};return ipcRenderer.on("verify-email-otp",s),()=>ipcRenderer.removeListener("verify-email-otp",s)},OnSendTransaction:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("send-transaction-response",{data:e})}).catch(e=>{console.error("send-transaction failed:",e.message),ipcRenderer.send("send-transaction-response",{error:e.message})})};return ipcRenderer.on("send-transaction",s),()=>ipcRenderer.removeListener("send-transaction",s)},OnExecuteSwap:n=>{const s=(a,r)=>{n(r).then(e=>{ipcRenderer.send("execute-swap-response",{data:e})}).catch(e=>{console.error("execute-swap failed:",e.message),ipcRenderer.send("execute-swap-response",{error:e.message})})};return ipcRenderer.on("execute-swap",s),()=>ipcRenderer.removeListener("execute-swap",s)}});
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createDiscoverCommand(): Command;
3
- //# sourceMappingURL=discover.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,qBAAqB,IAAI,OAAO,CAsF/C"}
@@ -1,76 +0,0 @@
1
- import { Command } from 'commander';
2
- import chalk from 'chalk';
3
- import ora from 'ora';
4
- import { sendIpcRequest } from '../ipcClient.js';
5
- import { requireAuth } from '../utils/authCheck.js';
6
- import { formatError } from '../utils/errors.js';
7
- import { formatJson, formatUsdcAmount } from '../formatters/output.js';
8
- export function createDiscoverCommand() {
9
- return new Command('discover')
10
- .description('Discover X402 payment requirements for an endpoint')
11
- .argument('<baseURL>', 'Base URL of the X402-enabled endpoint')
12
- .argument('<path>', 'Request path')
13
- .option('-X, --method <method>', 'HTTP method (GET, POST, PUT, DELETE, PATCH)', 'GET')
14
- .option('-q, --query <params>', 'Query parameters as JSON')
15
- .option('-d, --data <json>', 'Request body as JSON')
16
- .option('--json', 'Output as JSON')
17
- .action(async (baseURL, path, options) => {
18
- const spinner = ora('Discovering payment requirements...').start();
19
- try {
20
- // Check authentication first
21
- await requireAuth();
22
- const data = {
23
- baseURL,
24
- path,
25
- method: options.method.toUpperCase(),
26
- };
27
- if (options.query) {
28
- try {
29
- data.queryParams = JSON.parse(options.query);
30
- }
31
- catch {
32
- spinner.fail('Invalid JSON in --query');
33
- console.error(chalk.red('The --query option must be valid JSON'));
34
- process.exit(1);
35
- }
36
- }
37
- if (options.data) {
38
- try {
39
- data.body = JSON.parse(options.data);
40
- }
41
- catch {
42
- spinner.fail('Invalid JSON in --data');
43
- console.error(chalk.red('The --data option must be valid JSON'));
44
- process.exit(1);
45
- }
46
- }
47
- const result = (await sendIpcRequest('discover-x402-requirements', data));
48
- spinner.stop();
49
- if (options.json) {
50
- console.log(formatJson(result));
51
- return;
52
- }
53
- // Text output
54
- console.log(chalk.bold('Payment Requirements'));
55
- console.log('---');
56
- if (result.maxAmountRequired !== undefined) {
57
- console.log(`Max Amount: ${formatUsdcAmount(result.maxAmountRequired)}`);
58
- }
59
- if (result.network) {
60
- console.log(`Network: ${result.network}`);
61
- }
62
- if (result.accepts && result.accepts.length > 0) {
63
- console.log(`Accepts: ${result.accepts.join(', ')}`);
64
- }
65
- if (result.paymentRequirements) {
66
- console.log(`\nFull Requirements:\n${JSON.stringify(result.paymentRequirements, null, 2)}`);
67
- }
68
- }
69
- catch (error) {
70
- spinner.fail('Discovery failed');
71
- console.error(chalk.red(formatError(error)));
72
- process.exit(1);
73
- }
74
- });
75
- }
76
- //# sourceMappingURL=discover.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"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"}
@@ -1,36 +0,0 @@
1
- export interface BazaarAccept {
2
- scheme?: string;
3
- network?: string;
4
- maxAmountRequired?: string;
5
- asset?: string;
6
- payTo?: string;
7
- description?: string;
8
- }
9
- export interface BazaarResource {
10
- resource: string;
11
- type?: string;
12
- x402Version?: string;
13
- accepts?: BazaarAccept[];
14
- lastUpdated?: string;
15
- facilitator?: string;
16
- metadata?: {
17
- description?: string;
18
- input?: unknown;
19
- output?: unknown;
20
- };
21
- }
22
- interface BazaarCache {
23
- fetchedAt: string;
24
- resources: BazaarResource[];
25
- }
26
- export declare function fetchAllResources(): Promise<BazaarResource[]>;
27
- export declare function loadCache(): BazaarCache | null;
28
- export declare function saveCache(resources: BazaarResource[]): void;
29
- export declare function isCacheStale(cache: BazaarCache): boolean;
30
- export declare function getResources(forceRefresh?: boolean): Promise<BazaarResource[]>;
31
- export declare function isGenericDescription(desc: string | undefined): boolean;
32
- export declare function getDomainCounts(resources: BazaarResource[]): Map<string, number>;
33
- export declare function scoreResourceQuality(resource: BazaarResource, domainCounts: Map<string, number>): number;
34
- export declare function searchResources(query: string, resources: BazaarResource[], k?: number): Promise<BazaarResource[]>;
35
- export {};
36
- //# sourceMappingURL=bazaarCache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bazaarCache.d.ts","sourceRoot":"","sources":["../../src/utils/bazaarCache.ts"],"names":[],"mappings":"AA0BA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,UAAU,WAAW;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,cAAc,EAAE,CAAC;CAC7B;AAmDD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAGnE;AAED,wBAAgB,SAAS,IAAI,WAAW,GAAG,IAAI,CAY9C;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,CAY3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAIxD;AAED,wBAAsB,YAAY,CAAC,YAAY,UAAQ,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAWlF;AAgDD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAMtE;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWhF;AAED,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,cAAc,EACxB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CA+DR;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EAAE,EAC3B,CAAC,SAAI,GACJ,OAAO,CAAC,cAAc,EAAE,CAAC,CA4B3B"}
@@ -1,246 +0,0 @@
1
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
- import * as path from 'path';
3
- import * as os from 'os';
4
- import { Document } from '@langchain/core/documents';
5
- import { BM25Retriever } from '@langchain/community/retrievers/bm25';
6
- const DEFAULT_PAGE_SIZE = 100;
7
- const STALE_HOURS = 12;
8
- const CDP_FACILITATOR = {
9
- url: 'https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources',
10
- pageSize: 1000,
11
- };
12
- const OPENX402_FACILITATOR = {
13
- url: 'https://facilitator.openx402.ai/discovery/resources',
14
- pageSize: DEFAULT_PAGE_SIZE,
15
- };
16
- const FACILITATORS = [CDP_FACILITATOR, OPENX402_FACILITATOR];
17
- function getCacheDir() {
18
- return path.join(os.homedir(), '.config', 'awal', 'bazaar');
19
- }
20
- function getCachePath() {
21
- return path.join(getCacheDir(), 'resources.json');
22
- }
23
- async function fetchFromFacilitator(facilitator) {
24
- const all = [];
25
- let offset = 0;
26
- const pageSize = facilitator.pageSize || DEFAULT_PAGE_SIZE;
27
- let hasMore = true;
28
- while (hasMore) {
29
- const url = `${facilitator.url}?limit=${pageSize}&offset=${offset}`;
30
- const response = await fetch(url, {
31
- headers: { Accept: 'application/json' },
32
- });
33
- if (!response.ok) {
34
- if (response.status === 429 && all.length > 0) {
35
- break;
36
- }
37
- throw new Error(`Facilitator ${facilitator.url} returned ${response.status}: ${response.statusText}`);
38
- }
39
- const body = (await response.json());
40
- for (const item of body.items) {
41
- item.facilitator = facilitator.url;
42
- }
43
- all.push(...body.items);
44
- if (all.length >= body.pagination.total) {
45
- hasMore = false;
46
- }
47
- else {
48
- offset += pageSize;
49
- }
50
- }
51
- return all;
52
- }
53
- export async function fetchAllResources() {
54
- const results = await Promise.all(FACILITATORS.map(fetchFromFacilitator));
55
- return results.flat();
56
- }
57
- export function loadCache() {
58
- const cachePath = getCachePath();
59
- if (!existsSync(cachePath)) {
60
- return null;
61
- }
62
- try {
63
- const raw = readFileSync(cachePath, 'utf-8');
64
- return JSON.parse(raw);
65
- }
66
- catch {
67
- return null;
68
- }
69
- }
70
- export function saveCache(resources) {
71
- const dir = getCacheDir();
72
- if (!existsSync(dir)) {
73
- mkdirSync(dir, { recursive: true });
74
- }
75
- const cache = {
76
- fetchedAt: new Date().toISOString(),
77
- resources,
78
- };
79
- writeFileSync(getCachePath(), JSON.stringify(cache, null, 2), 'utf-8');
80
- }
81
- export function isCacheStale(cache) {
82
- const fetchedAt = new Date(cache.fetchedAt).getTime();
83
- const now = Date.now();
84
- return now - fetchedAt > STALE_HOURS * 60 * 60 * 1000;
85
- }
86
- export async function getResources(forceRefresh = false) {
87
- if (!forceRefresh) {
88
- const cache = loadCache();
89
- if (cache && !isCacheStale(cache)) {
90
- return cache.resources;
91
- }
92
- }
93
- const resources = await fetchAllResources();
94
- saveCache(resources);
95
- return resources;
96
- }
97
- function buildDocContent(r) {
98
- const parts = [r.resource];
99
- if (r.metadata?.description) {
100
- parts.push(r.metadata.description);
101
- }
102
- if (r.metadata?.input) {
103
- parts.push(JSON.stringify(r.metadata.input));
104
- }
105
- if (r.metadata?.output) {
106
- parts.push(JSON.stringify(r.metadata.output));
107
- }
108
- if (r.accepts) {
109
- for (const a of r.accepts) {
110
- if (a.description)
111
- parts.push(a.description);
112
- if (a.network)
113
- parts.push(a.network);
114
- if (a.scheme)
115
- parts.push(a.scheme);
116
- if (a.asset)
117
- parts.push(a.asset);
118
- }
119
- }
120
- if (r.type) {
121
- parts.push(r.type);
122
- }
123
- return parts.join(' ');
124
- }
125
- const GENERIC_DESCRIPTIONS = [
126
- 'premium api access',
127
- 'api access',
128
- 'premium access',
129
- 'access api',
130
- 'api endpoint',
131
- 'premium endpoint',
132
- 'get data',
133
- 'fetch data',
134
- 'data api',
135
- 'api service',
136
- 'web service',
137
- 'web api',
138
- 'rest api',
139
- 'http api',
140
- ];
141
- export function isGenericDescription(desc) {
142
- if (!desc)
143
- return true;
144
- const trimmed = desc.trim();
145
- if (trimmed.length < 15)
146
- return true;
147
- const lower = trimmed.toLowerCase();
148
- return GENERIC_DESCRIPTIONS.some((g) => lower === g);
149
- }
150
- export function getDomainCounts(resources) {
151
- const counts = new Map();
152
- for (const r of resources) {
153
- try {
154
- const domain = new URL(r.resource).hostname;
155
- counts.set(domain, (counts.get(domain) ?? 0) + 1);
156
- }
157
- catch {
158
- // skip malformed URLs
159
- }
160
- }
161
- return counts;
162
- }
163
- export function scoreResourceQuality(resource, domainCounts) {
164
- let score = 0;
165
- // Output schema quality (weight: 0.30)
166
- const output = resource.metadata?.output;
167
- if (output && typeof output === 'object') {
168
- const outputObj = output;
169
- if (outputObj.output && typeof outputObj.output === 'object') {
170
- const inner = outputObj.output;
171
- if (inner.properties && typeof inner.properties === 'object') {
172
- score += 0.3;
173
- }
174
- }
175
- }
176
- // Description quality (weight: 0.30)
177
- const desc = resource.metadata?.description;
178
- if (desc && !isGenericDescription(desc) && desc.length > 50) {
179
- score += 0.3;
180
- }
181
- else if (desc && !isGenericDescription(desc)) {
182
- // Partial credit for non-generic but short descriptions
183
- score += 0.15;
184
- }
185
- // Domain concentration (weight: 0.20) — fewer resources = higher quality
186
- try {
187
- const domain = new URL(resource.resource).hostname;
188
- const count = domainCounts.get(domain) ?? 0;
189
- if (count < 100) {
190
- score += 0.2;
191
- }
192
- else if (count < 1000) {
193
- // Linear scale between 100 and 1000
194
- score += 0.2 * (1 - (count - 100) / 900);
195
- }
196
- // 1000+ gets 0
197
- }
198
- catch {
199
- // malformed URL gets 0
200
- }
201
- // HTTPS (weight: 0.10)
202
- if (resource.resource.startsWith('https://')) {
203
- score += 0.1;
204
- }
205
- // Timeout (weight: 0.10)
206
- const accepts = resource.accepts;
207
- if (accepts && accepts.length > 0) {
208
- // Check for maxTimeoutSeconds in accepts metadata
209
- const firstAccept = accepts[0];
210
- const timeout = firstAccept.maxTimeoutSeconds;
211
- if (timeout === undefined || timeout <= 30) {
212
- score += 0.1;
213
- }
214
- else if (timeout < 300) {
215
- // Linear scale between 30 and 300
216
- score += 0.1 * (1 - (timeout - 30) / 270);
217
- }
218
- // 300+ gets 0
219
- }
220
- else {
221
- // No timeout info — give benefit of the doubt
222
- score += 0.1;
223
- }
224
- return score;
225
- }
226
- export async function searchResources(query, resources, k = 5) {
227
- const candidateK = k * 5;
228
- const docs = resources.map((r) => new Document({
229
- pageContent: buildDocContent(r),
230
- metadata: { resource: r },
231
- }));
232
- const retriever = BM25Retriever.fromDocuments(docs, { k: candidateK });
233
- const results = await retriever.invoke(query);
234
- const candidates = results.map((doc) => doc.metadata.resource);
235
- const domainCounts = getDomainCounts(resources);
236
- const scored = candidates.map((resource, index) => {
237
- const qualityScore = scoreResourceQuality(resource, domainCounts);
238
- // BM25 position score: 1.0 for first result, decreasing linearly
239
- const bm25PositionScore = 1 - index / candidateK;
240
- const combinedScore = 0.4 * qualityScore + 0.6 * bm25PositionScore;
241
- return { resource, combinedScore };
242
- });
243
- scored.sort((a, b) => b.combinedScore - a.combinedScore);
244
- return scored.slice(0, k).map((s) => s.resource);
245
- }
246
- //# sourceMappingURL=bazaarCache.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bazaarCache.js","sourceRoot":"","sources":["../../src/utils/bazaarCache.ts"],"names":[],"mappings":"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"}