scoutline 0.1.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.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +146 -0
  3. package/bin/scoutline.js +17 -0
  4. package/dist/commands/code.d.ts +13 -0
  5. package/dist/commands/code.d.ts.map +1 -0
  6. package/dist/commands/code.js +94 -0
  7. package/dist/commands/code.js.map +1 -0
  8. package/dist/commands/doctor.d.ts +10 -0
  9. package/dist/commands/doctor.d.ts.map +1 -0
  10. package/dist/commands/doctor.js +70 -0
  11. package/dist/commands/doctor.js.map +1 -0
  12. package/dist/commands/quota.d.ts +9 -0
  13. package/dist/commands/quota.d.ts.map +1 -0
  14. package/dist/commands/quota.js +77 -0
  15. package/dist/commands/quota.js.map +1 -0
  16. package/dist/commands/read.d.ts +20 -0
  17. package/dist/commands/read.d.ts.map +1 -0
  18. package/dist/commands/read.js +166 -0
  19. package/dist/commands/read.js.map +1 -0
  20. package/dist/commands/repo.d.ts +22 -0
  21. package/dist/commands/repo.d.ts.map +1 -0
  22. package/dist/commands/repo.js +219 -0
  23. package/dist/commands/repo.js.map +1 -0
  24. package/dist/commands/search.d.ts +19 -0
  25. package/dist/commands/search.d.ts.map +1 -0
  26. package/dist/commands/search.js +235 -0
  27. package/dist/commands/search.js.map +1 -0
  28. package/dist/commands/tools.d.ts +22 -0
  29. package/dist/commands/tools.d.ts.map +1 -0
  30. package/dist/commands/tools.js +173 -0
  31. package/dist/commands/tools.js.map +1 -0
  32. package/dist/commands/vision.d.ts +15 -0
  33. package/dist/commands/vision.d.ts.map +1 -0
  34. package/dist/commands/vision.js +168 -0
  35. package/dist/commands/vision.js.map +1 -0
  36. package/dist/index.d.ts +5 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +443 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/lib/api-client.d.ts +133 -0
  41. package/dist/lib/api-client.d.ts.map +1 -0
  42. package/dist/lib/api-client.js +150 -0
  43. package/dist/lib/api-client.js.map +1 -0
  44. package/dist/lib/cache.d.ts +34 -0
  45. package/dist/lib/cache.d.ts.map +1 -0
  46. package/dist/lib/cache.js +168 -0
  47. package/dist/lib/cache.js.map +1 -0
  48. package/dist/lib/code-mode.d.ts +19 -0
  49. package/dist/lib/code-mode.d.ts.map +1 -0
  50. package/dist/lib/code-mode.js +83 -0
  51. package/dist/lib/code-mode.js.map +1 -0
  52. package/dist/lib/config.d.ts +21 -0
  53. package/dist/lib/config.d.ts.map +1 -0
  54. package/dist/lib/config.js +59 -0
  55. package/dist/lib/config.js.map +1 -0
  56. package/dist/lib/errors.d.ts +29 -0
  57. package/dist/lib/errors.d.ts.map +1 -0
  58. package/dist/lib/errors.js +69 -0
  59. package/dist/lib/errors.js.map +1 -0
  60. package/dist/lib/extract.d.ts +37 -0
  61. package/dist/lib/extract.d.ts.map +1 -0
  62. package/dist/lib/extract.js +106 -0
  63. package/dist/lib/extract.js.map +1 -0
  64. package/dist/lib/image.d.ts +13 -0
  65. package/dist/lib/image.d.ts.map +1 -0
  66. package/dist/lib/image.js +102 -0
  67. package/dist/lib/image.js.map +1 -0
  68. package/dist/lib/index.d.ts +10 -0
  69. package/dist/lib/index.d.ts.map +1 -0
  70. package/dist/lib/index.js +10 -0
  71. package/dist/lib/index.js.map +1 -0
  72. package/dist/lib/mcp-client.d.ts +161 -0
  73. package/dist/lib/mcp-client.d.ts.map +1 -0
  74. package/dist/lib/mcp-client.js +494 -0
  75. package/dist/lib/mcp-client.js.map +1 -0
  76. package/dist/lib/mcp-config.d.ts +24 -0
  77. package/dist/lib/mcp-config.d.ts.map +1 -0
  78. package/dist/lib/mcp-config.js +129 -0
  79. package/dist/lib/mcp-config.js.map +1 -0
  80. package/dist/lib/monitor-client.d.ts +51 -0
  81. package/dist/lib/monitor-client.d.ts.map +1 -0
  82. package/dist/lib/monitor-client.js +115 -0
  83. package/dist/lib/monitor-client.js.map +1 -0
  84. package/dist/lib/output.d.ts +24 -0
  85. package/dist/lib/output.d.ts.map +1 -0
  86. package/dist/lib/output.js +59 -0
  87. package/dist/lib/output.js.map +1 -0
  88. package/dist/lib/redact.d.ts +7 -0
  89. package/dist/lib/redact.d.ts.map +1 -0
  90. package/dist/lib/redact.js +50 -0
  91. package/dist/lib/redact.js.map +1 -0
  92. package/dist/lib/silence.d.ts +16 -0
  93. package/dist/lib/silence.d.ts.map +1 -0
  94. package/dist/lib/silence.js +56 -0
  95. package/dist/lib/silence.js.map +1 -0
  96. package/dist/lib/tty.d.ts +60 -0
  97. package/dist/lib/tty.d.ts.map +1 -0
  98. package/dist/lib/tty.js +103 -0
  99. package/dist/lib/tty.js.map +1 -0
  100. package/package.json +60 -0
@@ -0,0 +1,494 @@
1
+ /**
2
+ * MCP (Model Context Protocol) client for Z.AI services using UTCP
3
+ *
4
+ * Supports four MCP servers:
5
+ * - Vision: Image and video analysis (stdio)
6
+ * - ZRead: GitHub repository exploration
7
+ * - Web Search: Real-time web search
8
+ * - Web Reader: Web page content extraction
9
+ */
10
+ import { UtcpClient } from "@utcp/sdk";
11
+ import "@utcp/mcp";
12
+ import crypto from "node:crypto";
13
+ import * as fs from "node:fs/promises";
14
+ import os from "node:os";
15
+ import path from "node:path";
16
+ import { buildMcpCallTemplate, getMcpToolName } from "./mcp-config.js";
17
+ import { ApiError, AuthError, NetworkError, TimeoutError, ValidationError } from "./errors.js";
18
+ import { loadConfig, getMcpEndpoints } from "./config.js";
19
+ import { redactTool } from "./redact.js";
20
+ import { buildCacheKey, readCache, writeCache } from "./cache.js";
21
+ const DEFAULT_TIMEOUT_MS = parseInt(process.env.Z_AI_TIMEOUT || "30000", 10);
22
+ const DEFAULT_RETRY_BASE_MS = parseInt(process.env.ZAI_MCP_RETRY_BASE_MS || "500", 10);
23
+ const DEFAULT_RETRY_MAX_MS = parseInt(process.env.ZAI_MCP_RETRY_MAX_MS || "8000", 10);
24
+ const DEFAULT_RETRY_JITTER_MS = parseInt(process.env.ZAI_MCP_RETRY_JITTER_MS || "250", 10);
25
+ const TOOL_CACHE_VERSION = 1;
26
+ const DEFAULT_TOOL_CACHE_TTL_MS = parseInt(process.env.ZAI_MCP_TOOL_CACHE_TTL_MS || "86400000", 10);
27
+ const TOOL_CACHE_ENABLED = !["0", "false"].includes((process.env.ZAI_MCP_TOOL_CACHE || "1").toLowerCase());
28
+ function sleep(ms) {
29
+ return new Promise((resolve) => setTimeout(resolve, ms));
30
+ }
31
+ function resolveCacheDir() {
32
+ const explicit = process.env.ZAI_MCP_CACHE_DIR || process.env.ZAI_CACHE_DIR;
33
+ if (explicit) {
34
+ return explicit;
35
+ }
36
+ const xdg = process.env.XDG_CACHE_HOME;
37
+ if (xdg) {
38
+ return path.join(xdg, "zai-cli");
39
+ }
40
+ if (process.platform === "darwin") {
41
+ return path.join(os.homedir(), "Library", "Caches", "zai-cli");
42
+ }
43
+ return path.join(os.homedir(), ".cache", "zai-cli");
44
+ }
45
+ /**
46
+ * Unified MCP client for all Z.AI MCP services
47
+ */
48
+ export class ZaiMcpClient {
49
+ client = null;
50
+ initPromise = null;
51
+ isInitialized = false;
52
+ options;
53
+ constructor(options = {}) {
54
+ this.options = options;
55
+ }
56
+ /**
57
+ * Initialize the UTCP client and register all MCP servers
58
+ */
59
+ async init() {
60
+ if (this.isInitialized)
61
+ return;
62
+ if (this.initPromise) {
63
+ return this.initPromise;
64
+ }
65
+ this.initPromise = this._doInit();
66
+ return this.initPromise;
67
+ }
68
+ async _doInit() {
69
+ try {
70
+ this.client = await UtcpClient.create();
71
+ const result = await this.client.registerManual(buildMcpCallTemplate(this.options));
72
+ if (!result.success) {
73
+ throw new ApiError(`Failed to register MCP servers: ${result.errors.join(", ")}`, 500);
74
+ }
75
+ this.isInitialized = true;
76
+ }
77
+ catch (error) {
78
+ this.initPromise = null;
79
+ if (error instanceof ApiError) {
80
+ throw error;
81
+ }
82
+ if (error instanceof Error) {
83
+ if (error.message.includes("401") ||
84
+ error.message.includes("403") ||
85
+ error.message.includes("auth")) {
86
+ throw new AuthError(`Authentication failed: ${error.message}`);
87
+ }
88
+ if (error.message.includes("timeout") || error.message.includes("ETIMEDOUT")) {
89
+ throw new TimeoutError(DEFAULT_TIMEOUT_MS);
90
+ }
91
+ if (error.message.includes("ECONNREFUSED") ||
92
+ error.message.includes("network") ||
93
+ error.message.includes("fetch")) {
94
+ throw new NetworkError(error.message);
95
+ }
96
+ }
97
+ throw new ApiError(`MCP initialization failed: ${error instanceof Error ? error.message : String(error)}`, 500);
98
+ }
99
+ }
100
+ /**
101
+ * Call an MCP tool
102
+ */
103
+ async callTool(toolName, args) {
104
+ // Cache check (unless caller disabled it for this client instance).
105
+ // Vision tool calls are never cached — they're expensive, rarely repeated,
106
+ // and accept arbitrary image inputs.
107
+ const cacheable = !this.options.noCache && !toolName.includes(".vision.");
108
+ if (cacheable) {
109
+ const key = buildCacheKey(toolName, args);
110
+ const hit = await readCache(key);
111
+ if (hit !== null)
112
+ return hit;
113
+ try {
114
+ const result = await this.callToolUncached(toolName, args);
115
+ await writeCache(key, result);
116
+ return result;
117
+ }
118
+ catch (err) {
119
+ throw err;
120
+ }
121
+ }
122
+ return this.callToolUncached(toolName, args);
123
+ }
124
+ async callToolUncached(toolName, args) {
125
+ const maxRetries = this.getRetryCount(toolName);
126
+ let attempt = 0;
127
+ while (true) {
128
+ await this.init();
129
+ if (!this.client) {
130
+ throw new ApiError("MCP client not initialized", 500);
131
+ }
132
+ try {
133
+ const result = await this.client.callTool(toolName, args);
134
+ // The result might be a string or already parsed object
135
+ if (typeof result === "string") {
136
+ try {
137
+ return JSON.parse(result);
138
+ }
139
+ catch {
140
+ return result;
141
+ }
142
+ }
143
+ return result;
144
+ }
145
+ catch (error) {
146
+ attempt += 1;
147
+ if (attempt <= maxRetries && this.isRetriableError(error)) {
148
+ await this.close().catch(() => { });
149
+ const backoff = Math.min(DEFAULT_RETRY_MAX_MS, DEFAULT_RETRY_BASE_MS * Math.pow(2, attempt - 1));
150
+ const jitter = Math.floor(Math.random() * DEFAULT_RETRY_JITTER_MS);
151
+ await sleep(backoff + jitter);
152
+ continue;
153
+ }
154
+ if (error instanceof Error) {
155
+ if (error.message.includes("401") || error.message.includes("403")) {
156
+ throw new AuthError(`Authentication failed: ${error.message}`);
157
+ }
158
+ if (error.message.includes("timeout") || error.message.includes("ETIMEDOUT")) {
159
+ throw new TimeoutError(DEFAULT_TIMEOUT_MS);
160
+ }
161
+ if (error.message.includes("ECONNREFUSED") || error.message.includes("network")) {
162
+ throw new NetworkError(error.message);
163
+ }
164
+ if (error.message.includes("-500") || error.message.includes("Unexpected system error")) {
165
+ throw new ApiError(error.message, -500);
166
+ }
167
+ }
168
+ throw new ApiError(`MCP tool call failed: ${error instanceof Error ? error.message : String(error)}`, 500);
169
+ }
170
+ }
171
+ }
172
+ getRetryCount(toolName) {
173
+ const globalRetries = parseInt(process.env.ZAI_MCP_RETRY_COUNT || "1", 10);
174
+ if (toolName.includes(".vision.")) {
175
+ const visionRetriesRaw = process.env.ZAI_MCP_VISION_RETRY_COUNT || process.env.Z_AI_RETRY_COUNT;
176
+ if (visionRetriesRaw !== undefined) {
177
+ const parsed = parseInt(visionRetriesRaw, 10);
178
+ return Number.isFinite(parsed) ? parsed : 0;
179
+ }
180
+ return 2;
181
+ }
182
+ return Number.isFinite(globalRetries) ? globalRetries : 0;
183
+ }
184
+ isRetriableError(error) {
185
+ if (error instanceof AuthError || error instanceof ValidationError) {
186
+ return false;
187
+ }
188
+ const message = error instanceof Error ? error.message : String(error);
189
+ const normalized = message.toLowerCase();
190
+ if (normalized.includes("401") || normalized.includes("403") || normalized.includes("auth")) {
191
+ return false;
192
+ }
193
+ return (normalized.includes("timeout") ||
194
+ normalized.includes("timed out") ||
195
+ normalized.includes("etimedout") ||
196
+ normalized.includes("econnrefused") ||
197
+ normalized.includes("econnreset") ||
198
+ normalized.includes("network") ||
199
+ normalized.includes("fetch") ||
200
+ normalized.includes("internal network failure") ||
201
+ normalized.includes("unexpected system error") ||
202
+ normalized.includes("http 500") ||
203
+ normalized.includes("http 502") ||
204
+ normalized.includes("http 503") ||
205
+ normalized.includes("http 504") ||
206
+ normalized.includes("rate limit") ||
207
+ normalized.includes("429") ||
208
+ normalized.includes("-500"));
209
+ }
210
+ resolveEnableVision() {
211
+ const envVision = !["0", "false"].includes((process.env.Z_AI_VISION_MCP || "").toLowerCase());
212
+ return this.options.enableVision ?? envVision;
213
+ }
214
+ getToolCacheKey() {
215
+ const config = loadConfig();
216
+ const endpoints = getMcpEndpoints();
217
+ const keyData = {
218
+ mode: config.mode,
219
+ baseUrl: config.baseUrl,
220
+ endpoints,
221
+ enableVision: this.resolveEnableVision(),
222
+ };
223
+ return crypto.createHash("sha256").update(JSON.stringify(keyData)).digest("hex").slice(0, 16);
224
+ }
225
+ getToolCachePath() {
226
+ const cacheDir = resolveCacheDir();
227
+ const key = this.getToolCacheKey();
228
+ return path.join(cacheDir, `tools-${key}.json`);
229
+ }
230
+ async readToolsCache(refresh) {
231
+ if (!TOOL_CACHE_ENABLED || refresh) {
232
+ return null;
233
+ }
234
+ if (DEFAULT_TOOL_CACHE_TTL_MS <= 0) {
235
+ return null;
236
+ }
237
+ try {
238
+ const raw = await fs.readFile(this.getToolCachePath(), "utf8");
239
+ const data = JSON.parse(raw);
240
+ if (!data || data.version !== TOOL_CACHE_VERSION || !Array.isArray(data.tools)) {
241
+ return null;
242
+ }
243
+ const age = Date.now() - (data.timestamp || 0);
244
+ if (age > DEFAULT_TOOL_CACHE_TTL_MS) {
245
+ return null;
246
+ }
247
+ return data.tools;
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ }
253
+ async writeToolsCache(tools) {
254
+ if (!TOOL_CACHE_ENABLED || DEFAULT_TOOL_CACHE_TTL_MS <= 0) {
255
+ return;
256
+ }
257
+ try {
258
+ const cacheDir = resolveCacheDir();
259
+ await fs.mkdir(cacheDir, { recursive: true });
260
+ const payload = {
261
+ version: TOOL_CACHE_VERSION,
262
+ timestamp: Date.now(),
263
+ tools: tools.map((tool) => redactTool(tool)),
264
+ };
265
+ await fs.writeFile(this.getToolCachePath(), JSON.stringify(payload));
266
+ }
267
+ catch {
268
+ // Best-effort cache only.
269
+ }
270
+ }
271
+ /**
272
+ * List all discovered tools from registered MCP servers
273
+ */
274
+ async listTools(refresh = false) {
275
+ const cached = await this.readToolsCache(refresh);
276
+ if (cached) {
277
+ return cached;
278
+ }
279
+ await this.init();
280
+ if (!this.client) {
281
+ throw new ApiError("MCP client not initialized", 500);
282
+ }
283
+ const tools = await this.client.getTools();
284
+ await this.writeToolsCache(tools);
285
+ return tools;
286
+ }
287
+ /**
288
+ * Find a tool by exact name or by suffix match
289
+ */
290
+ async getTool(toolName) {
291
+ let tools = await this.listTools();
292
+ let exact = tools.find((tool) => tool.name === toolName);
293
+ if (exact)
294
+ return exact;
295
+ let suffix = tools.find((tool) => tool.name.endsWith(`.${toolName}`));
296
+ if (suffix)
297
+ return suffix;
298
+ tools = await this.listTools(true);
299
+ exact = tools.find((tool) => tool.name === toolName);
300
+ if (exact)
301
+ return exact;
302
+ return tools.find((tool) => tool.name.endsWith(`.${toolName}`));
303
+ }
304
+ /**
305
+ * Resolve a tool name, accepting full names or suffixes
306
+ */
307
+ async resolveToolName(toolName) {
308
+ const tool = await this.getTool(toolName);
309
+ if (!tool) {
310
+ throw new ApiError(`Unknown tool: ${toolName}`, 400);
311
+ }
312
+ return tool.name;
313
+ }
314
+ /**
315
+ * Call a tool by full name or suffix
316
+ */
317
+ async callToolRaw(toolName, args) {
318
+ const resolved = await this.resolveToolName(toolName);
319
+ return this.callTool(resolved, args);
320
+ }
321
+ // ============ ZRead Methods ============
322
+ /**
323
+ * Search documentation and code in a GitHub repository
324
+ */
325
+ async zreadSearch(repo, query, language) {
326
+ return this.callTool(getMcpToolName("zread", "search_doc"), {
327
+ repo_name: repo,
328
+ query,
329
+ ...(language && { language }),
330
+ });
331
+ }
332
+ /**
333
+ * Get the directory structure of a GitHub repository
334
+ */
335
+ async zreadTree(repo, dirPath) {
336
+ return this.callTool(getMcpToolName("zread", "get_repo_structure"), {
337
+ repo_name: repo,
338
+ ...(dirPath && { dir_path: dirPath }),
339
+ });
340
+ }
341
+ /**
342
+ * Read a file from a GitHub repository
343
+ */
344
+ async zreadFile(repo, path) {
345
+ return this.callTool(getMcpToolName("zread", "read_file"), {
346
+ repo_name: repo,
347
+ file_path: path,
348
+ });
349
+ }
350
+ // ============ Web Search Methods ============
351
+ /**
352
+ * Search the web using WebSearchPrime
353
+ */
354
+ async webSearch(params) {
355
+ const args = {
356
+ search_query: params.query,
357
+ };
358
+ if (params.count) {
359
+ args.count = params.count;
360
+ }
361
+ if (params.domainFilter) {
362
+ args.search_domain_filter = params.domainFilter;
363
+ }
364
+ if (params.recencyFilter) {
365
+ args.search_recency_filter = params.recencyFilter;
366
+ }
367
+ if (params.contentSize) {
368
+ args.content_size = params.contentSize;
369
+ }
370
+ if (params.location) {
371
+ args.location = params.location;
372
+ }
373
+ return this.callTool(getMcpToolName("search", "web_search_prime"), args);
374
+ }
375
+ // ============ Web Reader Methods ============
376
+ /**
377
+ * Read and parse web page content
378
+ */
379
+ async webRead(params) {
380
+ const args = {
381
+ url: params.url,
382
+ };
383
+ if (params.timeout !== undefined) {
384
+ args.timeout = params.timeout;
385
+ }
386
+ if (params.noCache !== undefined) {
387
+ args.no_cache = params.noCache;
388
+ }
389
+ if (params.format) {
390
+ args.return_format = params.format;
391
+ }
392
+ if (params.retainImages !== undefined) {
393
+ args.retain_images = params.retainImages;
394
+ }
395
+ if (params.withLinksSummary !== undefined) {
396
+ args.with_links_summary = params.withLinksSummary;
397
+ }
398
+ if (params.noGfm !== undefined) {
399
+ args.no_gfm = params.noGfm;
400
+ }
401
+ if (params.keepImgDataUrl !== undefined) {
402
+ args.keep_img_data_url = params.keepImgDataUrl;
403
+ }
404
+ if (params.withImagesSummary !== undefined) {
405
+ args.with_images_summary = params.withImagesSummary;
406
+ }
407
+ return this.callTool(getMcpToolName("reader", "webReader"), args);
408
+ }
409
+ // ============ Vision Methods ============
410
+ async visionAnalyze(params) {
411
+ return this.callTool(getMcpToolName("vision", "analyze_image"), {
412
+ image_source: params.imageSource,
413
+ prompt: params.prompt,
414
+ });
415
+ }
416
+ async visionUiToArtifact(params) {
417
+ return this.callTool(getMcpToolName("vision", "ui_to_artifact"), {
418
+ image_source: params.imageSource,
419
+ output_type: params.outputType,
420
+ prompt: params.prompt,
421
+ });
422
+ }
423
+ async visionExtractText(params) {
424
+ return this.callTool(getMcpToolName("vision", "extract_text_from_screenshot"), {
425
+ image_source: params.imageSource,
426
+ prompt: params.prompt,
427
+ ...(params.programmingLanguage && { programming_language: params.programmingLanguage }),
428
+ });
429
+ }
430
+ async visionDiagnoseError(params) {
431
+ return this.callTool(getMcpToolName("vision", "diagnose_error_screenshot"), {
432
+ image_source: params.imageSource,
433
+ prompt: params.prompt,
434
+ ...(params.context && { context: params.context }),
435
+ });
436
+ }
437
+ async visionDiagram(params) {
438
+ return this.callTool(getMcpToolName("vision", "understand_technical_diagram"), {
439
+ image_source: params.imageSource,
440
+ prompt: params.prompt,
441
+ ...(params.diagramType && { diagram_type: params.diagramType }),
442
+ });
443
+ }
444
+ async visionChart(params) {
445
+ return this.callTool(getMcpToolName("vision", "analyze_data_visualization"), {
446
+ image_source: params.imageSource,
447
+ prompt: params.prompt,
448
+ ...(params.focus && { analysis_focus: params.focus }),
449
+ });
450
+ }
451
+ async visionDiff(params) {
452
+ return this.callTool(getMcpToolName("vision", "ui_diff_check"), {
453
+ expected_image_source: params.expectedImageSource,
454
+ actual_image_source: params.actualImageSource,
455
+ prompt: params.prompt,
456
+ });
457
+ }
458
+ async visionVideo(params) {
459
+ return this.callTool(getMcpToolName("vision", "analyze_video"), {
460
+ video_source: params.videoSource,
461
+ prompt: params.prompt,
462
+ });
463
+ }
464
+ /**
465
+ * Close the MCP client and cleanup resources
466
+ */
467
+ async close(timeoutMs = 2000) {
468
+ if (this.client) {
469
+ await Promise.race([
470
+ this.client.close(),
471
+ new Promise((resolve) => setTimeout(resolve, timeoutMs)),
472
+ ]);
473
+ this.client = null;
474
+ this.isInitialized = false;
475
+ this.initPromise = null;
476
+ }
477
+ }
478
+ }
479
+ // Legacy exports for backward compatibility
480
+ export class ZReadMcpClient extends ZaiMcpClient {
481
+ constructor(options = {}) {
482
+ super(options);
483
+ }
484
+ async searchDoc(repo, query, language) {
485
+ return this.zreadSearch(repo, query, language);
486
+ }
487
+ async getRepoStructure(repo, dirPath) {
488
+ return this.zreadTree(repo, dirPath);
489
+ }
490
+ async readFile(repo, path) {
491
+ return this.zreadFile(repo, path);
492
+ }
493
+ }
494
+ //# sourceMappingURL=mcp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-client.js","sourceRoot":"","sources":["../../src/lib/mcp-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Shared MCP configuration for Z.AI services
3
+ */
4
+ export declare const MCP_MANUAL_NAME = "scoutline.zai";
5
+ export declare const MCP_SERVERS: {
6
+ readonly vision: "vision";
7
+ readonly search: "search";
8
+ readonly reader: "reader";
9
+ readonly zread: "zread";
10
+ };
11
+ export type McpServerName = keyof typeof MCP_SERVERS;
12
+ export interface McpTemplateOptions {
13
+ enableVision?: boolean;
14
+ }
15
+ export declare function buildMcpCallTemplate(options?: McpTemplateOptions): {
16
+ name: string;
17
+ call_template_type: string;
18
+ config: {
19
+ mcpServers: Record<string, unknown>;
20
+ };
21
+ register_resources_as_tools: boolean;
22
+ };
23
+ export declare function getMcpToolName(server: McpServerName, tool: string): string;
24
+ //# sourceMappingURL=mcp-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,eAAO,MAAM,eAAe,kBAAkB,CAAC;AAC/C,eAAO,MAAM,WAAW;aACtB,MAAM,EAAE,QAAQ;aAChB,MAAM,EAAE,QAAQ;aAChB,MAAM,EAAE,QAAQ;aAChB,KAAK,EAAE,OAAO;CACN,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,WAAW,CAAC;AA4BrD,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,kBAAuB;;;;;;;EAgGpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1E"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Shared MCP configuration for Z.AI services
3
+ */
4
+ import { loadConfig, getApiKey, getMcpEndpoints } from "./config.js";
5
+ export const MCP_MANUAL_NAME = "scoutline.zai";
6
+ export const MCP_SERVERS = {
7
+ vision: "vision",
8
+ search: "search",
9
+ reader: "reader",
10
+ zread: "zread",
11
+ };
12
+ function ensureTrailingSlash(value) {
13
+ return value.endsWith("/") ? value : `${value}/`;
14
+ }
15
+ function parseArgs(value, fallback) {
16
+ if (!value)
17
+ return fallback;
18
+ const trimmed = value.trim();
19
+ if (!trimmed)
20
+ return fallback;
21
+ if (trimmed.startsWith("[")) {
22
+ try {
23
+ const parsed = JSON.parse(trimmed);
24
+ if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
25
+ return parsed;
26
+ }
27
+ }
28
+ catch {
29
+ // Fall through to space-split
30
+ }
31
+ }
32
+ return trimmed.split(/\s+/);
33
+ }
34
+ function toEnvString(value) {
35
+ if (value === undefined)
36
+ return undefined;
37
+ return String(value);
38
+ }
39
+ export function buildMcpCallTemplate(options = {}) {
40
+ const config = loadConfig();
41
+ const apiKey = getApiKey();
42
+ const endpoints = getMcpEndpoints();
43
+ const timeoutSeconds = Math.max(1, Math.ceil(config.timeout / 1000));
44
+ const sseReadTimeoutSeconds = Math.max(1, Math.ceil(config.timeout / 1000));
45
+ const visionCommand = process.env.Z_AI_VISION_MCP_COMMAND || "npx";
46
+ const visionArgs = parseArgs(process.env.Z_AI_VISION_MCP_ARGS, ["-y", "@z_ai/mcp-server@latest"]);
47
+ const visionCwd = process.env.Z_AI_VISION_MCP_CWD || process.cwd();
48
+ const mode = config.mode;
49
+ const baseUrl = ensureTrailingSlash(config.baseUrl);
50
+ const visionEnv = {
51
+ Z_AI_API_KEY: apiKey,
52
+ Z_AI_BASE_URL: baseUrl,
53
+ Z_AI_MODE: mode,
54
+ PLATFORM_MODE: mode,
55
+ };
56
+ const envEntries = [
57
+ ["Z_AI_VISION_MODEL", toEnvString(config.visionModel)],
58
+ ["Z_AI_VISION_MODEL_TEMPERATURE", toEnvString(config.temperature)],
59
+ ["Z_AI_VISION_MODEL_TOP_P", toEnvString(config.topP)],
60
+ ["Z_AI_VISION_MODEL_MAX_TOKENS", toEnvString(config.maxTokens)],
61
+ ["Z_AI_TIMEOUT", toEnvString(config.timeout)],
62
+ ["Z_AI_RETRY_COUNT", toEnvString(process.env.Z_AI_RETRY_COUNT)],
63
+ ];
64
+ for (const [key, value] of envEntries) {
65
+ if (value !== undefined) {
66
+ visionEnv[key] = value;
67
+ }
68
+ }
69
+ const envVision = !["0", "false"].includes((process.env.Z_AI_VISION_MCP || "").toLowerCase());
70
+ const enableVision = options.enableVision ?? envVision;
71
+ const mcpServers = {
72
+ search: {
73
+ transport: "http",
74
+ url: endpoints.WEB_SEARCH,
75
+ headers: {
76
+ Authorization: `Bearer ${apiKey}`,
77
+ Accept: "application/json, text/event-stream",
78
+ "Content-Type": "application/json",
79
+ },
80
+ timeout: timeoutSeconds,
81
+ sse_read_timeout: sseReadTimeoutSeconds,
82
+ terminate_on_close: true,
83
+ },
84
+ reader: {
85
+ transport: "http",
86
+ url: endpoints.WEB_READER,
87
+ headers: {
88
+ Authorization: `Bearer ${apiKey}`,
89
+ Accept: "application/json, text/event-stream",
90
+ "Content-Type": "application/json",
91
+ },
92
+ timeout: timeoutSeconds,
93
+ sse_read_timeout: sseReadTimeoutSeconds,
94
+ terminate_on_close: true,
95
+ },
96
+ zread: {
97
+ transport: "http",
98
+ url: endpoints.ZREAD,
99
+ headers: {
100
+ Authorization: `Bearer ${apiKey}`,
101
+ Accept: "application/json, text/event-stream",
102
+ "Content-Type": "application/json",
103
+ },
104
+ timeout: timeoutSeconds,
105
+ sse_read_timeout: sseReadTimeoutSeconds,
106
+ terminate_on_close: true,
107
+ },
108
+ };
109
+ if (enableVision) {
110
+ mcpServers.vision = {
111
+ transport: "stdio",
112
+ command: visionCommand,
113
+ args: visionArgs,
114
+ cwd: visionCwd,
115
+ env: visionEnv,
116
+ timeout: timeoutSeconds,
117
+ };
118
+ }
119
+ return {
120
+ name: MCP_MANUAL_NAME,
121
+ call_template_type: "mcp",
122
+ config: { mcpServers },
123
+ register_resources_as_tools: false,
124
+ };
125
+ }
126
+ export function getMcpToolName(server, tool) {
127
+ return `${MCP_MANUAL_NAME}.${MCP_SERVERS[server]}.${tool}`;
128
+ }
129
+ //# sourceMappingURL=mcp-config.js.map