Signal Kernel

Kernel Console

State-first orchestration with a swappable kernel: iOS-grade affordances on top, a thick middleware core below, and a single command surface that can drive a richer web UI or a TUI.
( ^_^ ) gentle swarm, big brain
active field v1
Nodes: --
Kernel load: --
Ledger delta: --
VIEW

Surface Load Map

Heat spread
--

Rebalance Controls

Cycle state
steady

Intent Routes

Ops Timeline

Fleet Surface · tmux sessions

loading…
waiting for response…

Surfaces & Neighbors

probes idle
loading…

Kernel Routing

Adapter Matrix

Middleware Notes

State Ledger

Debug State

loading…

Events

loading…
" "") (str/replace #"" "") (str/replace #"<[^>]*>" "") (str/replace #"\\s{3,}" " ") (str/trim))) (defn truncate [s n] (if (> (count s) n) (str (subs s 0 n) "…") s)) (defn probe-url [url] (str "/probe?url=" (js/encodeURIComponent url))) (defn probe-surface! [item] (-> (js/fetch (probe-url (:url item))) (.then (fn [resp] (if (.-ok resp) (.json resp) (throw (js/Error. "probe failed"))))) (.then (fn [data] (let [ok (and (.-ok data) (= 200 (.-status data))) status (if ok "ok" "warn")] (assoc item :status status :ms (.-ms data) :updated (.toLocaleTimeString (js/Date.)) :lastModified (.-lastModified data))))) (.catch (fn [_] (assoc item :status "err" :updated (.toLocaleTimeString (js/Date.))))))) ;; --- Mutations --- (defn rebalance! [] (let [{:keys [aggressiveness nodes]} @state avg (avg-load nodes) factor (/ aggressiveness 100) next-nodes (mapv (fn [node] (let [delta (* factor (- avg (:load node))) next-load (-> (+ (:load node) delta) (max 10) (min (:capacity node)))] (assoc node :load next-load :temp (max 30 (min 70 (+ 30 (* 0.35 next-load))))))) nodes)] (swap! state assoc :nodes next-nodes :cycle-state "rebalance") (log-event! "Kernel rebalance executed" :ok))) (defn inject-surge! [] (swap! state update :nodes (fn [nodes] (mapv (fn [node] (if (= "core" (:zone node)) (update node :load #(+ % (rand-between 12 28))) node)) nodes))) (swap! state assoc :cycle-state "surge") (log-event! "Core surge injected into routing mesh" :warn)) (defn fetch-tmux! [] (swap! state assoc-in [:tmux :status] "fetching…") (let [url (str "/proxy?url=" (js/encodeURIComponent tmux-url))] (-> (js/fetch url) (.then (fn [resp] (if (.-ok resp) (.text resp) (throw (js/Error. "bad response"))))) (.then (fn [txt] (let [preview (-> txt strip-html (truncate 1200))] (swap! state assoc :tmux {:status "ok" :preview preview :updated (.toLocaleTimeString (js/Date.))}) (log-event! "tmux surface updated" :ok) (render!)))) (.catch (fn [_] (swap! state assoc-in [:tmux :status] "error") (log-event! "tmux surface failed" :warn) (render!))))))) (defn probe-surfaces! [] (swap! state assoc-in [:surfaces :status] "probing…") (let [items (get-in @state [:surfaces :items])] (-> (js/Promise.all (clj->js (map probe-surface! items))) (.then (fn [results] (swap! state assoc :surfaces {:status "ok" :items (js->clj results :keywordize-keys true)}) (log-event! "surface probes updated" :ok) (render!))) (.catch (fn [_] (swap! state assoc-in [:surfaces :status] "error") (log-event! "surface probes failed" :warn) (render!))))))) (defn tick! [] (swap! state update :nodes (fn [nodes] (mapv (fn [node] (let [drift (rand-between -6 6) next-load (-> (+ (:load node) drift) (max 8) (min (:capacity node)))] (assoc node :load next-load :temp (max 30 (min 70 (+ 30 (* 0.35 next-load))))))) nodes))) (when (:auto? @state) (let [{:keys [variance nodes]} @state spread (variance nodes)] (when (> spread variance) (rebalance!))))) ;; --- View builders --- (defn node-card [node] (let [load (:load node) pct-load (* 100 (/ load (:capacity node)))] (str "
" "
" (:id node) "
" "
zone " (:zone node) " · cap " (:capacity node) "
" "
" "
load " (js/Math.round load) " · temp " (js/Math.round (:temp node)) "°C
" "
" (if (> pct-load 80) "hot" "balanced") "
" "
"))) (defn route-row [route] (str "
" "
" (:name route) "
" "
" (:latency route) "ms · " (:flow route) "k/s
" "
")) (defn kernel-row [route] (str "
" "
" (:name route) "
" "
" (:target route) " · " (:policy route) "
" "
")) (defn interpretation-row [text idx] (str "
" "
" text "
" "
insight #" (inc idx) "
" "
")) (defn event-row [{:keys [msg kind ts]}] (str "
" "" ts " · " msg (when (= kind :warn) "alert") "
")) (defn adapter-card [adapter] (str "
" "
" (:name adapter) "
" "
status " (:status adapter) "
" "
lat " (:latency adapter) "ms · cost " (:cost adapter) "
" "
")) (defn ledger-item [item] (str "
" "" (:value item) "" "
" (:label item) "
" "
" (:note item) "
" "
")) (defn surface-row [item] (let [status (or (:status item) "idle") dot-class (case status "ok" "surface-dot ok" "warn" "surface-dot warn" "err" "surface-dot err" "surface-dot") meta (str (when-let [ms (:ms item)] (str ms "ms ")) (when-let [ts (:updated item)] (str "· " ts)))] (str "
" "
" (:name item) "
" "
" meta "
" "
"))) ;; --- DOM helpers --- (defn set-html! [id value] (when-let [el (.getElementById js/document id)] (set! (.-innerHTML el) value))) (defn set-text! [id value] (when-let [el (.getElementById js/document id)] (set! (.-textContent el) value))) (defn toggle-class! [el class-name on?] (when el (.toggle (.-classList el) class-name on?))) (defn sync-view! [view] (doseq [section (.querySelectorAll js/document ".view")] (toggle-class! section "active" (= view (.getAttribute section "data-view")))) (doseq [btn (.querySelectorAll js/document "[data-view]")] (toggle-class! btn "active" (= view (.getAttribute btn "data-view")))) (doseq [[id key] [["ios-overview" "overview"] ["ios-kernel" "kernel"] ["ios-ledger" "ledger"]]] (when-let [el (.getElementById js/document id)] (toggle-class! el "active" (= view key))))) (defn sync-debug! [{:keys [debug?] :as s}] (let [panel (.getElementById js/document "debug-panel")] (toggle-class! panel "active" debug?) (when debug? (set-text! "debug-state" (pr-str (dissoc s :events))) (set-text! "debug-events" (pr-str (:events s)))))) ;; --- Render --- (defn render! [] (let [{:keys [nodes routes events aggressiveness variance cycle-state interpretation kernel-routes adapters ledger view tmux surfaces] :as s} @state spread (variance nodes) total-load (reduce + (map :load nodes)) total-cap (reduce + (map :capacity nodes))] (set-html! "nodes" (str/join "" (map node-card nodes))) (set-html! "routes" (str/join "" (map route-row routes))) (set-html! "timeline" (str/join "" (map event-row (reverse events)))) (set-html! "interpretation" (str/join "" (map-indexed interpretation-row interpretation))) (set-html! "kernel-routing" (str/join "" (map kernel-row kernel-routes))) (set-html! "adapter-grid" (str/join "" (map adapter-card adapters))) (set-html! "ledger-list" (str/join "" (map ledger-item ledger))) (set-text! "aggressiveness-value" aggressiveness) (set-text! "variance-value" variance) (set-text! "heat-spread" (str (js/Math.round spread) " pts")) (set-text! "pill-nodes" (str "Nodes: " (count nodes))) (set-text! "pill-load" (str "Kernel load: " (js/Math.round (* 100 (/ total-load total-cap))) "%")) (set-text! "pill-ledger" (str "Ledger delta: " (js/Math.round (rand-between 1 4)) "%")) (set-text! "cycle-state" cycle-state) (set-text! "ios-status" (str "Auto: " (if (:auto? @state) "On" "Off") " · " cycle-state)) (set-text! "tmux-preview" (or (:preview tmux) "")) (set-text! "tmux-status" (str "status " (:status tmux) (when-let [ts (:updated tmux)] (str " · " ts)))) (set-html! "surface-list" (str/join "" (map surface-row (:items surfaces)))) (set-text! "surface-status" (str "probes " (:status surfaces))) (sync-view! view) (sync-debug! s))) ;; --- Bindings --- (defn bind! [] (when-let [el (.getElementById js/document "aggressiveness")] (.addEventListener el "input" (fn [e] (swap! state assoc :aggressiveness (js/parseInt (.. e -target -value))) (render!)))) (when-let [el (.getElementById js/document "target-variance")] (.addEventListener el "input" (fn [e] (swap! state assoc :variance (js/parseInt (.. e -target -value))) (render!)))) (when-let [el (.getElementById js/document "rebalance")] (.addEventListener el "click" (fn [_] (rebalance!) (render!)))) (when-let [el (.getElementById js/document "surge")] (.addEventListener el "click" (fn [_] (inject-surge!) (render!)))) (when-let [el (.getElementById js/document "toggle-auto")] (.addEventListener el "click" (fn [e] (swap! state update :auto? not) (set! (.-textContent e.target) (str "Auto: " (if (:auto? @state) "On" "Off"))) (render!)))) (when-let [el (.getElementById js/document "toggle-debug")] (.addEventListener el "click" (fn [_] (swap! state update :debug? not) (render!)))) (when-let [el (.getElementById js/document "tmux-refresh")] (.addEventListener el "click" (fn [_] (fetch-tmux!)))) (when-let [el (.getElementById js/document "tmux-open")] (.addEventListener el "click" (fn [_] (.open js/window tmux-url "_blank")))) (when-let [el (.getElementById js/document "surface-refresh")] (.addEventListener el "click" (fn [_] (probe-surfaces!)))) (when-let [el (.getElementById js/document "surface-open")] (.addEventListener el "click" (fn [_] (.open js/window observatory-url "_blank")))) (doseq [btn (.querySelectorAll js/document "#segmented button")] (.addEventListener btn "click" (fn [_] (swap! state assoc :view (.getAttribute btn "data-view")) (render!)))) (when-let [el (.getElementById js/document "ios-overview")] (.addEventListener el "click" (fn [_] (swap! state assoc :view "overview") (render!)))) (when-let [el (.getElementById js/document "ios-kernel")] (.addEventListener el "click" (fn [_] (swap! state assoc :view "kernel") (render!)))) (when-let [el (.getElementById js/document "ios-ledger")] (.addEventListener el "click" (fn [_] (swap! state assoc :view "ledger") (render!)))) (when-let [el (.getElementById js/document "ios-rebalance")] (.addEventListener el "click" (fn [_] (rebalance!) (render!)))))) ;; --- Init --- (defn ^:export init [] (log-event! "Kernel telemetry online" :ok) (log-event! "Variance monitor armed" :ok) (render!) (bind!) (fetch-tmux!) (probe-surfaces!) (js/setInterval (fn [] (tick!) (render!)) 1800) (js/setInterval (fn [] (probe-surfaces!)) 30000)) (init)