Spaces:
Running
Running
fix(integrations): namespace auto-detect from host (byte-identical a11oy+killinchu)
d389f24 verified | <!-- SPDX-License-Identifier: Apache-2.0 © 2026 Lutar, Stephen P. — SZL Holdings · Doctrine v11 --> | |
| <!-- INTEGRATIONS / ENTERPRISE MESH surface. ADDITIVE. 0 runtime CDN. Honest states only. --> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="utf-8"/> | |
| <meta name="viewport" content="width=device-width, initial-scale=1"/> | |
| <title>a11oy · Enterprise Mesh — Integrations</title> | |
| <style> | |
| :root{ | |
| --navy:#0b1220;--navy2:#0e1626;--panel:#111c30;--ink:#eaf0f7;--mut:#8da0b8; | |
| --teal:#3fd0c9;--teal-dim:#1d6b67;--gold:#e8b95c;--gold-dim:#5a4824; | |
| --ok:#54d18c;--ready:#7cc4ff;--sample:#ffcf5c;--bad:#ff6b6b; | |
| --line:#1f2c44;--mono:'SF Mono',ui-monospace,'JetBrains Mono',Menlo,Consolas,monospace; | |
| } | |
| *{box-sizing:border-box} | |
| body{margin:0;background:radial-gradient(circle at 80% -10%,#10203a,var(--navy));color:var(--ink); | |
| font:15px/1.55 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;min-height:100vh} | |
| a{color:var(--teal);text-decoration:none}a:hover{color:var(--gold)} | |
| .wrap{max-width:1180px;margin:0 auto;padding:26px 18px 90px} | |
| .top{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap; | |
| border-bottom:1px solid var(--line);padding-bottom:16px} | |
| .brand{font-weight:800;letter-spacing:.5px;font-size:18px} | |
| .brand .gold{color:var(--gold)} | |
| .tag{font-size:12px;color:var(--mut)} | |
| .nav a{margin-left:14px;font-size:13px;color:var(--mut)}.nav a:hover{color:var(--teal)} | |
| h1{font-size:27px;margin:22px 0 4px}h1 .gold{color:var(--gold)} | |
| .sub{color:var(--mut);margin:0 0 14px;max-width:760px} | |
| .scoreboard{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0 6px} | |
| .score{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 16px;min-width:118px} | |
| .score .n{font-size:24px;font-weight:800;font-family:var(--mono)} | |
| .score .l{font-size:11.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.6px} | |
| .score.connected{border-left:3px solid var(--ok)}.score.connected .n{color:var(--ok)} | |
| .score.ready{border-left:3px solid var(--ready)}.score.ready .n{color:var(--ready)} | |
| .score.sample{border-left:3px solid var(--sample)}.score.sample .n{color:var(--sample)} | |
| .score.total{border-left:3px solid var(--gold)}.score.total .n{color:var(--gold)} | |
| .filters{display:flex;gap:8px;flex-wrap:wrap;margin:18px 0 4px} | |
| .filters button{background:var(--navy2);color:var(--mut);border:1px solid var(--line);border-radius:999px; | |
| padding:6px 14px;font-size:12.5px;cursor:pointer;font-family:var(--mono)} | |
| .filters button.on{background:var(--teal-dim);color:var(--ink);border-color:var(--teal)} | |
| .grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px;margin-top:16px} | |
| .card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px; | |
| border-left:3px solid var(--line);display:flex;flex-direction:column;gap:8px} | |
| .card.s-connected{border-left-color:var(--ok)} | |
| .card.s-ready{border-left-color:var(--ready)} | |
| .card.s-sample{border-left-color:var(--sample)} | |
| .card.s-error{border-left-color:var(--bad)} | |
| .card .h{display:flex;justify-content:space-between;align-items:flex-start;gap:8px} | |
| .card .name{font-weight:700;font-size:15.5px} | |
| .card .cat{font-size:11px;color:var(--mut);font-family:var(--mono);text-transform:uppercase;letter-spacing:.5px} | |
| .badge{font-family:var(--mono);font-size:11px;font-weight:700;border-radius:999px;padding:3px 9px;white-space:nowrap} | |
| .badge.connected{background:#0f2a1c;color:var(--ok)} | |
| .badge.ready{background:#0d1f33;color:var(--ready)} | |
| .badge.sample{background:#2b260f;color:var(--sample)} | |
| .badge.error{background:#2b1212;color:var(--bad)} | |
| .card .detail{font-size:12.5px;color:var(--mut);min-height:18px} | |
| .card .secrets{font-family:var(--mono);font-size:11.5px;color:var(--gold);word-break:break-all} | |
| .card .meta{display:flex;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--mut);font-family:var(--mono)} | |
| .chip{background:var(--navy2);border:1px solid var(--line);border-radius:8px;padding:2px 8px} | |
| .chip.write{color:var(--gold);border-color:var(--gold-dim)} | |
| .card .acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px} | |
| .card .acts button,.card .acts a{background:var(--navy2);color:var(--teal);border:1px solid var(--line); | |
| border-radius:8px;padding:6px 11px;font-size:12px;cursor:pointer;font-family:var(--mono)} | |
| .card .acts button:hover{border-color:var(--teal)} | |
| pre{width:100%;background:var(--navy);color:var(--ink);border:1px solid var(--line);border-radius:8px; | |
| font-family:var(--mono);font-size:11.5px;padding:9px;overflow:auto;max-height:220px; | |
| white-space:pre-wrap;word-break:break-word;margin:4px 0 0} | |
| .honest{background:var(--navy2);border:1px solid var(--gold-dim);border-left:3px solid var(--gold); | |
| border-radius:10px;padding:13px 16px;margin:20px 0;font-size:13px} | |
| .honest b{color:var(--gold)} | |
| code{font-family:var(--mono);color:var(--teal);font-size:12px} | |
| footer{margin-top:30px;border-top:1px solid var(--line);padding-top:14px;color:var(--mut);font-size:12px} | |
| .loading{color:var(--mut);font-family:var(--mono);font-size:13px;padding:24px 0} | |
| @media (max-width:520px){.wrap{padding:18px 12px 70px}h1{font-size:22px}.grid{grid-template-columns:1fr}} | |
| </style> | |
| </head> | |
| <body> | |
| <div class="wrap"> | |
| <div class="top"> | |
| <div><span class="brand">a11oy <span class="gold">·</span> Enterprise Mesh</span> | |
| <span class="tag">· Doctrine v11 · honest states only · 0 runtime CDN</span></div> | |
| <div class="nav"><a href="/">home</a><a href="/console">console</a><a href="/chaski">chaski</a><a href="/integrations">integrations</a></div> | |
| </div> | |
| <h1>Integrations <span class="gold">/</span> Connector Mesh</h1> | |
| <p class="sub">One honest abstraction meshes a11oy into any enterprise CRM / ERP / identity / | |
| comms / ITSM / warehouse / storage / observability stack — and is live-connected now to | |
| free, no-signup intelligence sources. Every tile shows its <b>real</b> state: | |
| <span style="color:var(--ok)">CONNECTED</span> (live data), | |
| <span style="color:var(--ready)">READY</span> (provide the named secret to activate), | |
| <span style="color:var(--sample)">SAMPLE</span> (labelled — no free tier). Records are never fabricated.</p> | |
| <div class="scoreboard" id="scoreboard"></div> | |
| <div class="filters" id="filters"></div> | |
| <div id="grid" class="grid"><div class="loading">loading connector manifest…</div></div> | |
| <div class="honest"> | |
| <b>Honesty & doctrine.</b> States are computed by the framework's <code>resolve_state()</code> | |
| core from live credential presence + provider reachability — not hand-set. READY tiles name the | |
| exact <code>SZL_*</code> Space-secret(s) required; the instant a secret lands the tile flips to | |
| CONNECTED and renders the customer's live data. Every <span class="chip write">write</span> is | |
| Λ-gated (Λ never 1.0) and DSSE/Khipu-receipted; receipts carry credential | |
| <i>fingerprint hashes</i>, never the key. Verify any tile yourself with its | |
| <code>read</code> button (hits the live API) or its docs link. | |
| </div> | |
| <footer> | |
| a11oy Enterprise Connector Framework · <code>GET /api/a11oy/connectors</code> · | |
| © 2026 Lutar, Stephen P. — SZL Holdings · Doctrine v11 LOCKED — 749/14/163 — Λ = Conjecture 1. | |
| </footer> | |
| </div> | |
| <script> | |
| (function(){ | |
| "use strict"; | |
| // Namespace auto-detect: the same byte-identical page ships to both a11oy and | |
| // killinchu Spaces. Derive ns from the host (szlholdings-<ns>.hf.space) so each | |
| // Space hits its OWN mounted manifest; default a11oy. No CDN, no build-time edit. | |
| var NS = "a11oy"; | |
| try { | |
| var h = (location.hostname || "").toLowerCase(); | |
| if (h.indexOf("killinchu") !== -1) { NS = "killinchu"; } | |
| else if (h.indexOf("a11oy") !== -1) { NS = "a11oy"; } | |
| } catch (e) { /* keep default */ } | |
| var API = "/api/" + NS + "/connectors"; | |
| var READ = function(id){ return "/api/" + NS + "/v1/connectors/" + encodeURIComponent(id) + "/read?limit=4"; }; | |
| var state = { all: [], filter: "all" }; | |
| function el(tag, cls, txt){ | |
| var e = document.createElement(tag); | |
| if (cls) e.className = cls; | |
| if (txt != null) e.textContent = txt; | |
| return e; | |
| } | |
| function safeText(v){ return (v == null) ? "" : String(v); } | |
| function badge(st){ | |
| var b = el("span", "badge " + safeText(st), safeText(st).toUpperCase() || "?"); | |
| return b; | |
| } | |
| function renderScoreboard(m){ | |
| var sb = document.getElementById("scoreboard"); | |
| if (!sb) return; | |
| sb.textContent = ""; | |
| var sc = (m && m.scoreboard) || {}; | |
| var defs = [ | |
| ["total", "connectors", (m && m.count) || 0], | |
| ["connected", "live now", sc.connected || 0], | |
| ["ready", "ready (creds)", sc.ready || 0], | |
| ["sample", "sample", sc.sample || 0] | |
| ]; | |
| defs.forEach(function(d){ | |
| var box = el("div", "score " + d[0]); | |
| box.appendChild(el("div", "n", String(d[2]))); | |
| box.appendChild(el("div", "l", d[1])); | |
| sb.appendChild(box); | |
| }); | |
| } | |
| function renderFilters(){ | |
| var fc = document.getElementById("filters"); | |
| if (!fc) return; | |
| fc.textContent = ""; | |
| var cats = {}; | |
| state.all.forEach(function(c){ if (c && c.category) cats[c.category] = (cats[c.category]||0)+1; }); | |
| var keys = Object.keys(cats).sort(); | |
| var defs = [["all", "all (" + state.all.length + ")"]]; | |
| keys.forEach(function(k){ defs.push([k, k + " (" + cats[k] + ")"]); }); | |
| defs.forEach(function(d){ | |
| var b = el("button", state.filter === d[0] ? "on" : "", d[1]); | |
| b.addEventListener("click", function(){ state.filter = d[0]; renderFilters(); renderGrid(); }); | |
| fc.appendChild(b); | |
| }); | |
| } | |
| function renderGrid(){ | |
| var grid = document.getElementById("grid"); | |
| if (!grid) return; | |
| grid.textContent = ""; | |
| var items = state.all.filter(function(c){ | |
| return state.filter === "all" || (c && c.category === state.filter); | |
| }); | |
| if (!items.length){ | |
| grid.appendChild(el("div", "loading", "no connectors in this category.")); | |
| return; | |
| } | |
| items.forEach(function(c){ | |
| if (!c) return; | |
| var st = safeText(c.state) || "error"; | |
| var card = el("div", "card s-" + st); | |
| var head = el("div", "h"); | |
| var left = el("div"); | |
| left.appendChild(el("div", "name", safeText(c.label) || safeText(c.id))); | |
| left.appendChild(el("div", "cat", safeText(c.category) + " · " + safeText(c.auth_kind))); | |
| head.appendChild(left); | |
| head.appendChild(badge(st)); | |
| card.appendChild(head); | |
| card.appendChild(el("div", "detail", safeText(c.detail) || safeText(c.sample_reason) || "")); | |
| if (st === "ready" && c.missing_env && c.missing_env.length){ | |
| card.appendChild(el("div", "secrets", "set: " + c.missing_env.join(", "))); | |
| } | |
| var meta = el("div", "meta"); | |
| if (c.free_tier) meta.appendChild(el("span", "chip", "free tier")); | |
| if (c.writable) meta.appendChild(el("span", "chip write", "Λ-gated write")); | |
| if (c.mcp_tool) meta.appendChild(el("span", "chip", "mcp")); | |
| card.appendChild(meta); | |
| var acts = el("div", "acts"); | |
| var rb = el("button", "", "read ▸"); | |
| var out = el("pre"); | |
| out.style.display = "none"; | |
| rb.addEventListener("click", function(){ | |
| rb.textContent = "reading…"; | |
| fetch(READ(c.id)).then(function(r){ return r.json(); }).then(function(j){ | |
| out.style.display = "block"; | |
| out.textContent = JSON.stringify(j, null, 2); | |
| rb.textContent = "read ▸"; | |
| }).catch(function(e){ | |
| out.style.display = "block"; | |
| out.textContent = "read error: " + safeText(e && e.message); | |
| rb.textContent = "read ▸"; | |
| }); | |
| }); | |
| acts.appendChild(rb); | |
| if (c.docs_url){ | |
| var a = el("a", "", "docs ↗"); | |
| a.href = c.docs_url; a.target = "_blank"; a.rel = "noopener noreferrer"; | |
| acts.appendChild(a); | |
| } | |
| card.appendChild(acts); | |
| card.appendChild(out); | |
| grid.appendChild(card); | |
| }); | |
| } | |
| function boot(){ | |
| fetch(API).then(function(r){ return r.json(); }).then(function(m){ | |
| state.all = (m && m.connectors) || []; | |
| renderScoreboard(m); | |
| renderFilters(); | |
| renderGrid(); | |
| }).catch(function(e){ | |
| var grid = document.getElementById("grid"); | |
| if (grid){ | |
| grid.textContent = ""; | |
| grid.appendChild(el("div", "loading", "could not load " + API + " — " + safeText(e && e.message))); | |
| } | |
| }); | |
| } | |
| if (document.readyState === "loading"){ | |
| document.addEventListener("DOMContentLoaded", boot); | |
| } else { | |
| boot(); | |
| } | |
| })(); | |
| </script> | |
| </body> | |
| </html> | |