@kodycodes/cli 1.0.1 → 1.2.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.
@@ -0,0 +1,427 @@
1
+ import { join } from 'node:path';
2
+ import { haystackMatches, nameEquals } from './process-info.js';
3
+ export const hostIds = [
4
+ 'amazon-q',
5
+ 'antigravity',
6
+ 'claude-code',
7
+ 'claude-desktop',
8
+ 'cline',
9
+ 'cline-cli',
10
+ 'codex',
11
+ 'copilot-cli',
12
+ 'cursor',
13
+ 'fx',
14
+ 'gemini-cli',
15
+ 'goose',
16
+ 'grok-build',
17
+ 'jetbrains',
18
+ 'kilo-code',
19
+ 'kimi-code',
20
+ 'kiro-cli',
21
+ 'mastracode',
22
+ 'mcporter',
23
+ 'opencode',
24
+ 'pi',
25
+ 'qwen-code',
26
+ 'visual-studio',
27
+ 'vscode',
28
+ 'vscode-insiders',
29
+ 'windsurf',
30
+ 'zed',
31
+ ];
32
+ const hostAliases = {
33
+ 'cline-vscode': 'cline',
34
+ codeium: 'windsurf',
35
+ cascade: 'windsurf',
36
+ gemini: 'gemini-cli',
37
+ 'github-copilot-cli': 'copilot-cli',
38
+ kilo: 'kilo-code',
39
+ kilocode: 'kilo-code',
40
+ kimi: 'kimi-code',
41
+ kiro: 'kiro-cli',
42
+ mastra: 'mastracode',
43
+ 'pi-agent': 'pi',
44
+ };
45
+ function isClaudeDesktop(process) {
46
+ if (haystackMatches(process, /Claude\.app|claude-desktop|Claude Helper/iu)) {
47
+ return true;
48
+ }
49
+ const raw = process.name.replace(/\.exe$/iu, '').trim();
50
+ return raw === 'Claude' || raw.startsWith('Claude ');
51
+ }
52
+ export function isHostId(value) {
53
+ return hostIds.includes(value);
54
+ }
55
+ export function parseHostIds(raw) {
56
+ const ids = raw
57
+ .split(',')
58
+ .map((part) => part.trim())
59
+ .filter(Boolean);
60
+ if (ids.length === 0) {
61
+ throw new Error(`Provide at least one client id. Known: ${hostIds.join(', ')}`);
62
+ }
63
+ const known = [];
64
+ for (const id of ids) {
65
+ if (id === 'grok' || id === 'chatgpt' || id === 'claude.ai') {
66
+ throw new Error(`"${id}" is a web client. For the local Grok Build CLI use grok-build. For web-based clients see https://kody.codes/onboarding`);
67
+ }
68
+ const resolved = hostAliases[id] ?? id;
69
+ if (!isHostId(resolved)) {
70
+ throw new Error(`Unknown client "${id}". Known: ${hostIds.join(', ')}`);
71
+ }
72
+ known.push(resolved);
73
+ }
74
+ return known;
75
+ }
76
+ const jetbrainsNames = [
77
+ 'clion',
78
+ 'datagrip',
79
+ 'goland',
80
+ 'idea',
81
+ 'idea64',
82
+ 'intellij',
83
+ 'phpstorm',
84
+ 'pycharm',
85
+ 'pycharm64',
86
+ 'rider',
87
+ 'rubymine',
88
+ 'rustrover',
89
+ 'webstorm',
90
+ 'webstorm64',
91
+ ];
92
+ export const hostCatalog = [
93
+ {
94
+ id: 'cursor',
95
+ label: 'Cursor',
96
+ kind: 'file',
97
+ matches: (process) => nameEquals(process, 'cursor') || haystackMatches(process, /Cursor\.app/iu),
98
+ },
99
+ {
100
+ id: 'vscode-insiders',
101
+ label: 'VS Code Insiders',
102
+ kind: 'file',
103
+ matches: (process) => /insiders/iu.test(process.name) &&
104
+ (/code/iu.test(process.name) || haystackMatches(process, /code/iu)),
105
+ },
106
+ {
107
+ id: 'vscode',
108
+ label: 'VS Code',
109
+ kind: 'file',
110
+ matches: (process) => {
111
+ if (haystackMatches(process, /insiders|cursor|windsurf|antigravity/iu))
112
+ return false;
113
+ const base = process.name.replace(/\.exe$/iu, '').trim().toLowerCase();
114
+ return (base === 'code' ||
115
+ base === 'code - oss' ||
116
+ base.startsWith('code helper') ||
117
+ haystackMatches(process, /Visual Studio Code\.app/iu));
118
+ },
119
+ },
120
+ {
121
+ id: 'claude-desktop',
122
+ label: 'Claude Desktop',
123
+ kind: 'manual',
124
+ matches: isClaudeDesktop,
125
+ },
126
+ {
127
+ id: 'claude-code',
128
+ label: 'Claude Code',
129
+ kind: 'command',
130
+ matches: (process) => nameEquals(process, 'claude') && !isClaudeDesktop(process),
131
+ },
132
+ {
133
+ id: 'codex',
134
+ label: 'Codex',
135
+ kind: 'file',
136
+ matches: (process) => nameEquals(process, 'codex') || haystackMatches(process, /Codex\.app/iu),
137
+ },
138
+ {
139
+ id: 'opencode',
140
+ label: 'OpenCode',
141
+ kind: 'file',
142
+ matches: (process) => nameEquals(process, 'opencode'),
143
+ },
144
+ {
145
+ id: 'goose',
146
+ label: 'Goose',
147
+ kind: 'file',
148
+ matches: (process) => nameEquals(process, 'goose', 'goosed') || haystackMatches(process, /Goose\.app/iu),
149
+ },
150
+ {
151
+ id: 'windsurf',
152
+ label: 'Windsurf',
153
+ kind: 'file',
154
+ matches: (process) => nameEquals(process, 'windsurf') || haystackMatches(process, /Windsurf\.app/iu),
155
+ },
156
+ {
157
+ id: 'zed',
158
+ label: 'Zed',
159
+ kind: 'file',
160
+ matches: (process) => nameEquals(process, 'zed') || haystackMatches(process, /Zed\.app/iu),
161
+ },
162
+ {
163
+ id: 'copilot-cli',
164
+ label: 'Copilot CLI',
165
+ kind: 'command',
166
+ matches: (process) => nameEquals(process, 'copilot'),
167
+ },
168
+ {
169
+ id: 'gemini-cli',
170
+ label: 'Gemini CLI',
171
+ kind: 'command',
172
+ matches: (process) => nameEquals(process, 'gemini'),
173
+ },
174
+ {
175
+ id: 'qwen-code',
176
+ label: 'Qwen Code',
177
+ kind: 'file',
178
+ matches: (process) => nameEquals(process, 'qwen'),
179
+ },
180
+ {
181
+ id: 'amazon-q',
182
+ label: 'Amazon Q',
183
+ kind: 'file',
184
+ matches: (process) => haystackMatches(process, /amazon.?q/iu) ||
185
+ (nameEquals(process, 'q') && haystackMatches(process, /amazon/iu)),
186
+ },
187
+ {
188
+ id: 'antigravity',
189
+ label: 'Antigravity',
190
+ kind: 'file',
191
+ matches: (process) => nameEquals(process, 'antigravity') || haystackMatches(process, /Antigravity\.app/iu),
192
+ },
193
+ {
194
+ id: 'cline',
195
+ label: 'Cline',
196
+ kind: 'file',
197
+ matches: (process) => nameEquals(process, 'cline-vscode') || haystackMatches(process, /cline-vscode/iu),
198
+ },
199
+ {
200
+ id: 'cline-cli',
201
+ label: 'Cline CLI',
202
+ kind: 'command',
203
+ matches: (process) => nameEquals(process, 'cline'),
204
+ },
205
+ {
206
+ id: 'grok-build',
207
+ label: 'Grok Build',
208
+ kind: 'file',
209
+ matches: (process) => nameEquals(process, 'grok'),
210
+ },
211
+ {
212
+ id: 'mcporter',
213
+ label: 'MCPorter',
214
+ kind: 'file',
215
+ matches: (process) => nameEquals(process, 'mcporter'),
216
+ },
217
+ {
218
+ id: 'kilo-code',
219
+ label: 'Kilo Code',
220
+ kind: 'file',
221
+ matches: (process) => nameEquals(process, 'kilo') ||
222
+ haystackMatches(process, /Kilo\.app|kilocode\.kilo-code|kilo-code/iu),
223
+ },
224
+ {
225
+ id: 'kimi-code',
226
+ label: 'Kimi Code',
227
+ kind: 'command',
228
+ matches: (process) => nameEquals(process, 'kimi'),
229
+ },
230
+ {
231
+ id: 'kiro-cli',
232
+ label: 'Kiro CLI',
233
+ kind: 'file',
234
+ matches: (process) => nameEquals(process, 'kiro') || haystackMatches(process, /Kiro\.app/iu),
235
+ },
236
+ {
237
+ id: 'mastracode',
238
+ label: 'Mastra Code',
239
+ kind: 'file',
240
+ matches: (process) => nameEquals(process, 'mastra', 'mastracode'),
241
+ },
242
+ {
243
+ id: 'fx',
244
+ label: 'fx',
245
+ kind: 'file',
246
+ matches: (process) => nameEquals(process, 'fx'),
247
+ },
248
+ {
249
+ id: 'pi',
250
+ label: 'Pi',
251
+ kind: 'file',
252
+ matches: (process) => nameEquals(process, 'pi'),
253
+ },
254
+ {
255
+ id: 'visual-studio',
256
+ label: 'Visual Studio',
257
+ kind: 'file',
258
+ matches: (process) => nameEquals(process, 'devenv'),
259
+ },
260
+ {
261
+ id: 'jetbrains',
262
+ label: 'JetBrains IDE',
263
+ kind: 'manual',
264
+ matches: (process) => nameEquals(process, ...jetbrainsNames) ||
265
+ haystackMatches(process, /IntelliJ IDEA|PyCharm|WebStorm|GoLand|RustRover|PhpStorm|CLion|Rider|RubyMine|DataGrip/u),
266
+ },
267
+ ];
268
+ export function hostById(id) {
269
+ const host = hostCatalog.find((candidate) => candidate.id === id);
270
+ if (!host)
271
+ throw new Error(`Unknown host: ${id}`);
272
+ return host;
273
+ }
274
+ export function configHome(home, platform = process.platform) {
275
+ return platform === 'win32' ? join(home, 'AppData', 'Roaming') : join(home, '.config');
276
+ }
277
+ export function applicationSupport(home, app, platform = process.platform) {
278
+ if (platform === 'darwin')
279
+ return join(home, 'Library', 'Application Support', app);
280
+ if (platform === 'win32')
281
+ return join(home, 'AppData', 'Roaming', app);
282
+ return join(home, '.config', app);
283
+ }
284
+ export function hostConfigPath(input) {
285
+ const platform = input.platform ?? process.platform;
286
+ if (input.project) {
287
+ switch (input.id) {
288
+ case 'cursor':
289
+ return join(input.cwd, '.cursor', 'mcp.json');
290
+ case 'vscode':
291
+ case 'vscode-insiders':
292
+ case 'copilot-cli':
293
+ return join(input.cwd, '.vscode', 'mcp.json');
294
+ case 'claude-code':
295
+ return join(input.cwd, '.mcp.json');
296
+ case 'opencode':
297
+ return join(input.cwd, 'opencode.json');
298
+ case 'codex':
299
+ return join(input.cwd, '.codex', 'config.toml');
300
+ case 'gemini-cli':
301
+ return join(input.cwd, '.gemini', 'settings.json');
302
+ case 'qwen-code':
303
+ return join(input.cwd, '.qwen', 'settings.json');
304
+ case 'amazon-q':
305
+ return join(input.cwd, '.amazonq', 'mcp.json');
306
+ case 'zed':
307
+ return join(input.cwd, '.zed', 'settings.json');
308
+ case 'grok-build':
309
+ return join(input.cwd, '.grok', 'config.toml');
310
+ case 'mcporter':
311
+ return join(input.cwd, 'config', 'mcporter.json');
312
+ case 'kilo-code':
313
+ return join(input.cwd, 'kilo.json');
314
+ case 'kimi-code':
315
+ return join(input.cwd, '.kimi-code', 'mcp.json');
316
+ case 'kiro-cli':
317
+ return join(input.cwd, '.kiro', 'settings', 'mcp.json');
318
+ case 'mastracode':
319
+ return join(input.cwd, '.mastracode', 'mcp.json');
320
+ case 'pi':
321
+ return join(input.cwd, '.pi', 'mcp.json');
322
+ case 'antigravity':
323
+ case 'claude-desktop':
324
+ case 'cline':
325
+ case 'cline-cli':
326
+ case 'fx':
327
+ case 'goose':
328
+ case 'windsurf':
329
+ case 'visual-studio':
330
+ case 'jetbrains':
331
+ return null;
332
+ default: {
333
+ const exhaustive = input.id;
334
+ return exhaustive;
335
+ }
336
+ }
337
+ }
338
+ switch (input.id) {
339
+ case 'cursor':
340
+ return join(input.home, '.cursor', 'mcp.json');
341
+ case 'vscode':
342
+ return join(applicationSupport(input.home, 'Code', platform), 'User', 'mcp.json');
343
+ case 'vscode-insiders':
344
+ return join(applicationSupport(input.home, 'Code - Insiders', platform), 'User', 'mcp.json');
345
+ case 'claude-code':
346
+ return join(input.home, '.claude.json');
347
+ case 'codex':
348
+ return join(input.home, '.codex', 'config.toml');
349
+ case 'opencode':
350
+ return join(configHome(input.home, platform), 'opencode', 'opencode.json');
351
+ case 'goose':
352
+ return join(configHome(input.home, platform), 'goose', 'config.yaml');
353
+ case 'windsurf':
354
+ return join(input.home, '.codeium', 'windsurf', 'mcp_config.json');
355
+ case 'zed':
356
+ return join(configHome(input.home, platform), 'zed', 'settings.json');
357
+ case 'copilot-cli':
358
+ return join(input.home, '.copilot', 'mcp-config.json');
359
+ case 'gemini-cli':
360
+ return join(input.home, '.gemini', 'settings.json');
361
+ case 'qwen-code':
362
+ return join(input.home, '.qwen', 'settings.json');
363
+ case 'amazon-q':
364
+ return join(input.home, '.aws', 'amazonq', 'mcp.json');
365
+ case 'antigravity':
366
+ return join(input.home, '.gemini', 'config', 'mcp_config.json');
367
+ case 'cline':
368
+ return join(applicationSupport(input.home, 'Code', platform), 'User', 'globalStorage', 'saoudrizwan.claude-dev', 'settings', 'cline_mcp_settings.json');
369
+ case 'cline-cli':
370
+ return join(input.home, '.cline', 'data', 'settings', 'cline_mcp_settings.json');
371
+ case 'grok-build':
372
+ return join(input.home, '.grok', 'config.toml');
373
+ case 'mcporter':
374
+ return join(input.home, '.mcporter', 'mcporter.json');
375
+ case 'kilo-code':
376
+ return join(configHome(input.home, platform), 'kilo', 'kilo.json');
377
+ case 'kimi-code':
378
+ return join(input.home, '.kimi-code', 'mcp.json');
379
+ case 'kiro-cli':
380
+ return join(input.home, '.kiro', 'settings', 'mcp.json');
381
+ case 'mastracode':
382
+ return join(input.home, '.mastracode', 'mcp.json');
383
+ case 'fx':
384
+ return join(input.home, '.fx', 'mcp.json');
385
+ case 'pi':
386
+ return join(input.home, '.pi', 'agent', 'mcp.json');
387
+ case 'visual-studio':
388
+ return join(input.home, '.mcp.json');
389
+ case 'claude-desktop':
390
+ case 'jetbrains':
391
+ return null;
392
+ default: {
393
+ const exhaustive = input.id;
394
+ return exhaustive;
395
+ }
396
+ }
397
+ }
398
+ export function encodeBase64Url(value) {
399
+ return Buffer.from(value)
400
+ .toString('base64')
401
+ .replaceAll('+', '-')
402
+ .replaceAll('/', '_')
403
+ .replace(/=+$/u, '');
404
+ }
405
+ export function buildCursorInstallUrl(mcpServerUrl) {
406
+ const config = encodeBase64Url(JSON.stringify({ url: mcpServerUrl }));
407
+ return `cursor://anysphere.cursor-deeplink/mcp/install?name=kody&config=${config}`;
408
+ }
409
+ export function buildVsCodeInstallUrl(mcpServerUrl, scheme = 'vscode') {
410
+ const config = encodeURIComponent(JSON.stringify({
411
+ name: 'kody',
412
+ type: 'http',
413
+ url: mcpServerUrl,
414
+ }));
415
+ return `${scheme}:mcp/install?${config}`;
416
+ }
417
+ export function buildGooseInstallUrl(mcpServerUrl) {
418
+ const params = new URLSearchParams({
419
+ url: mcpServerUrl,
420
+ type: 'streamable_http',
421
+ id: 'kody',
422
+ name: 'Kody',
423
+ description: 'Kody personal assistant',
424
+ });
425
+ return `goose://extension?${params.toString()}`;
426
+ }
427
+ //# sourceMappingURL=host-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-catalog.js","sourceRoot":"","sources":["../src/host-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAoB,MAAM,mBAAmB,CAAA;AAEjF,MAAM,CAAC,MAAM,OAAO,GAAG;IACtB,UAAU;IACV,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,OAAO;IACP,WAAW;IACX,OAAO;IACP,aAAa;IACb,QAAQ;IACR,IAAI;IACJ,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,WAAW;IACX,WAAW;IACX,WAAW;IACX,UAAU;IACV,YAAY;IACZ,UAAU;IACV,UAAU;IACV,IAAI;IACJ,WAAW;IACX,eAAe;IACf,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,KAAK;CACI,CAAA;AAaV,MAAM,WAAW,GAA2B;IAC3C,cAAc,EAAE,OAAO;IACvB,OAAO,EAAE,UAAU;IACnB,OAAO,EAAE,UAAU;IACnB,MAAM,EAAE,YAAY;IACpB,oBAAoB,EAAE,aAAa;IACnC,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,WAAW;IACrB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,YAAY;IACpB,UAAU,EAAE,IAAI;CAChB,CAAA;AAED,SAAS,eAAe,CAAC,OAAoB;IAC5C,IAAI,eAAe,CAAC,OAAO,EAAE,4CAA4C,CAAC,EAAE,CAAC;QAC5E,OAAO,IAAI,CAAA;IACZ,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACvD,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACrC,OAAQ,OAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACvC,MAAM,GAAG,GAAG,GAAG;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAA;IACjB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,KAAK,GAAkB,EAAE,CAAA;IAC/B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CACd,IAAI,EAAE,yHAAyH,CAC/H,CAAA;QACF,CAAC;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,CAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,aAAa,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACrB,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC;AAED,MAAM,cAAc,GAAG;IACtB,OAAO;IACP,UAAU;IACV,QAAQ;IACR,MAAM;IACN,QAAQ;IACR,UAAU;IACV,UAAU;IACV,SAAS;IACT,WAAW;IACX,OAAO;IACP,UAAU;IACV,WAAW;IACX,UAAU;IACV,YAAY;CACZ,CAAA;AAED,MAAM,CAAC,MAAM,WAAW,GAAkC;IACzD;QACC,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,eAAe,CAAC;KAC3E;IACD;QACC,EAAE,EAAE,iBAAiB;QACrB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAC/B,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;KACpE;IACD;QACC,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACpB,IAAI,eAAe,CAAC,OAAO,EAAE,wCAAwC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACpF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;YACtE,OAAO,CACN,IAAI,KAAK,MAAM;gBACf,IAAI,KAAK,YAAY;gBACrB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;gBAC9B,eAAe,CAAC,OAAO,EAAE,2BAA2B,CAAC,CACrD,CAAA;QACF,CAAC;KACD;IACD;QACC,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,gBAAgB;QACvB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,eAAe;KACxB;IACD;QACC,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;KAChF;IACD;QACC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC;KACzE;IACD;QACC,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;IACD;QACC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC;KACnF;IACD;QACC,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,iBAAiB,CAAC;KAC/E;IACD;QACC,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC;KAC1F;IACD;QACC,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;KACpD;IACD;QACC,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC;KACnD;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;KACjD;IACD;QACC,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC;YACvC,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;KACnE;IACD;QACC,EAAE,EAAE,aAAa;QACjB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,oBAAoB,CAAC;KACrF;IACD;QACC,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,gBAAgB,CAAC;KACvG;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC;KAClD;IACD;QACC,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;KACjD;IACD;QACC,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC;KACrD;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;YAC3B,eAAe,CAAC,OAAO,EAAE,2CAA2C,CAAC;KACtE;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC;KACjD;IACD;QACC,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,UAAU;QACjB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC;KACvE;IACD;QACC,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,aAAa;QACpB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,CAAC;KACjE;IACD;QACC,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;KAC/C;IACD;QACC,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC;KAC/C;IACD;QACC,EAAE,EAAE,eAAe;QACnB,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC;KACnD;IACD;QACC,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,eAAe;QACtB,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CACpB,UAAU,CAAC,OAAO,EAAE,GAAG,cAAc,CAAC;YACtC,eAAe,CACd,OAAO,EACP,yFAAyF,CACzF;KACF;CACD,CAAA;AAED,MAAM,UAAU,QAAQ,CAAC,EAAU;IAClC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACjE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;IACjD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACpF,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;AACvF,CAAC;AAED,MAAM,UAAU,kBAAkB,CACjC,IAAY,EACZ,GAAW,EACX,WAA4B,OAAO,CAAC,QAAQ;IAE5C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAA;IACnF,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;IACtE,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAM9B;IACA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAA;IACnD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACZ,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;YAC9C,KAAK,QAAQ,CAAC;YACd,KAAK,iBAAiB,CAAC;YACvB,KAAK,aAAa;gBACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;YAC9C,KAAK,aAAa;gBACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YACpC,KAAK,UAAU;gBACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,eAAe,CAAC,CAAA;YACxC,KAAK,OAAO;gBACX,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;YAChD,KAAK,YAAY;gBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,eAAe,CAAC,CAAA;YACnD,KAAK,WAAW;gBACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;YACjD,KAAK,UAAU;gBACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;YAC/C,KAAK,KAAK;gBACT,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,CAAA;YAChD,KAAK,YAAY;gBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;YAC/C,KAAK,UAAU;gBACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAA;YAClD,KAAK,WAAW;gBACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;YACpC,KAAK,WAAW;gBACf,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;YACjD,KAAK,UAAU;gBACd,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;YACxD,KAAK,YAAY;gBAChB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;YAClD,KAAK,IAAI;gBACR,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;YAC1C,KAAK,aAAa,CAAC;YACnB,KAAK,gBAAgB,CAAC;YACtB,KAAK,OAAO,CAAC;YACb,KAAK,WAAW,CAAC;YACjB,KAAK,IAAI,CAAC;YACV,KAAK,OAAO,CAAC;YACb,KAAK,UAAU,CAAC;YAChB,KAAK,eAAe,CAAC;YACrB,KAAK,WAAW;gBACf,OAAO,IAAI,CAAA;YACZ,OAAO,CAAC,CAAC,CAAC;gBACT,MAAM,UAAU,GAAU,KAAK,CAAC,EAAE,CAAA;gBAClC,OAAO,UAAU,CAAA;YAClB,CAAC;QACF,CAAC;IACF,CAAC;IACD,QAAQ,KAAK,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/C,KAAK,QAAQ;YACZ,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QAClF,KAAK,iBAAiB;YACrB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;QAC7F,KAAK,aAAa;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;QACxC,KAAK,OAAO;YACX,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAA;QACjD,KAAK,UAAU;YACd,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,eAAe,CAAC,CAAA;QAC3E,KAAK,OAAO;YACX,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QACtE,KAAK,UAAU;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;QACnE,KAAK,KAAK;YACT,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,CAAA;QACtE,KAAK,aAAa;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAA;QACvD,KAAK,YAAY;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAA;QACpD,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,CAAA;QAClD,KAAK,UAAU;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;QACvD,KAAK,aAAa;YACjB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QAChE,KAAK,OAAO;YACX,OAAO,IAAI,CACV,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAChD,MAAM,EACN,eAAe,EACf,wBAAwB,EACxB,UAAU,EACV,yBAAyB,CACzB,CAAA;QACF,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,yBAAyB,CAAC,CAAA;QACjF,KAAK,YAAY;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,CAAA;QAChD,KAAK,UAAU;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAA;QACtD,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAA;QACnE,KAAK,WAAW;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,CAAA;QAClD,KAAK,UAAU;YACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAA;QACzD,KAAK,YAAY;YAChB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,CAAC,CAAA;QACnD,KAAK,IAAI;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAA;QAC3C,KAAK,IAAI;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;QACpD,KAAK,eAAe;YACnB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACrC,KAAK,gBAAgB,CAAC;QACtB,KAAK,WAAW;YACf,OAAO,IAAI,CAAA;QACZ,OAAO,CAAC,CAAC,CAAC;YACT,MAAM,UAAU,GAAU,KAAK,CAAC,EAAE,CAAA;YAClC,OAAO,UAAU,CAAA;QAClB,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACvB,QAAQ,CAAC,QAAQ,CAAC;SAClB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;SACpB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACzD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IACrE,OAAO,mEAAmE,MAAM,EAAE,CAAA;AACnF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACpC,YAAoB,EACpB,SAAuC,QAAQ;IAE/C,MAAM,MAAM,GAAG,kBAAkB,CAChC,IAAI,CAAC,SAAS,CAAC;QACd,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,YAAY;KACjB,CAAC,CACF,CAAA;IACD,OAAO,GAAG,MAAM,gBAAgB,MAAM,EAAE,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,YAAoB;IACxD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QAClC,GAAG,EAAE,YAAY;QACjB,IAAI,EAAE,iBAAiB;QACvB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,yBAAyB;KACtC,CAAC,CAAA;IACF,OAAO,qBAAqB,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAA;AAChD,CAAC"}
@@ -0,0 +1,23 @@
1
+ export declare const leftoverHostIds: readonly ["amazon-q", "qwen-code", "visual-studio", "vscode-insiders"];
2
+ export type LeftoverHostId = (typeof leftoverHostIds)[number];
3
+ export declare function leftoverRemoteEntry(id: LeftoverHostId, mcpUrl: string): Record<string, unknown>;
4
+ export declare function sameRemoteUrl(entry: unknown, mcpUrl: string): boolean;
5
+ export declare function mergeHostDocument(input: {
6
+ id: LeftoverHostId;
7
+ existing: string | null;
8
+ mcpUrl: string;
9
+ }): {
10
+ body: string;
11
+ changed: boolean;
12
+ };
13
+ export declare function writeMergedConfig(input: {
14
+ path: string;
15
+ id: LeftoverHostId;
16
+ mcpUrl: string;
17
+ readFile: (path: string) => Promise<string | null>;
18
+ writeFile: (path: string, body: string) => Promise<void>;
19
+ mkdir: (path: string) => Promise<void>;
20
+ }): Promise<{
21
+ path: string;
22
+ changed: boolean;
23
+ }>;
@@ -0,0 +1,80 @@
1
+ import { dirname } from 'node:path';
2
+ export const leftoverHostIds = [
3
+ 'amazon-q',
4
+ 'qwen-code',
5
+ 'visual-studio',
6
+ 'vscode-insiders',
7
+ ];
8
+ function asObject(value, label) {
9
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
10
+ return value;
11
+ }
12
+ throw new Error(`${label} must be a JSON object.`);
13
+ }
14
+ function nestedObject(parent, key) {
15
+ const current = parent[key];
16
+ if (current == null) {
17
+ const next = {};
18
+ parent[key] = next;
19
+ return next;
20
+ }
21
+ return asObject(current, key);
22
+ }
23
+ export function leftoverRemoteEntry(id, mcpUrl) {
24
+ switch (id) {
25
+ case 'vscode-insiders':
26
+ case 'visual-studio':
27
+ case 'amazon-q':
28
+ return { type: 'http', url: mcpUrl };
29
+ case 'qwen-code':
30
+ return { httpUrl: mcpUrl };
31
+ default: {
32
+ const exhaustive = id;
33
+ return exhaustive;
34
+ }
35
+ }
36
+ }
37
+ function jsonRootKey(id) {
38
+ switch (id) {
39
+ case 'vscode-insiders':
40
+ case 'visual-studio':
41
+ return 'servers';
42
+ case 'amazon-q':
43
+ case 'qwen-code':
44
+ return 'mcpServers';
45
+ default: {
46
+ const exhaustive = id;
47
+ return exhaustive;
48
+ }
49
+ }
50
+ }
51
+ export function sameRemoteUrl(entry, mcpUrl) {
52
+ if (!entry || typeof entry !== 'object')
53
+ return false;
54
+ const record = entry;
55
+ const candidates = [record.url, record.serverUrl, record.httpUrl, record.uri];
56
+ return candidates.some((value) => value === mcpUrl);
57
+ }
58
+ export function mergeHostDocument(input) {
59
+ const entry = leftoverRemoteEntry(input.id, input.mcpUrl);
60
+ const parsed = input.existing?.trim() ? JSON.parse(input.existing) : {};
61
+ const root = asObject(parsed, 'MCP config');
62
+ const bucket = nestedObject(root, jsonRootKey(input.id));
63
+ const changed = !sameRemoteUrl(bucket.kody, input.mcpUrl);
64
+ bucket.kody = entry;
65
+ return { body: `${JSON.stringify(root, null, 2)}\n`, changed };
66
+ }
67
+ export async function writeMergedConfig(input) {
68
+ const existing = await input.readFile(input.path);
69
+ const merged = mergeHostDocument({
70
+ id: input.id,
71
+ existing,
72
+ mcpUrl: input.mcpUrl,
73
+ });
74
+ if (merged.changed) {
75
+ await input.mkdir(dirname(input.path));
76
+ await input.writeFile(input.path, merged.body);
77
+ }
78
+ return { path: input.path, changed: merged.changed };
79
+ }
80
+ //# sourceMappingURL=host-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-config.js","sourceRoot":"","sources":["../src/host-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { type UpsertServerFn } from './add-mcp-install.js';
2
+ import { type HostId } from './host-catalog.js';
3
+ export type ApplyStatus = 'wrote' | 'unchanged' | 'manual' | 'command';
4
+ export type ApplyResult = {
5
+ id: HostId;
6
+ label: string;
7
+ status: ApplyStatus;
8
+ path?: string;
9
+ opened?: string;
10
+ command?: string;
11
+ instructions: Array<string>;
12
+ };
13
+ export type InstallRuntime = {
14
+ home: string;
15
+ cwd: string;
16
+ project: boolean;
17
+ platform?: NodeJS.Platform;
18
+ which?: (command: string) => string | undefined;
19
+ openUrl?: (url: string) => Promise<boolean>;
20
+ openApp?: (name: string) => Promise<boolean>;
21
+ runCommand?: (command: string, args: Array<string>) => Promise<boolean>;
22
+ readFile?: (path: string) => Promise<string | null>;
23
+ writeFile?: (path: string, body: string) => Promise<void>;
24
+ mkdir?: (path: string) => Promise<void>;
25
+ upsertServer?: UpsertServerFn;
26
+ };
27
+ export declare function applyHost(input: {
28
+ id: HostId;
29
+ mcpUrl: string;
30
+ runtime: InstallRuntime;
31
+ }): Promise<ApplyResult>;