agentcash 0.7.6 → 0.8.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.
- package/README.md +1 -1
- package/dist/cjs/run-server.cjs +59 -28
- package/dist/esm/{chunk-5EMDWOPZ.js → chunk-4R52CY5Q.js} +23 -23
- package/dist/esm/chunk-4R52CY5Q.js.map +1 -0
- package/dist/esm/{chunk-Q4CNAV4N.js → chunk-5ELAEV2M.js} +10 -9
- package/dist/esm/chunk-5ELAEV2M.js.map +1 -0
- package/dist/esm/{chunk-UYVXLY33.js → chunk-62B3GENJ.js} +8 -6
- package/dist/esm/{chunk-UYVXLY33.js.map → chunk-62B3GENJ.js.map} +1 -1
- package/dist/esm/{chunk-TRPO7BKD.js → chunk-6PU3XK6I.js} +8 -228
- package/dist/esm/chunk-6PU3XK6I.js.map +1 -0
- package/dist/esm/{chunk-FLIDR6EU.js → chunk-7ZEXMJYJ.js} +5 -3
- package/dist/esm/{chunk-FLIDR6EU.js.map → chunk-7ZEXMJYJ.js.map} +1 -1
- package/dist/esm/{chunk-QPL3AVUK.js → chunk-C36IAW7R.js} +5 -3
- package/dist/esm/{chunk-QPL3AVUK.js.map → chunk-C36IAW7R.js.map} +1 -1
- package/dist/esm/chunk-FBPC4LGY.js +7 -0
- package/dist/esm/{chunk-PWYZN62H.js → chunk-OHA3LLUQ.js} +3 -3
- package/dist/esm/{chunk-24E2V3PA.js → chunk-UN3PRLTL.js} +15 -43
- package/dist/esm/chunk-UN3PRLTL.js.map +1 -0
- package/dist/esm/{chunk-F43CZXWI.js → chunk-VR5I67WE.js} +2 -2
- package/dist/esm/{chunk-XNU6FVCF.js → chunk-W7DAJMFQ.js} +87 -19
- package/dist/esm/chunk-W7DAJMFQ.js.map +1 -0
- package/dist/esm/chunk-YQFK4U62.js +230 -0
- package/dist/esm/chunk-YQFK4U62.js.map +1 -0
- package/dist/esm/{chunk-EYYVAQBE.js → chunk-Z2R7VYNM.js} +11 -9
- package/dist/esm/{chunk-EYYVAQBE.js.map → chunk-Z2R7VYNM.js.map} +1 -1
- package/dist/esm/chunk-ZDDDU5O2.js +41 -0
- package/dist/esm/chunk-ZDDDU5O2.js.map +1 -0
- package/dist/esm/{chunk-KPEJO3KV.js → chunk-ZOVLXKVL.js} +8 -8
- package/dist/esm/chunk-ZOVLXKVL.js.map +1 -0
- package/dist/esm/{commands-CTDEOF6I.js → commands-YSOBBE4N.js} +625 -504
- package/dist/esm/commands-YSOBBE4N.js.map +1 -0
- package/dist/esm/{fund-N47ZRBRZ.js → fund-PRV53MDA.js} +7 -5
- package/dist/esm/{fund-N47ZRBRZ.js.map → fund-PRV53MDA.js.map} +1 -1
- package/dist/esm/index.js +65 -23
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{install-R727Y6WB.js → install-QT37XD4R.js} +10 -8
- package/dist/esm/{install-R727Y6WB.js.map → install-QT37XD4R.js.map} +1 -1
- package/dist/esm/lib.js +4 -3
- package/dist/esm/{server-CZ4XJYLK.js → server-QARME5NA.js} +26 -19
- package/dist/esm/server-QARME5NA.js.map +1 -0
- package/dist/esm/shared/operations/index.js +7 -6
- package/dist/esm/shared/operations/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-24E2V3PA.js.map +0 -1
- package/dist/esm/chunk-5EMDWOPZ.js.map +0 -1
- package/dist/esm/chunk-AFQXUUCH.js +0 -7
- package/dist/esm/chunk-KPEJO3KV.js.map +0 -1
- package/dist/esm/chunk-Q4CNAV4N.js.map +0 -1
- package/dist/esm/chunk-TRPO7BKD.js.map +0 -1
- package/dist/esm/chunk-XNU6FVCF.js.map +0 -1
- package/dist/esm/commands-CTDEOF6I.js.map +0 -1
- package/dist/esm/server-CZ4XJYLK.js.map +0 -1
- /package/dist/esm/{chunk-AFQXUUCH.js.map → chunk-FBPC4LGY.js.map} +0 -0
- /package/dist/esm/{chunk-PWYZN62H.js.map → chunk-OHA3LLUQ.js.map} +0 -0
- /package/dist/esm/{chunk-F43CZXWI.js.map → chunk-VR5I67WE.js.map} +0 -0
package/README.md
CHANGED
|
@@ -96,7 +96,7 @@ On first run, a wallet is generated at `~/.agentcash/wallet.json`. Deposit USDC
|
|
|
96
96
|
| `get_wallet_info` | Get wallet address and USDC balance |
|
|
97
97
|
| `redeem_invite` | Redeem an invite code to receive USDC |
|
|
98
98
|
| `check_endpoint_schema` | Check if endpoint is x402-protected, get pricing/schema/auth |
|
|
99
|
-
| `discover_api_endpoints` | Discover x402 resources from origin's .well-known
|
|
99
|
+
| `discover_api_endpoints` | Discover x402 resources from origin's OpenAPI or .well-known |
|
|
100
100
|
| `report_error` | Report critical MCP tool bugs to agentcash developers |
|
|
101
101
|
|
|
102
102
|
## Environment
|
package/dist/cjs/run-server.cjs
CHANGED
|
@@ -6860,12 +6860,12 @@ var require_dist = __commonJS({
|
|
|
6860
6860
|
throw new Error(`Unknown format "${name}"`);
|
|
6861
6861
|
return f;
|
|
6862
6862
|
};
|
|
6863
|
-
function addFormats(ajv, list2,
|
|
6863
|
+
function addFormats(ajv, list2, fs10, exportName) {
|
|
6864
6864
|
var _a2;
|
|
6865
6865
|
var _b;
|
|
6866
6866
|
(_a2 = (_b = ajv.opts.code).formats) !== null && _a2 !== void 0 ? _a2 : _b.formats = (0, codegen_1._)`require("ajv-formats/dist/formats").${exportName}`;
|
|
6867
6867
|
for (const f of list2)
|
|
6868
|
-
ajv.addFormat(f,
|
|
6868
|
+
ajv.addFormat(f, fs10[f]);
|
|
6869
6869
|
}
|
|
6870
6870
|
module2.exports = exports2 = formatsPlugin;
|
|
6871
6871
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
@@ -47364,7 +47364,7 @@ var require_node_gyp_build = __commonJS({
|
|
|
47364
47364
|
"../../../node_modules/.pnpm/node-gyp-build@4.8.4/node_modules/node-gyp-build/node-gyp-build.js"(exports2, module2) {
|
|
47365
47365
|
"use strict";
|
|
47366
47366
|
init_cjs_shims();
|
|
47367
|
-
var
|
|
47367
|
+
var fs10 = require("fs");
|
|
47368
47368
|
var path2 = require("path");
|
|
47369
47369
|
var os2 = require("os");
|
|
47370
47370
|
var runtimeRequire = typeof __webpack_require__ === "function" ? __non_webpack_require__ : require;
|
|
@@ -47425,7 +47425,7 @@ var require_node_gyp_build = __commonJS({
|
|
|
47425
47425
|
};
|
|
47426
47426
|
function readdirSync2(dir) {
|
|
47427
47427
|
try {
|
|
47428
|
-
return
|
|
47428
|
+
return fs10.readdirSync(dir);
|
|
47429
47429
|
} catch (err3) {
|
|
47430
47430
|
return [];
|
|
47431
47431
|
}
|
|
@@ -47519,7 +47519,7 @@ var require_node_gyp_build = __commonJS({
|
|
|
47519
47519
|
return typeof window !== "undefined" && window.process && window.process.type === "renderer";
|
|
47520
47520
|
}
|
|
47521
47521
|
function isAlpine(platform3) {
|
|
47522
|
-
return platform3 === "linux" &&
|
|
47522
|
+
return platform3 === "linux" && fs10.existsSync("/etc/alpine-release");
|
|
47523
47523
|
}
|
|
47524
47524
|
load.parseTags = parseTags;
|
|
47525
47525
|
load.matchTags = matchTags;
|
|
@@ -113816,7 +113816,7 @@ var import_path2 = require("path");
|
|
|
113816
113816
|
var import_url = require("url");
|
|
113817
113817
|
function getVersion2() {
|
|
113818
113818
|
if (true) {
|
|
113819
|
-
return "0.
|
|
113819
|
+
return "0.8.0";
|
|
113820
113820
|
}
|
|
113821
113821
|
const __dirname3 = (0, import_path2.dirname)((0, import_url.fileURLToPath)(importMetaUrl));
|
|
113822
113822
|
const pkg = JSON.parse(
|
|
@@ -113979,7 +113979,7 @@ var TEMPO_TOKEN_ADDRESS = "0x20c0000000000000000000000000000000000000";
|
|
|
113979
113979
|
|
|
113980
113980
|
// src/shared/mpp-enabled.ts
|
|
113981
113981
|
init_cjs_shims();
|
|
113982
|
-
var isMppEnabled = () => "0.
|
|
113982
|
+
var isMppEnabled = () => "0.8.0".includes("-mpp");
|
|
113983
113983
|
|
|
113984
113984
|
// src/shared/operations/fetch-with-payment.ts
|
|
113985
113985
|
init_cjs_shims();
|
|
@@ -115393,28 +115393,33 @@ ${PRIMARY_ORIGINS.flatMap((o) => ORIGIN_METADATA[o] ? [` ${o} \u2014 ${ORIGIN_M
|
|
|
115393
115393
|
reportError: {
|
|
115394
115394
|
mcp: `EMERGENCY ONLY. Report critical MCP tool bugs. Do NOT use for normal errors (balance, network, 4xx) \u2014 those are recoverable.`,
|
|
115395
115395
|
cli: `Report a critical bug to the agentcash team (emergency only). Do NOT use for normal errors like low balance, network timeouts, or 4xx responses \u2014 those are recoverable without filing a report.`
|
|
115396
|
-
}
|
|
115397
|
-
|
|
115396
|
+
}
|
|
115397
|
+
};
|
|
115398
|
+
var WORKFLOW = [
|
|
115399
|
+
`Workflow:`,
|
|
115400
|
+
`1. If you don't already know your balance, call get_wallet_info. You need a balance for paid endpoints \u2014 if it's zero, share the deposit link with the user. SIWX endpoints don't require a balance. You don't need to call this every turn, just before your first paid call or whenever you're unsure.`,
|
|
115401
|
+
`2. Call discover_api_endpoints() to get the endpoint index \u2014 a list of available routes with descriptions and auth modes. The auth mode for each endpoint tells you whether to use fetch (paid) or fetch_with_auth (SIWX).`,
|
|
115402
|
+
`3. Call check_endpoint_schema() to get the exact input/output schema and auth mode for the endpoint you want to call, so you know what fields to pass and what the response contains. Both discover_api_endpoints and check_endpoint_schema return the auth mode.`,
|
|
115403
|
+
`4. Call fetch (paid) or fetch_with_auth (SIWX) based on the auth mode, and with the correct input schema.`
|
|
115404
|
+
].join("\n");
|
|
115405
|
+
function buildServerInstructions(userOrigins = []) {
|
|
115406
|
+
const allOrigins = [
|
|
115407
|
+
...userOrigins.map((o) => ` - ${o.url} \u2014 ${o.description}`),
|
|
115408
|
+
...PRIMARY_ORIGINS.flatMap(
|
|
115409
|
+
(o) => ORIGIN_METADATA[o] ? [` - ${o} \u2014 ${ORIGIN_METADATA[o].description}`] : []
|
|
115410
|
+
)
|
|
115411
|
+
].join("\n");
|
|
115412
|
+
return [
|
|
115398
115413
|
`AgentCash lets you call protected APIs \u2014 handling both x402 micropayments and SIWX authentication seamlessly. It manages a USDC wallet for paid endpoints (fetch) and signs wallet proofs for identity-gated endpoints (fetch_with_auth).`,
|
|
115399
115414
|
`The user has installed agentcash because they want to use paid and SIWX-protected APIs as their preferred way to accomplish related tasks.`,
|
|
115400
115415
|
`Paid endpoints require a wallet balance. SIWX endpoints are free \u2014 they only require a wallet identity.`,
|
|
115401
|
-
|
|
115402
|
-
|
|
115403
|
-
...PRIMARY_ORIGINS.flatMap(
|
|
115404
|
-
(o) => ORIGIN_METADATA[o] ? [` - ${o} \u2014 ${ORIGIN_METADATA[o].description}`] : []
|
|
115405
|
-
)
|
|
115406
|
-
].join("\n"),
|
|
115416
|
+
`If a task could be accomplished by one of these registered origins, run the workflow below:
|
|
115417
|
+
${allOrigins}`,
|
|
115407
115418
|
`discover_api_endpoints also works with any origin beyond this list. If you identify another origin that would be useful for a task, you can use it.`,
|
|
115408
|
-
|
|
115409
|
-
`Workflow:`,
|
|
115410
|
-
`1. If you don't already know your balance, call get_wallet_info. You need a balance for paid endpoints \u2014 if it's zero, share the deposit link with the user. SIWX endpoints don't require a balance. You don't need to call this every turn, just before your first paid call or whenever you're unsure.`,
|
|
115411
|
-
`2. Call discover_api_endpoints() to get the endpoint index \u2014 a list of available routes with descriptions and auth modes. The auth mode for each endpoint tells you whether to use fetch (paid) or fetch_with_auth (SIWX).`,
|
|
115412
|
-
`3. Call check_endpoint_schema() to get the exact input/output schema and auth mode for the endpoint you want to call, so you know what fields to pass and what the response contains. Both discover_api_endpoints and check_endpoint_schema return the auth mode.`,
|
|
115413
|
-
`4. Call fetch (paid) or fetch_with_auth (SIWX) based on the auth mode, and with the correct input schema.`
|
|
115414
|
-
].join("\n"),
|
|
115419
|
+
WORKFLOW,
|
|
115415
115420
|
`If you need to compose multiple endpoints in sequence, or anything about the origin's capabilities is unclear, call discover_api_endpoints with include_guidance=true to retrieve the origin's full usage documentation.`
|
|
115416
|
-
].join("\n\n")
|
|
115417
|
-
}
|
|
115421
|
+
].join("\n\n");
|
|
115422
|
+
}
|
|
115418
115423
|
var REQUEST_PARAMS = {
|
|
115419
115424
|
url: "The endpoint URL",
|
|
115420
115425
|
method: "HTTP method. Defaults to GET for fetch operations.",
|
|
@@ -117234,7 +117239,7 @@ async function discoverResources(surface2, url3, options = {}) {
|
|
|
117234
117239
|
|
|
117235
117240
|
// src/server/tools/discover-resources.ts
|
|
117236
117241
|
var toolName5 = "discover_api_endpoints";
|
|
117237
|
-
var OPENAPI_TRIED_PATHS = "/openapi.json, /.well-known/
|
|
117242
|
+
var OPENAPI_TRIED_PATHS = "/openapi.json, /.well-known/x402";
|
|
117238
117243
|
function registerDiscoveryTools(server) {
|
|
117239
117244
|
server.registerTool(
|
|
117240
117245
|
toolName5,
|
|
@@ -117752,7 +117757,7 @@ var import_path3 = require("path");
|
|
|
117752
117757
|
var import_url2 = require("url");
|
|
117753
117758
|
function getVersion3() {
|
|
117754
117759
|
if (true) {
|
|
117755
|
-
return "0.
|
|
117760
|
+
return "0.8.0";
|
|
117756
117761
|
}
|
|
117757
117762
|
const __dirname3 = (0, import_path3.dirname)((0, import_url2.fileURLToPath)(importMetaUrl));
|
|
117758
117763
|
const pkg = JSON.parse(
|
|
@@ -117920,6 +117925,31 @@ async function getWallet() {
|
|
|
117920
117925
|
return ok2(reconciled);
|
|
117921
117926
|
}
|
|
117922
117927
|
|
|
117928
|
+
// src/shared/user-origins.ts
|
|
117929
|
+
init_cjs_shims();
|
|
117930
|
+
var fs9 = __toESM(require("fs"), 1);
|
|
117931
|
+
var ORIGINS_FILE = configFile("origins.json");
|
|
117932
|
+
var userOriginSchema = zod_default.object({
|
|
117933
|
+
url: zod_default.string(),
|
|
117934
|
+
title: zod_default.string(),
|
|
117935
|
+
description: zod_default.string(),
|
|
117936
|
+
addedAt: zod_default.string()
|
|
117937
|
+
});
|
|
117938
|
+
var originsFileSchema = zod_default.object({
|
|
117939
|
+
added: zod_default.array(userOriginSchema)
|
|
117940
|
+
});
|
|
117941
|
+
function readOriginsFile() {
|
|
117942
|
+
if (!fs9.existsSync(ORIGINS_FILE)) return [];
|
|
117943
|
+
const raw = fs9.readFileSync(ORIGINS_FILE, "utf-8");
|
|
117944
|
+
const json3 = safeParseJson("user-origins", raw);
|
|
117945
|
+
if (!json3.isOk()) return [];
|
|
117946
|
+
const parsed = originsFileSchema.safeParse(json3.value);
|
|
117947
|
+
return parsed.success ? parsed.data.added : [];
|
|
117948
|
+
}
|
|
117949
|
+
function loadUserOrigins() {
|
|
117950
|
+
return readOriginsFile();
|
|
117951
|
+
}
|
|
117952
|
+
|
|
117923
117953
|
// src/server/index.ts
|
|
117924
117954
|
var startServer = async (flags) => {
|
|
117925
117955
|
log.info("Starting agentcash...");
|
|
@@ -117941,6 +117971,7 @@ var startServer = async (flags) => {
|
|
|
117941
117971
|
surface: "startServer"
|
|
117942
117972
|
});
|
|
117943
117973
|
}
|
|
117974
|
+
const serverInstructions = buildServerInstructions(loadUserOrigins());
|
|
117944
117975
|
const server = new McpServer(
|
|
117945
117976
|
{
|
|
117946
117977
|
name: "agentcash",
|
|
@@ -117948,7 +117979,7 @@ var startServer = async (flags) => {
|
|
|
117948
117979
|
version: MCP_VERSION2,
|
|
117949
117980
|
websiteUrl: "https://x402scan.com/mcp",
|
|
117950
117981
|
icons: [{ src: "https://x402scan.com/logo.svg" }],
|
|
117951
|
-
description:
|
|
117982
|
+
description: serverInstructions
|
|
117952
117983
|
},
|
|
117953
117984
|
{
|
|
117954
117985
|
capabilities: {
|
|
@@ -117960,7 +117991,7 @@ var startServer = async (flags) => {
|
|
|
117960
117991
|
listChanged: true
|
|
117961
117992
|
}
|
|
117962
117993
|
},
|
|
117963
|
-
instructions:
|
|
117994
|
+
instructions: serverInstructions
|
|
117964
117995
|
}
|
|
117965
117996
|
);
|
|
117966
117997
|
const props = {
|
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
log
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-YQFK4U62.js";
|
|
4
|
+
|
|
5
|
+
// src/shared/operations/discover.ts
|
|
6
|
+
import {
|
|
7
|
+
discoverOriginSchema,
|
|
8
|
+
GuidanceMode
|
|
9
|
+
} from "@agentcash/discovery";
|
|
10
|
+
async function discoverResources(surface, url, options = {}) {
|
|
11
|
+
const guidance = options.includeGuidance === true ? GuidanceMode.Always : options.includeGuidance === false ? GuidanceMode.Never : GuidanceMode.Auto;
|
|
12
|
+
const result = await discoverOriginSchema({ target: url, guidance });
|
|
13
|
+
if (!result.found) {
|
|
14
|
+
log.error(`[discoverResources failed`, {
|
|
15
|
+
surface,
|
|
16
|
+
url,
|
|
17
|
+
cause: result.cause,
|
|
18
|
+
message: result.message
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
4
23
|
|
|
5
24
|
// src/shared/operations/check-endpoint.ts
|
|
6
25
|
import {
|
|
@@ -40,28 +59,9 @@ async function checkEndpoint(surface, url, methods, sampleInputBody, headers) {
|
|
|
40
59
|
return { ...result, advisories };
|
|
41
60
|
}
|
|
42
61
|
|
|
43
|
-
// src/shared/operations/discover.ts
|
|
44
|
-
import {
|
|
45
|
-
discoverOriginSchema,
|
|
46
|
-
GuidanceMode
|
|
47
|
-
} from "@agentcash/discovery";
|
|
48
|
-
async function discoverResources(surface, url, options = {}) {
|
|
49
|
-
const guidance = options.includeGuidance === true ? GuidanceMode.Always : options.includeGuidance === false ? GuidanceMode.Never : GuidanceMode.Auto;
|
|
50
|
-
const result = await discoverOriginSchema({ target: url, guidance });
|
|
51
|
-
if (!result.found) {
|
|
52
|
-
log.error(`[discoverResources failed`, {
|
|
53
|
-
surface,
|
|
54
|
-
url,
|
|
55
|
-
cause: result.cause,
|
|
56
|
-
message: result.message
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
return result;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
62
|
export {
|
|
63
|
+
discoverResources,
|
|
63
64
|
SUPPORTED_METHODS,
|
|
64
|
-
checkEndpoint
|
|
65
|
-
discoverResources
|
|
65
|
+
checkEndpoint
|
|
66
66
|
};
|
|
67
|
-
//# sourceMappingURL=chunk-
|
|
67
|
+
//# sourceMappingURL=chunk-4R52CY5Q.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/operations/discover.ts","../../src/shared/operations/check-endpoint.ts"],"sourcesContent":["import {\n discoverOriginSchema,\n GuidanceMode,\n type DiscoverOriginSchemaSuccess,\n type DiscoverOriginSchemaNotFound,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\n\nexport interface DiscoverOptions {\n includeGuidance?: boolean;\n}\n\n/**\n * Discover payment-protected resources on an origin.\n * Fetches OpenAPI spec, builds endpoint index, and fetches guidance.\n *\n * Returns DiscoverOriginSchemaSuccess on success, DiscoverOriginSchemaNotFound with cause on failure.\n */\nexport async function discoverResources(\n surface: string,\n url: string,\n options: DiscoverOptions = {}\n): Promise<DiscoverOriginSchemaSuccess | DiscoverOriginSchemaNotFound> {\n const guidance =\n options.includeGuidance === true\n ? GuidanceMode.Always\n : options.includeGuidance === false\n ? GuidanceMode.Never\n : GuidanceMode.Auto;\n\n const result = await discoverOriginSchema({ target: url, guidance });\n\n if (!result.found) {\n log.error(`[discoverResources failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n }\n\n return result;\n}\n","import {\n checkEndpointSchema,\n type HttpMethod,\n type CheckEndpointSuccess,\n type CheckEndpointNotFound,\n} from '@agentcash/discovery';\n\nimport { log } from '@/shared/log';\n\nexport const SUPPORTED_METHODS = [\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n] as const;\n// Narrowed subset of discovery's HttpMethod (excludes HEAD/OPTIONS/TRACE).\nexport type SupportedMethod = Extract<\n HttpMethod,\n (typeof SUPPORTED_METHODS)[number]\n>;\n\n/**\n * Returns advisory data for an endpoint: auth mode, pricing, protocols,\n * input schema, and (when available) exact payment options.\n *\n * Two-phase workflow:\n * 1. Call without `sampleInputSchema` to get the input schema and advisory\n * pricing from the OpenAPI spec (no live request to the endpoint).\n * 2. Once you know what body you intend to send, call again with\n * `sampleInputSchema` set to that body. The discovery layer will probe\n * the live endpoint with that payload and return exact PaymentOptions\n * priced for it — giving a precise cost before committing to a fetch.\n */\nexport async function checkEndpoint(\n surface: string,\n url: string,\n methods?: SupportedMethod[],\n sampleInputBody?: Record<string, unknown>,\n headers?: Record<string, string>\n): Promise<CheckEndpointSuccess | CheckEndpointNotFound> {\n log.info('Checking endpoint', {\n surface,\n url,\n methods,\n hasSampleInputBody: !!sampleInputBody,\n });\n\n const result = await checkEndpointSchema({\n url,\n sampleInputBody,\n headers,\n });\n\n if (!result.found) {\n log.error(`[checkEndpoint failed`, {\n surface,\n url,\n cause: result.cause,\n message: result.message,\n });\n return result;\n }\n\n const advisories = methods?.length\n ? result.advisories.filter(a =>\n methods.includes(a.method as SupportedMethod)\n )\n : result.advisories;\n\n return { ...result, advisories };\n}\n"],"mappings":";;;;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAGK;AAcP,eAAsB,kBACpB,SACA,KACA,UAA2B,CAAC,GACyC;AACrE,QAAM,WACJ,QAAQ,oBAAoB,OACxB,aAAa,SACb,QAAQ,oBAAoB,QAC1B,aAAa,QACb,aAAa;AAErB,QAAM,SAAS,MAAM,qBAAqB,EAAE,QAAQ,KAAK,SAAS,CAAC;AAEnE,MAAI,CAAC,OAAO,OAAO;AACjB,QAAI,MAAM,6BAA6B;AAAA,MACrC;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AC3CA;AAAA,EACE;AAAA,OAIK;AAIA,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAmBA,eAAsB,cACpB,SACA,KACA,SACA,iBACA,SACuD;AACvD,MAAI,KAAK,qBAAqB;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,CAAC,CAAC;AAAA,EACxB,CAAC;AAED,QAAM,SAAS,MAAM,oBAAoB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,CAAC,OAAO,OAAO;AACjB,QAAI,MAAM,yBAAyB;AAAA,MACjC;AAAA,MACA;AAAA,MACA,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,IAClB,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,SAAS,SACxB,OAAO,WAAW;AAAA,IAAO,OACvB,QAAQ,SAAS,EAAE,MAAyB;AAAA,EAC9C,IACA,OAAO;AAEX,SAAO,EAAE,GAAG,QAAQ,WAAW;AACjC;","names":[]}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import {
|
|
2
2
|
clientMetadata
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-ZOVLXKVL.js";
|
|
4
4
|
import {
|
|
5
5
|
DIST_TAG
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-VR5I67WE.js";
|
|
7
7
|
import {
|
|
8
8
|
wait
|
|
9
9
|
} from "./chunk-DZNSJ2BA.js";
|
|
10
10
|
import {
|
|
11
11
|
log,
|
|
12
|
-
resultFromThrowable,
|
|
13
12
|
safeReadFile,
|
|
14
13
|
safeWriteFile
|
|
15
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-YQFK4U62.js";
|
|
15
|
+
import {
|
|
16
|
+
resultFromThrowable
|
|
17
|
+
} from "./chunk-6PU3XK6I.js";
|
|
16
18
|
|
|
17
19
|
// src/cli/install/2-add-server/index.ts
|
|
18
20
|
import fs2 from "fs";
|
|
@@ -259,7 +261,7 @@ var getClientConfigFile = (client) => {
|
|
|
259
261
|
configKey: "mcp_servers",
|
|
260
262
|
format: "toml" /* TOML */
|
|
261
263
|
};
|
|
262
|
-
case "opencode" /*
|
|
264
|
+
case "opencode" /* OpenCode */: {
|
|
263
265
|
const jsonPath = path2.join(
|
|
264
266
|
homeDir,
|
|
265
267
|
".config",
|
|
@@ -466,11 +468,10 @@ var tryAddServer = async (client, globalFlags, options = {}) => {
|
|
|
466
468
|
args,
|
|
467
469
|
env: {}
|
|
468
470
|
};
|
|
469
|
-
} else if (client === "opencode" /*
|
|
471
|
+
} else if (client === "opencode" /* OpenCode */) {
|
|
470
472
|
servers[serverName] = {
|
|
471
473
|
type: "local",
|
|
472
|
-
command,
|
|
473
|
-
args,
|
|
474
|
+
command: [command, ...args],
|
|
474
475
|
enabled: true,
|
|
475
476
|
environment: {}
|
|
476
477
|
};
|
|
@@ -614,4 +615,4 @@ export {
|
|
|
614
615
|
tryAddServer,
|
|
615
616
|
addServer
|
|
616
617
|
};
|
|
617
|
-
//# sourceMappingURL=chunk-
|
|
618
|
+
//# sourceMappingURL=chunk-5ELAEV2M.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/install/2-add-server/index.ts","../../src/cli/install/2-add-server/lib/client-config-file.ts","../../src/cli/install/2-add-server/lib/platforms.ts","../../src/cli/install/2-add-server/lib/file-types.ts","../../src/cli/install/2-add-server/lib/result.ts","../../src/cli/install/2-add-server/lib/nested-values.ts"],"sourcesContent":["import fs from 'fs';\n\nimport chalk from 'chalk';\n\nimport { log as clackLog, confirm, outro, stream } from '@clack/prompts';\n\nimport { safeWriteFile } from '@/shared/neverthrow/fs';\nimport { log } from '@/shared/log';\n\nimport { clientMetadata, Clients } from '../clients';\nimport {\n FileFormat,\n parseClientConfig,\n serializeClientConfig,\n stringifyObject,\n getClientConfigFile,\n getNestedValue,\n setNestedValue,\n} from './lib';\n\nimport { DIST_TAG } from '@/shared/version';\n\nimport { wait } from '@/cli/lib/wait';\n\nimport type { ClientConfigObject } from './types';\nimport type { GlobalFlags } from '@/types';\n\nexport interface AddServerSuccess {\n client: Clients;\n name: string;\n path: string;\n}\n\nexport interface AddServerFailure {\n client: Clients;\n name: string;\n path?: string;\n cause: string;\n message: string;\n}\n\ntype AddServerResult =\n | {\n success: true;\n value: AddServerSuccess;\n }\n | {\n success: false;\n error: AddServerFailure;\n };\n\ninterface AddServerOptions {\n silent?: boolean;\n}\n\nconst getMcpConfig = (globalFlags: GlobalFlags) => {\n if (globalFlags.dev) {\n return {\n serverName: 'agentcash',\n command: 'node',\n args: [`${process.cwd()}/dist/esm/index.js`, '--dev'],\n };\n }\n return {\n serverName: 'agentcash',\n command: 'npx',\n args: ['-y', `agentcash@${DIST_TAG}`],\n };\n};\n\nexport const tryAddServer = async (\n client: Clients,\n globalFlags: GlobalFlags,\n options: AddServerOptions = {}\n): Promise<AddServerResult> => {\n const { serverName, command, args } = getMcpConfig(globalFlags);\n const { name } = clientMetadata[client];\n\n if (client === Clients.Warp) {\n if (globalFlags.yes || options.silent) {\n return {\n success: false,\n error: {\n client,\n name,\n path: 'no-local-config',\n cause: 'manual_install_required',\n message: 'Warp requires a manual MCP installation through its UI',\n },\n };\n }\n\n clackLog.info(\n chalk.bold.yellow('Warp requires a manual installation through their UI.')\n );\n clackLog.message(\n 'Please copy the following configuration object and add it to your Warp MCP config:'\n );\n console.log();\n console.log(\n JSON.stringify(\n {\n [serverName]: {\n command,\n args,\n working_directory: null,\n start_on_launch: true,\n },\n },\n null,\n 2\n )\n );\n console.log();\n clackLog.message(\n `Read Warp's documentation at https://docs.warp.dev/knowledge-and-collaboration/mcp`\n );\n const addedToWarp = await confirm({\n message: 'Did you add the MCP server to your Warp config?',\n });\n if (!addedToWarp) {\n return {\n success: false,\n error: {\n client,\n name,\n path: 'no-local-config',\n cause: 'warp_mcp_server_not_added',\n message: 'Warp MCP server not added',\n },\n };\n }\n\n return {\n success: true,\n value: {\n client,\n name,\n path: 'no-local-config',\n },\n };\n }\n\n const clientFileTarget = getClientConfigFile(client);\n\n let config: ClientConfigObject = {};\n let content: string | undefined = undefined;\n\n log.info(`Checking if config file exists at: ${clientFileTarget.path}`);\n if (!fs.existsSync(clientFileTarget.path)) {\n log.info('Config file not found, creating default empty config');\n setNestedValue(config, clientFileTarget.configKey, {});\n log.info('Config created successfully');\n if (!globalFlags.yes) {\n await wait({\n startText: 'Locating config file',\n stopText: `No config found, creating default empty config`,\n ms: 1000,\n });\n }\n } else {\n log.info('Config file found, reading config file content');\n const parseResult = await parseClientConfig(clientFileTarget);\n\n if (parseResult.isErr()) {\n return {\n success: false,\n error: {\n client,\n name,\n path: clientFileTarget.path,\n cause: parseResult.error.cause,\n message: `Error reading config: ${parseResult.error.message}`,\n },\n };\n }\n\n const { config: rawConfig, fileContent } = parseResult.value;\n config = rawConfig;\n content = fileContent;\n const existingValue = getNestedValue(rawConfig, clientFileTarget.configKey);\n if (!existingValue) {\n setNestedValue(rawConfig, clientFileTarget.configKey, {});\n }\n if (!globalFlags.yes) {\n await wait({\n startText: `Locating config file`,\n stopText: `Config loaded from ${clientFileTarget.path}`,\n ms: 1000,\n });\n }\n }\n\n const servers = getNestedValue(config, clientFileTarget.configKey);\n if (!servers || typeof servers !== 'object') {\n log.error(`Invalid ${clientFileTarget.configKey} structure in config`);\n return {\n success: false,\n error: {\n client,\n name,\n path: clientFileTarget.path,\n cause: 'invalid_config',\n message: `Invalid ${clientFileTarget.configKey} structure in config`,\n },\n };\n }\n\n if (client === Clients.Goose) {\n servers[serverName] = {\n name: serverName,\n cmd: command,\n args,\n enabled: true,\n envs: {},\n type: 'stdio',\n timeout: 300,\n };\n } else if (client === Clients.Zed) {\n // Zed has a different config structure\n servers[serverName] = {\n source: 'custom',\n command,\n args,\n env: {},\n };\n } else if (client === Clients.OpenCode) {\n servers[serverName] = {\n type: 'local',\n command: [command, ...args],\n enabled: true,\n environment: {},\n };\n } else {\n servers[serverName] = {\n command,\n args,\n };\n }\n\n if (!globalFlags.yes) {\n await new Promise(resolve => setTimeout(resolve, 1000));\n\n clackLog.step(\n `The following will be added to ${chalk.bold.underline(clientFileTarget.path)}`\n );\n }\n\n const configStr = formatDiffByFormat(\n {\n [clientFileTarget.configKey]: {\n [serverName]: servers[serverName] as object,\n },\n },\n clientFileTarget.format\n );\n\n if (!globalFlags.yes) {\n await stream.message(\n (async function* () {\n for (const num of Array.from(\n { length: configStr.length },\n (_, i) => i\n )) {\n const char = configStr[num]!;\n yield char;\n if (!['\\n', ' ', '─', '╮', '╭', '╰', '╯', '│'].includes(char)) {\n await new Promise(resolve => setTimeout(resolve, 5));\n } else {\n await new Promise(resolve => setTimeout(resolve, 2));\n }\n }\n })()\n );\n\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n\n const isConfirmed = globalFlags.yes\n ? true\n : await confirm({\n message: `Would you like to proceed?`,\n active: 'Install MCP',\n inactive: 'Cancel',\n });\n if (isConfirmed !== true) {\n return {\n success: false,\n error: {\n client,\n name,\n path: clientFileTarget.path,\n cause: 'cancelled',\n message: 'Installation cancelled',\n },\n };\n }\n\n const configContent = serializeClientConfig(\n clientFileTarget,\n config,\n content\n );\n\n const writeResult = await safeWriteFile(\n 'config_file',\n clientFileTarget.path,\n configContent\n );\n\n if (writeResult.isErr()) {\n return {\n success: false,\n error: {\n client,\n name,\n path: clientFileTarget.path,\n cause: writeResult.error.cause,\n message: `Error writing config: ${writeResult.error.message}`,\n },\n };\n }\n\n if (!options.silent) {\n clackLog.success(chalk.bold.green(`Added agentcash MCP to ${name}`));\n }\n\n return {\n success: true,\n value: {\n client,\n name,\n path: clientFileTarget.path,\n },\n };\n};\n\nexport const addServer = async (client: Clients, globalFlags: GlobalFlags) => {\n const result = await tryAddServer(client, globalFlags);\n\n if (result.success) {\n return;\n }\n\n if (result.error.cause === 'cancelled') {\n outro(chalk.bold.red(result.error.message));\n process.exit(0);\n }\n\n clackLog.error(chalk.bold.red(result.error.message));\n outro(chalk.bold.red(`Error adding agentcash MCP to ${result.error.name}`));\n process.exit(1);\n};\n\nconst formatDiffByFormat = (obj: object, format: FileFormat) => {\n const str = stringifyObject(obj, format);\n switch (format) {\n case FileFormat.JSON: {\n const numLines = str.split('\\n').length;\n return str\n .split('\\n')\n .map((line, index) => {\n const diffLines = [0, 1, numLines - 2, numLines - 1];\n const isDiffLine = !diffLines.includes(index);\n if (isDiffLine) {\n return `${chalk.bold.green(`+ ${line.slice(2)}`)}`;\n }\n return line;\n })\n .join('\\n');\n }\n case FileFormat.YAML: {\n return str\n .split('\\n')\n .map((line, index) => {\n const diffLines = [0, 1, str.length - 2, str.length - 1];\n const isDiffLine = !diffLines.includes(index);\n if (isDiffLine) {\n return `${chalk.bold.green(`+ ${line.slice(2)}`)}`;\n }\n return line;\n })\n .join('\\n');\n }\n case FileFormat.TOML: {\n return str\n .split('\\n')\n .filter(line => line.trim() !== '')\n .map(line => {\n return `${chalk.bold.green(`+ ${line.trim()}`)}`;\n })\n .join('\\n');\n }\n }\n};\n","import os from 'os';\nimport path from 'path';\nimport process from 'process';\nimport fs from 'fs';\n\nimport { getPlatformPath } from './platforms';\nimport { log } from '@/shared/log';\n\nimport { Clients } from '../../clients';\n\nimport type { ClientConfigFile } from '../types';\nimport { FileFormat } from './file-types';\n\nexport const getClientConfigFile = (client: Clients): ClientConfigFile => {\n const homeDir = os.homedir();\n const { baseDir, vscodePath } = getPlatformPath();\n\n switch (client) {\n case Clients.Claude:\n return {\n path: path.join(baseDir, 'Claude', 'claude_desktop_config.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Cline:\n return {\n path: path.join(\n baseDir,\n vscodePath,\n 'globalStorage',\n 'saoudrizwan.claude-dev',\n 'settings',\n 'cline_mcp_settings.json'\n ),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.RooCline:\n return {\n path: path.join(\n baseDir,\n vscodePath,\n 'globalStorage',\n 'rooveterinaryinc.roo-cline',\n 'settings',\n 'mcp_settings.json'\n ),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Windsurf:\n return {\n path: path.join(homeDir, '.codeium', 'windsurf', 'mcp_config.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Cursor:\n return {\n path: path.join(homeDir, '.cursor', 'mcp.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Warp:\n return {\n path: 'no-local-config', // it's okay this isn't a real path, we never use it\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.GeminiCli:\n return {\n path: path.join(homeDir, '.gemini', 'settings.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Vscode:\n return {\n path: path.join(baseDir, vscodePath, 'mcp.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.ClaudeCode:\n return {\n path: path.join(homeDir, '.claude.json'),\n configKey: 'mcpServers',\n format: FileFormat.JSON,\n };\n case Clients.Goose:\n return {\n path: path.join(homeDir, '.config', 'goose', 'config.yaml'),\n configKey: 'extensions',\n format: FileFormat.YAML,\n };\n case Clients.Zed:\n return {\n path:\n process.platform === 'win32'\n ? path.join(\n process.env.APPDATA ?? path.join(homeDir, 'AppData', 'Roaming'),\n 'Zed',\n 'settings.json'\n )\n : path.join(homeDir, '.config', 'zed', 'settings.json'),\n configKey: 'context_servers',\n format: FileFormat.JSON,\n };\n case Clients.Codex:\n return {\n path: path.join(\n process.env.CODEX_HOME ?? path.join(homeDir, '.codex'),\n 'config.toml'\n ),\n configKey: 'mcp_servers',\n format: FileFormat.TOML,\n };\n case Clients.OpenCode: {\n const jsonPath = path.join(\n homeDir,\n '.config',\n 'opencode',\n 'opencode.json'\n );\n const jsoncPath = jsonPath.replace('.json', '.jsonc');\n\n // For OpenCode, check if .jsonc exists and prefer it over .json\n if (fs.existsSync(jsoncPath)) {\n log.info(`Found .jsonc file for OpenCode, using: ${jsoncPath}`);\n return {\n path: jsoncPath,\n configKey: 'mcp',\n format: FileFormat.JSON,\n };\n }\n\n return {\n path: jsonPath,\n configKey: 'mcp',\n format: FileFormat.JSON,\n };\n }\n default:\n throw new Error(`Unknown client: ${String(client)}`);\n }\n};\n","import os from 'os';\nimport path from 'path';\nimport process from 'process';\nimport z from 'zod';\n\nenum Platforms {\n Windows = 'win32',\n MacOS = 'darwin',\n Linux = 'linux',\n}\n\nexport const getPlatformPath = () => {\n const platform = z.enum(Platforms).safeParse(process.platform);\n if (!platform.success) {\n throw new Error(`Invalid platform: ${process.platform}`);\n }\n\n const homeDir = os.homedir();\n\n switch (platform.data) {\n case Platforms.Windows:\n return {\n baseDir:\n process.env.APPDATA ?? path.join(homeDir, 'AppData', 'Roaming'),\n vscodePath: path.join('Code', 'User'),\n };\n case Platforms.MacOS:\n return {\n baseDir: path.join(homeDir, 'Library', 'Application Support'),\n vscodePath: path.join('Code', 'User'),\n };\n case Platforms.Linux:\n return {\n baseDir: process.env.XDG_CONFIG_HOME ?? path.join(homeDir, '.config'),\n vscodePath: path.join('Code/User'),\n };\n default:\n throw new Error(`Invalid platform: ${process.platform}`);\n }\n};\n","import * as TOML from '@iarna/toml';\nimport yaml from 'js-yaml';\nimport * as jsonc from 'jsonc-parser';\n\nimport { safeReadFile } from '@/shared/neverthrow/fs';\nimport { configResultFromThrowable } from './result';\n\nimport type { ClientConfigFile, ClientConfigObject } from '../types';\n\nexport enum FileFormat {\n JSON = 'json',\n YAML = 'yaml',\n TOML = 'toml',\n}\n\nconst parseContent = (\n fileContent: string,\n format: FileFormat,\n path: string\n) => {\n return configResultFromThrowable(\n () => {\n let config: ClientConfigObject;\n if (format === FileFormat.YAML) {\n config = yaml.load(fileContent) as ClientConfigObject;\n } else if (format === FileFormat.TOML) {\n config = TOML.parse(fileContent) as ClientConfigObject;\n } else if (path.endsWith('.jsonc')) {\n config = jsonc.parse(fileContent) as ClientConfigObject;\n } else {\n config = JSON.parse(fileContent) as ClientConfigObject;\n }\n return {\n config,\n fileContent,\n };\n },\n e => ({\n cause: 'parse_config',\n message: e instanceof Error ? e.message : 'Failed to parse config file',\n })\n );\n};\n\n/**\n * Parse file content based on format\n */\nexport const parseClientConfig = async ({ format, path }: ClientConfigFile) => {\n const readResult = await safeReadFile('config_file', path);\n\n if (readResult.isErr()) return readResult;\n\n const parseResult = parseContent(readResult.value, format, path);\n\n if (parseResult.isErr()) return parseResult;\n\n return parseResult;\n};\n\nconst serializeJsonc = (\n config: ClientConfigObject,\n originalContent: string\n) => {\n return configResultFromThrowable<string>(\n () => {\n const modifications: jsonc.Edit[] = [];\n\n for (const key of Object.keys(config)) {\n const keyPath = [key];\n const edits = jsonc.modify(originalContent, keyPath, config[key], {\n formattingOptions: { tabSize: 2, insertSpaces: true },\n });\n modifications.push(...edits);\n }\n\n return jsonc.applyEdits(originalContent, modifications);\n },\n e => ({\n cause: 'serialize_config',\n message: e instanceof Error ? e.message : 'Failed to serialize JSONC',\n })\n );\n};\n\nexport const serializeClientConfig = (\n { format, path }: ClientConfigFile,\n config: ClientConfigObject,\n originalContent?: string\n): string => {\n if (format === FileFormat.YAML) {\n return yaml.dump(config, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\n }\n if (format === FileFormat.TOML) {\n return TOML.stringify(config);\n }\n if (path.endsWith('.jsonc') && originalContent) {\n const result = serializeJsonc(config, originalContent);\n if (result.isOk()) {\n return result.value;\n }\n // Fallback to standard JSON.stringify if edit fails\n console.log(`Error applying JSONC edits: ${result.error.message}`);\n console.log('Falling back to JSON.stringify (comments will be lost)');\n return JSON.stringify(config, null, 2);\n }\n // Default to JSON\n return JSON.stringify(config, null, 2);\n};\n\nexport const stringifyObject = (\n config: ClientConfigObject,\n format: FileFormat\n) => {\n if (format === FileFormat.YAML) {\n return yaml.dump(config, {\n indent: 2,\n lineWidth: -1,\n noRefs: true,\n });\n }\n if (format === FileFormat.TOML) {\n return TOML.stringify(config);\n }\n return JSON.stringify(config, null, 2);\n};\n","import { resultFromThrowable } from '@agentcash/neverthrow';\n\nimport type { BaseConfigError } from '../types';\n\nconst errorType = 'config';\nconst surface = 'config_file';\n\nexport const configResultFromThrowable = <T>(\n fn: () => T,\n error: (e: unknown) => BaseConfigError\n) => resultFromThrowable(errorType, surface, fn, error);\n","import type { ClientConfigObject } from '../types';\n\nexport const getNestedValue = (obj: ClientConfigObject, path: string) => {\n const keys = path.split('.');\n let current: ClientConfigObject | undefined = obj;\n for (const key of keys) {\n if (current && typeof current === 'object' && key in current) {\n current = current[key] as ClientConfigObject;\n } else {\n return undefined;\n }\n }\n return current;\n};\n\nexport const setNestedValue = (\n obj: ClientConfigObject,\n path: string,\n value: ClientConfigObject\n) => {\n const keys = path.split('.');\n const lastKey = keys.pop();\n if (!lastKey) return;\n const target = keys.reduce((current, key) => {\n current[key] ??= {};\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return current[key];\n }, obj);\n target[lastKey] = value;\n};\n"],"mappings":"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","names":["fs","os","path","process","process","Platforms","path","os","path","process","path","fs"]}
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isMppEnabled
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FBPC4LGY.js";
|
|
4
4
|
import {
|
|
5
5
|
MCP_VERSION
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-VR5I67WE.js";
|
|
7
7
|
import {
|
|
8
8
|
getBalance,
|
|
9
9
|
getBaseUrl,
|
|
10
10
|
getDepositLink,
|
|
11
11
|
getState
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-7ZEXMJYJ.js";
|
|
13
13
|
import {
|
|
14
14
|
log,
|
|
15
|
-
ok,
|
|
16
15
|
safeFetchJson
|
|
17
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-YQFK4U62.js";
|
|
17
|
+
import {
|
|
18
|
+
ok
|
|
19
|
+
} from "./chunk-6PU3XK6I.js";
|
|
18
20
|
|
|
19
21
|
// src/shared/operations/wallet-info.ts
|
|
20
22
|
import { formatUnits } from "viem";
|
|
@@ -136,4 +138,4 @@ export {
|
|
|
136
138
|
getWalletInfo,
|
|
137
139
|
submitErrorReport
|
|
138
140
|
};
|
|
139
|
-
//# sourceMappingURL=chunk-
|
|
141
|
+
//# sourceMappingURL=chunk-62B3GENJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/operations/wallet-info.ts","../../src/shared/tempo.ts","../../src/shared/tempo-balance.ts","../../src/shared/operations/onboarding-cta.ts","../../src/shared/operations/report-error.ts"],"sourcesContent":["import { formatUnits } from 'viem';\n\nimport { ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { getDepositLink } from '@/shared/utils';\nimport { TEMPO_TOKEN_ADDRESS } from '@/shared/tempo';\nimport { getTempoBalance } from '@/shared/tempo-balance';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport { log } from '@/shared/log';\nimport {\n shouldShowOnboardingCta,\n getOnboardingCta,\n type OnboardingCta,\n} from '@/shared/operations/onboarding-cta';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\ninterface ChainBalance {\n chain: string;\n balance: number;\n}\n\nexport interface WalletInfoResult {\n address: Address;\n balance: number;\n chains: ChainBalance[];\n isNewWallet: boolean;\n depositLink: string;\n onboardingCta?: OnboardingCta;\n message?: string;\n}\n\n/**\n * Get wallet info including balance and deposit link.\n * Returns summed balance across Base and Tempo, with per-chain breakdown.\n */\nexport async function getWalletInfo(\n surface: string,\n address: Address,\n flags: GlobalFlags\n) {\n const balancePromises: [\n ReturnType<typeof getBalance>,\n Promise<number | null>,\n ] = [\n getBalance({ address, surface, dev: flags.dev }),\n isMppEnabled()\n ? getTempoBalance({ address, tokenAddress: TEMPO_TOKEN_ADDRESS })\n .then(r => Number(formatUnits(r.balance, 6)))\n .catch(e => {\n log.info(`Failed to fetch Tempo balance: ${e}`);\n return null;\n })\n : Promise.resolve(null),\n ];\n\n const [balanceResult, tempoResult] = await Promise.all(balancePromises);\n\n if (balanceResult.isErr()) {\n return balanceResult;\n }\n\n const baseBalance = balanceResult.value.balance;\n const tempoBalance = tempoResult ?? 0;\n const totalBalance = baseBalance + tempoBalance;\n\n const chains: ChainBalance[] = [{ chain: 'Base', balance: baseBalance }];\n if (isMppEnabled()) {\n chains.push({ chain: 'Tempo', balance: tempoBalance });\n }\n\n return ok<WalletInfoResult>({\n address,\n balance: totalBalance,\n chains,\n isNewWallet: totalBalance === 0,\n depositLink: getDepositLink(address, flags),\n ...(shouldShowOnboardingCta()\n ? { onboardingCta: getOnboardingCta(address, flags) }\n : {}),\n ...(totalBalance < 2.5 && totalBalance > 0\n ? { message: 'Your balance is low. Consider topping it up' }\n : {}),\n });\n}\n","import type { Address } from 'viem';\n\n/** Authenticated RPC for Tempo Mainnet */\nexport const TEMPO_RPC_URL =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\n\n/** pathUSD token on Tempo Mainnet */\nexport const TEMPO_TOKEN_ADDRESS: Address =\n '0x20c0000000000000000000000000000000000000';\n","import { tempo } from 'viem/chains';\n\nimport type { Address } from 'viem';\n\nconst MPPSCAN_BASE = 'https://mppscan.com';\n\ninterface GetTempoBalanceResult {\n chainId: number;\n chainName: string;\n balance: bigint;\n tokenAddress: Address;\n}\n\nexport async function getTempoBalance({\n address,\n tokenAddress,\n}: {\n address: Address;\n tokenAddress: Address;\n}): Promise<GetTempoBalanceResult> {\n const url = `${MPPSCAN_BASE}/api/balance/${address}`;\n\n const res = await fetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n\n if (!res.ok) {\n throw new Error(`mppscan balance request failed: ${res.status}`);\n }\n\n const data = (await res.json()) as { balance: string };\n\n return {\n chainId: tempo.id,\n chainName: tempo.name,\n balance: BigInt(data.balance),\n tokenAddress,\n };\n}\n","import { getState } from '@/shared/state';\nimport { getBaseUrl, getDepositLink } from '@/shared/utils';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\nexport interface OnboardingCta {\n onboardLink: string;\n depositLink: string;\n message: string;\n}\n\nexport function shouldShowOnboardingCta(): boolean {\n return (getState().redeemedCodes?.length ?? 0) === 0;\n}\n\nexport function getOnboardingCta(\n address: Address,\n flags: GlobalFlags\n): OnboardingCta {\n const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;\n const depositLink = getDepositLink(address, flags);\n\n return {\n onboardLink,\n depositLink,\n message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`,\n };\n}\n","import { z } from 'zod';\nimport { ok } from '@agentcash/neverthrow';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { getBaseUrl } from '@/shared/utils';\nimport { MCP_VERSION } from '@/shared/version';\n\nimport type { Address } from 'viem';\n\n/**\n * Error report input\n */\ninterface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\n/**\n * Error report result\n */\nexport interface ErrorReportResult {\n submitted: true;\n reportId: string;\n message: string;\n}\n\n/**\n * Submit an error report to agentcash telemetry.\n */\nexport async function submitErrorReport(\n surface: string,\n input: ErrorReportInput,\n address: Address,\n dev: boolean\n) {\n const telemetryResult = await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(dev)}/api/telemetry`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n tool: input.tool,\n summary: input.summary,\n errorMessage: input.errorMessage,\n resource: input.resource,\n stack: input.stack,\n fullReport: input.fullReport,\n walletAddress: address,\n mcpVersion: MCP_VERSION,\n reportedAt: new Date().toISOString(),\n }),\n }),\n z.object({\n reportId: z.string(),\n })\n );\n\n if (telemetryResult.isErr()) {\n return telemetryResult;\n }\n\n const { reportId } = telemetryResult.value;\n\n return ok<ErrorReportResult>({\n submitted: true,\n reportId,\n message:\n 'Error report submitted successfully. The agentcash team will investigate.',\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/shared/operations/wallet-info.ts","../../src/shared/tempo.ts","../../src/shared/tempo-balance.ts","../../src/shared/operations/onboarding-cta.ts","../../src/shared/operations/report-error.ts"],"sourcesContent":["import { formatUnits } from 'viem';\n\nimport { ok } from '@agentcash/neverthrow';\n\nimport { getBalance } from '@/shared/balance';\nimport { getDepositLink } from '@/shared/utils';\nimport { TEMPO_TOKEN_ADDRESS } from '@/shared/tempo';\nimport { getTempoBalance } from '@/shared/tempo-balance';\nimport { isMppEnabled } from '@/shared/mpp-enabled';\nimport { log } from '@/shared/log';\nimport {\n shouldShowOnboardingCta,\n getOnboardingCta,\n type OnboardingCta,\n} from '@/shared/operations/onboarding-cta';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\ninterface ChainBalance {\n chain: string;\n balance: number;\n}\n\nexport interface WalletInfoResult {\n address: Address;\n balance: number;\n chains: ChainBalance[];\n isNewWallet: boolean;\n depositLink: string;\n onboardingCta?: OnboardingCta;\n message?: string;\n}\n\n/**\n * Get wallet info including balance and deposit link.\n * Returns summed balance across Base and Tempo, with per-chain breakdown.\n */\nexport async function getWalletInfo(\n surface: string,\n address: Address,\n flags: GlobalFlags\n) {\n const balancePromises: [\n ReturnType<typeof getBalance>,\n Promise<number | null>,\n ] = [\n getBalance({ address, surface, dev: flags.dev }),\n isMppEnabled()\n ? getTempoBalance({ address, tokenAddress: TEMPO_TOKEN_ADDRESS })\n .then(r => Number(formatUnits(r.balance, 6)))\n .catch(e => {\n log.info(`Failed to fetch Tempo balance: ${e}`);\n return null;\n })\n : Promise.resolve(null),\n ];\n\n const [balanceResult, tempoResult] = await Promise.all(balancePromises);\n\n if (balanceResult.isErr()) {\n return balanceResult;\n }\n\n const baseBalance = balanceResult.value.balance;\n const tempoBalance = tempoResult ?? 0;\n const totalBalance = baseBalance + tempoBalance;\n\n const chains: ChainBalance[] = [{ chain: 'Base', balance: baseBalance }];\n if (isMppEnabled()) {\n chains.push({ chain: 'Tempo', balance: tempoBalance });\n }\n\n return ok<WalletInfoResult>({\n address,\n balance: totalBalance,\n chains,\n isNewWallet: totalBalance === 0,\n depositLink: getDepositLink(address, flags),\n ...(shouldShowOnboardingCta()\n ? { onboardingCta: getOnboardingCta(address, flags) }\n : {}),\n ...(totalBalance < 2.5 && totalBalance > 0\n ? { message: 'Your balance is low. Consider topping it up' }\n : {}),\n });\n}\n","import type { Address } from 'viem';\n\n/** Authenticated RPC for Tempo Mainnet */\nexport const TEMPO_RPC_URL =\n 'https://eng:acard-melody-fashion-finish@rpc.mainnet.tempo.xyz';\n\n/** pathUSD token on Tempo Mainnet */\nexport const TEMPO_TOKEN_ADDRESS: Address =\n '0x20c0000000000000000000000000000000000000';\n","import { tempo } from 'viem/chains';\n\nimport type { Address } from 'viem';\n\nconst MPPSCAN_BASE = 'https://mppscan.com';\n\ninterface GetTempoBalanceResult {\n chainId: number;\n chainName: string;\n balance: bigint;\n tokenAddress: Address;\n}\n\nexport async function getTempoBalance({\n address,\n tokenAddress,\n}: {\n address: Address;\n tokenAddress: Address;\n}): Promise<GetTempoBalanceResult> {\n const url = `${MPPSCAN_BASE}/api/balance/${address}`;\n\n const res = await fetch(url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n\n if (!res.ok) {\n throw new Error(`mppscan balance request failed: ${res.status}`);\n }\n\n const data = (await res.json()) as { balance: string };\n\n return {\n chainId: tempo.id,\n chainName: tempo.name,\n balance: BigInt(data.balance),\n tokenAddress,\n };\n}\n","import { getState } from '@/shared/state';\nimport { getBaseUrl, getDepositLink } from '@/shared/utils';\n\nimport type { GlobalFlags } from '@/types';\nimport type { Address } from 'viem';\n\nexport interface OnboardingCta {\n onboardLink: string;\n depositLink: string;\n message: string;\n}\n\nexport function shouldShowOnboardingCta(): boolean {\n return (getState().redeemedCodes?.length ?? 0) === 0;\n}\n\nexport function getOnboardingCta(\n address: Address,\n flags: GlobalFlags\n): OnboardingCta {\n const onboardLink = `${getBaseUrl(flags.dev)}/onboard`;\n const depositLink = getDepositLink(address, flags);\n\n return {\n onboardLink,\n depositLink,\n message: `Welcome to AgentCash. To get started, complete onboarding at ${onboardLink} and receive your reward. If you've already onboarded, deposit at ${depositLink} to fund your wallet.`,\n };\n}\n","import { z } from 'zod';\nimport { ok } from '@agentcash/neverthrow';\n\nimport { safeFetchJson } from '@/shared/neverthrow/fetch';\nimport { getBaseUrl } from '@/shared/utils';\nimport { MCP_VERSION } from '@/shared/version';\n\nimport type { Address } from 'viem';\n\n/**\n * Error report input\n */\ninterface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: string;\n}\n\n/**\n * Error report result\n */\nexport interface ErrorReportResult {\n submitted: true;\n reportId: string;\n message: string;\n}\n\n/**\n * Submit an error report to agentcash telemetry.\n */\nexport async function submitErrorReport(\n surface: string,\n input: ErrorReportInput,\n address: Address,\n dev: boolean\n) {\n const telemetryResult = await safeFetchJson(\n surface,\n new Request(`${getBaseUrl(dev)}/api/telemetry`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n tool: input.tool,\n summary: input.summary,\n errorMessage: input.errorMessage,\n resource: input.resource,\n stack: input.stack,\n fullReport: input.fullReport,\n walletAddress: address,\n mcpVersion: MCP_VERSION,\n reportedAt: new Date().toISOString(),\n }),\n }),\n z.object({\n reportId: z.string(),\n })\n );\n\n if (telemetryResult.isErr()) {\n return telemetryResult;\n }\n\n const { reportId } = telemetryResult.value;\n\n return ok<ErrorReportResult>({\n submitted: true,\n reportId,\n message:\n 'Error report submitted successfully. The agentcash team will investigate.',\n });\n}\n"],"mappings":"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","names":[]}
|