imcp 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -4
- package/dist/cli/commands/list.js +1 -1
- package/dist/cli/commands/list.js.map +1 -1
- package/dist/cli/commands/pull.js +1 -1
- package/dist/cli/commands/pull.js.map +1 -1
- package/dist/cli/commands/serve.js +1 -1
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/commands/uninstall.js +1 -1
- package/dist/cli/commands/uninstall.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/core/installers/clients/BaseClientInstaller.js +1 -1
- package/dist/core/installers/clients/BaseClientInstaller.js.map +1 -1
- package/dist/core/installers/clients/ClientInstaller.js +1 -1
- package/dist/core/installers/clients/ClientInstaller.js.map +1 -1
- package/dist/core/installers/requirements/CommandInstaller.js +1 -1
- package/dist/core/installers/requirements/CommandInstaller.js.map +1 -1
- package/dist/core/installers/requirements/GeneralInstaller.js +1 -1
- package/dist/core/installers/requirements/GeneralInstaller.js.map +1 -1
- package/dist/core/installers/requirements/NugetInstaller.js +1 -1
- package/dist/core/installers/requirements/NugetInstaller.js.map +1 -1
- package/dist/core/installers/requirements/PipInstaller.js +1 -1
- package/dist/core/installers/requirements/PipInstaller.js.map +1 -1
- package/dist/core/loaders/ConfigurationLoader.js +1 -1
- package/dist/core/loaders/ConfigurationLoader.js.map +1 -1
- package/dist/core/loaders/ConfigurationProvider.d.ts +1 -1
- package/dist/core/loaders/ConfigurationProvider.js +1 -1
- package/dist/core/loaders/ConfigurationProvider.js.map +1 -1
- package/dist/core/loaders/InstallOperationManager.js +1 -1
- package/dist/core/loaders/InstallOperationManager.js.map +1 -1
- package/dist/core/loaders/SystemSettingsManager.js +1 -1
- package/dist/core/loaders/SystemSettingsManager.js.map +1 -1
- package/dist/core/onboard/FeedOnboardService.js +1 -1
- package/dist/core/onboard/FeedOnboardService.js.map +1 -1
- package/dist/core/onboard/OnboardStatusManager.js +1 -1
- package/dist/core/onboard/OnboardStatusManager.js.map +1 -1
- package/dist/core/validators/StdioServerValidator.js +1 -1
- package/dist/core/validators/StdioServerValidator.js.map +1 -1
- package/dist/services/InstallationService.js +1 -1
- package/dist/services/InstallationService.js.map +1 -1
- package/dist/services/MCPManager.d.ts +1 -1
- package/dist/services/MCPManager.js +1 -1
- package/dist/services/MCPManager.js.map +1 -1
- package/dist/services/RequirementService.js +1 -1
- package/dist/services/RequirementService.js.map +1 -1
- package/dist/services/ServerService.js +1 -1
- package/dist/services/ServerService.js.map +1 -1
- package/dist/services/TelemetryService.js +1 -1
- package/dist/services/TelemetryService.js.map +1 -1
- package/dist/utils/UpdateCheckTracker.js +1 -1
- package/dist/utils/UpdateCheckTracker.js.map +1 -1
- package/dist/utils/adoUtils.js +1 -1
- package/dist/utils/adoUtils.js.map +1 -1
- package/dist/utils/clientUtils.js +1 -1
- package/dist/utils/clientUtils.js.map +1 -1
- package/dist/utils/feedUtils.js +1 -1
- package/dist/utils/feedUtils.js.map +1 -1
- package/dist/utils/gitUtils.d.ts +15 -0
- package/dist/utils/gitUtils.js +2 -0
- package/dist/utils/gitUtils.js.map +1 -0
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/macroExpressionUtils.js +1 -1
- package/dist/utils/macroExpressionUtils.js.map +1 -1
- package/dist/utils/osUtils.js +1 -1
- package/dist/utils/osUtils.js.map +1 -1
- package/dist/utils/versionUtils.js +1 -1
- package/dist/utils/versionUtils.js.map +1 -1
- package/dist/web/public/js/api.js +1 -1
- package/dist/web/public/js/detailsWidget.js +1 -1
- package/dist/web/public/js/flights/flights.js +1 -1
- package/dist/web/public/js/modal/installModal.js +1 -1
- package/dist/web/public/js/modal/installation.js +1 -1
- package/dist/web/public/js/modal/loadingModal.js +1 -1
- package/dist/web/public/js/modal/modalSetup.js +1 -1
- package/dist/web/public/js/modal.js +1 -1
- package/dist/web/public/js/notifications.js +1 -1
- package/dist/web/public/js/onboard/formProcessor.js +1 -1
- package/dist/web/public/js/onboard/index.js +1 -1
- package/dist/web/public/js/onboard/publishHandler.js +1 -1
- package/dist/web/public/js/onboard/uiHandlers.js +1 -1
- package/dist/web/public/js/onboard/validationHandlers.js +1 -1
- package/dist/web/public/js/serverCategoryDetails.js +1 -1
- package/dist/web/public/js/serverCategoryList.js +1 -1
- package/dist/web/public/js/settings.js +1 -1
- package/dist/web/server.js +1 -1
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{serverTemplate,envVariableTemplate,serverRequirementTemplate}from"./templates.js";import{state,setServerCounter,getServerCounter,setEnvCounter,getEnvCounter,deleteEnvCounter,clearEnvCountersForTab,setServerRequirementCounter,getServerRequirementCounter,deleteServerRequirementCounter,clearServerRequirementCountersForTab}from"./state.js";import{getFormData,populateForm,resetOnboardFormDynamicContent}from"./formProcessor.js";import{showToast}from"../notifications.js";function reindexElements(e,t,r,n){n.forEach((({selector:n,idBase:s,namePattern:o})=>{const a=e.querySelector(n);if(a&&(s&&(a.id=`${s}${r}`),o&&a.getAttribute("name"))){const e=a.getAttribute("name").replace(new RegExp(o.replace("INDEX",t)),`$1${r}$2`);a.setAttribute("name",e)}}))}function reindexServers(e="serversList"){const t=document.getElementById(e);if(!t)return;const r=t.querySelectorAll(".server-item"),n=new Map,s=new Map;r.forEach(((t,r)=>{const o=parseInt(t.dataset.index,10);t.dataset.index=r;const a=t.querySelector("h3");if(a){const e=a.textContent||"",t=`MCP Server #${r+1}`;let n="";e.includes("(Adhoc - Editable)")?n=' <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>':e.includes("(Read-only)")&&(n=" (Read-only)"),a.innerHTML=`${t}${n}`}const i=t.querySelector(`#${e}-server-header-${o}`);if(i){i.id=`${e}-server-header-${r}`;const t=`${e}-server-content-${o}`,n=`${e}-server-content-${r}`;let s=i.getAttribute("onclick");s&&(s=s.replace(new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),n),i.setAttribute("onclick",s));let a=i.getAttribute("onkeydown");a&&(a=a.replace(new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),n),i.setAttribute("onkeydown",a)),i.setAttribute("aria-controls",n)}const l=t.querySelector(`#${e}-server-title-${o}`);l&&(l.id=`${e}-server-title-${r}`);const c=t.querySelector(`#${e}-server-content-${o}`);c&&c.setAttribute("aria-labelledby",`${e}-server-title-${r}`),t.querySelectorAll("[onclick]").forEach((t=>{const n=t.getAttribute("onclick");if(!n)return;if(t.id===`${e}-server-header-${r}`)return;const s=n.replace(new RegExp(`\\((\\s*)${o}(\\s*[,\\)])`,"g"),`($1${r}$2`).replace(new RegExp(`${e}-server-deps-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-server-deps-content-${r}`).replace(new RegExp(`${e}-installation-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-installation-content-${r}`).replace(new RegExp(`${e}-env-vars-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-env-vars-content-${r}`);t.setAttribute("onclick",s)})),reindexElements(t,o,r,[{selector:`#${e}-server-content-${o}`,idBase:`${e}-server-content-`},{selector:`#${e}-server-deps-content-${o}`,idBase:`${e}-server-deps-content-`},{selector:`#${e}-installation-content-${o}`,idBase:`${e}-installation-content-`},{selector:`#${e}-env-vars-content-${o}`,idBase:`${e}-env-vars-content-`},{selector:`#schema-path-${o}`,idBase:"schema-path-"},{selector:`#envVarsContainer_${o}`,idBase:"envVarsContainer_"}]);const d=t.querySelector(`#envVarsContainer_${r}`);let u=0;d&&d.querySelectorAll(".env-var-item").forEach(((e,t)=>{const n=parseInt(e.dataset.envIndex,10);e.dataset.envIndex=t,reindexElements(e,n,t,[{selector:"[name]",namePattern:`(servers\\[${r}\\]\\.installation\\.env\\[)\\d+(\\]\\..+)`}]),u++})),n.set(r,u);const m=t.querySelector(`#server-requirements-list-${r}`);let v=0;m&&m.querySelectorAll(".server-requirement-item").forEach(((e,t)=>{const n=parseInt(e.dataset.reqIndex,10);e.dataset.reqIndex=t,reindexElements(e,n,t,[{selector:"[name]",namePattern:`(servers\\[${r}\\]\\.requirements\\[)\\d+(\\]\\..+)`}]),v++})),s.set(r,v)})),clearEnvCountersForTab(e),n.forEach(((t,r)=>setEnvCounter(e,r,t))),clearServerRequirementCountersForTab(e),s.forEach(((t,r)=>setServerRequirementCounter(e,r,t))),setServerCounter(e,r.length)}export function addServer(e="serversList",t=!1,r=null){const n=document.getElementById(e);if(!n)return-1;0===n.children.length&&(setServerCounter(e,0),clearEnvCountersForTab(e),clearServerRequirementCountersForTab(e));const s=getServerCounter(e);let o;o=!!("true"!==r?.systemTags?.adhoc&&t&&(state.originalServerNamesForFormPopulation?r&&r.name&&state.originalServerNamesForFormPopulation.has(r.name):r)),n.insertAdjacentHTML("beforeend",serverTemplate(s,t,r,e)),setEnvCounter(e,s,0),setServerRequirementCounter(e,s,0),setServerCounter(e,s+1);const a=n.querySelector(`.server-item[data-index="${s}"]`);return a&&(r&&r.systemTags?a.dataset.systemTags=JSON.stringify(r.systemTags):r&&!r.systemTags?delete a.dataset.systemTags:r||delete a.dataset.systemTags,r&&r.name?a.dataset.originalName=r.name:delete a.dataset.originalName,setupServerMode(a,s,e,o,r),setupReadOnlyState(a,o,r,e,s),[{contentId:`${e}-server-deps-content-${s}`,iconSelector:`#${e}-deps-header-${s} i`},{contentId:`${e}-installation-content-${s}`,iconSelector:`#${e}-startup-header-${s} i`},{contentId:`${e}-env-vars-content-${s}`,iconSelector:`#${e}-envars-header-${s} i`}].forEach((({contentId:e,iconSelector:t})=>{const r=document.getElementById(e),n=a.querySelector(t);r&&n&&(r.classList.remove("hidden"),n.classList.remove("bxs-chevron-down"),n.classList.add("bxs-chevron-up"))})),o||n.querySelectorAll(".server-item").forEach((t=>{const r=parseInt(t.dataset.index,10);if(t.parentElement!==n)return;const o=`${e}-server-content-${r}`,a=t.querySelector(".server-header-toggle i.toggle-icon"),i=document.getElementById(o);i&&a&&(r===s?(i.classList.contains("hidden")&&toggleSectionContent(o,a),setTimeout((()=>{t.scrollIntoView({behavior:"smooth",block:"nearest"})}),0)):i.classList.contains("hidden")||toggleSectionContent(o,a))}))),s}function setupServerMode(e,t,r,n,s){const o=e.querySelector(`select[name="servers[${t}].mode"]`);o&&(n&&s&&(o.value=s.mode||"stdio"),o.addEventListener("change",(()=>renderInstallationConfig(t,r))),renderInstallationConfig(t,r,o.value,n,s?.installation))}function setupReadOnlyState(e,t,r,n,s){const o=e.querySelector(`#${n}-server-title-${s}`),a=`MCP Server #${s+1}`;let i="true"===r?.systemTags?.adhoc;if(!i&&e.dataset.systemTags)try{"true"===JSON.parse(e.dataset.systemTags).adhoc&&(i=!0)}catch(e){}if(t){if(o)if(i)if(o.querySelector("span.text-blue-600")){const e=o.querySelector("span.text-blue-600").outerHTML;o.innerHTML=`${a} ${e}`}else o.innerHTML=`${a} <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>`;else o.innerHTML=`${a} (Read-only)`;e.querySelectorAll("input, select, textarea").forEach((e=>{e.closest(".env-var-item")||e.closest(".server-requirement-item")||(e.disabled=!0,e.classList.add("bg-gray-100","cursor-not-allowed","opacity-70"))})),e.querySelectorAll(".action-button-in-server").forEach((e=>{e.classList.contains("duplicate-mcp-server-button")?(e.style.display="flex",e.classList.remove("hidden"),e.disabled=!1):(e.style.display="none",e.classList.add("hidden"))})),[{contentId:`${n}-server-content-${s}`,iconSelector:".server-header-toggle i.toggle-icon"},{contentId:`${n}-server-deps-content-${s}`,iconSelector:`#${n}-deps-header-${s} i`},{contentId:`${n}-installation-content-${s}`,iconSelector:`#${n}-startup-header-${s} i`},{contentId:`${n}-env-vars-content-${s}`,iconSelector:`#${n}-envars-header-${s} i`}].forEach((({contentId:t,iconSelector:r})=>{const n=document.getElementById(t),s=e.querySelector(r);n&&s&&(n.classList.remove("hidden"),s.classList.remove("bxs-chevron-down"),s.classList.add("bxs-chevron-up"))}))}else{if(o)if(i)if(o.querySelector("span.text-blue-600")){const e=o.querySelector("span.text-blue-600").outerHTML;o.innerHTML=`${a} ${e}`}else o.innerHTML=`${a} <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>`;else o.innerHTML=a;setTimeout((()=>{e.querySelectorAll("input, select, textarea").forEach((e=>{e.closest(".env-var-item")||e.closest(".server-requirement-item")||(e.disabled=!1,e.removeAttribute("readonly"),e.classList.remove("bg-gray-100","cursor-not-allowed","opacity-70"))})),e.querySelectorAll(".action-button-in-server").forEach((e=>{e.style.display="flex",e.disabled=!1,e.classList.remove("hidden","opacity-50","cursor-not-allowed")}))}),0)}}export function renderInstallationConfig(e,t="serversList",r=null,n=!1,s=null){const o=document.querySelector(`#${t} .server-item[data-index="${e}"]`);if(!o)return;const a=o.querySelector(`select[name="servers[${e}].mode"]`),i=r||(a?a.value:"stdio"),l=o.querySelector(`#installation-config-${e}`),c=o.querySelector(`#env-vars-block-${e}`);if(!l)return;const d=n?"disabled":"",u=n?"bg-gray-100 cursor-not-allowed opacity-70":"";l.innerHTML="sse"===i?generateSSETemplate(e,d,u,s):generateStdioTemplate(e,d,u,s),c&&(c.style.display="sse"===i?"none":"")}function generateSSETemplate(e,t,r,n){return`\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Server URL*</label>\n <input type="text" name="servers[${e}].installation.url" required ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="e.g., https://your-server.com/api/mcp"\n value="${n?.url||""}">\n </div>\n `}function generateStdioTemplate(e,t,r,n){return`\n <div class="grid grid-cols-1 md:grid-cols-2 gap-4">\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Command*</label>\n <input type="text" name="servers[${e}].installation.command" required ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="e.g., node, python3"\n value="${n?.command||""}">\n </div>\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Arguments (comma-separated)</label>\n <input type="text" name="servers[${e}].installation.args" ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="arg1, path/to/script.js, --flag"\n value="${n?.args?n.args.join(", "):""}">\n </div>\n </div>\n `}export function removeServer(e,t="serversList"){const r=document.getElementById(t);if(!r)return;const n=r.querySelector(`.server-item[data-index="${e}"]`);n&&(n.remove(),deleteEnvCounter(t,e),deleteServerRequirementCounter(t,e),reindexServers(t))}export function addEnvVariable(e,t="serversList",r=!1){const n=document.querySelector(`#${t} .server-item[data-index="${e}"] #envVarsContainer_${e}`);if(!n)return-1;const s=getEnvCounter(t,e);return n.insertAdjacentHTML("beforeend",envVariableTemplate(e,s,r,t)),setEnvCounter(t,e,s+1),s}export function removeEnvVariable(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .env-var-item[data-env-index="${t}"]`);n&&n.remove()}export function addServerRequirement(e,t="serversList",r=!1){const n=document.querySelector(`#${t} .server-item[data-index="${e}"] #server-requirements-list-${e}`);if(!n)return-1;const s=getServerRequirementCounter(t,e);return n.insertAdjacentHTML("beforeend",serverRequirementTemplate(e,s,r,t)),setServerRequirementCounter(t,e,s+1),toggleServerAliasField(e,s,t),toggleServerRegistryConfig(e,s,t),s}export function removeServerRequirement(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);n&&n.remove()}export function toggleServerAliasField(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);if(!n)return;const s=n.querySelector(`select[name="servers[${e}].requirements[${t}].type"]`),o=n.querySelector(`#server-alias-field-${e}-${t}`);s&&o&&o.classList.toggle("hidden","command"!==s.value)}export function toggleServerRegistryConfig(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);if(!n)return;const s=n.querySelector(`select[name="servers[${e}].requirements[${t}].registryType"]`);s&&["github","artifacts"].forEach((r=>{const o=n.querySelector(`#server-${r}-config-${e}-${t}`);o&&o.classList.toggle("hidden",s.value!==r)}))}export function toggleSectionContent(e,t,r=null){const n=document.getElementById(e);if(!n)return;r=r||t?.parentElement||null;const s=n.classList.toggle("hidden");t&&(t.classList.toggle("bxs-chevron-up",!s),t.classList.toggle("bxs-chevron-down",s)),r&&r.setAttribute("aria-expanded",(!s).toString())}export function toggleViewMode(e,t,r,n=null,s=!1){const o={createCategory:document.getElementById("panel-create-category"),createServer:document.getElementById("panel-create-server"),jsonEditor:document.getElementById("panel-json-editor"),textarea:document.getElementById("jsonEditorTextarea"),activeForm:document.getElementById(t),viewModeToggle:document.getElementById("viewModeToggle"),actionButtons:{json:document.getElementById("jsonEditorActionsContainer"),main:document.querySelector(`#${t} ~ .flex.justify-end.space-x-4.pt-6.border-t`)}};if(!isViewAlreadyActive(e,o,t)){state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null);try{e?handleJsonView(o,t,r,n,s):(s&&n&&n.mcpServers&&"onboardServerForm"===t&&(state.originalServerNamesForFormPopulation=new Set(n.mcpServers.map((e=>e.name)).filter((e=>e)))),handleFormView(o,t,r,n,s),state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null))}catch(t){showToast(`Error: ${t.message}`,"error"),o.viewModeToggle&&(o.viewModeToggle.checked=e),state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null)}}}function isViewAlreadyActive(e,t,r){if(e&&t.jsonEditor&&!t.jsonEditor.classList.contains("hidden"))return!0;if(!e&&t.jsonEditor?.classList.contains("hidden")){if("onboardForm"===r&&t.createCategory&&!t.createCategory.classList.contains("hidden"))return!0;if("onboardServerForm"===r&&t.createServer&&!t.createServer.classList.contains("hidden"))return!0}return!1}function handleJsonView(e,t,r,n,s){const o=getFeedConfiguration(e.activeForm,n,s);e.textarea.value=JSON.stringify(o,null,2),e.textarea.readOnly=s&&n?.mcpServers?.length>0,e.textarea.readOnly?(e.textarea.classList.add("bg-gray-100","cursor-not-allowed"),showToast("JSON view is read-only for existing servers in this category.","info")):e.textarea.classList.remove("bg-gray-100","cursor-not-allowed"),togglePanels(e,!0),toggleButtons(e.actionButtons,!0)}function handleFormView(e,t,r,n,s){const o=JSON.parse(e.textarea.value),a=document.getElementById(r);a&&(a.innerHTML=""),resetOnboardFormDynamicContent(t,r),populateForm(o,t,s&&n?.mcpServers?.length>0,r),togglePanels(e,!1,t),toggleButtons(e.actionButtons,!1)}function getFeedConfiguration(e,t,r){if(!r||!t)return e?getFormData(e):{};const n=getFormData(e,!0,t),s=JSON.parse(JSON.stringify(t));return s.mcpServers=n.mcpServers||[],s.requirements=n.requirements||[],s}function togglePanels(e,t,r=null){e.createCategory?.classList.add("hidden"),e.createServer?.classList.add("hidden"),e.jsonEditor?.classList.add("hidden"),t?e.jsonEditor?.classList.remove("hidden"):r&&("onboardForm"===r?e.createCategory?.classList.remove("hidden"):"onboardServerForm"===r&&e.createServer?.classList.remove("hidden"))}function toggleButtons(e,t){e.main?.classList.toggle("hidden",t),e.json?.classList.toggle("hidden",t)}export async function saveJsonData(e,t=null){const r=document.getElementById("jsonEditorTextarea");if(r.readOnly)showToast("Cannot save, JSON editor is in read-only mode for existing servers.","warning");else try{const n=prepareConfiguration(e,JSON.parse(r.value),t);if(!n)return;await saveConfiguration(n)}catch(e){showToast(`Error saving JSON data: ${e.message}`,"error")}}function prepareConfiguration(e,t,r){return"create-category"===e?t.name?{data:t,isUpdate:isUpdateOperation(t.name)}:(showToast("Category Name is required in JSON.","error"),null):"create-server"===e?r?.name?{data:mergeConfigurations(r,t),isUpdate:!0}:(showToast("No existing category context for saving JSON.","error"),null):(showToast("Invalid tab context for saving JSON.","error"),null)}function isUpdateOperation(e){const t=new URLSearchParams(window.location.search);return"edit"===t.get("action")&&t.get("category")===e}function mergeConfigurations(e,t){const r=JSON.parse(JSON.stringify(e)),n=new Set(r.mcpServers?.map((e=>e.name))||[]),s=(t.mcpServers||[]).filter((e=>!n.has(e.name)));r.mcpServers=(r.mcpServers||[]).concat(s);const o=new Set(r.requirements?.map((e=>`${e.type}|${e.name}|${e.version}`))||[]);return(t.requirements||[]).forEach((e=>{const t=`${e.type}|${e.name}|${e.version}`,n=s.some((t=>t.dependencies?.requirements?.some((t=>t.name===e.name&&t.version===e.version))));!o.has(t)&&n&&(r.requirements=r.requirements||[],r.requirements.push(e))})),r}async function saveConfiguration({data:e,isUpdate:t}){const r=await fetch("/api/categories/onboard",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({categoryData:e,isUpdate:t})});if(!r.ok){const e=await r.json();throw new Error(e.error||`HTTP error! status: ${r.status}`)}showToast("JSON data submitted successfully!","success")}export async function copyJsonToClipboard(){const e=document.getElementById("jsonEditorTextarea");if(e)try{await navigator.clipboard.writeText(e.value),showToast("JSON copied to clipboard!","success")}catch(e){showToast("Failed to copy JSON. See console for details.","error")}else showToast("JSON content not found.","error")}export function duplicateServer(e,t){const r="serversList"===t?"onboardForm":"onboardServerForm",n=document.getElementById(r);if(!n)return void showToast(`Form with ID ${r} not found. Cannot duplicate server.`,"error");const s="existingCategoryServersList"===t;let o=null;if(s&&(o=window.currentSelectedCategoryData||null),!n.querySelector(`.server-item[data-index="${e}"]`))return void showToast("Could not find the server item to duplicate in the DOM.","error");const a=[];n.querySelectorAll("input, select, textarea").forEach((e=>{e.disabled&&(a.push({element:e,wasDisabled:!0}),e.disabled=!1)}));const i=getFormData(n,s,o);if(a.forEach((({element:e,wasDisabled:t})=>{e.disabled=t})),!i||!i.mcpServers||i.mcpServers.length<=e)return void showToast("Could not retrieve data for the server to duplicate after attempting to enable fields.","error");let l=JSON.parse(JSON.stringify(i.mcpServers[e]));l.systemTags&&delete l.systemTags;let c=!1;s&&(c=window.isExistingCategoryReadOnly||!1);const d=addServer(t,c,null);if(-1===d)return void showToast("Failed to add a new server item for duplication.","error");const u=document.getElementById(t).querySelector(`.server-item[data-index="${d}"]`);u?(populateServerManually(u,d,l,t),showToast(`Server #${e+1} duplicated to Server #${d+1}.`,"success")):showToast("Failed to find the new server item after duplication.","error")}function populateServerManually(e,t,r,n){e.querySelector(`input[name="servers[${t}].name"]`).value=r.name||"",e.querySelector(`textarea[name="servers[${t}].description"]`).value=r.description||"",e.querySelector(`select[name="servers[${t}].mode"]`).value=r.mode||"stdio",e.querySelector(`input[name="servers[${t}].schemas"]`).value=r.schemas||"",e.querySelector(`input[name="servers[${t}].repository"]`).value=r.repository||"";const s=e.querySelector(`select[name="servers[${t}].mode"]`);if(s&&s.dispatchEvent(new Event("change")),"stdio"===r.mode&&r.installation){const n=e.querySelector(`input[name="servers[${t}].installation.command"]`);n&&(n.value=r.installation.command||"");const s=e.querySelector(`input[name="servers[${t}].installation.args"]`);s&&(s.value=r.installation.args?r.installation.args.join(", "):"")}else if("sse"===r.mode&&r.installation){const n=e.querySelector(`input[name="servers[${t}].installation.url"]`);n&&(n.value=r.installation.url||"")}const o=e.querySelector(`#envVarsContainer_${t}`);o&&r.installation&&r.installation.env&&Object.entries(r.installation.env).forEach((([e,r])=>{const s=addEnvVariable(t,n,!1),a=o.querySelector(`.env-var-item[data-env-index="${s}"]`);a&&(a.querySelector(`input[name="servers[${t}].installation.env[${s}].name"]`).value=e,a.querySelector(`input[name="servers[${t}].installation.env[${s}].default"]`).value=r.Default||"",a.querySelector(`input[name="servers[${t}].installation.env[${s}].required"]`).checked=r.Required||!1,a.querySelector(`textarea[name="servers[${t}].installation.env[${s}].description"]`).value=r.Description||"")}));const a=e.querySelector(`#server-requirements-list-${t}`);a&&r.dependencies&&r.dependencies.requirements&&r.dependencies.requirements.forEach((e=>{const r=addServerRequirement(t,n,!1),s=a.querySelector(`.server-requirement-item[data-req-index="${r}"]`);if(s){s.querySelector(`input[name="servers[${t}].requirements[${r}].name"]`).value=e.name||"",s.querySelector(`select[name="servers[${t}].requirements[${r}].type"]`).value=e.type||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].version"]`).value=e.version||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].order"]`).value=e.order||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].alias"]`).value=e.alias||"";const n=s.querySelector(`select[name="servers[${t}].requirements[${r}].type"]`);n&&n.dispatchEvent(new Event("change"));const o=s.querySelector(`select[name="servers[${t}].requirements[${r}].registryType"]`);o&&(o.value=e.registryType||"public",o.dispatchEvent(new Event("change")),e.registry&&("github"===e.registryType&&e.registry.githubRelease?(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.repository"]`).value=e.registry.githubRelease.repository||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.assetsName"]`).value=e.registry.githubRelease.assetsName||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.assetName"]`).value=e.registry.githubRelease.assetName||""):"artifacts"===e.registryType&&e.registry.artifacts?(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.artifacts.registryName"]`).value=e.registry.artifacts.registryName||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.artifacts.registryUrl"]`).value=e.registry.artifacts.registryUrl||""):"local"===e.registryType&&e.registry.local&&(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.local.localPath"]`).value=e.registry.local.localPath||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.local.assetName"]`).value=e.registry.local.assetName||"")))}})),setupReadOnlyState(e,!1,null,n,t)}window.duplicateServer=duplicateServer,Object.entries({addServer:addServer,removeServer:removeServer,addEnvVariable:addEnvVariable,removeEnvVariable:removeEnvVariable,addServerRequirement:addServerRequirement,removeServerRequirement:removeServerRequirement,toggleServerAliasField:toggleServerAliasField,toggleServerRegistryConfig:toggleServerRegistryConfig,renderInstallationConfig:renderInstallationConfig,toggleSectionContent:toggleSectionContent,copyJsonToClipboard:copyJsonToClipboard}).forEach((([e,t])=>{window[e]=t}));
|
|
1
|
+
import{serverTemplate,envVariableTemplate,serverRequirementTemplate}from"./templates.js";import{state,setServerCounter,getServerCounter,setEnvCounter,getEnvCounter,deleteEnvCounter,clearEnvCountersForTab,setServerRequirementCounter,getServerRequirementCounter,deleteServerRequirementCounter,clearServerRequirementCountersForTab}from"./state.js";import{getFormData,populateForm,resetOnboardFormDynamicContent}from"./formProcessor.js";import{showToast}from"../notifications.js";function reindexElements(e,t,r,n){n.forEach((({selector:n,idBase:s,namePattern:o})=>{const a=e.querySelector(n);if(a&&(s&&(a.id=`${s}${r}`),o&&a.getAttribute("name"))){const e=a.getAttribute("name").replace(new RegExp(o.replace("INDEX",t)),`$1${r}$2`);a.setAttribute("name",e)}}))}function reindexServers(e="serversList"){const t=document.getElementById(e);if(!t)return;const r=t.querySelectorAll(".server-item"),n=new Map,s=new Map;r.forEach(((t,r)=>{const o=parseInt(t.dataset.index,10);t.dataset.index=r;const a=t.querySelector("h3");if(a){const e=a.textContent||"",t=`MCP Server #${r+1}`;let n="";e.includes("(Adhoc - Editable)")?n=' <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>':e.includes("(Read-only)")&&(n=" (Read-only)"),a.innerHTML=`${t}${n}`}const i=t.querySelector(`#${e}-server-header-${o}`);if(i){i.id=`${e}-server-header-${r}`;const t=`${e}-server-content-${o}`,n=`${e}-server-content-${r}`;let s=i.getAttribute("onclick");s&&(s=s.replace(new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),n),i.setAttribute("onclick",s));let a=i.getAttribute("onkeydown");a&&(a=a.replace(new RegExp(t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),n),i.setAttribute("onkeydown",a)),i.setAttribute("aria-controls",n)}const l=t.querySelector(`#${e}-server-title-${o}`);l&&(l.id=`${e}-server-title-${r}`);const c=t.querySelector(`#${e}-server-content-${o}`);c&&c.setAttribute("aria-labelledby",`${e}-server-title-${r}`),t.querySelectorAll("[onclick]").forEach((t=>{const n=t.getAttribute("onclick");if(!n)return;if(t.id===`${e}-server-header-${r}`)return;const s=n.replace(new RegExp(`\\((\\s*)${o}(\\s*[,\\)])`,"g"),`($1${r}$2`).replace(new RegExp(`${e}-server-deps-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-server-deps-content-${r}`).replace(new RegExp(`${e}-installation-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-installation-content-${r}`).replace(new RegExp(`${e}-env-vars-content-${o}`.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g"),`${e}-env-vars-content-${r}`);t.setAttribute("onclick",s)})),reindexElements(t,o,r,[{selector:`#${e}-server-content-${o}`,idBase:`${e}-server-content-`},{selector:`#${e}-server-deps-content-${o}`,idBase:`${e}-server-deps-content-`},{selector:`#${e}-installation-content-${o}`,idBase:`${e}-installation-content-`},{selector:`#${e}-env-vars-content-${o}`,idBase:`${e}-env-vars-content-`},{selector:`#schema-path-${o}`,idBase:"schema-path-"},{selector:`#envVarsContainer_${o}`,idBase:"envVarsContainer_"}]);const d=t.querySelector(`#envVarsContainer_${r}`);let u=0;d&&d.querySelectorAll(".env-var-item").forEach(((e,t)=>{const n=parseInt(e.dataset.envIndex,10);e.dataset.envIndex=t,reindexElements(e,n,t,[{selector:"[name]",namePattern:`(servers\\[${r}\\]\\.installation\\.env\\[)\\d+(\\]\\..+)`}]),u++})),n.set(r,u);const m=t.querySelector(`#server-requirements-list-${r}`);let v=0;m&&m.querySelectorAll(".server-requirement-item").forEach(((e,t)=>{const n=parseInt(e.dataset.reqIndex,10);e.dataset.reqIndex=t,reindexElements(e,n,t,[{selector:"[name]",namePattern:`(servers\\[${r}\\]\\.requirements\\[)\\d+(\\]\\..+)`}]),v++})),s.set(r,v)})),clearEnvCountersForTab(e),n.forEach(((t,r)=>setEnvCounter(e,r,t))),clearServerRequirementCountersForTab(e),s.forEach(((t,r)=>setServerRequirementCounter(e,r,t))),setServerCounter(e,r.length)}export function addServer(e="serversList",t=!1,r=null){const n=document.getElementById(e);if(!n)return-1;0===n.children.length&&(setServerCounter(e,0),clearEnvCountersForTab(e),clearServerRequirementCountersForTab(e));const s=getServerCounter(e);let o;o=!("true"===r?.systemTags?.adhoc)&&(!!t&&(state.originalServerNamesForFormPopulation?!!(r&&r.name&&state.originalServerNamesForFormPopulation.has(r.name)):!!r)),n.insertAdjacentHTML("beforeend",serverTemplate(s,t,r,e)),setEnvCounter(e,s,0),setServerRequirementCounter(e,s,0),setServerCounter(e,s+1);const a=n.querySelector(`.server-item[data-index="${s}"]`);if(a){r&&r.systemTags?a.dataset.systemTags=JSON.stringify(r.systemTags):r&&!r.systemTags?delete a.dataset.systemTags:r||delete a.dataset.systemTags,r&&r.name?a.dataset.originalName=r.name:delete a.dataset.originalName,setupServerMode(a,s,e,o,r),setupReadOnlyState(a,o,r,e,s);if([{contentId:`${e}-server-deps-content-${s}`,iconSelector:`#${e}-deps-header-${s} i`},{contentId:`${e}-installation-content-${s}`,iconSelector:`#${e}-startup-header-${s} i`},{contentId:`${e}-env-vars-content-${s}`,iconSelector:`#${e}-envars-header-${s} i`}].forEach((({contentId:e,iconSelector:t})=>{const r=document.getElementById(e),n=a.querySelector(t);r&&n&&(r.classList.remove("hidden"),n.classList.remove("bxs-chevron-down"),n.classList.add("bxs-chevron-up"))})),!o){n.querySelectorAll(".server-item").forEach((t=>{const r=parseInt(t.dataset.index,10);if(t.parentElement!==n)return;const o=`${e}-server-content-${r}`,a=t.querySelector(".server-header-toggle i.toggle-icon"),i=document.getElementById(o);i&&a&&(r===s?(i.classList.contains("hidden")&&toggleSectionContent(o,a),setTimeout((()=>{t.scrollIntoView({behavior:"smooth",block:"nearest"})}),0)):i.classList.contains("hidden")||toggleSectionContent(o,a))}))}}return s}function setupServerMode(e,t,r,n,s){const o=e.querySelector(`select[name="servers[${t}].mode"]`);o&&(n&&s&&(o.value=s.mode||"stdio"),o.addEventListener("change",(()=>renderInstallationConfig(t,r))),renderInstallationConfig(t,r,o.value,n,s?.installation))}function setupReadOnlyState(e,t,r,n,s){const o=e.querySelector(`#${n}-server-title-${s}`),a=`MCP Server #${s+1}`;let i="true"===r?.systemTags?.adhoc;if(!i&&e.dataset.systemTags)try{"true"===JSON.parse(e.dataset.systemTags).adhoc&&(i=!0)}catch(e){}if(t){if(o)if(i)if(o.querySelector("span.text-blue-600")){const e=o.querySelector("span.text-blue-600").outerHTML;o.innerHTML=`${a} ${e}`}else o.innerHTML=`${a} <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>`;else o.innerHTML=`${a} (Read-only)`;e.querySelectorAll("input, select, textarea").forEach((e=>{e.closest(".env-var-item")||e.closest(".server-requirement-item")||(e.disabled=!0,e.classList.add("bg-gray-100","cursor-not-allowed","opacity-70"))})),e.querySelectorAll(".action-button-in-server").forEach((e=>{e.classList.contains("duplicate-mcp-server-button")?(e.style.display="flex",e.classList.remove("hidden"),e.disabled=!1):(e.style.display="none",e.classList.add("hidden"))}));[{contentId:`${n}-server-content-${s}`,iconSelector:".server-header-toggle i.toggle-icon"},{contentId:`${n}-server-deps-content-${s}`,iconSelector:`#${n}-deps-header-${s} i`},{contentId:`${n}-installation-content-${s}`,iconSelector:`#${n}-startup-header-${s} i`},{contentId:`${n}-env-vars-content-${s}`,iconSelector:`#${n}-envars-header-${s} i`}].forEach((({contentId:t,iconSelector:r})=>{const n=document.getElementById(t),s=e.querySelector(r);n&&s&&(n.classList.remove("hidden"),s.classList.remove("bxs-chevron-down"),s.classList.add("bxs-chevron-up"))}))}else{if(o)if(i)if(o.querySelector("span.text-blue-600")){const e=o.querySelector("span.text-blue-600").outerHTML;o.innerHTML=`${a} ${e}`}else o.innerHTML=`${a} <span class="text-sm text-blue-600 ml-1">(Adhoc - Editable)</span>`;else o.innerHTML=a;setTimeout((()=>{e.querySelectorAll("input, select, textarea").forEach((e=>{e.closest(".env-var-item")||e.closest(".server-requirement-item")||(e.disabled=!1,e.removeAttribute("readonly"),e.classList.remove("bg-gray-100","cursor-not-allowed","opacity-70"))})),e.querySelectorAll(".action-button-in-server").forEach((e=>{e.style.display="flex",e.disabled=!1,e.classList.remove("hidden","opacity-50","cursor-not-allowed")}))}),0)}}export function renderInstallationConfig(e,t="serversList",r=null,n=!1,s=null){const o=document.querySelector(`#${t} .server-item[data-index="${e}"]`);if(!o)return;const a=o.querySelector(`select[name="servers[${e}].mode"]`),i=r||(a?a.value:"stdio"),l=o.querySelector(`#installation-config-${e}`),c=o.querySelector(`#env-vars-block-${e}`);if(!l)return;const d=n?"disabled":"",u=n?"bg-gray-100 cursor-not-allowed opacity-70":"";l.innerHTML="sse"===i?generateSSETemplate(e,d,u,s):generateStdioTemplate(e,d,u,s),c&&(c.style.display="sse"===i?"none":"")}function generateSSETemplate(e,t,r,n){return`\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Server URL*</label>\n <input type="text" name="servers[${e}].installation.url" required ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="e.g., https://your-server.com/api/mcp"\n value="${n?.url||""}">\n </div>\n `}function generateStdioTemplate(e,t,r,n){return`\n <div class="grid grid-cols-1 md:grid-cols-2 gap-4">\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Command*</label>\n <input type="text" name="servers[${e}].installation.command" required ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="e.g., node, python3"\n value="${n?.command||""}">\n </div>\n <div>\n <label class="block text-sm font-medium text-gray-700 mb-1">Arguments (comma-separated)</label>\n <input type="text" name="servers[${e}].installation.args" ${t}\n class="w-full px-3 py-2 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 ${r}"\n placeholder="arg1, path/to/script.js, --flag"\n value="${n?.args?n.args.join(", "):""}">\n </div>\n </div>\n `}export function removeServer(e,t="serversList"){const r=document.getElementById(t);if(!r)return;const n=r.querySelector(`.server-item[data-index="${e}"]`);n&&(n.remove(),deleteEnvCounter(t,e),deleteServerRequirementCounter(t,e),reindexServers(t))}export function addEnvVariable(e,t="serversList",r=!1){const n=document.querySelector(`#${t} .server-item[data-index="${e}"] #envVarsContainer_${e}`);if(!n)return-1;const s=getEnvCounter(t,e);return n.insertAdjacentHTML("beforeend",envVariableTemplate(e,s,r,t)),setEnvCounter(t,e,s+1),s}export function removeEnvVariable(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .env-var-item[data-env-index="${t}"]`);n&&n.remove()}export function addServerRequirement(e,t="serversList",r=!1){console.log(`[addServerRequirement] ServerIndex: ${e}, isServerEffectivelyReadOnly received: ${r}`);const n=document.querySelector(`#${t} .server-item[data-index="${e}"] #server-requirements-list-${e}`);if(!n)return-1;const s=getServerRequirementCounter(t,e);return n.insertAdjacentHTML("beforeend",serverRequirementTemplate(e,s,r,t)),setServerRequirementCounter(t,e,s+1),toggleServerAliasField(e,s,t),toggleServerRegistryConfig(e,s,t),s}export function removeServerRequirement(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);n&&n.remove()}export function toggleServerAliasField(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);if(!n)return;const s=n.querySelector(`select[name="servers[${e}].requirements[${t}].type"]`),o=n.querySelector(`#server-alias-field-${e}-${t}`);s&&o&&o.classList.toggle("hidden","command"!==s.value)}export function toggleServerRegistryConfig(e,t,r="serversList"){const n=document.querySelector(`#${r} .server-item[data-index="${e}"] .server-requirement-item[data-req-index="${t}"]`);if(!n)return;const s=n.querySelector(`select[name="servers[${e}].requirements[${t}].registryType"]`);s&&["github","artifacts"].forEach((r=>{const o=n.querySelector(`#server-${r}-config-${e}-${t}`);o&&o.classList.toggle("hidden",s.value!==r)}))}export function toggleSectionContent(e,t,r=null){const n=document.getElementById(e);if(!n)return;r=r||t?.parentElement||null;const s=n.classList.toggle("hidden");t&&(t.classList.toggle("bxs-chevron-up",!s),t.classList.toggle("bxs-chevron-down",s)),r&&r.setAttribute("aria-expanded",(!s).toString())}export function toggleViewMode(e,t,r,n=null,s=!1){const o={createCategory:document.getElementById("panel-create-category"),createServer:document.getElementById("panel-create-server"),jsonEditor:document.getElementById("panel-json-editor"),textarea:document.getElementById("jsonEditorTextarea"),activeForm:document.getElementById(t),viewModeToggle:document.getElementById("viewModeToggle"),actionButtons:{json:document.getElementById("jsonEditorActionsContainer"),main:document.querySelector(`#${t} ~ .flex.justify-end.space-x-4.pt-6.border-t`)}};if(!isViewAlreadyActive(e,o,t)){state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null);try{e?handleJsonView(o,t,r,n,s):(s&&n&&n.mcpServers&&"onboardServerForm"===t&&(state.originalServerNamesForFormPopulation=new Set(n.mcpServers.map((e=>e.name)).filter((e=>e)))),handleFormView(o,t,r,n,s),state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null))}catch(t){console.error("Error in view mode toggle:",t),showToast(`Error: ${t.message}`,"error"),o.viewModeToggle&&(o.viewModeToggle.checked=e),state.originalServerNamesForFormPopulation&&(state.originalServerNamesForFormPopulation=null)}}}function isViewAlreadyActive(e,t,r){if(e&&t.jsonEditor&&!t.jsonEditor.classList.contains("hidden"))return!0;if(!e&&t.jsonEditor?.classList.contains("hidden")){if("onboardForm"===r&&t.createCategory&&!t.createCategory.classList.contains("hidden"))return!0;if("onboardServerForm"===r&&t.createServer&&!t.createServer.classList.contains("hidden"))return!0}return!1}function handleJsonView(e,t,r,n,s){const o=getFeedConfiguration(e.activeForm,n,s);e.textarea.value=JSON.stringify(o,null,2),e.textarea.readOnly=s&&n?.mcpServers?.length>0,e.textarea.readOnly?(e.textarea.classList.add("bg-gray-100","cursor-not-allowed"),showToast("JSON view is read-only for existing servers in this category.","info")):e.textarea.classList.remove("bg-gray-100","cursor-not-allowed"),togglePanels(e,!0),toggleButtons(e.actionButtons,!0)}function handleFormView(e,t,r,n,s){const o=JSON.parse(e.textarea.value),a=document.getElementById(r);a&&(a.innerHTML=""),resetOnboardFormDynamicContent(t,r),populateForm(o,t,s&&n?.mcpServers?.length>0,r),togglePanels(e,!1,t),toggleButtons(e.actionButtons,!1)}function getFeedConfiguration(e,t,r){if(!r||!t)return e?getFormData(e):{};const n=getFormData(e,!0,t),s=JSON.parse(JSON.stringify(t));return s.mcpServers=n.mcpServers||[],s.requirements=n.requirements||[],s}function togglePanels(e,t,r=null){e.createCategory?.classList.add("hidden"),e.createServer?.classList.add("hidden"),e.jsonEditor?.classList.add("hidden"),t?e.jsonEditor?.classList.remove("hidden"):r&&("onboardForm"===r?e.createCategory?.classList.remove("hidden"):"onboardServerForm"===r&&e.createServer?.classList.remove("hidden"))}function toggleButtons(e,t){e.main?.classList.toggle("hidden",t),e.json?.classList.toggle("hidden",t)}export async function saveJsonData(e,t=null){const r=document.getElementById("jsonEditorTextarea");if(r.readOnly)showToast("Cannot save, JSON editor is in read-only mode for existing servers.","warning");else try{const n=prepareConfiguration(e,JSON.parse(r.value),t);if(!n)return;await saveConfiguration(n)}catch(e){console.error("Error saving JSON data:",e),showToast(`Error saving JSON data: ${e.message}`,"error")}}function prepareConfiguration(e,t,r){return"create-category"===e?t.name?{data:t,isUpdate:isUpdateOperation(t.name)}:(showToast("Category Name is required in JSON.","error"),null):"create-server"===e?r?.name?{data:mergeConfigurations(r,t),isUpdate:!0}:(showToast("No existing category context for saving JSON.","error"),null):(showToast("Invalid tab context for saving JSON.","error"),null)}function isUpdateOperation(e){const t=new URLSearchParams(window.location.search);return"edit"===t.get("action")&&t.get("category")===e}function mergeConfigurations(e,t){const r=JSON.parse(JSON.stringify(e)),n=new Set(r.mcpServers?.map((e=>e.name))||[]),s=(t.mcpServers||[]).filter((e=>!n.has(e.name)));r.mcpServers=(r.mcpServers||[]).concat(s);const o=new Set(r.requirements?.map((e=>`${e.type}|${e.name}|${e.version}`))||[]);return(t.requirements||[]).forEach((e=>{const t=`${e.type}|${e.name}|${e.version}`,n=s.some((t=>t.dependencies?.requirements?.some((t=>t.name===e.name&&t.version===e.version))));!o.has(t)&&n&&(r.requirements=r.requirements||[],r.requirements.push(e))})),r}async function saveConfiguration({data:e,isUpdate:t}){const r=await fetch("/api/categories/onboard",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({categoryData:e,isUpdate:t})});if(!r.ok){const e=await r.json();throw new Error(e.error||`HTTP error! status: ${r.status}`)}showToast("JSON data submitted successfully!","success")}export async function copyJsonToClipboard(){const e=document.getElementById("jsonEditorTextarea");if(e)try{await navigator.clipboard.writeText(e.value),showToast("JSON copied to clipboard!","success")}catch(e){console.error("Failed to copy JSON:",e),showToast("Failed to copy JSON. See console for details.","error")}else showToast("JSON content not found.","error")}export function duplicateServer(e,t){const r="serversList"===t?"onboardForm":"onboardServerForm",n=document.getElementById(r);if(!n)return void showToast(`Form with ID ${r} not found. Cannot duplicate server.`,"error");const s="existingCategoryServersList"===t;let o=null;s&&(o=window.currentSelectedCategoryData||null);if(!n.querySelector(`.server-item[data-index="${e}"]`))return void showToast("Could not find the server item to duplicate in the DOM.","error");const a=[];n.querySelectorAll("input, select, textarea").forEach((e=>{e.disabled&&(a.push({element:e,wasDisabled:!0}),e.disabled=!1)}));const i=getFormData(n,s,o);if(a.forEach((({element:e,wasDisabled:t})=>{e.disabled=t})),!i||!i.mcpServers||i.mcpServers.length<=e)return void showToast("Could not retrieve data for the server to duplicate after attempting to enable fields.","error");let l=JSON.parse(JSON.stringify(i.mcpServers[e]));l.systemTags&&delete l.systemTags;let c=!1;s&&(c=window.isExistingCategoryReadOnly||!1);const d=addServer(t,c,null);if(-1===d)return void showToast("Failed to add a new server item for duplication.","error");const u=document.getElementById(t).querySelector(`.server-item[data-index="${d}"]`);u?(populateServerManually(u,d,l,t),showToast(`Server #${e+1} duplicated to Server #${d+1}.`,"success")):showToast("Failed to find the new server item after duplication.","error")}function populateServerManually(e,t,r,n){e.querySelector(`input[name="servers[${t}].name"]`).value=r.name||"",e.querySelector(`textarea[name="servers[${t}].description"]`).value=r.description||"",e.querySelector(`select[name="servers[${t}].mode"]`).value=r.mode||"stdio",e.querySelector(`input[name="servers[${t}].schemas"]`).value=r.schemas||"",e.querySelector(`input[name="servers[${t}].repository"]`).value=r.repository||"";const s=e.querySelector(`select[name="servers[${t}].mode"]`);if(s&&s.dispatchEvent(new Event("change")),"stdio"===r.mode&&r.installation){const n=e.querySelector(`input[name="servers[${t}].installation.command"]`);n&&(n.value=r.installation.command||"");const s=e.querySelector(`input[name="servers[${t}].installation.args"]`);s&&(s.value=r.installation.args?r.installation.args.join(", "):"")}else if("sse"===r.mode&&r.installation){const n=e.querySelector(`input[name="servers[${t}].installation.url"]`);n&&(n.value=r.installation.url||"")}const o=e.querySelector(`#envVarsContainer_${t}`);o&&r.installation&&r.installation.env&&Object.entries(r.installation.env).forEach((([e,r])=>{const s=addEnvVariable(t,n,!1),a=o.querySelector(`.env-var-item[data-env-index="${s}"]`);a&&(a.querySelector(`input[name="servers[${t}].installation.env[${s}].name"]`).value=e,a.querySelector(`input[name="servers[${t}].installation.env[${s}].default"]`).value=r.Default||"",a.querySelector(`input[name="servers[${t}].installation.env[${s}].required"]`).checked=r.Required||!1,a.querySelector(`textarea[name="servers[${t}].installation.env[${s}].description"]`).value=r.Description||"")}));const a=e.querySelector(`#server-requirements-list-${t}`);a&&r.dependencies&&r.dependencies.requirements&&r.dependencies.requirements.forEach((e=>{const r=addServerRequirement(t,n,!1),s=a.querySelector(`.server-requirement-item[data-req-index="${r}"]`);if(s){s.querySelector(`input[name="servers[${t}].requirements[${r}].name"]`).value=e.name||"",s.querySelector(`select[name="servers[${t}].requirements[${r}].type"]`).value=e.type||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].version"]`).value=e.version||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].order"]`).value=e.order||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].alias"]`).value=e.alias||"";const n=s.querySelector(`select[name="servers[${t}].requirements[${r}].type"]`);n&&n.dispatchEvent(new Event("change"));const o=s.querySelector(`select[name="servers[${t}].requirements[${r}].registryType"]`);o&&(o.value=e.registryType||"public",o.dispatchEvent(new Event("change")),e.registry&&("github"===e.registryType&&e.registry.githubRelease?(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.repository"]`).value=e.registry.githubRelease.repository||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.assetsName"]`).value=e.registry.githubRelease.assetsName||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.githubRelease.assetName"]`).value=e.registry.githubRelease.assetName||""):"artifacts"===e.registryType&&e.registry.artifacts?(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.artifacts.registryName"]`).value=e.registry.artifacts.registryName||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.artifacts.registryUrl"]`).value=e.registry.artifacts.registryUrl||""):"local"===e.registryType&&e.registry.local&&(s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.local.localPath"]`).value=e.registry.local.localPath||"",s.querySelector(`input[name="servers[${t}].requirements[${r}].registry.local.assetName"]`).value=e.registry.local.assetName||"")))}})),setupReadOnlyState(e,!1,null,n,t)}window.duplicateServer=duplicateServer,Object.entries({addServer:addServer,removeServer:removeServer,addEnvVariable:addEnvVariable,removeEnvVariable:removeEnvVariable,addServerRequirement:addServerRequirement,removeServerRequirement:removeServerRequirement,toggleServerAliasField:toggleServerAliasField,toggleServerRegistryConfig:toggleServerRegistryConfig,renderInstallationConfig:renderInstallationConfig,toggleSectionContent:toggleSectionContent,copyJsonToClipboard:copyJsonToClipboard}).forEach((([e,t])=>{window[e]=t}));
|
|
2
2
|
//# sourceMappingURL=uiHandlers.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{showToast}from"../notifications.js";import{getFormData}from"./formProcessor.js";import{toggleSectionContent}from"./uiHandlers.js";export function showValidationMessage(e,t,s=!0){const r=e.nextElementSibling;r&&r.classList.contains("validation-message")&&r.remove();const a=document.createElement("div");a.className="validation-message text-xs mt-1 "+(s?"text-red-500":"text-green-500"),a.textContent=t,e.insertAdjacentElement("afterend",a),s?(e.classList.add("border-red-500"),e.classList.remove("border-green-500")):(e.classList.add("border-green-500"),e.classList.remove("border-red-500"))}export function validateFormFields(e,t){e.querySelectorAll(".validation-message").forEach((e=>e.remove()));let s=!1;const r=[];if(Array.from(e.querySelectorAll("[required]")).forEach((e=>{e.value.trim()||(showValidationMessage(e,"This field is required",!0),s=!0,r.push(`${e.name||"Field"} is required`))})),"create-category"===t){const t=e.querySelector('input[name="name"]');t&&t.value.trim()&&(/^[a-zA-Z0-9-_]+$/.test(t.value.trim())||(showValidationMessage(t,"Only alphanumeric characters, hyphens, and underscores allowed",!0),s=!0,r.push("Category name must only contain alphanumeric characters, hyphens, and underscores")))}return e.querySelectorAll('input[name$=".env\\[\\].name"]').forEach((e=>{const t=e.value.trim();t&&!/^[A-Z_][A-Z0-9_]*$/.test(t)&&(showValidationMessage(e,"Must be uppercase with only letters, numbers, and underscores",!0),s=!0,r.push("Environment variable names must be uppercase with only letters, numbers, and underscores"))})),e.querySelectorAll('input[name$=".url"]').forEach((e=>{const t=e.value.trim();if(t)try{new URL(t)}catch(t){showValidationMessage(e,"Invalid URL format",!0),s=!0,r.push("Invalid URL format")}})),{isValid:!s,errors:r}}const POLLING_INTERVAL=3e3;let pollingIntervalId=null;export function updateOperationDisplay(e,t){const{status:s,message:r,validationStatus:a,prInfo:i,errorMessage:n,operationType:o,steps:l}=e,c="string"==typeof s?s.toUpperCase():"",d="PENDING"===c||"VALIDATING"===c||"PRCREATING"===c||"IN_PROGRESS"===c||"PUBLISHING"===c;let g=`<p><strong>Overall Status:</strong> <span class="${"COMPLETED"===c||"SUCCEEDED"===c?"text-green-600":"FAILED"===c?"text-red-600":"text-yellow-600"}">${s} ${d?"<i class='bx bx-loader-alt bx-spin ml-2'></i>":""}</span></p>`;if(o&&(g+=`<p><strong>Operation Type:</strong> ${o}</p>`),r&&(g+=`<p><strong>Message:</strong> ${r}</p>`),n&&(g+=`<p class="text-red-500"><strong>Overall Error:</strong> ${n}</p>`),Array.isArray(l)&&l.length>0){const e=`progress-steps-list-${t.id}`;g+=`\n <div class="progress-section-container mt-4">\n <h4 class="font-semibold mb-2 text-gray-700 cursor-pointer flex items-center progress-section-toggle" data-target-id="${e}">\n Progress\n <i class='bx bx-chevron-up toggle-icon-progress ml-2 text-gray-500'></i>\n </h4>\n <ul id="${e}" class="list-none space-y-2 border-l-2 border-blue-500 pl-4 py-2">`,l.forEach(((e,t)=>{const s=new Date(e.timestamp).toLocaleString();let r="",a="text-gray-700";const i=t===l.length-1;e.errorMessage||"failed"===e.status?(r="<i class='bx bx-x-circle text-red-500 mr-2'></i>",a="text-red-600"):i&&d?(r="<i class='bx bx-loader-alt bx-spin text-blue-500 mr-2'></i>",a="text-blue-700"):(r="<i class='bx bx-check-circle text-green-500 mr-2'></i>",a="text-gray-700"),g+=`<li class="text-sm ${a}">`,g+=`${r}<strong>${e.stepName}</strong>`,e.serverName&&(g+=` (Server: ${e.serverName})`),g+=`<span class="text-xs text-gray-500 ml-2">- ${s}</span>`,e.errorMessage&&(g+=`<p class="text-xs text-red-400 pl-6">Error: ${e.errorMessage}</p>`),g+="</li>"})),g+="</ul>"}if(a){g+='<h4 class="font-semibold mt-4 mb-2 text-gray-700">Detailed Validation Results:</h4>',g+='<ul class="list-disc list-inside space-y-1">';let e=!1;Array.isArray(a.serverResults)&&a.serverResults.forEach((t=>{if(t&&"string"==typeof t.serverName&&"boolean"==typeof t.isValid){e=!0;const s=t.isValid?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>";let r=t.message?`: ${t.message}`:t.isValid?": Valid":": Invalid";g+=`<li>${s} <strong>Server "${t.serverName}"</strong>${r}</li>`}}));for(const t in a){if("serverResults"===t)continue;const s=a[t];if("isValid"===t&&"boolean"==typeof s&&"string"==typeof a.message&&!e){e=!0,g+=`<li>${s?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>"} <strong>Overall Validation:</strong> ${a.message}</li>`;break}if("object"==typeof s&&null!==s&&"isValid"in s&&"message"in s){e=!0;const r=s.isValid?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>";g+=`<li>${r} <strong>${t.replace(/([A-Z])/g," $1").trim()}:</strong> ${s.message}</li>`}}!e&&!0===a.isValid&&a.message?(e=!0,g+=`<li><i class='bx bx-check-circle text-green-500'></i> <strong>Overall:</strong> ${a.message}</li>`):e||(g+="<li>No detailed validation information available or format is unexpected.</li>"),g+="</ul>"}i&&i.url&&(g+=`<p class="mt-3"><strong>PR Info:</strong> <a href="${i.url}" target="_blank" class="text-blue-600 hover:underline">${i.url}</a></p>`),t.innerHTML=g,Array.isArray(l)&&l.length>0&&ensureProgressToggleListener(t)}export function ensureProgressToggleListener(e){e&&!e.dataset.progressToggleListenerAttached&&(e.addEventListener("click",(e=>{const t=e.target.closest(".progress-section-toggle");if(t){const e=t.dataset.targetId,s=t.querySelector(".toggle-icon-progress");e&&s&&"function"==typeof toggleSectionContent&&toggleSectionContent(e,s)}})),e.dataset.progressToggleListenerAttached="true")}export async function pollOperationStatus(e,t,s,r,a,i){const n=document.getElementById(t);ensureProgressToggleListener(n);const o=document.getElementById(s),l=document.getElementById(r),c=(e=!1)=>{o&&l&&(e?(o.disabled=!1,o.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",o.classList.remove("opacity-50"),l.disabled=!1,l.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",l.classList.remove("opacity-50")):"validate"===a?(o.disabled=!0,o.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Validating...",l.disabled=!0,l.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",l.classList.add("opacity-50")):"publish"===a&&(l.disabled=!0,l.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Publishing...",o.disabled=!0,o.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",o.classList.add("opacity-50")))};try{const t=await fetch(`/api/categories/${e}/onboard/status?operationType=${encodeURIComponent(i)}`),s=await t.json();if(s.success&&s.data){updateOperationDisplay(s.data,n);const e=s.data.status?String(s.data.status).toUpperCase():"";return"COMPLETED"===e||"FAILED"===e||"SUCCEEDED"===e?(c(!0),!1):(c(!1),!0)}return n.innerHTML=`<p class="text-red-500">Error polling status: ${s.error||"Unknown error"}</p>`,c(!0),!1}catch(e){return n.innerHTML='<p class="text-red-500">An error occurred while polling status. Please check the console.</p>',c(!0),!1}}export async function handleValidation(e,t,s=null){const{panelId:r,contentId:a,formId:i,validateButtonId:n,publishButtonId:o}=getElementIdsByTab(t),l=document.getElementById(a);ensureProgressToggleListener(l);const c=document.getElementById(i),d=document.getElementById(n),g=document.getElementById(o);if(!(c&&l&&d&&g))return void showToast("Required form or panel elements not found for validation.","error");if(!validateFormFields(c,t).isValid)return showToast("Please fix all validation errors before proceeding.","error"),d.disabled=!1,void(d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate");if("create-category"===t){const e=getFormData(c,!1);if(!e.mcpServers||0===e.mcpServers.length)return void showToast("At least one MCP server must be configured for a new category.","error")}d.disabled=!0,d.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Validating...",g.disabled=!0,g.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",g.classList.add("opacity-50"),pollingIntervalId&&(clearInterval(pollingIntervalId),pollingIntervalId=null);const p="create-server"===t,u=getFormData(c,p,s);let m;p&&s?(m=JSON.parse(JSON.stringify(s)),m.mcpServers=u.mcpServers||[],m.requirements=u.requirements||[]):m=u,l.innerHTML='<p class="text-gray-500">Initiating validation...</p>',ensureStatusPanelVisible(r,a);try{const e=await fetch("/api/categories/onboard/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({categoryData:m,forExistingCategory:p})}),t=await e.json();if(t.success&&t.data){updateOperationDisplay(t.data,l);const e=m.name,s="VALIDATION_ONLY",r=t.data.status,i="string"==typeof r?r.toUpperCase():"";e&&"COMPLETED"!==i&&"FAILED"!==i&&"SUCCEEDED"!==i?pollingIntervalId=setInterval((async()=>{await pollOperationStatus(e,a,n,o,"validate",s)||(clearInterval(pollingIntervalId),pollingIntervalId=null)}),3e3):(d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50"))}else l.innerHTML=`<p class="text-red-500">Validation request failed: ${t.error||"Unknown error"}</p>`,d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50")}catch(e){l.innerHTML='<p class="text-red-500">An error occurred while initiating validation. Please check the console.</p>',d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50")}}export function getElementIdsByTab(e){const t="create-category"===e;return{panelId:t?"validationStatusPanelNewCategory":"validationStatusPanelExistingCategory",contentId:t?"validationStatusContentNewCategory":"validationStatusContentExistingCategoryTab",formId:t?"onboardForm":"onboardServerForm",validateButtonId:t?"validateButtonNewCategory":"validateButtonExistingCategory",publishButtonId:t?"publishButtonNewCategory":"publishButtonExistingCategory"}}export function ensureStatusPanelVisible(e,t){const s=document.getElementById(e),r=document.getElementById(t);if(s&&r&&(s.classList.remove("hidden"),r.classList.contains("hidden"))){const e=s.querySelector(".toggle-icon");e&&"function"==typeof toggleSectionContent?toggleSectionContent(t,e):e?(r.classList.remove("hidden"),e.classList.remove("bx-chevron-down"),e.classList.add("bx-chevron-up")):r.classList.remove("hidden")}}
|
|
1
|
+
import{showToast}from"../notifications.js";import{getFormData}from"./formProcessor.js";import{toggleSectionContent}from"./uiHandlers.js";export function showValidationMessage(e,t,s=!0){const r=e.nextElementSibling;r&&r.classList.contains("validation-message")&&r.remove();const a=document.createElement("div");a.className="validation-message text-xs mt-1 "+(s?"text-red-500":"text-green-500"),a.textContent=t,e.insertAdjacentElement("afterend",a),s?(e.classList.add("border-red-500"),e.classList.remove("border-green-500")):(e.classList.add("border-green-500"),e.classList.remove("border-red-500"))}export function validateFormFields(e,t){e.querySelectorAll(".validation-message").forEach((e=>e.remove()));let s=!1;const r=[];if(Array.from(e.querySelectorAll("[required]")).forEach((e=>{e.value.trim()||(showValidationMessage(e,"This field is required",!0),s=!0,r.push(`${e.name||"Field"} is required`))})),"create-category"===t){const t=e.querySelector('input[name="name"]');t&&t.value.trim()&&(/^[a-zA-Z0-9-_]+$/.test(t.value.trim())||(showValidationMessage(t,"Only alphanumeric characters, hyphens, and underscores allowed",!0),s=!0,r.push("Category name must only contain alphanumeric characters, hyphens, and underscores")))}e.querySelectorAll('input[name$=".env\\[\\].name"]').forEach((e=>{const t=e.value.trim();t&&!/^[A-Z_][A-Z0-9_]*$/.test(t)&&(showValidationMessage(e,"Must be uppercase with only letters, numbers, and underscores",!0),s=!0,r.push("Environment variable names must be uppercase with only letters, numbers, and underscores"))}));return e.querySelectorAll('input[name$=".url"]').forEach((e=>{const t=e.value.trim();if(t)try{new URL(t)}catch(t){showValidationMessage(e,"Invalid URL format",!0),s=!0,r.push("Invalid URL format")}})),{isValid:!s,errors:r}}const POLLING_INTERVAL=3e3;let pollingIntervalId=null;export function updateOperationDisplay(e,t){const{status:s,message:r,validationStatus:a,prInfo:n,errorMessage:i,operationType:o,steps:l}=e,c="string"==typeof s?s.toUpperCase():"",d="PENDING"===c||"VALIDATING"===c||"PRCREATING"===c||"IN_PROGRESS"===c||"PUBLISHING"===c;let g=`<p><strong>Overall Status:</strong> <span class="${"COMPLETED"===c||"SUCCEEDED"===c?"text-green-600":"FAILED"===c?"text-red-600":"text-yellow-600"}">${s} ${d?"<i class='bx bx-loader-alt bx-spin ml-2'></i>":""}</span></p>`;if(o&&(g+=`<p><strong>Operation Type:</strong> ${o}</p>`),r&&(g+=`<p><strong>Message:</strong> ${r}</p>`),i&&(g+=`<p class="text-red-500"><strong>Overall Error:</strong> ${i}</p>`),Array.isArray(l)&&l.length>0){const e=`progress-steps-list-${t.id}`;g+=`\n <div class="progress-section-container mt-4">\n <h4 class="font-semibold mb-2 text-gray-700 cursor-pointer flex items-center progress-section-toggle" data-target-id="${e}">\n Progress\n <i class='bx bx-chevron-up toggle-icon-progress ml-2 text-gray-500'></i>\n </h4>\n <ul id="${e}" class="list-none space-y-2 border-l-2 border-blue-500 pl-4 py-2">`,l.forEach(((e,t)=>{const s=new Date(e.timestamp).toLocaleString();let r="",a="text-gray-700";const n=t===l.length-1;e.errorMessage||"failed"===e.status?(r="<i class='bx bx-x-circle text-red-500 mr-2'></i>",a="text-red-600"):n&&d?(r="<i class='bx bx-loader-alt bx-spin text-blue-500 mr-2'></i>",a="text-blue-700"):(r="<i class='bx bx-check-circle text-green-500 mr-2'></i>",a="text-gray-700"),g+=`<li class="text-sm ${a}">`,g+=`${r}<strong>${e.stepName}</strong>`,e.serverName&&(g+=` (Server: ${e.serverName})`),g+=`<span class="text-xs text-gray-500 ml-2">- ${s}</span>`,e.errorMessage&&(g+=`<p class="text-xs text-red-400 pl-6">Error: ${e.errorMessage}</p>`),g+="</li>"})),g+="</ul>"}if(a){g+='<h4 class="font-semibold mt-4 mb-2 text-gray-700">Detailed Validation Results:</h4>',g+='<ul class="list-disc list-inside space-y-1">';let e=!1;Array.isArray(a.serverResults)&&a.serverResults.forEach((t=>{if(t&&"string"==typeof t.serverName&&"boolean"==typeof t.isValid){e=!0;const s=t.isValid?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>";let r=t.message?`: ${t.message}`:t.isValid?": Valid":": Invalid";g+=`<li>${s} <strong>Server "${t.serverName}"</strong>${r}</li>`}}));for(const t in a){if("serverResults"===t)continue;const s=a[t];if("isValid"===t&&"boolean"==typeof s&&"string"==typeof a.message&&!e){e=!0;g+=`<li>${s?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>"} <strong>Overall Validation:</strong> ${a.message}</li>`;break}if("object"==typeof s&&null!==s&&"isValid"in s&&"message"in s){e=!0;const r=s.isValid?"<i class='bx bx-check-circle text-green-500'></i>":"<i class='bx bx-x-circle text-red-500'></i>";g+=`<li>${r} <strong>${t.replace(/([A-Z])/g," $1").trim()}:</strong> ${s.message}</li>`}}if(!e&&!0===a.isValid&&a.message){e=!0;g+=`<li>${"<i class='bx bx-check-circle text-green-500'></i>"} <strong>Overall:</strong> ${a.message}</li>`}else e||(g+="<li>No detailed validation information available or format is unexpected.</li>");g+="</ul>"}n&&n.url&&(g+=`<p class="mt-3"><strong>PR Info:</strong> <a href="${n.url}" target="_blank" class="text-blue-600 hover:underline">${n.url}</a></p>`),t.innerHTML=g,Array.isArray(l)&&l.length>0&&ensureProgressToggleListener(t)}export function ensureProgressToggleListener(e){e&&!e.dataset.progressToggleListenerAttached&&(e.addEventListener("click",(e=>{const t=e.target.closest(".progress-section-toggle");if(t){const e=t.dataset.targetId,s=t.querySelector(".toggle-icon-progress");e&&s&&"function"==typeof toggleSectionContent&&toggleSectionContent(e,s)}})),e.dataset.progressToggleListenerAttached="true")}export async function pollOperationStatus(e,t,s,r,a,n){const i=document.getElementById(t);ensureProgressToggleListener(i);const o=document.getElementById(s),l=document.getElementById(r),updateButtonStates=(e=!1)=>{o&&l&&(e?(o.disabled=!1,o.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",o.classList.remove("opacity-50"),l.disabled=!1,l.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",l.classList.remove("opacity-50")):"validate"===a?(o.disabled=!0,o.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Validating...",l.disabled=!0,l.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",l.classList.add("opacity-50")):"publish"===a&&(l.disabled=!0,l.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Publishing...",o.disabled=!0,o.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",o.classList.add("opacity-50")))};try{const t=await fetch(`/api/categories/${e}/onboard/status?operationType=${encodeURIComponent(n)}`),s=await t.json();if(s.success&&s.data){updateOperationDisplay(s.data,i);const e=s.data.status?String(s.data.status).toUpperCase():"";return"COMPLETED"===e||"FAILED"===e||"SUCCEEDED"===e?(updateButtonStates(!0),!1):(updateButtonStates(!1),!0)}return i.innerHTML=`<p class="text-red-500">Error polling status: ${s.error||"Unknown error"}</p>`,updateButtonStates(!0),!1}catch(e){return console.error("Error polling operation status:",e),i.innerHTML='<p class="text-red-500">An error occurred while polling status. Please check the console.</p>',updateButtonStates(!0),!1}}export async function handleValidation(e,t,s=null){const{panelId:r,contentId:a,formId:n,validateButtonId:i,publishButtonId:o}=getElementIdsByTab(t),l=document.getElementById(a);ensureProgressToggleListener(l);const c=document.getElementById(n),d=document.getElementById(i),g=document.getElementById(o);if(!(c&&l&&d&&g))return console.error("Required form or panel elements not found for validation."),void showToast("Required form or panel elements not found for validation.","error");if(!validateFormFields(c,t).isValid)return showToast("Please fix all validation errors before proceeding.","error"),d.disabled=!1,void(d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate");if("create-category"===t){const e=getFormData(c,!1);if(!e.mcpServers||0===e.mcpServers.length)return void showToast("At least one MCP server must be configured for a new category.","error")}d.disabled=!0,d.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Validating...",g.disabled=!0,g.innerHTML="<i class='bx bx-cloud-upload mr-2'></i>Publish",g.classList.add("opacity-50"),pollingIntervalId&&(clearInterval(pollingIntervalId),pollingIntervalId=null);const u="create-server"===t,p=getFormData(c,u,s);let m;u&&s?(m=JSON.parse(JSON.stringify(s)),m.mcpServers=p.mcpServers||[],m.requirements=p.requirements||[]):m=p,l.innerHTML='<p class="text-gray-500">Initiating validation...</p>',ensureStatusPanelVisible(r,a);try{const e=await fetch("/api/categories/onboard/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({categoryData:m,forExistingCategory:u})}),t=await e.json();if(t.success&&t.data){updateOperationDisplay(t.data,l);const e=m.name,s="VALIDATION_ONLY",r=t.data.status,n="string"==typeof r?r.toUpperCase():"";e&&"COMPLETED"!==n&&"FAILED"!==n&&"SUCCEEDED"!==n?pollingIntervalId=setInterval((async()=>{await pollOperationStatus(e,a,i,o,"validate",s)||(clearInterval(pollingIntervalId),pollingIntervalId=null)}),3e3):(d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50"))}else l.innerHTML=`<p class="text-red-500">Validation request failed: ${t.error||"Unknown error"}</p>`,d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50")}catch(e){console.error("Error during validation:",e),l.innerHTML='<p class="text-red-500">An error occurred while initiating validation. Please check the console.</p>',d.disabled=!1,d.innerHTML="<i class='bx bx-check-shield mr-2'></i>Validate",g.disabled=!1,g.classList.remove("opacity-50")}}export function getElementIdsByTab(e){const t="create-category"===e;return{panelId:t?"validationStatusPanelNewCategory":"validationStatusPanelExistingCategory",contentId:t?"validationStatusContentNewCategory":"validationStatusContentExistingCategoryTab",formId:t?"onboardForm":"onboardServerForm",validateButtonId:t?"validateButtonNewCategory":"validateButtonExistingCategory",publishButtonId:t?"publishButtonNewCategory":"publishButtonExistingCategory"}}export function ensureStatusPanelVisible(e,t){const s=document.getElementById(e),r=document.getElementById(t);if(s&&r&&(s.classList.remove("hidden"),r.classList.contains("hidden"))){const e=s.querySelector(".toggle-icon");e&&"function"==typeof toggleSectionContent?toggleSectionContent(t,e):e?(console.warn("toggleSectionContent function not available for status panel."),r.classList.remove("hidden"),e.classList.remove("bx-chevron-down"),e.classList.add("bx-chevron-up")):r.classList.remove("hidden")}}
|
|
2
2
|
//# sourceMappingURL=validationHandlers.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{allServerCategoriesData,fetchServerCategories}from"./api.js";import{showInstallModal}from"./modal.js";import{showToast,showConfirm}from"./notifications.js";import{DetailsWidget}from"./detailsWidget.js";const REFRESH_INTERVAL=2e3;let refreshTimer=null,activeDetailsWidget=null;const MAX_RETRIES=3,RETRY_DELAY=1e3;function startRefreshTimer(e){refreshTimer&&clearInterval(refreshTimer),refreshTimer=setInterval((async()=>{try{const t=allServerCategoriesData.find((t=>t.name===e));if(!t?.installationStatus?.serversStatus)return;Object.values(t.installationStatus.serversStatus).some((e=>Object.values(e.installedStatus||{}).some((e=>"pending"===e.status||"in-progress"===e.status))))?(await fetchServerCategories(),await showServerDetails(e)):clearInterval(refreshTimer)}catch(e){clearInterval(refreshTimer)}}),2e3)}async function showServerDetails(e,t=0){try{localStorage.setItem("lastSelectedCategory",e),0===allServerCategoriesData.length&&await fetchServerCategories();const s=allServerCategoriesData.find((t=>t.name===e)),n=document.getElementById("serverCategoryDetails");if(!s){if(t<3)return await new Promise((e=>setTimeout(e,1e3))),await fetchServerCategories(),showServerDetails(e,t+1);throw new Error("Server data not found after retries")}let a="";s.feedConfiguration?.PullRequest&&(a=`\n <p class="mb-1 text-sm">\n <span class="font-semibold">Pull Request:</span>\n <a href="${s.feedConfiguration.PullRequest}" target="_blank" class="text-blue-600 hover:underline">${s.feedConfiguration.PullRequest}</a>\n </p>`),n.innerHTML=`\n <h3 class="text-xl font-semibold mb-2 text-gray-800">${s.displayName||s.name}</h3>\n <p class="mb-1"><span class="font-semibold">Description:</span> ${s.description||"N/A"}</p>\n ${a}\n <div id="toolMcpsList" class="mt-4">\n <div class="animate-pulse flex space-x-4">\n <div class="flex-1 space-y-4 py-1">\n <div class="h-4 bg-gray-200 rounded w-3/4"></div>\n <div class="space-y-2">\n <div class="h-4 bg-gray-200 rounded"></div>\n <div class="h-4 bg-gray-200 rounded w-5/6"></div>\n </div>\n </div>\n </div>\n </div>\n `;const r=await renderServersList(s),i=document.getElementById("toolMcpsList");if(!i)throw new Error("toolMcpsList element not found");i.innerHTML=r,document.querySelectorAll(".server-item-content").forEach((e=>{const t=e.dataset.serverName,n=s.feedConfiguration?.mcpServers?.find((e=>e.name===t));if(n){const a=new DetailsWidget(e);a.setContent(n.description);const r=async()=>{try{const e=await fetch(`/api/categories/${s.name}/servers/${t}/schema`);if(!e.ok)return;const n=await e.json();n.success&&n.data&&a.setContent(n.data)}catch(e){}};e.addEventListener("click",(async e=>{e.target.closest("button")||(a===activeDetailsWidget?(a.toggle(),a.isVisible()||(activeDetailsWidget=null)):(a.expand(),activeDetailsWidget=a,await r()))}))}})),startRefreshTimer(e)}catch(e){const t=document.getElementById("serverCategoryDetails");t&&(t.innerHTML=`<p class="text-red-500">Error loading server details: ${e.message}</p>`),showToast(`Error loading server details: ${e.message}`,"error")}}function checkNeedsRequirementUpdate(e,t){const s=e?.dependencies?.requirements||[];if(0===s.length)return!1;const n=t||{};for(const e of s){const t=e.alias||e.name;if(!t)continue;const s=n[t];if(s&&s.availableUpdate&&s.availableUpdate.version)return{needsUpdate:!0,updateMessage:`${s.name}: ${s.availableUpdate.message}`||null}}return{needsUpdate:!1,updateMessage:null}}async function renderServersList(e){try{const t=await fetch("/api/targets"),s=await t.json(),n=s.success?s.data:[];if(!e.feedConfiguration?.mcpServers)return'<p class="text-gray-500">No MCP Servers found for this server.</p>';const a=e.feedConfiguration.mcpServers;if(0===a.length)return'<p class="text-gray-500">No MCP Servers found for this server.</p>';let r='\n <div class="flex justify-between items-center mb-4">\n <h2 class="text-lg font-semibold text-gray-600">MCP Servers</h2>\n </div>';return a.forEach((t=>{const s=t.installed,a=t.installation?.["env:"]||t.installation?.env||{},i=Object.keys(a).length>0;r+=`\n <div class="server-item-content" data-server-name="${t.name}">\n <div class="server-item-info" style="width: 100%; box-sizing: border-box;">\n <div class="server-item-header">\n <div class="flex items-center flex-wrap">\n <h5 class="font-semibold text-gray-800 mr-2">${t.displayName||t.name}</h5>\n ${t.systemTags&&Object.keys(t.systemTags).length>0?`\n <div class="flex flex-wrap gap-1 items-center">\n ${Object.entries(t.systemTags).map((([e,t])=>`<span class="text-xs bg-purple-100 text-purple-700 px-2 py-0.5 rounded-full">${e}: ${t}</span>`)).join("")}\n </div>\n `:""}\n ${t.repository||e.feedConfiguration?.repository?(()=>{const s=t.repository||e.feedConfiguration?.repository,n=s.toLowerCase().includes("github.com");return`\n <a href="${s}" target="_blank" class="ml-2 flex items-center">\n <span class="text-xs px-2 py-1 bg-gray-100 rounded-md flex items-center text-gray-700 hover:bg-gray-200 transition-colors duration-200">\n ${n?'\n <svg class="w-4 h-4 mr-1" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"/>\n </svg>\n GitHub':'\n <svg class="w-4 h-4 mr-1" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path d="M21.721 12.752a9.711 9.711 0 00-.945-5.003 1.743 1.743 0 01-1.339-1.647c0-.522.236-1.01.62-1.341a9.707 9.707 0 00-3.62-2.087 1.744 1.744 0 01-2.113-1.334A9.721 9.721 0 0012 1.016 9.721 9.721 0 009.676 1.3 1.744 1.744 0 017.562 2.634a9.707 9.707 0 00-3.62 2.087 1.744 1.744 0 00-.048 2.32 9.711 9.711 0 00-.945 5.003 9.712 9.712 0 00.945 5.003 1.744 1.744 0 01.048 2.32 9.707 9.707 0 003.62 2.087 1.744 1.744 0 012.114 1.334A9.721 9.721 0 0012 22.982a9.721 9.721 0 002.324-.284 1.744 1.744 0 012.114-1.334 9.707 9.707 0 003.62-2.087 1.744 1.744 0 01.048-2.32 9.711 9.711 0 00.945-5.003z"/>\n </svg>\n Website'}\n </span>\n </a>`})():""}\n </div>\n <p class="text-sm text-gray-600 mb-1 mt-1">${t.description||"No description"}</p>\n </div>\n <div class="flex flex-col mt-3">\n <span class="text-xs font-semibold mb-2">Client Status:</span>\n <div class="flex flex-wrap gap-2">\n ${n.map((s=>{const n=(e.installationStatus?.serversStatus[t.name]?.installedStatus||{})[s],a="completed"===n?.status;return`\n <span class="text-xs flex items-center ${a?"text-green-600 bg-green-50":"text-gray-600 bg-gray-50"} px-3 py-1 rounded-full shadow">\n <svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n ${a?'<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>':'<path d="M7 3.5A1.5 1.5 0 018.5 2h3.879a1.5 1.5 0 011.06.44l3.122 3.12A1.5 1.5 0 0117 6.622V12.5a1.5 1.5 0 01-1.5 1.5h-1v-3.379a1.5 1.5 0 00-.44-1.06L10.94 6.44A1.5 1.5 0 009.879 6H7V3.5z M6 6h2.879A1.5 1.5 0 0110 7.5v1.379a1.5 1.5 0 01-.44 1.06L6.44 13.06A1.5 1.5 0 015.379 13H4.5A1.5 1.5 0 013 11.5V7.5A1.5 1.5 0 014.5 6H6z"></path>'}\n </svg>\n ${s}\n </span>\n `})).join("")}\n </div>\n </div>\n <div class="action-buttons">\n ${(()=>{const n=e.installationStatus,a=n?.requirementsStatus,{needsUpdate:r,updateMessage:i}=checkNeedsRequirementUpdate(t,a);if(s)return`\n <button onclick="event.stopPropagation(); window.uninstallTools('${e.name}', ['${t.name}'])"\n class="bg-red-500 hover:bg-red-700 text-white text-sm font-bold py-2 px-4 rounded-full shadow-sm ease-in-out">\n Uninstall\n </button>`;{let s="Setup",n="";return r&&(s="Update",i&&(n=` title="${i.replace(/"/g,'"')}"`)),`\n <button onclick="event.stopPropagation(); window.showInstallModal('${e.name}', '${t.name}')"\n class="${r?"btn-update":"bg-blue-500 hover:bg-blue-700"} text-white text-xs font-bold py-2 px-4 rounded-full shadow-sm ease-in-out"${n}>\n ${s}\n </button>`}})()}\n </div>\n ${i?'<div class="mt-3 text-xs text-blue-600">\n <svg class="w-3 h-3 inline mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"></path>\n </svg>\n Requires environment configuration\n </div>':""}\n </div>\n </div>\n `})),r}catch(e){throw e}}window.uninstallTools=async function(e,t){try{if(!await showConfirm(`Are you sure you want to uninstall ${t.length} tool(s)?`))return;const s=await fetch(`/api/categories/${e}/uninstall`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({toolList:t})});if(!s.ok){const e=await s.text();throw new Error(`Uninstallation failed: ${e||s.statusText}`)}const n=await s.json();if(!n.success)throw new Error(n.error||"Uninstallation failed");showToast("Tools uninstalled successfully!","success"),await fetchServerCategories(),await showServerDetails(e)}catch(e){showToast(`Error uninstalling tools: ${e.message}`,"error")}},window.showServerDetails=async function(e){try{await showServerDetails(e)}catch(e){const t=document.getElementById("serverCategoryDetails");t&&(t.innerHTML=`<p class="text-red-500">Error loading server details: ${e.message}</p>`),showToast(`Error loading server details: ${e.message}`,"error")}};export{showServerDetails};
|
|
1
|
+
import{allServerCategoriesData,fetchServerCategories}from"./api.js";import{showInstallModal}from"./modal.js";import{showToast,showConfirm}from"./notifications.js";import{DetailsWidget}from"./detailsWidget.js";const REFRESH_INTERVAL=2e3;let refreshTimer=null,activeDetailsWidget=null;const MAX_RETRIES=3,RETRY_DELAY=1e3;function startRefreshTimer(e){refreshTimer&&clearInterval(refreshTimer),refreshTimer=setInterval((async()=>{try{const t=allServerCategoriesData.find((t=>t.name===e));if(!t?.installationStatus?.serversStatus)return;Object.values(t.installationStatus.serversStatus).some((e=>Object.values(e.installedStatus||{}).some((e=>"pending"===e.status||"in-progress"===e.status))))?(await fetchServerCategories(),await showServerDetails(e)):clearInterval(refreshTimer)}catch(e){console.error("Error in refresh timer:",e),clearInterval(refreshTimer)}}),2e3)}async function showServerDetails(e,t=0){console.log("Showing details for:",e);try{localStorage.setItem("lastSelectedCategory",e),0===allServerCategoriesData.length&&await fetchServerCategories();const s=allServerCategoriesData.find((t=>t.name===e)),n=document.getElementById("serverCategoryDetails");if(!s){if(t<3)return console.log(`Server data not found, retrying (${t+1}/3)...`),await new Promise((e=>setTimeout(e,1e3))),await fetchServerCategories(),showServerDetails(e,t+1);throw new Error("Server data not found after retries")}let r="";s.feedConfiguration?.PullRequest&&(r=`\n <p class="mb-1 text-sm">\n <span class="font-semibold">Pull Request:</span>\n <a href="${s.feedConfiguration.PullRequest}" target="_blank" class="text-blue-600 hover:underline">${s.feedConfiguration.PullRequest}</a>\n </p>`),n.innerHTML=`\n <h3 class="text-xl font-semibold mb-2 text-gray-800">${s.displayName||s.name}</h3>\n <p class="mb-1"><span class="font-semibold">Description:</span> ${s.description||"N/A"}</p>\n ${r}\n <div id="toolMcpsList" class="mt-4">\n <div class="animate-pulse flex space-x-4">\n <div class="flex-1 space-y-4 py-1">\n <div class="h-4 bg-gray-200 rounded w-3/4"></div>\n <div class="space-y-2">\n <div class="h-4 bg-gray-200 rounded"></div>\n <div class="h-4 bg-gray-200 rounded w-5/6"></div>\n </div>\n </div>\n </div>\n </div>\n `;const a=await renderServersList(s),o=document.getElementById("toolMcpsList");if(!o)throw new Error("toolMcpsList element not found");o.innerHTML=a;const i=document.querySelectorAll(".server-item-content");console.log(`Found ${i.length} server items`),i.forEach((e=>{const t=e.dataset.serverName;console.log(`Setting up click handler for server: ${t}`);const n=s.feedConfiguration?.mcpServers?.find((e=>e.name===t));if(n){const r=new DetailsWidget(e);r.setContent(n.description);const fetchSchema=async()=>{try{const e=await fetch(`/api/categories/${s.name}/servers/${t}/schema`);if(!e.ok)return;const n=await e.json();n.success&&n.data&&r.setContent(n.data)}catch(e){console.error("Error fetching schema:",e)}};e.addEventListener("click",(async e=>{e.target.closest("button")||(r===activeDetailsWidget?(r.toggle(),r.isVisible()||(activeDetailsWidget=null)):(r.expand(),activeDetailsWidget=r,await fetchSchema()))}))}})),startRefreshTimer(e)}catch(e){console.error("Error in showServerDetails:",e);const t=document.getElementById("serverCategoryDetails");t&&(t.innerHTML=`<p class="text-red-500">Error loading server details: ${e.message}</p>`),showToast(`Error loading server details: ${e.message}`,"error")}}function checkNeedsRequirementUpdate(e,t){const s=e?.dependencies?.requirements||[];if(0===s.length)return!1;const n=t||{};for(const e of s){const t=e.alias||e.name;if(!t)continue;const s=n[t];if(s&&s.availableUpdate&&s.availableUpdate.version)return{needsUpdate:!0,updateMessage:`${s.name}: ${s.availableUpdate.message}`||null}}return{needsUpdate:!1,updateMessage:null}}async function renderServersList(e){try{const t=await fetch("/api/targets"),s=await t.json(),n=s.success?s.data:[];if(!e.feedConfiguration?.mcpServers)return'<p class="text-gray-500">No MCP Servers found for this server.</p>';const r=e.feedConfiguration.mcpServers;if(0===r.length)return'<p class="text-gray-500">No MCP Servers found for this server.</p>';let a='\n <div class="flex justify-between items-center mb-4">\n <h2 class="text-lg font-semibold text-gray-600">MCP Servers</h2>\n </div>';return r.forEach((t=>{const s=t.installed,r=t.installation?.["env:"]||t.installation?.env||{},o=Object.keys(r).length>0;a+=`\n <div class="server-item-content" data-server-name="${t.name}">\n <div class="server-item-info" style="width: 100%; box-sizing: border-box;">\n <div class="server-item-header">\n <div class="flex items-center flex-wrap">\n <h5 class="font-semibold text-gray-800 mr-2">${t.displayName||t.name}</h5>\n ${t.systemTags&&Object.keys(t.systemTags).length>0?`\n <div class="flex flex-wrap gap-1 items-center">\n ${Object.entries(t.systemTags).map((([e,t])=>`<span class="text-xs bg-purple-100 text-purple-700 px-2 py-0.5 rounded-full">${e}: ${t}</span>`)).join("")}\n </div>\n `:""}\n ${t.repository||e.feedConfiguration?.repository?(()=>{const s=t.repository||e.feedConfiguration?.repository,n=s.toLowerCase().includes("github.com");return`\n <a href="${s}" target="_blank" class="ml-2 flex items-center">\n <span class="text-xs px-2 py-1 bg-gray-100 rounded-md flex items-center text-gray-700 hover:bg-gray-200 transition-colors duration-200">\n ${n?'\n <svg class="w-4 h-4 mr-1" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd"/>\n </svg>\n GitHub':'\n <svg class="w-4 h-4 mr-1" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">\n <path d="M21.721 12.752a9.711 9.711 0 00-.945-5.003 1.743 1.743 0 01-1.339-1.647c0-.522.236-1.01.62-1.341a9.707 9.707 0 00-3.62-2.087 1.744 1.744 0 01-2.113-1.334A9.721 9.721 0 0012 1.016 9.721 9.721 0 009.676 1.3 1.744 1.744 0 017.562 2.634a9.707 9.707 0 00-3.62 2.087 1.744 1.744 0 00-.048 2.32 9.711 9.711 0 00-.945 5.003 9.712 9.712 0 00.945 5.003 1.744 1.744 0 01.048 2.32 9.707 9.707 0 003.62 2.087 1.744 1.744 0 012.114 1.334A9.721 9.721 0 0012 22.982a9.721 9.721 0 002.324-.284 1.744 1.744 0 012.114-1.334 9.707 9.707 0 003.62-2.087 1.744 1.744 0 01.048-2.32 9.711 9.711 0 00.945-5.003z"/>\n </svg>\n Website'}\n </span>\n </a>`})():""}\n </div>\n <p class="text-sm text-gray-600 mb-1 mt-1">${t.description||"No description"}</p>\n </div>\n <div class="flex flex-col mt-3">\n <span class="text-xs font-semibold mb-2">Client Status:</span>\n <div class="flex flex-wrap gap-2">\n ${n.map((s=>{const n=(e.installationStatus?.serversStatus[t.name]?.installedStatus||{})[s],r="completed"===n?.status;return`\n <span class="text-xs flex items-center ${r?"text-green-600 bg-green-50":"text-gray-600 bg-gray-50"} px-3 py-1 rounded-full shadow">\n <svg class="w-3 h-3 mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n ${r?'<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>':'<path d="M7 3.5A1.5 1.5 0 018.5 2h3.879a1.5 1.5 0 011.06.44l3.122 3.12A1.5 1.5 0 0117 6.622V12.5a1.5 1.5 0 01-1.5 1.5h-1v-3.379a1.5 1.5 0 00-.44-1.06L10.94 6.44A1.5 1.5 0 009.879 6H7V3.5z M6 6h2.879A1.5 1.5 0 0110 7.5v1.379a1.5 1.5 0 01-.44 1.06L6.44 13.06A1.5 1.5 0 015.379 13H4.5A1.5 1.5 0 013 11.5V7.5A1.5 1.5 0 014.5 6H6z"></path>'}\n </svg>\n ${s}\n </span>\n `})).join("")}\n </div>\n </div>\n <div class="action-buttons">\n ${(()=>{const n=e.installationStatus,r=n?.requirementsStatus,{needsUpdate:a,updateMessage:o}=checkNeedsRequirementUpdate(t,r);if(s)return`\n <button onclick="event.stopPropagation(); window.uninstallTools('${e.name}', ['${t.name}'])"\n class="bg-red-500 hover:bg-red-700 text-white text-sm font-bold py-2 px-4 rounded-full shadow-sm ease-in-out">\n Uninstall\n </button>`;{let s="Setup",n="";return a&&(s="Update",o&&(n=` title="${o.replace(/"/g,'"')}"`)),`\n <button onclick="event.stopPropagation(); window.showInstallModal('${e.name}', '${t.name}')"\n class="${a?"btn-update":"bg-blue-500 hover:bg-blue-700"} text-white text-xs font-bold py-2 px-4 rounded-full shadow-sm ease-in-out"${n}>\n ${s}\n </button>`}})()}\n </div>\n ${o?'<div class="mt-3 text-xs text-blue-600">\n <svg class="w-3 h-3 inline mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">\n <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"></path>\n </svg>\n Requires environment configuration\n </div>':""}\n </div>\n </div>\n `})),a}catch(e){throw console.error("Error in renderServersList:",e),e}}window.uninstallTools=async function(e,t){try{if(!await showConfirm(`Are you sure you want to uninstall ${t.length} tool(s)?`))return;const s=await fetch(`/api/categories/${e}/uninstall`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({toolList:t})});if(!s.ok){const e=await s.text();throw new Error(`Uninstallation failed: ${e||s.statusText}`)}const n=await s.json();if(!n.success)throw new Error(n.error||"Uninstallation failed");showToast("Tools uninstalled successfully!","success"),await fetchServerCategories(),await showServerDetails(e)}catch(e){console.error("Error uninstalling tools:",e),showToast(`Error uninstalling tools: ${e.message}`,"error")}},window.showServerDetails=async function(e){try{await showServerDetails(e)}catch(e){console.error("Error in window.showServerDetails:",e);const t=document.getElementById("serverCategoryDetails");t&&(t.innerHTML=`<p class="text-red-500">Error loading server details: ${e.message}</p>`),showToast(`Error loading server details: ${e.message}`,"error")}};export{showServerDetails};
|
|
2
2
|
//# sourceMappingURL=serverCategoryDetails.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{allServerCategoriesData,fetchServerCategories}from"./api.js";import{showServerDetails}from"./serverCategoryDetails.js";import{showToast}from"./notifications.js";import{buildUrlWithFlights}from"./flights/flights.js";let pinnedCategories={};async function waitForData(){return!!(allServerCategoriesData&&allServerCategoriesData.length>0)||(await fetchServerCategories(),allServerCategoriesData&&allServerCategoriesData.length>0)}function loadPinnedState(){const e=localStorage.getItem("pinnedCategories");if(e)try{pinnedCategories=JSON.parse(e)}catch(e){pinnedCategories={}}}function savePinnedState(){localStorage.setItem("pinnedCategories",JSON.stringify(pinnedCategories))}function togglePinCategory(e,t){t.stopPropagation(),pinnedCategories[e]?delete pinnedCategories[e]:pinnedCategories[e]=!0,savePinnedState();const a=t.target.closest(".server-item");a&&(a.classList.add("pin-animation"),setTimeout((()=>{a.classList.remove("pin-animation")}),300)),allServerCategoriesData&&allServerCategoriesData.length>0&&renderServerCategoryList(allServerCategoriesData)}async function loadLastSelectedCategory(){const e=localStorage.getItem("lastSelectedCategory");e&&allServerCategoriesData
|
|
1
|
+
import{allServerCategoriesData,fetchServerCategories}from"./api.js";import{showServerDetails}from"./serverCategoryDetails.js";import{showToast}from"./notifications.js";import{buildUrlWithFlights}from"./flights/flights.js";let pinnedCategories={};async function waitForData(){return!!(allServerCategoriesData&&allServerCategoriesData.length>0)||(await fetchServerCategories(),allServerCategoriesData&&allServerCategoriesData.length>0)}function loadPinnedState(){const e=localStorage.getItem("pinnedCategories");if(e)try{pinnedCategories=JSON.parse(e)}catch(e){console.error("Error parsing pinned categories from localStorage:",e),pinnedCategories={}}}function savePinnedState(){localStorage.setItem("pinnedCategories",JSON.stringify(pinnedCategories))}function togglePinCategory(e,t){t.stopPropagation(),pinnedCategories[e]?delete pinnedCategories[e]:pinnedCategories[e]=!0,savePinnedState();const a=t.target.closest(".server-item");a&&(a.classList.add("pin-animation"),setTimeout((()=>{a.classList.remove("pin-animation")}),300)),allServerCategoriesData&&allServerCategoriesData.length>0&&renderServerCategoryList(allServerCategoriesData)}async function loadLastSelectedCategory(){const e=localStorage.getItem("lastSelectedCategory");if(e&&allServerCategoriesData){allServerCategoriesData.some((t=>t.name===e))&&await showServerDetails(e)}}function renderServerCategoryList(e){const t=document.getElementById("serverCategoryList");if(0===e.length)return t.innerHTML='<p class="text-gray-500">No servers found matching search.</p>',void(document.getElementById("serverCategoryDetails").innerHTML="<p>Select a server from the list to see details.</p>");loadPinnedState();const a=[...e];a.sort(((e,t)=>{const a=!0===pinnedCategories[e.name],r=!0===pinnedCategories[t.name];return a&&!r?-1:!a&&r?1:0})),t.innerHTML=a.map((e=>{let t="";if(e.installationStatus&&e.installationStatus.serversStatus){const a=Object.keys(e.installationStatus.serversStatus).length,r=Object.values(e.installationStatus.serversStatus).filter((e=>Object.values(e.installedStatus||{}).some((e=>"completed"===e.status&&"install"===e.type)))).length;if(a>0){let e,n,s;r===a?(e="text-green-600 bg-green-50",n='<svg class="w-5 h-5 mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg>',s="Fully Configured"):r>0?(e="text-green-600 bg-green-50",n='<svg class="w-5 h-5 mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"></path></svg>',s="Partial Configured"):(e="text-yellow-600 bg-orange-50",n='<svg class="w-5 h-5 mr-1" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM10 13a1 1 0 110-2 1 1 0 010 2zm-1.75-5.75a.75.75 0 00-1.5 0v3a.75.75 0 001.5 0v-3z" clip-rule="evenodd" /></svg>',s="Not Configured"),t=`<span class="${e} inline-flex items-center px-2 py-1 rounded-full text-xs" style="width: fit-content; max-width: 100%;">\n ${n}<span class="truncate">${s} (${r}/${a})</span>\n </span>`}}let a="";if(e.feedConfiguration?.systemTags&&Object.keys(e.feedConfiguration.systemTags).length>0){a+='<div class="flex flex-wrap gap-1 ml-2">';for(const[t,r]of Object.entries(e.feedConfiguration.systemTags))a+=`<span class="text-xs bg-blue-100 text-blue-700 px-2 py-0.5 rounded-full">${t}: ${r}</span>`;a+="</div>"}const r=!0===pinnedCategories[e.name],n=r?"pinned":"",s=r?'<i class="bx bxs-pin"></i>':'<i class="bx bx-pin"></i>';return`\n <div class="server-item border border-gray-200 p-3 rounded hover:bg-gray-50 cursor-pointer transition duration-150 ease-in-out ${n}"\n data-server-name="${e.name}" onclick="navigateToCategory('${e.name}')">\n <div class="flex justify-between items-center">\n <h3 class="font-semibold text-gray-800">${e.displayName||e.name}</h3>\n <div class="flex items-center">\n <div class="pin-button ${n}" onclick="togglePinCategoryItem('${e.name}', event)" title="${r?"Unpin":"Pin"} this category">\n ${s}\n </div>\n </div>\n </div>\n <div class="text-sm text-gray-500 flex items-center mt-1">\n ${t}\n ${a}\n </div>\n </div>\n `})).join(""),loadLastSelectedCategory()}function setupSearch(){const e=document.getElementById("searchBox");loadPinnedState(),e.addEventListener("input",(async function(){const e=this.value.toLowerCase();try{if(!await waitForData())return void showToast("Error: Unable to load server data","error");renderServerCategoryList(allServerCategoriesData.filter((t=>{const a=(t.displayName||t.name).toLowerCase().includes(e),r=(t.description||"").toLowerCase().includes(e),n=t.feedConfiguration?.mcpServers?.some((t=>(t.displayName||t.name).toLowerCase().includes(e)))||!1,s=t.installationStatus?.serversStatus&&Object.keys(t.installationStatus.serversStatus).some((t=>t.toLowerCase().includes(e)));return a||r||n||s})))}catch(e){console.error("Error in search:",e),showToast("Error performing search","error")}}))}function navigateToCategory(e){window.location.href=buildUrlWithFlights("index.html",{category:e})}window.navigateToCategory=navigateToCategory,window.togglePinCategoryItem=togglePinCategory;export{renderServerCategoryList,setupSearch,loadLastSelectedCategory,togglePinCategory};
|
|
2
2
|
//# sourceMappingURL=serverCategoryList.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{buildUrlWithFlights}from"./flights/flights.js";function showToast(e,t="success"){const n=document.querySelector(".toast-container");if(!n)return;const o=`toast-${Date.now()}`,s=`\n <div id="${o}" class="toast align-items-center text-white bg-${"success"===t?"success":"danger"} border-0" role="alert" aria-live="assertive" aria-atomic="true">\n <div class="d-flex">\n <div class="toast-body">\n ${e}\n </div>\n <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>\n </div>\n </div>\n `;n.insertAdjacentHTML("beforeend",s);const r=document.getElementById(o);new bootstrap.Toast(r,{delay:3e3}).show(),r.addEventListener("hidden.bs.toast",(()=>{r.remove()}))}document.addEventListener("DOMContentLoaded",(()=>{const e=document.getElementById("settingsForm"),t=document.getElementById("nodePath"),n=document.getElementById("browserPath"),o=document.getElementById("systemEnvironments"),s=document.getElementById("pythonEnvsContainer"),r=document.getElementById("addPythonEnvButton"),a=document.getElementById("pythonEnvsLoadingMsg"),i=document.getElementById("userConfigurationsContainer"),l=document.getElementById("addUserConfigButton"),
|
|
1
|
+
import{buildUrlWithFlights}from"./flights/flights.js";function showToast(e,t="success"){const n=document.querySelector(".toast-container");if(!n)return;const o=`toast-${Date.now()}`,s=`\n <div id="${o}" class="toast align-items-center text-white bg-${"success"===t?"success":"danger"} border-0" role="alert" aria-live="assertive" aria-atomic="true">\n <div class="d-flex">\n <div class="toast-body">\n ${e}\n </div>\n <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>\n </div>\n </div>\n `;n.insertAdjacentHTML("beforeend",s);const r=document.getElementById(o);new bootstrap.Toast(r,{delay:3e3}).show(),r.addEventListener("hidden.bs.toast",(()=>{r.remove()}))}document.addEventListener("DOMContentLoaded",(()=>{const e=document.getElementById("settingsForm"),t=document.getElementById("nodePath"),n=document.getElementById("browserPath"),o=document.getElementById("systemEnvironments"),s=document.getElementById("pythonEnvsContainer"),r=document.getElementById("addPythonEnvButton"),a=document.getElementById("pythonEnvsLoadingMsg"),i=document.getElementById("userConfigurationsContainer"),l=document.getElementById("addUserConfigButton"),d=document.getElementById("userConfigLoadingMsg"),c=document.getElementById("cancelButton"),u=document.getElementById("setupButton");async function loadSettings(){try{const e=await fetch("/api/settings");if(!e.ok){const t=await e.json();throw new Error(t.error||`HTTP error! status: ${e.status}`)}const r=await e.json();if(!r.success||!r.data)throw new Error(r.error||"Failed to load settings.");{const e=r.data;if(a&&a.remove(),s.innerHTML="",e.pythonEnvs&&Object.keys(e.pythonEnvs).length>0)Object.entries(e.pythonEnvs).forEach((([e,t])=>{renderPythonEnvInput(e,t)}));else if(e.pythonEnv)renderPythonEnvInput("system",e.pythonEnv);else if(!s.querySelector(".python-env-row")){const e=document.createElement("p");e.className="text-gray-500 python-env-placeholder",e.textContent='No Python environments defined. Click "Add Python Environment" to add one.',s.appendChild(e)}if(t.value=e.nodePath||"",n.value=e.browserPath||"",o.innerHTML="",e.systemEnvironments&&Object.keys(e.systemEnvironments).length>0){const t=document.createElement("div");t.className="flex flex-col",Object.entries(e.systemEnvironments).forEach((([e,n],o)=>{const s=document.createElement("div");s.className="flex flex-col sm:flex-row sm:items-center bg-white rounded-md border border-gray-200 px-4 py-2 shadow-sm hover:shadow transition group",s.innerHTML=`\n <div class="flex items-center min-w-0 w-full sm:w-1/4 sm:mb-0">\n <i class='bx bx-cog text-blue-400 mr-2'></i>\n <span class="font-mono font-semibold text-gray-800 text-base truncate" title="${e}">${e}</span>\n </div>\n <div class="flex-1 min-w-0 break-all text-gray-700 text-sm pl-7 sm:pl-4">\n ${n}\n </div>\n `,t.appendChild(s)})),o.classList.remove("shadow"),o.classList.add("rounded-lg","bg-white","border","border-gray-200","border-1"),o.classList.remove("border-2","border-4","border-8"),o.classList.add("p-0"),o.style.padding="0.5rem 0.5rem 0.5rem 0.5rem",o.appendChild(t)}else o.innerHTML='<p class="text-gray-500">No system environment variables loaded or available.</p>';if(d&&d.remove(),i.innerHTML="",e.userConfigurations&&Object.keys(e.userConfigurations).length>0)Object.entries(e.userConfigurations).forEach((([e,t])=>{renderUserConfigInput(e,t)}));else if(!i.querySelector(".user-config-row")){const e=document.createElement("p");e.className="text-gray-500 user-config-placeholder",e.textContent='No user configurations defined. Click "Add User Configuration" to add one.',i.appendChild(e)}}}catch(e){console.error("Error loading settings:",e),showToast(`Error loading settings: ${e.message}`,"danger"),o.innerHTML=`<p class="text-red-500">Error loading environment variables: ${e.message}</p>`,d&&(d.textContent=`Error loading user configurations: ${e.message}`)}}function renderPythonEnvInput(e="system",t=""){const n=s.querySelector(".python-env-placeholder");n&&n.remove();Date.now(),Math.random().toString(36).substr(2,5);const o=document.createElement("div");o.className="python-env-row flex items-center gap-3 mb-2",o.innerHTML=`\n <input type="text" value="${e}" class="form-input form-control w-1/3 px-3 py-2 rounded-md python-env-server" placeholder="Server Name (e.g., system)">\n <input type="text" value="${t}" class="form-input form-control w-2/3 px-3 py-2 rounded-md python-env-path" placeholder="e.g., /usr/bin/python3 or C:/Python39/python.exe">\n <button type="button" class="btn btn-danger btn-sm remove-python-env-button flex items-center">\n <i class='bx bx-trash'></i>\n </button>\n `,s.appendChild(o),o.querySelector(".remove-python-env-button").addEventListener("click",(function(){if(this.closest(".python-env-row").remove(),!s.querySelector(".python-env-row")){const e=document.createElement("p");e.className="text-gray-500 python-env-placeholder",e.textContent='No Python environments defined. Click "Add Python Environment" to add one.',s.appendChild(e)}}))}function renderUserConfigInput(e="",t=""){const n=i.querySelector(".user-config-placeholder");n&&n.remove();Date.now(),Math.random().toString(36).substr(2,5);const o=document.createElement("div");o.className="user-config-row flex items-center gap-3 mb-2";const s=e.toLowerCase().includes("key"),r=s?"password":"text",a=`<input type="text" value="${e}" class="form-input form-control w-1/3 px-3 py-2 rounded-md user-config-key" placeholder="Key">`;let l;l=s?`\n <div class="relative w-2/3">\n <input type="${r}" value="${t}" class="form-input form-control w-full px-3 py-2 rounded-md user-config-value pr-10" placeholder="Value">\n <button type="button" class="absolute inset-y-0 right-0 flex items-center pr-3 text-gray-500 hover:text-gray-700 toggle-visibility-button" style="background: transparent; border: none;">\n <i class='bx bx-show text-lg'></i>\n </button>\n </div>\n `:`<input type="${r}" value="${t}" class="form-input form-control w-2/3 px-3 py-2 rounded-md user-config-value" placeholder="Value">`;if(o.innerHTML=a+l+'\n <button type="button" class="btn btn-danger btn-sm remove-user-config-button flex items-center">\n <i class=\'bx bx-trash\'></i>\n </button>\n ',i.appendChild(o),s){const e=o.querySelector(".toggle-visibility-button"),t=o.querySelector(".user-config-value"),n=e.querySelector("i");e.addEventListener("click",(e=>{e.preventDefault(),"password"===t.type?(t.type="text",n.classList.remove("bx-show"),n.classList.add("bx-hide")):(t.type="password",n.classList.remove("bx-hide"),n.classList.add("bx-show"))}))}o.querySelector(".remove-user-config-button").addEventListener("click",(function(){if(this.closest(".user-config-row").remove(),!i.querySelector(".user-config-row")){const e=document.createElement("p");e.className="text-gray-500 user-config-placeholder",e.textContent='No user configurations defined. Click "Add User Configuration" to add one.',i.appendChild(e)}}))}c.addEventListener("click",(()=>{window.location.href=buildUrlWithFlights("index.html")})),r.addEventListener("click",(()=>renderPythonEnvInput())),l.addEventListener("click",(()=>renderUserConfigInput())),e.addEventListener("submit",(async function saveSettings(e){e.preventDefault(),u.disabled=!0,u.innerHTML="<i class='bx bx-loader-alt bx-spin mr-2'></i>Saving...";const o={};document.querySelectorAll(".python-env-row").forEach((e=>{const t=e.querySelector(".python-env-server"),n=e.querySelector(".python-env-path");t&&n&&t.value.trim()&&(o[t.value.trim()]=n.value.trim())}));const s={};document.querySelectorAll(".user-config-row").forEach((e=>{const t=e.querySelector(".user-config-key"),n=e.querySelector(".user-config-value");t&&n&&t.value.trim()&&(s[t.value.trim()]=n.value.trim())}));const r={pythonEnvs:o,pythonEnv:o.system||null,nodePath:t.value.trim()||null,browserPath:n.value.trim()||null,userConfigurations:s};try{const e=await fetch("/api/settings",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)}),t=await e.json();if(!e.ok||!t.success)throw new Error(t.error||`HTTP error! status: ${e.status}`);showToast("Settings saved successfully!","success"),await loadSettings()}catch(e){console.error("Error saving settings:",e),showToast(`Error saving settings: ${e.message}`,"danger")}finally{u.disabled=!1,u.innerHTML="<i class='bx bx-save mr-2'></i>Save Settings"}})),loadSettings()}));
|
|
2
2
|
//# sourceMappingURL=settings.js.map
|
package/dist/web/server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import express from"express";import path from"path";import{fileURLToPath}from"url";import{OnboardingProcessStatus}from"../core/onboard/OnboardStatus.js";import{SUPPORTED_CLIENT_NAMES}from"../core/metadatas/constants.js";import{serverService}from"../services/ServerService.js";import{feedOnboardService}from"../core/onboard/FeedOnboardService.js";import{openBrowser}from"../utils/osUtils.js";import{Logger,EventType,EventStatus}from"../utils/logger.js";import{configProvider}from"../core/loaders/ConfigurationProvider.js";import{onboardStatusManager}from"../core/onboard/OnboardStatusManager.js";import{InstallOperationManager}from"../core/loaders/InstallOperationManager.js";import{systemSettingsManager}from"../core/loaders/SystemSettingsManager.js";import{getAppVersion}from"../utils/versionUtils.js";const __dirname=path.dirname(fileURLToPath(import.meta.url)),app=express();app.use("/",express.static(path.join(__dirname,"public"))),app.use(express.json()),app.get("/api/targets",(async(e,s)=>{try{const e=await configProvider.getClientMcpSettings(),r={success:!0,data:SUPPORTED_CLIENT_NAMES,clientMcpSettings:e};s.json(r)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories",(async(e,s)=>{try{const{local:r}=e.query,t={success:!0,data:await serverService.listServerCategories({local:"false"!==r})};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories/:categoryName/servers/:serverName/schema",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await serverService.getServerSchema(r,t);if(!a)return s.status(404).json({success:!1,error:`Schema not found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get schema for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName",(async(e,s)=>{try{const{categoryName:r}=e.params,t=await serverService.getServerCategory(r);if(!t)return s.status(404).json({success:!1,error:`Server category ${r} not found`});const a={success:!0,data:t};s.json(a)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get server category data for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/install",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid server list provided"});const a=await Promise.all(Object.entries(t).map((([e,s])=>serverService.installMcpServer(r,e,s)))),{success:o,messages:n}=serverService.formatOperationResults(a),c={success:o,data:{messages:n}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to install server for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/onboard",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name||!r.displayName)return s.status(400).json({success:!1,error:"Category data, including name and display name, is required."});const a=r,o=await feedOnboardService.onboardFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to ${e.body.isUpdate?"update":"create"} server category: ${t}`})}})),app.post("/api/categories/onboard/validate",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name)return s.status(400).json({success:!1,error:"Category name is required in categoryData for validation."});const a=r,o=await feedOnboardService.validateFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to validate server category: ${r}`})}})),app.get("/api/categories/:categoryName/onboard/status",(async(e,s)=>{try{const{categoryName:r}=e.params,{operationType:t}=e.query;if(!t)return s.status(400).json({success:!1,error:"operationType query parameter is required."});const a=t,o=await onboardStatusManager.getStatus(r,a);if(!o)return s.status(404).json({success:!1,error:`No active operation found for category ${r} with operation type ${a}`});const n=o.steps&&o.steps.length>0?o.steps[o.steps.length-1].stepName:void 0,c={success:!0,data:{onboardingId:o.onboardingId,status:o.status,message:n||o.errorMessage||"Processing...",lastQueried:(new Date).toISOString(),steps:o.steps,...o.validationStatus&&{validationStatus:o.validationStatus},...o.prInfo&&{prInfo:o.prInfo},...o.result&&{result:o.result},...o.errorMessage&&{errorMessage:o.errorMessage},operationType:o.operationType,..."VALIDATION_ONLY"===o.operationType&&o.status===OnboardingProcessStatus.SUCCEEDED&&o.result?.feedConfiguration&&{feedConfiguration:o.result.feedConfiguration}}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get operation status for category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName/servers/:serverName/installation/status",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await InstallOperationManager.getInstance(r,t).getDetails();if(!a)return s.status(404).json({success:!1,error:`No installation operation found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get installation operation status for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/uninstall",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid tool list provided"});const{options:a}=e.body;if(!a?.targets||0===a.targets.length)return s.status(400).json({success:!1,error:"No target clients specified"});const o=await Promise.all(Object.entries(t).map((([e,s])=>serverService.uninstallMcpServer(r,e,{...s,targets:a.targets,removeData:a.removeData??s.removeData})))),{success:n,messages:c}=serverService.formatOperationResults(o),i={success:n,data:{messages:c}};s.json(i)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to uninstall servers from ${e.params.categoryName}: ${t}`})}})),app.get("/api/settings",(async(e,s)=>{try{const e={success:!0,data:await systemSettingsManager.getSystemSettings()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get system settings: ${r}`})}})),app.post("/api/settings",(async(e,s)=>{try{const r=e.body,t={success:!0,data:await systemSettingsManager.createOrUpdateSystemSettings(r)};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to update system settings: ${r}`})}})),app.get("/api/version",(async(e,s)=>{try{const e={success:!0,data:await getAppVersion()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get package version: ${r}`})}}));export async function startWebServer(e=3e3){return new Promise(((s,r)=>{app.listen(e,(()=>{const r=`http://localhost:${e}`;Logger.log(`IMCP web interface running at ${r}`),openBrowser(r).catch((e=>{})),Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.SUCCESS,port:e}),s()})).on("error",(s=>{Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.FAILED,errorMessage:s instanceof Error?s.message:String(s),port:e}),r(s)}))}))}import.meta.url===`file://${process.argv[1]}`&&startWebServer().catch(console.error);
|
|
1
|
+
import express from"express";import path from"path";import{fileURLToPath}from"url";import{OnboardingProcessStatus}from"../core/onboard/OnboardStatus.js";import{SUPPORTED_CLIENT_NAMES}from"../core/metadatas/constants.js";import{serverService}from"../services/ServerService.js";import{feedOnboardService}from"../core/onboard/FeedOnboardService.js";import{openBrowser}from"../utils/osUtils.js";import{Logger,EventType,EventStatus}from"../utils/logger.js";import{configProvider}from"../core/loaders/ConfigurationProvider.js";import{onboardStatusManager}from"../core/onboard/OnboardStatusManager.js";import{InstallOperationManager}from"../core/loaders/InstallOperationManager.js";import{systemSettingsManager}from"../core/loaders/SystemSettingsManager.js";import{getAppVersion}from"../utils/versionUtils.js";const __dirname=path.dirname(fileURLToPath(import.meta.url)),app=express();app.use("/",express.static(path.join(__dirname,"public"))),app.use(express.json()),app.get("/api/targets",(async(e,s)=>{try{const e=await configProvider.getClientMcpSettings(),r={success:!0,data:SUPPORTED_CLIENT_NAMES,clientMcpSettings:e};s.json(r)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories",(async(e,s)=>{try{const{local:r}=e.query,t={success:!0,data:await serverService.listServerCategories({local:"false"!==r})};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:r})}})),app.get("/api/categories/:categoryName/servers/:serverName/schema",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await serverService.getServerSchema(r,t);if(!a)return s.status(404).json({success:!1,error:`Schema not found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get schema for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName",(async(e,s)=>{try{const{categoryName:r}=e.params,t=await serverService.getServerCategory(r);if(!t)return s.status(404).json({success:!1,error:`Server category ${r} not found`});const a={success:!0,data:t};s.json(a)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get server category data for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/install",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid server list provided"});const a=await Promise.all(Object.entries(t).map((([e,s])=>serverService.installMcpServer(r,e,s)))),{success:o,messages:n}=serverService.formatOperationResults(a),c={success:o,data:{messages:n}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to install server for ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/onboard",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name||!r.displayName)return s.status(400).json({success:!1,error:"Category data, including name and display name, is required."});const a=r,o=await feedOnboardService.onboardFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to ${e.body.isUpdate?"update":"create"} server category: ${t}`})}})),app.post("/api/categories/onboard/validate",(async(e,s)=>{try{const{categoryData:r,forExistingCategory:t}=e.body;if(!r||!r.name)return s.status(400).json({success:!1,error:"Category name is required in categoryData for validation."});const a=r,o=await feedOnboardService.validateFeed(a,t),n={success:o.status!==OnboardingProcessStatus.FAILED,data:{...o,onboardingId:a.name}};s.status(o.status===OnboardingProcessStatus.FAILED?500:200).json(n)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to validate server category: ${r}`})}})),app.get("/api/categories/:categoryName/onboard/status",(async(e,s)=>{try{const{categoryName:r}=e.params,{operationType:t}=e.query;if(!t)return s.status(400).json({success:!1,error:"operationType query parameter is required."});const a=t,o=await onboardStatusManager.getStatus(r,a);if(!o)return s.status(404).json({success:!1,error:`No active operation found for category ${r} with operation type ${a}`});const n=o.steps&&o.steps.length>0?o.steps[o.steps.length-1].stepName:void 0,c={success:!0,data:{onboardingId:o.onboardingId,status:o.status,message:n||o.errorMessage||"Processing...",lastQueried:(new Date).toISOString(),steps:o.steps,...o.validationStatus&&{validationStatus:o.validationStatus},...o.prInfo&&{prInfo:o.prInfo},...o.result&&{result:o.result},...o.errorMessage&&{errorMessage:o.errorMessage},operationType:o.operationType,..."VALIDATION_ONLY"===o.operationType&&o.status===OnboardingProcessStatus.SUCCEEDED&&o.result?.feedConfiguration&&{feedConfiguration:o.result.feedConfiguration}}};s.json(c)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get operation status for category ${e.params.categoryName}: ${t}`})}})),app.get("/api/categories/:categoryName/servers/:serverName/installation/status",(async(e,s)=>{try{const{categoryName:r,serverName:t}=e.params,a=await InstallOperationManager.getInstance(r,t).getDetails();if(!a)return s.status(404).json({success:!1,error:`No installation operation found for server ${t} in category ${r}`});const o={success:!0,data:a};s.json(o)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get installation operation status for server ${e.params.serverName} in category ${e.params.categoryName}: ${t}`})}})),app.post("/api/categories/:categoryName/uninstall",(async(e,s)=>{try{const{categoryName:r}=e.params,{serverList:t}=e.body;if(!t||0===Object.keys(t).length)return s.status(400).json({success:!1,error:"Invalid tool list provided"});const{options:a}=e.body;if(!a?.targets||0===a.targets.length)return s.status(400).json({success:!1,error:"No target clients specified"});const o=await Promise.all(Object.entries(t).map((([e,s])=>serverService.uninstallMcpServer(r,e,{...s,targets:a.targets,removeData:a.removeData??s.removeData})))),{success:n,messages:c}=serverService.formatOperationResults(o),i={success:n,data:{messages:c}};s.json(i)}catch(r){const t=r instanceof Error?r.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to uninstall servers from ${e.params.categoryName}: ${t}`})}})),app.get("/api/settings",(async(e,s)=>{try{const e={success:!0,data:await systemSettingsManager.getSystemSettings()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get system settings: ${r}`})}})),app.post("/api/settings",(async(e,s)=>{try{const r=e.body,t={success:!0,data:await systemSettingsManager.createOrUpdateSystemSettings(r)};s.json(t)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to update system settings: ${r}`})}})),app.get("/api/version",(async(e,s)=>{try{const e={success:!0,data:await getAppVersion()};s.json(e)}catch(e){const r=e instanceof Error?e.message:"Unknown error";s.status(500).json({success:!1,error:`Failed to get package version: ${r}`})}}));export async function startWebServer(e=3e3){return new Promise(((s,r)=>{app.listen(e,(()=>{const r=`http://localhost:${e}`;Logger.log(`IMCP web interface running at ${r}`),openBrowser(r).catch((e=>{console.warn(`Failed to open browser: ${e.message}`)})),Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.SUCCESS,port:e}),s()})).on("error",(s=>{Logger.trackEvent(EventType.IMCP_SERVE,{status:EventStatus.FAILED,errorMessage:s instanceof Error?s.message:String(s),port:e}),r(s)}))}))}import.meta.url===`file://${process.argv[1]}`&&startWebServer().catch(console.error);
|
|
2
2
|
//# sourceMappingURL=server.js.map
|
package/dist/web/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["express","path","fileURLToPath","OnboardingProcessStatus","SUPPORTED_CLIENT_NAMES","serverService","feedOnboardService","openBrowser","Logger","EventType","EventStatus","configProvider","onboardStatusManager","InstallOperationManager","systemSettingsManager","getAppVersion","__dirname","dirname","url","app","use","static","join","json","get","async","req","res","clientMcpSettings","getClientMcpSettings","response","success","data","error","message","Error","status","local","query","listServerCategories","categoryName","serverName","params","schema","getServerSchema","serverData","getServerCategory","post","serverList","body","Object","keys","length","results","Promise","all","entries","map","options","installMcpServer","messages","formatOperationResults","categoryData","forExistingCategory","name","displayName","feedConfiguration","operationResult","onboardFeed","FAILED","onboardingId","isUpdate","feedConfigurationToValidate","validationOperationResult","validateFeed","operationType","validOperationType","getStatus","lastStepName","steps","stepName","undefined","errorMessage","lastQueried","Date","toISOString","validationStatus","prInfo","result","SUCCEEDED","details","getInstance","getDetails","targets","serverOptions","uninstallMcpServer","removeData","getSystemSettings","newSettings","createOrUpdateSystemSettings","startWebServer","port","resolve","reject","listen","log","catch","err","trackEvent","IMCP_SERVE","SUCCESS","on","String","process","argv"
|
|
1
|
+
{"version":3,"names":["express","path","fileURLToPath","OnboardingProcessStatus","SUPPORTED_CLIENT_NAMES","serverService","feedOnboardService","openBrowser","Logger","EventType","EventStatus","configProvider","onboardStatusManager","InstallOperationManager","systemSettingsManager","getAppVersion","__dirname","dirname","url","app","use","static","join","json","get","async","req","res","clientMcpSettings","getClientMcpSettings","response","success","data","error","message","Error","status","local","query","listServerCategories","categoryName","serverName","params","schema","getServerSchema","serverData","getServerCategory","post","serverList","body","Object","keys","length","results","Promise","all","entries","map","options","installMcpServer","messages","formatOperationResults","categoryData","forExistingCategory","name","displayName","feedConfiguration","operationResult","onboardFeed","FAILED","onboardingId","isUpdate","feedConfigurationToValidate","validationOperationResult","validateFeed","operationType","validOperationType","getStatus","lastStepName","steps","stepName","undefined","errorMessage","lastQueried","Date","toISOString","validationStatus","prInfo","result","SUCCEEDED","details","getInstance","getDetails","targets","serverOptions","uninstallMcpServer","removeData","getSystemSettings","newSettings","createOrUpdateSystemSettings","startWebServer","port","resolve","reject","listen","log","catch","err","console","warn","trackEvent","IMCP_SERVE","SUCCESS","on","String","process","argv"],"sources":["../../src/web/server.ts"],"mappings":"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","ignoreList":[]}
|