imcp 0.1.19 → 0.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.
Files changed (55) hide show
  1. package/README.md +33 -0
  2. package/dist/cli/commands/install.js +1 -1
  3. package/dist/cli/commands/install.js.map +1 -1
  4. package/dist/cli/commands/uninstall.js +1 -1
  5. package/dist/cli/commands/uninstall.js.map +1 -1
  6. package/dist/cli/index.js +1 -1
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/utils/clientOptions.d.ts +3 -0
  9. package/dist/cli/utils/clientOptions.js +2 -0
  10. package/dist/cli/utils/clientOptions.js.map +1 -0
  11. package/dist/core/installers/clients/BaseClientInstaller.d.ts +8 -0
  12. package/dist/core/installers/clients/BaseClientInstaller.js +1 -1
  13. package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -1
  14. package/dist/core/installers/clients/ClaudeCodeInstaller.js +1 -1
  15. package/dist/core/installers/clients/ClaudeCodeInstaller.js.map +1 -1
  16. package/dist/core/installers/clients/ClientInstaller.d.ts +3 -0
  17. package/dist/core/installers/clients/ClientInstaller.js +1 -1
  18. package/dist/core/installers/clients/ClientInstaller.js.map +1 -1
  19. package/dist/core/installers/clients/ClientInstallerFactory.js +1 -1
  20. package/dist/core/installers/clients/ClientInstallerFactory.js.map +1 -1
  21. package/dist/core/installers/clients/CodexInstaller.d.ts +45 -0
  22. package/dist/core/installers/clients/CodexInstaller.js +2 -0
  23. package/dist/core/installers/clients/CodexInstaller.js.map +1 -0
  24. package/dist/core/installers/clients/GithubCopilotInstaller.js +1 -1
  25. package/dist/core/installers/clients/GithubCopilotInstaller.js.map +1 -1
  26. package/dist/core/installers/clients/RooCodeInstaller.d.ts +11 -0
  27. package/dist/core/installers/clients/RooCodeInstaller.js +2 -0
  28. package/dist/core/installers/clients/RooCodeInstaller.js.map +1 -0
  29. package/dist/core/installers/clients/VisualStudioInstaller.js +1 -1
  30. package/dist/core/installers/clients/VisualStudioInstaller.js.map +1 -1
  31. package/dist/core/loaders/ConfigurationLoader.js +1 -1
  32. package/dist/core/loaders/ConfigurationLoader.js.map +1 -1
  33. package/dist/core/loaders/ConfigurationProvider.d.ts +1 -0
  34. package/dist/core/loaders/ConfigurationProvider.js +1 -1
  35. package/dist/core/loaders/ConfigurationProvider.js.map +1 -1
  36. package/dist/core/metadatas/constants.js +1 -1
  37. package/dist/core/metadatas/constants.js.map +1 -1
  38. package/dist/core/metadatas/types.d.ts +2 -0
  39. package/dist/core/metadatas/types.js.map +1 -1
  40. package/dist/services/InstallationService.js +1 -1
  41. package/dist/services/InstallationService.js.map +1 -1
  42. package/dist/services/RequirementService.d.ts +2 -3
  43. package/dist/services/RequirementService.js +1 -1
  44. package/dist/services/RequirementService.js.map +1 -1
  45. package/dist/services/ServerService.d.ts +5 -0
  46. package/dist/services/ServerService.js +1 -1
  47. package/dist/services/ServerService.js.map +1 -1
  48. package/dist/services/TelemetryService.js +1 -1
  49. package/dist/services/TelemetryService.js.map +1 -1
  50. package/dist/utils/tomlUtils.d.ts +17 -0
  51. package/dist/utils/tomlUtils.js +2 -0
  52. package/dist/utils/tomlUtils.js.map +1 -0
  53. package/dist/web/public/js/modal/modalSetup.js +1 -1
  54. package/dist/web/public/js/modal/modalSetup.js.map +1 -1
  55. package/package.json +1 -1
package/README.md CHANGED
@@ -66,10 +66,43 @@ npx -y imcp@latest serve --feed-file ./custom-feed.json --schemas-directory ./fe
66
66
  npx -y imcp@latest serve --repo https://github.com/ai-microsoft/imcp-feed --branch main
67
67
  ```
68
68
 
69
+ ### install
70
+
71
+ Install MCP servers directly from the CLI, either by specifying a single server or by providing a JSON payload that mirrors the web API.
72
+
73
+ ```bash
74
+ # Install using defaults (all supported clients)
75
+ imcp install --name github-tools --clients "MSRooCode"
76
+
77
+ # Install with explicit client targets and env vars
78
+ imcp install --name github-tools \
79
+ --clients "MSRooCode;GithubCopilot" \
80
+ --envs "GITHUB_TOKEN=abc123;API_KEY=xyz789"
81
+
82
+ # Reinstall (remove existing configuration first)
83
+ imcp install --name github-tools --clients "MSRooCode" --reinstall
84
+ ```
85
+
86
+ Options:
87
+
88
+ - `--name <name>`: Server name (required unless using a payload)
89
+ - `--clients <clients>`: Semicolon-delimited list of clients (required unless using a payload)
90
+ - `--envs <envs>`: Semicolon-delimited `KEY=VALUE` pairs applied to single-server installs
91
+ - `--payload <json>`: Inline JSON payload (either a `serverList` object or a direct `{ "serverName": { ... } }` map)
92
+ - `--payload-file <path>`: Path to a JSON payload file matching the web API structure
93
+ - `-r, --reinstall`: Removes existing client configuration and forces requirement packages to reinstall before applying the new config
94
+
95
+ CLI installs block until requirement checks, requirement reinstalls (when requested), and client installers complete, so you always see success/failure inline in the terminal. The web UI continues to track these steps asynchronously via the install operation log.
96
+
97
+ Supported client keys: `MSRooCode`, `RooCode`, `Cline`, `GithubCopilot`, `ClaudeCode`, and (on Windows) `VisualStudio`.
98
+
99
+ The CLI automatically resolves each server's category based on the name defined in your feeds, so no `--category` flag is needed. Run `imcp pull` if a server name cannot be found locally. When using payloads, ensure each server entry includes a non-empty `targetClients` array using the keys above.
100
+
69
101
  ## MCP Installation and Publish
70
102
 
71
103
  For details on how to install and publish MCP servers, please refer to the following documents:
72
104
 
105
+ - [CLI Install & Uninstall Guide](docs/cli-installation.md)
73
106
  - [Installation Guide](wiki/Installation.md)
74
107
  - [Publishing Guide](wiki/Publish.md)
75
108
 
@@ -1,2 +1,2 @@
1
- import{Command}from"commander";import{serverService}from"../../services/ServerService.js";import{Logger}from"../../utils/logger.js";import{hasLocalFeeds}from"../../utils/feedUtils.js";import{SUPPORTED_CLIENT_NAMES}from"../../core/metadatas/constants.js";import{mcpManager}from"../../services/MCPManager.js";export function createInstallCommand(){return new Command("install").description("Install specific MCP servers").addHelpText("after",'\nExamples:\n # Install a server\n $ imcp install --category ai-coder-tools --name github-tools\n\n # Install with specific client targets (semicolon separated)\n $ imcp install --category ai-coder-tools --name github-tools --clients "MSRooCode;GithubCopilot"\n\n # Install with environment variables\n $ imcp install --category ai-coder-tools --name github-tools --envs "GITHUB_TOKEN=abc123;API_KEY=xyz789"\n ').requiredOption("--category <category>","Server category").requiredOption("--name <name>","Server name to install").option("--clients <clients>","Target clients (semicolon separated). Supported values: Cline, MSRooCode, GithubCopilot. If not specified, installs for all clients").option("--envs <envs>","Environment variables (semicolon separated key=value pairs)").action((async e=>{try{await hasLocalFeeds()||(Logger.log("Local feeds not found, syncing from remote..."),await serverService.syncFeeds()),await mcpManager.initialize();const{category:r,name:o,verbose:t,clients:n,envs:s}=e;Logger.debug(`Install options: ${JSON.stringify({category:r,name:o,verbose:t,clients:n,envs:s})}`);const a=o.trim();Logger.debug(`Server name: ${a}`),await serverService.validateServerName(r,a)||(Logger.error('Invalid server name or category provided.\nThis could be because:\n 1. The server name or category is misspelled\n 2. Your local feeds are outdated\n\nTry running "imcp pull" to update your local feeds from remote.',{category:r,serverName:a}),process.exit(1));const i=n?n.split(";").map((e=>e.trim())).filter(Boolean).map((e=>{const r=e.toLowerCase(),o=SUPPORTED_CLIENT_NAMES.find((e=>e.toLowerCase()===r));return o||(Logger.error(`Invalid client name: ${e}`),null)})).filter((e=>null!==e)):void 0;i&&i.length>0&&Logger.debug(`Target clients: ${JSON.stringify(i)}`);const l={};if(s){const e=s.split(";");for(const r of e){const[e,o]=r.split("=").map((e=>e.trim()));e&&o?l[e]=o:Logger.error(`Invalid environment variable format: ${r}`)}}Object.keys(l).length>0&&Logger.debug(`Environment variables: ${JSON.stringify(l)}`),Logger.log(`Installing server: ${a}`);const c={force:!1,...i?.length&&{targetClients:i},...Object.keys(l).length>0&&{env:l}},g=[await serverService.installMcpServer(r,a,c)],{success:m,messages:v}=serverService.formatOperationResults(g);v.forEach((e=>{m?Logger.log(`✓ ${e}`):Logger.error(`✗ ${e}`)})),m||process.exit(1)}catch(e){const r=e instanceof Error?e.message:"Unknown error";Logger.error("Installation failed:",r),process.exit(1)}}))}
1
+ import{Command}from"commander";import fs from"fs/promises";import{serverService}from"../../services/ServerService.js";import{Logger}from"../../utils/logger.js";import{hasLocalFeeds}from"../../utils/feedUtils.js";import{mcpManager}from"../../services/MCPManager.js";import{SUPPORTED_CLIENTS_TEXT,normalizeTargetClients,parseClientsOption}from"../utils/clientOptions.js";function exitWithUsage(e,t){Logger.error(t),e.outputHelp(),process.exit(1)}async function loadServerListPayload(e,t){if(e||t)try{const r=t?await fs.readFile(t,"utf8"):e??"",s=JSON.parse(r),o=s?.serverList??s;if(!o||"object"!=typeof o||Array.isArray(o))throw new Error("Payload must be a JSON object containing server definitions.");return o}catch(e){const t=e instanceof Error?e.message:"Unknown error";throw new Error(`Failed to parse payload: ${t}`)}}export function createInstallCommand(){return new Command("install").description("Install specific MCP servers").addHelpText("after",'\nExamples:\n # Install a server\n $ imcp install --name github-tools --clients "MSRooCode"\n\n # Install with specific client targets (semicolon separated)\n $ imcp install --name github-tools --clients "MSRooCode;GithubCopilot"\n\n # Install with environment variables\n $ imcp install --name github-tools --clients "MSRooCode" --envs "GITHUB_TOKEN=abc123;API_KEY=xyz789"\n\n # Install using a payload file (matches web API payload structure)\n $ imcp install --payload-file ./installPayload.json\n\n # Reinstall (remove config first)\n $ imcp install --name github-tools --clients "MSRooCode" --reinstall\n ').option("--name <name>","Server name to install (required unless using --payload or --payload-file)").option("--clients <clients>",`Target clients (semicolon separated). Supported values: ${SUPPORTED_CLIENTS_TEXT}`).option("--envs <envs>","Environment variables (semicolon separated key=value pairs)").option("--payload <json>","Server install payload in JSON format (either a serverList object or a direct map of server names to options)").option("--payload-file <filepath>","Path to a JSON file that contains the install payload (same structure as the web API payload)").option("-r, --reinstall","Uninstall specified clients before installing again").action((async(e,t)=>{try{await hasLocalFeeds()||(Logger.log("Local feeds not found, syncing from remote..."),await serverService.syncFeeds()),await mcpManager.initialize();const{name:r,verbose:s,clients:o,envs:n,payload:i,payloadFile:a,reinstall:l}=e,c=Boolean(l);Logger.debug(`Install options: ${JSON.stringify({name:r,verbose:s,clients:o,envs:n,payload:!!i,payloadFile:a,reinstall:c})}`);const g=await loadServerListPayload(i,a);g||r&&r.trim()||exitWithUsage(t,"Server name is required unless a payload is provided."),g&&(r||o||n)&&Logger.warn("Name, clients, and env options are ignored when using payload-based installs.");const p=[];if(g)for(const[e,r]of Object.entries(g)){const s=e.trim();let o;s||exitWithUsage(t,"Payload contains an empty server name.");try{o=normalizeTargetClients(r.targetClients,`payload server "${s}"`)}catch(e){exitWithUsage(t,e instanceof Error?e.message:String(e))}const n={...r,targetClients:o,blockUntilComplete:!0,forceRequirementReinstall:c||!0===r.forceRequirementReinstall};p.push([s,n])}else if(r){const e=r.trim();let s;Logger.debug(`Server name: ${e}`);try{s=parseClientsOption(o),Logger.debug(`Target clients: ${JSON.stringify(s)}`)}catch(e){exitWithUsage(t,e instanceof Error?e.message:String(e))}const i={};if(n){const e=n.split(";");for(const t of e){const[e,r]=t.split("=").map((e=>e.trim()));e&&r?i[e]=r:Logger.error(`Invalid environment variable format: ${t}`)}}Object.keys(i).length>0&&Logger.debug(`Environment variables: ${JSON.stringify(i)}`);const a={force:!1,targetClients:s,blockUntilComplete:!0,forceRequirementReinstall:c,...Object.keys(i).length>0&&{env:i}};p.push([e,a])}let m;0===p.length&&exitWithUsage(t,"No servers specified for installation.");try{const e=p.map((([e])=>e));m=await serverService.resolveServerCategories(e),Logger.debug(`Resolved categories: ${JSON.stringify(m)}`)}catch(e){const t=e instanceof Error?e.message:"Failed to resolve server categories.";Logger.error(t),process.exit(1)}const d=[];for(const[e,t]of p){const r=m[e];if(Logger.log(`Installing server: ${e} (category: ${r})`),t.targetClients&&0!==t.targetClients.length||(Logger.error(`No clients specified for ${e}. This should not happen; please provide target clients.`),process.exit(1)),c){Logger.log(`Reinstall requested. Removing existing config for ${e} on ${t.targetClients.join(", ")}`);try{const s=await serverService.uninstallMcpServer(r,e,{targets:t.targetClients,removeData:!0});s.success||(Logger.error(s.message??`Failed to uninstall ${e} before reinstalling.`),process.exit(1))}catch(t){const r=t instanceof Error?t.message:"Unknown error";Logger.error(`Failed to uninstall ${e} before reinstalling: ${r}`),process.exit(1)}}d.push(serverService.installMcpServer(r,e,t))}const f=await Promise.all(d),{success:v,messages:u}=serverService.formatOperationResults(f);u.forEach((e=>{v?Logger.log(`✓ ${e}`):Logger.error(`✗ ${e}`)})),v||process.exit(1)}catch(e){const t=e instanceof Error?e.message:"Unknown error";Logger.error("Installation failed:",t),process.exit(1)}}))}
2
2
  //# sourceMappingURL=install.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Command","serverService","Logger","hasLocalFeeds","SUPPORTED_CLIENT_NAMES","mcpManager","createInstallCommand","description","addHelpText","requiredOption","option","action","async","options","log","syncFeeds","initialize","category","name","verbose","clients","envs","debug","JSON","stringify","serverName","trim","validateServerName","error","process","exit","parsedClients","split","map","c","filter","Boolean","clientName","toLowerCase","validClient","find","undefined","length","parsedEnvs","pairs","pair","key","value","s","Object","keys","installOptions","force","targetClients","env","results","installMcpServer","success","messages","formatOperationResults","forEach","message","Error"],"sources":["../../../src/cli/commands/install.ts"],"mappings":"OAASA,YAAe,mBACfC,kBAAqB,yCACrBC,WAAc,+BACdC,kBAAqB,kCAErBC,2BAA8B,2CAC9BC,eAAkB,sCAErB,SAAUC,uBACd,OAAO,IAAIN,QAAQ,WAChBO,YAAY,gCACZC,YAAY,QAAS,uaAWrBC,eACC,wBACA,mBAEDA,eACC,gBACA,0BAEDC,OACC,sBACA,uIAEDA,OACC,gBACA,+DAEDC,QAAOC,MAAOC,IAOb,UAE2BV,kBAEvBD,OAAOY,IAAI,uDACLb,cAAcc,mBAEhBV,WAAWW,aACjB,MAAMC,SAAEA,EAAQC,KAAEA,EAAIC,QAAEA,EAAOC,QAAEA,EAAOC,KAAEA,GAASR,EAEnDX,OAAOoB,MAAM,oBAAoBC,KAAKC,UAAU,CAAEP,WAAUC,OAAMC,UAASC,UAASC,YAEpF,MAAMI,EAAaP,EAAKQ,OACxBxB,OAAOoB,MAAM,gBAAgBG,WAElBxB,cAAc0B,mBAAmBV,EAAUQ,KACpDvB,OAAO0B,MACL,2NAKA,CAAEX,WAAUQ,eAEdI,QAAQC,KAAK,IAIf,MAAMC,EAAgBX,EAAUA,EAAQY,MAAM,KAC3CC,KAAKC,GAAcA,EAAER,SACrBS,OAAOC,SACPH,KAAKC,IACJ,MAAMG,EAAaH,EAAEI,cACfC,EAAcnC,uBAAuBoC,MAAMtB,GAAiBA,EAAKoB,gBAAkBD,IACzF,OAAKE,IACHrC,OAAO0B,MAAM,wBAAwBM,KAC9B,KAES,IAEnBC,QAAQD,GAAwC,OAANA,SAAcO,EAEvDV,GAAiBA,EAAcW,OAAS,GAC1CxC,OAAOoB,MAAM,mBAAmBC,KAAKC,UAAUO,MAIjD,MAAMY,EAAqC,GAC3C,GAAItB,EAAM,CACR,MAAMuB,EAAQvB,EAAKW,MAAM,KACzB,IAAK,MAAMa,KAAQD,EAAO,CACxB,MAAOE,EAAKC,GAASF,EAAKb,MAAM,KAAKC,KAAKe,GAAcA,EAAEtB,SACtDoB,GAAOC,EACTJ,EAAWG,GAAOC,EAElB7C,OAAO0B,MAAM,wCAAwCiB,IAEzD,CACF,CAEII,OAAOC,KAAKP,GAAYD,OAAS,GACnCxC,OAAOoB,MAAM,0BAA0BC,KAAKC,UAAUmB,MAGxDzC,OAAOY,IAAI,sBAAsBW,KAEjC,MAAM0B,EAAuC,CAC3CC,OAAO,KACHrB,GAAeW,QAAU,CAAEW,cAAetB,MAC1CkB,OAAOC,KAAKP,GAAYD,OAAS,GAAK,CAAEY,IAAKX,IAG7CY,EAAU,OAAOtD,cAAcuD,iBAAiBvC,EAAUQ,EAAY0B,KAEtEM,QAAEA,EAAOC,SAAEA,GAAazD,cAAc0D,uBAAuBJ,GAEnEG,EAASE,SAASC,IACZJ,EACFvD,OAAOY,IAAI,KAAK+C,KAEhB3D,OAAO0B,MAAM,KAAKiC,IACpB,IAGGJ,GACH5B,QAAQC,KAAK,EAEjB,CAAE,MAAOF,GACP,MAAMiC,EAAUjC,aAAiBkC,MAAQlC,EAAMiC,QAAU,gBACzD3D,OAAO0B,MAAM,uBAAwBiC,GACrChC,QAAQC,KAAK,EACf,IAEN","ignoreList":[]}
1
+ {"version":3,"names":["Command","fs","serverService","Logger","hasLocalFeeds","mcpManager","SUPPORTED_CLIENTS_TEXT","normalizeTargetClients","parseClientsOption","exitWithUsage","command","message","error","outputHelp","process","exit","async","loadServerListPayload","payload","payloadFile","rawPayload","readFile","parsedPayload","JSON","parse","serverList","Array","isArray","Error","createInstallCommand","description","addHelpText","option","action","options","log","syncFeeds","initialize","name","verbose","clients","envs","reinstall","reinstallFlag","Boolean","debug","stringify","payloadServerList","trim","warn","resolvedServerEntries","rawName","rawOptions","Object","entries","trimmedName","normalizedTargets","targetClients","clientError","String","normalizedOptions","blockUntilComplete","forceRequirementReinstall","push","serverName","parsedClients","parsedEnvs","pairs","split","pair","key","value","map","s","keys","length","installOptions","force","env","categoryMap","serverNames","resolveServerCategories","resolutionError","installPromises","categoryName","join","uninstallResult","uninstallMcpServer","targets","removeData","success","uninstallError","installMcpServer","results","Promise","all","messages","formatOperationResults","forEach"],"sources":["../../../src/cli/commands/install.ts"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{Command}from"commander";import{serverService}from"../../services/ServerService.js";export function createUninstallCommand(){return new Command("uninstall").description("Uninstall specific MCP servers").requiredOption("--category <category>","Server category").requiredOption("--names <names>","Server names (semicolon separated)").requiredOption("--targets <targets>","Target clients to uninstall from (semicolon separated)").option("--remove-data","Remove all associated data",!0).action((async e=>{try{const r=e.names.split(";").map((e=>e.trim()));await serverService.validateServerName(e.category,r)||(console.error("Invalid server names provided"),process.exit(1)),console.log(`Uninstalling servers: ${r.join(", ")}`);const s=await Promise.all(r.map((r=>{const s=e.targets?e.targets.split(";").map((e=>e.trim())):[];return serverService.uninstallMcpServer(e.category,r,{removeData:e.removeData,targets:s})}))),{success:a,messages:o}=serverService.formatOperationResults(s);o.forEach((e=>{a?console.log(`✓ ${e}`):console.error(`✗ ${e}`)})),a||process.exit(1)}catch(e){const r=e instanceof Error?e.message:"Unknown error";console.error("Uninstallation failed:",r),process.exit(1)}}))}
1
+ import{Command}from"commander";import{serverService}from"../../services/ServerService.js";import{SUPPORTED_CLIENTS_TEXT,parseClientsOption}from"../utils/clientOptions.js";export function createUninstallCommand(){return new Command("uninstall").description("Uninstall specific MCP servers").requiredOption("--names <names>","Server names (semicolon separated)").requiredOption("--clients <clients>",`Clients to uninstall from (semicolon separated). Supported values: ${SUPPORTED_CLIENTS_TEXT}`).option("--remove-data","Remove all associated data",!0).action((async e=>{try{const r=e.names.split(";").map((e=>e.trim()));let s,o;try{s=await serverService.resolveServerCategories(r)}catch(e){const r=e instanceof Error?e.message:"Failed to resolve server categories";console.error(r),process.exit(1)}try{o=parseClientsOption(e.clients)}catch(e){const r=e instanceof Error?e.message:String(e);console.error(r),process.exit(1)}console.log(`Uninstalling servers: ${r.map((e=>`${e} (${s[e]})`)).join(", ")} on ${o.join(", ")}`);const t=await Promise.all(r.map((r=>serverService.uninstallMcpServer(s[r],r,{removeData:e.removeData,targets:o})))),{success:n,messages:a}=serverService.formatOperationResults(t);a.forEach((e=>{n?console.log(`✓ ${e}`):console.error(`✗ ${e}`)})),n||process.exit(1)}catch(e){const r=e instanceof Error?e.message:"Unknown error";console.error("Uninstallation failed:",r),process.exit(1)}}))}
2
2
  //# sourceMappingURL=uninstall.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Command","serverService","createUninstallCommand","description","requiredOption","option","action","async","options","serverNames","names","split","map","name","trim","validateServerName","category","console","error","process","exit","log","join","results","Promise","all","serverName","targets","t","uninstallMcpServer","removeData","success","messages","formatOperationResults","forEach","message","Error"],"sources":["../../../src/cli/commands/uninstall.ts"],"mappings":"OAASA,YAAe,mBACfC,kBAAqB,yCAExB,SAAUC,yBACd,OAAO,IAAIF,QAAQ,aAChBG,YAAY,kCACZC,eACC,wBACA,mBAEDA,eACC,kBACA,sCAEDA,eACC,sBACA,0DAEDC,OACC,gBACA,8BACA,GAEDC,QAAOC,MAAOC,IACb,IACE,MAAMC,EAAcD,EAAQE,MAAMC,MAAM,KAAKC,KAAKC,GAAiBA,EAAKC,eAE/Cb,cAAcc,mBAAmBP,EAAQQ,SAAUP,KAE1EQ,QAAQC,MAAM,iCACdC,QAAQC,KAAK,IAGfH,QAAQI,IAAI,yBAAyBZ,EAAYa,KAAK,SAEtD,MAAMC,QAAgBC,QAAQC,IAC5BhB,EAAYG,KAAKc,IACf,MAAMC,EAAUnB,EAAQmB,QAAUnB,EAAQmB,QAAQhB,MAAM,KAAKC,KAAKgB,GAAcA,EAAEd,SAAU,GAC5F,OAAOb,cAAc4B,mBAAmBrB,EAAQQ,SAAUU,EAAY,CACpEI,WAAYtB,EAAQsB,WACpBH,QAASA,GACT,MAIAI,QAAEA,EAAOC,SAAEA,GAAa/B,cAAcgC,uBAAuBV,GACnES,EAASE,SAAQC,IACXJ,EACFd,QAAQI,IAAI,KAAKc,KAEjBlB,QAAQC,MAAM,KAAKiB,IACrB,IAGGJ,GACHZ,QAAQC,KAAK,EAEjB,CAAE,MAAOF,GACP,MAAMiB,EAAUjB,aAAiBkB,MAAQlB,EAAMiB,QAAU,gBACzDlB,QAAQC,MAAM,yBAA0BiB,GACxChB,QAAQC,KAAK,EACf,IAEN","ignoreList":[]}
1
+ {"version":3,"names":["Command","serverService","SUPPORTED_CLIENTS_TEXT","parseClientsOption","createUninstallCommand","description","requiredOption","option","action","async","options","serverNames","names","split","map","name","trim","categoryMap","parsedClients","resolveServerCategories","error","message","Error","console","process","exit","clients","targetError","String","log","join","results","Promise","all","serverName","uninstallMcpServer","removeData","targets","success","messages","formatOperationResults","forEach"],"sources":["../../../src/cli/commands/uninstall.ts"],"mappings":"OAASA,YAAe,mBACfC,kBAAqB,yCACrBC,uBAAwBC,uBAA0B,mCAErD,SAAUC,yBACd,OAAO,IAAIJ,QAAQ,aAChBK,YAAY,kCACZC,eACC,kBACA,sCAEDA,eACC,sBACA,sEAAsEJ,0BAEvEK,OACC,gBACA,8BACA,GAEDC,QAAOC,MAAOC,IAKb,IACE,MAAMC,EAAcD,EAAQE,MAAMC,MAAM,KAAKC,KAAKC,GAAiBA,EAAKC,SACxE,IAAIC,EASAC,EARJ,IACED,QAAoBhB,cAAckB,wBAAwBR,EAC5D,CAAE,MAAOS,GACP,MAAMC,EAAUD,aAAiBE,MAAQF,EAAMC,QAAU,sCACzDE,QAAQH,MAAMC,GACdG,QAAQC,KAAK,EACf,CAGA,IACEP,EAAgBf,mBAAmBO,EAAQgB,QAC7C,CAAE,MAAOC,GACP,MAAMN,EAAUM,aAAuBL,MAAQK,EAAYN,QAAUO,OAAOD,GAC5EJ,QAAQH,MAAMC,GACdG,QAAQC,KAAK,EACf,CAEAF,QAAQM,IAAI,yBAAyBlB,EAAYG,KAAIC,GAAQ,GAAGA,MAASE,EAAYF,QAAUe,KAAK,YAAYZ,EAAcY,KAAK,SAEnI,MAAMC,QAAgBC,QAAQC,IAC5BtB,EAAYG,KAAKoB,GACRjC,cAAckC,mBAAmBlB,EAAYiB,GAAaA,EAAY,CAC3EE,WAAY1B,EAAQ0B,WACpBC,QAASnB,QAKToB,QAAEA,EAAOC,SAAEA,GAAatC,cAAcuC,uBAAuBT,GACnEQ,EAASE,SAAQpB,IACXiB,EACFf,QAAQM,IAAI,KAAKR,KAEjBE,QAAQH,MAAM,KAAKC,IACrB,IAGGiB,GACHd,QAAQC,KAAK,EAEjB,CAAE,MAAOL,GACP,MAAMC,EAAUD,aAAiBE,MAAQF,EAAMC,QAAU,gBACzDE,QAAQH,MAAM,yBAA0BC,GACxCG,QAAQC,KAAK,EACf,IAEN","ignoreList":[]}
package/dist/cli/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{Command}from"commander";import{createServeCommand}from"./commands/serve.js";import{Logger}from"../utils/logger.js";import{checkForUpdates}from"../utils/versionUtils.js";async function main(){const e=new Command;e.name("imcp").description("IMCP (Install Model Context Protocol) CLI").option("--verbose","Show detailed logs for all commands"),e.parseOptions(process.argv);const o=e.opts();Logger.setVerbose(!!o.verbose),e.addCommand(createServeCommand()),e.exitOverride(),await checkForUpdates();try{await e.parseAsync(process.argv)}catch(e){const o=e;"commander.help"===o.code||"commander.version"===o.code?process.exit(0):(console.error("Error:",o.message||"An unknown error occurred"),process.exit(1))}}process.on("unhandledRejection",(e=>{e instanceof Error?console.error("Unhandled promise rejection:",e.message):console.error("Unhandled promise rejection:",e),process.exit(1)})),main().catch((e=>{e instanceof Error?console.error("Fatal error:",e.message):console.error("Fatal error:",e),process.exit(1)}));
2
+ import{Command}from"commander";import{createServeCommand}from"./commands/serve.js";import{createListCommand}from"./commands/list.js";import{createInstallCommand}from"./commands/install.js";import{createUninstallCommand}from"./commands/uninstall.js";import{createPullCommand}from"./commands/pull.js";import{Logger}from"../utils/logger.js";import{checkForUpdates}from"../utils/versionUtils.js";async function main(){const o=new Command;o.name("imcp").description("IMCP (Install Model Context Protocol) CLI").option("--verbose","Show detailed logs for all commands"),o.parseOptions(process.argv);const e=o.opts();Logger.setVerbose(!!e.verbose),o.addCommand(createServeCommand()),o.addCommand(createInstallCommand()),o.addCommand(createListCommand()),o.addCommand(createUninstallCommand()),o.addCommand(createPullCommand()),o.exitOverride(),await checkForUpdates();try{await o.parseAsync(process.argv)}catch(o){const e=o;"commander.help"===e.code||"commander.version"===e.code?process.exit(0):(console.error("Error:",e.message||"An unknown error occurred"),process.exit(1))}}process.on("unhandledRejection",(o=>{o instanceof Error?console.error("Unhandled promise rejection:",o.message):console.error("Unhandled promise rejection:",o),process.exit(1)})),main().catch((o=>{o instanceof Error?console.error("Fatal error:",o.message):console.error("Fatal error:",o),process.exit(1)}));
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Command","createServeCommand","Logger","checkForUpdates","async","main","program","name","description","option","parseOptions","process","argv","opts","setVerbose","verbose","addCommand","exitOverride","parseAsync","error","commanderError","code","exit","console","message","on","Error","catch"],"sources":["../../src/cli/index.ts"],"mappings":";OAESA,YAAe,mBACfC,uBAA0B,6BAM1BC,WAAc,4BACdC,oBAAuB,2BAOhCC,eAAeC,OAIb,MAAMC,EAAU,IAAIN,QACpBM,EACGC,KAAK,QACLC,YAAY,6CACZC,OAAO,YAAa,uCAGvBH,EAAQI,aAAaC,QAAQC,MAC7B,MAAMC,EAAOP,EAAQO,OACrBX,OAAOY,aAAaD,EAAKE,SAGzBT,EAAQU,WAAWf,sBAOnBK,EAAQW,qBAGFd,kBAEN,UACQG,EAAQY,WAAWP,QAAQC,KACnC,CAAE,MAAOO,GACP,MAAMC,EAAiBD,EAEK,mBAAxBC,EAAeC,MAGgB,sBAAxBD,EAAeC,KADxBV,QAAQW,KAAK,IAKbC,QAAQJ,MAAM,SAAUC,EAAeI,SAAW,6BAClDb,QAAQW,KAAK,GAEjB,CACF,CAGAX,QAAQc,GAAG,sBAAuBN,IAC5BA,aAAiBO,MACnBH,QAAQJ,MAAM,+BAAgCA,EAAMK,SAEpDD,QAAQJ,MAAM,+BAAgCA,GAEhDR,QAAQW,KAAK,EAAE,IAIjBjB,OAAOsB,OAAOR,IACRA,aAAiBO,MACnBH,QAAQJ,MAAM,eAAgBA,EAAMK,SAEpCD,QAAQJ,MAAM,eAAgBA,GAEhCR,QAAQW,KAAK,EAAE","ignoreList":[]}
1
+ {"version":3,"names":["Command","createServeCommand","createListCommand","createInstallCommand","createUninstallCommand","createPullCommand","Logger","checkForUpdates","async","main","program","name","description","option","parseOptions","process","argv","opts","setVerbose","verbose","addCommand","exitOverride","parseAsync","error","commanderError","code","exit","console","message","on","Error","catch"],"sources":["../../src/cli/index.ts"],"mappings":";OAESA,YAAe,mBACfC,uBAA0B,6BAC1BC,sBAAyB,4BACzBC,yBAA4B,+BAC5BC,2BAA8B,iCAC9BC,sBAAyB,4BACzBC,WAAc,4BACdC,oBAAuB,2BAOhCC,eAAeC,OAIb,MAAMC,EAAU,IAAIV,QACpBU,EACGC,KAAK,QACLC,YAAY,6CACZC,OAAO,YAAa,uCAGvBH,EAAQI,aAAaC,QAAQC,MAC7B,MAAMC,EAAOP,EAAQO,OACrBX,OAAOY,aAAaD,EAAKE,SAGzBT,EAAQU,WAAWnB,sBACnBS,EAAQU,WAAWjB,wBACnBO,EAAQU,WAAWlB,qBACnBQ,EAAQU,WAAWhB,0BACnBM,EAAQU,WAAWf,qBAGnBK,EAAQW,qBAGFd,kBAEN,UACQG,EAAQY,WAAWP,QAAQC,KACnC,CAAE,MAAOO,GACP,MAAMC,EAAiBD,EAEK,mBAAxBC,EAAeC,MAGgB,sBAAxBD,EAAeC,KADxBV,QAAQW,KAAK,IAKbC,QAAQJ,MAAM,SAAUC,EAAeI,SAAW,6BAClDb,QAAQW,KAAK,GAEjB,CACF,CAGAX,QAAQc,GAAG,sBAAuBN,IAC5BA,aAAiBO,MACnBH,QAAQJ,MAAM,+BAAgCA,EAAMK,SAEpDD,QAAQJ,MAAM,+BAAgCA,GAEhDR,QAAQW,KAAK,EAAE,IAIjBjB,OAAOsB,OAAOR,IACRA,aAAiBO,MACnBH,QAAQJ,MAAM,eAAgBA,EAAMK,SAEpCD,QAAQJ,MAAM,eAAgBA,GAEhCR,QAAQW,KAAK,EAAE","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export declare const SUPPORTED_CLIENTS_TEXT: string;
2
+ export declare function normalizeTargetClients(targets: string[] | undefined, context?: string): string[];
3
+ export declare function parseClientsOption(clientsOption: string | undefined, context?: string): string[];
@@ -0,0 +1,2 @@
1
+ import{SUPPORTED_CLIENT_NAMES}from"../../core/metadatas/constants.js";export const SUPPORTED_CLIENTS_TEXT=SUPPORTED_CLIENT_NAMES.join(", ");function formatContextSuffix(t){return t?` for ${t}`:""}export function normalizeTargetClients(t,e){const n=formatContextSuffix(e);if(!t||0===t.length)throw new Error(`No clients specified${n}. At least one client is required. Supported clients: ${SUPPORTED_CLIENTS_TEXT}`);const r=Array.from(new Set(t.map((t=>t.trim())).filter(Boolean).map((t=>{const e=SUPPORTED_CLIENT_NAMES.find((e=>e.toLowerCase()===t.toLowerCase()));if(!e)throw new Error(`Invalid client name "${t}"${n}. Supported clients: ${SUPPORTED_CLIENTS_TEXT}`);return e}))));if(0===r.length)throw new Error(`No valid clients specified${n}. Supported clients: ${SUPPORTED_CLIENTS_TEXT}`);return r}export function parseClientsOption(t,e="the --clients option"){if(!t)throw new Error(`At least one client must be specified using --clients. Supported clients: ${SUPPORTED_CLIENTS_TEXT}`);return normalizeTargetClients(t.split(";"),e)}
2
+ //# sourceMappingURL=clientOptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SUPPORTED_CLIENT_NAMES","SUPPORTED_CLIENTS_TEXT","join","formatContextSuffix","context","normalizeTargetClients","targets","contextSuffix","length","Error","normalized","Array","from","Set","map","target","trim","filter","Boolean","match","find","name","toLowerCase","parseClientsOption","clientsOption","split"],"sources":["../../../src/cli/utils/clientOptions.ts"],"mappings":"OAASA,2BAA8B,2CAEhC,MAAMC,uBAAyBD,uBAAuBE,KAAK,MAElE,SAASC,oBAAoBC,GAC3B,OAAOA,EAAU,QAAQA,IAAY,EACvC,QAEM,SAAUC,uBAAuBC,EAA+BF,GACpE,MAAMG,EAAgBJ,oBAAoBC,GAE1C,IAAKE,GAA8B,IAAnBA,EAAQE,OACtB,MAAM,IAAIC,MAAM,uBAAuBF,0DAAsEN,0BAG/G,MAAMS,EAAaC,MAAMC,KAAK,IAAIC,IAChCP,EACGQ,KAAIC,GAAUA,EAAOC,SACrBC,OAAOC,SACPJ,KAAIC,IACH,MAAMI,EAAQnB,uBAAuBoB,MAAKC,GAAQA,EAAKC,gBAAkBP,EAAOO,gBAChF,IAAKH,EACH,MAAM,IAAIV,MAAM,wBAAwBM,KAAUR,yBAAqCN,0BAEzF,OAAOkB,CAAK,MAIlB,GAA0B,IAAtBT,EAAWF,OACb,MAAM,IAAIC,MAAM,6BAA6BF,yBAAqCN,0BAGpF,OAAOS,CACT,QAEM,SAAUa,mBACdC,EACApB,EAAU,wBAEV,IAAKoB,EACH,MAAM,IAAIf,MAAM,6EAA6ER,0BAI/F,OAAOI,uBADYmB,EAAcC,MAAM,KACGrB,EAC5C","ignoreList":[]}
@@ -30,6 +30,14 @@ export declare abstract class BaseClientInstaller {
30
30
  * Override in child classes to provide custom initialization
31
31
  */
32
32
  protected initializeSettings(settings: any): void;
33
+ /**
34
+ * Normalize server names for consistent comparisons (e.g., coding-flow vs coding_flow)
35
+ */
36
+ private normalizeServerName;
37
+ /**
38
+ * Adds SOURCE env metadata for coding-flow installations so clients know their origin.
39
+ */
40
+ protected applySourceEnv(target: Record<string, any> | undefined, serverName: string): void;
33
41
  /**
34
42
  * Set up client settings in the provided settings object
35
43
  * Override in child classes to provide custom client settings setup
@@ -1,2 +1,2 @@
1
- import{Logger}from"../../../utils/logger.js";import{exec,spawn}from"child_process";import{promisify}from"util";import*as http from"http";import*as https from"https";import{isCommandAvailable,getNpmExecutablePath}from"../../../utils/osUtils.js";import{ExtensionInstaller}from"./ExtensionInstaller.js";import{SUPPORTED_CLIENTS,INSTRUMENTATION_KEY}from"../../metadatas/constants.js";import{MACRO_EXPRESSIONS,MacroResolverFunctions}from"../../../utils/macroExpressionUtils.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";const execAsync=promisify(exec);export class BaseClientInstaller{generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async setupInstallConfig(e,t){const s={...e.installation};s.mode=e.mode,t.args&&t.args.length>0&&(Logger.debug(`Using args from ServerInstallOptions: ${t.args.join(" ")}`),s.args=t.args);const n=s.env||{},r={APPLICATIONINSIGHTS_CONNECTION_STRING:`InstrumentationKey=${INSTRUMENTATION_KEY}`};for(const[e,t]of Object.entries(n)){const s=t;s.Default&&(r[e]=s.Default)}return s.env={...r,...t.env||{}},await this._resolveConfigMacros(s,t),Logger.debug(`Final installation config: ${JSON.stringify(s)}`),s}async _resolveConfigMacros(e,t){for(const s of Object.values(MACRO_EXPRESSIONS)){const n=e.args?.some((e=>"string"==typeof e&&e.includes(s))),r=Object.values(e.env||{}).some((e=>"string"==typeof e&&e.includes(s)));if(!n&&!r&&s!==MACRO_EXPRESSIONS.PYTHON_PACKAGE){Logger.debug(`Macro ${s} not found in args or env, skipping resolution.`);continue}const a=MacroResolverFunctions[s];if(a){const n=await a(e,t);if(void 0!==n){if(e.args){const t=e.args.join(" ");e.args=e.args.map((e=>"string"==typeof e&&e.includes(s)?e.replace(new RegExp(s.replace(/[${}]/g,"\\$&"),"g"),n):e)),e.args.join(" ")!==t&&Logger.debug(`Args after ${s} ('${n}') replacement: ${e.args.join(" ")}`)}if(e.env){const t=JSON.stringify(e.env);for(const t in e.env)"string"==typeof e.env[t]&&e.env[t].includes(s)&&(e.env[t]=e.env[t].replace(new RegExp(s.replace(/[${}]/g,"\\$&"),"g"),n));JSON.stringify(e.env)!==t&&Logger.debug(`Env after ${s} ('${n}') replacement: ${JSON.stringify(e.env)}`)}}else Logger.debug(`Could not resolve value for macro: ${s}. It will not be replaced.`)}}}async handleWindowsNpx(e){if("win32"===process.platform&&"npx"===e.command){const t=await getNpmExecutablePath();return{...e,command:"cmd",args:["/c","npx",...e.args],env:{...e.env,APPDATA:t}}}return e}initializeSettings(e){e.mcpServers||(e.mcpServers={})}setupSettings(e,t,s){e.mcpServers[t]={type:s.mode||"sse",url:s.url}}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.mcpServers[t]={command:s.command,args:s.args,env:s.env,autoApprove:[],disabled:!1,alwaysAllow:[]}}async isServerReachable(e){return new Promise((t=>{try{const s=new URL(e),n=("https:"===s.protocol?https:http).request(s,{method:"HEAD",timeout:2e3},(e=>{t(!0),e.resume()}));n.on("error",(s=>{Logger.debug(`Server at ${e} is not reachable: ${s.message}`),t(!1)})),n.on("timeout",(()=>{Logger.debug(`Timeout checking server reachability at ${e}`),n.destroy(),t(!1)})),n.end()}catch(s){Logger.error(`Error parsing URL or making request to ${e}: ${s.message}`),t(!1)}}))}async handleSseAndStreamableMode(e,t,s){if(s.url){if(await this.isServerReachable(s.url))Logger.info(`Server at ${s.url} is already running or reachable. Skipping start command.`);else if(s.startingCommand&&"string"==typeof s.startingCommand){Logger.info(`Server at ${s.url} not reachable. Attempting to start server with command: ${s.startingCommand}`);const e=s.startingCommand.split(" "),t=e[0],n=e.slice(1);try{const e=spawn(t,n,{detached:!0,stdio:"ignore",shell:"win32"===process.platform});e.on("error",(e=>{Logger.error(`Failed to start server process with command "${s.startingCommand}": ${e.message}`)})),e.unref(),Logger.info(`Detached server process (PID: ${e.pid}) started with command: "${s.startingCommand}". It will continue running if this main process exits.`)}catch(e){Logger.error(`Exception when trying to spawn server process with command "${s.startingCommand}": ${e.message}`)}}else s.startingCommand?Logger.warn(`startingCommand is present but not a string: ${JSON.stringify(s.startingCommand)}`):Logger.info(`Server at ${s.url} not reachable and no startingCommand provided.`)}else Logger.warn("No URL provided in installConfig for SSE mode. Cannot check reachability or configure server.");this.setupSettings(e,t,s)}async checkVSCodeAndInstallExtension(e){const t=await isCommandAvailable("code"),s=await isCommandAvailable("code-insiders");if(!t&&!s)return{status:"failed",type:"install",target:"server",message:"Failed to install as neither VS Code nor VS Code Insiders are installed on this system. Please run `code` or `code-insiders` to make sure they are installed. Relaunch imcp after installation.",operationId:e};return await ExtensionInstaller.installExtension(this.clientName)?void 0:(Logger.debug(`Failed to install ${this.clientName} extension`),{status:"failed",type:"install",target:"server",message:`Failed to install ${this.clientName} extension`,operationId:e})}async updateVSCodeSettings(e,t){const s=[],n=await isCommandAvailable("code"),r=await isCommandAvailable("code-insiders");if(n)try{const n=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;await this.setupClientSettings(n,e,t),s.push({success:!0,path:n})}catch(e){s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:e instanceof Error?e.message:String(e)})}if(r)try{const n=SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath;await this.setupClientSettings(n,e,t),s.push({success:!0,path:n})}catch(e){s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath,error:e instanceof Error?e.message:String(e)})}return s}async install(e,t,s){const n=this.generateOperationId(),r=InstallOperationManager.getInstance(s||e.name,e.name);return await r.recording((async()=>{await r.recording((()=>this.checkVSCodeAndInstallExtension(n)),{stepName:RecordingConstants.STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION,endMessage:e=>e?.message,onResult:e=>"failed"!==e?.status});const s=await r.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const a=await r.recording((()=>this.updateVSCodeSettings(e.name,s)),{stepName:RecordingConstants.STEP_UPDATE_VSCODE_SETTINGS,endMessage:e=>e?.some((e=>e.success))?`Updated settings in: ${e.map((e=>e.path)).join(", ")}`:`Failed to update settings: ${e.map((e=>e.error)).join("; ")}`,onResult:e=>e?.some((e=>e.success))}),o=a.some((e=>e.success)),i=a.filter((e=>e.success)).map((e=>e.path)),l=a.filter((e=>!e.success)).map((e=>e.error));return{status:o?"completed":"failed",type:"install",target:"server",message:o?`Successfully installed ${this.clientName} client. Updated settings in: ${i.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:n,error:o?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:n,error:e instanceof Error?e.message:String(e)},message:t}}})}}
1
+ import{Logger}from"../../../utils/logger.js";import{exec,spawn}from"child_process";import{promisify}from"util";import*as http from"http";import*as https from"https";import{isCommandAvailable,getNpmExecutablePath}from"../../../utils/osUtils.js";import{ExtensionInstaller}from"./ExtensionInstaller.js";import{SUPPORTED_CLIENTS,INSTRUMENTATION_KEY}from"../../metadatas/constants.js";import{MACRO_EXPRESSIONS,MacroResolverFunctions}from"../../../utils/macroExpressionUtils.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";const execAsync=promisify(exec);export class BaseClientInstaller{generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async setupInstallConfig(e,t){const s={...e.installation};s.mode=e.mode,t.args&&t.args.length>0&&(Logger.debug(`Using args from ServerInstallOptions: ${t.args.join(" ")}`),s.args=t.args);const n=s.env||{},r={APPLICATIONINSIGHTS_CONNECTION_STRING:`InstrumentationKey=${INSTRUMENTATION_KEY}`};for(const[e,t]of Object.entries(n)){const s=t;s.Default&&(r[e]=s.Default)}return s.env={...r,...t.env||{}},await this._resolveConfigMacros(s,t),Logger.debug(`Final installation config: ${JSON.stringify(s)}`),s}async _resolveConfigMacros(e,t){for(const s of Object.values(MACRO_EXPRESSIONS)){const n=e.args?.some((e=>"string"==typeof e&&e.includes(s))),r=Object.values(e.env||{}).some((e=>"string"==typeof e&&e.includes(s)));if(!n&&!r&&s!==MACRO_EXPRESSIONS.PYTHON_PACKAGE){Logger.debug(`Macro ${s} not found in args or env, skipping resolution.`);continue}const a=MacroResolverFunctions[s];if(a){const n=await a(e,t);if(void 0!==n){if(e.args){const t=e.args.join(" ");e.args=e.args.map((e=>"string"==typeof e&&e.includes(s)?e.replace(new RegExp(s.replace(/[${}]/g,"\\$&"),"g"),n):e)),e.args.join(" ")!==t&&Logger.debug(`Args after ${s} ('${n}') replacement: ${e.args.join(" ")}`)}if(e.env){const t=JSON.stringify(e.env);for(const t in e.env)"string"==typeof e.env[t]&&e.env[t].includes(s)&&(e.env[t]=e.env[t].replace(new RegExp(s.replace(/[${}]/g,"\\$&"),"g"),n));JSON.stringify(e.env)!==t&&Logger.debug(`Env after ${s} ('${n}') replacement: ${JSON.stringify(e.env)}`)}}else Logger.debug(`Could not resolve value for macro: ${s}. It will not be replaced.`)}}}async handleWindowsNpx(e){if("win32"===process.platform&&"npx"===e.command){const t=await getNpmExecutablePath();return{...e,command:"cmd",args:["/c","npx",...e.args],env:{...e.env,APPDATA:t}}}return e}initializeSettings(e){e.mcpServers||(e.mcpServers={})}normalizeServerName(e){return(e||"").toLowerCase().replace(/_/g,"-")}applySourceEnv(e,t){e&&"coding-flow"===this.normalizeServerName(t)&&(e.env&&"object"==typeof e.env||(e.env={}),e.env.SOURCE=this.clientName)}setupSettings(e,t,s){e.mcpServers[t]={type:s.mode||"sse",url:s.url},this.applySourceEnv(e.mcpServers[t],t)}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.mcpServers[t]={command:s.command,args:s.args,env:s.env,autoApprove:[],disabled:!1,alwaysAllow:[]},this.applySourceEnv(e.mcpServers[t],t)}async isServerReachable(e){return new Promise((t=>{try{const s=new URL(e),n=("https:"===s.protocol?https:http).request(s,{method:"HEAD",timeout:2e3},(e=>{t(!0),e.resume()}));n.on("error",(s=>{Logger.debug(`Server at ${e} is not reachable: ${s.message}`),t(!1)})),n.on("timeout",(()=>{Logger.debug(`Timeout checking server reachability at ${e}`),n.destroy(),t(!1)})),n.end()}catch(s){Logger.error(`Error parsing URL or making request to ${e}: ${s.message}`),t(!1)}}))}async handleSseAndStreamableMode(e,t,s){if(s.url){if(await this.isServerReachable(s.url))Logger.info(`Server at ${s.url} is already running or reachable. Skipping start command.`);else if(s.startingCommand&&"string"==typeof s.startingCommand){Logger.info(`Server at ${s.url} not reachable. Attempting to start server with command: ${s.startingCommand}`);const e=s.startingCommand.split(" "),t=e[0],n=e.slice(1);try{const e=spawn(t,n,{detached:!0,stdio:"ignore",shell:"win32"===process.platform});e.on("error",(e=>{Logger.error(`Failed to start server process with command "${s.startingCommand}": ${e.message}`)})),e.unref(),Logger.info(`Detached server process (PID: ${e.pid}) started with command: "${s.startingCommand}". It will continue running if this main process exits.`)}catch(e){Logger.error(`Exception when trying to spawn server process with command "${s.startingCommand}": ${e.message}`)}}else s.startingCommand?Logger.warn(`startingCommand is present but not a string: ${JSON.stringify(s.startingCommand)}`):Logger.info(`Server at ${s.url} not reachable and no startingCommand provided.`)}else Logger.warn("No URL provided in installConfig for SSE mode. Cannot check reachability or configure server.");this.setupSettings(e,t,s)}async checkVSCodeAndInstallExtension(e){const t=await isCommandAvailable("code"),s=await isCommandAvailable("code-insiders");if(!t&&!s)return{status:"failed",type:"install",target:"server",message:"Failed to install as neither VS Code nor VS Code Insiders are installed on this system. Please run `code` or `code-insiders` to make sure they are installed. Relaunch imcp after installation.",operationId:e};return await ExtensionInstaller.installExtension(this.clientName)?void 0:(Logger.debug(`Failed to install ${this.clientName} extension`),{status:"failed",type:"install",target:"server",message:`Failed to install ${this.clientName} extension`,operationId:e})}async updateVSCodeSettings(e,t){const s=[],n=await isCommandAvailable("code"),r=await isCommandAvailable("code-insiders");if(n)try{const n=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;await this.setupClientSettings(n,e,t),s.push({success:!0,path:n})}catch(e){s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:e instanceof Error?e.message:String(e)})}if(r)try{const n=SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath;await this.setupClientSettings(n,e,t),s.push({success:!0,path:n})}catch(e){s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeInsiderSettingPath,error:e instanceof Error?e.message:String(e)})}return s}async install(e,t,s){const n=this.generateOperationId(),r=InstallOperationManager.getInstance(s||e.name,e.name);return await r.recording((async()=>{await r.recording((()=>this.checkVSCodeAndInstallExtension(n)),{stepName:RecordingConstants.STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION,endMessage:e=>e?.message,onResult:e=>"failed"!==e?.status});const s=await r.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const a=await r.recording((()=>this.updateVSCodeSettings(e.name,s)),{stepName:RecordingConstants.STEP_UPDATE_VSCODE_SETTINGS,endMessage:e=>e?.some((e=>e.success))?`Updated settings in: ${e.map((e=>e.path)).join(", ")}`:`Failed to update settings: ${e.map((e=>e.error)).join("; ")}`,onResult:e=>e?.some((e=>e.success))}),o=a.some((e=>e.success)),i=a.filter((e=>e.success)).map((e=>e.path)),l=a.filter((e=>!e.success)).map((e=>e.error));return{status:o?"completed":"failed",type:"install",target:"server",message:o?`Successfully installed ${this.clientName} client. Updated settings in: ${i.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:n,error:o?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:n,error:e instanceof Error?e.message:String(e)},message:t}}})}}
2
2
  //# sourceMappingURL=BaseClientInstaller.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Logger","exec","spawn","promisify","http","https","isCommandAvailable","getNpmExecutablePath","ExtensionInstaller","SUPPORTED_CLIENTS","INSTRUMENTATION_KEY","MACRO_EXPRESSIONS","MacroResolverFunctions","InstallOperationManager","RecordingConstants","execAsync","BaseClientInstaller","generateOperationId","Date","now","Math","random","toString","substr","setupInstallConfig","serverConfig","options","finalConfig","installation","mode","args","length","debug","join","baseEnv","env","defaultEnv","APPLICATIONINSIGHTS_CONNECTION_STRING","key","config","Object","entries","envConfig","Default","this","_resolveConfigMacros","JSON","stringify","macro","values","isMacroInArgs","some","arg","includes","isMacroInEnv","value","PYTHON_PACKAGE","resolver","resolvedValue","undefined","originalArgsString","map","replace","RegExp","originalEnvJson","handleWindowsNpx","process","platform","command","npmPath","APPDATA","initializeSettings","settings","mcpServers","setupSettings","serverName","installConfig","type","url","handleStdioMode","autoApprove","disabled","alwaysAllow","isServerReachable","urlString","Promise","resolve","URL","request","protocol","method","timeout","res","resume","on","err","message","destroy","end","error","handleSseAndStreamableMode","info","startingCommand","commandParts","split","slice","child","detached","stdio","shell","unref","pid","warn","checkVSCodeAndInstallExtension","operationId","isVSCodeInstalled","isVSCodeInsidersInstalled","status","target","installExtension","clientName","updateVSCodeSettings","results","settingPath","codeSettingPath","setupClientSettings","push","success","path","Error","String","codeInsiderSettingPath","install","categoryName","recorder","getInstance","name","recording","async","stepName","STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION","endMessage","result","onResult","STEP_SETUP_INSTALLATION_CONFIG","STEP_UPDATE_VSCODE_SETTINGS","r","anySuccess","successPaths","filter","errors","STEP_INSTALLATION","onError","errorMsg"],"sources":["../../../../src/core/installers/clients/BaseClientInstaller.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Logger","exec","spawn","promisify","http","https","isCommandAvailable","getNpmExecutablePath","ExtensionInstaller","SUPPORTED_CLIENTS","INSTRUMENTATION_KEY","MACRO_EXPRESSIONS","MacroResolverFunctions","InstallOperationManager","RecordingConstants","execAsync","BaseClientInstaller","generateOperationId","Date","now","Math","random","toString","substr","setupInstallConfig","serverConfig","options","finalConfig","installation","mode","args","length","debug","join","baseEnv","env","defaultEnv","APPLICATIONINSIGHTS_CONNECTION_STRING","key","config","Object","entries","envConfig","Default","this","_resolveConfigMacros","JSON","stringify","macro","values","isMacroInArgs","some","arg","includes","isMacroInEnv","value","PYTHON_PACKAGE","resolver","resolvedValue","undefined","originalArgsString","map","replace","RegExp","originalEnvJson","handleWindowsNpx","process","platform","command","npmPath","APPDATA","initializeSettings","settings","mcpServers","normalizeServerName","serverName","toLowerCase","applySourceEnv","target","SOURCE","clientName","setupSettings","installConfig","type","url","handleStdioMode","autoApprove","disabled","alwaysAllow","isServerReachable","urlString","Promise","resolve","URL","request","protocol","method","timeout","res","resume","on","err","message","destroy","end","error","handleSseAndStreamableMode","info","startingCommand","commandParts","split","slice","child","detached","stdio","shell","unref","pid","warn","checkVSCodeAndInstallExtension","operationId","isVSCodeInstalled","isVSCodeInsidersInstalled","status","installExtension","updateVSCodeSettings","results","settingPath","codeSettingPath","setupClientSettings","push","success","path","Error","String","codeInsiderSettingPath","install","categoryName","recorder","getInstance","name","recording","async","stepName","STEP_CHECK_VSCODE_AND_INSTALL_EXTENSION","endMessage","result","onResult","STEP_SETUP_INSTALLATION_CONFIG","STEP_UPDATE_VSCODE_SETTINGS","r","anySuccess","successPaths","filter","errors","STEP_INSTALLATION","onError","errorMsg"],"sources":["../../../../src/core/installers/clients/BaseClientInstaller.ts"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{BaseClientInstaller}from"./BaseClientInstaller.js";import{Logger}from"../../../utils/logger.js";import fs from"fs/promises";import path from"path";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";export class ClaudeCodeInstaller extends BaseClientInstaller{clientName="ClaudeCode";async updateClaudeSettings(e,t){Logger.debug("Updating Claude Desktop settings");const s=[];try{const a=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;Logger.debug(`Attempting to update settings at: ${a}`),await this.setupClientSettings(a,e,t),s.push({success:!0,path:a}),Logger.debug("Successfully updated Claude Desktop settings")}catch(e){const t=e instanceof Error?e.message:String(e);Logger.error("Failed to update Claude Desktop settings:",e),s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:t})}return s}async setupClientSettings(e,t,s){Logger.debug(`Setting up Claude Desktop client settings at ${e}`);try{const a=path.dirname(e);await fs.mkdir(a,{recursive:!0});let n={};try{const t=await fs.readFile(e,"utf8");n=JSON.parse(t)}catch(e){Logger.debug("No existing settings file found, creating new one")}this.initializeSettings(n),"stdio"===s.mode?await this.handleStdioMode(n,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||await this.handleSseAndStreamableMode(n,t,s),await fs.writeFile(e,JSON.stringify(n,null,2),"utf8"),Logger.debug(`Successfully updated Claude Desktop settings at ${e}`)}catch(e){throw Logger.error("Failed to setup Claude Desktop client settings:",e),e}}initializeSettings(e){e.mcpServers||(e.mcpServers={})}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.mcpServers[t]={type:"stdio",command:s.command,args:s.args,env:s.env||{}}}async install(e,t,s){const a=this.generateOperationId(),n=InstallOperationManager.getInstance(s||e.name,e.name);return await n.recording((async()=>{const s=await n.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const r=await n.recording((()=>this.updateClaudeSettings(e.name,s)),{stepName:"Update Claude Desktop Settings",onResult:e=>e?.some((e=>e.success))}),i=r.some((e=>e.success)),o=r.filter((e=>e.success)).map((e=>e.path)),l=r.filter((e=>!e.success)).map((e=>e.error));return{status:i?"completed":"failed",type:"install",target:"server",message:i?`Successfully installed ${this.clientName} client. Updated settings in: ${o.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:a,error:i?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:a,error:e instanceof Error?e.message:String(e)},message:t}}})}}
1
+ import{BaseClientInstaller}from"./BaseClientInstaller.js";import{Logger}from"../../../utils/logger.js";import fs from"fs/promises";import path from"path";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";export class ClaudeCodeInstaller extends BaseClientInstaller{clientName="ClaudeCode";async updateClaudeSettings(e,t){Logger.debug("Updating Claude Desktop settings");const s=[];try{const a=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;Logger.debug(`Attempting to update settings at: ${a}`),await this.setupClientSettings(a,e,t),s.push({success:!0,path:a}),Logger.debug("Successfully updated Claude Desktop settings")}catch(e){const t=e instanceof Error?e.message:String(e);Logger.error("Failed to update Claude Desktop settings:",e),s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:t})}return s}async setupClientSettings(e,t,s){Logger.debug(`Setting up Claude Desktop client settings at ${e}`);try{const a=path.dirname(e);await fs.mkdir(a,{recursive:!0});let n={};try{const t=await fs.readFile(e,"utf8");n=JSON.parse(t)}catch(e){Logger.debug("No existing settings file found, creating new one")}this.initializeSettings(n),"stdio"===s.mode?await this.handleStdioMode(n,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||await this.handleSseAndStreamableMode(n,t,s),await fs.writeFile(e,JSON.stringify(n,null,2),"utf8"),Logger.debug(`Successfully updated Claude Desktop settings at ${e}`)}catch(e){throw Logger.error("Failed to setup Claude Desktop client settings:",e),e}}initializeSettings(e){e.mcpServers||(e.mcpServers={})}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.mcpServers[t]={type:"stdio",command:s.command,args:s.args,env:s.env||{}},this.applySourceEnv(e.mcpServers[t],t)}async install(e,t,s){const a=this.generateOperationId(),n=InstallOperationManager.getInstance(s||e.name,e.name);return await n.recording((async()=>{const s=await n.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const r=await n.recording((()=>this.updateClaudeSettings(e.name,s)),{stepName:"Update Claude Desktop Settings",onResult:e=>e?.some((e=>e.success))}),i=r.some((e=>e.success)),o=r.filter((e=>e.success)).map((e=>e.path)),l=r.filter((e=>!e.success)).map((e=>e.error));return{status:i?"completed":"failed",type:"install",target:"server",message:i?`Successfully installed ${this.clientName} client. Updated settings in: ${o.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:a,error:i?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:a,error:e instanceof Error?e.message:String(e)},message:t}}})}}
2
2
  //# sourceMappingURL=ClaudeCodeInstaller.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BaseClientInstaller","Logger","fs","path","SUPPORTED_CLIENTS","InstallOperationManager","RecordingConstants","ClaudeCodeInstaller","clientName","updateClaudeSettings","serverName","installConfig","debug","results","settingPath","this","codeSettingPath","setupClientSettings","push","success","error","errorMessage","Error","message","String","settingsDir","dirname","mkdir","recursive","settings","existingContent","readFile","JSON","parse","initializeSettings","mode","handleStdioMode","handleSseAndStreamableMode","writeFile","stringify","mcpServers","finalConfig","args","map","arg","replace","type","command","env","install","serverConfig","options","categoryName","operationId","generateOperationId","recorder","getInstance","name","recording","async","setupInstallConfig","stepName","STEP_SETUP_INSTALLATION_CONFIG","onResult","result","some","r","anySuccess","successPaths","filter","errors","status","target","join","undefined","STEP_INSTALLATION","endMessage","onError","errorMsg"],"sources":["../../../../src/core/installers/clients/ClaudeCodeInstaller.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["BaseClientInstaller","Logger","fs","path","SUPPORTED_CLIENTS","InstallOperationManager","RecordingConstants","ClaudeCodeInstaller","clientName","updateClaudeSettings","serverName","installConfig","debug","results","settingPath","this","codeSettingPath","setupClientSettings","push","success","error","errorMessage","Error","message","String","settingsDir","dirname","mkdir","recursive","settings","existingContent","readFile","JSON","parse","initializeSettings","mode","handleStdioMode","handleSseAndStreamableMode","writeFile","stringify","mcpServers","finalConfig","args","map","arg","replace","type","command","env","applySourceEnv","install","serverConfig","options","categoryName","operationId","generateOperationId","recorder","getInstance","name","recording","async","setupInstallConfig","stepName","STEP_SETUP_INSTALLATION_CONFIG","onResult","result","some","r","anySuccess","successPaths","filter","errors","status","target","join","undefined","STEP_INSTALLATION","endMessage","onError","errorMsg"],"sources":["../../../../src/core/installers/clients/ClaudeCodeInstaller.ts"],"mappings":"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","ignoreList":[]}
@@ -17,6 +17,9 @@ export declare class ClientInstaller {
17
17
  * Install client with requirements checking
18
18
  */
19
19
  private installClient;
20
+ private runInstallationBlocking;
21
+ private runInstallationAsync;
22
+ private finalizeClientStatus;
20
23
  private processInstallation;
21
24
  /**
22
25
  * Generate a unique operation ID for tracking installations
@@ -1,2 +1,2 @@
1
- import{ConfigurationProvider}from"../../loaders/ConfigurationProvider.js";import{Logger}from"../../../utils/logger.js";import{ClientInstallerFactory}from"./ClientInstallerFactory.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";export class ClientInstaller{categoryName;serverName;clients;configProvider;constructor(e,t,r){this.categoryName=e,this.serverName=t,this.clients=r,this.configProvider=ConfigurationProvider.getInstance()}async install(e){const t=[],r=this.clients.map((async r=>{const a=await this.installClient(r,e);return t.push(a),a}));return await Promise.all(r),{success:!0,message:"Client installations completed",status:t}}async installClient(e,t){const r=this.generateOperationId();if(!ClientInstallerFactory.isClientSupported(e))return{status:"failed",type:"install",target:"server",message:`Unsupported client: ${e}`,operationId:r};const a={status:"pending",type:"install",target:"server",message:`Initializing installation for client: ${e}`,operationId:r};return this.processInstallation(e,r,t).then((t=>{"completed"!==t.status&&"failed"!==t.status||InstallOperationManager.getInstance(this.categoryName,this.serverName).markOverallStatus(t.status),this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,t)})).catch((t=>{this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,{status:"failed",type:"install",target:"server",message:`Error installing client ${e}: ${t instanceof Error?t.message:String(t)}`,operationId:r,error:t instanceof Error?t.message:String(t)}),Logger.error(`Error installing client ${e}: ${t instanceof Error?t.message:String(t)}`),InstallOperationManager.getInstance(this.categoryName,this.serverName).markOverallStatus("failed",t)})),await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,a),a}async processInstallation(e,t,r){if(!await this.checkRequirements(t,e,r)){return{status:"failed",type:"install",target:"server",message:`Requirements not ready for client: ${e} after timeout`,operationId:t}}const a=ClientInstallerFactory.getInstaller(e);if(!a)throw new Error(`Failed to create installer for client: ${e}`);const s=await this.configProvider.getServerMcpConfig(this.categoryName,this.serverName);if(!s)throw new Error(`Server configuration not found for category: ${this.categoryName}, server: ${this.serverName}`);const i={status:"in-progress",type:"install",target:"server",message:`Installing client: ${e}`,operationId:t};return await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,i),await a.install(s,r,this.categoryName)}generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async checkRequirements(e,t,r){let a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName);if(!a){const r={status:"pending",type:"install",target:"server",message:`Waiting for requirements to be ready for client: ${t}`,operationId:e};await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,t,r);const s=Date.now(),i=3e5,n=5e3;for(;!a&&Date.now()-s<i;)await new Promise((e=>setTimeout(e,n))),a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName)}const s=(await this.configProvider.GetServerRequirementStatus(this.categoryName,this.serverName)).find((e=>e.npmPath&&e.npmPath.length>0));return s&&s.npmPath&&(r.settings=r.settings||{},r.settings.npmPath=s.npmPath),a}}
1
+ import{ConfigurationProvider}from"../../loaders/ConfigurationProvider.js";import{Logger}from"../../../utils/logger.js";import{ClientInstallerFactory}from"./ClientInstallerFactory.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";export class ClientInstaller{categoryName;serverName;clients;configProvider;constructor(t,e,r){this.categoryName=t,this.serverName=e,this.clients=r,this.configProvider=ConfigurationProvider.getInstance()}async install(t){const e=await Promise.all(this.clients.map((e=>this.installClient(e,t)))),r=e.every((t=>"failed"!==t.status));return{success:r,message:r?"Client installations completed":"One or more client installations failed",status:e}}async installClient(t,e){const r=this.generateOperationId();if(!ClientInstallerFactory.isClientSupported(t))return{status:"failed",type:"install",target:"server",message:`Unsupported client: ${t}`,operationId:r};const a={status:"pending",type:"install",target:"server",message:`Initializing installation for client: ${t}`,operationId:r};return await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,t,a),e.blockUntilComplete?await this.runInstallationBlocking(t,r,e):(this.runInstallationAsync(t,r,e),a)}async runInstallationBlocking(t,e,r){try{const a=await this.processInstallation(t,e,r);return await this.finalizeClientStatus(t,a),a}catch(r){const a={status:"failed",type:"install",target:"server",message:`Error installing client ${t}: ${r instanceof Error?r.message:String(r)}`,operationId:e,error:r instanceof Error?r.message:String(r)};return await this.finalizeClientStatus(t,a,r),a}}runInstallationAsync(t,e,r){this.processInstallation(t,e,r).then((e=>this.finalizeClientStatus(t,e))).catch((async r=>{const a={status:"failed",type:"install",target:"server",message:`Error installing client ${t}: ${r instanceof Error?r.message:String(r)}`,operationId:e,error:r instanceof Error?r.message:String(r)};await this.finalizeClientStatus(t,a,r)}))}async finalizeClientStatus(t,e,r){await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,t,e),"failed"===e.status&&r&&Logger.error(`Error installing client ${t}: ${r instanceof Error?r.message:String(r)}`),"completed"!==e.status&&"failed"!==e.status||await InstallOperationManager.getInstance(this.categoryName,this.serverName).markOverallStatus(e.status,"failed"===e.status?e.error||e.message:void 0)}async processInstallation(t,e,r){if(!await this.checkRequirements(e,t,r)){return{status:"failed",type:"install",target:"server",message:`Requirements not ready for client: ${t} after timeout`,operationId:e}}const a=ClientInstallerFactory.getInstaller(t);if(!a)throw new Error(`Failed to create installer for client: ${t}`);const i=await this.configProvider.getServerMcpConfig(this.categoryName,this.serverName);if(!i)throw new Error(`Server configuration not found for category: ${this.categoryName}, server: ${this.serverName}`);const s={status:"in-progress",type:"install",target:"server",message:`Installing client: ${t}`,operationId:e};return await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,t,s),await a.install(i,r,this.categoryName)}generateOperationId(){return`install-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}async checkRequirements(t,e,r){let a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName);if(!a){const r={status:"pending",type:"install",target:"server",message:`Waiting for requirements to be ready for client: ${e}`,operationId:t};await this.configProvider.updateServerOperationStatus(this.categoryName,this.serverName,e,r);const i=Date.now(),s=3e5,n=5e3;for(;!a&&Date.now()-i<s;)await new Promise((t=>setTimeout(t,n))),a=await this.configProvider.isRequirementsReady(this.categoryName,this.serverName)}const i=(await this.configProvider.GetServerRequirementStatus(this.categoryName,this.serverName)).find((t=>t.npmPath&&t.npmPath.length>0));return i&&i.npmPath&&(r.settings=r.settings||{},r.settings.npmPath=i.npmPath),a}}
2
2
  //# sourceMappingURL=ClientInstaller.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ConfigurationProvider","Logger","ClientInstallerFactory","InstallOperationManager","ClientInstaller","categoryName","serverName","clients","configProvider","constructor","this","getInstance","install","options","initialStatuses","installPromises","map","async","clientName","status","installClient","push","Promise","all","success","message","operationId","generateOperationId","isClientSupported","type","target","initialStatus","processInstallation","then","markOverallStatus","updateServerOperationStatus","catch","error","Error","String","checkRequirements","installer","getInstaller","serverConfig","getServerMcpConfig","inProgressStatus","Date","now","Math","random","toString","substr","requirementsReady","isRequirementsReady","pendingStatus","startTime","timeoutMs","intervalMs","resolve","setTimeout","npmPathRequirement","GetServerRequirementStatus","find","npmPath","length","settings"],"sources":["../../../../src/core/installers/clients/ClientInstaller.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["ConfigurationProvider","Logger","ClientInstallerFactory","InstallOperationManager","ClientInstaller","categoryName","serverName","clients","configProvider","constructor","this","getInstance","install","options","statuses","Promise","all","map","clientName","installClient","allSuccessful","every","status","success","message","operationId","generateOperationId","isClientSupported","type","target","initialStatus","updateServerOperationStatus","blockUntilComplete","runInstallationBlocking","runInstallationAsync","processInstallation","finalizeClientStatus","error","failureStatus","Error","String","then","catch","async","markOverallStatus","undefined","checkRequirements","installer","getInstaller","serverConfig","getServerMcpConfig","inProgressStatus","Date","now","Math","random","toString","substr","requirementsReady","isRequirementsReady","pendingStatus","startTime","timeoutMs","intervalMs","resolve","setTimeout","npmPathRequirement","GetServerRequirementStatus","find","npmPath","length","settings"],"sources":["../../../../src/core/installers/clients/ClientInstaller.ts"],"mappings":"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","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{MSRooCodeInstaller}from"./MSRooCodeInstaller.js";import{ClineInstaller}from"./ClineInstaller.js";import{GithubCopilotInstaller}from"./GithubCopilotInstaller.js";import{VisualStudioInstaller}from"./VisualStudioInstaller.js";import{ClaudeCodeInstaller}from"./ClaudeCodeInstaller.js";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";export class ClientInstallerFactory{static installerMap={[Object.keys(SUPPORTED_CLIENTS)[0]]:MSRooCodeInstaller,[Object.keys(SUPPORTED_CLIENTS)[1]]:ClineInstaller,[Object.keys(SUPPORTED_CLIENTS)[2]]:GithubCopilotInstaller,[Object.keys(SUPPORTED_CLIENTS)[3]]:ClaudeCodeInstaller,[Object.keys(SUPPORTED_CLIENTS)[4]]:VisualStudioInstaller};static getInstaller(t){if(!SUPPORTED_CLIENTS[t])return;const l=this.installerMap[t];return l?new l:void 0}static isClientSupported(t){return!!SUPPORTED_CLIENTS[t]}}
1
+ import{MSRooCodeInstaller}from"./MSRooCodeInstaller.js";import{ClineInstaller}from"./ClineInstaller.js";import{GithubCopilotInstaller}from"./GithubCopilotInstaller.js";import{VisualStudioInstaller}from"./VisualStudioInstaller.js";import{ClaudeCodeInstaller}from"./ClaudeCodeInstaller.js";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{RooCodeInstaller}from"./RooCodeInstaller.js";export class ClientInstallerFactory{static installerMap=(()=>{const t={MSRooCode:MSRooCodeInstaller,RooCode:RooCodeInstaller,Cline:ClineInstaller,GithubCopilot:GithubCopilotInstaller,ClaudeCode:ClaudeCodeInstaller};return SUPPORTED_CLIENTS.VisualStudio&&(t.VisualStudio=VisualStudioInstaller),t})();static getInstaller(t){if(!SUPPORTED_CLIENTS[t])return;const l=this.installerMap[t];return l?new l:void 0}static isClientSupported(t){return!!SUPPORTED_CLIENTS[t]}}
2
2
  //# sourceMappingURL=ClientInstallerFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["MSRooCodeInstaller","ClineInstaller","GithubCopilotInstaller","VisualStudioInstaller","ClaudeCodeInstaller","SUPPORTED_CLIENTS","ClientInstallerFactory","static","Object","keys","getInstaller","clientName","InstallerClass","this","installerMap","undefined","isClientSupported"],"sources":["../../../../src/core/installers/clients/ClientInstallerFactory.ts"],"mappings":"OAASA,uBAA0B,iCAC1BC,mBAAsB,6BACtBC,2BAA8B,qCAC9BC,0BAA6B,oCAC7BC,wBAA2B,kCAE3BC,sBAAyB,sCAM5B,MAAOC,uBACDC,oBAA8E,CAClF,CAACC,OAAOC,KAAKJ,mBAAmB,IAAKL,mBACrC,CAACQ,OAAOC,KAAKJ,mBAAmB,IAAKJ,eACrC,CAACO,OAAOC,KAAKJ,mBAAmB,IAAKH,uBACrC,CAACM,OAAOC,KAAKJ,mBAAmB,IAAKD,oBACrC,CAACI,OAAOC,KAAKJ,mBAAmB,IAAKF,uBAQzC,mBAAOO,CACHC,GAGA,IAAKN,kBAAkBM,GACnB,OAGJ,MAAMC,EAAiBC,KAAKC,aAAaH,GACzC,OAAOC,EAAiB,IAAIA,OAAmBG,CACnD,CAOA,wBAAOC,CAAkBL,GACrB,QAASN,kBAAkBM,EAC/B","ignoreList":[]}
1
+ {"version":3,"names":["MSRooCodeInstaller","ClineInstaller","GithubCopilotInstaller","VisualStudioInstaller","ClaudeCodeInstaller","SUPPORTED_CLIENTS","RooCodeInstaller","ClientInstallerFactory","static","map","MSRooCode","RooCode","Cline","GithubCopilot","ClaudeCode","VisualStudio","getInstaller","clientName","InstallerClass","this","installerMap","undefined","isClientSupported"],"sources":["../../../../src/core/installers/clients/ClientInstallerFactory.ts"],"mappings":"OAASA,uBAA0B,iCAC1BC,mBAAsB,6BACtBC,2BAA8B,qCAC9BC,0BAA6B,oCAC7BC,wBAA2B,kCAE3BC,sBAAyB,sCACzBC,qBAAwB,+BAM3B,MAAOC,uBACDC,oBAA8E,MAClF,MAAMC,EAAqD,CACvDC,UAAWV,mBACXW,QAASL,iBACTM,MAAOX,eACPY,cAAeX,uBACfY,WAAYV,qBAOhB,OAJIC,kBAAkBU,eAClBN,EAAIM,aAAeZ,uBAGhBM,CACV,EAdqF,GAqBtF,mBAAOO,CACHC,GAGA,IAAKZ,kBAAkBY,GACnB,OAGJ,MAAMC,EAAiBC,KAAKC,aAAaH,GACzC,OAAOC,EAAiB,IAAIA,OAAmBG,CACnD,CAOA,wBAAOC,CAAkBL,GACrB,QAASZ,kBAAkBY,EAC/B","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ import { BaseClientInstaller } from './BaseClientInstaller.js';
2
+ /**
3
+ * Codex client installer implementation
4
+ * Handles installation of Codex client and settings configuration in TOML format
5
+ * Based on: https://github.com/openai/codex/blob/main/docs/config.md#mcp-integration
6
+ */
7
+ export declare class CodexInstaller extends BaseClientInstaller {
8
+ protected readonly clientName: string;
9
+ /**
10
+ * Codex doesn't require VS Code or extension installation
11
+ * Override to skip VS Code checks
12
+ */
13
+ protected checkVSCodeAndInstallExtension(operationId: string): Promise<any>;
14
+ /**
15
+ * Update Codex settings (not VS Code)
16
+ * Override to configure Codex config.toml instead of VS Code settings
17
+ */
18
+ protected updateVSCodeSettings(serverName: string, installConfig: any): Promise<Array<{
19
+ success: boolean;
20
+ path: string;
21
+ error?: string;
22
+ }>>;
23
+ /**
24
+ * Initialize settings with Codex-specific structure
25
+ * Overrides base method to provide custom initialization
26
+ */
27
+ protected initializeSettings(settings: any): void;
28
+ /**
29
+ * Handle stdio mode configuration for Codex
30
+ * Overrides base method to provide custom stdio configuration in TOML format
31
+ */
32
+ protected handleStdioMode(settings: any, serverName: string, finalConfig: any): Promise<void>;
33
+ /**
34
+ * Handle SSE and Streamable-Http mode configuration for Codex
35
+ * Overrides base method to provide custom SSE or Streamable-Http configuration in TOML format
36
+ * Note: We don't call parent implementation as it uses JSON structure (mcpServers) instead of TOML (mcp_servers)
37
+ */
38
+ protected handleSseAndStreamableMode(settings: any, serverName: string, installConfig: any): Promise<void>;
39
+ /**
40
+ * Set up Codex client settings
41
+ * Updates Codex config.toml with MCP server configuration
42
+ * Note: Codex uses TOML format instead of JSON
43
+ */
44
+ setupClientSettings(settingPath: string, serverName: string, installConfig: any): Promise<void>;
45
+ }
@@ -0,0 +1,2 @@
1
+ import{BaseClientInstaller}from"./BaseClientInstaller.js";import{readTomlFile,writeTomlFile}from"../../../utils/tomlUtils.js";import{Logger}from"../../../utils/logger.js";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";export class CodexInstaller extends BaseClientInstaller{clientName="Codex";async checkVSCodeAndInstallExtension(e){Logger.info("Codex is a standalone CLI tool, skipping VS Code check")}async updateVSCodeSettings(e,t){const s=[];try{const r=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;await this.setupClientSettings(r,e,t),s.push({success:!0,path:r})}catch(e){s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:e instanceof Error?e.message:String(e)})}return s}initializeSettings(e){e.mcp_servers||(e.mcp_servers={})}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e)));const r={command:s.command};s.args&&s.args.length>0&&(r.args=s.args),s.env&&Object.keys(s.env).length>0&&(r.env=s.env),s.cwd&&(r.cwd=s.cwd),e.mcp_servers[t]=r}async handleSseAndStreamableMode(e,t,s){if(s.url){const r={url:s.url};s.bearerTokenEnvVar&&(r.bearer_token_env_var=s.bearerTokenEnvVar),s.httpHeaders&&Object.keys(s.httpHeaders).length>0&&(r.http_headers=s.httpHeaders),s.envHttpHeaders&&Object.keys(s.envHttpHeaders).length>0&&(r.env_http_headers=s.envHttpHeaders),e.mcp_servers[t]=r}}async setupClientSettings(e,t,s){try{const r=await readTomlFile(e,!0);this.initializeSettings(r),"stdio"===s.mode?await this.handleStdioMode(r,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||await this.handleSseAndStreamableMode(r,t,s),await writeTomlFile(e,r),Logger.info(`Successfully configured Codex MCP server: ${t}`)}catch(e){throw Logger.error(`Error setting up Codex client settings: ${e instanceof Error?e.message:String(e)}`),e}}}
2
+ //# sourceMappingURL=CodexInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BaseClientInstaller","readTomlFile","writeTomlFile","Logger","SUPPORTED_CLIENTS","CodexInstaller","clientName","checkVSCodeAndInstallExtension","operationId","info","updateVSCodeSettings","serverName","installConfig","results","settingPath","this","codeSettingPath","setupClientSettings","push","success","path","error","Error","message","String","initializeSettings","settings","mcp_servers","handleStdioMode","finalConfig","args","map","arg","replace","serverConfig","command","length","env","Object","keys","cwd","handleSseAndStreamableMode","url","bearerTokenEnvVar","bearer_token_env_var","httpHeaders","http_headers","envHttpHeaders","env_http_headers","mode"],"sources":["../../../../src/core/installers/clients/CodexInstaller.ts"],"mappings":"OAASA,wBAA2B,kCAC3BC,aAAcC,kBAAqB,qCACnCC,WAAc,kCACdC,sBAAyB,sCAO5B,MAAOC,uBAAuBL,oBACbM,WAAqB,QAM9B,oCAAAC,CAAqCC,GAE3CL,OAAOM,KAAK,yDAEhB,CAMU,0BAAAC,CAA2BC,EAAoBC,GACrD,MAAMC,EAAqE,GAE3E,IACI,MAAMC,EAAcV,kBAAkBW,KAAKT,YAAYU,sBACjDD,KAAKE,oBAAoBH,EAAaH,EAAYC,GACxDC,EAAQK,KAAK,CAAEC,WAAeC,KAAMN,GACxC,CAAE,MAAOO,GACLR,EAAQK,KAAK,CACTC,WACAC,KAAMhB,kBAAkBW,KAAKT,YAAYU,gBACzCK,MAAOA,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,IAE/D,CAEA,OAAOR,CACX,CAMU,kBAAAY,CAAmBC,GACpBA,EAASC,cACVD,EAASC,YAAc,GAE/B,CAMU,qBAAAC,CAAsBF,EAAef,EAAoBkB,GAE3DA,EAAYC,OACZD,EAAYC,KAAOD,EAAYC,KAAKC,KAAKC,GACtB,iBAARA,EAAmBA,EAAIC,QAAQ,MAAO,KAAOD,KAK5D,MAAME,EAAoB,CACtBC,QAASN,EAAYM,SAIrBN,EAAYC,MAAQD,EAAYC,KAAKM,OAAS,IAC9CF,EAAaJ,KAAOD,EAAYC,MAIhCD,EAAYQ,KAAOC,OAAOC,KAAKV,EAAYQ,KAAKD,OAAS,IACzDF,EAAaG,IAAMR,EAAYQ,KAI/BR,EAAYW,MACZN,EAAaM,IAAMX,EAAYW,KAGnCd,EAASC,YAAYhB,GAAcuB,CACvC,CAOU,gCAAAO,CAAiCf,EAAef,EAAoBC,GAE1E,GAAIA,EAAc8B,IAAK,CACnB,MAAMR,EAAoB,CACtBQ,IAAK9B,EAAc8B,KAInB9B,EAAc+B,oBACdT,EAAaU,qBAAuBhC,EAAc+B,mBAIlD/B,EAAciC,aAAeP,OAAOC,KAAK3B,EAAciC,aAAaT,OAAS,IAC7EF,EAAaY,aAAelC,EAAciC,aAI1CjC,EAAcmC,gBAAkBT,OAAOC,KAAK3B,EAAcmC,gBAAgBX,OAAS,IACnFF,EAAac,iBAAmBpC,EAAcmC,gBAGlDrB,EAASC,YAAYhB,GAAcuB,CACvC,CACJ,CAOA,yBAAAjB,CAA0BH,EAAqBH,EAAoBC,GAC/D,IAEI,MAAMc,QAAiBzB,aAAaa,MAGpCC,KAAKU,mBAAmBC,GAGG,UAAvBd,EAAcqC,WACRlC,KAAKa,gBAAgBF,EAAUf,EAAYC,GACnB,QAAvBA,EAAcqC,MAAyC,oBAAvBrC,EAAcqC,YAC/ClC,KAAK0B,2BAA2Bf,EAAUf,EAAYC,SAI1DV,cAAcY,EAAaY,GACjCvB,OAAOM,KAAK,6CAA6CE,IAC7D,CAAE,MAAOU,GAEL,MADAlB,OAAOkB,MAAM,2CAA2CA,aAAiBC,MAAQD,EAAME,QAAUC,OAAOH,MAClGA,CACV,CACJ","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{BaseClientInstaller}from"./BaseClientInstaller.js";import{readJsonFile,writeJsonFile}from"../../../utils/clientUtils.js";export class GithubCopilotInstaller extends BaseClientInstaller{clientName="GithubCopilot";initializeSettings(e){e.servers||(e.servers={}),e.inputs||(e.inputs=[])}setupSettings(e,t,s){e.servers[t]={url:s.url}}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.servers[t]={command:s.command,args:s.args,env:s.env}}async setupClientSettings(e,t,s){const i=await readJsonFile(e,!0);this.initializeSettings(i),"stdio"===s.mode?await this.handleStdioMode(i,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||await this.handleSseAndStreamableMode(i,t,s),await writeJsonFile(e,i)}}
1
+ import{BaseClientInstaller}from"./BaseClientInstaller.js";import{readJsonFile,writeJsonFile}from"../../../utils/clientUtils.js";export class GithubCopilotInstaller extends BaseClientInstaller{clientName="GithubCopilot";initializeSettings(e){e.servers||(e.servers={}),e.inputs||(e.inputs=[])}setupSettings(e,s,t){e.servers[s]={url:t.url},this.applySourceEnv(e.servers[s],s)}async handleStdioMode(e,s,t){t.args&&(t.args=t.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.servers[s]={command:t.command,args:t.args,env:t.env},this.applySourceEnv(e.servers[s],s)}async setupClientSettings(e,s,t){const i=await readJsonFile(e,!0);this.initializeSettings(i),"stdio"===t.mode?await this.handleStdioMode(i,s,t):"sse"!==t.mode&&"streamable-http"!==t.mode||await this.handleSseAndStreamableMode(i,s,t),await writeJsonFile(e,i)}}
2
2
  //# sourceMappingURL=GithubCopilotInstaller.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["BaseClientInstaller","readJsonFile","writeJsonFile","GithubCopilotInstaller","clientName","initializeSettings","settings","servers","inputs","setupSettings","serverName","installConfig","url","handleStdioMode","finalConfig","args","map","arg","replace","command","env","setupClientSettings","settingPath","this","mode","handleSseAndStreamableMode"],"sources":["../../../../src/core/installers/clients/GithubCopilotInstaller.ts"],"mappings":"OAASA,wBAA2B,kCAC3BC,aAAcC,kBAAqB,uCAMtC,MAAOC,+BAA+BH,oBACrBI,WAAqB,gBAO9B,kBAAAC,CAAmBC,GACpBA,EAASC,UACVD,EAASC,QAAU,IAElBD,EAASE,SACVF,EAASE,OAAS,GAE1B,CASU,aAAAC,CAAcH,EAAeI,EAAoBC,GACvDL,EAASC,QAAQG,GAAc,CAC3BE,IAAKD,EAAcC,IAE3B,CAMU,qBAAMC,CAAgBP,EAAeI,EAAoBI,GAC3DA,EAAYC,OACZD,EAAYC,KAAOD,EAAYC,KAAKC,KAAKC,GACtB,iBAARA,EAAmBA,EAAIC,QAAQ,MAAO,KAAOD,KAG5DX,EAASC,QAAQG,GAAc,CAC3BS,QAASL,EAAYK,QACrBJ,KAAMD,EAAYC,KAClBK,IAAKN,EAAYM,IAEzB,CAQA,yBAAMC,CAAoBC,EAAqBZ,EAAoBC,GAE/D,MAAML,QAAiBL,aAAaqB,GAAa,GAGjDC,KAAKlB,mBAAmBC,GAGG,UAAvBK,EAAca,WACRD,KAAKV,gBAAgBP,EAAUI,EAAYC,GACnB,QAAvBA,EAAca,MAAyC,oBAAvBb,EAAca,YAC/CD,KAAKE,2BAA2BnB,EAAUI,EAAYC,SAI1DT,cAAcoB,EAAahB,EACrC","ignoreList":[]}
1
+ {"version":3,"names":["BaseClientInstaller","readJsonFile","writeJsonFile","GithubCopilotInstaller","clientName","initializeSettings","settings","servers","inputs","setupSettings","serverName","installConfig","url","this","applySourceEnv","handleStdioMode","finalConfig","args","map","arg","replace","command","env","setupClientSettings","settingPath","mode","handleSseAndStreamableMode"],"sources":["../../../../src/core/installers/clients/GithubCopilotInstaller.ts"],"mappings":"OAASA,wBAA2B,kCAC3BC,aAAcC,kBAAqB,uCAMtC,MAAOC,+BAA+BH,oBACrBI,WAAqB,gBAO9B,kBAAAC,CAAmBC,GACpBA,EAASC,UACVD,EAASC,QAAU,IAElBD,EAASE,SACVF,EAASE,OAAS,GAE1B,CASU,aAAAC,CAAcH,EAAeI,EAAoBC,GACvDL,EAASC,QAAQG,GAAc,CAC3BE,IAAKD,EAAcC,KAEvBC,KAAKC,eAAeR,EAASC,QAAQG,GAAaA,EACtD,CAMU,qBAAMK,CAAgBT,EAAeI,EAAoBM,GAC3DA,EAAYC,OACZD,EAAYC,KAAOD,EAAYC,KAAKC,KAAKC,GACtB,iBAARA,EAAmBA,EAAIC,QAAQ,MAAO,KAAOD,KAG5Db,EAASC,QAAQG,GAAc,CAC3BW,QAASL,EAAYK,QACrBJ,KAAMD,EAAYC,KAClBK,IAAKN,EAAYM,KAErBT,KAAKC,eAAeR,EAASC,QAAQG,GAAaA,EACtD,CAQA,yBAAMa,CAAoBC,EAAqBd,EAAoBC,GAE/D,MAAML,QAAiBL,aAAauB,GAAa,GAGjDX,KAAKR,mBAAmBC,GAGG,UAAvBK,EAAcc,WACRZ,KAAKE,gBAAgBT,EAAUI,EAAYC,GACnB,QAAvBA,EAAcc,MAAyC,oBAAvBd,EAAcc,YAC/CZ,KAAKa,2BAA2BpB,EAAUI,EAAYC,SAI1DT,cAAcsB,EAAalB,EACrC","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { BaseClientInstaller } from './BaseClientInstaller.js';
2
+ /**
3
+ * RooCode client installer implementation
4
+ */
5
+ export declare class RooCodeInstaller extends BaseClientInstaller {
6
+ protected readonly clientName: string;
7
+ /**
8
+ * Set up RooCode client settings
9
+ */
10
+ setupClientSettings(settingPath: string, serverName: string, installConfig: any): Promise<void>;
11
+ }
@@ -0,0 +1,2 @@
1
+ import{BaseClientInstaller}from"./BaseClientInstaller.js";import{readJsonFile,writeJsonFile}from"../../../utils/clientUtils.js";export class RooCodeInstaller extends BaseClientInstaller{clientName="RooCode";async setupClientSettings(e,t,i){const s=await readJsonFile(e,!0);if(this.initializeSettings(s),"stdio"===i.mode){const e=await this.handleWindowsNpx(i);await this.handleStdioMode(s,t,e)}else"sse"!==i.mode&&"streamable-http"!==i.mode||await this.handleSseAndStreamableMode(s,t,i);await writeJsonFile(e,s)}}
2
+ //# sourceMappingURL=RooCodeInstaller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["BaseClientInstaller","readJsonFile","writeJsonFile","RooCodeInstaller","clientName","setupClientSettings","settingPath","serverName","installConfig","settings","this","initializeSettings","mode","finalConfig","handleWindowsNpx","handleStdioMode","handleSseAndStreamableMode"],"sources":["../../../../src/core/installers/clients/RooCodeInstaller.ts"],"mappings":"OAASA,wBAA2B,kCAC3BC,aAAcC,kBAAqB,uCAKtC,MAAOC,yBAAyBH,oBACfI,WAAqB,UAKxC,yBAAMC,CAAoBC,EAAqBC,EAAoBC,GAC/D,MAAMC,QAAiBR,aAAaK,GAAa,GAGjD,GAFAI,KAAKC,mBAAmBF,GAEG,UAAvBD,EAAcI,KAAkB,CAChC,MAAMC,QAAoBH,KAAKI,iBAAiBN,SAC1CE,KAAKK,gBAAgBN,EAAUF,EAAYM,EACrD,KAAkC,QAAvBL,EAAcI,MAAyC,oBAAvBJ,EAAcI,YAC/CF,KAAKM,2BAA2BP,EAAUF,EAAYC,SAG1DN,cAAcI,EAAaG,EACrC","ignoreList":[]}
@@ -1,2 +1,2 @@
1
- import{BaseClientInstaller}from"./BaseClientInstaller.js";import{Logger}from"../../../utils/logger.js";import fs from"fs/promises";import path from"path";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";export class VisualStudioInstaller extends BaseClientInstaller{clientName="VisualStudio";async updateVSSettings(e,t){Logger.debug("Updating Visual Studio settings");const s=[];try{const a=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;Logger.debug(`Attempting to update settings at: ${a}`),await this.setupClientSettings(a,e,t),s.push({success:!0,path:a}),Logger.debug("Successfully updated Visual Studio settings")}catch(e){const t=e instanceof Error?e.message:String(e);Logger.error("Failed to update Visual Studio settings:",e),s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:t})}return s}async setupClientSettings(e,t,s){Logger.debug(`Setting up Visual Studio client settings at ${e}`);try{const a=path.dirname(e);await fs.mkdir(a,{recursive:!0});let i={};try{const t=await fs.readFile(e,"utf8");i=JSON.parse(t)}catch(e){Logger.debug("No existing settings file found, creating new one")}this.initializeSettings(i),t=t.replace(/-/g,"_"),"stdio"===s.mode?await this.handleStdioMode(i,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||this.handleSseAndStreamableMode(i,t,s),await fs.writeFile(e,JSON.stringify(i,null,2),"utf8"),Logger.debug(`Successfully updated Visual Studio settings at ${e}`)}catch(e){throw Logger.error("Failed to setup Visual Studio client settings:",e),e}}initializeSettings(e){e||(e={servers:{},inputs:[]}),e.inputs||(e.inputs=[]),e.servers||(e.servers={})}setupSettings(e,t,s){e.servers[t]={url:s.url}}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.servers[t]={command:s.command,args:s.args,env:s.env}}async install(e,t,s){const a=this.generateOperationId(),i=InstallOperationManager.getInstance(s||e.name,e.name);return await i.recording((async()=>{const s=await i.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const n=await i.recording((()=>this.updateVSSettings(e.name,s)),{stepName:RecordingConstants.STEP_UPDATE_VS_SETTINGS,onResult:e=>e?.some((e=>e.success))}),r=n.some((e=>e.success)),o=n.filter((e=>e.success)).map((e=>e.path)),l=n.filter((e=>!e.success)).map((e=>e.error));return{status:r?"completed":"failed",type:"install",target:"server",message:r?`Successfully installed ${this.clientName} client. Updated settings in: ${o.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:a,error:r?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:a,error:e instanceof Error?e.message:String(e)},message:t}}})}}
1
+ import{BaseClientInstaller}from"./BaseClientInstaller.js";import{Logger}from"../../../utils/logger.js";import fs from"fs/promises";import path from"path";import{SUPPORTED_CLIENTS}from"../../metadatas/constants.js";import{InstallOperationManager}from"../../loaders/InstallOperationManager.js";import*as RecordingConstants from"../../metadatas/recordingConstants.js";export class VisualStudioInstaller extends BaseClientInstaller{clientName="VisualStudio";async updateVSSettings(e,t){Logger.debug("Updating Visual Studio settings");const s=[];try{const a=SUPPORTED_CLIENTS[this.clientName].codeSettingPath;Logger.debug(`Attempting to update settings at: ${a}`),await this.setupClientSettings(a,e,t),s.push({success:!0,path:a}),Logger.debug("Successfully updated Visual Studio settings")}catch(e){const t=e instanceof Error?e.message:String(e);Logger.error("Failed to update Visual Studio settings:",e),s.push({success:!1,path:SUPPORTED_CLIENTS[this.clientName].codeSettingPath,error:t})}return s}async setupClientSettings(e,t,s){Logger.debug(`Setting up Visual Studio client settings at ${e}`);try{const a=path.dirname(e);await fs.mkdir(a,{recursive:!0});let i={};try{const t=await fs.readFile(e,"utf8");i=JSON.parse(t)}catch(e){Logger.debug("No existing settings file found, creating new one")}this.initializeSettings(i),t=t.replace(/-/g,"_"),"stdio"===s.mode?await this.handleStdioMode(i,t,s):"sse"!==s.mode&&"streamable-http"!==s.mode||this.handleSseAndStreamableMode(i,t,s),await fs.writeFile(e,JSON.stringify(i,null,2),"utf8"),Logger.debug(`Successfully updated Visual Studio settings at ${e}`)}catch(e){throw Logger.error("Failed to setup Visual Studio client settings:",e),e}}initializeSettings(e){e||(e={servers:{},inputs:[]}),e.inputs||(e.inputs=[]),e.servers||(e.servers={})}setupSettings(e,t,s){e.servers[t]={url:s.url},this.applySourceEnv(e.servers[t],t)}async handleStdioMode(e,t,s){s.args&&(s.args=s.args.map((e=>"string"==typeof e?e.replace(/\\/g,"/"):e))),e.servers[t]={command:s.command,args:s.args,env:s.env},this.applySourceEnv(e.servers[t],t)}async install(e,t,s){const a=this.generateOperationId(),i=InstallOperationManager.getInstance(s||e.name,e.name);return await i.recording((async()=>{const s=await i.recording((()=>this.setupInstallConfig(e,t)),{stepName:RecordingConstants.STEP_SETUP_INSTALLATION_CONFIG});e.mode&&(s.mode=e.mode);const r=await i.recording((()=>this.updateVSSettings(e.name,s)),{stepName:RecordingConstants.STEP_UPDATE_VS_SETTINGS,onResult:e=>e?.some((e=>e.success))}),n=r.some((e=>e.success)),o=r.filter((e=>e.success)).map((e=>e.path)),l=r.filter((e=>!e.success)).map((e=>e.error));return{status:n?"completed":"failed",type:"install",target:"server",message:n?`Successfully installed ${this.clientName} client. Updated settings in: ${o.join(", ")}`:`Failed to install ${this.clientName} client. Errors: ${l.join("; ")}`,operationId:a,error:n?void 0:l.join("; ")}}),{stepName:RecordingConstants.STEP_INSTALLATION,onResult:e=>"failed"!==e?.status,endMessage:e=>e?.message,onError:e=>{const t=`Unexpected error installing ${this.clientName} client: ${e instanceof Error?e.message:String(e)}`;return{result:{status:"failed",type:"install",target:"server",message:t,operationId:a,error:e instanceof Error?e.message:String(e)},message:t}}})}}
2
2
  //# sourceMappingURL=VisualStudioInstaller.js.map