ELNOR REPO READER TEXT MIRROR Original path: Design Mockups/DOC20 Mockups/skills_connectors_mockup_v2.jsx Source repo: /Users/OpenClaw1/Elnor/Elnor Specs Git branch: main Git commit: dbaa25962edc11ab30e8d4ca1715f9ae5bf77331 Generated: 2026-06-09T01:23:58.539Z --- import { useState } from "react"; const CAPS = [ { id: "p1", name: "Create Caption Page for Brief", type: "learned_procedure", app: "Microsoft Word", status: "active", confidence: 0.82, lane: "approved_workspace", origin: "demonstration", uses: 47, lastUsed: "2h ago", desc: "Creates a formatted caption page with case name, court, and filing date for litigation briefs.", tags: ["litigation"], steps: [ { intent: "Navigate to caption page location", nature: "mechanical", detail: "Position cursor at the beginning of the document before any existing content." }, { intent: "Insert page break and section header", nature: "mechanical", detail: "Insert a page break, then add centered text with the court name in [Court Name] format." }, { intent: "Add case caption block", nature: "cognitive", detail: "Format the caption with [Plaintiff] v. [Defendant], Case No. [Case Number], aligned per court rules." }, { intent: "Add filing metadata", nature: "mechanical", detail: "Below caption, add filing date, document title, and attorney information block." }, ], triggers: ["caption page", "brief cover", "create caption"] }, { id: "p2", name: "Format Table of Authorities", type: "learned_procedure", app: "Microsoft Word", status: "active", confidence: 0.71, lane: "experimental_private", origin: "demonstration", uses: 12, lastUsed: "1d ago", desc: "Formats TOA entries with proper indentation, short citations, and page references per Bluebook style.", tags: ["citations"], steps: [], triggers: ["TOA", "table of authorities"] }, { id: "p3", name: "Draft Opposition Brief Structure", type: "learned_procedure", app: "Microsoft Word", status: "experimental", confidence: 0.58, lane: "experimental_private", origin: "demonstration", uses: 3, lastUsed: "5d ago", desc: "Creates the skeleton structure for an opposition brief with standard sections.", tags: ["drafting"], steps: [], triggers: ["opposition brief"] }, { id: "p4", name: "Extract Docket Entries", type: "learned_procedure", app: "Chrome", status: "stale", confidence: 0.64, lane: "approved_workspace", origin: "demonstration", uses: 28, lastUsed: "14d ago", desc: "Navigates court docket system and extracts relevant entries into a structured format.", tags: ["research"], steps: [], triggers: ["docket entries", "pull docket"] }, { id: "s1", name: "image-lab", type: "native_skill", app: "global", status: "active", confidence: null, lane: null, origin: "clawhub_installed", uses: 8, lastUsed: "3d ago", desc: "Generate or edit images via Gemini provider-backed image workflow.", tags: ["media"], steps: [], triggers: [] }, { id: "s2", name: "summarize", type: "native_skill", app: "global", status: "unavailable", confidence: null, lane: null, origin: "openclaw_bundled", uses: 0, lastUsed: null, desc: "Summarize documents, web pages, or conversation history. Requires: summarize CLI.", tags: ["productivity"], steps: [], triggers: [] }, { id: "m1", name: "linear.search_issues", type: "mcp_tool", app: "Linear", status: "active", confidence: null, lane: null, origin: "mcp_discovered", uses: 34, lastUsed: "4h ago", desc: "Search Linear issues by query, status, assignee, or label.", tags: ["project mgmt"], steps: [], triggers: [] }, { id: "m2", name: "gmail.send_email", type: "mcp_tool", app: "Gmail", status: "active", confidence: null, lane: null, origin: "mcp_discovered", uses: 19, lastUsed: "1d ago", desc: "Send email via connected Gmail account.", tags: ["email"], steps: [], triggers: [] }, { id: "t1", name: "exec", type: "system_tool", app: "global", status: "active", confidence: null, lane: null, origin: "system_builtin", uses: 312, lastUsed: "12m ago", desc: "Run shell commands and manage background processes.", tags: ["runtime"], steps: [], triggers: [] }, { id: "t2", name: "browser", type: "system_tool", app: "global", status: "active", confidence: null, lane: null, origin: "system_builtin", uses: 89, lastUsed: "1h ago", desc: "Control Chromium browser — navigate, click, screenshot, extract.", tags: ["web"], steps: [], triggers: [] }, { id: "d1", name: "Always use Bluebook citation format", type: "memory_directive", app: "Microsoft Word", status: "active", confidence: null, lane: null, origin: "demonstration", uses: null, lastUsed: null, desc: "When formatting citations in any legal document, always use Bluebook 21st Edition style.", tags: ["preference"], steps: [], triggers: [] }, { id: "sp1", name: "Auto-file incoming court notices", type: "standing_procedure", app: "Outlook", status: "active", confidence: null, lane: null, origin: "demonstration", uses: 15, lastUsed: "6h ago", desc: "When an email arrives from a court clerk, extract case number and file to the appropriate matter folder.", tags: ["automation"], steps: [], triggers: ["court notice"] }, ]; const TY = { learned_procedure: { l: "Learned", c: "#185FA5", bg: "#E6F1FB" }, native_skill: { l: "Skill", c: "#0F6E56", bg: "#E1F5EE" }, mcp_tool: { l: "MCP", c: "#534AB7", bg: "#EEEDFE" }, system_tool: { l: "System", c: "#5F5E5A", bg: "#F1EFE8" }, plugin_tool: { l: "Plugin", c: "#993C1D", bg: "#FAECE7" }, standing_procedure: { l: "Standing", c: "#854F0B", bg: "#FAEEDA" }, memory_directive: { l: "Memory", c: "#993556", bg: "#FBEAF0" }, }; const ST = { active: { d: "#1D9E75", l: "Active" }, degraded: { d: "#BA7517", l: "Degraded" }, stale: { d: "#BA7517", l: "Stale" }, disabled: { d: "#888780", l: "Disabled" }, experimental: { d: "#378ADD", l: "Experimental" }, unavailable: { d: "#E24B4A", l: "Unavailable" }, }; const TABS = ["My capabilities", "Connectors & accounts", "OpenClaw tools", "Expose Elnor", "Learn & teach", "Hub"]; const CONF_EVENTS = [ { d: "Apr 1", e: "Demonstrated", delta: "+0.95 α", up: true }, { d: "Apr 2", e: "Used successfully", delta: "+0.75 α", up: true }, { d: "Apr 3", e: "Used successfully", delta: "+0.75 α", up: true }, { d: "Apr 4", e: "Used successfully", delta: "+0.75 α", up: true }, { d: "Apr 5", e: "Correction after failure", delta: "+1.0 β", up: false }, { d: "Apr 6", e: "Fix validated", delta: "+0.25 α", up: true }, { d: "Apr 7", e: "Used successfully", delta: "+0.75 α", up: true }, { d: "Apr 8", e: "Used successfully", delta: "+0.75 α", up: true }, ]; const USAGE = [ { t: "2 hours ago", o: "success", ctx: "Paramount v. LA brief prep" }, { t: "Yesterday", o: "success", ctx: "Brooge Energy filing" }, { t: "2 days ago", o: "success", ctx: "Caption page for motion" }, { t: "3 days ago", o: "failure", ctx: "Template mismatch — wrong court" }, { t: "4 days ago", o: "success", ctx: "Opposition brief caption" }, { t: "5 days ago", o: "success", ctx: "Reply brief caption" }, ]; function Badge({ type }) { const t = TY[type]; return {t.l}; } function Dot({ status }) { const s = ST[status] || ST.active; return {s.l}; } function CBar({ v }) { const p = Math.round(v * 100); const c = v >= 0.7 ? "#1D9E75" : v >= 0.5 ? "#BA7517" : "#E24B4A"; return
{p}%
; } function Card({ cap, onClick, selected }) { return
{cap.name}
{cap.app !== "global" && {cap.app}}

{cap.desc}

{cap.uses !== null ? `${cap.uses} uses` : "—"}{cap.lastUsed ? ` · ${cap.lastUsed}` : ""} {cap.confidence !== null &&
}
{cap.lane === "experimental_private" && ( experimental )}
; } function Drawer({ cap, onClose }) { const [sec, setSec] = useState("contract"); const isProc = cap.type === "learned_procedure"; const isEditable = ["learned_procedure", "standing_procedure", "memory_directive"].includes(cap.type); const tabs = isProc ? ["contract", "confidence", "usage", "provenance", "linked"] : cap.type === "memory_directive" ? ["contract", "provenance"] : cap.type === "native_skill" ? ["content", "usage", "provenance"] : ["details", "usage"]; return
{/* Header */}

{cap.name}

{cap.app !== "global" && {cap.app}} {cap.lane && {cap.lane.replace("_", " ")}}

{cap.desc}

{/* Section tabs */}
{tabs.map(t => )}
{/* Content */}
{sec === "contract" && isProc && <>
Trigger phrases
{(cap.triggers || []).map((t, i) => "{t}")}
Steps ({cap.steps?.length || 0})
{(cap.steps || []).map((s, i) =>
{i + 1}. {s.intent} {s.nature}

{s.detail}

)} } {sec === "contract" && cap.type === "memory_directive" &&
type: preference{"\n"}assertion_class: constraint{"\n"}scope: app_specific (Microsoft Word){"\n"}priority: absolute{"\n"}applies_when: formatting citations in legal documents{"\n"}injection_format: imperative
} {sec === "confidence" && <>
{Math.round(cap.confidence * 100)}% α: 5.70 · β: 1.25
{[48,56,62,67,71,74,70,65,68,72,75,78,80,82].map((v, i) =>
= 70 ? "#1D9E75" : "#BA7517", height: `${v * 0.5}px`, borderRadius: "2px 2px 0 0", opacity: 0.5 + (i / 20) }} />)}
Confidence events
{CONF_EVENTS.map((ev, i) =>
{ev.d} {ev.e} {ev.delta}
)} } {sec === "usage" && <>
{[{ l: "Total uses", v: cap.uses || 0 }, { l: "Success rate", v: "87%" }, { l: "Last used", v: cap.lastUsed || "Never" }].map((m, i) =>
{m.l}
{m.v}
)}
Recent invocations
{USAGE.map((u, i) =>
{u.ctx} {u.t}
Elnor · {u.o}
)} } {sec === "provenance" && <>
Created via
Demonstration session
Date: Apr 1, 2026{"\n"}Target: Microsoft Word 16.94{"\n"}Fidelity: 0.78 (amber){"\n"}Quick promoted: No{"\n"}Reviewed: Yes — full review{"\n"}Session: learn-abc-123
Edit history
Apr 3 — Step 3 edited (user_explicitly_stated)
Apr 4 — Trigger phrase added: "brief cover"
Apr 5 — Promoted to approved_workspace
} {sec === "linked" && <>
Goals served
Produce court-ready litigation documents 3 procedures linked
Related procedures
{["Format Table of Authorities", "Draft Opposition Brief Structure"].map((n, i) =>
{n} {i === 0 ? "same app" : "requires this"}
)}
Related memory directives
Always use Bluebook citation format Microsoft Word
} {(sec === "details" || sec === "content") &&
{cap.type === "system_tool" ? `Tool: ${cap.name}\nGroup: group:runtime\nProfiles: coding, full\nStatus: Allowed\n\nConfigure in Settings → Tools` : cap.type === "mcp_tool" ? `Server: ${cap.app}\nTool: ${cap.name}\nHealth: Healthy\nLast check: 3 min ago` : `Source: ${cap.origin.replace("_", " ")}\nVersion: 1.2.0\nRequirements: uv, GEMINI_API_KEY\nStatus: ${cap.status}`}
}
{/* Actions */}
{isEditable && } {cap.lane === "experimental_private" && } {isProc && } {cap.type === "native_skill" && } {cap.type === "mcp_tool" && } {cap.type === "system_tool" && }
{isEditable && }
; } function ConnectorsTab() { const conns = [ { name: "Gmail", id: "will@schallfirm.com", tools: 8, icon: "✉", status: "connected" }, { name: "Microsoft 365", id: "will@schallfirm.com", tools: 14, icon: "◆", status: "connected" }, { name: "Linear", id: "will@schallfirm.com", tools: 6, icon: "◇", status: "connected" }, ]; return
3 services connected
{conns.map((c, i) =>
{c.icon}
{c.name}
{c.id} · {c.tools} tools
)}
; } function LearnTab() { return
Start learning
{[ { t: "Watch me do this", d: "Demonstrate a task while Elnor observes" }, { t: "Let me coach you", d: "Guide Elnor through a task step by step" }, { t: "Import a skill", d: "Import a SKILL.md file or paste content" }, { t: "Import from clipboard", d: "Paste a skill definition directly" }, ].map((a, i) =>
{a.t}
{a.d}
)}
Pending review (2)
{[{ n: "Auto-generate email summary", c: 72 }, { n: "Excel pivot table from template", c: 61 }].map((p, i) =>
{p.n}
Confidence: {p.c}%
)}
; } export default function App() { const [tab, setTab] = useState(0); const [sel, setSel] = useState(null); const [tf, setTf] = useState("all"); const [sq, setSq] = useState(""); const filtered = CAPS.filter(c => { if (tf !== "all" && c.type !== tf) return false; if (sq && !c.name.toLowerCase().includes(sq.toLowerCase()) && !c.desc.toLowerCase().includes(sq.toLowerCase())) return false; return true; }); return

Skills & connectors

Browse, manage, and extend Elnor's capabilities

{TABS.map((t, i) => )}
{tab === 0 && <>
setSq(e.target.value)} style={{ flex: "1 1 200px", minWidth: 0 }} />
{filtered.map(c => setSel(sel?.id === c.id ? null : c)} />)}
{filtered.length === 0 &&

No capabilities match your filters.

} {sel && setSel(null)} />} } {tab === 1 && } {tab === 4 && } {tab === 2 &&

OpenClaw tool catalog

Browse 13,700+ skills on ClawHub, manage installed plugins

} {tab === 3 &&
Elnor MCP server
Let external AI models access your capabilities
When enabled, external LLMs (Claude, ChatGPT, Cursor) can connect to Elnor via MCP and access your approved capabilities. You control what's exposed, what knowledge scope is visible, and whether external models can execute actions or only read.
} {tab === 5 &&

Coming soon

Community capabilities, curated packs, and third-party plugins.

}
; }