@kage-core/kage-graph-mcp 2.0.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +183 -11
- package/dist/daemon.js +153 -0
- package/dist/index.js +28 -2
- package/dist/kernel.js +1834 -35
- package/package.json +1 -1
- package/viewer/console.js +61 -0
- package/viewer/index.html +10 -1
package/package.json
CHANGED
package/viewer/console.js
CHANGED
|
@@ -780,4 +780,65 @@
|
|
|
780
780
|
fitView();
|
|
781
781
|
cancelAnimationFrame(G.raf); tick();
|
|
782
782
|
}
|
|
783
|
+
|
|
784
|
+
// ---- live feed (SSE from the local viewer daemon) ----
|
|
785
|
+
// Connects to /kage/events when this page is served by `kage viewer`. The
|
|
786
|
+
// hosted demo on GitHub Pages has no daemon: the stream never opens, so the
|
|
787
|
+
// panel stays hidden and the dashboard is otherwise unchanged.
|
|
788
|
+
var LIVE_CAP = 30;
|
|
789
|
+
var LIVE_LABEL = {
|
|
790
|
+
packet_written: ["+", "Memory written"],
|
|
791
|
+
packet_updated: ["✎", "Memory updated"],
|
|
792
|
+
recall_served: ["✓", "Recall served"],
|
|
793
|
+
stale_withheld: ["⊘", "Stale memory withheld"],
|
|
794
|
+
caller_answered: ["◆", "Graph answer served"],
|
|
795
|
+
stale_caught: ["⊘", "Stale memory caught"],
|
|
796
|
+
};
|
|
797
|
+
function liveRow(e) {
|
|
798
|
+
var kind = e.type === "value_event" ? ((e.event && e.event.kind) || "value_event") : e.type;
|
|
799
|
+
var meta = LIVE_LABEL[kind] || ["•", String(kind).replace(/_/g, " ")];
|
|
800
|
+
var row = el("div", "vev fresh " + kind);
|
|
801
|
+
row.appendChild(el("span", "vi", meta[0]));
|
|
802
|
+
var mid = el("div", "vt");
|
|
803
|
+
mid.appendChild(document.createTextNode(meta[1]));
|
|
804
|
+
if (kind === "recall_served" && e.event && e.event.tokens_saved > 0) {
|
|
805
|
+
mid.appendChild(document.createTextNode(" — saved "));
|
|
806
|
+
mid.appendChild(el("b", null, "~" + fmt(e.event.tokens_saved) + " tokens"));
|
|
807
|
+
} else if (e.title) {
|
|
808
|
+
mid.appendChild(document.createTextNode(" — "));
|
|
809
|
+
mid.appendChild(el("b", null, e.title));
|
|
810
|
+
}
|
|
811
|
+
row.appendChild(mid);
|
|
812
|
+
row.appendChild(el("span", "when", relTime(e.ts) || "just now"));
|
|
813
|
+
return row;
|
|
814
|
+
}
|
|
815
|
+
function initLive() {
|
|
816
|
+
if (typeof window.EventSource === "undefined") return;
|
|
817
|
+
var panel = document.getElementById("livePanel"), feed = document.getElementById("liveFeed");
|
|
818
|
+
if (!panel || !feed) return;
|
|
819
|
+
var es;
|
|
820
|
+
try { es = new EventSource("/kage/events"); } catch (err) { return; }
|
|
821
|
+
var opened = false;
|
|
822
|
+
es.onopen = function () {
|
|
823
|
+
opened = true;
|
|
824
|
+
panel.hidden = false;
|
|
825
|
+
if (!feed.childNodes.length) feed.appendChild(el("div", "empty", "Connected. New memories and value events stream in here live."));
|
|
826
|
+
};
|
|
827
|
+
es.onerror = function () {
|
|
828
|
+
// Never connected (no daemon behind this page): close and hide quietly.
|
|
829
|
+
// After a successful open, EventSource reconnects on its own — keep the panel.
|
|
830
|
+
if (!opened) { es.close(); panel.hidden = true; }
|
|
831
|
+
};
|
|
832
|
+
es.onmessage = function (msg) {
|
|
833
|
+
var e;
|
|
834
|
+
try { e = JSON.parse(msg.data); } catch (err) { return; }
|
|
835
|
+
if (!e || !e.type) return;
|
|
836
|
+
var placeholder = feed.querySelector(".empty");
|
|
837
|
+
if (placeholder) feed.removeChild(placeholder);
|
|
838
|
+
feed.className = "vfeed";
|
|
839
|
+
feed.insertBefore(liveRow(e), feed.firstChild);
|
|
840
|
+
while (feed.childNodes.length > LIVE_CAP) feed.removeChild(feed.lastChild);
|
|
841
|
+
};
|
|
842
|
+
}
|
|
843
|
+
initLive();
|
|
783
844
|
})();
|
package/viewer/index.html
CHANGED
|
@@ -95,6 +95,14 @@
|
|
|
95
95
|
.receipt .r-line b.warn { color: var(--warn); } .receipt .r-line b.gain { color: var(--gain); }
|
|
96
96
|
.receipt .r-foot { border-top: 1px dashed var(--line-strong); padding: 11px 24px; color: var(--faint); font: 400 11px/1.5 var(--mono); }
|
|
97
97
|
|
|
98
|
+
/* live feed (SSE from the local daemon; hidden on the hosted demo) */
|
|
99
|
+
.livedot { display: inline-block; width: 8px; height: 8px; border-radius: 99px; background: var(--gain); margin-right: 9px; animation: livepulse 2s ease infinite; }
|
|
100
|
+
@keyframes livepulse { 0%, 100% { box-shadow: 0 0 0 0 var(--gain-soft); } 50% { box-shadow: 0 0 0 6px var(--gain-soft); } }
|
|
101
|
+
.vev.fresh { animation: levin 1.2s ease; }
|
|
102
|
+
@keyframes levin { from { background: var(--gain-soft); } to { background: transparent; } }
|
|
103
|
+
.vev.packet_written .vi, .vev.packet_updated .vi { color: var(--memory); }
|
|
104
|
+
.vev.stale_caught .vi { color: var(--warn); }
|
|
105
|
+
|
|
98
106
|
/* gains timeline */
|
|
99
107
|
.vfeed { display: grid; }
|
|
100
108
|
.vev { display: grid; grid-template-columns: 20px 1fr auto; gap: 0 13px; align-items: baseline; padding: 11px 4px; border-top: 1px solid var(--line); }
|
|
@@ -298,6 +306,7 @@
|
|
|
298
306
|
<section class="section active" id="section-gains">
|
|
299
307
|
<div class="receipt" id="gainsHero"></div>
|
|
300
308
|
<div class="tiles" id="gainsTiles"></div>
|
|
309
|
+
<div class="panel" id="livePanel" hidden><h2><span class="livedot" aria-hidden="true"></span>Live <span class="sub">— memories and value events as they happen</span></h2><div id="liveFeed"></div></div>
|
|
301
310
|
<div class="panel"><h2>Value timeline <span class="sub">— every saved recall and withheld stale memory, as it happened</span></h2><div id="gainsTimeline"></div></div>
|
|
302
311
|
</section>
|
|
303
312
|
|
|
@@ -361,6 +370,6 @@
|
|
|
361
370
|
</div>
|
|
362
371
|
<div class="drawer-backdrop" id="detailBackdrop"></div>
|
|
363
372
|
<aside class="drawer" id="detail" aria-hidden="true"></aside>
|
|
364
|
-
<script src="./console.js?v=
|
|
373
|
+
<script src="./console.js?v=17"></script>
|
|
365
374
|
</body>
|
|
366
375
|
</html>
|