Spaces:
Running
chore(sync): mirror front-door files to Space (hf-sync)
Browse filesAutomated front-door sync from szl-holdings/a11oy main via hf-sync.
Added/updated: cathedral.html, console/docs.html, console/index.html, console/pricing.html, console/throne-room.html, console/throne-room.js, pages/api-keys.html, pages/audit.html, pages/ayni.html, pages/brain-dual.html, pages/brain-jack.html, pages/brain.html, pages/chaski.html, pages/codex-kernel.html, pages/company.html, pages/compliance.html, pages/console.html, pages/counter-uas.html, pages/cued-engagement.html, pages/docs.html, pages/evidence.html, pages/gap-report.html, pages/hatun-mcp.html, pages/hub.html, pages/integrations.html, pages/landing.html, pages/mesh.html, pages/observability.html, pages/operator_organ.html, pages/pricing.html, pages/run-all.html, pages/sdk.html, pages/security.html, pages/status.html, pages/substrate.html, pages/superpowers.html, pages/throne-room.html, pages/throne-room.js, pages/uds.html, pages/upgrades.html, pages/wallpa.html, pages/warhacker.html, pages/wasi-rikuq.html, pages/wires.html, static/a11oy_cathedral.js
Deleted (gone from GitHub main): (none)
Keeps the served front-door (pages/*.html, console/*.html) identical
to GitHub main so an HF factory rebuild never drops a GitHub edit or
keeps serving a page that was deleted on GitHub.
- pages/integrations.html +255 -0
|
@@ -0,0 +1,255 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<!-- SPDX-License-Identifier: Apache-2.0 © 2026 Lutar, Stephen P. — SZL Holdings · Doctrine v11 -->
|
| 3 |
+
<!-- INTEGRATIONS / ENTERPRISE MESH surface. ADDITIVE. 0 runtime CDN. Honest states only. -->
|
| 4 |
+
<html lang="en">
|
| 5 |
+
<head>
|
| 6 |
+
<meta charset="utf-8"/>
|
| 7 |
+
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
| 8 |
+
<title>a11oy · Enterprise Mesh — Integrations</title>
|
| 9 |
+
<style>
|
| 10 |
+
:root{
|
| 11 |
+
--navy:#0b1220;--navy2:#0e1626;--panel:#111c30;--ink:#eaf0f7;--mut:#8da0b8;
|
| 12 |
+
--teal:#3fd0c9;--teal-dim:#1d6b67;--gold:#e8b95c;--gold-dim:#5a4824;
|
| 13 |
+
--ok:#54d18c;--ready:#7cc4ff;--sample:#ffcf5c;--bad:#ff6b6b;
|
| 14 |
+
--line:#1f2c44;--mono:'SF Mono',ui-monospace,'JetBrains Mono',Menlo,Consolas,monospace;
|
| 15 |
+
}
|
| 16 |
+
*{box-sizing:border-box}
|
| 17 |
+
body{margin:0;background:radial-gradient(circle at 80% -10%,#10203a,var(--navy));color:var(--ink);
|
| 18 |
+
font:15px/1.55 -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;min-height:100vh}
|
| 19 |
+
a{color:var(--teal);text-decoration:none}a:hover{color:var(--gold)}
|
| 20 |
+
.wrap{max-width:1180px;margin:0 auto;padding:26px 18px 90px}
|
| 21 |
+
.top{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;
|
| 22 |
+
border-bottom:1px solid var(--line);padding-bottom:16px}
|
| 23 |
+
.brand{font-weight:800;letter-spacing:.5px;font-size:18px}
|
| 24 |
+
.brand .gold{color:var(--gold)}
|
| 25 |
+
.tag{font-size:12px;color:var(--mut)}
|
| 26 |
+
.nav a{margin-left:14px;font-size:13px;color:var(--mut)}.nav a:hover{color:var(--teal)}
|
| 27 |
+
h1{font-size:27px;margin:22px 0 4px}h1 .gold{color:var(--gold)}
|
| 28 |
+
.sub{color:var(--mut);margin:0 0 14px;max-width:760px}
|
| 29 |
+
.scoreboard{display:flex;gap:10px;flex-wrap:wrap;margin:14px 0 6px}
|
| 30 |
+
.score{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 16px;min-width:118px}
|
| 31 |
+
.score .n{font-size:24px;font-weight:800;font-family:var(--mono)}
|
| 32 |
+
.score .l{font-size:11.5px;color:var(--mut);text-transform:uppercase;letter-spacing:.6px}
|
| 33 |
+
.score.connected{border-left:3px solid var(--ok)}.score.connected .n{color:var(--ok)}
|
| 34 |
+
.score.ready{border-left:3px solid var(--ready)}.score.ready .n{color:var(--ready)}
|
| 35 |
+
.score.sample{border-left:3px solid var(--sample)}.score.sample .n{color:var(--sample)}
|
| 36 |
+
.score.total{border-left:3px solid var(--gold)}.score.total .n{color:var(--gold)}
|
| 37 |
+
.filters{display:flex;gap:8px;flex-wrap:wrap;margin:18px 0 4px}
|
| 38 |
+
.filters button{background:var(--navy2);color:var(--mut);border:1px solid var(--line);border-radius:999px;
|
| 39 |
+
padding:6px 14px;font-size:12.5px;cursor:pointer;font-family:var(--mono)}
|
| 40 |
+
.filters button.on{background:var(--teal-dim);color:var(--ink);border-color:var(--teal)}
|
| 41 |
+
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(290px,1fr));gap:14px;margin-top:16px}
|
| 42 |
+
.card{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:16px;
|
| 43 |
+
border-left:3px solid var(--line);display:flex;flex-direction:column;gap:8px}
|
| 44 |
+
.card.s-connected{border-left-color:var(--ok)}
|
| 45 |
+
.card.s-ready{border-left-color:var(--ready)}
|
| 46 |
+
.card.s-sample{border-left-color:var(--sample)}
|
| 47 |
+
.card.s-error{border-left-color:var(--bad)}
|
| 48 |
+
.card .h{display:flex;justify-content:space-between;align-items:flex-start;gap:8px}
|
| 49 |
+
.card .name{font-weight:700;font-size:15.5px}
|
| 50 |
+
.card .cat{font-size:11px;color:var(--mut);font-family:var(--mono);text-transform:uppercase;letter-spacing:.5px}
|
| 51 |
+
.badge{font-family:var(--mono);font-size:11px;font-weight:700;border-radius:999px;padding:3px 9px;white-space:nowrap}
|
| 52 |
+
.badge.connected{background:#0f2a1c;color:var(--ok)}
|
| 53 |
+
.badge.ready{background:#0d1f33;color:var(--ready)}
|
| 54 |
+
.badge.sample{background:#2b260f;color:var(--sample)}
|
| 55 |
+
.badge.error{background:#2b1212;color:var(--bad)}
|
| 56 |
+
.card .detail{font-size:12.5px;color:var(--mut);min-height:18px}
|
| 57 |
+
.card .secrets{font-family:var(--mono);font-size:11.5px;color:var(--gold);word-break:break-all}
|
| 58 |
+
.card .meta{display:flex;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--mut);font-family:var(--mono)}
|
| 59 |
+
.chip{background:var(--navy2);border:1px solid var(--line);border-radius:8px;padding:2px 8px}
|
| 60 |
+
.chip.write{color:var(--gold);border-color:var(--gold-dim)}
|
| 61 |
+
.card .acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px}
|
| 62 |
+
.card .acts button,.card .acts a{background:var(--navy2);color:var(--teal);border:1px solid var(--line);
|
| 63 |
+
border-radius:8px;padding:6px 11px;font-size:12px;cursor:pointer;font-family:var(--mono)}
|
| 64 |
+
.card .acts button:hover{border-color:var(--teal)}
|
| 65 |
+
pre{width:100%;background:var(--navy);color:var(--ink);border:1px solid var(--line);border-radius:8px;
|
| 66 |
+
font-family:var(--mono);font-size:11.5px;padding:9px;overflow:auto;max-height:220px;
|
| 67 |
+
white-space:pre-wrap;word-break:break-word;margin:4px 0 0}
|
| 68 |
+
.honest{background:var(--navy2);border:1px solid var(--gold-dim);border-left:3px solid var(--gold);
|
| 69 |
+
border-radius:10px;padding:13px 16px;margin:20px 0;font-size:13px}
|
| 70 |
+
.honest b{color:var(--gold)}
|
| 71 |
+
code{font-family:var(--mono);color:var(--teal);font-size:12px}
|
| 72 |
+
footer{margin-top:30px;border-top:1px solid var(--line);padding-top:14px;color:var(--mut);font-size:12px}
|
| 73 |
+
.loading{color:var(--mut);font-family:var(--mono);font-size:13px;padding:24px 0}
|
| 74 |
+
@media (max-width:520px){.wrap{padding:18px 12px 70px}h1{font-size:22px}.grid{grid-template-columns:1fr}}
|
| 75 |
+
</style>
|
| 76 |
+
</head>
|
| 77 |
+
<body>
|
| 78 |
+
<div class="wrap">
|
| 79 |
+
<div class="top">
|
| 80 |
+
<div><span class="brand">a11oy <span class="gold">·</span> Enterprise Mesh</span>
|
| 81 |
+
<span class="tag">· Doctrine v11 · honest states only · 0 runtime CDN</span></div>
|
| 82 |
+
<div class="nav"><a href="/">home</a><a href="/console">console</a><a href="/chaski">chaski</a><a href="/integrations">integrations</a></div>
|
| 83 |
+
</div>
|
| 84 |
+
|
| 85 |
+
<h1>Integrations <span class="gold">/</span> Connector Mesh</h1>
|
| 86 |
+
<p class="sub">One honest abstraction meshes a11oy into any enterprise CRM / ERP / identity /
|
| 87 |
+
comms / ITSM / warehouse / storage / observability stack — and is live-connected now to
|
| 88 |
+
free, no-signup intelligence sources. Every tile shows its <b>real</b> state:
|
| 89 |
+
<span style="color:var(--ok)">CONNECTED</span> (live data),
|
| 90 |
+
<span style="color:var(--ready)">READY</span> (provide the named secret to activate),
|
| 91 |
+
<span style="color:var(--sample)">SAMPLE</span> (labelled — no free tier). Records are never fabricated.</p>
|
| 92 |
+
|
| 93 |
+
<div class="scoreboard" id="scoreboard"></div>
|
| 94 |
+
<div class="filters" id="filters"></div>
|
| 95 |
+
<div id="grid" class="grid"><div class="loading">loading connector manifest…</div></div>
|
| 96 |
+
|
| 97 |
+
<div class="honest">
|
| 98 |
+
<b>Honesty & doctrine.</b> States are computed by the framework's <code>resolve_state()</code>
|
| 99 |
+
core from live credential presence + provider reachability — not hand-set. READY tiles name the
|
| 100 |
+
exact <code>SZL_*</code> Space-secret(s) required; the instant a secret lands the tile flips to
|
| 101 |
+
CONNECTED and renders the customer's live data. Every <span class="chip write">write</span> is
|
| 102 |
+
Λ-gated (Λ never 1.0) and DSSE/Khipu-receipted; receipts carry credential
|
| 103 |
+
<i>fingerprint hashes</i>, never the key. Verify any tile yourself with its
|
| 104 |
+
<code>read</code> button (hits the live API) or its docs link.
|
| 105 |
+
</div>
|
| 106 |
+
|
| 107 |
+
<footer>
|
| 108 |
+
a11oy Enterprise Connector Framework · <code>GET /api/a11oy/connectors</code> ·
|
| 109 |
+
© 2026 Lutar, Stephen P. — SZL Holdings · Doctrine v11 LOCKED — 749/14/163 — Λ = Conjecture 1.
|
| 110 |
+
</footer>
|
| 111 |
+
</div>
|
| 112 |
+
|
| 113 |
+
<script>
|
| 114 |
+
(function(){
|
| 115 |
+
"use strict";
|
| 116 |
+
var API = "/api/a11oy/connectors";
|
| 117 |
+
var READ = function(id){ return "/api/a11oy/v1/connectors/" + encodeURIComponent(id) + "/read?limit=4"; };
|
| 118 |
+
var state = { all: [], filter: "all" };
|
| 119 |
+
|
| 120 |
+
function el(tag, cls, txt){
|
| 121 |
+
var e = document.createElement(tag);
|
| 122 |
+
if (cls) e.className = cls;
|
| 123 |
+
if (txt != null) e.textContent = txt;
|
| 124 |
+
return e;
|
| 125 |
+
}
|
| 126 |
+
function safeText(v){ return (v == null) ? "" : String(v); }
|
| 127 |
+
|
| 128 |
+
function badge(st){
|
| 129 |
+
var b = el("span", "badge " + safeText(st), safeText(st).toUpperCase() || "?");
|
| 130 |
+
return b;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
function renderScoreboard(m){
|
| 134 |
+
var sb = document.getElementById("scoreboard");
|
| 135 |
+
if (!sb) return;
|
| 136 |
+
sb.textContent = "";
|
| 137 |
+
var sc = (m && m.scoreboard) || {};
|
| 138 |
+
var defs = [
|
| 139 |
+
["total", "connectors", (m && m.count) || 0],
|
| 140 |
+
["connected", "live now", sc.connected || 0],
|
| 141 |
+
["ready", "ready (creds)", sc.ready || 0],
|
| 142 |
+
["sample", "sample", sc.sample || 0]
|
| 143 |
+
];
|
| 144 |
+
defs.forEach(function(d){
|
| 145 |
+
var box = el("div", "score " + d[0]);
|
| 146 |
+
box.appendChild(el("div", "n", String(d[2])));
|
| 147 |
+
box.appendChild(el("div", "l", d[1]));
|
| 148 |
+
sb.appendChild(box);
|
| 149 |
+
});
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
function renderFilters(){
|
| 153 |
+
var fc = document.getElementById("filters");
|
| 154 |
+
if (!fc) return;
|
| 155 |
+
fc.textContent = "";
|
| 156 |
+
var cats = {};
|
| 157 |
+
state.all.forEach(function(c){ if (c && c.category) cats[c.category] = (cats[c.category]||0)+1; });
|
| 158 |
+
var keys = Object.keys(cats).sort();
|
| 159 |
+
var defs = [["all", "all (" + state.all.length + ")"]];
|
| 160 |
+
keys.forEach(function(k){ defs.push([k, k + " (" + cats[k] + ")"]); });
|
| 161 |
+
defs.forEach(function(d){
|
| 162 |
+
var b = el("button", state.filter === d[0] ? "on" : "", d[1]);
|
| 163 |
+
b.addEventListener("click", function(){ state.filter = d[0]; renderFilters(); renderGrid(); });
|
| 164 |
+
fc.appendChild(b);
|
| 165 |
+
});
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
function renderGrid(){
|
| 169 |
+
var grid = document.getElementById("grid");
|
| 170 |
+
if (!grid) return;
|
| 171 |
+
grid.textContent = "";
|
| 172 |
+
var items = state.all.filter(function(c){
|
| 173 |
+
return state.filter === "all" || (c && c.category === state.filter);
|
| 174 |
+
});
|
| 175 |
+
if (!items.length){
|
| 176 |
+
grid.appendChild(el("div", "loading", "no connectors in this category."));
|
| 177 |
+
return;
|
| 178 |
+
}
|
| 179 |
+
items.forEach(function(c){
|
| 180 |
+
if (!c) return;
|
| 181 |
+
var st = safeText(c.state) || "error";
|
| 182 |
+
var card = el("div", "card s-" + st);
|
| 183 |
+
|
| 184 |
+
var head = el("div", "h");
|
| 185 |
+
var left = el("div");
|
| 186 |
+
left.appendChild(el("div", "name", safeText(c.label) || safeText(c.id)));
|
| 187 |
+
left.appendChild(el("div", "cat", safeText(c.category) + " · " + safeText(c.auth_kind)));
|
| 188 |
+
head.appendChild(left);
|
| 189 |
+
head.appendChild(badge(st));
|
| 190 |
+
card.appendChild(head);
|
| 191 |
+
|
| 192 |
+
card.appendChild(el("div", "detail", safeText(c.detail) || safeText(c.sample_reason) || ""));
|
| 193 |
+
|
| 194 |
+
if (st === "ready" && c.missing_env && c.missing_env.length){
|
| 195 |
+
card.appendChild(el("div", "secrets", "set: " + c.missing_env.join(", ")));
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
var meta = el("div", "meta");
|
| 199 |
+
if (c.free_tier) meta.appendChild(el("span", "chip", "free tier"));
|
| 200 |
+
if (c.writable) meta.appendChild(el("span", "chip write", "Λ-gated write"));
|
| 201 |
+
if (c.mcp_tool) meta.appendChild(el("span", "chip", "mcp"));
|
| 202 |
+
card.appendChild(meta);
|
| 203 |
+
|
| 204 |
+
var acts = el("div", "acts");
|
| 205 |
+
var rb = el("button", "", "read ▸");
|
| 206 |
+
var out = el("pre");
|
| 207 |
+
out.style.display = "none";
|
| 208 |
+
rb.addEventListener("click", function(){
|
| 209 |
+
rb.textContent = "reading…";
|
| 210 |
+
fetch(READ(c.id)).then(function(r){ return r.json(); }).then(function(j){
|
| 211 |
+
out.style.display = "block";
|
| 212 |
+
out.textContent = JSON.stringify(j, null, 2);
|
| 213 |
+
rb.textContent = "read ▸";
|
| 214 |
+
}).catch(function(e){
|
| 215 |
+
out.style.display = "block";
|
| 216 |
+
out.textContent = "read error: " + safeText(e && e.message);
|
| 217 |
+
rb.textContent = "read ▸";
|
| 218 |
+
});
|
| 219 |
+
});
|
| 220 |
+
acts.appendChild(rb);
|
| 221 |
+
if (c.docs_url){
|
| 222 |
+
var a = el("a", "", "docs ↗");
|
| 223 |
+
a.href = c.docs_url; a.target = "_blank"; a.rel = "noopener noreferrer";
|
| 224 |
+
acts.appendChild(a);
|
| 225 |
+
}
|
| 226 |
+
card.appendChild(acts);
|
| 227 |
+
card.appendChild(out);
|
| 228 |
+
grid.appendChild(card);
|
| 229 |
+
});
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
function boot(){
|
| 233 |
+
fetch(API).then(function(r){ return r.json(); }).then(function(m){
|
| 234 |
+
state.all = (m && m.connectors) || [];
|
| 235 |
+
renderScoreboard(m);
|
| 236 |
+
renderFilters();
|
| 237 |
+
renderGrid();
|
| 238 |
+
}).catch(function(e){
|
| 239 |
+
var grid = document.getElementById("grid");
|
| 240 |
+
if (grid){
|
| 241 |
+
grid.textContent = "";
|
| 242 |
+
grid.appendChild(el("div", "loading", "could not load /api/a11oy/connectors — " + safeText(e && e.message)));
|
| 243 |
+
}
|
| 244 |
+
});
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
if (document.readyState === "loading"){
|
| 248 |
+
document.addEventListener("DOMContentLoaded", boot);
|
| 249 |
+
} else {
|
| 250 |
+
boot();
|
| 251 |
+
}
|
| 252 |
+
})();
|
| 253 |
+
</script>
|
| 254 |
+
</body>
|
| 255 |
+
</html>
|