agentcash 0.5.0 → 0.6.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.
- package/dist/cjs/run-server.cjs +126 -124
- package/dist/esm/{chunk-GFY6TVGD.js → chunk-GFGSZCZI.js} +3 -3
- package/dist/esm/chunk-J42QBBCK.js +7 -0
- package/dist/esm/{chunk-X2RMQONA.js → chunk-LXQ32DT5.js} +2 -2
- package/dist/esm/{chunk-ZA22MAAS.js → chunk-TILJ7XBO.js} +2 -2
- package/dist/esm/{chunk-VNUJXNUN.js → chunk-UDNRXMYT.js} +58 -4
- package/dist/esm/chunk-UDNRXMYT.js.map +1 -0
- package/dist/esm/{commands-MWISIQ3T.js → commands-CPITQOJZ.js} +73 -19
- package/dist/esm/commands-CPITQOJZ.js.map +1 -0
- package/dist/esm/index.js +48 -14
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{install-NVZTM2HX.js → install-JPWIDRP2.js} +2 -2
- package/dist/esm/lib.js +2 -2
- package/dist/esm/{server-VLYH3GER.js → server-ZA2VY6ZV.js} +66 -114
- package/dist/esm/server-ZA2VY6ZV.js.map +1 -0
- package/dist/esm/shared/operations/index.js +4 -4
- package/package.json +3 -3
- package/dist/esm/chunk-3APKEOT5.js +0 -7
- package/dist/esm/chunk-VNUJXNUN.js.map +0 -1
- package/dist/esm/commands-MWISIQ3T.js.map +0 -1
- package/dist/esm/server-VLYH3GER.js.map +0 -1
- /package/dist/esm/{chunk-GFY6TVGD.js.map → chunk-GFGSZCZI.js.map} +0 -0
- /package/dist/esm/{chunk-3APKEOT5.js.map → chunk-J42QBBCK.js.map} +0 -0
- /package/dist/esm/{chunk-X2RMQONA.js.map → chunk-LXQ32DT5.js.map} +0 -0
- /package/dist/esm/{chunk-ZA22MAAS.js.map → chunk-TILJ7XBO.js.map} +0 -0
- /package/dist/esm/{install-NVZTM2HX.js.map → install-JPWIDRP2.js.map} +0 -0
package/dist/cjs/run-server.cjs
CHANGED
|
@@ -104296,6 +104296,24 @@ function restore2() {
|
|
|
104296
104296
|
restore();
|
|
104297
104297
|
}
|
|
104298
104298
|
|
|
104299
|
+
// src/shared/version.ts
|
|
104300
|
+
init_cjs_shims();
|
|
104301
|
+
var import_fs3 = require("fs");
|
|
104302
|
+
var import_path2 = require("path");
|
|
104303
|
+
var import_url = require("url");
|
|
104304
|
+
function getVersion2() {
|
|
104305
|
+
if (true) {
|
|
104306
|
+
return "0.6.1";
|
|
104307
|
+
}
|
|
104308
|
+
const __dirname3 = (0, import_path2.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
|
|
104309
|
+
const pkg = JSON.parse(
|
|
104310
|
+
(0, import_fs3.readFileSync)((0, import_path2.join)(__dirname3, "../../package.json"), "utf-8")
|
|
104311
|
+
);
|
|
104312
|
+
return pkg.version;
|
|
104313
|
+
}
|
|
104314
|
+
var MCP_VERSION = getVersion2();
|
|
104315
|
+
var DIST_TAG = MCP_VERSION.includes("-beta") ? "beta" : "latest";
|
|
104316
|
+
|
|
104299
104317
|
// src/shared/neverthrow/fetch/index.ts
|
|
104300
104318
|
init_cjs_shims();
|
|
104301
104319
|
var import_content_type = __toESM(require_content_type(), 1);
|
|
@@ -104448,7 +104466,7 @@ var TEMPO_TOKEN_ADDRESS = "0x20c0000000000000000000000000000000000000";
|
|
|
104448
104466
|
|
|
104449
104467
|
// src/shared/mpp-enabled.ts
|
|
104450
104468
|
init_cjs_shims();
|
|
104451
|
-
var isMppEnabled = () => "0.
|
|
104469
|
+
var isMppEnabled = () => "0.6.1".includes("-mpp");
|
|
104452
104470
|
|
|
104453
104471
|
// src/shared/operations/fetch-with-payment.ts
|
|
104454
104472
|
init_cjs_shims();
|
|
@@ -110134,7 +110152,7 @@ var registerFetchTool = ({
|
|
|
110134
110152
|
});
|
|
110135
110153
|
}
|
|
110136
110154
|
};
|
|
110137
|
-
const provider = flags.provider ??
|
|
110155
|
+
const provider = flags.provider ?? `agentcash@${MCP_VERSION}`;
|
|
110138
110156
|
const request = buildRequest2({
|
|
110139
110157
|
input,
|
|
110140
110158
|
address: account.address,
|
|
@@ -110172,6 +110190,9 @@ var registerFetchTool = ({
|
|
|
110172
110190
|
// src/server/tools/auth-fetch.ts
|
|
110173
110191
|
init_cjs_shims();
|
|
110174
110192
|
|
|
110193
|
+
// src/shared/operations/fetch-with-auth.ts
|
|
110194
|
+
init_cjs_shims();
|
|
110195
|
+
|
|
110175
110196
|
// src/server/lib/x402-extensions.ts
|
|
110176
110197
|
init_cjs_shims();
|
|
110177
110198
|
var getBazaarExtension = (extensions) => {
|
|
@@ -110198,6 +110219,54 @@ var getSiwxExtension = (extensions) => {
|
|
|
110198
110219
|
};
|
|
110199
110220
|
};
|
|
110200
110221
|
|
|
110222
|
+
// src/shared/operations/fetch-with-auth.ts
|
|
110223
|
+
function createFetchWithAuth(options) {
|
|
110224
|
+
const { surface: surface2, account, timeout = DEFAULT_USER_FETCH_TIMEOUT } = options;
|
|
110225
|
+
return async (request) => {
|
|
110226
|
+
const retryRequest = request.clone();
|
|
110227
|
+
const httpClient = new x402HTTPClient(new x402Client());
|
|
110228
|
+
const firstResult = await safeFetch(surface2, request, timeout);
|
|
110229
|
+
if (firstResult.isErr()) return firstResult;
|
|
110230
|
+
const firstResponse = firstResult.value;
|
|
110231
|
+
if (firstResponse.status !== 402) {
|
|
110232
|
+
return fetchOk({
|
|
110233
|
+
outcome: "response",
|
|
110234
|
+
response: firstResponse,
|
|
110235
|
+
authenticated: false
|
|
110236
|
+
});
|
|
110237
|
+
}
|
|
110238
|
+
const paymentRequiredResult = await safeGetPaymentRequired(
|
|
110239
|
+
surface2,
|
|
110240
|
+
httpClient,
|
|
110241
|
+
firstResponse
|
|
110242
|
+
);
|
|
110243
|
+
if (paymentRequiredResult.isErr()) return paymentRequiredResult;
|
|
110244
|
+
const paymentRequired = paymentRequiredResult.value;
|
|
110245
|
+
const siwxExtension = getSiwxExtension(paymentRequired.extensions);
|
|
110246
|
+
if (!siwxExtension) {
|
|
110247
|
+
return fetchOk({
|
|
110248
|
+
outcome: "no_siwx_extension",
|
|
110249
|
+
extensions: Object.keys(paymentRequired.extensions ?? {})
|
|
110250
|
+
});
|
|
110251
|
+
}
|
|
110252
|
+
const payloadResult = await safeCreateSIWxPayload(
|
|
110253
|
+
surface2,
|
|
110254
|
+
siwxExtension,
|
|
110255
|
+
account
|
|
110256
|
+
);
|
|
110257
|
+
if (payloadResult.isErr()) return payloadResult;
|
|
110258
|
+
const siwxHeader = encodeSIWxHeader(payloadResult.value);
|
|
110259
|
+
retryRequest.headers.set("SIGN-IN-WITH-X", siwxHeader);
|
|
110260
|
+
return (await safeFetch(surface2, retryRequest, timeout)).andThen(
|
|
110261
|
+
(response) => fetchOk({
|
|
110262
|
+
outcome: "response",
|
|
110263
|
+
response,
|
|
110264
|
+
authenticated: true
|
|
110265
|
+
})
|
|
110266
|
+
);
|
|
110267
|
+
};
|
|
110268
|
+
}
|
|
110269
|
+
|
|
110201
110270
|
// src/server/tools/auth-fetch.ts
|
|
110202
110271
|
var toolName2 = "fetch_with_auth";
|
|
110203
110272
|
var registerAuthTools = ({
|
|
@@ -110219,78 +110288,28 @@ var registerAuthTools = ({
|
|
|
110219
110288
|
}
|
|
110220
110289
|
},
|
|
110221
110290
|
async (input) => {
|
|
110222
|
-
const
|
|
110223
|
-
|
|
110224
|
-
|
|
110225
|
-
|
|
110226
|
-
|
|
110227
|
-
)
|
|
110228
|
-
|
|
110229
|
-
return mcpError(firstResult);
|
|
110230
|
-
}
|
|
110231
|
-
const firstResponse = firstResult.value;
|
|
110232
|
-
if (firstResponse.status !== 402) {
|
|
110233
|
-
if (!firstResponse.ok) {
|
|
110234
|
-
return mcpErrorFetch(toolName2, firstResponse);
|
|
110235
|
-
}
|
|
110236
|
-
const parseResponseResult2 = await safeParseResponse(
|
|
110237
|
-
toolName2,
|
|
110238
|
-
firstResponse
|
|
110239
|
-
);
|
|
110240
|
-
if (parseResponseResult2.isErr()) {
|
|
110241
|
-
return mcpError(parseResponseResult2);
|
|
110242
|
-
}
|
|
110243
|
-
return mcpSuccessResponse(parseResponseResult2.value);
|
|
110244
|
-
}
|
|
110245
|
-
const getPaymentRequiredResult = await safeGetPaymentRequired(
|
|
110246
|
-
toolName2,
|
|
110247
|
-
httpClient,
|
|
110248
|
-
firstResponse
|
|
110249
|
-
);
|
|
110250
|
-
if (getPaymentRequiredResult.isErr()) {
|
|
110251
|
-
return mcpError(getPaymentRequiredResult);
|
|
110291
|
+
const result = await createFetchWithAuth({
|
|
110292
|
+
surface: toolName2,
|
|
110293
|
+
account,
|
|
110294
|
+
timeout: input.timeout ?? DEFAULT_USER_FETCH_TIMEOUT
|
|
110295
|
+
})(buildRequest2({ input, address: account.address, sessionId }));
|
|
110296
|
+
if (result.isErr()) {
|
|
110297
|
+
return mcpError(result);
|
|
110252
110298
|
}
|
|
110253
|
-
const
|
|
110254
|
-
|
|
110255
|
-
if (!siwxExtension) {
|
|
110299
|
+
const value = result.value;
|
|
110300
|
+
if (value.outcome === "no_siwx_extension") {
|
|
110256
110301
|
return mcpSuccessJson({
|
|
110257
110302
|
error: "Endpoint returned 402 but no sign-in-with-x extension found",
|
|
110258
110303
|
statusCode: 402,
|
|
110259
|
-
extensions:
|
|
110304
|
+
extensions: value.extensions,
|
|
110260
110305
|
hint: "This endpoint may require payment instead of authentication. Use execute_call for paid requests."
|
|
110261
110306
|
});
|
|
110262
110307
|
}
|
|
110263
|
-
const
|
|
110264
|
-
|
|
110265
|
-
|
|
110266
|
-
account
|
|
110267
|
-
);
|
|
110268
|
-
if (payloadResult.isErr()) {
|
|
110269
|
-
return mcpError(payloadResult);
|
|
110270
|
-
}
|
|
110271
|
-
const siwxHeader = encodeSIWxHeader(payloadResult.value);
|
|
110272
|
-
const authedRequest = buildRequest2({
|
|
110273
|
-
input,
|
|
110274
|
-
address: account.address,
|
|
110275
|
-
sessionId
|
|
110276
|
-
});
|
|
110277
|
-
authedRequest.headers.set("SIGN-IN-WITH-X", siwxHeader);
|
|
110278
|
-
const authedResult = await safeFetch(
|
|
110279
|
-
toolName2,
|
|
110280
|
-
authedRequest,
|
|
110281
|
-
input.timeout ?? DEFAULT_USER_FETCH_TIMEOUT
|
|
110282
|
-
);
|
|
110283
|
-
if (authedResult.isErr()) {
|
|
110284
|
-
return mcpError(authedResult);
|
|
110285
|
-
}
|
|
110286
|
-
const authedResponse = authedResult.value;
|
|
110287
|
-
if (!authedResponse.ok) {
|
|
110288
|
-
return mcpErrorFetch(toolName2, authedResponse);
|
|
110308
|
+
const { response } = value;
|
|
110309
|
+
if (!response.ok) {
|
|
110310
|
+
return mcpErrorFetch(toolName2, response);
|
|
110289
110311
|
}
|
|
110290
|
-
const parseResponseResult = await safeParseResponse(
|
|
110291
|
-
toolName2,
|
|
110292
|
-
authedResponse
|
|
110293
|
-
);
|
|
110312
|
+
const parseResponseResult = await safeParseResponse(toolName2, response);
|
|
110294
110313
|
if (parseResponseResult.isErr()) {
|
|
110295
110314
|
return mcpError(parseResponseResult);
|
|
110296
110315
|
}
|
|
@@ -110903,18 +110922,18 @@ init_cjs_shims();
|
|
|
110903
110922
|
|
|
110904
110923
|
// src/shared/state.ts
|
|
110905
110924
|
init_cjs_shims();
|
|
110906
|
-
var
|
|
110925
|
+
var import_fs4 = __toESM(require("fs"), 1);
|
|
110907
110926
|
var STATE_FILE = configFile("state.json");
|
|
110908
110927
|
var stateSchema = zod_default.looseObject({
|
|
110909
110928
|
redeemedCodes: zod_default.array(zod_default.string())
|
|
110910
110929
|
}).partial();
|
|
110911
110930
|
var getState = () => {
|
|
110912
|
-
const stateFileExists =
|
|
110931
|
+
const stateFileExists = import_fs4.default.existsSync(STATE_FILE);
|
|
110913
110932
|
if (!stateFileExists) {
|
|
110914
|
-
|
|
110933
|
+
import_fs4.default.writeFileSync(STATE_FILE, "{}");
|
|
110915
110934
|
return {};
|
|
110916
110935
|
}
|
|
110917
|
-
const stateFileContent =
|
|
110936
|
+
const stateFileContent = import_fs4.default.readFileSync(STATE_FILE, "utf-8");
|
|
110918
110937
|
const result = stateSchema.safeParse(JSON.parse(stateFileContent));
|
|
110919
110938
|
if (!result.success) {
|
|
110920
110939
|
return {};
|
|
@@ -110924,7 +110943,7 @@ var getState = () => {
|
|
|
110924
110943
|
var setState = (state) => {
|
|
110925
110944
|
const existing = getState();
|
|
110926
110945
|
const newState = stateSchema.parse({ ...existing, ...state });
|
|
110927
|
-
|
|
110946
|
+
import_fs4.default.writeFileSync(STATE_FILE, JSON.stringify(newState, null, 2));
|
|
110928
110947
|
};
|
|
110929
110948
|
|
|
110930
110949
|
// src/shared/redeem-invite.ts
|
|
@@ -111021,26 +111040,6 @@ init_cjs_shims();
|
|
|
111021
111040
|
|
|
111022
111041
|
// src/shared/operations/report-error.ts
|
|
111023
111042
|
init_cjs_shims();
|
|
111024
|
-
|
|
111025
|
-
// src/shared/version.ts
|
|
111026
|
-
init_cjs_shims();
|
|
111027
|
-
var import_fs5 = require("fs");
|
|
111028
|
-
var import_path2 = require("path");
|
|
111029
|
-
var import_url = require("url");
|
|
111030
|
-
function getVersion2() {
|
|
111031
|
-
if (true) {
|
|
111032
|
-
return "0.5.0";
|
|
111033
|
-
}
|
|
111034
|
-
const __dirname3 = (0, import_path2.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
|
|
111035
|
-
const pkg = JSON.parse(
|
|
111036
|
-
(0, import_fs5.readFileSync)((0, import_path2.join)(__dirname3, "../../package.json"), "utf-8")
|
|
111037
|
-
);
|
|
111038
|
-
return pkg.version;
|
|
111039
|
-
}
|
|
111040
|
-
var MCP_VERSION = getVersion2();
|
|
111041
|
-
var DIST_TAG = MCP_VERSION.includes("-beta") ? "beta" : "latest";
|
|
111042
|
-
|
|
111043
|
-
// src/shared/operations/report-error.ts
|
|
111044
111043
|
async function submitErrorReport(surface2, input, address, dev) {
|
|
111045
111044
|
const telemetryResult = await safeFetchJson(
|
|
111046
111045
|
surface2,
|
|
@@ -111149,16 +111148,15 @@ init_cjs_shims();
|
|
|
111149
111148
|
// src/shared/origins.ts
|
|
111150
111149
|
init_cjs_shims();
|
|
111151
111150
|
var ORIGINS = [
|
|
111152
|
-
"https://
|
|
111153
|
-
"https://
|
|
111154
|
-
"https://
|
|
111155
|
-
"https://
|
|
111156
|
-
"https://
|
|
111151
|
+
"https://stableenrich.dev" /* StableEnrich */,
|
|
111152
|
+
"https://stablesocial.dev" /* StableSocial */,
|
|
111153
|
+
"https://stablestudio.dev" /* StableStudio */,
|
|
111154
|
+
"https://stableupload.dev" /* StableUpload */,
|
|
111155
|
+
"https://stableemail.dev" /* StableEmail */,
|
|
111156
|
+
"https://stablejobs.dev" /* StableJobs */,
|
|
111157
111157
|
"https://x402scan.com" /* X402Scan */,
|
|
111158
111158
|
"https://shirt.sh" /* Shirt */,
|
|
111159
|
-
"https://x402puppet.com" /* X402Puppet
|
|
111160
|
-
"https://x402facilitator.com" /* X402Facilitator */,
|
|
111161
|
-
"https://stablejobs.dev" /* StableJobs */
|
|
111159
|
+
"https://x402puppet.com" /* X402Puppet */
|
|
111162
111160
|
];
|
|
111163
111161
|
|
|
111164
111162
|
// src/shared/operations/discover.ts
|
|
@@ -111227,7 +111225,7 @@ function registerDiscoveryTools(server) {
|
|
|
111227
111225
|
description: `Find payment-protected resources on an origin. Returns a list of resource URLs.
|
|
111228
111226
|
Use check_endpoint_schema separately to get detailed pricing/schema info for specific resources.
|
|
111229
111227
|
Known default origins with resource packs. Discover if more needed:
|
|
111230
|
-
- ${"https://
|
|
111228
|
+
- ${"https://stableenrich.dev" /* StableEnrich */} ->
|
|
111231
111229
|
People + Org search
|
|
111232
111230
|
Google Maps (places + locations)
|
|
111233
111231
|
Grok twitter search
|
|
@@ -111238,10 +111236,10 @@ function registerDiscoveryTools(server) {
|
|
|
111238
111236
|
Email enrichment
|
|
111239
111237
|
Influencer email/username enrichment
|
|
111240
111238
|
Hunter email verifier
|
|
111241
|
-
- ${"https://
|
|
111242
|
-
- ${"https://stablestudio.
|
|
111243
|
-
- ${"https://
|
|
111244
|
-
- ${"https://
|
|
111239
|
+
- ${"https://stablesocial.dev" /* StableSocial */} -> social media data for twitter, instagram, tiktok, youtube, facebook, reddit.
|
|
111240
|
+
- ${"https://stablestudio.dev" /* StableStudio */} -> generate and edit images / videos
|
|
111241
|
+
- ${"https://stableupload.dev" /* StableUpload */} -> upload and share files with others.
|
|
111242
|
+
- ${"https://stableemail.dev" /* StableEmail */} -> send emails.
|
|
111245
111243
|
`,
|
|
111246
111244
|
inputSchema: external_exports3.object({
|
|
111247
111245
|
url: external_exports3.url().describe(
|
|
@@ -111294,26 +111292,30 @@ function registerDiscoveryTools(server) {
|
|
|
111294
111292
|
// src/server/resources/origins.ts
|
|
111295
111293
|
init_cjs_shims();
|
|
111296
111294
|
var ORIGIN_METADATA = {
|
|
111297
|
-
["https://
|
|
111298
|
-
title: "
|
|
111295
|
+
["https://stableenrich.dev" /* StableEnrich */]: {
|
|
111296
|
+
title: "StableEnrich",
|
|
111299
111297
|
description: "People/org search, Google Maps, Grok twitter search, Exa web search, LinkedIn data, Firecrawl scrape, WhitePages, email enrichment"
|
|
111300
111298
|
},
|
|
111301
|
-
["https://
|
|
111302
|
-
title: "
|
|
111299
|
+
["https://stablesocial.dev" /* StableSocial */]: {
|
|
111300
|
+
title: "StableSocial",
|
|
111303
111301
|
description: "Social media data for Twitter, Instagram, TikTok, YouTube, Facebook, Reddit"
|
|
111304
111302
|
},
|
|
111305
|
-
["https://stablestudio.
|
|
111303
|
+
["https://stablestudio.dev" /* StableStudio */]: {
|
|
111306
111304
|
title: "StableStudio",
|
|
111307
111305
|
description: "Generate and edit images and videos"
|
|
111308
111306
|
},
|
|
111309
|
-
["https://
|
|
111307
|
+
["https://stableupload.dev" /* StableUpload */]: {
|
|
111310
111308
|
title: "AgentUpload",
|
|
111311
111309
|
description: "Upload and share files"
|
|
111312
111310
|
},
|
|
111313
|
-
["https://
|
|
111314
|
-
title: "
|
|
111311
|
+
["https://stableemail.dev" /* StableEmail */]: {
|
|
111312
|
+
title: "StableEmail",
|
|
111315
111313
|
description: "Send emails"
|
|
111316
111314
|
},
|
|
111315
|
+
["https://stablejobs.dev" /* StableJobs */]: {
|
|
111316
|
+
title: "StableJobs",
|
|
111317
|
+
description: "Search job postings"
|
|
111318
|
+
},
|
|
111317
111319
|
["https://x402scan.com" /* X402Scan */]: {
|
|
111318
111320
|
title: "X402 Scan",
|
|
111319
111321
|
description: "x402 protocol explorer"
|
|
@@ -111583,8 +111585,8 @@ If the user has an invite code, use \`redeem_invite\` to claim free USDC credits
|
|
|
111583
111585
|
|
|
111584
111586
|
Use \`discover_api_endpoints\` to find x402-protected endpoints on a target origin. For example:
|
|
111585
111587
|
|
|
111586
|
-
- \`${"https://
|
|
111587
|
-
- \`${"https://stablestudio.
|
|
111588
|
+
- \`${"https://stableenrich.dev" /* StableEnrich */}\` - Data enrichment APIs
|
|
111589
|
+
- \`${"https://stablestudio.dev" /* StableStudio */}\` - AI image generation APIs
|
|
111588
111590
|
|
|
111589
111591
|
This returns a list of available endpoints with their pricing and schemas.
|
|
111590
111592
|
|
|
@@ -111652,7 +111654,7 @@ var registerGettingStartedPrompt = ({ server }) => {
|
|
|
111652
111654
|
|
|
111653
111655
|
// src/server/prompts/enrich.ts
|
|
111654
111656
|
init_cjs_shims();
|
|
111655
|
-
var PROMPT_CONTENT2 = `To start, you should check this resource page: ${"https://
|
|
111657
|
+
var PROMPT_CONTENT2 = `To start, you should check this resource page: ${"https://stableenrich.dev" /* StableEnrich */}/llms.txt, which has access to all of the paid endpoints.
|
|
111656
111658
|
|
|
111657
111659
|
- You have access to the agentcash MCP server, which allows you to call paid endpoints which contain potentially extremely useful information.
|
|
111658
111660
|
- Here are the tools you have access to:
|
|
@@ -111698,16 +111700,16 @@ var PROMPT_CONTENT2 = `To start, you should check this resource page: ${"https:/
|
|
|
111698
111700
|
- You should use these paid endpoints to find useful information whenever possible.
|
|
111699
111701
|
- Opt to use the paid endpoints as often as possible, as they speed up your research and provide higher quality information than traditional WebFetch.
|
|
111700
111702
|
|
|
111701
|
-
- **IMPORTANT:** All the API endpoints below (Exa, Firecrawl, Clado, Google Maps, Apollo, Grok, Whitepages, Hunter) are accessed via mcp__x402__fetch. They are NOT separate MCP tools. Call them like: mcp__x402__fetch(url="${"https://
|
|
111703
|
+
- **IMPORTANT:** All the API endpoints below (Exa, Firecrawl, Clado, Google Maps, Apollo, Grok, Whitepages, Hunter) are accessed via mcp__x402__fetch. They are NOT separate MCP tools. Call them like: mcp__x402__fetch(url="${"https://stableenrich.dev" /* StableEnrich */}/api/clado/contacts-enrich", method="POST", body={...})
|
|
111702
111704
|
- Use the Exa and Firecrawl endpoints as advanced / better WebFetch. They will often return data that would otherwise return only javascript or blocked content.
|
|
111703
111705
|
- If you get a 403 or error when using WebSearch or WebFetch on a website, try with Exa/Firecrawl endpoints immediately as they likely can get around the blockage.
|
|
111704
111706
|
- Use the Clado endpoints (/api/clado/contacts-enrich, /api/clado/linkedin-scrape) to enrich information about people and find their linkedin or email addresses. If linkedin returns an error code, immediately try with the Clado endpoints.
|
|
111705
111707
|
- Use the Google Maps endpoints to find reviews, or other local information. Always attempt to include review information in your findings if relevant.
|
|
111706
|
-
- **Google Maps text-search/full endpoint:** When calling POST ${"https://
|
|
111708
|
+
- **Google Maps text-search/full endpoint:** When calling POST ${"https://stableenrich.dev" /* StableEnrich */}/api/google-maps/text-search/full, ALWAYS use maxResultCount=1-3, never 5. Using 5 produces too much context. If you get excessive context in the response, retry with maxResultCount=1.
|
|
111707
111709
|
- All these are REST API endpoints called via mcp__x402__fetch - do NOT attempt to call mcp__clado__*, mcp__exa__*, mcp__google_maps__*, etc. Those tools do not exist.
|
|
111708
111710
|
|
|
111709
111711
|
PAID ENDPOINTS:
|
|
111710
|
-
These endpoints are always available at ${"https://
|
|
111712
|
+
These endpoints are always available at ${"https://stableenrich.dev" /* StableEnrich */}. You should always fetch from this domain.`;
|
|
111711
111713
|
var INFER_TASK_INSTRUCTIONS = `No specific query was provided.
|
|
111712
111714
|
|
|
111713
111715
|
Your task:
|
|
@@ -111773,7 +111775,7 @@ var import_path3 = require("path");
|
|
|
111773
111775
|
var import_url2 = require("url");
|
|
111774
111776
|
function getVersion3() {
|
|
111775
111777
|
if (true) {
|
|
111776
|
-
return "0.
|
|
111778
|
+
return "0.6.1";
|
|
111777
111779
|
}
|
|
111778
111780
|
const __dirname3 = (0, import_path3.dirname)((0, import_url2.fileURLToPath)(importMetaUrl));
|
|
111779
111781
|
const pkg = JSON.parse(
|
|
@@ -111788,11 +111790,11 @@ var DIST_TAG2 = MCP_VERSION2.includes("-beta") ? "beta" : "latest";
|
|
|
111788
111790
|
init_cjs_shims();
|
|
111789
111791
|
function buildServerInstructions() {
|
|
111790
111792
|
return `Known API origins:
|
|
111791
|
-
- ${"https://
|
|
111792
|
-
- ${"https://
|
|
111793
|
-
- ${"https://stablestudio.
|
|
111794
|
-
- ${"https://
|
|
111795
|
-
- ${"https://
|
|
111793
|
+
- ${"https://stableenrich.dev" /* StableEnrich */} \u2014 People/org search, Google Maps, Grok twitter search, Exa web search, LinkedIn data, Firecrawl scrape, WhitePages, email enrichment, Hunter email verifier
|
|
111794
|
+
- ${"https://stablesocial.dev" /* StableSocial */} \u2014 Social media data (Twitter, Instagram, TikTok, YouTube, Facebook, Reddit)
|
|
111795
|
+
- ${"https://stablestudio.dev" /* StableStudio */} \u2014 Generate and edit images/videos
|
|
111796
|
+
- ${"https://stableupload.dev" /* StableUpload */} \u2014 Upload and share files
|
|
111797
|
+
- ${"https://stableemail.dev" /* StableEmail */} \u2014 Send emails
|
|
111796
111798
|
|
|
111797
111799
|
Workflow:
|
|
111798
111800
|
1. Use discover_api_endpoints to find available endpoints on an origin.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isMppEnabled
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-J42QBBCK.js";
|
|
4
4
|
import {
|
|
5
5
|
MCP_VERSION
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-TILJ7XBO.js";
|
|
7
7
|
import {
|
|
8
8
|
getBalance,
|
|
9
9
|
getBaseUrl,
|
|
@@ -119,4 +119,4 @@ export {
|
|
|
119
119
|
getWalletInfo,
|
|
120
120
|
submitErrorReport
|
|
121
121
|
};
|
|
122
|
-
//# sourceMappingURL=chunk-
|
|
122
|
+
//# sourceMappingURL=chunk-GFGSZCZI.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isMppEnabled
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-J42QBBCK.js";
|
|
4
4
|
import {
|
|
5
5
|
DEFAULT_FETCH_TIMEOUT,
|
|
6
6
|
err,
|
|
@@ -645,4 +645,4 @@ export {
|
|
|
645
645
|
checkEndpoint,
|
|
646
646
|
discoverResources
|
|
647
647
|
};
|
|
648
|
-
//# sourceMappingURL=chunk-
|
|
648
|
+
//# sourceMappingURL=chunk-LXQ32DT5.js.map
|
|
@@ -4,7 +4,7 @@ import { dirname, join } from "path";
|
|
|
4
4
|
import { fileURLToPath } from "url";
|
|
5
5
|
function getVersion() {
|
|
6
6
|
if (true) {
|
|
7
|
-
return "0.
|
|
7
|
+
return "0.6.1";
|
|
8
8
|
}
|
|
9
9
|
const __dirname2 = dirname(fileURLToPath(import.meta.url));
|
|
10
10
|
const pkg = JSON.parse(
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
MCP_VERSION,
|
|
20
20
|
DIST_TAG
|
|
21
21
|
};
|
|
22
|
-
//# sourceMappingURL=chunk-
|
|
22
|
+
//# sourceMappingURL=chunk-TILJ7XBO.js.map
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getTempoBalance
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GFGSZCZI.js";
|
|
4
4
|
import {
|
|
5
5
|
detectPaymentProtocols,
|
|
6
|
+
getSiwxExtension,
|
|
6
7
|
safeCreatePaymentPayload,
|
|
8
|
+
safeCreateSIWxPayload,
|
|
7
9
|
safeGetPaymentRequired,
|
|
8
10
|
safeGetPaymentSettlement,
|
|
9
11
|
tokenStringToNumber,
|
|
10
12
|
x402Err,
|
|
11
13
|
x402Ok
|
|
12
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-LXQ32DT5.js";
|
|
13
15
|
import {
|
|
14
16
|
getBalance
|
|
15
17
|
} from "./chunk-UFSCGP67.js";
|
|
16
18
|
import {
|
|
19
|
+
DEFAULT_USER_FETCH_TIMEOUT,
|
|
17
20
|
err,
|
|
18
21
|
fetchErr,
|
|
19
22
|
fetchOk,
|
|
@@ -351,10 +354,61 @@ async function handleMppPayment(surface, response, clonedRequest, options) {
|
|
|
351
354
|
);
|
|
352
355
|
}
|
|
353
356
|
|
|
357
|
+
// src/shared/operations/fetch-with-auth.ts
|
|
358
|
+
import { x402Client, x402HTTPClient } from "@x402/core/client";
|
|
359
|
+
import { encodeSIWxHeader } from "@x402/extensions/sign-in-with-x";
|
|
360
|
+
function createFetchWithAuth(options) {
|
|
361
|
+
const { surface, account, timeout = DEFAULT_USER_FETCH_TIMEOUT } = options;
|
|
362
|
+
return async (request) => {
|
|
363
|
+
const retryRequest = request.clone();
|
|
364
|
+
const httpClient = new x402HTTPClient(new x402Client());
|
|
365
|
+
const firstResult = await safeFetch(surface, request, timeout);
|
|
366
|
+
if (firstResult.isErr()) return firstResult;
|
|
367
|
+
const firstResponse = firstResult.value;
|
|
368
|
+
if (firstResponse.status !== 402) {
|
|
369
|
+
return fetchOk({
|
|
370
|
+
outcome: "response",
|
|
371
|
+
response: firstResponse,
|
|
372
|
+
authenticated: false
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
const paymentRequiredResult = await safeGetPaymentRequired(
|
|
376
|
+
surface,
|
|
377
|
+
httpClient,
|
|
378
|
+
firstResponse
|
|
379
|
+
);
|
|
380
|
+
if (paymentRequiredResult.isErr()) return paymentRequiredResult;
|
|
381
|
+
const paymentRequired = paymentRequiredResult.value;
|
|
382
|
+
const siwxExtension = getSiwxExtension(paymentRequired.extensions);
|
|
383
|
+
if (!siwxExtension) {
|
|
384
|
+
return fetchOk({
|
|
385
|
+
outcome: "no_siwx_extension",
|
|
386
|
+
extensions: Object.keys(paymentRequired.extensions ?? {})
|
|
387
|
+
});
|
|
388
|
+
}
|
|
389
|
+
const payloadResult = await safeCreateSIWxPayload(
|
|
390
|
+
surface,
|
|
391
|
+
siwxExtension,
|
|
392
|
+
account
|
|
393
|
+
);
|
|
394
|
+
if (payloadResult.isErr()) return payloadResult;
|
|
395
|
+
const siwxHeader = encodeSIWxHeader(payloadResult.value);
|
|
396
|
+
retryRequest.headers.set("SIGN-IN-WITH-X", siwxHeader);
|
|
397
|
+
return (await safeFetch(surface, retryRequest, timeout)).andThen(
|
|
398
|
+
(response) => fetchOk({
|
|
399
|
+
outcome: "response",
|
|
400
|
+
response,
|
|
401
|
+
authenticated: true
|
|
402
|
+
})
|
|
403
|
+
);
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
|
|
354
407
|
export {
|
|
355
408
|
requestSchema,
|
|
356
409
|
buildRequest,
|
|
357
410
|
safeGetMppChallenge,
|
|
358
|
-
createFetchWithPayment
|
|
411
|
+
createFetchWithPayment,
|
|
412
|
+
createFetchWithAuth
|
|
359
413
|
};
|
|
360
|
-
//# sourceMappingURL=chunk-
|
|
414
|
+
//# sourceMappingURL=chunk-UDNRXMYT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/server/tools/lib/request.ts","../../src/shared/neverthrow/mpp/index.ts","../../src/shared/operations/fetch-with-payment.ts","../../src/shared/operations/fetch-with-auth.ts"],"sourcesContent":["import z from 'zod';\n\nimport type { Address } from 'viem';\n\nexport const requestSchema = z.object({\n url: z.url().describe('The endpoint URL'),\n method: z\n .enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])\n .optional()\n .describe('HTTP method. Defaults to GET for fetch operations.'),\n body: z\n .unknown()\n .optional()\n .describe('Request body for POST/PUT/PATCH methods'),\n headers: z\n .record(z.string(), z.string())\n .optional()\n .describe('Additional headers to include')\n .default({}),\n timeout: z\n .number()\n .int()\n .positive()\n .optional()\n .describe('Request timeout in milliseconds'),\n});\n\ninterface BuildRequestProps {\n input: z.infer<typeof requestSchema>;\n address?: Address;\n sessionId?: string;\n provider?: string;\n}\n\nexport const buildRequest = ({\n input,\n address,\n sessionId,\n provider,\n}: BuildRequestProps) => {\n return new Request(input.url, {\n method: input.method ?? 'GET',\n body: input.body\n ? typeof input.body === 'string'\n ? input.body\n : JSON.stringify(input.body)\n : undefined,\n headers: {\n ...(input.body ? { 'Content-Type': 'application/json' } : {}),\n ...input.headers,\n ...(address\n ? { 'X-Wallet-Address': address, 'X-Client-ID': provider }\n : {}),\n ...(sessionId ? { 'X-Session-ID': sessionId } : {}),\n },\n });\n};\n","import { Challenge, Receipt } from 'mppx';\nimport {\n err,\n ok,\n resultFromPromise,\n resultFromThrowable,\n} from '@agentcash/neverthrow';\n\nimport type { BaseMppError } from './types';\nconst errorType = 'mpp';\n\nexport const mppOk = <T>(value: T) => ok(value);\nexport const mppErr = (surface: string, error: BaseMppError) =>\n err(errorType, surface, error);\n\nconst mppResultFromPromise = <T>(\n surface: string,\n promise: Promise<T>,\n error: (e: unknown) => BaseMppError\n) => resultFromPromise(errorType, surface, promise, error);\n\nconst mppResultFromThrowable = <T>(\n surface: string,\n fn: () => T,\n error: (e: unknown) => BaseMppError\n) => resultFromThrowable(errorType, surface, fn, error);\n\nexport const safeGetMppChallenge = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Challenge.fromResponse(response),\n error => ({\n cause: 'parse_mpp_challenge',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP challenge from response',\n })\n );\n};\n\nexport const safeCreateMppCredential = (\n surface: string,\n mppxClient: { createCredential: (response: Response) => Promise<string> },\n response: Response\n) => {\n return mppResultFromPromise(\n surface,\n mppxClient.createCredential(response),\n error => ({\n cause: 'create_mpp_credential',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to create MPP credential',\n })\n );\n};\n\nexport const safeGetMppReceipt = (surface: string, response: Response) => {\n return mppResultFromThrowable(\n surface,\n () => Receipt.fromResponse(response),\n error => ({\n cause: 'parse_mpp_receipt',\n message:\n error instanceof Error\n ? error.message\n : 'Failed to parse MPP receipt from response',\n })\n );\n};\n","import { formatUnits } from 'viem';\n\nimport type { x402HTTPClient } from '@x402/core/client';\nimport type { Address } from 'viem';\nimport type { GlobalFlags } from '@/types';\n\nimport { resultFromPromise } from '@agentcash/neverthrow';\n\nimport { fetchErr, fetchOk, safeFetch } from '@/shared/neverthrow/fetch';\nimport {\n safeCreatePaymentPayload,\n safeGetPaymentRequired,\n safeGetPaymentSettlement,\n x402Err,\n x402Ok,\n} from '@/shared/neverthrow/x402';\nimport {\n safeGetMppChallenge,\n safeCreateMppCredential,\n safeGetMppReceipt,\n mppErr,\n mppOk,\n} from '@/shared/neverthrow/mpp';\n\nimport { log } from '@/shared/log';\nimport { detectPaymentProtocols } from '@/shared/protocol';\nimport { tokenStringToNumber } from '@/shared/token';\nimport { getBalance } from '@/shared/balance';\nimport { getTempoBalance } from '@/shared/tempo-balance';\n\n/**\n * Hook called before a payment is executed.\n * Throw to abort. Return to proceed.\n * Matches existing checkBalance/checkTempoBalance throw-to-abort behavior.\n */\nexport type BeforePaymentHook = (ctx: {\n protocol: 'x402' | 'mpp';\n amount: number;\n currency: string;\n network: string;\n}) => Promise<void>;\n\nexport interface PaymentClients {\n x402: x402HTTPClient;\n mpp: { createCredential: (response: Response) => Promise<string> };\n}\n\nexport interface PaymentInfo {\n protocol: 'x402' | 'mpp';\n price?: string;\n payment?: {\n success: boolean;\n transactionHash?: string;\n };\n}\n\nexport interface FetchWithPaymentResult {\n response: Response;\n paymentInfo: PaymentInfo | null;\n}\n\nexport interface FetchWithPaymentOptions {\n surface: string;\n clients: PaymentClients;\n paymentMethod: 'x402' | 'mpp' | 'auto';\n account: { address: Address };\n flags: GlobalFlags;\n beforePayment?: BeforePaymentHook;\n timeout?: number;\n}\n\n/**\n * Create a fetch function with automatic dual-protocol payment handling.\n *\n * 1. Makes initial request\n * 2. If 402 response, detects protocol(s)\n * 3. Calls beforePayment hook (for balance checks)\n * 4. Creates payment credential/payload\n * 5. Retries request with payment headers\n */\nexport function createFetchWithPayment(options: FetchWithPaymentOptions) {\n const { surface, clients, paymentMethod, beforePayment, timeout } = options;\n\n return async (request: Request) => {\n const clonedRequest = request.clone();\n const fallbackRequest = request.clone();\n\n const probeResult = await safeFetch(surface, request, timeout);\n\n if (probeResult.isErr()) {\n return fetchErr(surface, probeResult.error);\n }\n\n // Not a 402 response — return as-is\n if (probeResult.value.status !== 402) {\n return probeResult.andThen(response =>\n fetchOk<FetchWithPaymentResult>({ response, paymentInfo: null })\n );\n }\n\n const response = probeResult.value;\n\n // User explicitly chose a protocol — use that, no fallback\n if (paymentMethod !== 'auto') {\n if (paymentMethod === 'mpp') {\n return handleMppPayment(surface, response, clonedRequest, options);\n }\n return handleX402Payment(\n surface,\n response,\n clonedRequest,\n clients.x402,\n beforePayment,\n timeout\n );\n }\n\n // Auto: detect available protocols, pick by higher balance\n const available = detectPaymentProtocols(response);\n\n let preferred: 'x402' | 'mpp';\n\n if (available.length === 1) {\n preferred = available[0]!;\n } else {\n // Both protocols available — pick by balance\n preferred = await pickByBalance(surface, response, options);\n }\n\n const fallback =\n available.length > 1 ? (preferred === 'mpp' ? 'x402' : 'mpp') : null;\n\n const result =\n preferred === 'mpp'\n ? await handleMppPayment(surface, response, clonedRequest, options)\n : await handleX402Payment(\n surface,\n response,\n clonedRequest,\n clients.x402,\n beforePayment,\n timeout\n );\n\n if (result.isErr() && fallback) {\n // Preferred failed — try fallback with a fresh request clone\n return fallback === 'mpp'\n ? handleMppPayment(surface, response, fallbackRequest, options)\n : handleX402Payment(\n surface,\n response,\n fallbackRequest,\n clients.x402,\n beforePayment,\n timeout\n );\n }\n\n return result;\n };\n}\n\n/**\n * Pick the preferred protocol by comparing wallet balances.\n * Falls back to 'mpp' if both balances fail to fetch.\n */\nasync function pickByBalance(\n surface: string,\n response: Response,\n options: FetchWithPaymentOptions\n): Promise<'x402' | 'mpp'> {\n const { account } = options;\n\n // Get x402 (USDC on Base) balance\n const x402BalanceResult = await resultFromPromise(\n 'balance',\n surface,\n getBalance({\n address: account.address,\n surface,\n }).then(r => (r.isOk() ? r.value.balance : 0)),\n () => ({\n cause: 'x402_balance' as const,\n message: 'Failed to get x402 balance',\n })\n );\n\n if (x402BalanceResult.isErr()) {\n log.debug('Balance comparison failed, defaulting to mpp');\n return 'mpp';\n }\n\n const x402Balance = x402BalanceResult.value;\n\n // Get MPP (Tempo) balance — need token address from the challenge\n let mppBalance = 0;\n const challengeResult = safeGetMppChallenge(surface, response);\n if (challengeResult.isOk()) {\n const currency = challengeResult.value.request.currency as\n | string\n | undefined;\n const decimals =\n (challengeResult.value.request.decimals as number | undefined) ?? 6;\n if (currency) {\n const tempoResult = await resultFromPromise(\n 'tempo',\n surface,\n getTempoBalance({\n address: account.address,\n tokenAddress: currency as Address,\n }),\n () => ({\n cause: 'tempo_balance' as const,\n message: 'Tempo balance check failed',\n })\n );\n if (tempoResult.isOk()) {\n mppBalance = Number(formatUnits(tempoResult.value.balance, decimals));\n }\n }\n }\n\n log.info(`Protocol selection — x402: $${x402Balance}, mpp: $${mppBalance}`);\n return x402Balance >= mppBalance ? 'x402' : 'mpp';\n}\n\nasync function handleX402Payment(\n surface: string,\n response: Response,\n clonedRequest: Request,\n client: x402HTTPClient,\n beforePayment?: BeforePaymentHook,\n timeout?: number\n) {\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n client,\n response\n );\n\n if (paymentRequiredResult.isErr()) {\n return paymentRequiredResult;\n }\n\n const paymentRequired = paymentRequiredResult.value;\n\n // Call beforePayment hook (e.g. balance check) before signing\n if (beforePayment) {\n const accept = paymentRequired.accepts[0];\n if (accept) {\n const amount = tokenStringToNumber(accept.amount);\n const hookResult = await resultFromPromise(\n 'x402',\n surface,\n beforePayment({\n protocol: 'x402',\n amount,\n currency: 'USDC',\n network: accept.network,\n }),\n e => ({\n cause: 'payment_already_attempted' as const,\n message:\n e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return x402Err(surface, hookResult.error);\n }\n }\n }\n\n const paymentPayloadResult = await safeCreatePaymentPayload(\n surface,\n client,\n paymentRequired\n );\n\n if (paymentPayloadResult.isErr()) {\n return paymentPayloadResult;\n }\n\n const paymentPayload = paymentPayloadResult.value;\n\n // Encode payment header\n const paymentHeaders = client.encodePaymentSignatureHeader(paymentPayload);\n\n // Check if this is already a retry to prevent infinite loops\n if (\n clonedRequest.headers.has('PAYMENT-SIGNATURE') ||\n clonedRequest.headers.has('X-PAYMENT')\n ) {\n return x402Err(surface, {\n cause: 'payment_already_attempted',\n message: 'Payment already attempted',\n });\n }\n\n // Add payment headers to cloned request\n for (const [key, value] of Object.entries(paymentHeaders)) {\n clonedRequest.headers.set(key, value);\n }\n clonedRequest.headers.set(\n 'Access-Control-Expose-Headers',\n 'PAYMENT-RESPONSE,X-PAYMENT-RESPONSE'\n );\n\n // Retry the request with payment\n return await safeFetch(surface, clonedRequest, timeout).andThen(\n paidResponse => {\n const settlementResult = safeGetPaymentSettlement(\n surface,\n client,\n paidResponse\n );\n\n return x402Ok<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'x402',\n price: tokenStringToNumber(\n paymentPayload.accepted.amount\n ).toLocaleString('en-US', {\n style: 'currency',\n currency: 'USD',\n }),\n ...(settlementResult.isOk()\n ? {\n payment: {\n success: settlementResult.value.success,\n transactionHash: settlementResult.value.transaction,\n },\n }\n : {}),\n },\n });\n }\n );\n}\n\nasync function handleMppPayment(\n surface: string,\n response: Response,\n clonedRequest: Request,\n options: FetchWithPaymentOptions\n) {\n const { clients, beforePayment, timeout } = options;\n const mppxClient = clients.mpp;\n\n // Prevent retry loops\n if (clonedRequest.headers.has('Authorization')) {\n return mppErr(surface, {\n cause: 'mpp_payment_already_attempted',\n message: 'MPP payment already attempted',\n });\n }\n\n // Parse the challenge from the WWW-Authenticate header\n const challengeResult = safeGetMppChallenge(surface, response);\n\n if (challengeResult.isErr()) {\n return challengeResult;\n }\n\n const challenge = challengeResult.value;\n\n // Extract payment info from challenge request\n const amount = challenge.request.amount as string | undefined;\n const decimals = (challenge.request.decimals as number | undefined) ?? 6;\n const currency = challenge.request.currency as string | undefined;\n\n // Call beforePayment hook (e.g. balance check)\n if (beforePayment && amount && currency) {\n const numericAmount = Number(formatUnits(BigInt(amount), decimals));\n const hookResult = await resultFromPromise(\n 'mpp',\n surface,\n beforePayment({\n protocol: 'mpp',\n amount: numericAmount,\n currency,\n network: `tempo:${challenge.method}`,\n }),\n e => ({\n cause: 'mpp_payment_already_attempted' as const,\n message: e instanceof Error ? e.message : 'Before-payment hook failed',\n })\n );\n if (hookResult.isErr()) {\n return mppErr(surface, hookResult.error);\n }\n }\n\n // Create credential (signs transaction on Tempo)\n const credentialResult = await safeCreateMppCredential(\n surface,\n mppxClient,\n response\n );\n\n if (credentialResult.isErr()) {\n return credentialResult;\n }\n\n const credential = credentialResult.value;\n\n // Set Authorization header on cloned request\n clonedRequest.headers.set('Authorization', credential);\n\n // Retry the fetch with the credential\n return await safeFetch(surface, clonedRequest, timeout).andThen(\n paidResponse => {\n // Parse the receipt for transaction hash\n const receiptResult = safeGetMppReceipt(surface, paidResponse);\n\n const priceDisplay = amount\n ? Number(formatUnits(BigInt(amount), decimals)).toLocaleString(\n 'en-US',\n {\n style: 'currency',\n currency: 'USD',\n }\n )\n : undefined;\n\n return mppOk<FetchWithPaymentResult>({\n response: paidResponse,\n paymentInfo: {\n protocol: 'mpp',\n ...(priceDisplay ? { price: priceDisplay } : {}),\n ...(receiptResult.isOk()\n ? {\n payment: {\n success: true,\n transactionHash: receiptResult.value.reference,\n },\n }\n : {}),\n },\n });\n }\n );\n}\n","import { x402Client, x402HTTPClient } from '@x402/core/client';\nimport { encodeSIWxHeader } from '@x402/extensions/sign-in-with-x';\n\nimport type { PrivateKeyAccount } from 'viem';\n\nimport {\n DEFAULT_USER_FETCH_TIMEOUT,\n fetchOk,\n safeFetch,\n} from '@/shared/neverthrow/fetch';\nimport {\n safeCreateSIWxPayload,\n safeGetPaymentRequired,\n} from '@/shared/neverthrow/x402';\nimport { getSiwxExtension } from '@/server/lib/x402-extensions';\n\nexport type FetchWithAuthResult =\n | { outcome: 'response'; response: Response; authenticated: boolean }\n | { outcome: 'no_siwx_extension'; extensions: string[] };\n\nexport interface FetchWithAuthOptions {\n surface: string;\n account: PrivateKeyAccount;\n timeout?: number;\n}\n\n/**\n * Create a fetch function with automatic SIWX (Sign-In With X) authentication.\n *\n * 1. Makes initial request\n * 2. If 402, parses for SIWX extension\n * 3. Creates signed wallet proof\n * 4. Retries with SIGN-IN-WITH-X header\n *\n * Returns a discriminated result:\n * - `outcome: 'response'` — a Response (authenticated or not), consumer handles ok/error\n * - `outcome: 'no_siwx_extension'` — 402 without SIWX, consumer decides how to present\n */\nexport function createFetchWithAuth(options: FetchWithAuthOptions) {\n const { surface, account, timeout = DEFAULT_USER_FETCH_TIMEOUT } = options;\n\n return async (request: Request) => {\n const retryRequest = request.clone();\n const httpClient = new x402HTTPClient(new x402Client());\n\n const firstResult = await safeFetch(surface, request, timeout);\n\n if (firstResult.isErr()) return firstResult;\n\n const firstResponse = firstResult.value;\n\n if (firstResponse.status !== 402) {\n return fetchOk<FetchWithAuthResult>({\n outcome: 'response',\n response: firstResponse,\n authenticated: false,\n });\n }\n\n const paymentRequiredResult = await safeGetPaymentRequired(\n surface,\n httpClient,\n firstResponse\n );\n\n if (paymentRequiredResult.isErr()) return paymentRequiredResult;\n\n const paymentRequired = paymentRequiredResult.value;\n const siwxExtension = getSiwxExtension(paymentRequired.extensions);\n\n if (!siwxExtension) {\n return fetchOk<FetchWithAuthResult>({\n outcome: 'no_siwx_extension',\n extensions: Object.keys(paymentRequired.extensions ?? {}),\n });\n }\n\n const payloadResult = await safeCreateSIWxPayload(\n surface,\n siwxExtension,\n account\n );\n\n if (payloadResult.isErr()) return payloadResult;\n\n const siwxHeader = encodeSIWxHeader(payloadResult.value);\n\n retryRequest.headers.set('SIGN-IN-WITH-X', siwxHeader);\n\n return (await safeFetch(surface, retryRequest, timeout)).andThen(response =>\n fetchOk<FetchWithAuthResult>({\n outcome: 'response',\n response,\n authenticated: true,\n })\n );\n };\n}\n"],"mappings":"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","names":["response"]}
|