From ef01b5809b848a72943972397b8be47145832d29 Mon Sep 17 00:00:00 2001 From: CxAI Agent Date: Mon, 18 May 2026 09:13:12 -0500 Subject: [PATCH] Add CSS styles for sidebar and UI components; include WebAssembly core module - Introduced a new CSS file for sidebar and UI component styles, defining variables for colors, fonts, and layout. - Added responsive design adjustments for smaller screens. - Included a new WebAssembly module for core functionality, enhancing performance and capabilities. --- static/assets/webapp-1e2_m1ss.js | 379 ++++++++++++++++++++++++++++++ static/assets/webapp-BAxW9gnc.js | 112 --------- static/assets/webapp-BR2Xd3e4.css | 1 + static/assets/webapp-Bf0A7CMv.css | 1 - static/index.html | 6 +- static/wasm/cxllm_cpp_core.wasm | Bin 0 -> 253 bytes static/wasm/cxllm_go_core.wasm | Bin 1968611 -> 1968611 bytes static/wasm/modules.json | 4 +- 8 files changed, 385 insertions(+), 118 deletions(-) create mode 100644 static/assets/webapp-1e2_m1ss.js delete mode 100644 static/assets/webapp-BAxW9gnc.js create mode 100644 static/assets/webapp-BR2Xd3e4.css delete mode 100644 static/assets/webapp-Bf0A7CMv.css create mode 100755 static/wasm/cxllm_cpp_core.wasm diff --git a/static/assets/webapp-1e2_m1ss.js b/static/assets/webapp-1e2_m1ss.js new file mode 100644 index 0000000..45e9da8 --- /dev/null +++ b/static/assets/webapp-1e2_m1ss.js @@ -0,0 +1,379 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={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 t(e){return new URL(`${import.meta.env?.BASE_URL??`./`}${e}`,window.location.href)}async function n(e){let n=await fetch(t(e));if(!n.ok)return null;let r=await n.arrayBuffer();return(await WebAssembly.instantiate(r,{})).instance.exports}function r(e,t){if(!e)return null;for(let n of t){let t=e[n];if(typeof t==`function`)return(...e)=>Number(t(...e))}return null}async function i(){try{let e=await fetch(t(`wasm/modules.json`));if(!e.ok)return new Map;let n=await e.json();return new Map((n.modules??[]).map(e=>[e.id,e]))}catch{return new Map}}function a(t,n){let r=e.modules.find(e=>e.id===t)??e.modules[0],i=n.get(t)?.detail;return i?{...r,detail:i}:r}async function o(){let t=await i(),o=[],s=e.scoreCatalog,c=e.routeWeight;if(t.get(`rust`)?.status===`built`)try{let e=r(await n(`wasm/cxllm_rust_core.wasm`),[`cxllm_signal_score`]);e?(s=t=>e(t.publicCount,t.gatedCount,t.degradedCount),o.push({id:`rust`,label:`Rust core`,loaded:!0,detail:`Catalog signal scoring`})):o.push(a(`rust`,t))}catch{o.push(a(`rust`,t))}else o.push(a(`rust`,t));if(t.get(`cpp`)?.status===`built`)try{let e=r(await n(`wasm/cxllm_cpp_core.wasm`),[`cxllm_route_weight`,`_cxllm_route_weight`]);e?(c=(t,n)=>e(t,n),o.push({id:`cpp`,label:`C++ route core`,loaded:!0,detail:`Endpoint weighting`})):o.push(a(`cpp`,t))}catch{o.push(a(`cpp`,t))}else o.push(a(`cpp`,t));let l=t.get(`go`)?.status===`built`;return o.push(l?{id:`go`,label:`Go status core`,loaded:!0,detail:`Go Wasm artifact available`}:a(`go`,t)),{modules:o,scoreCatalog:s,routeWeight:c}}var s=`cxllm:nav:section`,c=`cxllm:nav:devpane`,l=`cxllm:sidebar:collapsed`;function ee(e){return e===`members`||e===`webapp`||e===`api`||e===`mcp`?e:`landing`}function te(e){switch(e){case`api`:case`mcp`:return`developer`;case`webapp`:return`services`;case`members`:return`overview`;default:return`overview`}}function ne(e){let t=new URLSearchParams(window.location.search).get(`section`),n=localStorage.getItem(s)??null;return{target:e,section:u(t)?t:e===`api`||e===`mcp`?`developer`:u(n)?n:te(e),devPane:e===`api`?`api`:e===`mcp`||localStorage.getItem(c)===`mcp`?`mcp`:`api`,query:``,sidebarCollapsed:localStorage.getItem(l)===`1`}}function u(e){return e===`overview`||e===`services`||e===`developer`||e===`agent`}function re(e){try{localStorage.setItem(s,e)}catch{}}function ie(e){try{localStorage.setItem(c,e)}catch{}}function ae(e){try{localStorage.setItem(l,e?`1`:`0`)}catch{}}var d=`cxllm:session:v1`,f=6e4;function p(){try{let e=sessionStorage.getItem(d);if(!e)return null;let t=JSON.parse(e);return Date.now()-t.ts>f?null:t}catch{return null}}function m(e){try{sessionStorage.setItem(d,JSON.stringify({ts:Date.now(),value:e}))}catch{}}async function oe(e=!1){if(!e){let e=p();if(e)return e.value}let t=window.location.host;if(t===`127.0.0.1`||t.startsWith(`127.0.0.1:`)||t.startsWith(`localhost`)){let e=new URLSearchParams(window.location.search),t=e.get(`signed-in`)===`1`?{authenticated:!0,username:e.get(`user`)||`dev`,email:`dev@cxllm.io`}:{authenticated:!1};return m(t),t}try{let e=new AbortController,t=setTimeout(()=>e.abort(),3e3),n=await fetch(`/outpost.goauthentik.io/auth/caddy`,{method:`GET`,credentials:`include`,signal:e.signal});if(clearTimeout(t),n.status===200){let e={authenticated:!0,username:n.headers.get(`X-Authentik-Username`)||void 0,email:n.headers.get(`X-Authentik-Email`)||void 0,groups:(n.headers.get(`X-Authentik-Groups`)||``).split(`|`).filter(Boolean)};return m(e),e}}catch{}let n={authenticated:!1};return m(n),n}function se(e){return`https://auth.cxllm.io/if/flow/default-authentication-flow/?next=${encodeURIComponent(e??`https://web.cxllm.io/`)}`}function h(e){return String(e??``).replace(/&/g,`&`).replace(//g,`>`).replace(/"/g,`"`).replace(/'/g,`'`)}function g(e){try{return JSON.stringify(e,null,2)}catch{return String(e)}}var _=e=>``,v={overview:_(``),services:_(``),developer:_(``),agent:_(``),workspace:_(``),ops:_(``),account:_(``),collapse:_(``),expand:_(``),search:_(``),open:_(``),copy:_(``),pulse:_(``),signin:_(``),signout:_(``)},y={domain:`cxllm.io`,home:[{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-status-public`,badge:`SSO`,badgeClass:``,color:`sb-purple`,composeService:null,deprecated:!1,description:`CxAI agent control plane (cxai-mcp HTTP sidecar: status, tools, events).`,endpointGroups:[`status`,`tools`,`events`],expected:[200],health:[{expect:[200],path:`/status`},{expect:[200,401,302],path:`/tools`},{expect:[204],path:`/outpost.goauthentik.io/ping`}],host:`agent.cxllm.io`,hosts:[`agent.cxllm.io`],id:`agent`,kind:`agent`,landing:!1,membersSpa:!0,name:`CxAI Agent`,notes:`CxAI control plane: cxai-mcp HTTP sidecar (status, tools registry, /events tail).`,probe:`https://agent.cxllm.io/status`,replacement:null,source:`CxAI/_agent/mcp-server`,title:`CxAI Agent`,upstreamPort:8082,url:`https://agent.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:`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/`},{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:`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:`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/`}],landing:[{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/`}],manifestSchemaVersion:1,members:[{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:`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-status-public`,badge:`SSO`,badgeClass:``,color:`sb-purple`,composeService:null,deprecated:!1,description:`CxAI agent control plane (cxai-mcp HTTP sidecar: status, tools, events).`,endpointGroups:[`status`,`tools`,`events`],expected:[200],health:[{expect:[200],path:`/status`},{expect:[200,401,302],path:`/tools`},{expect:[204],path:`/outpost.goauthentik.io/ping`}],host:`agent.cxllm.io`,hosts:[`agent.cxllm.io`],id:`agent`,kind:`agent`,landing:!1,membersSpa:!0,name:`CxAI Agent`,notes:`CxAI control plane: cxai-mcp HTTP sidecar (status, tools registry, /events tail).`,probe:`https://agent.cxllm.io/status`,replacement:null,source:`CxAI/_agent/mcp-server`,title:`CxAI Agent`,upstreamPort:8082,url:`https://agent.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:`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/`}],schemaVersion:1,services:[{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-status-public`,badge:`SSO`,badgeClass:``,color:`sb-purple`,composeService:null,deprecated:!1,description:`CxAI agent control plane (cxai-mcp HTTP sidecar: status, tools, events).`,endpointGroups:[`status`,`tools`,`events`],expected:[200],health:[{expect:[200],path:`/status`},{expect:[200,401,302],path:`/tools`},{expect:[204],path:`/outpost.goauthentik.io/ping`}],host:`agent.cxllm.io`,hosts:[`agent.cxllm.io`],id:`agent`,kind:`agent`,landing:!1,membersSpa:!0,name:`CxAI Agent`,notes:`CxAI control plane: cxai-mcp HTTP sidecar (status, tools registry, /events tail).`,probe:`https://agent.cxllm.io/status`,replacement:null,source:`CxAI/_agent/mcp-server`,title:`CxAI Agent`,upstreamPort:8082,url:`https://agent.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/`}],source:`manifest/cxllm-services.json`},ce=[{id:`overview`,label:`Overview`,icon:`overview`},{id:`services`,label:`Services`,icon:`services`},{id:`developer`,label:`Developer`,icon:`developer`},{id:`agent`,label:`Agent`,icon:`agent`}],le=[{id:`web`,label:`Console`,href:`https://web.cxllm.io/`},{id:`files`,label:`Files`,href:`https://files.cxllm.io/`},{id:`code`,label:`Code`,href:`https://code.cxllm.io/`}],ue=[{id:`scale`,label:`Scale`,href:`https://scale.cxllm.io/`},{id:`monitor`,label:`Monitor`,href:`https://monitor.cxllm.io/`},{id:`mlrun`,label:`MLRun`,href:`https://mlrun.cxllm.io/`}];function de(e,t,n){let r=e.sidebarCollapsed,i=n.modules.filter(e=>e.loaded).length,a=n.modules.length;return` + + `}function b(e,t,n){return` +
+ ${h(t)} +
+ ${n.map(e=>` + + ${h(e.label)} + ${v.open} + + `).join(``)} +
+
+ `}function fe(e){return e.authenticated?` +
+ Account +
+ + + Identity${v.open} + + + Sign out${v.signout} + +
+
+ `:` +
+ Account + +
+ `}var pe={overview:`Overview`,services:`Services`,developer:`Developer`,agent:`Agent`};function x(e,t){let n=e.section===`developer`?` / ${e.devPane.toUpperCase()}`:``;return` +
+
+ cxllm + ${h(pe[e.section]??e.section)}${h(n)} +
+ + ${me(t)} +
+ `}function me(e){if(!e.authenticated)return` + + ${v.signin} + Sign in + + `;let t=e.username||e.email||`you`,n=t.slice(0,1).toUpperCase();return` + + + ${h(t)} + + `}var S=new Map,he=15e3;async function C(e,t={}){let n=`${t.credentials??`omit`}|${e}`;if(t.cache!==!1){let e=S.get(n);if(e&&Date.now()-e.tsr.abort(),t.timeoutMs??5e3),a=performance.now(),o;try{let n=await fetch(e,{method:`GET`,mode:`cors`,credentials:t.credentials??`omit`,signal:r.signal,headers:{Accept:`application/json, text/plain;q=0.5, */*;q=0.1`}});o={url:e,ok:n.ok,status:n.status,latencyMs:Math.round(performance.now()-a)}}catch(t){o={url:e,ok:!1,status:0,latencyMs:Math.round(performance.now()-a),error:t instanceof Error?t.message:String(t)}}finally{clearTimeout(i)}return S.set(n,{ts:Date.now(),value:o}),o}var w=ge();function ge(){let e=window.location.host;return e.startsWith(`127.0.0.1`)||e.startsWith(`localhost`)?``:`https://mcp.cxllm.io`}async function T(e=document){let t=e.querySelector(`[data-role="agent-badge"]`);if(!t)return;if(!w){t.innerHTML=`agent local`;return}let n=await C(`${w}/status`,{timeoutMs:4e3});t.innerHTML=`${n.ok?`agent ${n.status}`:`agent down`}`}function _e(e=3e4){T();let t=window.setInterval(()=>void T(),e);return()=>window.clearInterval(t)}function ve(e){let{runtime:t,session:n}=e,r=y.services.length,i=y.services.filter(e=>e.auth===`public`||e.auth===`public-idp`).length,a=r-i,o=t.scoreCatalog({publicCount:i,gatedCount:a,degradedCount:y.services.filter(e=>!e.probe).length}),s=t.modules.filter(e=>e.loaded).length;return` +
+
+

CxLLM service fabric

+

A coherent surface for inference, agents, and operations.

+

+ ${n.authenticated?`Welcome back, ${h(n.username||n.email||`operator`)}. Your workspace is wired into the CxAI control plane.`:`Public catalog view. Sign in to access the full members console, MCP, and CxAI agent.`} +

+
+ +
+ ${E(`Services`,r,`across the fabric`)} + ${E(`Public`,i,`no sign-in required`)} + ${E(`Gated`,a,`Authentik forward-auth`)} + ${E(`Signal`,o,`${s}/${t.modules.length} wasm modules loaded`)} +
+ +
+
+

Today

+

Live health for the three pillars.

+
+
+ ${D(`api`,`API`,`https://api.cxllm.io/status`)} + ${D(`mcp`,`MCP`,`https://mcp.cxllm.io/status`)} + ${D(`agent`,`Agent`,`https://mcp.cxllm.io/status`)} +
+
+ +
+
+

Wasm runtime

+

Rust, C++, and Go modules instantiated in the browser.

+
+
    + ${t.modules.map(e=>` +
  • + + ${h(e.label)} + ${e.loaded?`loaded`:`fallback`} + ${h(e.detail)} +
  • + `).join(``)} +
+
+
+ `}function E(e,t,n){return` +
+ ${t} + ${h(e)} + ${h(n)} +
+ `}function D(e,t,n){return` +
+
+ + ${h(t)} + +
+

${h(n)}

+
+ `}async function O(e){let t=e.querySelectorAll(`[data-today]`);await Promise.all(Array.from(t).map(async e=>{let t=e.dataset.probe;if(!t)return;let n=await C(t,{timeoutMs:4e3}),r=e.querySelector(`.cx-dot`),i=e.querySelector(`[data-role="latency"]`);r&&(r.className=`cx-dot ${n.ok?`ok`:`err`}`),i&&(i.textContent=n.ok?`${n.status} · ${n.latencyMs}ms`:n.error||`status ${n.status}`)}))}function k(e){let t=e.query.trim().toLowerCase(),n=y.services.filter(e=>!e.deprecated).filter(e=>t?[e.title,e.host,e.description,e.id,e.kind,e.auth].join(` `).toLowerCase().includes(t):!0),r=M(n,e=>e.kind||`service`),i=Array.from(r.keys()).sort();return` +
+
+
+

Catalog

+

Services

+

${n.length} active surfaces across the cxllm.io fabric.

+
+
+ ${i.map(e=>{let t=r.get(e)||[];return` +
+
+

${h(N(e))}

+ ${t.length} +
+
    + ${t.map(j).join(``)} +
+
+ `}).join(``)} +
+ `}async function A(e){let t=e.querySelectorAll(`[data-probe-url]`);await Promise.all(Array.from(t).map(async e=>{let t=e.dataset.probeUrl;if(!t)return;let n=await C(t,{timeoutMs:4e3}),r=e.querySelector(`.cx-dot`),i=e.querySelector(`[data-role="probe-meta"]`);r&&(r.className=`cx-dot ${n.ok?`ok`:`err`}`),i&&(i.textContent=n.ok?`${n.status} · ${n.latencyMs}ms`:n.error||`status ${n.status}`)}))}function j(e){let t=e.url||(e.host?`https://${e.host}/`:`#`),n=e.probe||``;return` +
  • + ${h(e.title.slice(0,2).toUpperCase())} +
    + ${h(e.title)} + ${h(e.description||e.notes||e.host)} +
    +
    + ${h(e.host||`local`)} + ${h(e.badge||e.auth||`SSO`)} +
    +
    + + +
    +
    + ${v.open} +
    +
  • + `}function M(e,t){let n=new Map;for(let r of e){let e=t(r),i=n.get(e)||[];i.push(r),n.set(e,i)}return n}function N(e){return{api:`Inference API`,mcp:`Model Context Protocol`,ide:`Developer tools`,files:`Storage & files`,storage:`Object storage`,identity:`Identity`,monitoring:`Operations`,spa:`Web surfaces`,service:`Other services`}[e]||e.replace(/(^|\s)\S/g,e=>e.toUpperCase())}function P(e,t){return` +
    + ${e.map(F).join(``)} +
    + `}function F(e){let t=`f-${e.name}`,n=``,r=e.description?`${h(e.description)}`:``,i=``;switch(e.type){case`boolean`:return i=``,`
    ${i}${r}
    `;case`number`:i=``;break;case`enum`:i=``;break;case`json`:i=``;break;default:i=(e.rows??1)>1?``:``}return`
    ${n}${i}${r}
    `}function I(e,t){let n=document.querySelector(`[data-form-id="${e}"]`),r={},i=[];if(!n)return{values:r,errors:[`form not mounted`]};for(let e of t){let t=n.elements.namedItem(e.name);if(!t)continue;if(e.type===`boolean`){r[e.name]=t.checked;continue}let a=(t.value??``).trim();if(!a){e.required&&i.push(`${e.label||e.name} is required`);continue}if(e.type===`number`){let t=Number(a);Number.isNaN(t)?i.push(`${e.label||e.name} must be a number`):r[e.name]=t;continue}if(e.type===`json`){try{r[e.name]=JSON.parse(a)}catch{i.push(`${e.label||e.name} must be valid JSON`)}continue}r[e.name]=a}return{values:r,errors:i}}function ye(e){let t=[`curl -sS -X ${e.method} \\`,` '${e.url}' \\`];return e.bearerEnv&&t.push(` -H "Authorization: Bearer $${e.bearerEnv}" \\`),t.push(` -H 'Content-Type: application/json'`),e.body!==void 0&&t.push(` \\\n -d '${JSON.stringify(e.body)}'`),t.join(` +`)}function L(e){let t={"Content-Type":`application/json`};return e.bearerEnv&&(t.Authorization=`Bearer \${process.env.${e.bearerEnv}}`),[`const res = await fetch(${JSON.stringify(e.url)}, {`,` method: ${JSON.stringify(e.method)},`,` headers: ${JSON.stringify(t,null,2).replace(/\n/g,` + `)},`,e.body===void 0?``:` body: JSON.stringify(${JSON.stringify(e.body,null,2).replace(/\n/g,` + `)}),`,`});`,`const data = await res.json();`,`console.log(data);`].filter(Boolean).join(` +`)}function be(e){let t=[`import os`,`import httpx`,``,`headers = {"Content-Type": "application/json"}`];return e.bearerEnv&&t.push(`headers["Authorization"] = f"Bearer {os.environ['${e.bearerEnv}']}"`),e.body===void 0?t.push(`r = httpx.${e.method.toLowerCase()}(${JSON.stringify(e.url)}, headers=headers, timeout=60)`):(t.push(`payload = ${JSON.stringify(e.body,null,4)}`),t.push(`r = httpx.${e.method.toLowerCase()}(${JSON.stringify(e.url)}, headers=headers, json=payload, timeout=60)`)),t.push(`r.raise_for_status()`,`print(r.json())`),t.join(` +`)}var R=xe(`api`);function xe(e){let t=window.location.host;return t.startsWith(`127.0.0.1`)||t.startsWith(`localhost`)?``:`https://${e}.cxllm.io`}var z=[{id:`status`,label:`GET /status`,description:`Public liveness probe (no auth).`,method:`GET`,path:`/status`,fields:[],publicProbe:!0},{id:`models`,label:`GET /v1/models`,description:`List available chat/embedding models.`,method:`GET`,path:`/v1/models`,fields:[]},{id:`chat`,label:`POST /v1/chat/completions`,description:`OpenAI-compatible chat completion.`,method:`POST`,path:`/v1/chat/completions`,fields:[{name:`model`,label:`Model`,type:`string`,required:!0,default:`gpt-4o-mini`},{name:`prompt`,label:`User message`,type:`string`,rows:4,required:!0,placeholder:`Say hello in three languages.`},{name:`temperature`,label:`Temperature`,type:`number`,default:.7}],body:e=>({model:e.model,messages:[{role:`user`,content:e.prompt}],temperature:e.temperature})},{id:`embeddings`,label:`POST /v1/embeddings`,description:`Vector embeddings for retrieval.`,method:`POST`,path:`/v1/embeddings`,fields:[{name:`model`,label:`Model`,type:`string`,required:!0,default:`text-embedding-3-small`},{name:`input`,label:`Input text`,type:`string`,rows:3,required:!0,default:`hello world`}],body:e=>({model:e.model,input:e.input})}];function Se(e){return` +
    + +
    + ${B(z[0],e)} +
    +
    + `}async function Ce(e,t){let n=e.querySelectorAll(`[data-op]`),r=e.querySelector(`[data-role="dev-main"]`);n.forEach(e=>{e.addEventListener(`click`,()=>{n.forEach(e=>e.classList.remove(`is-active`)),e.classList.add(`is-active`),n.forEach(t=>t.setAttribute(`aria-selected`,t===e?`true`:`false`));let i=z.find(t=>t.id===e.dataset.op);i&&r&&(r.innerHTML=B(i,t),V(r,i,t))})}),r&&V(r,z[0],t)}function B(e,t){let n=`${R||`https://api.cxllm.io`}${e.path}`,r=e.body?e.body(Object.fromEntries(e.fields.map(e=>[e.name,e.default]))):void 0,i=t.authenticated||e.publicProbe;return` +
    +
    +

    ${h(e.label)}

    +

    ${h(e.description)}

    +

    ${h(e.method)} ${h(n)}

    +
    + ${e.fields.length?`
    ${P(e.fields,`api-${e.id}`)}
    `:``} +
    +
    + Run + ${i?e.publicProbe?`Public probe`:`Uses your Authentik session cookie.`:`Sign in to enable.`} +
    +
    + + ${i?``:`Sign in`} +
    +
    // Result will appear here.
    +
    +
    +
    Snippets
    +
    +
    curl
    +
    ${h(ye({method:e.method,url:n,body:r,bearerEnv:`CXLLM_API_KEY`}))}
    +
    +
    +
    TypeScript
    +
    ${h(L({method:e.method,url:n,body:r,bearerEnv:`CXLLM_API_KEY`}))}
    +
    +
    +
    Python
    +
    ${h(be({method:e.method,url:n,body:r,bearerEnv:`CXLLM_API_KEY`}))}
    +
    +
    +
    + `}function V(e,t,n){let r=e.querySelector(`[data-op-run="${t.id}"]`),i=e.querySelector(`[data-role="op-output"]`);!r||!i||r.addEventListener(`click`,async()=>{i.textContent=`// Calling…`;let{values:e,errors:r}=I(`api-${t.id}`,t.fields);if(r.length){i.textContent=`// validation:\n${r.join(` +`)}`;return}try{let r=`${R||`https://api.cxllm.io`}${t.path}`,a={method:t.method,credentials:n.authenticated?`include`:`omit`,headers:{Accept:`application/json`}};t.method===`POST`&&(a.headers={...a.headers,"Content-Type":`application/json`},a.body=JSON.stringify(t.body?t.body(e):e));let o=await fetch(r,a),s=(o.headers.get(`content-type`)||``).includes(`application/json`)?await o.json():await o.text();i.textContent=`// ${o.status} ${o.statusText}\n${typeof s==`string`?s:g(s)}`}catch(e){i.textContent=`// error: ${e instanceof Error?e.message:String(e)}`}})}var H=(()=>{let e=window.location.host;return e.startsWith(`127.0.0.1`)||e.startsWith(`localhost`)?`http://127.0.0.1:8082`:`https://mcp.cxllm.io`})();function we(e){return` +
    + +
    +
    +
    + cxai-mcp + ${h(H)} +
    +

    ${e.authenticated?`Pick a tool on the left to render its schema-driven form and call it live.`:`Anonymous view. Tools list loads, but invocations need a signed-in session.`}

    +
    +
    +
    /events tail
    +
    // connecting…
    +
    +
    +
    + `}async function Te(e,t){let n=e.querySelector(`[data-role="tool-list"]`),r=e.querySelector(`[data-role="mcp-main"]`),i=e.querySelector(`[data-role="reload-tools"]`);if(!n||!r)return;await U(n,r,t),i?.addEventListener(`click`,()=>void U(n,r,t));let a=e.querySelector(`[data-role="events-tail"]`);a&&De(a,t)}async function U(e,t,n){try{let r=await fetch(`${H}/tools`,{credentials:n.authenticated?`include`:`omit`,headers:{Accept:`application/json`}});if(!r.ok)throw Error(`status ${r.status}`);let i=await r.json(),a=Array.isArray(i)?i:Array.isArray(i?.tools)?i.tools:[];if(!a.length){e.innerHTML=`
  • no tools registered
  • `;return}e.innerHTML=a.map((e,t)=>` +
  • + +
  • + `).join(``);let o=e.querySelectorAll(`[data-tool]`);o.forEach(e=>{e.addEventListener(`click`,()=>{o.forEach(e=>e.classList.remove(`is-active`)),e.classList.add(`is-active`);let r=a.find(t=>t.name===e.dataset.tool);r&&W(t,r,n)})}),W(t,a[0],n)}catch(t){e.innerHTML=`
  • error: ${h(t instanceof Error?t.message:String(t))}
  • `}}function W(e,t,n){let r=Ee(t),i=n.authenticated;e.innerHTML=` +
    +
    + ${h(t.name)} + POST ${h(H)}/tools/${h(t.name)} +
    +

    ${h(t.description||``)}

    +
    + ${r.length?`
    ${P(r,`mcp-${t.name}`)}
    `:``} +
    +
    Run${i?"Calls /tools/${name} with your session cookie.":`Sign in to enable.`}
    +
    + +
    +
    // Result will appear here.
    +
    + `;let a=e.querySelector(`[data-mcp-run]`),o=e.querySelector(`[data-role="mcp-output"]`);a?.addEventListener(`click`,async()=>{if(!o)return;o.textContent=`// Invoking…`;let{values:e,errors:n}=I(`mcp-${t.name}`,r);if(n.length){o.textContent=`// validation:\n${n.join(` +`)}`;return}try{let n=await fetch(`${H}/tools/${encodeURIComponent(t.name)}`,{method:`POST`,credentials:`include`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)}),r=(n.headers.get(`content-type`)||``).includes(`application/json`)?await n.json():await n.text();o.textContent=`// ${n.status} ${n.statusText}\n${typeof r==`string`?r:g(r)}`}catch(e){o.textContent=`// error: ${e instanceof Error?e.message:String(e)}`}})}function Ee(e){let t=e.schema?.properties||{},n=new Set(e.schema?.required||[]);return Object.entries(t).map(([e,t])=>{let r=(t.type||`string`).toLowerCase(),i=`string`;return r===`number`||r===`integer`?i=`number`:r===`boolean`?i=`boolean`:r===`object`||r===`array`?i=`json`:t.enum&&t.enum.length&&(i=`enum`),{name:e,label:e,type:i,required:n.has(e),default:t.default,description:t.description,options:t.enum,rows:i===`json`?6:i===`string`?2:1}})}function De(e,t){try{let n=`${H}/events`,r=new EventSource(n,{withCredentials:t.authenticated}),i=[];e.textContent=`// connected`,r.onmessage=t=>{i.push(`${new Date().toLocaleTimeString()} ${t.data}`),i.length>20&&i.shift(),e.textContent=i.join(` +`)},r.onerror=()=>{e.textContent+=`\n// stream error (${new Date().toLocaleTimeString()})`,r.close()}}catch(t){e.textContent=`// events unavailable: ${t instanceof Error?t.message:String(t)}`}}function Oe(e,t){let n=e.devPane,r=n===`mcp`?we(t):Se(t);return` +
    +
    +
    +

    Developer

    +

    Build against CxLLM

    +

    ${t.authenticated?`Live, authenticated calls. Forms run against your session.`:`Anonymous view. Snippets only — sign in to run live requests.`}

    +
    +
    + ${G(`api`,`API`,n===`api`)} + ${G(`mcp`,`MCP`,n===`mcp`)} +
    +
    +
    ${r}
    +
    + `}async function ke(e,t,n){t.devPane===`mcp`?await Te(e,n):await Ce(e,n)}function G(e,t,n){return``}var K=(()=>{let e=window.location.host;return e.startsWith(`127.0.0.1`)||e.startsWith(`localhost`)?`http://127.0.0.1:8082`:`https://mcp.cxllm.io`})();function Ae(e){return` +
    +
    +
    +

    CxAI

    +

    Agent control plane

    +

    cxai-mcp sidecar status, registered tools, and recent activity.${e.authenticated?``:` Sign in for live tool invocations.`}

    +
    +
    + +
    +

    Status

    +
    // loading…
    +
    + +
    +

    Tools

    Registered with cxai-mcp.
    +
    • loading…
    +
    + +
    +

    Activity

    /events tail (last 20).
    +
    // connecting…
    +
    +
    + `}async function je(e,t){let n=e.querySelector(`[data-role="agent-status"]`),r=e.querySelector(`[data-role="agent-status-meta"]`),i=e.querySelector(`[data-role="agent-tools"]`),a=e.querySelector(`[data-role="agent-events"]`);if(n&&r){let e=await C(`${K}/status`,{timeoutMs:4e3});if(r.textContent=e.ok?`${e.status} · ${e.latencyMs}ms`:e.error||`status ${e.status}`,e.ok)try{let e=await fetch(`${K}/status`,{credentials:t.authenticated?`include`:`omit`}),r=await e.json().catch(()=>null);n.textContent=r?g(r):`// status ${e.status}`}catch(e){n.textContent=`// error: ${e instanceof Error?e.message:String(e)}`}else n.textContent=`// unavailable (${e.error||e.status})`}if(i)try{let e=await(await fetch(`${K}/tools`,{credentials:t.authenticated?`include`:`omit`})).json(),n=Array.isArray(e)?e:Array.isArray(e?.tools)?e.tools:[];i.innerHTML=n.length?n.map(e=>` +
  • + ${h(e.name)} + ${h(e.description||``)} +
  • + `).join(``):`
  • no tools registered
  • `}catch(e){i.innerHTML=`
  • error: ${h(e instanceof Error?e.message:String(e))}
  • `}if(a)try{let e=new EventSource(`${K}/events`,{withCredentials:t.authenticated}),n=[];a.textContent=`// connected`,e.onmessage=e=>{n.push(`${new Date().toLocaleTimeString()} ${e.data}`),n.length>20&&n.shift(),a.textContent=n.join(` +`)},e.onerror=()=>{a.textContent+=`\n// stream error (${new Date().toLocaleTimeString()})`,e.close()}}catch(e){a.textContent=`// events unavailable: ${e instanceof Error?e.message:String(e)}`}}var q,J,Y,X;async function Z(){if((q.target===`members`||q.target===`webapp`)&&!Y.authenticated){Me();return}X.innerHTML=` +
    + ${de(q,Y,J)} +
    + ${x(q,Y)} +
    + ${Q()} +
    +
    +
    + `,Ne(),T(X),await $()}function Q(){switch(q.section){case`services`:return k(q);case`developer`:return Oe(q,Y);case`agent`:return Ae(Y);default:return ve({state:q,session:Y,runtime:J})}}async function $(){let e=X.querySelector(`[data-role="workspace-body"]`);if(e)switch(q.section){case`services`:await A(e);break;case`developer`:await ke(e,q,Y);break;case`agent`:await je(e,Y);break;default:await O(e);break}}function Me(){X.innerHTML=` +
    +
    +

    CxLLM

    +

    Sign in to continue

    +

    The ${q.target===`webapp`?`operator console`:`members workspace`} is protected by Authentik. Sign in to access services, developer tools, and the CxAI agent.

    + Sign in with Authentik +

    ← Back to public landing

    +
    +
    + `}function Ne(){X.querySelectorAll(`[data-section]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.section;!t||t===q.section||(q.section=t,re(t),Pe(),Z())})}),X.querySelectorAll(`[data-dev-pane]`).forEach(e=>{e.addEventListener(`click`,()=>{let t=e.dataset.devPane;!t||t===q.devPane||(q.devPane=t,ie(t),Z())})}),X.querySelector(`[data-role="search"]`)?.addEventListener(`input`,e=>{if(q.query=e.currentTarget.value,q.section===`services`){let e=X.querySelector(`[data-role="workspace-body"]`);e&&(e.innerHTML=Q(),$())}}),X.querySelector(`[data-action="toggle-sidebar"]`)?.addEventListener(`click`,()=>{q.sidebarCollapsed=!q.sidebarCollapsed,ae(q.sidebarCollapsed),Z()}),document.addEventListener(`keydown`,e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`&&(e.preventDefault(),X.querySelector(`[data-role="search"]`)?.focus())},{once:!0})}function Pe(){try{let e=new URL(window.location.href);e.searchParams.set(`section`,q.section),window.history.replaceState(null,``,e)}catch{}}async function Fe(){let e=document.querySelector(`#cxllm-root`);e&&(X=e,q=ne(ee(e.dataset.cxTarget)),[Y,J]=await Promise.all([oe(),o()]),await Z(),_e())}Fe(); \ No newline at end of file diff --git a/static/assets/webapp-BAxW9gnc.js b/static/assets/webapp-BAxW9gnc.js deleted file mode 100644 index fe09b2c..0000000 --- a/static/assets/webapp-BAxW9gnc.js +++ /dev/null @@ -1,112 +0,0 @@ -(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,"'")}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` -
    -
    ${c.services.length}
    -
    ${t}
    -
    ${s}
    -
    ${a}
    -
    ${o}/3
    -
    - `}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` -
    -
    - -
    -

    ${r(e.title)}

    -

    ${r(e.description||e.notes||e.host)}

    -
    -
    -
    -
    Host
    ${r(e.host||"local")}
    -
    Auth
    ${r(e.badge||e.auth||"SSO")}
    -
    Probe
    ${r(a)}
    -
    Weight
    ${i}
    -
    -
    - Open - ${o?`Probe`:""} -
    -
    - `}function g(e){return` -
    - ${e.modules.map(t=>` -
    - ${r(t.label)} - ${t.loaded?"loaded":"fallback"} - ${r(t.detail)} -
    - `).join("")} -
    - `}function x(e){const t=c.services.find(a=>a.id===e);if(!t)return`
    ${r(e.toUpperCase())} service is not in the catalog.
    `;const s=y(t),i=s.length?s:[{title:"Health",items:t.health.map(a=>({label:a.path,path:a.path,method:"GET"}))}];return` -
    -

    ${r(t.host)}

    ${r(t.title)}

    -
    - ${i.map(a=>` -
    -

    ${r(a.title||"Endpoints")}

    - ${(a.items??[]).map(o=>` -
    - ${r(o.method||"GET")} - ${r(o.path||"/")} - ${r(o.label||"route")} -
    - `).join("")} -
    - `).join("")} -
    -
    - `}function z(){const e=c.services.find(t=>t.id==="auth");return` -
    -

    Identity layer

    Authentik integration

    -
    -
    Provider${r((e==null?void 0:e.title)||"Authentik")}${r((e==null?void 0:e.host)||"auth.cxllm.io")}
    -
    ModeSSO + forward-authPortal-first app launch
    -
    SurfaceMinimal brandingLogin/account flows stay in Authentik
    -
    -
    - `}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=` -
    - ${L(e).map(a=>M(a,t)).join("")} -
    - `;return n.section==="ops"?`
    ${g(t)}${i}
    `:n.section==="services"?i:` - ${G(t)} -
    - ${g(t)} - ${i} -
    - `}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=` -
    - -
    -
    -
    -

    ${r(i.eyebrow)}

    -

    ${r(i.title)}

    -
    - -
    -
    -

    ${r(i.summary)}

    - -
    - ${O(i,s)} -
    -
    - `,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(); diff --git a/static/assets/webapp-BR2Xd3e4.css b/static/assets/webapp-BR2Xd3e4.css new file mode 100644 index 0000000..29da099 --- /dev/null +++ b/static/assets/webapp-BR2Xd3e4.css @@ -0,0 +1 @@ +:root{--sb-bg:#0b0c10;--sb-bg-elev:#111317;--sb-border:#1f232b;--sb-ink:#e6e9ef;--sb-muted:#7a8290;--sb-accent:#5eead4;--sb-active:#1c2026;--sb-hover:#15181d;--bg:#fafbfc;--bg-elev:#fff;--panel:#fff;--soft:#f3f5f8;--border:#e4e7eb;--border-strong:#cbd2da;--ink:#0f1115;--muted:#5b6473;--muted-soft:#8a93a3;--accent:#0a7c66;--accent-soft:#ddf3eb;--blue:#1f6feb;--purple:#6e56cf;--amber:#b87900;--red:#c0392b;--green:#1f7a4f;--sb-w:240px;--sb-w-collapsed:56px;--radius:8px;--radius-lg:12px;--shadow-sm:0 1px 2px #0f11150f;--shadow:0 8px 24px #0f111514;--font-ui:-apple-system, BlinkMacSystemFont, "Inter", "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, monospace;--fs-base:13px;--fs-lg:15px}@media (prefers-color-scheme:dark){:root{--bg:#0f1115;--bg-elev:#14171c;--panel:#14171c;--soft:#1a1d23;--border:#232830;--border-strong:#2e333b;--ink:#e6e9ef;--muted:#8a93a3;--muted-soft:#6a7282;--accent-soft:#16302a}}.cx-sidebar{width:var(--sb-w);min-width:var(--sb-w);background:var(--sb-bg);height:100vh;color:var(--sb-ink);border-right:1px solid var(--sb-border);flex-direction:column;font-size:13px;line-height:1.4;transition:width .16s,min-width .16s;display:flex;position:sticky;top:0}.cx-sidebar.is-collapsed{width:var(--sb-w-collapsed);min-width:var(--sb-w-collapsed)}.cx-sidebar.is-collapsed .cx-nav-label,.cx-sidebar.is-collapsed .cx-brand-text,.cx-sidebar.is-collapsed .cx-group,.cx-sidebar.is-collapsed .cx-sidebar-foot .cx-foot-row span:not(.cx-dot){display:none}.cx-brand{border-bottom:1px solid var(--sb-border);align-items:center;gap:8px;padding:12px 12px 10px;display:flex}.cx-brand-link{color:var(--sb-ink);flex:1;align-items:center;gap:10px;min-width:0;text-decoration:none;display:flex}.cx-brand-mark{background:linear-gradient(135deg, var(--sb-accent), #2dd4bf);color:#0b0c10;width:28px;height:28px;font-weight:700;font-family:var(--font-mono);border-radius:7px;place-items:center;font-size:12px;display:grid}.cx-brand-text{flex-direction:column;min-width:0;line-height:1.1;display:flex}.cx-brand-text strong{color:var(--sb-ink);font-size:13px}.cx-brand-text small{color:var(--sb-muted);font-size:11px;font-family:var(--font-mono)}.cx-icon-btn{color:var(--sb-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;place-items:center;width:28px;height:28px;transition:background-color .12s,color .12s;display:grid}.cx-icon-btn:hover{background:var(--sb-hover);color:var(--sb-ink)}.cx-icon-btn svg{width:16px;height:16px}.cx-nav{flex-direction:column;gap:2px;padding:8px 6px;display:flex}.cx-nav-primary{border-bottom:1px solid var(--sb-border)}.cx-nav-btn{color:var(--sb-muted);text-align:left;cursor:pointer;height:32px;font-family:var(--font-ui);background:0 0;border:1px solid #0000;border-radius:6px;align-items:center;gap:10px;padding:0 10px;font-size:13px;transition:background-color .12s,color .12s;display:flex}.cx-nav-btn:hover{background:var(--sb-hover);color:var(--sb-ink)}.cx-nav-btn.is-active{background:var(--sb-active);color:var(--sb-ink)}.cx-nav-icon{width:18px;height:18px;color:inherit;place-items:center;display:grid}.cx-nav-icon svg{width:16px;height:16px}.cx-nav-label{font-weight:500}.cx-group{border-top:1px solid var(--sb-border);padding:4px 6px}.cx-group:first-of-type{border-top:none}.cx-group-summary{cursor:pointer;color:var(--sb-muted);font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;justify-content:space-between;align-items:center;padding:8px 8px 6px;font-size:10.5px;list-style:none;display:flex}.cx-group-summary::-webkit-details-marker{display:none}.cx-group-summary:after{content:"▸";font-size:10px;transition:transform .12s}.cx-group[open]>.cx-group-summary:after{transform:rotate(90deg)}.cx-group-body{flex-direction:column;gap:1px;padding-bottom:4px;display:flex}.cx-link{color:var(--sb-muted);border-radius:6px;justify-content:space-between;align-items:center;padding:6px 10px;font-size:13px;text-decoration:none;transition:background-color .12s,color .12s;display:flex}.cx-link:hover{background:var(--sb-hover);color:var(--sb-ink)}.cx-link-static{cursor:default}.cx-link-icon{color:var(--sb-muted);opacity:.7;place-items:center;display:grid}.cx-link-icon svg{width:12px;height:12px}.cx-sidebar-foot{border-top:1px solid var(--sb-border);flex-direction:column;gap:6px;margin-top:auto;padding:10px 14px;display:flex}.cx-foot-row{color:var(--sb-muted);align-items:center;gap:8px;font-size:11px;display:flex}.cx-dot{background:var(--sb-muted);border-radius:50%;flex-shrink:0;width:7px;height:7px}.cx-dot.ok{background:#22c55e;box-shadow:0 0 0 2px #22c55e2e}.cx-dot.warn{background:#eab308;box-shadow:0 0 0 2px #eab3082e}.cx-dot.err{background:#ef4444;box-shadow:0 0 0 2px #ef44442e}@media (width<=920px){.cx-sidebar{flex-flow:wrap;width:100%;min-width:0;height:auto;padding:8px;position:relative}.cx-sidebar .cx-brand{border:none;padding:4px 8px}.cx-sidebar .cx-nav,.cx-sidebar .cx-group,.cx-sidebar .cx-sidebar-foot{border:none;padding:4px}.cx-sidebar .cx-nav-primary{flex-flow:wrap}}.cx-topbar{border-bottom:1px solid var(--border);background:var(--bg-elev);z-index:10;align-items:center;gap:16px;height:56px;padding:0 24px;display:flex;position:sticky;top:0}.cx-breadcrumb{align-items:baseline;gap:8px;min-width:0;display:flex}.cx-eyebrow{color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:11px}.cx-crumb{color:var(--ink);font-size:14px;font-weight:600}.cx-search{border:1px solid var(--border);background:var(--soft);border-radius:8px;flex:1;align-items:center;gap:8px;max-width:480px;height:32px;padding:0 10px;transition:border-color .12s,background-color .12s;display:flex}.cx-search:focus-within{border-color:var(--accent);background:var(--bg-elev)}.cx-search-icon{color:var(--muted);place-items:center;display:grid}.cx-search-icon svg{width:14px;height:14px}.cx-search input{color:var(--ink);font:13px var(--font-ui);background:0 0;border:0;outline:none;flex:1}.cx-kbd{font-family:var(--font-mono);border:1px solid var(--border-strong);color:var(--muted);background:var(--bg-elev);border-radius:4px;padding:2px 6px;font-size:10.5px}.cx-pill{border:1px solid var(--border);height:32px;color:var(--ink);background:var(--bg-elev);border-radius:8px;align-items:center;gap:8px;padding:0 12px;font-size:13px;text-decoration:none;display:inline-flex}.cx-pill:hover{border-color:var(--border-strong)}.cx-pill-cta{background:var(--accent);color:#fff;border-color:var(--accent)}.cx-pill-cta:hover{filter:brightness(.95)}.cx-pill-icon{place-items:center;display:grid}.cx-pill-icon svg{width:14px;height:14px}.cx-avatar{background:var(--accent);color:#fff;width:22px;height:22px;font:600 11px var(--font-mono);border-radius:50%;place-items:center;display:grid}.cx-page{max-width:1200px;margin:0 auto;padding:24px 32px 64px}.cx-page-head{justify-content:space-between;align-items:flex-end;gap:24px;margin:8px 0 24px;display:flex}.cx-hero{padding:16px 0 32px}.cx-h1{color:var(--ink);margin:8px 0;font-size:28px;font-weight:600;line-height:1.2}.cx-h2{color:var(--ink);margin:0;font-size:16px;font-weight:600}.cx-lead{color:var(--muted);max-width:70ch;margin:4px 0 0;font-size:15px}.cx-muted{color:var(--muted)}.cx-mono{font-family:var(--font-mono)}.cx-panel{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);margin-bottom:16px;padding:20px}.cx-panel-head{justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:12px;display:flex}.cx-kpi-grid{grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:20px;display:grid}.cx-kpi{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);flex-direction:column;gap:4px;padding:16px;display:flex}.cx-kpi-value{font:600 28px var(--font-ui);color:var(--ink)}.cx-kpi-label{color:var(--ink);font-size:13px;font-weight:500}.cx-today-grid{grid-template-columns:repeat(3,1fr);gap:12px;display:grid}.cx-today-card{border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-elev);padding:14px}.cx-today-card header{align-items:center;gap:8px;margin-bottom:6px;display:flex}.cx-list{flex-direction:column;gap:0;margin:0;padding:0;list-style:none;display:flex}.cx-list-row,.cx-row{border-bottom:1px solid var(--border);grid-template-columns:24px 1fr auto;align-items:center;gap:12px;padding:12px 0;display:grid}.cx-list-row:last-child,.cx-row:last-child{border-bottom:none}.cx-list-services .cx-row-service{grid-template-columns:36px 1fr auto auto auto}.cx-row-mark{width:36px;height:36px;font:700 11px var(--font-mono);color:#fff;background:var(--accent);border-radius:8px;place-items:center;display:grid}.cx-row-mark.sb-blue{background:var(--blue)}.cx-row-mark.sb-green{background:var(--green)}.cx-row-mark.sb-purple{background:var(--purple)}.cx-row-mark.sb-amber{background:var(--amber)}.cx-row-mark.sb-red{background:var(--red)}.cx-row-main{flex-direction:column;gap:2px;min-width:0;display:flex}.cx-row-main strong{color:var(--ink);font-size:14px;font-weight:600}.cx-row-main small{font-size:12px;line-height:1.4}.cx-row-meta{color:var(--muted);flex-direction:column;align-items:flex-end;gap:2px;font-size:12px;display:flex}.cx-row-status{color:var(--muted);align-items:center;gap:6px;font-size:11px;display:flex}.cx-tag{background:var(--soft);border:1px solid var(--border);color:var(--ink);font-size:10.5px;font-family:var(--font-mono);border-radius:4px;padding:1px 6px;display:inline-block}.cx-seg{border:1px solid var(--border);background:var(--soft);border-radius:8px;gap:2px;padding:3px;display:inline-flex}.cx-seg-btn{font:500 12px var(--font-ui);color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:4px 12px}.cx-seg-btn:hover{color:var(--ink)}.cx-seg-btn.is-active{background:var(--bg-elev);color:var(--ink);box-shadow:var(--shadow-sm)}.cx-dev{grid-template-columns:260px 1fr;gap:16px;display:grid}.cx-dev-side{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);height:max-content;padding:8px;position:sticky;top:72px}.cx-dev-side-head{justify-content:space-between;align-items:center;padding:4px 8px 8px;display:flex}.cx-dev-side-head .cx-icon-btn{color:var(--muted);border:1px solid var(--border)}.cx-dev-side-head .cx-icon-btn:hover{background:var(--soft);color:var(--ink)}.cx-dev-ops{flex-direction:column;gap:2px;margin:0;padding:0;list-style:none;display:flex}.cx-dev-op{text-align:left;cursor:pointer;width:100%;color:var(--ink);background:0 0;border:0;border-radius:6px;flex-direction:column;gap:2px;padding:8px 10px;display:flex}.cx-dev-op:hover{background:var(--soft)}.cx-dev-op.is-active{background:var(--accent-soft);color:var(--ink)}.cx-dev-op strong{font:600 12.5px var(--font-mono)}.cx-dev-op small{font-size:11.5px}.cx-dev-main{flex-direction:column;gap:12px;min-width:0;display:flex}.cx-dev-op-panel{flex-direction:column;gap:12px;display:flex}.cx-dev-op-head h2{margin-bottom:4px}.cx-dev-op-head p{margin:2px 0}.cx-card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px}.cx-card-head{justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:10px;display:flex}.cx-card-head strong{font-weight:600}.cx-form{flex-direction:column;gap:12px;display:flex}.cx-field{flex-direction:column;gap:4px;display:flex}.cx-field-label{color:var(--ink);font-size:12px;font-weight:500}.cx-field-label span{color:var(--red)}.cx-field-desc{color:var(--muted);font-size:11.5px}.cx-input{border:1px solid var(--border);background:var(--bg-elev);font:13px var(--font-ui);color:var(--ink);border-radius:6px;outline:none;width:100%;padding:7px 10px}.cx-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}textarea.cx-input{resize:vertical;min-height:40px}.cx-mono.cx-input,textarea.cx-mono{font-family:var(--font-mono);font-size:12.5px}.cx-toggle{cursor:pointer;align-items:center;gap:8px;display:inline-flex}.cx-actions{gap:8px;display:flex}.cx-btn{font:500 13px var(--font-ui);border:1px solid var(--border);background:var(--bg-elev);color:var(--ink);cursor:pointer;border-radius:6px;align-items:center;gap:6px;padding:7px 14px;text-decoration:none;display:inline-flex}.cx-btn:hover{background:var(--soft)}.cx-btn:disabled{opacity:.5;cursor:not-allowed}.cx-btn-primary{background:var(--accent);border-color:var(--accent);color:#fff}.cx-btn-primary:hover{filter:brightness(.95);background:var(--accent)}.cx-btn-ghost{background:0 0}.cx-output{background:var(--soft);border:1px solid var(--border);font:12px var(--font-mono);color:var(--ink);white-space:pre-wrap;word-break:break-word;border-radius:6px;max-height:320px;margin:12px 0 0;padding:12px;overflow:auto}.cx-snippet{border:1px solid var(--border);border-radius:6px;margin-top:12px;overflow:hidden}.cx-snippet header{background:var(--soft);border-bottom:1px solid var(--border);padding:6px 10px}.cx-snippet pre{font:12px var(--font-mono);background:var(--bg-elev);margin:0;padding:12px;overflow:auto}@media (width<=920px){.cx-kpi-grid,.cx-today-grid{grid-template-columns:1fr 1fr}.cx-dev{grid-template-columns:1fr}.cx-dev-side{position:static}.cx-page{padding:16px}}*,:before,:after{box-sizing:border-box}html,body{background:var(--bg);color:var(--ink);margin:0;padding:0}body{font:var(--fs-base)/1.5 var(--font-ui);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}#cxllm-root{min-height:100vh}.cx-app-shell{grid-template-columns:auto 1fr;min-height:100vh;display:grid}.cx-workspace{flex-direction:column;min-width:0;display:flex}.cx-auth-gate{background:var(--bg);place-items:center;min-height:100vh;padding:32px;display:grid}.cx-auth-gate-card{background:var(--panel);border:1px solid var(--border);border-radius:var(--radius-lg);max-width:480px;box-shadow:var(--shadow);text-align:center;padding:32px}.cx-auth-gate-card h1{margin:8px 0 12px;font-size:22px;font-weight:600}.cx-auth-gate-card p{color:var(--muted);margin:0 0 20px}@media (width<=920px){.cx-app-shell{grid-template-rows:auto 1fr;grid-template-columns:1fr}} diff --git a/static/assets/webapp-Bf0A7CMv.css b/static/assets/webapp-Bf0A7CMv.css deleted file mode 100644 index 941e504..0000000 --- a/static/assets/webapp-Bf0A7CMv.css +++ /dev/null @@ -1 +0,0 @@ -:root{color-scheme:light;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#f5f7f9;color:#15202b;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;--ink: #15202b;--muted: #5a6675;--line: #d9e1e8;--panel: #ffffff;--soft: #eef3f6;--green: #087f5b;--blue: #2563eb;--purple: #7c3aed;--amber: #b45309;--red: #b42318}*{box-sizing:border-box}body{margin:0;min-width:320px;min-height:100vh;background:#f5f7f9}a{color:inherit}button,input{font:inherit}.app-shell{display:grid;grid-template-columns:248px minmax(0,1fr);min-height:100vh}.sidebar{position:sticky;top:0;height:100vh;padding:18px 14px;background:#111827;color:#f8fafc;border-right:1px solid #0b1120}.brand{display:flex;align-items:center;gap:10px;min-height:44px;padding:6px 8px 18px;text-decoration:none}.brand span{display:grid;place-items:center;width:34px;height:34px;border-radius:8px;background:#20c997;color:#06281f;font-weight:800}.brand strong{font-size:17px}.sidebar nav{display:grid;gap:6px}.nav-button{width:100%;min-height:40px;border:0;border-radius:7px;padding:0 12px;background:transparent;color:#cbd5e1;text-align:left;cursor:pointer}.nav-button:hover,.nav-button.is-active{background:#1f2937;color:#fff}.workspace{min-width:0;padding:24px}.topbar{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-bottom:18px}.topbar p,.section-heading p{margin:0 0 4px;color:var(--green);font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:0}.topbar h1,.section-heading h2{margin:0;color:var(--ink);font-size:clamp(26px,4vw,42px);line-height:1.05;letter-spacing:0}.search-box{display:grid;gap:5px;width:min(360px,100%);color:var(--muted);font-size:12px;font-weight:700;text-transform:uppercase}.search-box input{width:100%;height:42px;border:1px solid var(--line);border-radius:7px;padding:0 12px;background:var(--panel);color:var(--ink);text-transform:none}.intro-band{display:flex;align-items:center;justify-content:space-between;gap:18px;min-height:86px;margin-bottom:18px;border:1px solid var(--line);border-radius:8px;padding:18px;background:#eaf8f2}.intro-band p{margin:0;max-width:820px;color:#244238;font-size:16px;line-height:1.5}.intro-actions,.service-actions{display:flex;flex-wrap:wrap;gap:8px}.intro-actions a,.service-actions a{display:inline-flex;align-items:center;justify-content:center;min-height:36px;border:1px solid #b9d8cd;border-radius:7px;padding:0 12px;background:#fff;color:#0f5132;font-size:14px;font-weight:700;text-decoration:none;white-space:nowrap}.metric-grid{display:grid;grid-template-columns:repeat(5,minmax(120px,1fr));gap:12px;margin-bottom:18px}.metric{min-height:92px;border:1px solid var(--line);border-radius:8px;padding:16px;background:var(--panel)}.metric span{display:block;color:var(--ink);font-size:30px;font-weight:800;line-height:1}.metric label{display:block;margin-top:8px;color:var(--muted);font-size:13px;font-weight:700}.split-view{display:grid;grid-template-columns:minmax(240px,320px) minmax(0,1fr);gap:18px;align-items:start}.module-rail{display:grid;gap:10px}.module-row,.auth-grid article,.endpoint-group{border:1px solid var(--line);border-radius:8px;padding:14px;background:var(--panel)}.module-row{display:grid;gap:4px}.module-row span,.auth-grid span{color:var(--muted);font-size:12px;font-weight:700;text-transform:uppercase}.module-row strong,.auth-grid strong{color:var(--ink);font-size:18px}.module-row small,.auth-grid small{color:var(--muted);line-height:1.4}.module-row.is-loaded{border-color:#96d8bf;background:#f1fbf7}.service-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.service-card{display:grid;gap:14px;min-height:232px;border:1px solid var(--line);border-top:4px solid var(--green);border-radius:8px;padding:14px;background:var(--panel)}.service-card.sb-blue{border-top-color:var(--blue)}.service-card.sb-purple{border-top-color:var(--purple)}.service-card.sb-amber{border-top-color:var(--amber)}.service-card.sb-red{border-top-color:var(--red)}.service-main{display:grid;grid-template-columns:44px minmax(0,1fr);gap:12px;align-items:start}.service-mark{display:grid;place-items:center;width:44px;height:44px;border-radius:8px;background:var(--soft);color:var(--green);font-weight:800}.service-copy h3,.endpoint-group h3{margin:0;color:var(--ink);font-size:18px;line-height:1.2}.service-copy p{margin:6px 0 0;color:var(--muted);line-height:1.45}.service-meta{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin:0}.service-meta div{min-width:0;border-radius:7px;padding:8px;background:#f8fafc}.service-meta dt{color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase}.service-meta dd{margin:3px 0 0;overflow:hidden;color:var(--ink);font-size:13px;font-weight:700;text-overflow:ellipsis;white-space:nowrap}.endpoint-panel,.auth-panel{display:grid;gap:16px}.endpoint-list,.auth-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px}.endpoint-row{display:grid;grid-template-columns:58px minmax(0,1fr);gap:8px;align-items:center;min-height:36px;border-top:1px solid var(--line);padding:8px 0}.endpoint-row code{border-radius:6px;padding:4px 6px;background:#eef6ff;color:#1d4ed8;font-size:12px;font-weight:800}.endpoint-row span,.endpoint-row small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.endpoint-row small{grid-column:2;color:var(--muted)}.empty-state{border:1px solid var(--line);border-radius:8px;padding:18px;background:var(--panel);color:var(--muted)}@media (max-width: 920px){.app-shell{grid-template-columns:1fr}.sidebar{position:static;height:auto}.sidebar nav{grid-template-columns:repeat(3,minmax(0,1fr))}.nav-button{text-align:center}.topbar,.intro-band{align-items:stretch;flex-direction:column}.metric-grid,.split-view{grid-template-columns:1fr}}@media (max-width: 560px){.workspace{padding:16px}.sidebar nav{grid-template-columns:repeat(2,minmax(0,1fr))}.service-meta,.endpoint-row{grid-template-columns:1fr}.endpoint-row small{grid-column:auto}} diff --git a/static/index.html b/static/index.html index d02a382..818dceb 100644 --- a/static/index.html +++ b/static/index.html @@ -4,10 +4,10 @@ CxWebApp - - + +
    - \ No newline at end of file + diff --git a/static/wasm/cxllm_cpp_core.wasm b/static/wasm/cxllm_cpp_core.wasm new file mode 100755 index 0000000000000000000000000000000000000000..09af1ae53aaf30d3102d11d3862801c9f4887cfe GIT binary patch literal 253 zcmZY2y-ve06vgp#9VdZ$>xKZSQrUTith|I1%%zyxPUYN)kHx5B;IXk-8UDjhXE>Oa zNC0T7M_^Q?P#LLU1eK=MAl2xWPNY=Z5uMdpbr)1<`1;YN|E8{s9OwL@uyyYtM4RVT z*uJqpya>oxpS<`f_)i9|Y~_>B?8H8=$%&tnmFY1s)s5rgvOftYyU65@HuEBLW~iHg u(}BghHD^wO=CUUYWC)vk-PF%p>}dGw;dr4IC5_GS--&1OM12w87k-2A8@x^P zu=A#8dvbHm3nw_uMk~vm57)=#_A>UT_VuyxeCzSN@7)(7BBCND;vylEA|=wo5E+pb iIgu9yQ4}Rn78OwyHBlE0(G)Gw79G(QJ<qdLi!|H5xkaeiKo+m&M7XvXABQgFl`5J%rZ!YNo diff --git a/static/wasm/modules.json b/static/wasm/modules.json index 2263019..3a0ec53 100644 --- a/static/wasm/modules.json +++ b/static/wasm/modules.json @@ -8,8 +8,8 @@ }, { "id": "cpp", - "status": "skipped", - "detail": "clang++ is present but has no compatible wasm32 target" + "status": "built", + "detail": "cxllm_cpp_core.wasm via emcc" }, { "id": "go",