betterwithage commited on
Commit
a87c99e
·
verified ·
1 Parent(s): a54f6f8

chore(sync): mirror front-door files to Space (hf-sync)

Browse files

Automated 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.

Files changed (1) hide show
  1. pages/integrations.html +255 -0
pages/integrations.html ADDED
@@ -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 &amp; 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 (Λ&nbsp;never&nbsp;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>