Some checks are pending
build-and-push / image (push) Waiting to run
- Added response presets for standup, bug report, and ship update in the Slack sidecar. - Improved UI elements including a copy button for replies and conversation memory. - Enhanced diagnostics section with better health indicators and tool listings. - Introduced performance metrics for response times in the Slack form. feat: revamp system pane for better process and host introspection - Updated system pane to include live sparklines for memory and CPU usage. - Enhanced KPI display with uptime, memory usage, and CPU load metrics. - Added functionality to capture and display configured services and their statuses. feat: overhaul tools pane for improved usability and interaction - Redesigned tools pane to allow filtering, favoriting, and invoking MCP tools. - Introduced a history feature to track recent tool calls. - Enhanced form handling for tool arguments with schema-driven inputs. feat: new files pane for accessing platform data - Implemented a new files pane to surface data from files.cxllm.io. - Added tabs for providers, edge functions, health, demand runs, watcher events, and file manager categories. - Included functionality to capture health snapshots and display recent data.
113 lines
20 KiB
JavaScript
113 lines
20 KiB
JavaScript
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))i(a);new MutationObserver(a=>{for(const o of a)if(o.type==="childList")for(const l of o.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&i(l)}).observe(document,{childList:!0,subtree:!0});function s(a){const o={};return a.integrity&&(o.integrity=a.integrity),a.referrerPolicy&&(o.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?o.credentials="include":a.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(a){if(a.ep)return;a.ep=!0;const o=s(a);fetch(a.href,o)}})();const S="cxllm.io",w=[{auth:"public",badge:"public",badgeClass:"public",color:"sb-green",composeService:"cxllm-landing",deprecated:!1,description:"Public marketing front door.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/healthz"}],host:"cxllm.io",hosts:["cxllm.io","www.cxllm.io","app.cxllm.io"],id:"landing",kind:"web",landing:!1,membersSpa:!0,name:"CxLLM Landing",notes:"Public marketing and console landing served by the cxllm-landing container.",probe:"https://cxllm.io/healthz",replacement:null,source:"host/cxllm-stack/app",title:"CxLLM Landing",upstreamPort:8086,url:"https://cxllm.io/"},{auth:"public",badge:"public",badgeClass:"public",color:"sb-green",composeService:null,deprecated:!1,description:"Legacy Crow UI for operator workflows.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/api/health"}],host:"webapp.cxllm.io",hosts:["webapp.cxllm.io"],id:"webapp",kind:"web",landing:!0,membersSpa:!0,name:"CxWebApp",notes:"Legacy Crow C++ operator UI; currently managed outside cxllm-cloud compose.",probe:"https://webapp.cxllm.io/api/health",replacement:null,source:"CxWebApp",title:"CxWebApp",upstreamPort:8085,url:"https://webapp.cxllm.io/"},{auth:"authentik-forward-auth",badge:"SSO",badgeClass:"",color:"sb-green",composeService:null,deprecated:!1,description:"Members workspace and authenticated service console.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[302],path:"/"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"web.cxllm.io",hosts:["web.cxllm.io"],id:"web",kind:"spa",landing:!0,membersSpa:!1,name:"Members SPA",notes:"Static members workspace deployed to /srv/cxai/web and protected by Authentik at the edge.",probe:"https://web.cxllm.io/healthz",replacement:null,source:"host/cxllm-stack/cxllm-web",title:"Members SPA",upstreamPort:null,url:"https://web.cxllm.io/"},{auth:"public-idp",badge:"public",badgeClass:"public",color:"sb-purple",composeService:"authentik-server",deprecated:!1,description:"Identity, SSO, MFA, and access policies.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/-/health/ready/"},{expect:[200],path:"/-/health/live/"}],host:"auth.cxllm.io",hosts:["auth.cxllm.io"],id:"auth",kind:"identity",landing:!0,membersSpa:!0,name:"Authentik IdP",notes:"Identity provider and embedded forward-auth outpost.",probe:"https://auth.cxllm.io/-/health/ready/",replacement:null,source:"host/cxllm-stack/compose.yaml",title:"Authentik IdP",upstreamPort:9e3,url:"https://auth.cxllm.io/"},{auth:"hybrid-status-public-rest-authentik",badge:"API key",badgeClass:"api",color:"sb-green",composeService:null,deprecated:!1,description:"OpenAI-compatible inference, embeddings, and tools.",endpointGroups:["status","models","chat","embeddings","docs"],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[200],path:"/status"},{expect:[302],path:"/docs"},{expect:[302],path:"/v1/models"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"api.cxllm.io",hosts:["api.cxllm.io"],id:"api",kind:"api",landing:!0,membersSpa:!0,name:"CxAI API",notes:"Currently proxies to cxai-mcp on 8082; swap to the Python API on 8080 when that runtime is promoted.",probe:"https://api.cxllm.io/status",replacement:null,source:"CxAI Base/api",title:"CxAI API",upstreamPort:8082,url:"https://api.cxllm.io/"},{auth:"authentik-forward-auth-status-public",badge:"SSO",badgeClass:"",color:"sb-blue",composeService:null,deprecated:!1,description:"Model Context Protocol gateway for agents.",endpointGroups:["mcp","tools","resources","prompts"],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[200],path:"/status"},{expect:[302],path:"/mcp"},{expect:[302],path:"/tools"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"mcp.cxllm.io",hosts:["mcp.cxllm.io"],id:"mcp",kind:"mcp",landing:!0,membersSpa:!0,name:"CxAI MCP",notes:"MCP HTTP surface for agents and IDE tools.",probe:"https://mcp.cxllm.io/status",replacement:null,source:"CxAI/_agent/mcp-server",title:"CxAI MCP",upstreamPort:8082,url:"https://mcp.cxllm.io/"},{auth:"authentik-forward-auth",badge:"SSO",badgeClass:"",color:"sb-blue",composeService:"code-server",deprecated:!1,description:"VS Code in the browser.",endpointGroups:[],expected:[302],health:[{expect:[302],path:"/"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"code.cxllm.io",hosts:["code.cxllm.io"],id:"code",kind:"ide",landing:!0,membersSpa:!0,name:"code-server",notes:"Browser VS Code gated by Authentik edge auth.",probe:"https://code.cxllm.io/",replacement:null,source:"host/cxllm-stack/compose.yaml",title:"code-server",upstreamPort:8443,url:"https://code.cxllm.io/"},{auth:"authentik-forward-auth",badge:"SSO",badgeClass:"",color:"sb-blue",composeService:"scale-dashboard",deprecated:!1,description:"Tailscale machines, routes, Serve, and Funnel behind Authentik.",endpointGroups:["tailscale","machines","routes","serve","funnel","authentik"],expected:[302],health:[{expect:[302],path:"/"},{expect:[302],path:"/healthz"},{expect:[302],path:"/api/tailscale/status"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"scale.cxllm.io",hosts:["scale.cxllm.io"],id:"scale",kind:"tailnet-ops",landing:!0,membersSpa:!0,name:"Scale",notes:"Authentik-gated Tailscale machine, app, route, Serve, and Funnel operations dashboard.",probe:"https://scale.cxllm.io/healthz",replacement:null,source:"scale",title:"Scale",upstreamPort:8091,url:"https://scale.cxllm.io/"},{auth:"nextcloud-oidc",badge:"SSO",badgeClass:"",color:"sb-purple",composeService:"nextcloud",deprecated:!1,description:"Nextcloud files, shares, and team folders.",endpointGroups:[],expected:[200,302],health:[{expect:[200,302],path:"/status.php"}],host:"files.cxllm.io",hosts:["files.cxllm.io"],id:"files",kind:"files",landing:!0,membersSpa:!0,name:"Files",notes:"Nextcloud workspace.",probe:"https://files.cxllm.io/status.php",replacement:null,source:"host/cxllm-stack/compose.yaml",title:"Files",upstreamPort:8081,url:"https://files.cxllm.io/"},{auth:"aws-iam",badge:"AWS IAM",badgeClass:"api",color:"sb-purple",composeService:null,deprecated:!1,description:"AWS-backed object storage, CloudFront keys, and IAM access.",endpointGroups:["s3","cloudfront","iam"],expected:[],health:[],host:"AWS S3",hosts:[],id:"aws-storage",kind:"object-storage-cloud",landing:!0,membersSpa:!0,name:"AWS Storage",notes:"Primary object storage is AWS-backed and configured from the local CxAWS config directory; credentials are never embedded in static assets.",probe:"https://console.aws.amazon.com/s3/home",replacement:null,source:"CxAI/projects/CxAWS/config",title:"AWS Storage",upstreamPort:null,url:"https://console.aws.amazon.com/s3/home"},{auth:"docker-basic-auth",badge:"basic",badgeClass:"basic",color:"sb-amber",composeService:null,deprecated:!1,description:"Private container image registry.",endpointGroups:[],expected:[401],health:[{expect:[401],path:"/v2/"}],host:"registry.cxllm.io",hosts:["registry.cxllm.io"],id:"registry",kind:"registry",landing:!0,membersSpa:!1,name:"Container Registry",notes:"Docker registry; 401 is the expected unauthenticated health result.",probe:"https://registry.cxllm.io/v2/",replacement:null,source:"host/cxllm-stack/compose.yaml",title:"Container Registry",upstreamPort:5e3,url:"https://registry.cxllm.io/"},{auth:"grafana-oidc",badge:"SSO",badgeClass:"",color:"sb-amber",composeService:"grafana",deprecated:!1,description:"Grafana dashboards, metrics, and alerts.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/api/health"}],host:"monitor.cxllm.io",hosts:["monitor.cxllm.io"],id:"monitor",kind:"observability",landing:!0,membersSpa:!0,name:"Grafana",notes:"Grafana dashboards and alerts.",probe:"https://monitor.cxllm.io/api/health",replacement:null,source:"host/cxllm-stack/compose.yaml",title:"Grafana",upstreamPort:3e3,url:"https://monitor.cxllm.io/"},{auth:"authentik-forward-auth-health-public",badge:"SSO",badgeClass:"",color:"sb-red",composeService:"cxai-rust",deprecated:!1,description:"Rust integration runtime.",endpointGroups:["health","version","metrics"],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[200],path:"/version"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"rust.cxllm.io",hosts:["rust.cxllm.io"],id:"rust",kind:"runtime",landing:!1,membersSpa:!0,name:"Rust Runtime",notes:"Rust integration shim.",probe:"https://rust.cxllm.io/healthz",replacement:null,source:"CxAI Base/cargo",title:"Rust Runtime",upstreamPort:8089,url:"https://rust.cxllm.io/"},{auth:"authentik-forward-auth-health-public",badge:"SSO",badgeClass:"",color:"sb-blue",composeService:"cxai-go",deprecated:!1,description:"Go integration runtime.",endpointGroups:["health","version","huggingface","operations","governance","agentic","tasks","infer","git","tool-use"],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[200],path:"/version"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"go.cxllm.io",hosts:["go.cxllm.io"],id:"go",kind:"runtime",landing:!1,membersSpa:!0,name:"Go Runtime",notes:"Go implementation of the integration API.",probe:"https://go.cxllm.io/healthz",replacement:null,source:"CxAI Base/apps/cxai-go",title:"Go Runtime",upstreamPort:8088,url:"https://go.cxllm.io/"},{auth:"authentik-forward-auth-health-public",badge:"SSO",badgeClass:"",color:"sb-amber",composeService:"cxai-maven",deprecated:!1,description:"Java integration runtime.",endpointGroups:["health","version","metrics","huggingface","operations","governance","agentic","tasks","infer","git","tool-use"],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[200],path:"/version"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"java.cxllm.io",hosts:["java.cxllm.io"],id:"java",kind:"runtime",landing:!1,membersSpa:!0,name:"Java Runtime",notes:"Java/Maven implementation of the integration API.",probe:"https://java.cxllm.io/healthz",replacement:null,source:"CxAI Base/apps/cxai-maven",title:"Java Runtime",upstreamPort:8090,url:"https://java.cxllm.io/"},{auth:"authentik-forward-auth",badge:"SSO",badgeClass:"",color:"sb-amber",composeService:null,deprecated:!1,description:"Data flywheel and ML operations surface.",endpointGroups:[],expected:[200],health:[{expect:[200],path:"/healthz"},{expect:[200],path:"/readyz"},{expect:[302],path:"/"},{expect:[204],path:"/outpost.goauthentik.io/ping"}],host:"mlrun.cxllm.io",hosts:["mlrun.cxllm.io"],id:"mlrun",kind:"ml-dashboard",landing:!1,membersSpa:!0,name:"MLRun",notes:"Static ML/data-flywheel page until a live MLRun UI container is promoted.",probe:"https://mlrun.cxllm.io/healthz",replacement:null,source:"cx-ml/web",title:"MLRun",upstreamPort:null,url:"https://mlrun.cxllm.io/"}],C={domain:S,services:w},p={modules:[{id:"rust",label:"Rust core",loaded:!1,detail:"TypeScript fallback active"},{id:"cpp",label:"C++ route core",loaded:!1,detail:"TypeScript fallback active"},{id:"go",label:"Go status core",loaded:!1,detail:"TypeScript fallback active"}],scoreCatalog(e){return Math.max(0,Math.min(100,70+e.publicCount*2+e.gatedCount-e.degradedCount*12))},routeWeight(e,t){return e*10+t*7}};function f(e){var s;const t=import.meta;return new URL(`${((s=t.env)==null?void 0:s.BASE_URL)??"./"}${e}`,window.location.href)}async function m(e){const t=await fetch(f(e));if(!t.ok)return null;const s=await t.arrayBuffer();return(await WebAssembly.instantiate(s,{})).instance.exports}function b(e,t){if(!e)return null;for(const s of t){const i=e[s];if(typeof i=="function")return(...a)=>Number(i(...a))}return null}async function k(e){try{return(await fetch(f(e),{method:"HEAD"})).ok}catch{return!1}}async function A(){const e=[];let t=p.scoreCatalog,s=p.routeWeight;try{const a=await m("wasm/cxllm_rust_core.wasm"),o=b(a,["cxllm_signal_score"]);o?(t=l=>o(l.publicCount,l.gatedCount,l.degradedCount),e.push({id:"rust",label:"Rust core",loaded:!0,detail:"Catalog signal scoring"})):e.push(p.modules[0])}catch{e.push(p.modules[0])}try{const a=await m("wasm/cxllm_cpp_core.wasm"),o=b(a,["cxllm_route_weight","_cxllm_route_weight"]);o?(s=(l,d)=>o(l,d),e.push({id:"cpp",label:"C++ route core",loaded:!0,detail:"Endpoint weighting"})):e.push(p.modules[1])}catch{e.push(p.modules[1])}const i=await k("wasm/cxllm_go_core.wasm");return e.push(i?{id:"go",label:"Go status core",loaded:!0,detail:"Go Wasm artifact available"}:p.modules[2]),{modules:e,scoreCatalog:t,routeWeight:s}}const c=C,v={landing:{eyebrow:"CxLLM",title:"Service fabric",summary:"Public front door for inference, identity, files, code, scale, and operations.",primarySection:"overview",focusIds:["api","mcp","web","webapp","auth"]},members:{eyebrow:"CxLLM Console",title:"Member workspace",summary:"Authenticated command center for apps, service health, routes, and access.",primarySection:"services",focusIds:["api","mcp","scale","mlrun","files","code","monitor"]},webapp:{eyebrow:"CxWebApp",title:"Operator shell",summary:"Crow-served control surface with browser-native Wasm capabilities.",primarySection:"ops",focusIds:["webapp","api","mcp","auth","scale"]},api:{eyebrow:"CxLLM API",title:"Inference gateway",summary:"OpenAI-compatible routes, health probes, and endpoint contracts.",primarySection:"api",focusIds:["api"]},mcp:{eyebrow:"CxLLM MCP",title:"Agent gateway",summary:"Model Context Protocol routes, smoke probes, and tool endpoints.",primarySection:"mcp",focusIds:["mcp"]}},P=[["overview","Overview"],["services","Services"],["api","API"],["mcp","MCP"],["auth","Auth"],["ops","Ops"]],n={query:"",section:"overview"};function r(e){return String(e??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function $(e){return e==="members"||e==="webapp"||e==="api"||e==="mcp"?e:"landing"}function I(e){return e.auth==="public"||e.auth==="public-idp"?0:e.auth.includes("hybrid")||e.auth.includes("api")?2:1}function y(e){return(e.endpointGroups||[]).filter(t=>typeof t=="object"&&t!==null)}function L(e){const t=e.focusIds.length?c.services.filter(a=>e.focusIds.includes(a.id)||a.membersSpa||a.landing):c.services,s=n.query.trim().toLowerCase();return(s?t.filter(a=>[a.title,a.host,a.description,a.id].join(" ").toLowerCase().includes(s)):t).filter(a=>!a.deprecated)}function G(e){const t=c.services.filter(l=>l.auth==="public"||l.auth==="public-idp").length,s=c.services.length-t,i=c.services.filter(l=>!l.probe).length,a=e.scoreCatalog({publicCount:t,gatedCount:s,degradedCount:i}),o=e.modules.filter(l=>l.loaded).length;return`
|
|
<section class="metric-grid" aria-label="Service metrics">
|
|
<div class="metric"><span>${c.services.length}</span><label>Services</label></div>
|
|
<div class="metric"><span>${t}</span><label>Public</label></div>
|
|
<div class="metric"><span>${s}</span><label>Gated</label></div>
|
|
<div class="metric"><span>${a}</span><label>Signal</label></div>
|
|
<div class="metric"><span>${o}/3</span><label>Wasm</label></div>
|
|
</section>
|
|
`}function M(e,t){const s=y(e).reduce((l,d)=>{var h;return l+(((h=d.items)==null?void 0:h.length)??0)},0),i=t.routeWeight(s||e.health.length,I(e)),a=e.expected.length?e.expected.join(", "):"live",o=e.probe||e.url;return`
|
|
<article class="service-card ${r(e.color)}">
|
|
<div class="service-main">
|
|
<div class="service-mark" aria-hidden="true">${r(e.title.slice(0,2).toUpperCase())}</div>
|
|
<div class="service-copy">
|
|
<h3>${r(e.title)}</h3>
|
|
<p>${r(e.description||e.notes||e.host)}</p>
|
|
</div>
|
|
</div>
|
|
<dl class="service-meta">
|
|
<div><dt>Host</dt><dd>${r(e.host||"local")}</dd></div>
|
|
<div><dt>Auth</dt><dd>${r(e.badge||e.auth||"SSO")}</dd></div>
|
|
<div><dt>Probe</dt><dd>${r(a)}</dd></div>
|
|
<div><dt>Weight</dt><dd>${i}</dd></div>
|
|
</dl>
|
|
<div class="service-actions">
|
|
<a href="${r(e.url)}">Open</a>
|
|
${o?`<a href="${r(o)}">Probe</a>`:""}
|
|
</div>
|
|
</article>
|
|
`}function g(e){return`
|
|
<section class="module-rail" aria-label="Wasm modules">
|
|
${e.modules.map(t=>`
|
|
<article class="module-row ${t.loaded?"is-loaded":""}">
|
|
<span>${r(t.label)}</span>
|
|
<strong>${t.loaded?"loaded":"fallback"}</strong>
|
|
<small>${r(t.detail)}</small>
|
|
</article>
|
|
`).join("")}
|
|
</section>
|
|
`}function x(e){const t=c.services.find(a=>a.id===e);if(!t)return`<section class="empty-state">${r(e.toUpperCase())} service is not in the catalog.</section>`;const s=y(t),i=s.length?s:[{title:"Health",items:t.health.map(a=>({label:a.path,path:a.path,method:"GET"}))}];return`
|
|
<section class="endpoint-panel">
|
|
<div class="section-heading"><p>${r(t.host)}</p><h2>${r(t.title)}</h2></div>
|
|
<div class="endpoint-list">
|
|
${i.map(a=>`
|
|
<article class="endpoint-group">
|
|
<h3>${r(a.title||"Endpoints")}</h3>
|
|
${(a.items??[]).map(o=>`
|
|
<div class="endpoint-row">
|
|
<code>${r(o.method||"GET")}</code>
|
|
<span>${r(o.path||"/")}</span>
|
|
<small>${r(o.label||"route")}</small>
|
|
</div>
|
|
`).join("")}
|
|
</article>
|
|
`).join("")}
|
|
</div>
|
|
</section>
|
|
`}function z(){const e=c.services.find(t=>t.id==="auth");return`
|
|
<section class="auth-panel">
|
|
<div class="section-heading"><p>Identity layer</p><h2>Authentik integration</h2></div>
|
|
<div class="auth-grid">
|
|
<article><span>Provider</span><strong>${r((e==null?void 0:e.title)||"Authentik")}</strong><small>${r((e==null?void 0:e.host)||"auth.cxllm.io")}</small></article>
|
|
<article><span>Mode</span><strong>SSO + forward-auth</strong><small>Portal-first app launch</small></article>
|
|
<article><span>Surface</span><strong>Minimal branding</strong><small>Login/account flows stay in Authentik</small></article>
|
|
</div>
|
|
</section>
|
|
`}function O(e,t){if(n.section==="api")return x("api");if(n.section==="mcp")return x("mcp");if(n.section==="auth")return z();const i=`
|
|
<section class="service-grid" aria-label="Services">
|
|
${L(e).map(a=>M(a,t)).join("")}
|
|
</section>
|
|
`;return n.section==="ops"?`<div class="split-view">${g(t)}${i}</div>`:n.section==="services"?i:`
|
|
${G(t)}
|
|
<div class="split-view">
|
|
${g(t)}
|
|
${i}
|
|
</div>
|
|
`}function u(e,t,s){var o;const i=v[t];n.section||(n.section=i.primarySection);const a=n.section||i.primarySection;e.innerHTML=`
|
|
<div class="app-shell">
|
|
<aside class="sidebar">
|
|
<a class="brand" href="https://${r(c.domain)}/">
|
|
<span>Cx</span>
|
|
<strong>CxLLM</strong>
|
|
</a>
|
|
<nav aria-label="Primary">
|
|
${P.map(([l,d])=>`
|
|
<button class="nav-button ${a===l?"is-active":""}" data-section="${l}" type="button">
|
|
${r(d)}
|
|
</button>
|
|
`).join("")}
|
|
</nav>
|
|
</aside>
|
|
<main class="workspace">
|
|
<header class="topbar">
|
|
<div>
|
|
<p>${r(i.eyebrow)}</p>
|
|
<h1>${r(i.title)}</h1>
|
|
</div>
|
|
<label class="search-box">
|
|
<span>Search</span>
|
|
<input type="search" value="${r(n.query)}" placeholder="service, host, route" />
|
|
</label>
|
|
</header>
|
|
<section class="intro-band">
|
|
<p>${r(i.summary)}</p>
|
|
<div class="intro-actions">
|
|
<a href="https://web.cxllm.io/">Console</a>
|
|
<a href="https://auth.cxllm.io/if/user/#/library">Identity</a>
|
|
</div>
|
|
</section>
|
|
${O(i,s)}
|
|
</main>
|
|
</div>
|
|
`,e.querySelectorAll("[data-section]").forEach(l=>{l.addEventListener("click",()=>{n.section=l.dataset.section||i.primarySection,u(e,t,s)})}),(o=e.querySelector("input[type='search']"))==null||o.addEventListener("input",l=>{n.query=l.currentTarget.value,u(e,t,s)})}async function W(){const e=document.querySelector("#cxllm-root");if(!e)return;const t=$(e.dataset.cxTarget);n.section=v[t].primarySection;const s=await A();u(e,t,s)}W();
|