sync: 2026-03-17 02:30 — 26 files from Alexandria
Some checks failed
Lint & Format / detect (push) Has been cancelled
Lint & Format / js-lint (push) Has been cancelled
Lint & Format / py-lint (push) Has been cancelled
Lint & Format / sh-lint (push) Has been cancelled
Lint & Format / go-lint (push) Has been cancelled
Monorepo Lint / lint-shell (push) Has been cancelled
Monorepo Lint / lint-js (push) Has been cancelled
Some checks failed
Lint & Format / detect (push) Has been cancelled
Lint & Format / js-lint (push) Has been cancelled
Lint & Format / py-lint (push) Has been cancelled
Lint & Format / sh-lint (push) Has been cancelled
Lint & Format / go-lint (push) Has been cancelled
Monorepo Lint / lint-shell (push) Has been cancelled
Monorepo Lint / lint-js (push) Has been cancelled
RoadChain-SHA2048: d8a7354502e773d0 RoadChain-Identity: alexa@sovereign RoadChain-Full: d8a7354502e773d07d3ae1d2e9e18e7976ecb29555804209e30e6ef32fe6b505ce1db9fc5f829c800d47e929bf13198cef3f9870e93f8423aa3e2d302c394ff471c76ea7ac7029dabae0558ec73d737547633125af176738bfc2668add40fe5e424cb6801447528fe04ba78d995f2dc09c594abb39b5b172096f4ea08c6853dcd5cbaeab43c7ae6a80f259b7283ebf47cf96e77f49de80605b494800ddee64d6133385b2363b0fabf1bc2ef7e19d21358b809bf5371cddd3aa01f2ab3ccbd598cb0e93154849bcd7101b305df3d8c0d60989954fa4a03bcc07ad624e1e37a12654252a5c6547c3392c598a37d6d41468138dcffcc5c92caadbffd082d9f85e9e
This commit is contained in:
@@ -612,65 +612,74 @@ const HTML = `<!DOCTYPE html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>RoadCode — Coding Orchestration Platform</title>
|
||||
<title>RoadCode — Build on Your Device</title>
|
||||
<link rel="icon" href="https://images.blackroad.io/pixel-art/road-logo.png">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&family=Inter:wght@400;500&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
:root{
|
||||
--bg:#000;--card:#0a0a0a;--elevated:#111;--hover:#181818;
|
||||
--border:#1a1a1a;--muted:#444;--sub:#737373;--text:#f5f5f5;
|
||||
--sg:'Space Grotesk',sans-serif;--jb:'JetBrains Mono',monospace;--in:'Inter',sans-serif;
|
||||
--grad:linear-gradient(90deg,#FF6B2B,#FF2255,#CC00AA,#8844FF,#4488FF,#00D4FF);
|
||||
--radius-sm:4px;--radius:6px;--radius-md:8px;--radius-lg:10px;
|
||||
}
|
||||
*{margin:0;padding:0;box-sizing:border-box}
|
||||
body{background:#0a0a0a;color:#e0e0e0;font-family:'Inter',-apple-system,sans-serif;min-height:100vh}
|
||||
a{color:#FF1D6C;text-decoration:none}a:hover{text-decoration:underline}
|
||||
body{background:var(--bg);color:var(--text);font-family:var(--in);min-height:100vh}
|
||||
a{color:var(--text);text-decoration:none;border-bottom:1px solid var(--border)}a:hover{border-color:var(--sub)}
|
||||
|
||||
.top{background:#111;border-bottom:1px solid #222;padding:12px 24px;display:flex;align-items:center;gap:16px}
|
||||
.top h1{font-size:20px;color:#FF1D6C;font-weight:700}
|
||||
.top .stats{margin-left:auto;display:flex;gap:16px;font-size:12px;color:#666}
|
||||
.grad-bar{height:4px;background:var(--grad);width:100%}
|
||||
|
||||
.top{background:var(--elevated);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;gap:16px}
|
||||
.top h1{font-size:20px;font-family:var(--sg);font-weight:700}
|
||||
.top .stats{margin-left:auto;display:flex;gap:16px;font-size:12px;color:var(--sub)}
|
||||
.top .stat{display:flex;align-items:center;gap:4px}
|
||||
.top .dot{width:6px;height:6px;border-radius:50%;background:#4CAF50}
|
||||
|
||||
.cmd{padding:12px 24px;background:#0d0d0d;border-bottom:1px solid #1a1a1a;display:flex;gap:8px}
|
||||
.cmd input{flex:1;background:#1a1a1a;border:1px solid #333;color:#e0e0e0;padding:10px 14px;border-radius:8px;font-size:14px;font-family:'JetBrains Mono',monospace;outline:none}
|
||||
.cmd input:focus{border-color:#FF1D6C}
|
||||
.cmd button{background:#FF1D6C;color:#fff;border:none;padding:10px 20px;border-radius:8px;cursor:pointer;font-weight:600;font-size:13px}
|
||||
.cmd button:hover{background:#e0165f}
|
||||
.cmd{padding:12px 24px;background:var(--card);border-bottom:1px solid var(--border);display:flex;gap:8px}
|
||||
.cmd input{flex:1;background:var(--hover);border:1px solid var(--border);color:var(--text);padding:10px 14px;border-radius:var(--radius);font-size:14px;font-family:var(--jb);outline:none}
|
||||
.cmd input:focus{border-color:var(--sub)}
|
||||
.cmd button{background:var(--grad);color:#fff;border:none;padding:10px 20px;border-radius:var(--radius);cursor:pointer;font-weight:600;font-size:13px;font-family:var(--sg)}
|
||||
.cmd button:hover{opacity:.9}
|
||||
|
||||
.tabs{display:flex;gap:4px;padding:8px 24px;background:#0d0d0d;border-bottom:1px solid #1a1a1a;overflow-x:auto}
|
||||
.tab{background:none;border:1px solid #222;color:#666;padding:6px 14px;border-radius:16px;cursor:pointer;font-size:12px;white-space:nowrap}
|
||||
.tab:hover{color:#ccc;border-color:#444}
|
||||
.tab.active{background:#FF1D6C22;color:#FF1D6C;border-color:#FF1D6C}
|
||||
.tabs{display:flex;gap:4px;padding:8px 24px;background:var(--card);border-bottom:1px solid var(--border);overflow-x:auto}
|
||||
.tab{background:none;border:1px solid var(--border);color:var(--sub);padding:6px 14px;border-radius:var(--radius-sm);cursor:pointer;font-size:12px;white-space:nowrap;font-family:var(--sg)}
|
||||
.tab:hover{color:var(--text);border-color:var(--muted)}
|
||||
.tab.active{border-image:var(--grad) 1;color:var(--text)}
|
||||
|
||||
.content{padding:24px;max-width:1200px;margin:0 auto}
|
||||
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:16px}
|
||||
.card{background:#111;border:1px solid #222;border-radius:8px;padding:16px;transition:border-color .2s}
|
||||
.card:hover{border-color:#FF1D6C44}
|
||||
.card h3{font-size:14px;font-weight:600;margin-bottom:4px}
|
||||
.card .meta{font-size:11px;color:#666;margin-bottom:8px}
|
||||
.card .desc{font-size:13px;color:#999;line-height:1.4}
|
||||
.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px;transition:border-color .2s}
|
||||
.card:hover{border-color:var(--muted)}
|
||||
.card h3{font-size:14px;font-weight:600;margin-bottom:4px;font-family:var(--sg)}
|
||||
.card .meta{font-size:11px;color:var(--sub);margin-bottom:8px}
|
||||
.card .desc{font-size:13px;color:var(--sub);line-height:1.4}
|
||||
.card .tags{display:flex;gap:4px;margin-top:8px;flex-wrap:wrap}
|
||||
.tag{background:#1a1a1a;color:#888;padding:2px 8px;border-radius:4px;font-size:10px}
|
||||
.tag.lang{color:#FF9800}
|
||||
.tag{background:var(--hover);color:var(--sub);padding:2px 8px;border-radius:var(--radius-sm);font-size:10px;font-family:var(--jb)}
|
||||
|
||||
.section-title{font-size:16px;font-weight:600;margin-bottom:16px;color:#ccc;display:flex;align-items:center;gap:8px}
|
||||
.section-title{font-size:16px;font-weight:600;margin-bottom:16px;font-family:var(--sg);display:flex;align-items:center;gap:8px}
|
||||
.section-title span{font-size:20px}
|
||||
|
||||
.result{background:#111;border:1px solid #1a1a1a;border-radius:8px;padding:16px;margin-bottom:12px}
|
||||
.result pre{background:#0a0a0a;padding:12px;border-radius:6px;font-family:'JetBrains Mono',monospace;font-size:12px;overflow-x:auto;color:#ccc;margin-top:8px}
|
||||
.result{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px;margin-bottom:12px}
|
||||
.result pre{background:var(--bg);padding:12px;border-radius:var(--radius);font-family:var(--jb);font-size:12px;overflow-x:auto;color:var(--sub);margin-top:8px;border:1px solid var(--border)}
|
||||
|
||||
.fleet-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:12px;margin-top:16px}
|
||||
.node{background:#111;border:1px solid #222;border-radius:8px;padding:12px}
|
||||
.node h4{font-size:13px;display:flex;align-items:center;gap:6px}
|
||||
.node .svcs{font-size:11px;color:#666;margin-top:4px}
|
||||
.node{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:12px}
|
||||
.node h4{font-size:13px;font-family:var(--sg);display:flex;align-items:center;gap:6px}
|
||||
.node .svcs{font-size:11px;color:var(--sub);margin-top:4px}
|
||||
.node .dot-online{width:8px;height:8px;border-radius:50%;background:#4CAF50;display:inline-block}
|
||||
.node .dot-offline{width:8px;height:8px;border-radius:50%;background:#F44336;display:inline-block}
|
||||
|
||||
.squad-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
|
||||
.agent{background:#111;border:1px solid #222;border-radius:8px;padding:12px;display:flex;gap:10px;align-items:center}
|
||||
.agent{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:12px;display:flex;gap:10px;align-items:center}
|
||||
.agent .emoji{font-size:24px}
|
||||
.agent .info h4{font-size:13px}
|
||||
.agent .info p{font-size:11px;color:#666}
|
||||
.agent .info h4{font-size:13px;font-family:var(--sg)}
|
||||
.agent .info p{font-size:11px;color:var(--sub)}
|
||||
|
||||
.tmpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:12px}
|
||||
.tmpl{background:#111;border:1px solid #222;border-radius:8px;padding:16px;cursor:pointer;transition:border-color .2s}
|
||||
.tmpl:hover{border-color:#FF1D6C}
|
||||
.tmpl h4{font-size:14px;margin-bottom:4px}
|
||||
.tmpl p{font-size:12px;color:#888}
|
||||
.tmpl{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);padding:16px;cursor:pointer;transition:border-color .2s}
|
||||
.tmpl:hover{border-color:var(--muted)}
|
||||
.tmpl h4{font-size:14px;margin-bottom:4px;font-family:var(--sg)}
|
||||
.tmpl p{font-size:12px;color:var(--sub)}
|
||||
|
||||
@media(max-width:768px){
|
||||
.top{padding:10px 12px}.cmd{padding:8px 12px}.content{padding:12px}
|
||||
@@ -680,14 +689,15 @@ a{color:#FF1D6C;text-decoration:none}a:hover{text-decoration:underline}
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div class="grad-bar"></div>
|
||||
<div class="top">
|
||||
<h1>RoadCode</h1>
|
||||
<span style="color:#666;font-size:12px">v${VERSION}</span>
|
||||
<span style="color:var(--sub);font-size:12px">v${VERSION}</span>
|
||||
<div class="stats" id="stats">Loading...</div>
|
||||
</div>
|
||||
|
||||
<div class="cmd">
|
||||
<input type="text" id="cmdInput" placeholder="What do you want to build? (try: create new worker, deploy auth to gematria, search repos...)" onkeydown="if(event.key==='Enter')runCommand()">
|
||||
<input type="text" id="cmdInput" placeholder="What do you want to build? (try: create new worker, deploy auth, search repos...)" onkeydown="if(event.key==='Enter')runCommand()">
|
||||
<button onclick="runCommand()">Run</button>
|
||||
</div>
|
||||
|
||||
@@ -753,7 +763,7 @@ async function showTab(tab) {
|
||||
const agents = await api('squad');
|
||||
el.innerHTML = '<div class="section-title"><span>🤖</span> Squad Agents</div><div class="squad-grid">' +
|
||||
agents.map(a =>
|
||||
'<div class="agent"><div class="emoji">' + a.emoji + '</div><div class="info"><h4 style="color:' + a.color + '">' + a.name + '</h4>' +
|
||||
'<div class="agent"><div class="emoji">' + a.emoji + '</div><div class="info"><h4>' + a.name + ' <span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:' + a.color + '"></span></h4>' +
|
||||
'<p>@' + a.username + ' · ' + a.role + '</p></div></div>'
|
||||
).join('') + '</div>';
|
||||
}
|
||||
@@ -785,7 +795,7 @@ async function runCommand() {
|
||||
input.value = '';
|
||||
|
||||
const el = document.getElementById('content');
|
||||
el.innerHTML = '<div class="result"><p style="color:#FF1D6C">Processing: ' + esc(cmd) + '</p><pre>Analyzing intent...</pre></div>';
|
||||
el.innerHTML = '<div class="result"><p style="color:var(--text)">Processing: ' + esc(cmd) + '</p><pre>Analyzing intent...</pre></div>';
|
||||
|
||||
const r = await fetch('/api/command', {
|
||||
method: 'POST',
|
||||
@@ -804,7 +814,7 @@ async function runCommand() {
|
||||
if (data.suggestions) {
|
||||
html += '<div style="margin:12px 0"><p style="font-size:13px;font-weight:600;color:#ccc">Suggested Actions:</p>';
|
||||
data.suggestions.forEach(s => {
|
||||
html += '<div style="margin-top:6px"><span class="tag" style="color:#4CAF50">' + s.intent + '</span> <code style="color:#FF9800;font-size:12px">' + s.endpoint + '</code></div>';
|
||||
html += '<div style="margin-top:6px"><span class="tag" style="color:var(--text)">' + s.intent + '</span> <code style="color:var(--text);font-size:12px">' + s.endpoint + '</code></div>';
|
||||
});
|
||||
html += '</div>';
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@ account_id = "848cf0b18d51e0170e0d1537aec3505a"
|
||||
GITEA_URL = "https://git.blackroad.io"
|
||||
OLLAMA_URL = "https://ollama.gematria.blackroad.io"
|
||||
|
||||
routes = [
|
||||
{ pattern = "roadcode.blackroad.io/*", zone_name = "blackroad.io" }
|
||||
]
|
||||
[[routes]]
|
||||
pattern = "roadcode.blackroad.io/*"
|
||||
zone_name = "blackroad.io"
|
||||
|
||||
Reference in New Issue
Block a user