@pcircle/memesh 4.9.4 → 4.10.1
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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +1 -1
- package/AGENTS.md +35 -4
- package/README.de.md +3 -3
- package/README.md +3 -3
- package/README.zh-TW.md +3 -3
- package/dashboard/dist/index.html +8 -8
- package/dist/cli/view-live.d.ts.map +1 -1
- package/dist/cli/view-live.js +0 -427
- package/dist/cli/view-live.js.map +1 -1
- package/dist/core/briefing-index.d.ts +30 -0
- package/dist/core/briefing-index.d.ts.map +1 -0
- package/dist/core/briefing-index.js +140 -0
- package/dist/core/briefing-index.js.map +1 -0
- package/dist/core/briefing.d.ts +4 -0
- package/dist/core/briefing.d.ts.map +1 -1
- package/dist/core/briefing.js +42 -4
- package/dist/core/briefing.js.map +1 -1
- package/dist/core/capture-liveness.d.ts +136 -0
- package/dist/core/capture-liveness.d.ts.map +1 -0
- package/dist/core/capture-liveness.js +447 -0
- package/dist/core/capture-liveness.js.map +1 -0
- package/dist/core/config.d.ts +1 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +3 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/delegation.d.ts +47 -0
- package/dist/core/delegation.d.ts.map +1 -0
- package/dist/core/delegation.js +174 -0
- package/dist/core/delegation.js.map +1 -0
- package/dist/core/doctor-fixes.d.ts +1 -0
- package/dist/core/doctor-fixes.d.ts.map +1 -1
- package/dist/core/doctor-fixes.js +21 -0
- package/dist/core/doctor-fixes.js.map +1 -1
- package/dist/core/doctor.d.ts +8 -0
- package/dist/core/doctor.d.ts.map +1 -1
- package/dist/core/doctor.js +148 -3
- package/dist/core/doctor.js.map +1 -1
- package/dist/core/note-derive.d.ts +14 -0
- package/dist/core/note-derive.d.ts.map +1 -0
- package/dist/core/note-derive.js +66 -0
- package/dist/core/note-derive.js.map +1 -0
- package/dist/core/note-ingest.d.ts +34 -0
- package/dist/core/note-ingest.d.ts.map +1 -0
- package/dist/core/note-ingest.js +445 -0
- package/dist/core/note-ingest.js.map +1 -0
- package/dist/core/operations.d.ts +10 -1
- package/dist/core/operations.d.ts.map +1 -1
- package/dist/core/operations.js +129 -14
- package/dist/core/operations.js.map +1 -1
- package/dist/core/paths.d.ts.map +1 -1
- package/dist/core/paths.js.map +1 -1
- package/dist/core/schema-export.d.ts.map +1 -1
- package/dist/core/schema-export.js +10 -4
- package/dist/core/schema-export.js.map +1 -1
- package/dist/core/serializer.d.ts.map +1 -1
- package/dist/core/serializer.js +3 -0
- package/dist/core/serializer.js.map +1 -1
- package/dist/core/session-insight.d.ts +44 -0
- package/dist/core/session-insight.d.ts.map +1 -0
- package/dist/core/session-insight.js +216 -0
- package/dist/core/session-insight.js.map +1 -0
- package/dist/core/task-state-store.d.ts +4 -0
- package/dist/core/task-state-store.d.ts.map +1 -1
- package/dist/core/task-state-store.js +18 -5
- package/dist/core/task-state-store.js.map +1 -1
- package/dist/core/turn-signal.d.ts +22 -0
- package/dist/core/turn-signal.d.ts.map +1 -0
- package/dist/core/turn-signal.js +89 -0
- package/dist/core/turn-signal.js.map +1 -0
- package/dist/core/types.d.ts +12 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/update-entrypoint.d.ts +19 -0
- package/dist/core/update-entrypoint.d.ts.map +1 -0
- package/dist/core/update-entrypoint.js +222 -0
- package/dist/core/update-entrypoint.js.map +1 -0
- package/dist/core/update-notice.d.ts +69 -0
- package/dist/core/update-notice.d.ts.map +1 -0
- package/dist/core/update-notice.js +188 -0
- package/dist/core/update-notice.js.map +1 -0
- package/dist/host-runtime/codex-session.d.ts +10 -0
- package/dist/host-runtime/codex-session.d.ts.map +1 -1
- package/dist/host-runtime/codex-session.js +1 -1
- package/dist/host-runtime/codex-session.js.map +1 -1
- package/dist/knowledge-graph.d.ts.map +1 -1
- package/dist/knowledge-graph.js +24 -3
- package/dist/knowledge-graph.js.map +1 -1
- package/dist/mcp/THIRD_PARTY_NOTICES.txt +2 -2
- package/dist/mcp/server.js +1079 -90
- package/dist/mcp/server.js.map +3 -3
- package/dist/skills-manifest.json +46 -26
- package/dist/transports/cli/cli.d.ts.map +1 -1
- package/dist/transports/cli/cli.js +7702 -5764
- package/dist/transports/cli/cli.js.map +3 -3
- package/dist/transports/http/server.d.ts.map +1 -1
- package/dist/transports/http/server.js +38 -27
- package/dist/transports/http/server.js.map +1 -1
- package/dist/transports/mcp/handlers.d.ts +25 -5
- package/dist/transports/mcp/handlers.d.ts.map +1 -1
- package/dist/transports/mcp/handlers.js +43 -5
- package/dist/transports/mcp/handlers.js.map +1 -1
- package/dist/transports/schemas.d.ts +4 -2
- package/dist/transports/schemas.d.ts.map +1 -1
- package/dist/transports/schemas.js +29 -3
- package/dist/transports/schemas.js.map +1 -1
- package/docs/platforms/README.md +1 -0
- package/docs/platforms/agent-messaging.md +22 -5
- package/package.json +14 -4
- package/scripts/hooks/_generated/briefing-index.js +147 -0
- package/scripts/hooks/_generated/capture-liveness.js +454 -0
- package/scripts/hooks/_generated/update-notice.js +195 -0
- package/scripts/hooks/_shared.js +302 -14
- package/scripts/hooks/_stop-notes.js +504 -0
- package/scripts/hooks/auto-update-runner.mjs +22 -0
- package/scripts/hooks/decision-nudge.js +32 -5
- package/scripts/hooks/guard-check.js +30 -3
- package/scripts/hooks/post-commit.js +329 -133
- package/scripts/hooks/pre-compact.js +17 -2
- package/scripts/hooks/pre-edit-recall.js +32 -1
- package/scripts/hooks/session-start.js +361 -78
- package/scripts/hooks/session-summary.js +217 -41
- package/scripts/hooks/user-prompt-intent.js +89 -19
- package/skills/memesh/SKILL.md +20 -8
- package/dist/cli/assets/d3.v7.min.js +0 -2
- package/dist/core/graph.d.ts +0 -26
- package/dist/core/graph.d.ts.map +0 -1
- package/dist/core/graph.js +0 -74
- package/dist/core/graph.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-live.d.ts","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-live.d.ts","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"AAWA,wBAAgB,yBAAyB,IAAI,MAAM,CAo/ClD"}
|
package/dist/cli/view-live.js
CHANGED
|
@@ -1,10 +1,3 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import path from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
-
const bundledD3 = fs
|
|
6
|
-
.readFileSync(path.join(moduleDir, 'assets', 'd3.v7.min.js'), 'utf8')
|
|
7
|
-
.replace(/<\/script/gi, '<\\/script');
|
|
8
1
|
export function generateLiveDashboardHtml() {
|
|
9
2
|
const CSS = `
|
|
10
3
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
|
|
@@ -287,35 +280,6 @@ export function generateLiveDashboardHtml() {
|
|
|
287
280
|
.bar-count { width: 36px; text-align: right; color: var(--text-muted); flex-shrink: 0; font-family: var(--font-mono); font-size: 12px; }
|
|
288
281
|
.tag-cloud { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
289
282
|
|
|
290
|
-
/* Timeline */
|
|
291
|
-
.chain { display: flex; align-items: center; flex-wrap: wrap; gap: 0; margin-bottom: 16px; padding: 16px; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: var(--radius); }
|
|
292
|
-
.chain-node { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 8px 14px; font-size: 13px; position: relative; transition: border-color 0.15s; }
|
|
293
|
-
.chain-node:hover { border-color: var(--accent); }
|
|
294
|
-
.chain-node.archived { opacity: 0.4; }
|
|
295
|
-
.chain-node .cn-name { font-weight: 600; color: var(--text-primary); }
|
|
296
|
-
.chain-node .cn-type { font-size: 11px; color: var(--text-muted); font-family: var(--font-mono); }
|
|
297
|
-
.chain-arrow { font-size: 16px; color: var(--accent); padding: 0 8px; flex-shrink: 0; opacity: 0.6; }
|
|
298
|
-
|
|
299
|
-
/* Graph */
|
|
300
|
-
.graph-svg-wrap { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; position: relative; }
|
|
301
|
-
.graph-svg-wrap svg { width: 100%; height: 520px; display: block; }
|
|
302
|
-
.graph-controls { display: flex; gap: 8px; margin-bottom: 12px; align-items: center; font-size: 12px; color: var(--text-muted); }
|
|
303
|
-
|
|
304
|
-
/* Graph tooltip */
|
|
305
|
-
.graph-tooltip {
|
|
306
|
-
position: absolute;
|
|
307
|
-
background: var(--bg-card);
|
|
308
|
-
border: 1px solid var(--border);
|
|
309
|
-
border-radius: var(--radius-sm);
|
|
310
|
-
padding: 12px 16px;
|
|
311
|
-
font-size: 12px;
|
|
312
|
-
pointer-events: none;
|
|
313
|
-
backdrop-filter: blur(12px);
|
|
314
|
-
box-shadow: var(--shadow-lg);
|
|
315
|
-
max-width: 280px;
|
|
316
|
-
z-index: 10;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
283
|
/* Manage */
|
|
320
284
|
.manage-action-cell { display: flex; gap: 6px; flex-wrap: wrap; }
|
|
321
285
|
|
|
@@ -412,14 +376,6 @@ export function generateLiveDashboardHtml() {
|
|
|
412
376
|
return value;
|
|
413
377
|
}
|
|
414
378
|
|
|
415
|
-
function graphData(value) {
|
|
416
|
-
if (!value || typeof value !== 'object'
|
|
417
|
-
|| !Array.isArray(value.entities) || !Array.isArray(value.relations)) {
|
|
418
|
-
throw new Error('Invalid graph response');
|
|
419
|
-
}
|
|
420
|
-
return value;
|
|
421
|
-
}
|
|
422
|
-
|
|
423
379
|
function configData(response) {
|
|
424
380
|
var value = successData(response, 'config');
|
|
425
381
|
if (!value || typeof value !== 'object' || !value.config
|
|
@@ -444,14 +400,6 @@ export function generateLiveDashboardHtml() {
|
|
|
444
400
|
// Theme is persisted client-side in localStorage only. An earlier
|
|
445
401
|
// POST /v1/config { theme } wrote a config.theme that nothing ever
|
|
446
402
|
// read back; removed with that dead field.
|
|
447
|
-
// Update graph label colors if graph has been rendered
|
|
448
|
-
var newLabelColor = isLight ? '#09090b' : '#fafafa';
|
|
449
|
-
var graphWrap = document.getElementById('graph-svg-wrap');
|
|
450
|
-
if (graphWrap) {
|
|
451
|
-
graphWrap.querySelectorAll('svg g text:not([font-size="9"])').forEach(function(el) {
|
|
452
|
-
el.setAttribute('fill', newLabelColor);
|
|
453
|
-
});
|
|
454
|
-
}
|
|
455
403
|
});
|
|
456
404
|
}
|
|
457
405
|
})();
|
|
@@ -466,9 +414,7 @@ export function generateLiveDashboardHtml() {
|
|
|
466
414
|
document.querySelectorAll('.tab-content').forEach(function (el) { el.classList.remove('active'); });
|
|
467
415
|
document.getElementById('tab-' + tab).classList.add('active');
|
|
468
416
|
if (tab === 'browse') loadBrowse();
|
|
469
|
-
if (tab === 'graph') loadGraph();
|
|
470
417
|
if (tab === 'analytics') loadAnalytics();
|
|
471
|
-
if (tab === 'timeline') loadTimeline();
|
|
472
418
|
if (tab === 'manage') loadManage();
|
|
473
419
|
if (tab === 'settings') loadSettings();
|
|
474
420
|
});
|
|
@@ -705,225 +651,6 @@ export function generateLiveDashboardHtml() {
|
|
|
705
651
|
browseFilter.addEventListener('input', function () { renderBrowseTable(this.value); });
|
|
706
652
|
document.getElementById('browse-refresh').addEventListener('click', loadBrowse);
|
|
707
653
|
|
|
708
|
-
// ---- Graph tab ----
|
|
709
|
-
var graphLoaded = false;
|
|
710
|
-
|
|
711
|
-
async function loadGraph() {
|
|
712
|
-
if (graphLoaded) return;
|
|
713
|
-
graphLoaded = true;
|
|
714
|
-
var wrap = document.getElementById('graph-svg-wrap');
|
|
715
|
-
showSpinner(wrap);
|
|
716
|
-
try {
|
|
717
|
-
var data = await apiCall('GET', '/v1/graph');
|
|
718
|
-
var graph = graphData(successData(data, 'graph'));
|
|
719
|
-
renderGraph(graph.entities, graph.relations, wrap);
|
|
720
|
-
} catch (err) {
|
|
721
|
-
showError(wrap, err.message);
|
|
722
|
-
graphLoaded = false;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
function renderGraph(entities, relations, container) {
|
|
727
|
-
container.textContent = '';
|
|
728
|
-
|
|
729
|
-
if (entities.length === 0) {
|
|
730
|
-
showPlaceholder(container, 'No entities yet. Start remembering to build your graph.');
|
|
731
|
-
return;
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
var svgNS = 'http://www.w3.org/2000/svg';
|
|
735
|
-
var svg = document.createElementNS(svgNS, 'svg');
|
|
736
|
-
svg.setAttribute('width', '100%');
|
|
737
|
-
svg.setAttribute('height', '520');
|
|
738
|
-
container.appendChild(svg);
|
|
739
|
-
|
|
740
|
-
var width = container.clientWidth || 900;
|
|
741
|
-
var height = 520;
|
|
742
|
-
|
|
743
|
-
// Only show top connected nodes to keep graph readable
|
|
744
|
-
var MAX_NODES = 60;
|
|
745
|
-
var degreeMap = {};
|
|
746
|
-
relations.forEach(function (r) {
|
|
747
|
-
degreeMap[r.from] = (degreeMap[r.from] || 0) + 1;
|
|
748
|
-
degreeMap[r.to] = (degreeMap[r.to] || 0) + 1;
|
|
749
|
-
});
|
|
750
|
-
|
|
751
|
-
var topNames;
|
|
752
|
-
if (Object.keys(degreeMap).length > 0) {
|
|
753
|
-
topNames = new Set(
|
|
754
|
-
Object.entries(degreeMap)
|
|
755
|
-
.sort(function (a, b) { return b[1] - a[1]; })
|
|
756
|
-
.slice(0, MAX_NODES)
|
|
757
|
-
.map(function (e) { return e[0]; })
|
|
758
|
-
);
|
|
759
|
-
} else {
|
|
760
|
-
topNames = new Set(entities.slice(0, MAX_NODES).map(function (e) { return e.name; }));
|
|
761
|
-
}
|
|
762
|
-
|
|
763
|
-
var graphEntities = entities.filter(function (e) { return topNames.has(e.name); });
|
|
764
|
-
if (graphEntities.length === 0) graphEntities = entities.slice(0, MAX_NODES);
|
|
765
|
-
|
|
766
|
-
var colorPalette = ['#3b82f6','#8b5cf6','#10b981','#f59e0b','#ef4444','#06b6d4','#ec4899','#84cc16','#f97316','#6366f1'];
|
|
767
|
-
var typeColorMap = {};
|
|
768
|
-
var colorIdx = 0;
|
|
769
|
-
graphEntities.forEach(function (e) {
|
|
770
|
-
if (!typeColorMap[e.type]) {
|
|
771
|
-
typeColorMap[e.type] = colorPalette[colorIdx % colorPalette.length];
|
|
772
|
-
colorIdx++;
|
|
773
|
-
}
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
// Build nodes and links
|
|
777
|
-
var nodeMap = {};
|
|
778
|
-
var nodes = graphEntities.map(function (e, i) {
|
|
779
|
-
var firstObs = (e.observations && e.observations.length > 0) ? e.observations[0] : null;
|
|
780
|
-
var n = { id: e.name, type: e.type, status: e.status, obs: e.observations ? e.observations.length : 0, firstObs: firstObs, x: 0, y: 0, vx: 0, vy: 0, fx: null, fy: null };
|
|
781
|
-
nodeMap[e.name] = n;
|
|
782
|
-
return n;
|
|
783
|
-
});
|
|
784
|
-
|
|
785
|
-
var links = relations
|
|
786
|
-
.filter(function (r) { return nodeMap[r.from] && nodeMap[r.to]; })
|
|
787
|
-
.map(function (r) { return { source: r.from, target: r.to, type: r.type }; });
|
|
788
|
-
|
|
789
|
-
// Force simulation using pure JS (no D3 needed for basic layout)
|
|
790
|
-
// Initialize positions in a circle
|
|
791
|
-
nodes.forEach(function (n, i) {
|
|
792
|
-
var angle = (2 * Math.PI * i) / nodes.length;
|
|
793
|
-
var r = Math.min(width, height) * 0.35;
|
|
794
|
-
n.x = width / 2 + r * Math.cos(angle);
|
|
795
|
-
n.y = height / 2 + r * Math.sin(angle);
|
|
796
|
-
});
|
|
797
|
-
|
|
798
|
-
// Create SVG elements using D3 (bundled)
|
|
799
|
-
var d3svg = d3.select(svg);
|
|
800
|
-
d3svg.attr('viewBox', [0, 0, width, height]);
|
|
801
|
-
|
|
802
|
-
// Defs: arrow marker + glow filter + grid pattern
|
|
803
|
-
var defs = d3svg.append('defs');
|
|
804
|
-
|
|
805
|
-
// Arrow marker
|
|
806
|
-
defs.append('marker')
|
|
807
|
-
.attr('id', 'arrow')
|
|
808
|
-
.attr('viewBox', '0 0 10 10').attr('refX', 20).attr('refY', 5)
|
|
809
|
-
.attr('markerWidth', 6).attr('markerHeight', 6).attr('orient', 'auto')
|
|
810
|
-
.append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z').attr('fill', 'rgba(59,130,246,0.4)');
|
|
811
|
-
|
|
812
|
-
// Glow filter
|
|
813
|
-
var filter = defs.append('filter').attr('id', 'node-glow').attr('x', '-50%').attr('y', '-50%').attr('width', '200%').attr('height', '200%');
|
|
814
|
-
filter.append('feGaussianBlur').attr('stdDeviation', '3').attr('result', 'coloredBlur');
|
|
815
|
-
var feMerge = filter.append('feMerge');
|
|
816
|
-
feMerge.append('feMergeNode').attr('in', 'coloredBlur');
|
|
817
|
-
feMerge.append('feMergeNode').attr('in', 'SourceGraphic');
|
|
818
|
-
|
|
819
|
-
// Grid pattern background
|
|
820
|
-
var gridSize = 32;
|
|
821
|
-
var gridPattern = defs.append('pattern')
|
|
822
|
-
.attr('id', 'grid').attr('width', gridSize).attr('height', gridSize)
|
|
823
|
-
.attr('patternUnits', 'userSpaceOnUse');
|
|
824
|
-
gridPattern.append('path')
|
|
825
|
-
.attr('d', 'M ' + gridSize + ' 0 L 0 0 0 ' + gridSize)
|
|
826
|
-
.attr('fill', 'none').attr('stroke', 'rgba(39,39,42,0.4)').attr('stroke-width', '0.5');
|
|
827
|
-
|
|
828
|
-
// Background rect with grid
|
|
829
|
-
d3svg.append('rect')
|
|
830
|
-
.attr('width', width).attr('height', height)
|
|
831
|
-
.attr('fill', 'url(#grid)');
|
|
832
|
-
|
|
833
|
-
var g = d3svg.append('g');
|
|
834
|
-
|
|
835
|
-
d3svg.call(d3.zoom().scaleExtent([0.2, 5]).on('zoom', function (event) {
|
|
836
|
-
g.attr('transform', event.transform);
|
|
837
|
-
}));
|
|
838
|
-
|
|
839
|
-
var linkSel = g.append('g')
|
|
840
|
-
.selectAll('line').data(links).join('line')
|
|
841
|
-
.attr('stroke', 'rgba(59,130,246,0.25)').attr('stroke-width', 1.5)
|
|
842
|
-
.attr('marker-end', 'url(#arrow)');
|
|
843
|
-
|
|
844
|
-
var linkLabel = g.append('g')
|
|
845
|
-
.selectAll('text').data(links).join('text')
|
|
846
|
-
.attr('font-size', 9).attr('fill', 'rgba(113,113,122,0.8)').attr('text-anchor', 'middle')
|
|
847
|
-
.attr('font-family', 'JetBrains Mono, ui-monospace, monospace')
|
|
848
|
-
.text(function (d) { return d.type; });
|
|
849
|
-
|
|
850
|
-
var nodeSel = g.append('g')
|
|
851
|
-
.selectAll('circle').data(nodes).join('circle')
|
|
852
|
-
.attr('r', function (d) { return Math.max(6, Math.min(20, 6 + d.obs * 1.5)); })
|
|
853
|
-
.attr('fill', function (d) { return typeColorMap[d.type] || '#3b82f6'; })
|
|
854
|
-
.attr('stroke', 'rgba(9,9,11,0.8)').attr('stroke-width', 1.5)
|
|
855
|
-
.attr('opacity', function (d) { return d.status === 'archived' ? 0.3 : 0.9; })
|
|
856
|
-
.attr('filter', function (d) { return d.status === 'archived' ? null : 'url(#node-glow)'; })
|
|
857
|
-
.style('cursor', 'pointer')
|
|
858
|
-
.call(d3.drag()
|
|
859
|
-
.on('start', function (event, d) { if (!event.active) sim.alphaTarget(0.3).restart(); d.fx = d.x; d.fy = d.y; })
|
|
860
|
-
.on('drag', function (event, d) { d.fx = event.x; d.fy = event.y; })
|
|
861
|
-
.on('end', function (event, d) { if (!event.active) sim.alphaTarget(0); d.fx = null; d.fy = null; }));
|
|
862
|
-
|
|
863
|
-
// Hover pulse effect
|
|
864
|
-
nodeSel.on('mouseenter', function () {
|
|
865
|
-
d3.select(this).attr('stroke', '#3b82f6').attr('stroke-width', 2.5);
|
|
866
|
-
}).on('mouseleave', function () {
|
|
867
|
-
d3.select(this).attr('stroke', 'rgba(9,9,11,0.8)').attr('stroke-width', 1.5);
|
|
868
|
-
});
|
|
869
|
-
|
|
870
|
-
var labelColor = document.body.classList.contains('light') ? '#09090b' : '#fafafa';
|
|
871
|
-
var labelSel = g.append('g')
|
|
872
|
-
.selectAll('text').data(nodes).join('text')
|
|
873
|
-
.attr('font-size', 11).attr('fill', labelColor).attr('dy', 4)
|
|
874
|
-
.attr('font-family', 'Inter, system-ui, sans-serif').attr('font-weight', '500')
|
|
875
|
-
.text(function (d) {
|
|
876
|
-
var label = d.firstObs ? d.firstObs : d.id;
|
|
877
|
-
return label.length > 25 ? label.slice(0, 25) + '\u2026' : label;
|
|
878
|
-
});
|
|
879
|
-
|
|
880
|
-
// Tooltip
|
|
881
|
-
var ttEl = document.getElementById('live-tooltip');
|
|
882
|
-
nodeSel.on('mouseover', function (event, d) {
|
|
883
|
-
ttEl.style.display = 'block';
|
|
884
|
-
var obsPreview = d.firstObs ? (d.firstObs.length > 80 ? d.firstObs.slice(0, 80) + '\u2026' : d.firstObs) : '(no observations)';
|
|
885
|
-
ttEl.querySelector('.tt-name').textContent = obsPreview;
|
|
886
|
-
ttEl.querySelector('.tt-type').textContent = d.type + (d.status === 'archived' ? ' \u2014 archived' : '');
|
|
887
|
-
ttEl.querySelector('.tt-obs').textContent = d.id + ' \u00b7 ' + d.obs + ' observation' + (d.obs !== 1 ? 's' : '');
|
|
888
|
-
}).on('mousemove', function (event) {
|
|
889
|
-
ttEl.style.left = (event.pageX + 14) + 'px';
|
|
890
|
-
ttEl.style.top = (event.pageY - 10) + 'px';
|
|
891
|
-
}).on('mouseout', function () { ttEl.style.display = 'none'; });
|
|
892
|
-
|
|
893
|
-
var sim = d3.forceSimulation(nodes)
|
|
894
|
-
.force('link', d3.forceLink(links).id(function (d) { return d.id; }).distance(150))
|
|
895
|
-
.force('charge', d3.forceManyBody().strength(-400))
|
|
896
|
-
.force('center', d3.forceCenter(width / 2, height / 2))
|
|
897
|
-
.force('collision', d3.forceCollide().radius(22));
|
|
898
|
-
|
|
899
|
-
sim.on('tick', function () {
|
|
900
|
-
linkSel
|
|
901
|
-
.attr('x1', function (d) { return d.source.x; }).attr('y1', function (d) { return d.source.y; })
|
|
902
|
-
.attr('x2', function (d) { return d.target.x; }).attr('y2', function (d) { return d.target.y; });
|
|
903
|
-
linkLabel
|
|
904
|
-
.attr('x', function (d) { return (d.source.x + d.target.x) / 2; })
|
|
905
|
-
.attr('y', function (d) { return (d.source.y + d.target.y) / 2; });
|
|
906
|
-
nodeSel.attr('cx', function (d) { return d.x; }).attr('cy', function (d) { return d.y; });
|
|
907
|
-
labelSel.attr('x', function (d) { return d.x + 10; }).attr('y', function (d) { return d.y; });
|
|
908
|
-
});
|
|
909
|
-
|
|
910
|
-
// Legend
|
|
911
|
-
var legend = document.createElement('div');
|
|
912
|
-
legend.style.cssText = 'display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;font-size:12px;padding:0 2px;font-family:Inter,system-ui,sans-serif;';
|
|
913
|
-
Object.entries(typeColorMap).forEach(function (pair) {
|
|
914
|
-
var item = document.createElement('span');
|
|
915
|
-
item.style.cssText = 'display:flex;align-items:center;gap:5px;color:var(--text-secondary,#a1a1aa);';
|
|
916
|
-
var dot = document.createElement('span');
|
|
917
|
-
dot.style.cssText = 'width:8px;height:8px;border-radius:50%;display:inline-block;background:' + pair[1] + ';box-shadow:0 0 4px ' + pair[1] + '66;';
|
|
918
|
-
var lbl = document.createElement('span');
|
|
919
|
-
lbl.textContent = pair[0];
|
|
920
|
-
item.appendChild(dot);
|
|
921
|
-
item.appendChild(lbl);
|
|
922
|
-
legend.appendChild(item);
|
|
923
|
-
});
|
|
924
|
-
container.appendChild(legend);
|
|
925
|
-
}
|
|
926
|
-
|
|
927
654
|
// ---- Analytics tab ----
|
|
928
655
|
var analyticsLoaded = false;
|
|
929
656
|
|
|
@@ -1124,129 +851,6 @@ export function generateLiveDashboardHtml() {
|
|
|
1124
851
|
}
|
|
1125
852
|
}
|
|
1126
853
|
|
|
1127
|
-
// ---- Timeline tab ----
|
|
1128
|
-
var timelineLoaded = false;
|
|
1129
|
-
|
|
1130
|
-
async function loadTimeline() {
|
|
1131
|
-
if (timelineLoaded) return;
|
|
1132
|
-
timelineLoaded = true;
|
|
1133
|
-
var container = document.getElementById('timeline-body');
|
|
1134
|
-
showSpinner(container);
|
|
1135
|
-
try {
|
|
1136
|
-
var data = await apiCall('GET', '/v1/graph');
|
|
1137
|
-
var graph = graphData(successData(data, 'graph'));
|
|
1138
|
-
renderTimeline(graph.entities, graph.relations, container);
|
|
1139
|
-
} catch (err) {
|
|
1140
|
-
showError(container, err.message);
|
|
1141
|
-
timelineLoaded = false;
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
function renderTimeline(entities, relations, container) {
|
|
1146
|
-
container.textContent = '';
|
|
1147
|
-
|
|
1148
|
-
// Build entity map
|
|
1149
|
-
var entityMap = {};
|
|
1150
|
-
entities.forEach(function (e) { entityMap[e.name] = e; });
|
|
1151
|
-
|
|
1152
|
-
// Find supersedes relations
|
|
1153
|
-
var supersedes = relations.filter(function (r) { return r.type === 'supersedes'; });
|
|
1154
|
-
|
|
1155
|
-
if (supersedes.length === 0) {
|
|
1156
|
-
showPlaceholder(container, 'No evolution chains yet. Use "supersedes" relations to track knowledge evolution.');
|
|
1157
|
-
return;
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
|
-
// Build chains: find roots (nodes that are not a "to" in any supersedes)
|
|
1161
|
-
var hasIncoming = new Set(supersedes.map(function (r) { return r.to; }));
|
|
1162
|
-
var roots = [...new Set(supersedes.map(function (r) { return r.from; }))].filter(function (name) {
|
|
1163
|
-
return !hasIncoming.has(name);
|
|
1164
|
-
});
|
|
1165
|
-
|
|
1166
|
-
// If no pure roots, just use all froms
|
|
1167
|
-
if (roots.length === 0) {
|
|
1168
|
-
roots = [...new Set(supersedes.map(function (r) { return r.from; }))];
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
// Build adjacency: from -> [to, ...]
|
|
1172
|
-
var nextMap = {};
|
|
1173
|
-
supersedes.forEach(function (r) {
|
|
1174
|
-
if (!nextMap[r.from]) nextMap[r.from] = [];
|
|
1175
|
-
nextMap[r.from].push(r.to);
|
|
1176
|
-
});
|
|
1177
|
-
|
|
1178
|
-
// Walk each chain
|
|
1179
|
-
var visited = new Set();
|
|
1180
|
-
var chainCount = 0;
|
|
1181
|
-
|
|
1182
|
-
roots.forEach(function (root) {
|
|
1183
|
-
if (visited.has(root)) return;
|
|
1184
|
-
var chain = [];
|
|
1185
|
-
var cursor = root;
|
|
1186
|
-
var safety = 0;
|
|
1187
|
-
while (cursor && !visited.has(cursor) && safety < 50) {
|
|
1188
|
-
visited.add(cursor);
|
|
1189
|
-
chain.push(cursor);
|
|
1190
|
-
var nexts = nextMap[cursor];
|
|
1191
|
-
cursor = nexts && nexts[0];
|
|
1192
|
-
safety++;
|
|
1193
|
-
}
|
|
1194
|
-
if (chain.length < 2) return;
|
|
1195
|
-
chainCount++;
|
|
1196
|
-
|
|
1197
|
-
var chainEl = document.createElement('div');
|
|
1198
|
-
chainEl.className = 'chain';
|
|
1199
|
-
|
|
1200
|
-
chain.forEach(function (name, idx) {
|
|
1201
|
-
if (idx > 0) {
|
|
1202
|
-
var arrow = document.createElement('span');
|
|
1203
|
-
arrow.className = 'chain-arrow';
|
|
1204
|
-
arrow.textContent = '\\u2192';
|
|
1205
|
-
chainEl.appendChild(arrow);
|
|
1206
|
-
}
|
|
1207
|
-
var node = document.createElement('div');
|
|
1208
|
-
var ent = entityMap[name];
|
|
1209
|
-
node.className = 'chain-node' + (ent && ent.status === 'archived' ? ' archived' : '');
|
|
1210
|
-
var nameEl = document.createElement('div');
|
|
1211
|
-
nameEl.className = 'cn-name';
|
|
1212
|
-
// Show first observation as primary content, fall back to entity name
|
|
1213
|
-
var obsContent = (ent && ent.observations && ent.observations[0])
|
|
1214
|
-
? ent.observations[0]
|
|
1215
|
-
: name;
|
|
1216
|
-
nameEl.textContent = obsContent.length > 60 ? obsContent.slice(0, 60) + '\u2026' : obsContent;
|
|
1217
|
-
nameEl.title = obsContent; // full text on hover
|
|
1218
|
-
var typeEl = document.createElement('div');
|
|
1219
|
-
typeEl.className = 'cn-type';
|
|
1220
|
-
typeEl.textContent = (ent ? ent.type : '') + (ent ? ' \u00b7 ' : '');
|
|
1221
|
-
// Add timestamp
|
|
1222
|
-
if (ent && ent.created_at) {
|
|
1223
|
-
try {
|
|
1224
|
-
var tDate = new Date(ent.created_at);
|
|
1225
|
-
var timeSpan = document.createElement('span');
|
|
1226
|
-
timeSpan.style.cssText = 'font-size:11px;color:var(--text-muted);font-family:var(--font-mono);';
|
|
1227
|
-
timeSpan.textContent = tDate.toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric' });
|
|
1228
|
-
typeEl.textContent = (ent ? ent.type + ' \u00b7 ' : '');
|
|
1229
|
-
typeEl.appendChild(timeSpan);
|
|
1230
|
-
} catch (_) {}
|
|
1231
|
-
}
|
|
1232
|
-
// Add entity name as secondary metadata
|
|
1233
|
-
var entityNameEl = document.createElement('div');
|
|
1234
|
-
entityNameEl.style.cssText = 'font-size:10px;color:var(--text-muted);font-family:var(--font-mono);opacity:0.7;margin-top:2px;';
|
|
1235
|
-
entityNameEl.textContent = name;
|
|
1236
|
-
node.appendChild(nameEl);
|
|
1237
|
-
node.appendChild(typeEl);
|
|
1238
|
-
node.appendChild(entityNameEl);
|
|
1239
|
-
chainEl.appendChild(node);
|
|
1240
|
-
});
|
|
1241
|
-
|
|
1242
|
-
container.appendChild(chainEl);
|
|
1243
|
-
});
|
|
1244
|
-
|
|
1245
|
-
if (chainCount === 0) {
|
|
1246
|
-
showPlaceholder(container, 'No multi-step evolution chains found.');
|
|
1247
|
-
}
|
|
1248
|
-
}
|
|
1249
|
-
|
|
1250
854
|
// ---- Manage tab ----
|
|
1251
855
|
var allManageEntities = [];
|
|
1252
856
|
var manageFilter = '';
|
|
@@ -1808,10 +1412,6 @@ export function generateLiveDashboardHtml() {
|
|
|
1808
1412
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
1809
1413
|
<title>MeMesh — Dashboard</title>
|
|
1810
1414
|
<style>${CSS}</style>
|
|
1811
|
-
<!-- bundled d3.js -->
|
|
1812
|
-
<script>
|
|
1813
|
-
${bundledD3}
|
|
1814
|
-
</script>
|
|
1815
1415
|
</head>
|
|
1816
1416
|
<body>
|
|
1817
1417
|
|
|
@@ -1832,9 +1432,7 @@ ${bundledD3}
|
|
|
1832
1432
|
<nav class="nav" id="nav">
|
|
1833
1433
|
<button class="active" data-tab="search">Search</button>
|
|
1834
1434
|
<button data-tab="browse">Browse</button>
|
|
1835
|
-
<button data-tab="graph">Graph</button>
|
|
1836
1435
|
<button data-tab="analytics">Analytics</button>
|
|
1837
|
-
<button data-tab="timeline">Timeline</button>
|
|
1838
1436
|
<button data-tab="manage">Manage</button>
|
|
1839
1437
|
<button data-tab="settings">Settings</button>
|
|
1840
1438
|
</nav>
|
|
@@ -1863,16 +1461,6 @@ ${bundledD3}
|
|
|
1863
1461
|
</div>
|
|
1864
1462
|
</div>
|
|
1865
1463
|
|
|
1866
|
-
<div class="tab-content" id="tab-graph">
|
|
1867
|
-
<div class="card">
|
|
1868
|
-
<h2>Knowledge Graph</h2>
|
|
1869
|
-
<div class="graph-controls">
|
|
1870
|
-
<span>Scroll to zoom \u00b7 Drag nodes \u00b7 Pan with mouse</span>
|
|
1871
|
-
</div>
|
|
1872
|
-
<div class="graph-svg-wrap" id="graph-svg-wrap"></div>
|
|
1873
|
-
</div>
|
|
1874
|
-
</div>
|
|
1875
|
-
|
|
1876
1464
|
<div class="tab-content" id="tab-analytics">
|
|
1877
1465
|
<div class="card">
|
|
1878
1466
|
<h2>Analytics</h2>
|
|
@@ -1880,14 +1468,6 @@ ${bundledD3}
|
|
|
1880
1468
|
</div>
|
|
1881
1469
|
</div>
|
|
1882
1470
|
|
|
1883
|
-
<div class="tab-content" id="tab-timeline">
|
|
1884
|
-
<div class="card">
|
|
1885
|
-
<h2>Evolution Timeline</h2>
|
|
1886
|
-
<p style="font-size:13px;color:var(--text-muted);margin-bottom:16px;">Entities connected by \u201csupersedes\u201d relations, showing knowledge evolution chains.</p>
|
|
1887
|
-
<div id="timeline-body"></div>
|
|
1888
|
-
</div>
|
|
1889
|
-
</div>
|
|
1890
|
-
|
|
1891
1471
|
<div class="tab-content" id="tab-manage">
|
|
1892
1472
|
<div class="card">
|
|
1893
1473
|
<h2>Manage Memories</h2>
|
|
@@ -1918,13 +1498,6 @@ ${bundledD3}
|
|
|
1918
1498
|
</div>
|
|
1919
1499
|
</div>
|
|
1920
1500
|
|
|
1921
|
-
<!-- Graph tooltip -->
|
|
1922
|
-
<div id="live-tooltip" class="graph-tooltip" style="display:none;">
|
|
1923
|
-
<div class="tt-name" style="font-weight:600;color:var(--text-primary);font-size:13px;margin-bottom:3px;"></div>
|
|
1924
|
-
<div class="tt-type" style="color:var(--accent-hover);font-size:11px;font-family:var(--font-mono);margin-bottom:4px;"></div>
|
|
1925
|
-
<div class="tt-obs" style="color:var(--text-muted);font-size:12px;"></div>
|
|
1926
|
-
</div>
|
|
1927
|
-
|
|
1928
1501
|
<!-- Feedback widget -->
|
|
1929
1502
|
<button id="feedback-btn">💬 Feedback</button>
|
|
1930
1503
|
<div id="feedback-panel">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view-live.js","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"view-live.js","sourceRoot":"","sources":["../../src/cli/view-live.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,yBAAyB;IACvC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqVX,CAAC,IAAI,EAAE,CAAC;IAIT,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuiCd,CAAC,IAAI,EAAE,CAAC;IAET,OAAO;;;;;;WAME,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAwGJ,MAAM;;QAER,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export declare const INDEX_MAX_LINES = 40;
|
|
2
|
+
export declare const INDEX_MAX_BYTES = 3072;
|
|
3
|
+
export declare const INDEX_STALE_DAYS = 180;
|
|
4
|
+
export declare const INDEX_LINE_MAX_CHARS = 120;
|
|
5
|
+
export declare const INDEX_SNIPPET_FETCH_CHARS = 4000;
|
|
6
|
+
export declare const INDEX_CANDIDATE_CAP = 2000;
|
|
7
|
+
export declare const INDEX_EXCLUDED_TYPES: readonly string[];
|
|
8
|
+
export declare function isIndexableType(type: string | null | undefined): boolean;
|
|
9
|
+
export interface IndexCandidate {
|
|
10
|
+
id: number;
|
|
11
|
+
type: string | null;
|
|
12
|
+
title?: string | null;
|
|
13
|
+
snippet?: string | null;
|
|
14
|
+
lastActivity: string | null;
|
|
15
|
+
metadata?: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface BriefingIndex {
|
|
18
|
+
lines: string[];
|
|
19
|
+
shown: number;
|
|
20
|
+
more: number;
|
|
21
|
+
older: number;
|
|
22
|
+
truncated: boolean;
|
|
23
|
+
bytes: number;
|
|
24
|
+
tokens: number;
|
|
25
|
+
ids: number[];
|
|
26
|
+
}
|
|
27
|
+
export declare function buildBriefingIndex(candidates: readonly IndexCandidate[], projectName: string, now: number, options?: {
|
|
28
|
+
truncated?: boolean;
|
|
29
|
+
}): BriefingIndex;
|
|
30
|
+
//# sourceMappingURL=briefing-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"briefing-index.d.ts","sourceRoot":"","sources":["../../src/core/briefing-index.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,eAAe,KAAK,CAAC;AAElC,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAIxC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAI9C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAexC,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAA4C,CAAC;AAE/F,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAExE;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAGxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAM5B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAE5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IAEb,KAAK,EAAE,MAAM,CAAC;IAEd,SAAS,EAAE,OAAO,CAAC;IAGnB,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,MAAM,CAAC;IAEf,GAAG,EAAE,MAAM,EAAE,CAAC;CACf;AA4JD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,cAAc,EAAE,EACrC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACpC,aAAa,CAkDf"}
|