chain-insights 0.3.7 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +5 -0
  2. package/dist/{capabilities-BC3Y5EOi.mjs → capabilities-BCvkTkIu.mjs} +3 -6
  3. package/dist/capabilities-BCvkTkIu.mjs.map +1 -0
  4. package/dist/{capabilities-D5PSx9Hj.cjs → capabilities-DOa6EFO-.cjs} +2 -5
  5. package/dist/cli.cjs +41 -14
  6. package/dist/cli.mjs +41 -14
  7. package/dist/cli.mjs.map +1 -1
  8. package/dist/{client-D4JE7fFF.mjs → client-BgmHjBHQ.mjs} +15 -7
  9. package/dist/client-BgmHjBHQ.mjs.map +1 -0
  10. package/dist/{client-Db6IV1tv.cjs → client-Y_zqKqJT.cjs} +19 -5
  11. package/dist/index.cjs +1 -1
  12. package/dist/index.d.cts.map +1 -1
  13. package/dist/index.d.mts.map +1 -1
  14. package/dist/index.mjs +1 -1
  15. package/dist/mcp-proxy.cjs +442 -408
  16. package/dist/mcp-proxy.d.cts +3 -1
  17. package/dist/mcp-proxy.d.cts.map +1 -1
  18. package/dist/mcp-proxy.d.mts +3 -1
  19. package/dist/mcp-proxy.d.mts.map +1 -1
  20. package/dist/mcp-proxy.mjs +442 -409
  21. package/dist/mcp-proxy.mjs.map +1 -1
  22. package/dist/{public-tools-xfVNz9NE.cjs → public-tools-BY3PTw6x.cjs} +59 -31
  23. package/dist/{public-tools-CyUZEz9B.mjs → public-tools-CvlZcysd.mjs} +60 -32
  24. package/dist/public-tools-CvlZcysd.mjs.map +1 -0
  25. package/dist/{runner-DWuSy1Se.mjs → runner-CVnjpqc-.mjs} +2 -2
  26. package/dist/{runner-DWuSy1Se.mjs.map → runner-CVnjpqc-.mjs.map} +1 -1
  27. package/dist/{runner-CVo41fjz.cjs → runner-bLy0pTr_.cjs} +1 -1
  28. package/dist/update-BJoXYucO.cjs +145 -0
  29. package/dist/update-CJUfGCxs.mjs +145 -0
  30. package/dist/update-CJUfGCxs.mjs.map +1 -0
  31. package/package.json +1 -1
  32. package/dist/capabilities-BC3Y5EOi.mjs.map +0 -1
  33. package/dist/client-D4JE7fFF.mjs.map +0 -1
  34. package/dist/public-tools-CyUZEz9B.mjs.map +0 -1
@@ -0,0 +1,145 @@
1
+ const require_version = require("./version-CO9Or_YV.cjs");
2
+ let node_child_process = require("node:child_process");
3
+ let node_readline_promises = require("node:readline/promises");
4
+ let node_process = require("node:process");
5
+ //#region src/update.ts
6
+ const DEFAULT_REGISTRY_URL = "https://registry.npmjs.org";
7
+ const DEFAULT_TIMEOUT_MS = 3e3;
8
+ function compareSemverVersions(a, b) {
9
+ const left = parseSemverCore(a);
10
+ const right = parseSemverCore(b);
11
+ for (let i = 0; i < 3; i += 1) {
12
+ if (left[i] > right[i]) return 1;
13
+ if (left[i] < right[i]) return -1;
14
+ }
15
+ return 0;
16
+ }
17
+ function resolveUpdateRegistryUrl(env = process.env) {
18
+ return env["CHAIN_INSIGHTS_NPM_REGISTRY_URL"]?.trim() || DEFAULT_REGISTRY_URL;
19
+ }
20
+ function buildPackageLatestUrl(packageName, registryUrl = DEFAULT_REGISTRY_URL) {
21
+ return `${registryUrl.endsWith("/") ? registryUrl.slice(0, -1) : registryUrl}/${encodeURIComponent(packageName)}/latest`;
22
+ }
23
+ function resolveNpmUpdateInvocation(packageName = require_version.PACKAGE_INFO.name, env = process.env) {
24
+ const packageSpec = `${packageName}@latest`;
25
+ const displayCommand = `npm install -g ${packageSpec}`;
26
+ const npmExecPath = env["npm_execpath"]?.trim();
27
+ if (npmExecPath) return {
28
+ command: process.execPath,
29
+ args: [
30
+ npmExecPath,
31
+ "install",
32
+ "-g",
33
+ packageSpec
34
+ ],
35
+ displayCommand
36
+ };
37
+ return {
38
+ command: process.platform === "win32" ? "npm.cmd" : "npm",
39
+ args: [
40
+ "install",
41
+ "-g",
42
+ packageSpec
43
+ ],
44
+ displayCommand
45
+ };
46
+ }
47
+ async function fetchLatestPackageVersion(options = {}) {
48
+ const packageName = options.packageName ?? require_version.PACKAGE_INFO.name;
49
+ const registryUrl = options.registryUrl ?? resolveUpdateRegistryUrl();
50
+ const fetchImpl = options.fetchImpl ?? fetch;
51
+ const controller = new AbortController();
52
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
53
+ try {
54
+ const response = await fetchImpl(buildPackageLatestUrl(packageName, registryUrl), {
55
+ headers: {
56
+ accept: "application/json",
57
+ "user-agent": `chain-insights/${require_version.PACKAGE_VERSION}`
58
+ },
59
+ signal: controller.signal
60
+ });
61
+ if (!response.ok) throw new Error(`npmjs registry returned ${response.status}`);
62
+ const body = await response.json();
63
+ if (typeof body.version !== "string" || !body.version.trim()) throw new Error("npmjs registry response did not include a version");
64
+ return body.version.trim();
65
+ } finally {
66
+ clearTimeout(timeout);
67
+ }
68
+ }
69
+ async function checkForUpdate(options = {}) {
70
+ const packageName = options.packageName ?? require_version.PACKAGE_INFO.name;
71
+ const currentVersion = options.currentVersion ?? require_version.PACKAGE_VERSION;
72
+ const updateCommand = resolveNpmUpdateInvocation(packageName).displayCommand;
73
+ try {
74
+ const latestVersion = await fetchLatestPackageVersion(options);
75
+ return {
76
+ packageName,
77
+ currentVersion,
78
+ latestVersion,
79
+ updateAvailable: compareSemverVersions(latestVersion, currentVersion) > 0,
80
+ updateCommand
81
+ };
82
+ } catch (err) {
83
+ return {
84
+ packageName,
85
+ currentVersion,
86
+ updateAvailable: false,
87
+ updateCommand,
88
+ error: err.message
89
+ };
90
+ }
91
+ }
92
+ function runPackageUpdate(packageName = require_version.PACKAGE_INFO.name) {
93
+ const invocation = resolveNpmUpdateInvocation(packageName);
94
+ const result = (0, node_child_process.spawnSync)(invocation.command, invocation.args, { stdio: "inherit" });
95
+ if (result.error) throw result.error;
96
+ if (result.status !== 0) {
97
+ const detail = result.signal ? `signal ${result.signal}` : `exit code ${result.status ?? "unknown"}`;
98
+ throw new Error(`Update failed with ${detail}`);
99
+ }
100
+ }
101
+ function shouldPromptForUpdate(options = {}) {
102
+ const env = options.env ?? process.env;
103
+ if (env["CHAIN_INSIGHTS_SKIP_UPDATE_CHECK"] === "1") return false;
104
+ if (env["CI"] === "true") return false;
105
+ const input = options.input ?? node_process.stdin;
106
+ const output = options.output ?? node_process.stdout;
107
+ return input.isTTY === true && output.isTTY === true;
108
+ }
109
+ async function maybePromptForUpdate(options = {}) {
110
+ if (!shouldPromptForUpdate(options)) return;
111
+ const check = await checkForUpdate(options);
112
+ if (check.error || !check.updateAvailable || !check.latestVersion) return;
113
+ const output = options.output ?? node_process.stdout;
114
+ output.write(`\nChain Insights ${check.latestVersion} is available (current ${check.currentVersion}).\n`);
115
+ output.write(`Update command: ${check.updateCommand}\n`);
116
+ const rl = (0, node_readline_promises.createInterface)({
117
+ input: options.input ?? node_process.stdin,
118
+ output
119
+ });
120
+ try {
121
+ const answer = await rl.question("Update now? [Y/n] ");
122
+ if (!answer.trim() || answer.trim().toLowerCase().startsWith("y")) try {
123
+ runPackageUpdate(check.packageName);
124
+ } catch (err) {
125
+ output.write(`Update failed: ${err.message}\n`);
126
+ output.write("Workspace initialization is complete. Run `cia update` when ready.\n");
127
+ }
128
+ else output.write("Skipped update. Run `cia update` when ready.\n");
129
+ } finally {
130
+ rl.close();
131
+ }
132
+ }
133
+ function parseSemverCore(version) {
134
+ const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:[-+].*)?$/.exec(version);
135
+ if (!match) throw new Error(`Invalid semver version: ${version}`);
136
+ return [
137
+ Number(match[1]),
138
+ Number(match[2]),
139
+ Number(match[3])
140
+ ];
141
+ }
142
+ //#endregion
143
+ exports.checkForUpdate = checkForUpdate;
144
+ exports.maybePromptForUpdate = maybePromptForUpdate;
145
+ exports.runPackageUpdate = runPackageUpdate;
@@ -0,0 +1,145 @@
1
+ import { n as PACKAGE_VERSION, t as PACKAGE_INFO } from "./version-BA3J8hu4.mjs";
2
+ import { spawnSync } from "node:child_process";
3
+ import { createInterface } from "node:readline/promises";
4
+ import { stdin, stdout } from "node:process";
5
+ //#region src/update.ts
6
+ const DEFAULT_REGISTRY_URL = "https://registry.npmjs.org";
7
+ const DEFAULT_TIMEOUT_MS = 3e3;
8
+ function compareSemverVersions(a, b) {
9
+ const left = parseSemverCore(a);
10
+ const right = parseSemverCore(b);
11
+ for (let i = 0; i < 3; i += 1) {
12
+ if (left[i] > right[i]) return 1;
13
+ if (left[i] < right[i]) return -1;
14
+ }
15
+ return 0;
16
+ }
17
+ function resolveUpdateRegistryUrl(env = process.env) {
18
+ return env["CHAIN_INSIGHTS_NPM_REGISTRY_URL"]?.trim() || DEFAULT_REGISTRY_URL;
19
+ }
20
+ function buildPackageLatestUrl(packageName, registryUrl = DEFAULT_REGISTRY_URL) {
21
+ return `${registryUrl.endsWith("/") ? registryUrl.slice(0, -1) : registryUrl}/${encodeURIComponent(packageName)}/latest`;
22
+ }
23
+ function resolveNpmUpdateInvocation(packageName = PACKAGE_INFO.name, env = process.env) {
24
+ const packageSpec = `${packageName}@latest`;
25
+ const displayCommand = `npm install -g ${packageSpec}`;
26
+ const npmExecPath = env["npm_execpath"]?.trim();
27
+ if (npmExecPath) return {
28
+ command: process.execPath,
29
+ args: [
30
+ npmExecPath,
31
+ "install",
32
+ "-g",
33
+ packageSpec
34
+ ],
35
+ displayCommand
36
+ };
37
+ return {
38
+ command: process.platform === "win32" ? "npm.cmd" : "npm",
39
+ args: [
40
+ "install",
41
+ "-g",
42
+ packageSpec
43
+ ],
44
+ displayCommand
45
+ };
46
+ }
47
+ async function fetchLatestPackageVersion(options = {}) {
48
+ const packageName = options.packageName ?? PACKAGE_INFO.name;
49
+ const registryUrl = options.registryUrl ?? resolveUpdateRegistryUrl();
50
+ const fetchImpl = options.fetchImpl ?? fetch;
51
+ const controller = new AbortController();
52
+ const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
53
+ try {
54
+ const response = await fetchImpl(buildPackageLatestUrl(packageName, registryUrl), {
55
+ headers: {
56
+ accept: "application/json",
57
+ "user-agent": `chain-insights/${PACKAGE_VERSION}`
58
+ },
59
+ signal: controller.signal
60
+ });
61
+ if (!response.ok) throw new Error(`npmjs registry returned ${response.status}`);
62
+ const body = await response.json();
63
+ if (typeof body.version !== "string" || !body.version.trim()) throw new Error("npmjs registry response did not include a version");
64
+ return body.version.trim();
65
+ } finally {
66
+ clearTimeout(timeout);
67
+ }
68
+ }
69
+ async function checkForUpdate(options = {}) {
70
+ const packageName = options.packageName ?? PACKAGE_INFO.name;
71
+ const currentVersion = options.currentVersion ?? PACKAGE_VERSION;
72
+ const updateCommand = resolveNpmUpdateInvocation(packageName).displayCommand;
73
+ try {
74
+ const latestVersion = await fetchLatestPackageVersion(options);
75
+ return {
76
+ packageName,
77
+ currentVersion,
78
+ latestVersion,
79
+ updateAvailable: compareSemverVersions(latestVersion, currentVersion) > 0,
80
+ updateCommand
81
+ };
82
+ } catch (err) {
83
+ return {
84
+ packageName,
85
+ currentVersion,
86
+ updateAvailable: false,
87
+ updateCommand,
88
+ error: err.message
89
+ };
90
+ }
91
+ }
92
+ function runPackageUpdate(packageName = PACKAGE_INFO.name) {
93
+ const invocation = resolveNpmUpdateInvocation(packageName);
94
+ const result = spawnSync(invocation.command, invocation.args, { stdio: "inherit" });
95
+ if (result.error) throw result.error;
96
+ if (result.status !== 0) {
97
+ const detail = result.signal ? `signal ${result.signal}` : `exit code ${result.status ?? "unknown"}`;
98
+ throw new Error(`Update failed with ${detail}`);
99
+ }
100
+ }
101
+ function shouldPromptForUpdate(options = {}) {
102
+ const env = options.env ?? process.env;
103
+ if (env["CHAIN_INSIGHTS_SKIP_UPDATE_CHECK"] === "1") return false;
104
+ if (env["CI"] === "true") return false;
105
+ const input = options.input ?? stdin;
106
+ const output = options.output ?? stdout;
107
+ return input.isTTY === true && output.isTTY === true;
108
+ }
109
+ async function maybePromptForUpdate(options = {}) {
110
+ if (!shouldPromptForUpdate(options)) return;
111
+ const check = await checkForUpdate(options);
112
+ if (check.error || !check.updateAvailable || !check.latestVersion) return;
113
+ const output = options.output ?? stdout;
114
+ output.write(`\nChain Insights ${check.latestVersion} is available (current ${check.currentVersion}).\n`);
115
+ output.write(`Update command: ${check.updateCommand}\n`);
116
+ const rl = createInterface({
117
+ input: options.input ?? stdin,
118
+ output
119
+ });
120
+ try {
121
+ const answer = await rl.question("Update now? [Y/n] ");
122
+ if (!answer.trim() || answer.trim().toLowerCase().startsWith("y")) try {
123
+ runPackageUpdate(check.packageName);
124
+ } catch (err) {
125
+ output.write(`Update failed: ${err.message}\n`);
126
+ output.write("Workspace initialization is complete. Run `cia update` when ready.\n");
127
+ }
128
+ else output.write("Skipped update. Run `cia update` when ready.\n");
129
+ } finally {
130
+ rl.close();
131
+ }
132
+ }
133
+ function parseSemverCore(version) {
134
+ const match = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:[-+].*)?$/.exec(version);
135
+ if (!match) throw new Error(`Invalid semver version: ${version}`);
136
+ return [
137
+ Number(match[1]),
138
+ Number(match[2]),
139
+ Number(match[3])
140
+ ];
141
+ }
142
+ //#endregion
143
+ export { checkForUpdate, maybePromptForUpdate, runPackageUpdate };
144
+
145
+ //# sourceMappingURL=update-CJUfGCxs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-CJUfGCxs.mjs","names":[],"sources":["../src/update.ts"],"sourcesContent":["import { spawnSync } from 'node:child_process'\nimport type { Readable, Writable } from 'node:stream'\nimport { createInterface } from 'node:readline/promises'\nimport { stdin, stdout } from 'node:process'\nimport { PACKAGE_INFO, PACKAGE_VERSION } from './version.js'\n\nconst DEFAULT_REGISTRY_URL = 'https://registry.npmjs.org'\nconst DEFAULT_TIMEOUT_MS = 3000\n\nexport interface UpdateCheckOptions {\n packageName?: string\n currentVersion?: string\n registryUrl?: string\n timeoutMs?: number\n fetchImpl?: typeof fetch\n}\n\nexport interface UpdateCheckResult {\n packageName: string\n currentVersion: string\n latestVersion?: string\n updateAvailable: boolean\n updateCommand: string\n error?: string\n}\n\nexport interface NpmInvocation {\n command: string\n args: string[]\n displayCommand: string\n}\n\nexport interface UpdatePromptOptions extends UpdateCheckOptions {\n input?: NodeJS.ReadStream & Readable\n output?: NodeJS.WriteStream & Writable\n env?: NodeJS.ProcessEnv\n}\n\nexport function compareSemverVersions(a: string, b: string): number {\n const left = parseSemverCore(a)\n const right = parseSemverCore(b)\n for (let i = 0; i < 3; i += 1) {\n if (left[i] > right[i]) return 1\n if (left[i] < right[i]) return -1\n }\n return 0\n}\n\nexport function resolveUpdateRegistryUrl(env: NodeJS.ProcessEnv = process.env): string {\n return env['CHAIN_INSIGHTS_NPM_REGISTRY_URL']?.trim() || DEFAULT_REGISTRY_URL\n}\n\nexport function buildPackageLatestUrl(packageName: string, registryUrl = DEFAULT_REGISTRY_URL): string {\n const base = registryUrl.endsWith('/') ? registryUrl.slice(0, -1) : registryUrl\n return `${base}/${encodeURIComponent(packageName)}/latest`\n}\n\nexport function resolveNpmUpdateInvocation(\n packageName = PACKAGE_INFO.name,\n env: NodeJS.ProcessEnv = process.env,\n): NpmInvocation {\n const packageSpec = `${packageName}@latest`\n const displayCommand = `npm install -g ${packageSpec}`\n const npmExecPath = env['npm_execpath']?.trim()\n if (npmExecPath) {\n return {\n command: process.execPath,\n args: [npmExecPath, 'install', '-g', packageSpec],\n displayCommand,\n }\n }\n return {\n command: process.platform === 'win32' ? 'npm.cmd' : 'npm',\n args: ['install', '-g', packageSpec],\n displayCommand,\n }\n}\n\nexport async function fetchLatestPackageVersion(options: UpdateCheckOptions = {}): Promise<string> {\n const packageName = options.packageName ?? PACKAGE_INFO.name\n const registryUrl = options.registryUrl ?? resolveUpdateRegistryUrl()\n const fetchImpl = options.fetchImpl ?? fetch\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), options.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n\n try {\n const response = await fetchImpl(buildPackageLatestUrl(packageName, registryUrl), {\n headers: {\n accept: 'application/json',\n 'user-agent': `chain-insights/${PACKAGE_VERSION}`,\n },\n signal: controller.signal,\n })\n if (!response.ok) {\n throw new Error(`npmjs registry returned ${response.status}`)\n }\n const body = await response.json() as { version?: unknown }\n if (typeof body.version !== 'string' || !body.version.trim()) {\n throw new Error('npmjs registry response did not include a version')\n }\n return body.version.trim()\n } finally {\n clearTimeout(timeout)\n }\n}\n\nexport async function checkForUpdate(options: UpdateCheckOptions = {}): Promise<UpdateCheckResult> {\n const packageName = options.packageName ?? PACKAGE_INFO.name\n const currentVersion = options.currentVersion ?? PACKAGE_VERSION\n const updateCommand = resolveNpmUpdateInvocation(packageName).displayCommand\n try {\n const latestVersion = await fetchLatestPackageVersion(options)\n return {\n packageName,\n currentVersion,\n latestVersion,\n updateAvailable: compareSemverVersions(latestVersion, currentVersion) > 0,\n updateCommand,\n }\n } catch (err) {\n return {\n packageName,\n currentVersion,\n updateAvailable: false,\n updateCommand,\n error: (err as Error).message,\n }\n }\n}\n\nexport function runPackageUpdate(packageName = PACKAGE_INFO.name): void {\n const invocation = resolveNpmUpdateInvocation(packageName)\n const result = spawnSync(invocation.command, invocation.args, { stdio: 'inherit' })\n if (result.error) {\n throw result.error\n }\n if (result.status !== 0) {\n const detail = result.signal ? `signal ${result.signal}` : `exit code ${result.status ?? 'unknown'}`\n throw new Error(`Update failed with ${detail}`)\n }\n}\n\nexport function shouldPromptForUpdate(options: UpdatePromptOptions = {}): boolean {\n const env = options.env ?? process.env\n if (env['CHAIN_INSIGHTS_SKIP_UPDATE_CHECK'] === '1') return false\n if (env['CI'] === 'true') return false\n const input = options.input ?? stdin\n const output = options.output ?? stdout\n return input.isTTY === true && output.isTTY === true\n}\n\nexport async function maybePromptForUpdate(options: UpdatePromptOptions = {}): Promise<void> {\n if (!shouldPromptForUpdate(options)) return\n\n const check = await checkForUpdate(options)\n if (check.error || !check.updateAvailable || !check.latestVersion) return\n\n const output = options.output ?? stdout\n output.write(`\\nChain Insights ${check.latestVersion} is available (current ${check.currentVersion}).\\n`)\n output.write(`Update command: ${check.updateCommand}\\n`)\n\n const rl = createInterface({\n input: options.input ?? stdin,\n output,\n })\n try {\n const answer = await rl.question('Update now? [Y/n] ')\n if (!answer.trim() || answer.trim().toLowerCase().startsWith('y')) {\n try {\n runPackageUpdate(check.packageName)\n } catch (err) {\n output.write(`Update failed: ${(err as Error).message}\\n`)\n output.write('Workspace initialization is complete. Run `cia update` when ready.\\n')\n }\n } else {\n output.write('Skipped update. Run `cia update` when ready.\\n')\n }\n } finally {\n rl.close()\n }\n}\n\nfunction parseSemverCore(version: string): [number, number, number] {\n const match = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:[-+].*)?$/.exec(version)\n if (!match) throw new Error(`Invalid semver version: ${version}`)\n return [Number(match[1]), Number(match[2]), Number(match[3])]\n}\n"],"mappings":";;;;;AAMA,MAAM,uBAAuB;AAC7B,MAAM,qBAAqB;AA+B3B,SAAgB,sBAAsB,GAAW,GAAmB;CAClE,MAAM,OAAO,gBAAgB,CAAC;CAC9B,MAAM,QAAQ,gBAAgB,CAAC;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO;EAC/B,IAAI,KAAK,KAAK,MAAM,IAAI,OAAO;CACjC;CACA,OAAO;AACT;AAEA,SAAgB,yBAAyB,MAAyB,QAAQ,KAAa;CACrF,OAAO,IAAI,oCAAoC,KAAK,KAAK;AAC3D;AAEA,SAAgB,sBAAsB,aAAqB,cAAc,sBAA8B;CAErG,OAAO,GADM,YAAY,SAAS,GAAG,IAAI,YAAY,MAAM,GAAG,EAAE,IAAI,YACrD,GAAG,mBAAmB,WAAW,EAAE;AACpD;AAEA,SAAgB,2BACd,cAAc,aAAa,MAC3B,MAAyB,QAAQ,KAClB;CACf,MAAM,cAAc,GAAG,YAAY;CACnC,MAAM,iBAAiB,kBAAkB;CACzC,MAAM,cAAc,IAAI,iBAAiB,KAAK;CAC9C,IAAI,aACF,OAAO;EACL,SAAS,QAAQ;EACjB,MAAM;GAAC;GAAa;GAAW;GAAM;EAAW;EAChD;CACF;CAEF,OAAO;EACL,SAAS,QAAQ,aAAa,UAAU,YAAY;EACpD,MAAM;GAAC;GAAW;GAAM;EAAW;EACnC;CACF;AACF;AAEA,eAAsB,0BAA0B,UAA8B,CAAC,GAAoB;CACjG,MAAM,cAAc,QAAQ,eAAe,aAAa;CACxD,MAAM,cAAc,QAAQ,eAAe,yBAAyB;CACpE,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,UAAU,iBAAiB,WAAW,MAAM,GAAG,QAAQ,aAAa,kBAAkB;CAE5F,IAAI;EACF,MAAM,WAAW,MAAM,UAAU,sBAAsB,aAAa,WAAW,GAAG;GAChF,SAAS;IACP,QAAQ;IACR,cAAc,kBAAkB;GAClC;GACA,QAAQ,WAAW;EACrB,CAAC;EACD,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,2BAA2B,SAAS,QAAQ;EAE9D,MAAM,OAAO,MAAM,SAAS,KAAK;EACjC,IAAI,OAAO,KAAK,YAAY,YAAY,CAAC,KAAK,QAAQ,KAAK,GACzD,MAAM,IAAI,MAAM,mDAAmD;EAErE,OAAO,KAAK,QAAQ,KAAK;CAC3B,UAAU;EACR,aAAa,OAAO;CACtB;AACF;AAEA,eAAsB,eAAe,UAA8B,CAAC,GAA+B;CACjG,MAAM,cAAc,QAAQ,eAAe,aAAa;CACxD,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,MAAM,gBAAgB,2BAA2B,WAAW,EAAE;CAC9D,IAAI;EACF,MAAM,gBAAgB,MAAM,0BAA0B,OAAO;EAC7D,OAAO;GACL;GACA;GACA;GACA,iBAAiB,sBAAsB,eAAe,cAAc,IAAI;GACxE;EACF;CACF,SAAS,KAAK;EACZ,OAAO;GACL;GACA;GACA,iBAAiB;GACjB;GACA,OAAQ,IAAc;EACxB;CACF;AACF;AAEA,SAAgB,iBAAiB,cAAc,aAAa,MAAY;CACtE,MAAM,aAAa,2BAA2B,WAAW;CACzD,MAAM,SAAS,UAAU,WAAW,SAAS,WAAW,MAAM,EAAE,OAAO,UAAU,CAAC;CAClF,IAAI,OAAO,OACT,MAAM,OAAO;CAEf,IAAI,OAAO,WAAW,GAAG;EACvB,MAAM,SAAS,OAAO,SAAS,UAAU,OAAO,WAAW,aAAa,OAAO,UAAU;EACzF,MAAM,IAAI,MAAM,sBAAsB,QAAQ;CAChD;AACF;AAEA,SAAgB,sBAAsB,UAA+B,CAAC,GAAY;CAChF,MAAM,MAAM,QAAQ,OAAO,QAAQ;CACnC,IAAI,IAAI,wCAAwC,KAAK,OAAO;CAC5D,IAAI,IAAI,UAAU,QAAQ,OAAO;CACjC,MAAM,QAAQ,QAAQ,SAAS;CAC/B,MAAM,SAAS,QAAQ,UAAU;CACjC,OAAO,MAAM,UAAU,QAAQ,OAAO,UAAU;AAClD;AAEA,eAAsB,qBAAqB,UAA+B,CAAC,GAAkB;CAC3F,IAAI,CAAC,sBAAsB,OAAO,GAAG;CAErC,MAAM,QAAQ,MAAM,eAAe,OAAO;CAC1C,IAAI,MAAM,SAAS,CAAC,MAAM,mBAAmB,CAAC,MAAM,eAAe;CAEnE,MAAM,SAAS,QAAQ,UAAU;CACjC,OAAO,MAAM,oBAAoB,MAAM,cAAc,yBAAyB,MAAM,eAAe,KAAK;CACxG,OAAO,MAAM,mBAAmB,MAAM,cAAc,GAAG;CAEvD,MAAM,KAAK,gBAAgB;EACzB,OAAO,QAAQ,SAAS;EACxB;CACF,CAAC;CACD,IAAI;EACF,MAAM,SAAS,MAAM,GAAG,SAAS,oBAAoB;EACrD,IAAI,CAAC,OAAO,KAAK,KAAK,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,GAAG,GAC9D,IAAI;GACF,iBAAiB,MAAM,WAAW;EACpC,SAAS,KAAK;GACZ,OAAO,MAAM,kBAAmB,IAAc,QAAQ,GAAG;GACzD,OAAO,MAAM,sEAAsE;EACrF;OAEA,OAAO,MAAM,gDAAgD;CAEjE,UAAU;EACR,GAAG,MAAM;CACX;AACF;AAEA,SAAS,gBAAgB,SAA2C;CAClE,MAAM,QAAQ,wDAAwD,KAAK,OAAO;CAClF,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,2BAA2B,SAAS;CAChE,OAAO;EAAC,OAAO,MAAM,EAAE;EAAG,OAAO,MAAM,EAAE;EAAG,OAAO,MAAM,EAAE;CAAC;AAC9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chain-insights",
3
- "version": "0.3.7",
3
+ "version": "0.3.9",
4
4
  "description": "AML investigation CLI and MCP proxy for blockchain risk, fund-flow tracing, case reports, and GraphRAG MCP access",
5
5
  "homepage": "https://chain-insights.ai",
6
6
  "repository": {
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities-BC3Y5EOi.mjs","names":[],"sources":["../src/mcp/capabilities.ts"],"sourcesContent":["import type { InvestigatorConfig } from '../config/schema.js'\nimport { resolveGraphMcpEndpoint } from './client.js'\n\nexport interface NetworkRetention {\n mode: 'full_history' | 'rolling_window' | 'expanding_then_rolling' | 'bounded_range' | 'unknown' | string\n window_days?: number\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n started_at?: string\n rolls_after_at?: string\n current_window_seconds?: number\n}\n\nexport interface NetworkLayerCapability {\n enabled: boolean\n retention?: NetworkRetention | null\n}\n\nexport interface NetworkCapability {\n network: string\n display_name?: string\n status: string\n default?: boolean\n layers: Record<string, NetworkLayerCapability>\n tools: Record<string, string>\n coverage?: {\n from_block?: number\n to_block?: number\n from_timestamp?: string\n to_timestamp?: string\n chain_tip_block?: number\n blocks_behind_tip?: number\n }\n freshness?: {\n last_processed_at?: string\n last_successful_sync_at?: string\n max_data_age_seconds?: number\n last_processing_duration_seconds?: number\n }\n}\n\nexport interface NetworkCapabilitiesDocument {\n schema: 'chain-insights.network-capabilities.v1'\n networks: NetworkCapability[]\n}\n\nfunction metadataNetworksUrl(endpoint: string): URL {\n const url = new URL(endpoint)\n url.pathname = '/metadata/networks'\n url.search = ''\n url.hash = ''\n return url\n}\n\nexport async function fetchNetworkCapabilities(\n config: Pick<InvestigatorConfig, 'mcpAuthToken' | 'graphMcpAuthToken' | 'graphMcpMode' | 'graphMcpEndpoint' | 'mcpEndpoint'>,\n): Promise<NetworkCapabilitiesDocument> {\n const endpoint = resolveGraphMcpEndpoint(config)\n const request = metadataNetworksUrl(endpoint)\n const headers = new Headers()\n const token = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim()\n if (token) {\n headers.set('X-MCP-Debug-Token', token)\n headers.set('Authorization', `Bearer ${token}`)\n }\n let response: Response\n try {\n response = await fetch(request, { headers })\n } catch (err) {\n throw new Error(`network capabilities unavailable at ${request}: ${(err as Error).message}`)\n }\n if (!response.ok) {\n throw new Error(`network capabilities unavailable at ${request}: HTTP ${response.status}`)\n }\n const parsed = await response.json() as NetworkCapabilitiesDocument\n if (parsed.schema !== 'chain-insights.network-capabilities.v1' || !Array.isArray(parsed.networks)) {\n throw new Error('network capabilities response has unsupported schema')\n }\n return parsed\n}\n\nfunction layerValue(network: NetworkCapability, layer: string): string {\n const capability = network.layers[layer]\n if (!capability?.enabled) return 'no'\n return 'yes'\n}\n\nfunction availableToolsLabel(network: NetworkCapability): string {\n const tools = Object.entries(network.tools ?? {})\n .filter(([, status]) => status === 'available')\n .map(([name]) => name)\n return tools.length > 0 ? tools.join(', ') : 'none'\n}\n\nfunction shortDate(value?: string): string {\n if (!value) return ''\n return value.slice(0, 10)\n}\n\nfunction datasetLabel(network: NetworkCapability): string {\n const coverage = network.coverage\n if (!coverage) return 'unknown'\n const blockRange = coverage.from_block !== undefined && coverage.to_block !== undefined\n ? `${coverage.from_block}..${coverage.to_block}`\n : 'blocks unknown'\n const dateRange = coverage.from_timestamp && coverage.to_timestamp\n ? `${shortDate(coverage.from_timestamp)}..${shortDate(coverage.to_timestamp)}`\n : 'dates unknown'\n if (blockRange === 'blocks unknown' && dateRange === 'dates unknown') return 'unknown'\n return `${blockRange} / ${dateRange}`\n}\n\nexport function formatNetworkCapabilities(document: NetworkCapabilitiesDocument): string {\n if (document.networks.length === 0) return 'No supported networks advertised.'\n const headers = ['Network', 'Topology', 'Facts', 'Risk', 'Dataset', 'Available tools']\n const widths = [14, 10, 8, 8, 38, 64]\n const row = (values: string[]) => values.map((value, index) => value.padEnd(widths[index]!)).join(' ')\n return [\n row(headers),\n widths.map((width) => '-'.repeat(width)).join(' '),\n ...document.networks.map((network) => row([\n network.display_name || network.network,\n layerValue(network, 'topology'),\n layerValue(network, 'facts'),\n layerValue(network, 'risk'),\n datasetLabel(network),\n availableToolsLabel(network),\n ])),\n ].join('\\n')\n}\n"],"mappings":";;AAgDA,SAAS,oBAAoB,UAAuB;CAClD,MAAM,MAAM,IAAI,IAAI,QAAQ;CAC5B,IAAI,WAAW;CACf,IAAI,SAAS;CACb,IAAI,OAAO;CACX,OAAO;AACT;AAEA,eAAsB,yBACpB,QACsC;CAEtC,MAAM,UAAU,oBADC,wBAAwB,MACE,CAAC;CAC5C,MAAM,UAAU,IAAI,QAAQ;CAC5B,MAAM,QAAQ,OAAO,mBAAmB,KAAK,KAAK,OAAO,cAAc,KAAK;CAC5E,IAAI,OAAO;EACT,QAAQ,IAAI,qBAAqB,KAAK;EACtC,QAAQ,IAAI,iBAAiB,UAAU,OAAO;CAChD;CACA,IAAI;CACJ,IAAI;EACF,WAAW,MAAM,MAAM,SAAS,EAAE,QAAQ,CAAC;CAC7C,SAAS,KAAK;EACZ,MAAM,IAAI,MAAM,uCAAuC,QAAQ,IAAK,IAAc,SAAS;CAC7F;CACA,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MAAM,uCAAuC,QAAQ,SAAS,SAAS,QAAQ;CAE3F,MAAM,SAAS,MAAM,SAAS,KAAK;CACnC,IAAI,OAAO,WAAW,4CAA4C,CAAC,MAAM,QAAQ,OAAO,QAAQ,GAC9F,MAAM,IAAI,MAAM,sDAAsD;CAExE,OAAO;AACT;AAEA,SAAS,WAAW,SAA4B,OAAuB;CAErE,IAAI,CADe,QAAQ,OAAO,QACjB,SAAS,OAAO;CACjC,OAAO;AACT;AAEA,SAAS,oBAAoB,SAAoC;CAC/D,MAAM,QAAQ,OAAO,QAAQ,QAAQ,SAAS,CAAC,CAAC,EAC7C,QAAQ,GAAG,YAAY,WAAW,WAAW,EAC7C,KAAK,CAAC,UAAU,IAAI;CACvB,OAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,UAAU,OAAwB;CACzC,IAAI,CAAC,OAAO,OAAO;CACnB,OAAO,MAAM,MAAM,GAAG,EAAE;AAC1B;AAEA,SAAS,aAAa,SAAoC;CACxD,MAAM,WAAW,QAAQ;CACzB,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,aAAa,SAAS,eAAe,KAAA,KAAa,SAAS,aAAa,KAAA,IAC1E,GAAG,SAAS,WAAW,IAAI,SAAS,aACpC;CACJ,MAAM,YAAY,SAAS,kBAAkB,SAAS,eAClD,GAAG,UAAU,SAAS,cAAc,EAAE,IAAI,UAAU,SAAS,YAAY,MACzE;CACJ,IAAI,eAAe,oBAAoB,cAAc,iBAAiB,OAAO;CAC7E,OAAO,GAAG,WAAW,KAAK;AAC5B;AAEA,SAAgB,0BAA0B,UAA+C;CACvF,IAAI,SAAS,SAAS,WAAW,GAAG,OAAO;CAC3C,MAAM,UAAU;EAAC;EAAW;EAAY;EAAS;EAAQ;EAAW;CAAiB;CACrF,MAAM,SAAS;EAAC;EAAI;EAAI;EAAG;EAAG;EAAI;CAAE;CACpC,MAAM,OAAO,WAAqB,OAAO,KAAK,OAAO,UAAU,MAAM,OAAO,OAAO,MAAO,CAAC,EAAE,KAAK,IAAI;CACtG,OAAO;EACL,IAAI,OAAO;EACX,OAAO,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,IAAI;EAClD,GAAG,SAAS,SAAS,KAAK,YAAY,IAAI;GACxC,QAAQ,gBAAgB,QAAQ;GAChC,WAAW,SAAS,UAAU;GAC9B,WAAW,SAAS,OAAO;GAC3B,WAAW,SAAS,MAAM;GAC1B,aAAa,OAAO;GACpB,oBAAoB,OAAO;EAC7B,CAAC,CAAC;CACJ,EAAE,KAAK,IAAI;AACb"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-D4JE7fFF.mjs","names":[],"sources":["../src/mcp/client.ts"],"sourcesContent":["import { wrapFetchWithPaymentFromConfig } from '@x402/fetch'\nimport { ExactEvmScheme } from '@x402/evm'\nimport { UptoEvmScheme } from '@x402/evm/upto/client'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport type { InvestigatorConfig } from '../config/schema.js'\nimport { prepareWalletForPaidCalls } from '../wallet/tools.js'\n\ntype FetchLike = typeof fetch\ntype FetchInput = Parameters<FetchLike>[0]\ntype FetchInit = Parameters<FetchLike>[1]\n\nexport class PaymentRequiredError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'PaymentRequiredError'\n }\n}\n\nfunction createHeaderFetch(authToken: string, baseFetch: FetchLike): FetchLike {\n return (async (input: FetchInput, init?: FetchInit) => {\n const requestHeaders = input instanceof Request ? input.headers : undefined\n const headers = new Headers(init?.headers ?? requestHeaders)\n headers.set('X-MCP-Debug-Token', authToken)\n headers.set('Authorization', `Bearer ${authToken}`)\n\n return baseFetch(input, {\n ...init,\n headers,\n })\n }) as FetchLike\n}\n\nexport const PAYMENT_NEXT_STEPS =\n 'Next steps: run `chain-insights wallet ready` to check funding and finish one-time payment setup, ' +\n 'run `chain-insights wallet topup` if it says the wallet needs USDC, ' +\n 'or `chain-insights access-key set <key>` if you have been given test access.'\n\ninterface PaymentRequirementDetails {\n reason: string\n scheme?: string\n network?: string\n amount?: string\n amountUnits?: bigint\n payTo?: string\n}\n\nfunction paymentRequirementFromResponse(response: Response): PaymentRequirementDetails | null {\n const encoded = response.headers.get('payment-required')\n if (!encoded) return null\n\n try {\n const decoded = Buffer.from(encoded, 'base64').toString('utf8')\n const parsed = JSON.parse(decoded) as {\n error?: unknown\n accepts?: Array<{ scheme?: unknown; network?: unknown; amount?: unknown; payTo?: unknown }>\n }\n const reason = typeof parsed.error === 'string' && parsed.error.trim() ? parsed.error.trim() : 'payment_required'\n const firstRequirement = Array.isArray(parsed.accepts) ? parsed.accepts[0] : undefined\n const amount = typeof firstRequirement?.amount === 'string' ? firstRequirement.amount.trim() : undefined\n return {\n reason,\n scheme: typeof firstRequirement?.scheme === 'string' ? firstRequirement.scheme : undefined,\n network: typeof firstRequirement?.network === 'string' ? firstRequirement.network : undefined,\n amount,\n amountUnits: amount && /^\\d+$/.test(amount) ? BigInt(amount) : undefined,\n payTo: typeof firstRequirement?.payTo === 'string' ? firstRequirement.payTo.trim() : undefined,\n }\n } catch {\n return null\n }\n}\n\nfunction describePaymentRequiredResponse(response: Response, payerAddress?: string): string {\n const requirement = paymentRequirementFromResponse(response)\n if (!requirement) return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n\n try {\n const { reason, payTo } = requirement\n if (payerAddress && payTo && payerAddress.toLowerCase() === payTo.toLowerCase()) {\n return 'Local payment wallet matches the MCP payTo address. Configure a separate payer wallet with USDC on Base; do not use the service recipient wallet as the client payment wallet.'\n }\n const details = [\n requirement.scheme ? `scheme=${requirement.scheme}` : undefined,\n requirement.network ? `network=${requirement.network}` : undefined,\n requirement.amount ? `amount=${requirement.amount}` : undefined,\n ].filter(Boolean).join(' ')\n const message = details ? `x402 payment failed: ${reason} (${details})` : `x402 payment failed: ${reason}`\n if (reason.includes('allowance_required')) {\n return `${message}. The payment wallet needs one-time setup before paid MCP calls can settle. Run \\`chain-insights wallet ready\\`; Base ETH is used for the setup gas.`\n }\n if (reason === 'payment_required') {\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n }\n return `${message}. ${PAYMENT_NEXT_STEPS}`\n } catch {\n return `Payment required — this tool costs USDC on Base via x402 micropayments. ${PAYMENT_NEXT_STEPS}`\n }\n}\n\nfunction createPaymentFailureReportingFetch(\n baseFetch: FetchLike,\n payerAddress?: string,\n paymentWallet?: { address: `0x${string}`; privateKey: `0x${string}` },\n): FetchLike {\n const reportingFetch = (async (input: FetchInput, init?: FetchInit) => {\n const response = await baseFetch(input, init)\n if (response.status !== 402) return response\n const requirement = paymentRequirementFromResponse(response)\n if (paymentWallet && requirement?.reason.includes('allowance_required')) {\n try {\n await prepareWalletForPaidCalls({\n account: paymentWallet,\n ...(requirement.amountUnits === undefined ? {} : { minimumApprovalUnits: requirement.amountUnits }),\n })\n } catch (err) {\n throw new PaymentRequiredError(\n 'Payment setup is not ready yet. Run `chain-insights wallet ready` and try again. ' +\n `${(err as Error).message}`,\n )\n }\n const retryResponse = await baseFetch(input, init)\n if (retryResponse.status !== 402) return retryResponse\n throw new PaymentRequiredError(describePaymentRequiredResponse(retryResponse, payerAddress))\n }\n throw new PaymentRequiredError(describePaymentRequiredResponse(response, payerAddress))\n }) as FetchLike\n return Object.assign(reportingFetch, baseFetch)\n}\n\n/**\n * Creates an x402-payment-wrapped fetch function for the Chain Insights MCP.\n * Payments are made in USDC on Base Mainnet (eip155:8453).\n *\n * The factory is pure — no side effects, no state, no caching.\n * If called with an invalid private key format, viem throws — the error propagates.\n *\n * @param privateKey - 0x-prefixed EVM private key (decrypted from wallet.json)\n * @returns A fetch-compatible function that auto-handles HTTP 402 payment challenges\n */\nexport function createMcpFetchClient(privateKey: `0x${string}`, authToken?: string) {\n const account = privateKeyToAccount(privateKey)\n const paymentFetch = wrapFetchWithPaymentFromConfig(fetch, {\n schemes: [\n {\n network: 'eip155:8453', // Base Mainnet — dynamic MCP pricing uses the x402 upto scheme\n client: new UptoEvmScheme(account),\n },\n {\n network: 'eip155:8453', // Base Mainnet — only supported chain in v1\n client: new ExactEvmScheme(account),\n },\n ],\n })\n const reportingFetch = createPaymentFailureReportingFetch(\n paymentFetch,\n account.address,\n { address: account.address, privateKey },\n )\n return authToken ? createHeaderFetch(authToken, reportingFetch) : reportingFetch\n}\n\n/**\n * Creates a bearer/debug-token fetch for local Graph MCP testing.\n *\n * The public x402 debug bypass expects X-MCP-Debug-Token.\n * Private endpoints commonly expect Authorization: Bearer <token>.\n * Sending both lets one config value work for public debug and private M2M endpoints.\n *\n * Wraps with 402 interception so that if the server still requires payment\n * (e.g. token not accepted for paid tools), the user sees actionable guidance\n * instead of a generic transport error.\n */\nexport function createMcpAuthFetchClient(authToken: string, baseFetch: FetchLike = fetch): FetchLike {\n const headerFetch = createHeaderFetch(authToken, baseFetch)\n return createPaymentFailureReportingFetch(headerFetch)\n}\n\nexport function resolveGraphMcpEndpoint(config: Pick<InvestigatorConfig, 'graphMcpEndpoint' | 'mcpEndpoint'>): string {\n const graphEndpoint = config.graphMcpEndpoint?.trim()\n return graphEndpoint || config.mcpEndpoint\n}\n\nasync function createConfiguredFetchWithToken(\n authToken: string | undefined,\n missingTokenName: string,\n): Promise<FetchLike> {\n const normalizedAuthToken = authToken?.trim()\n if (normalizedAuthToken) return createMcpAuthFetchClient(normalizedAuthToken)\n\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n throw new Error(\n 'Hosted access is not configured. ' +\n 'Run `chain-insights access-key set <key>` for invited test access. ' +\n 'For wallet-paid access, run `chain-insights wallet import <private-key>` once, then run `chain-insights wallet ready`; ' +\n 'run `chain-insights wallet topup` if it says the wallet needs funds.',\n )\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nasync function createConfiguredGraphPaidOrFreeFetch(): Promise<FetchLike> {\n const { isWalletConfigured, decryptKey } = await import('../wallet/index.js')\n if (!(await isWalletConfigured())) {\n return createPaymentFailureReportingFetch(fetch)\n }\n\n const privateKey = await decryptKey()\n return createMcpFetchClient(privateKey as `0x${string}`)\n}\n\nexport async function createConfiguredMcpFetch(config: Pick<InvestigatorConfig, 'mcpAuthToken'>): Promise<FetchLike> {\n return createConfiguredFetchWithToken(config.mcpAuthToken, 'mcpAuthToken')\n}\n\nexport async function createConfiguredGraphMcpFetch(\n config: Pick<InvestigatorConfig, 'mcpAuthToken' | 'graphMcpAuthToken' | 'graphMcpMode'>,\n): Promise<FetchLike> {\n if (config.graphMcpMode === 'debug') {\n const authToken = config.graphMcpAuthToken?.trim() || config.mcpAuthToken?.trim()\n if (!authToken) {\n throw new Error('Graph MCP debug mode requires graphMcpAuthToken. Run `cia access-key set <key>` or `cia debug on --token <token>`.')\n }\n return createMcpAuthFetchClient(authToken)\n }\n\n return createConfiguredGraphPaidOrFreeFetch()\n}\n"],"mappings":"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"}