agentcash 0.13.8 → 0.14.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/dist/cjs/run-server.cjs +76 -19
- package/dist/esm/{add-skill-5O3R2PAD.js → add-skill-JHBOH5SG.js} +4 -3
- package/dist/esm/{add-skill-5O3R2PAD.js.map → add-skill-JHBOH5SG.js.map} +1 -1
- package/dist/esm/{bridge-3T5NWKDE.js → bridge-YU2PE54M.js} +4 -3
- package/dist/esm/{bridge-3T5NWKDE.js.map → bridge-YU2PE54M.js.map} +1 -1
- package/dist/esm/{chunk-THSTTUNV.js → chunk-6I5J7IHC.js} +2 -2
- package/dist/esm/{chunk-DBP743M5.js → chunk-7ZLVTQTS.js} +24 -6
- package/dist/esm/chunk-7ZLVTQTS.js.map +1 -0
- package/dist/esm/{chunk-QCP7Q6UF.js → chunk-BFOYXXLG.js} +2 -27
- package/dist/esm/chunk-BFOYXXLG.js.map +1 -0
- package/dist/esm/{chunk-54KBJ4F6.js → chunk-BNFMFAEF.js} +5 -5
- package/dist/esm/{chunk-UNG335FG.js → chunk-E52LAD7Z.js} +6 -4
- package/dist/esm/{chunk-UNG335FG.js.map → chunk-E52LAD7Z.js.map} +1 -1
- package/dist/esm/{chunk-2NMSPXMD.js → chunk-G5FHPXQL.js} +9 -7
- package/dist/esm/{chunk-2NMSPXMD.js.map → chunk-G5FHPXQL.js.map} +1 -1
- package/dist/esm/{chunk-NQ7OJNSO.js → chunk-KJCWPVQE.js} +5 -3
- package/dist/esm/{chunk-NQ7OJNSO.js.map → chunk-KJCWPVQE.js.map} +1 -1
- package/dist/esm/{chunk-CWU2QWNS.js → chunk-MSNAPI5G.js} +5 -3
- package/dist/esm/{chunk-CWU2QWNS.js.map → chunk-MSNAPI5G.js.map} +1 -1
- package/dist/esm/chunk-U6FRXL3X.js +28 -0
- package/dist/esm/chunk-U6FRXL3X.js.map +1 -0
- package/dist/esm/{chunk-OJGYNAKF.js → chunk-UCADMHNP.js} +2 -2
- package/dist/esm/{chunk-PZNRMIWW.js → chunk-V3HBA7NZ.js} +3 -3
- package/dist/esm/{chunk-TCXITLKU.js → chunk-XC5JT2NQ.js} +2 -2
- package/dist/esm/chunk-Y2J274RB.js +109 -0
- package/dist/esm/chunk-Y2J274RB.js.map +1 -0
- package/dist/esm/{chunk-FYEDHLYF.js → chunk-Y4BYJBYU.js} +5 -3
- package/dist/esm/{chunk-FYEDHLYF.js.map → chunk-Y4BYJBYU.js.map} +1 -1
- package/dist/esm/{chunk-63TCLGO6.js → chunk-YUPRVVFP.js} +6 -6
- package/dist/esm/{discover-PMVCPMAP.js → discover-654M2PZ3.js} +4 -3
- package/dist/esm/discover-654M2PZ3.js.map +1 -0
- package/dist/esm/{fetch-WACX4GKY.js → fetch-GPYZNSPB.js} +5 -4
- package/dist/esm/{fetch-WACX4GKY.js.map → fetch-GPYZNSPB.js.map} +1 -1
- package/dist/esm/{fund-QLGZGIUE.js → fund-HHL4QEU5.js} +5 -4
- package/dist/esm/{fund-QLGZGIUE.js.map → fund-HHL4QEU5.js.map} +1 -1
- package/dist/esm/index.js +24 -24
- package/dist/esm/{install-KTU4GOMT.js → install-D2IVOSIS.js} +8 -7
- package/dist/esm/{install-KTU4GOMT.js.map → install-D2IVOSIS.js.map} +1 -1
- package/dist/esm/{onboard-YNZPSS34.js → onboard-5SZ6ZCM5.js} +11 -10
- package/dist/esm/{onboard-YNZPSS34.js.map → onboard-5SZ6ZCM5.js.map} +1 -1
- package/dist/esm/{origins-UCEONL2Q.js → origins-JAC2K5A4.js} +4 -3
- package/dist/esm/{origins-UCEONL2Q.js.map → origins-JAC2K5A4.js.map} +1 -1
- package/dist/esm/{register-UN5RG5QY.js → register-AD43YD5O.js} +5 -4
- package/dist/esm/{register-UN5RG5QY.js.map → register-AD43YD5O.js.map} +1 -1
- package/dist/esm/{report-error-PIRP6TAE.js → report-error-V2J7LNUZ.js} +5 -4
- package/dist/esm/{report-error-PIRP6TAE.js.map → report-error-V2J7LNUZ.js.map} +1 -1
- package/dist/esm/{search-FDAGE4G3.js → search-WV2FO7OG.js} +6 -5
- package/dist/esm/{search-FDAGE4G3.js.map → search-WV2FO7OG.js.map} +1 -1
- package/dist/esm/{server-RHNWYLER.js → server-ADTFQX5M.js} +20 -16
- package/dist/esm/server-ADTFQX5M.js.map +1 -0
- package/dist/esm/{server-PEG4DEHG.js → server-RHVPZZ4R.js} +2 -2
- package/dist/esm/{try-2JMNINOB.js → try-36SR5JEG.js} +7 -6
- package/dist/esm/try-36SR5JEG.js.map +1 -0
- package/dist/esm/{wallet-IWRIAD6V.js → wallet-QOS3FPSF.js} +7 -6
- package/dist/esm/{wallet-IWRIAD6V.js.map → wallet-QOS3FPSF.js.map} +1 -1
- package/package.json +3 -3
- package/dist/esm/chunk-CR6PFCYR.js +0 -49
- package/dist/esm/chunk-CR6PFCYR.js.map +0 -1
- package/dist/esm/chunk-DBP743M5.js.map +0 -1
- package/dist/esm/chunk-QCP7Q6UF.js.map +0 -1
- package/dist/esm/discover-PMVCPMAP.js.map +0 -1
- package/dist/esm/server-RHNWYLER.js.map +0 -1
- package/dist/esm/try-2JMNINOB.js.map +0 -1
- /package/dist/esm/{chunk-THSTTUNV.js.map → chunk-6I5J7IHC.js.map} +0 -0
- /package/dist/esm/{chunk-54KBJ4F6.js.map → chunk-BNFMFAEF.js.map} +0 -0
- /package/dist/esm/{chunk-OJGYNAKF.js.map → chunk-UCADMHNP.js.map} +0 -0
- /package/dist/esm/{chunk-PZNRMIWW.js.map → chunk-V3HBA7NZ.js.map} +0 -0
- /package/dist/esm/{chunk-TCXITLKU.js.map → chunk-XC5JT2NQ.js.map} +0 -0
- /package/dist/esm/{chunk-63TCLGO6.js.map → chunk-YUPRVVFP.js.map} +0 -0
- /package/dist/esm/{server-PEG4DEHG.js.map → server-RHVPZZ4R.js.map} +0 -0
package/dist/cjs/run-server.cjs
CHANGED
|
@@ -162325,7 +162325,7 @@ var import_path2 = require("path");
|
|
|
162325
162325
|
var import_url2 = require("url");
|
|
162326
162326
|
function getVersion3() {
|
|
162327
162327
|
if (true) {
|
|
162328
|
-
return "0.
|
|
162328
|
+
return "0.14.0";
|
|
162329
162329
|
}
|
|
162330
162330
|
const __dirname2 = (0, import_path2.dirname)((0, import_url2.fileURLToPath)(importMetaUrl));
|
|
162331
162331
|
const pkg2 = JSON.parse(
|
|
@@ -162448,7 +162448,7 @@ var discoverResourcesSchema = zod_default.object({
|
|
|
162448
162448
|
url: zodUrl.describe(TOOL_PARAMS.discoverApiEndpoints.url),
|
|
162449
162449
|
includeGuidance: zod_default.boolean().optional().describe(TOOL_PARAMS.discoverApiEndpoints.includeGuidance)
|
|
162450
162450
|
});
|
|
162451
|
-
async function discoverResources(surface, args) {
|
|
162451
|
+
async function discoverResources(surface, args, options) {
|
|
162452
162452
|
const parsedArgs = discoverResourcesSchema.safeParse(args);
|
|
162453
162453
|
if (!parsedArgs.success) {
|
|
162454
162454
|
return {
|
|
@@ -162460,25 +162460,82 @@ async function discoverResources(surface, args) {
|
|
|
162460
162460
|
const { url: url5, includeGuidance } = parsedArgs.data;
|
|
162461
162461
|
const guidance = includeGuidance === true ? GuidanceMode.Always : includeGuidance === false ? GuidanceMode.Never : GuidanceMode.Auto;
|
|
162462
162462
|
const result = await discoverOriginSchema({ target: url5, guidance });
|
|
162463
|
-
if (
|
|
162464
|
-
|
|
162465
|
-
|
|
162466
|
-
|
|
162467
|
-
|
|
162468
|
-
message: result.message
|
|
162469
|
-
});
|
|
162470
|
-
return result;
|
|
162463
|
+
if (result.found) {
|
|
162464
|
+
return {
|
|
162465
|
+
...result,
|
|
162466
|
+
endpoints: result.endpoints.map((e5) => ({ ...e5 }))
|
|
162467
|
+
};
|
|
162471
162468
|
}
|
|
162472
|
-
|
|
162473
|
-
|
|
162474
|
-
|
|
162475
|
-
|
|
162469
|
+
const scanResult = await fetchScanEndpoints(
|
|
162470
|
+
url5,
|
|
162471
|
+
options?.flags?.dev ?? false
|
|
162472
|
+
);
|
|
162473
|
+
if (scanResult) {
|
|
162474
|
+
log.info(
|
|
162475
|
+
`[discoverResources] scan fallback found ${scanResult.endpoints.length} endpoints for ${url5}`
|
|
162476
|
+
);
|
|
162477
|
+
return scanResult;
|
|
162478
|
+
}
|
|
162479
|
+
log.error(`[discoverResources] failed`, {
|
|
162480
|
+
surface,
|
|
162481
|
+
url: url5,
|
|
162482
|
+
cause: result.cause,
|
|
162483
|
+
message: result.message
|
|
162484
|
+
});
|
|
162485
|
+
return result;
|
|
162486
|
+
}
|
|
162487
|
+
var scanEndpointSchema = zod_default.object({
|
|
162488
|
+
method: zod_default.string(),
|
|
162489
|
+
path: zod_default.string(),
|
|
162490
|
+
summary: zod_default.string().optional().default(""),
|
|
162491
|
+
authMode: zod_default.string().optional(),
|
|
162492
|
+
price: zod_default.string().optional()
|
|
162493
|
+
});
|
|
162494
|
+
var scanResponseSchema = zod_default.object({
|
|
162495
|
+
origin: zod_default.string(),
|
|
162496
|
+
title: zod_default.string().optional().default(""),
|
|
162497
|
+
description: zod_default.string().optional().default(""),
|
|
162498
|
+
endpoints: zod_default.array(scanEndpointSchema)
|
|
162499
|
+
});
|
|
162500
|
+
async function fetchScanEndpoints(origin2, dev) {
|
|
162501
|
+
const baseUrl = getBaseUrl(dev);
|
|
162502
|
+
const url5 = `${baseUrl}/api/discover/scan?origin=${encodeURIComponent(origin2)}`;
|
|
162503
|
+
return fetch(url5, {
|
|
162504
|
+
signal: AbortSignal.timeout(5e3)
|
|
162505
|
+
}).then(async (res) => {
|
|
162506
|
+
if (!res.ok) return null;
|
|
162507
|
+
const data = scanResponseSchema.safeParse(await res.json());
|
|
162508
|
+
if (!data.success || data.data.endpoints.length === 0) return null;
|
|
162509
|
+
return {
|
|
162510
|
+
found: true,
|
|
162511
|
+
origin: data.data.origin,
|
|
162512
|
+
source: "scan",
|
|
162513
|
+
info: {
|
|
162514
|
+
title: data.data.title,
|
|
162515
|
+
description: data.data.description
|
|
162516
|
+
},
|
|
162517
|
+
endpoints: data.data.endpoints.map((e5) => ({
|
|
162518
|
+
path: e5.path,
|
|
162519
|
+
method: (e5.method || "GET").toUpperCase(),
|
|
162520
|
+
summary: e5.summary,
|
|
162521
|
+
authMode: e5.authMode ?? void 0,
|
|
162522
|
+
protocols: ["x402"],
|
|
162523
|
+
price: e5.price
|
|
162524
|
+
})),
|
|
162525
|
+
guidanceAvailable: false,
|
|
162526
|
+
guidanceTokens: 0,
|
|
162527
|
+
guidance: void 0
|
|
162528
|
+
};
|
|
162529
|
+
}).catch(() => null);
|
|
162476
162530
|
}
|
|
162477
162531
|
|
|
162478
162532
|
// src/server/tools/discover-resources.ts
|
|
162479
162533
|
var toolName3 = "discover_api_endpoints";
|
|
162480
162534
|
var OPENAPI_TRIED_PATHS = "/openapi.json, /.well-known/x402";
|
|
162481
|
-
|
|
162535
|
+
var registerDiscoveryTools = ({
|
|
162536
|
+
server,
|
|
162537
|
+
flags
|
|
162538
|
+
}) => {
|
|
162482
162539
|
server.registerTool(
|
|
162483
162540
|
toolName3,
|
|
162484
162541
|
{
|
|
@@ -162497,7 +162554,7 @@ function registerDiscoveryTools(server) {
|
|
|
162497
162554
|
const discoverResult = await resultFromPromise(
|
|
162498
162555
|
"discover",
|
|
162499
162556
|
toolName3,
|
|
162500
|
-
discoverResources(toolName3, args),
|
|
162557
|
+
discoverResources(toolName3, args, { flags }),
|
|
162501
162558
|
(e5) => ({
|
|
162502
162559
|
cause: "discover",
|
|
162503
162560
|
message: e5 instanceof Error ? e5.message : String(e5)
|
|
@@ -162525,7 +162582,7 @@ function registerDiscoveryTools(server) {
|
|
|
162525
162582
|
});
|
|
162526
162583
|
})
|
|
162527
162584
|
);
|
|
162528
|
-
}
|
|
162585
|
+
};
|
|
162529
162586
|
var hintMap = {
|
|
162530
162587
|
timeout: "The server may be slow or unreachable. Try again later.",
|
|
162531
162588
|
network: "Could not reach the server. Check the network connection and try again.",
|
|
@@ -169792,7 +169849,7 @@ var import_path3 = require("path");
|
|
|
169792
169849
|
var import_url5 = require("url");
|
|
169793
169850
|
function getVersion4() {
|
|
169794
169851
|
if (true) {
|
|
169795
|
-
return "0.
|
|
169852
|
+
return "0.14.0";
|
|
169796
169853
|
}
|
|
169797
169854
|
const __dirname2 = (0, import_path3.dirname)((0, import_url5.fileURLToPath)(importMetaUrl));
|
|
169798
169855
|
const pkg2 = JSON.parse(
|
|
@@ -170181,7 +170238,7 @@ var startServer = async (flags) => {
|
|
|
170181
170238
|
registerWalletTools(props);
|
|
170182
170239
|
registerCheckEndpointTool(props);
|
|
170183
170240
|
registerRedeemInviteTool(props);
|
|
170184
|
-
registerDiscoveryTools(
|
|
170241
|
+
registerDiscoveryTools(props);
|
|
170185
170242
|
registerTelemetryTools(props);
|
|
170186
170243
|
registerSettingsTools(props);
|
|
170187
170244
|
registerBridgeTool(props);
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveOrigin
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-6I5J7IHC.js";
|
|
4
4
|
import {
|
|
5
5
|
installSkills
|
|
6
6
|
} from "./chunk-FVVSNDQR.js";
|
|
7
7
|
import {
|
|
8
8
|
addUserOrigin
|
|
9
9
|
} from "./chunk-YIU364NZ.js";
|
|
10
|
-
import "./chunk-
|
|
10
|
+
import "./chunk-Y2J274RB.js";
|
|
11
11
|
import "./chunk-CR2YGI3I.js";
|
|
12
12
|
import "./chunk-KVSTJRSJ.js";
|
|
13
13
|
import "./chunk-FB5CMO3J.js";
|
|
14
|
+
import "./chunk-U6FRXL3X.js";
|
|
14
15
|
import {
|
|
15
16
|
errorResponse,
|
|
16
17
|
outputAndExit,
|
|
@@ -96,4 +97,4 @@ var addSkillCommand = async (input) => {
|
|
|
96
97
|
export {
|
|
97
98
|
addSkillCommand
|
|
98
99
|
};
|
|
99
|
-
//# sourceMappingURL=add-skill-
|
|
100
|
+
//# sourceMappingURL=add-skill-JHBOH5SG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shared/skills/origin.ts","../../src/cli/commands/add-skill.ts"],"sourcesContent":["import * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport {\n safeMkdir,\n safeMkdtemp,\n safeRm,\n safeWriteFile,\n} from '@/shared/neverthrow/fs';\nimport { installSkills } from '@/shared/skills/core/install';\n\nimport type { InstallSkillsOptions } from './core/install';\nimport type { ResolvedOrigin } from '@/cli/lib/resolve-origin';\n\nexport async function addOriginSkill(\n origin: ResolvedOrigin,\n surface: string,\n options?: InstallSkillsOptions\n) {\n const tmpDirResult = await safeMkdtemp(\n surface,\n path.join(os.tmpdir(), 'agentcash-skill-add')\n );\n if (tmpDirResult.isErr()) {\n return tmpDirResult;\n }\n\n const tmpDir = tmpDirResult.value;\n\n const skillDir = path.join(tmpDir, originSkillTitle(origin));\n const mkdirResult = await safeMkdir(surface, skillDir, { recursive: true });\n\n if (mkdirResult.isErr()) {\n return mkdirResult;\n }\n\n const writeResult = await safeWriteFile(\n surface,\n path.join(skillDir, 'SKILL.md'),\n originSkillContent(origin)\n );\n\n if (writeResult.isErr()) {\n await safeRm(surface, tmpDir, { recursive: true, force: true });\n return writeResult;\n }\n\n const result = await installSkills(skillDir, options);\n\n await safeRm(surface, tmpDir, { recursive: true, force: true });\n\n return result;\n}\n\nconst originSkillTitle = (origin: ResolvedOrigin) =>\n origin.title.toLowerCase().replace(/[ .]/g, '-');\n\nconst originSkillContent = (origin: ResolvedOrigin) => `---\nname: ${originSkillTitle(origin)}\ndescription: ${origin.description}\ncommand: npx agentcash discover ${origin.url}\n---\nCall \\`npx agentcash discover ${origin.url}\\` to discover how to use ${origin.title}.`;\n","import { successResponse, outputAndExit, errorResponse } from '@/cli/output';\nimport { addUserOrigin } from '@/shared/user-origins';\n\nimport { resolveOrigin } from '../lib/resolve-origin';\nimport { addOriginSkill } from '@/shared/skills/origin';\n\nimport type { Command } from '@/types';\nimport type { DiscoverResourcesInput } from '@/operations/discover';\n\nconst SURFACE = 'cli:add-skill';\n\nexport const addSkillCommand: Command<DiscoverResourcesInput> = async input => {\n const resolved = await resolveOrigin(SURFACE, input);\n if (!resolved.ok) return outputAndExit(resolved.error, input);\n\n const { origin } = resolved;\n addUserOrigin(origin);\n\n const skillResult = await addOriginSkill(origin, SURFACE);\n\n if (!skillResult.isOk()) {\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: skillResult.error.message,\n surface: SURFACE,\n cause: 'skill_install_failed',\n }),\n input\n );\n }\n\n return outputAndExit(\n successResponse({\n ...origin,\n installed: skillResult.value.path,\n linkedAgents: skillResult.value.agents,\n note: 'Restart your MCP server for this origin to appear in the model context.',\n }),\n input\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/shared/skills/origin.ts","../../src/cli/commands/add-skill.ts"],"sourcesContent":["import * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport {\n safeMkdir,\n safeMkdtemp,\n safeRm,\n safeWriteFile,\n} from '@/shared/neverthrow/fs';\nimport { installSkills } from '@/shared/skills/core/install';\n\nimport type { InstallSkillsOptions } from './core/install';\nimport type { ResolvedOrigin } from '@/cli/lib/resolve-origin';\n\nexport async function addOriginSkill(\n origin: ResolvedOrigin,\n surface: string,\n options?: InstallSkillsOptions\n) {\n const tmpDirResult = await safeMkdtemp(\n surface,\n path.join(os.tmpdir(), 'agentcash-skill-add')\n );\n if (tmpDirResult.isErr()) {\n return tmpDirResult;\n }\n\n const tmpDir = tmpDirResult.value;\n\n const skillDir = path.join(tmpDir, originSkillTitle(origin));\n const mkdirResult = await safeMkdir(surface, skillDir, { recursive: true });\n\n if (mkdirResult.isErr()) {\n return mkdirResult;\n }\n\n const writeResult = await safeWriteFile(\n surface,\n path.join(skillDir, 'SKILL.md'),\n originSkillContent(origin)\n );\n\n if (writeResult.isErr()) {\n await safeRm(surface, tmpDir, { recursive: true, force: true });\n return writeResult;\n }\n\n const result = await installSkills(skillDir, options);\n\n await safeRm(surface, tmpDir, { recursive: true, force: true });\n\n return result;\n}\n\nconst originSkillTitle = (origin: ResolvedOrigin) =>\n origin.title.toLowerCase().replace(/[ .]/g, '-');\n\nconst originSkillContent = (origin: ResolvedOrigin) => `---\nname: ${originSkillTitle(origin)}\ndescription: ${origin.description}\ncommand: npx agentcash discover ${origin.url}\n---\nCall \\`npx agentcash discover ${origin.url}\\` to discover how to use ${origin.title}.`;\n","import { successResponse, outputAndExit, errorResponse } from '@/cli/output';\nimport { addUserOrigin } from '@/shared/user-origins';\n\nimport { resolveOrigin } from '../lib/resolve-origin';\nimport { addOriginSkill } from '@/shared/skills/origin';\n\nimport type { Command } from '@/types';\nimport type { DiscoverResourcesInput } from '@/operations/discover';\n\nconst SURFACE = 'cli:add-skill';\n\nexport const addSkillCommand: Command<DiscoverResourcesInput> = async input => {\n const resolved = await resolveOrigin(SURFACE, input);\n if (!resolved.ok) return outputAndExit(resolved.error, input);\n\n const { origin } = resolved;\n addUserOrigin(origin);\n\n const skillResult = await addOriginSkill(origin, SURFACE);\n\n if (!skillResult.isOk()) {\n return outputAndExit(\n errorResponse({\n code: 'GENERAL_ERROR',\n message: skillResult.error.message,\n surface: SURFACE,\n cause: 'skill_install_failed',\n }),\n input\n );\n }\n\n return outputAndExit(\n successResponse({\n ...origin,\n installed: skillResult.value.path,\n linkedAgents: skillResult.value.agents,\n note: 'Restart your MCP server for this origin to appear in the model context.',\n }),\n input\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AAatB,eAAsB,eACpB,QACA,SACA,SACA;AACA,QAAM,eAAe,MAAM;AAAA,IACzB;AAAA,IACK,UAAQ,UAAO,GAAG,qBAAqB;AAAA,EAC9C;AACA,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,aAAa;AAE5B,QAAM,WAAgB,UAAK,QAAQ,iBAAiB,MAAM,CAAC;AAC3D,QAAM,cAAc,MAAM,UAAU,SAAS,UAAU,EAAE,WAAW,KAAK,CAAC;AAE1E,MAAI,YAAY,MAAM,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACK,UAAK,UAAU,UAAU;AAAA,IAC9B,mBAAmB,MAAM;AAAA,EAC3B;AAEA,MAAI,YAAY,MAAM,GAAG;AACvB,UAAM,OAAO,SAAS,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC9D,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,cAAc,UAAU,OAAO;AAEpD,QAAM,OAAO,SAAS,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAE9D,SAAO;AACT;AAEA,IAAM,mBAAmB,CAAC,WACxB,OAAO,MAAM,YAAY,EAAE,QAAQ,SAAS,GAAG;AAEjD,IAAM,qBAAqB,CAAC,WAA2B;AAAA,QAC/C,iBAAiB,MAAM,CAAC;AAAA,eACjB,OAAO,WAAW;AAAA,kCACC,OAAO,GAAG;AAAA;AAAA,gCAEZ,OAAO,GAAG,6BAA6B,OAAO,KAAK;;;ACrDnF,IAAM,UAAU;AAET,IAAM,kBAAmD,OAAM,UAAS;AAC7E,QAAM,WAAW,MAAM,cAAc,SAAS,KAAK;AACnD,MAAI,CAAC,SAAS,GAAI,QAAO,cAAc,SAAS,OAAO,KAAK;AAE5D,QAAM,EAAE,OAAO,IAAI;AACnB,gBAAc,MAAM;AAEpB,QAAM,cAAc,MAAM,eAAe,QAAQ,OAAO;AAExD,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,WAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,YAAY,MAAM;AAAA,QAC3B,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,MACd,GAAG;AAAA,MACH,WAAW,YAAY,MAAM;AAAA,MAC7B,cAAc,YAAY,MAAM;AAAA,MAChC,MAAM;AAAA,IACR,CAAC;AAAA,IACD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
bridge,
|
|
3
3
|
bridgeSchema
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-Y4BYJBYU.js";
|
|
5
5
|
import {
|
|
6
6
|
DESCRIPTIONS
|
|
7
7
|
} from "./chunk-CR2YGI3I.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-BFOYXXLG.js";
|
|
9
9
|
import {
|
|
10
10
|
getWalletOrExit
|
|
11
11
|
} from "./chunk-7AT3NXJ2.js";
|
|
12
12
|
import "./chunk-F3KGAMIA.js";
|
|
13
13
|
import "./chunk-NPJV7AMV.js";
|
|
14
14
|
import "./chunk-KVSTJRSJ.js";
|
|
15
|
+
import "./chunk-U6FRXL3X.js";
|
|
15
16
|
import {
|
|
16
17
|
errorResponse,
|
|
17
18
|
fromNeverthrowError,
|
|
@@ -53,4 +54,4 @@ var bridgeCommand = async (args) => {
|
|
|
53
54
|
export {
|
|
54
55
|
bridgeCommand
|
|
55
56
|
};
|
|
56
|
-
//# sourceMappingURL=bridge-
|
|
57
|
+
//# sourceMappingURL=bridge-YU2PE54M.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/commands/bridge.ts"],"sourcesContent":["import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n errorResponse,\n} from '@/cli/output';\n\nimport { bridge, bridgeSchema, type BridgeInput } from '@/operations/bridge';\nimport { DESCRIPTIONS } from '@/shared/descriptions';\nimport type { Command } from '@/types';\nimport { getWalletOrExit } from '../lib/get-wallet-or-exit';\n\nconst SURFACE = `cli:${DESCRIPTIONS.bridge.toolNames.cli}`;\n\nexport const bridgeCommand: Command<BridgeInput> = async args => {\n const wallets = await getWalletOrExit(args);\n\n const parsedArgs = bridgeSchema.safeParse(args);\n\n if (!parsedArgs.success) {\n return outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: parsedArgs.error.message,\n surface: SURFACE,\n cause: 'validation',\n }),\n args\n );\n }\n\n const bridgeResult = await bridge({ ...args, ...parsedArgs.data }, wallets);\n\n if (bridgeResult.isErr()) {\n return outputAndExit(fromNeverthrowError(bridgeResult), args);\n }\n\n return outputAndExit(\n successResponse({\n success: true,\n }),\n args\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/bridge.ts"],"sourcesContent":["import {\n successResponse,\n fromNeverthrowError,\n outputAndExit,\n errorResponse,\n} from '@/cli/output';\n\nimport { bridge, bridgeSchema, type BridgeInput } from '@/operations/bridge';\nimport { DESCRIPTIONS } from '@/shared/descriptions';\nimport type { Command } from '@/types';\nimport { getWalletOrExit } from '../lib/get-wallet-or-exit';\n\nconst SURFACE = `cli:${DESCRIPTIONS.bridge.toolNames.cli}`;\n\nexport const bridgeCommand: Command<BridgeInput> = async args => {\n const wallets = await getWalletOrExit(args);\n\n const parsedArgs = bridgeSchema.safeParse(args);\n\n if (!parsedArgs.success) {\n return outputAndExit(\n errorResponse({\n code: 'INVALID_INPUT',\n message: parsedArgs.error.message,\n surface: SURFACE,\n cause: 'validation',\n }),\n args\n );\n }\n\n const bridgeResult = await bridge({ ...args, ...parsedArgs.data }, wallets);\n\n if (bridgeResult.isErr()) {\n return outputAndExit(fromNeverthrowError(bridgeResult), args);\n }\n\n return outputAndExit(\n successResponse({\n success: true,\n }),\n args\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAM,UAAU,OAAO,aAAa,OAAO,UAAU,GAAG;AAEjD,IAAM,gBAAsC,OAAM,SAAQ;AAC/D,QAAM,UAAU,MAAM,gBAAgB,IAAI;AAE1C,QAAM,aAAa,aAAa,UAAU,IAAI;AAE9C,MAAI,CAAC,WAAW,SAAS;AACvB,WAAO;AAAA,MACL,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,WAAW,MAAM;AAAA,QAC1B,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,MAAM,OAAO,EAAE,GAAG,MAAM,GAAG,WAAW,KAAK,GAAG,OAAO;AAE1E,MAAI,aAAa,MAAM,GAAG;AACxB,WAAO,cAAc,oBAAoB,YAAY,GAAG,IAAI;AAAA,EAC9D;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,MACd,SAAS;AAAA,IACX,CAAC;AAAA,IACD;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
discoverResources
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-Y2J274RB.js";
|
|
4
4
|
import {
|
|
5
5
|
errorResponse
|
|
6
6
|
} from "./chunk-7EBJ4BCH.js";
|
|
@@ -52,4 +52,4 @@ function resolveDescription(result) {
|
|
|
52
52
|
export {
|
|
53
53
|
resolveOrigin
|
|
54
54
|
};
|
|
55
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
//# sourceMappingURL=chunk-6I5J7IHC.js.map
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-27DZCYDB.js";
|
|
7
7
|
import {
|
|
8
8
|
INSTALL_PACKAGE_SPECIFIER
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-XC5JT2NQ.js";
|
|
10
10
|
import {
|
|
11
11
|
log,
|
|
12
12
|
safeReadFile,
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
// src/cli/commands/install/2-add-server/index.ts
|
|
20
20
|
import fs2 from "fs";
|
|
21
21
|
import path3 from "path";
|
|
22
|
+
import { fileURLToPath } from "url";
|
|
22
23
|
import chalk from "chalk";
|
|
23
24
|
import { log as clackLog, confirm, outro, stream } from "@clack/prompts";
|
|
24
25
|
|
|
@@ -295,23 +296,40 @@ var setNestedValue = (obj, path4, value) => {
|
|
|
295
296
|
};
|
|
296
297
|
|
|
297
298
|
// src/cli/commands/install/2-add-server/index.ts
|
|
299
|
+
var getDevPackageRoot = () => {
|
|
300
|
+
let current = path3.dirname(fileURLToPath(import.meta.url));
|
|
301
|
+
while (true) {
|
|
302
|
+
const packageJson = path3.join(current, "package.json");
|
|
303
|
+
const tsconfig = path3.join(current, "tsconfig.json");
|
|
304
|
+
const entrypoint = path3.join(current, "src", "index.ts");
|
|
305
|
+
if (fs2.existsSync(packageJson) && fs2.existsSync(tsconfig) && fs2.existsSync(entrypoint)) {
|
|
306
|
+
return current;
|
|
307
|
+
}
|
|
308
|
+
const parent = path3.dirname(current);
|
|
309
|
+
if (parent === current) {
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
current = parent;
|
|
313
|
+
}
|
|
314
|
+
return process.cwd();
|
|
315
|
+
};
|
|
298
316
|
var getMcpConfig = (globalFlags) => {
|
|
299
317
|
if (globalFlags.dev) {
|
|
300
|
-
const
|
|
318
|
+
const packageRoot = getDevPackageRoot();
|
|
301
319
|
return {
|
|
302
320
|
serverName: "agentcash",
|
|
303
321
|
// MCP clients may launch this from outside the package directory, so
|
|
304
322
|
// pass the package tsconfig explicitly to keep path aliases working.
|
|
305
323
|
command: path3.join(
|
|
306
|
-
|
|
324
|
+
packageRoot,
|
|
307
325
|
"node_modules",
|
|
308
326
|
".bin",
|
|
309
327
|
process.platform === "win32" ? "tsx.cmd" : "tsx"
|
|
310
328
|
),
|
|
311
329
|
args: [
|
|
312
330
|
"--tsconfig",
|
|
313
|
-
path3.join(
|
|
314
|
-
path3.join(
|
|
331
|
+
path3.join(packageRoot, "tsconfig.json"),
|
|
332
|
+
path3.join(packageRoot, "src", "index.ts"),
|
|
315
333
|
"--dev"
|
|
316
334
|
]
|
|
317
335
|
};
|
|
@@ -610,4 +628,4 @@ export {
|
|
|
610
628
|
tryAddServer,
|
|
611
629
|
addServer
|
|
612
630
|
};
|
|
613
|
-
//# sourceMappingURL=chunk-
|
|
631
|
+
//# sourceMappingURL=chunk-7ZLVTQTS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cli/commands/install/2-add-server/index.ts","../../src/cli/commands/install/2-add-server/lib/client-config-file.ts","../../src/cli/commands/install/2-add-server/lib/platforms.ts","../../src/cli/commands/install/2-add-server/lib/file-types.ts","../../src/cli/commands/install/2-add-server/lib/result.ts","../../src/cli/commands/install/2-add-server/lib/nested-values.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\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 { INSTALL_PACKAGE_SPECIFIER } from '@/shared/version';\n\nimport { wait } from '@/cli/lib/wait';\n\nimport type { ClientConfigObject } from './types';\nimport type { GlobalFlags } from '@/types';\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport type AddServerSuccess = {\n client: Clients;\n name: string;\n path: string;\n};\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\nexport type 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 getDevPackageRoot = () => {\n let current = path.dirname(fileURLToPath(import.meta.url));\n\n while (true) {\n const packageJson = path.join(current, 'package.json');\n const tsconfig = path.join(current, 'tsconfig.json');\n const entrypoint = path.join(current, 'src', 'index.ts');\n\n if (\n fs.existsSync(packageJson) &&\n fs.existsSync(tsconfig) &&\n fs.existsSync(entrypoint)\n ) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return process.cwd();\n};\n\nconst getMcpConfig = (globalFlags: GlobalFlags) => {\n if (globalFlags.dev) {\n const packageRoot = getDevPackageRoot();\n return {\n serverName: 'agentcash',\n // MCP clients may launch this from outside the package directory, so\n // pass the package tsconfig explicitly to keep path aliases working.\n command: path.join(\n packageRoot,\n 'node_modules',\n '.bin',\n process.platform === 'win32' ? 'tsx.cmd' : 'tsx'\n ),\n args: [\n '--tsconfig',\n path.join(packageRoot, 'tsconfig.json'),\n path.join(packageRoot, 'src', 'index.ts'),\n '--dev',\n ],\n };\n }\n return {\n serverName: 'agentcash',\n command: 'npx',\n args: ['-y', `agentcash@${INSTALL_PACKAGE_SPECIFIER}`],\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.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.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","path","os","path","process","process","Platforms","path","os","path","process","path","path","fs"]}
|
|
@@ -128,27 +128,6 @@ var isFetchError = (error) => {
|
|
|
128
128
|
return error.type === errorType;
|
|
129
129
|
};
|
|
130
130
|
|
|
131
|
-
// src/shared/utils.ts
|
|
132
|
-
import { formatUnits } from "viem";
|
|
133
|
-
var getBaseUrl = (dev) => {
|
|
134
|
-
return dev ? "http://localhost:3000" : "https://agentcash.dev";
|
|
135
|
-
};
|
|
136
|
-
var getDepositLink = (address, flags, network) => {
|
|
137
|
-
return `${getBaseUrl(flags.dev)}/deposit/${address}${network ? `?network=${network}` : ""}`;
|
|
138
|
-
};
|
|
139
|
-
var tokenStringToNumber = (amount, decimals = 6) => {
|
|
140
|
-
return Number(formatUnits(BigInt(amount), decimals));
|
|
141
|
-
};
|
|
142
|
-
var formatUsd = (amount) => {
|
|
143
|
-
const fractionDigits = amount < 0.01 && amount > 0 ? 4 : 2;
|
|
144
|
-
return amount.toLocaleString("en-US", {
|
|
145
|
-
style: "currency",
|
|
146
|
-
currency: "USD",
|
|
147
|
-
minimumFractionDigits: 2,
|
|
148
|
-
maximumFractionDigits: fractionDigits
|
|
149
|
-
});
|
|
150
|
-
};
|
|
151
|
-
|
|
152
131
|
export {
|
|
153
132
|
fetchErr,
|
|
154
133
|
fetchOk,
|
|
@@ -156,10 +135,6 @@ export {
|
|
|
156
135
|
safeFetch,
|
|
157
136
|
safeFetchJson,
|
|
158
137
|
safeParseResponse,
|
|
159
|
-
isFetchError
|
|
160
|
-
getBaseUrl,
|
|
161
|
-
getDepositLink,
|
|
162
|
-
tokenStringToNumber,
|
|
163
|
-
formatUsd
|
|
138
|
+
isFetchError
|
|
164
139
|
};
|
|
165
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-BFOYXXLG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/shared/neverthrow/fetch/index.ts"],"sourcesContent":["import contentType from 'content-type';\nimport { err, ok, resultFromPromise } from '@agentcash/neverthrow';\n\nimport type z from 'zod';\n\nimport type { BaseError, Error } from '@agentcash/neverthrow/types';\nimport type { BaseFetchError, FetchError, ParsedResponse } from './types';\nimport type { JsonObject } from '../json/types';\nimport { safeParse } from '../parse';\n\nconst DEFAULT_USER_FETCH_TIMEOUT = 30_000;\n\nconst IMAGE_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'image/gif',\n 'image/webp',\n 'image/svg+xml',\n 'image/tiff',\n 'image/bmp',\n 'image/ico',\n]);\n\nconst errorType = 'fetch';\n\nexport const fetchErr = (surface: string, error: BaseFetchError) =>\n err(errorType, surface, error);\nexport const fetchOk = <T>(value: T) => ok(value);\n\nexport const fetchHttpErr = (surface: string, response: Response) =>\n fetchErr(surface, {\n cause: 'http' as const,\n statusCode: response.status,\n message: response.statusText,\n response,\n });\n\nexport const safeFetch = (\n surface: string,\n request: Request,\n timeout = DEFAULT_USER_FETCH_TIMEOUT\n) => {\n const signal = AbortSignal.timeout(timeout);\n\n return resultFromPromise(\n errorType,\n surface,\n fetch(request, ...(signal ? [{ signal }] : [])),\n error => {\n if (\n error instanceof DOMException &&\n (error.name === 'TimeoutError' || error.name === 'AbortError')\n ) {\n return {\n cause: 'timeout',\n message: timeout\n ? `Request timed out after ${timeout}ms. You can increase the timeout by passing a larger value in the 'timeout' parameter.`\n : 'Request was aborted',\n } as BaseFetchError;\n }\n\n return {\n cause: 'network',\n message: error instanceof Error ? error.message : 'Network error',\n } as BaseFetchError;\n }\n );\n};\n\nexport const safeFetchJson = <T>(\n surface: string,\n request: Request,\n schema: z.ZodSchema<T>,\n timeout?: number\n) => {\n return safeFetch(surface, request, timeout)\n .andThen(response => {\n if (!response.ok) {\n return fetchHttpErr(surface, response);\n }\n\n return resultFromPromise(errorType, surface, response.json(), () => ({\n cause: 'parse' as const,\n message: 'Could not parse JSON from response',\n statusCode: response.status,\n contentType: response.headers.get('content-type') ?? 'Not specified',\n }));\n })\n .andThen(data => safeParse(surface, schema, data));\n};\n\nexport const safeParseResponse = (surface: string, response: Response) => {\n return resultFromPromise(\n errorType,\n surface,\n (async (): Promise<ParsedResponse> => {\n const header = response.headers.get('content-type');\n const { type: mimeType } = header\n ? contentType.parse(header)\n : { type: 'application/octet-stream' };\n\n switch (mimeType) {\n case 'application/json':\n return {\n type: 'json' as const,\n data: (await response.json()) as JsonObject,\n };\n case 'application/pdf':\n return {\n type: 'pdf' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n case 'application/octet-stream':\n return {\n type: 'octet-stream' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n case 'multipart/form-data':\n return { type: 'formData' as const, data: await response.formData() };\n }\n\n if (IMAGE_TYPES.has(mimeType)) {\n return {\n type: 'image' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('audio/')) {\n return {\n type: 'audio' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('video/')) {\n return {\n type: 'video' as const,\n mimeType,\n data: await response.arrayBuffer(),\n };\n }\n\n if (mimeType.startsWith('text/')) {\n return { type: 'text' as const, data: await response.text() };\n }\n\n throw new Error(`Unsupported content type: ${header}`);\n })(),\n e => ({\n cause: 'parse' as const,\n message: e instanceof Error ? e.message : 'Could not parse response',\n statusCode: response.status,\n contentType: response.headers.get('content-type') ?? 'Not specified',\n })\n );\n};\n\nexport const isFetchError = (error: Error<BaseError>): error is FetchError => {\n return error.type === errorType;\n};\n"],"mappings":"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","names":[]}
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
} from "./chunk-DZNSJ2BA.js";
|
|
4
4
|
import {
|
|
5
5
|
redeemInviteCode
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import {
|
|
8
|
-
getDepositLink
|
|
9
|
-
} from "./chunk-QCP7Q6UF.js";
|
|
6
|
+
} from "./chunk-MSNAPI5G.js";
|
|
10
7
|
import {
|
|
11
8
|
EVM_CONFIGS,
|
|
12
9
|
getTxExplorerUrl
|
|
13
10
|
} from "./chunk-NPJV7AMV.js";
|
|
11
|
+
import {
|
|
12
|
+
getDepositLink
|
|
13
|
+
} from "./chunk-U6FRXL3X.js";
|
|
14
14
|
|
|
15
15
|
// src/cli/lib/deposit.ts
|
|
16
16
|
import chalk from "chalk";
|
|
@@ -106,4 +106,4 @@ var promptDeposit = async (surface, args, wallets) => {
|
|
|
106
106
|
export {
|
|
107
107
|
promptDeposit
|
|
108
108
|
};
|
|
109
|
-
//# sourceMappingURL=chunk-
|
|
109
|
+
//# sourceMappingURL=chunk-BNFMFAEF.js.map
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
MCP_VERSION
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-XC5JT2NQ.js";
|
|
4
4
|
import {
|
|
5
|
-
getBaseUrl,
|
|
6
5
|
safeFetchJson
|
|
7
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-BFOYXXLG.js";
|
|
7
|
+
import {
|
|
8
|
+
getBaseUrl
|
|
9
|
+
} from "./chunk-U6FRXL3X.js";
|
|
8
10
|
import {
|
|
9
11
|
ok
|
|
10
12
|
} from "./chunk-YWNBUUBR.js";
|
|
@@ -49,4 +51,4 @@ async function submitErrorReport(surface, input, address, dev) {
|
|
|
49
51
|
export {
|
|
50
52
|
submitErrorReport
|
|
51
53
|
};
|
|
52
|
-
//# sourceMappingURL=chunk-
|
|
54
|
+
//# sourceMappingURL=chunk-E52LAD7Z.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/operations/report-error.ts"],"sourcesContent":["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 */\nexport interface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: 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({\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/operations/report-error.ts"],"sourcesContent":["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 */\nexport interface ErrorReportInput {\n tool: string;\n summary: string;\n errorMessage: string;\n resource?: string;\n stack?: string;\n fullReport?: 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({\n submitted: true,\n reportId,\n message:\n 'Error report submitted successfully. The agentcash team will investigate.',\n });\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,SAAS;AAwBlB,eAAsB,kBACpB,SACA,OACA,SACA,KACA;AACA,QAAM,kBAAkB,MAAM;AAAA,IAC5B;AAAA,IACA,IAAI,QAAQ,GAAG,WAAW,GAAG,CAAC,kBAAkB;AAAA,MAC9C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,cAAc,MAAM;AAAA,QACpB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,eAAe;AAAA,QACf,YAAY;AAAA,QACZ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,IACD,EAAE,OAAO;AAAA,MACP,UAAU,EAAE,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,IAAI,gBAAgB;AAErC,SAAO,GAAG;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA,SACE;AAAA,EACJ,CAAC;AACH;","names":[]}
|
|
@@ -7,20 +7,22 @@ import {
|
|
|
7
7
|
} from "./chunk-IKPLMFAK.js";
|
|
8
8
|
import {
|
|
9
9
|
getBalance
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-KJCWPVQE.js";
|
|
11
11
|
import {
|
|
12
12
|
fetchErr,
|
|
13
13
|
fetchOk,
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
safeFetch,
|
|
17
|
-
tokenStringToNumber
|
|
18
|
-
} from "./chunk-QCP7Q6UF.js";
|
|
14
|
+
safeFetch
|
|
15
|
+
} from "./chunk-BFOYXXLG.js";
|
|
19
16
|
import {
|
|
20
17
|
EVM_CONFIGS,
|
|
21
18
|
caip2ToNetwork,
|
|
22
19
|
networkToCaip2
|
|
23
20
|
} from "./chunk-NPJV7AMV.js";
|
|
21
|
+
import {
|
|
22
|
+
formatUsd,
|
|
23
|
+
getDepositLink,
|
|
24
|
+
tokenStringToNumber
|
|
25
|
+
} from "./chunk-U6FRXL3X.js";
|
|
24
26
|
import {
|
|
25
27
|
log
|
|
26
28
|
} from "./chunk-QZCSZB7E.js";
|
|
@@ -824,4 +826,4 @@ async function executeFetch(input, options) {
|
|
|
824
826
|
export {
|
|
825
827
|
executeFetch
|
|
826
828
|
};
|
|
827
|
-
//# sourceMappingURL=chunk-
|
|
829
|
+
//# sourceMappingURL=chunk-G5FHPXQL.js.map
|