@kage-core/kage-graph-mcp 1.0.0 → 1.1.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.
@@ -0,0 +1,628 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #050806;
4
+ --surface: #08110d;
5
+ --surface-soft: #0d1913;
6
+ --surface-strong: #12251b;
7
+ --terminal: #b9fbc0;
8
+ --terminal-strong: #41ff8f;
9
+ --terminal-dim: #6ea77d;
10
+ --text: #d7f9df;
11
+ --muted: #7fa88a;
12
+ --line: #1c3b29;
13
+ --line-strong: #2f6f48;
14
+ --memory: #b88cff;
15
+ --memory-soft: #251a36;
16
+ --code: #6ad7ff;
17
+ --code-soft: #102633;
18
+ --warn: #ffd166;
19
+ --danger: #ff6b6b;
20
+ --edge: #6d8f79;
21
+ --shadow: 0 18px 60px rgba(0, 0, 0, 0.46);
22
+ }
23
+
24
+ * { box-sizing: border-box; }
25
+
26
+ body {
27
+ margin: 0;
28
+ min-width: 320px;
29
+ background:
30
+ radial-gradient(circle at 16% 0%, rgba(65, 255, 143, 0.11), transparent 32%),
31
+ linear-gradient(180deg, #07100b 0%, var(--bg) 44%, #030504 100%);
32
+ color: var(--text);
33
+ font: 13px/1.45 ui-monospace, "SFMono-Regular", "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
34
+ }
35
+
36
+ button, input, select { font: inherit; }
37
+ h1, h2, p { margin: 0; }
38
+ h1 { font-size: clamp(22px, 3vw, 36px); line-height: 1; letter-spacing: 0; }
39
+ h2 { color: var(--terminal); font-size: 13px; letter-spacing: 0.04em; text-transform: uppercase; }
40
+
41
+ .app-header {
42
+ display: grid;
43
+ grid-template-columns: minmax(0, 1fr) auto auto auto;
44
+ gap: 16px;
45
+ align-items: center;
46
+ padding: 14px 18px;
47
+ border-bottom: 1px solid var(--line);
48
+ background: rgba(5, 8, 6, 0.94);
49
+ backdrop-filter: blur(16px);
50
+ position: sticky;
51
+ top: 0;
52
+ z-index: 10;
53
+ }
54
+
55
+ .brand-block { min-width: 0; }
56
+ .eyebrow {
57
+ display: inline-flex;
58
+ margin-bottom: 5px;
59
+ color: var(--terminal-strong);
60
+ font-size: 11px;
61
+ font-weight: 800;
62
+ letter-spacing: 0.08em;
63
+ text-transform: uppercase;
64
+ }
65
+ .brand-block h1::before {
66
+ content: "> ";
67
+ color: var(--terminal-strong);
68
+ }
69
+ .app-header p {
70
+ margin-top: 6px;
71
+ color: var(--muted);
72
+ overflow-wrap: anywhere;
73
+ }
74
+
75
+ .status-strip {
76
+ display: flex;
77
+ flex-wrap: wrap;
78
+ gap: 8px;
79
+ justify-content: flex-end;
80
+ }
81
+
82
+ .autoload-status {
83
+ display: inline-flex;
84
+ align-items: center;
85
+ min-height: 28px;
86
+ padding: 4px 9px;
87
+ border: 1px solid var(--line);
88
+ border-radius: 4px;
89
+ background: #040805;
90
+ color: var(--warn);
91
+ font-size: 11px;
92
+ font-weight: 760;
93
+ white-space: nowrap;
94
+ }
95
+ .autoload-status.ok {
96
+ border-color: var(--line-strong);
97
+ color: var(--terminal-strong);
98
+ }
99
+
100
+ .status-pill, .detail-kind {
101
+ display: inline-flex;
102
+ align-items: center;
103
+ gap: 7px;
104
+ min-height: 28px;
105
+ padding: 4px 9px;
106
+ border: 1px solid var(--line-strong);
107
+ border-radius: 4px;
108
+ background: rgba(13, 25, 19, 0.92);
109
+ color: var(--muted);
110
+ font-size: 11px;
111
+ font-weight: 750;
112
+ white-space: nowrap;
113
+ }
114
+ .status-pill strong { color: var(--terminal-strong); }
115
+ .status-pill.warn strong { color: var(--warn); }
116
+ .status-pill.code strong { color: var(--code); }
117
+ .status-pill.memory strong { color: var(--memory); }
118
+
119
+ .file-picker, button {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ min-height: 38px;
124
+ padding: 0 13px;
125
+ border: 1px solid var(--terminal-strong);
126
+ border-radius: 4px;
127
+ background: #07130d;
128
+ color: var(--terminal-strong);
129
+ cursor: pointer;
130
+ white-space: nowrap;
131
+ font-weight: 780;
132
+ box-shadow: inset 0 0 0 1px rgba(65, 255, 143, 0.10);
133
+ }
134
+ .file-picker:hover, button:hover { background: #0d1f15; }
135
+ .file-picker input {
136
+ position: absolute;
137
+ width: 1px;
138
+ height: 1px;
139
+ overflow: hidden;
140
+ clip: rect(0, 0, 0, 0);
141
+ }
142
+ .file-picker > span {
143
+ display: inline;
144
+ margin: 0;
145
+ color: var(--terminal-strong) !important;
146
+ font-size: inherit;
147
+ font-weight: inherit;
148
+ }
149
+
150
+ .layout {
151
+ display: grid;
152
+ grid-template-columns: minmax(0, 1fr) 380px;
153
+ grid-template-rows: minmax(680px, calc(100vh - 108px)) auto minmax(220px, 30vh) minmax(270px, 34vh);
154
+ grid-template-areas:
155
+ "graph details"
156
+ "controls details"
157
+ "review proof"
158
+ "entities edges";
159
+ gap: 12px;
160
+ padding: 12px;
161
+ min-height: calc(100vh - 78px);
162
+ }
163
+
164
+ .control-panel, .graph-panel, .details-panel, .table-panel, .review-panel, .proof-panel {
165
+ border: 1px solid var(--line);
166
+ border-radius: 6px;
167
+ background: rgba(8, 17, 13, 0.94);
168
+ box-shadow: var(--shadow);
169
+ }
170
+
171
+ .control-panel {
172
+ grid-area: controls;
173
+ min-height: 0;
174
+ overflow: auto;
175
+ padding: 12px;
176
+ }
177
+
178
+ @media (min-width: 1121px) {
179
+ .control-panel {
180
+ display: grid;
181
+ grid-template-columns: repeat(7, minmax(118px, 1fr)) auto;
182
+ gap: 10px;
183
+ align-items: end;
184
+ }
185
+ .control-panel .panel-heading, .metrics-grid, .legend { grid-column: 1 / -1; }
186
+ .control-panel label, .control-panel button { margin-top: 0; }
187
+ }
188
+
189
+ .control-panel label { display: block; margin-top: 12px; }
190
+ .control-panel .toggle-control {
191
+ display: flex;
192
+ align-items: center;
193
+ gap: 9px;
194
+ min-height: 38px;
195
+ padding: 0 10px;
196
+ border: 1px solid var(--line);
197
+ border-radius: 4px;
198
+ background: #030604;
199
+ }
200
+ .control-panel .toggle-control input {
201
+ width: 15px;
202
+ min-height: 15px;
203
+ accent-color: var(--terminal-strong);
204
+ }
205
+ .control-panel .toggle-control span {
206
+ margin: 0;
207
+ color: var(--terminal-dim);
208
+ line-height: 1.2;
209
+ }
210
+ label span {
211
+ display: block;
212
+ margin-bottom: 6px;
213
+ color: var(--terminal-dim);
214
+ font-size: 11px;
215
+ font-weight: 760;
216
+ text-transform: uppercase;
217
+ }
218
+
219
+ input, select {
220
+ width: 100%;
221
+ min-height: 38px;
222
+ border: 1px solid var(--line);
223
+ border-radius: 4px;
224
+ padding: 0 10px;
225
+ background: #030604;
226
+ color: var(--text);
227
+ }
228
+ input::placeholder { color: #4e7458; }
229
+ input:focus, select:focus, button:focus, .file-picker:focus-within {
230
+ outline: 2px solid rgba(65, 255, 143, 0.35);
231
+ outline-offset: 1px;
232
+ }
233
+ .control-panel button { width: 100%; margin-top: 12px; }
234
+
235
+ .panel-heading {
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: space-between;
239
+ gap: 10px;
240
+ padding: 11px 12px 0;
241
+ margin-bottom: 10px;
242
+ }
243
+ .panel-heading.compact { padding: 0; margin-bottom: 12px; }
244
+ .panel-heading span, #workspaceMode, #selectionStatus {
245
+ color: var(--terminal-dim);
246
+ font-size: 11px;
247
+ font-variant-numeric: tabular-nums;
248
+ }
249
+
250
+ .metrics-grid {
251
+ display: grid;
252
+ grid-template-columns: repeat(6, minmax(0, 1fr));
253
+ gap: 8px;
254
+ margin-bottom: 12px;
255
+ }
256
+ .metric {
257
+ min-height: 58px;
258
+ padding: 9px;
259
+ border: 1px solid var(--line);
260
+ border-radius: 4px;
261
+ background: #06100b;
262
+ }
263
+ .metric strong {
264
+ display: block;
265
+ color: var(--terminal-strong);
266
+ font-size: 17px;
267
+ line-height: 1.1;
268
+ overflow-wrap: anywhere;
269
+ }
270
+ .metric span {
271
+ display: block;
272
+ margin-top: 5px;
273
+ color: var(--terminal-dim);
274
+ font-size: 10px;
275
+ font-weight: 760;
276
+ text-transform: uppercase;
277
+ }
278
+
279
+ .legend {
280
+ display: flex;
281
+ flex-wrap: wrap;
282
+ gap: 12px;
283
+ margin-top: 12px;
284
+ padding-top: 12px;
285
+ border-top: 1px solid var(--line);
286
+ color: var(--muted);
287
+ font-size: 11px;
288
+ font-weight: 720;
289
+ }
290
+ .legend span { display: flex; align-items: center; gap: 8px; }
291
+ .dot { width: 12px; height: 8px; border-radius: 2px; display: inline-block; }
292
+ .memory-dot { background: var(--memory); }
293
+ .code-dot { background: var(--code); }
294
+ .line { width: 24px; height: 2px; display: inline-block; background: var(--edge); }
295
+
296
+ .graph-panel {
297
+ grid-area: graph;
298
+ position: relative;
299
+ min-height: 640px;
300
+ overflow: hidden;
301
+ display: grid;
302
+ grid-template-rows: auto minmax(0, 1fr);
303
+ }
304
+
305
+ .graph-toolbar {
306
+ display: flex;
307
+ justify-content: space-between;
308
+ align-items: center;
309
+ gap: 12px;
310
+ padding: 11px 12px;
311
+ border-bottom: 1px solid var(--line);
312
+ background: linear-gradient(180deg, #0b1710, #07110c);
313
+ }
314
+ .graph-toolbar p { color: var(--terminal-dim); font-size: 11px; margin-top: 3px; }
315
+ .graph-actions { display: inline-flex; align-items: center; gap: 6px; }
316
+ .graph-actions button { min-width: 40px; min-height: 34px; padding: 0 10px; }
317
+ .interaction-hint {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ padding-right: 6px;
321
+ color: var(--terminal-dim);
322
+ font-size: 11px;
323
+ font-weight: 700;
324
+ white-space: nowrap;
325
+ }
326
+
327
+ .graph-canvas-wrap {
328
+ position: relative;
329
+ min-height: 600px;
330
+ width: 100%;
331
+ height: 100%;
332
+ overflow: hidden;
333
+ background:
334
+ radial-gradient(circle at 52% 46%, rgba(65, 255, 143, 0.10), transparent 44%),
335
+ #020503;
336
+ }
337
+
338
+ #graphCanvas {
339
+ width: 100%;
340
+ height: 100%;
341
+ min-height: 600px;
342
+ display: block;
343
+ cursor: grab;
344
+ }
345
+
346
+ #graphCanvas:active { cursor: grabbing; }
347
+
348
+ #graphSvg {
349
+ width: 100%;
350
+ height: 100%;
351
+ min-height: 600px;
352
+ display: block;
353
+ cursor: grab;
354
+ background:
355
+ linear-gradient(rgba(65, 255, 143, 0.035) 1px, transparent 1px),
356
+ linear-gradient(90deg, rgba(65, 255, 143, 0.035) 1px, transparent 1px),
357
+ radial-gradient(circle at 52% 46%, rgba(65, 255, 143, 0.10), transparent 44%),
358
+ #020503;
359
+ background-size: 28px 28px, 28px 28px, 100% 100%, 100% 100%;
360
+ }
361
+ #graphSvg.fallback-graph { display: none; }
362
+ #graphSvg.dragging { cursor: grabbing; }
363
+ #arrow path { fill: var(--edge); }
364
+ .graph-tooltip {
365
+ position: absolute;
366
+ z-index: 5;
367
+ display: none;
368
+ max-width: min(320px, calc(100% - 28px));
369
+ padding: 10px 12px;
370
+ border: 1px solid rgba(65, 255, 143, 0.32);
371
+ border-radius: 6px;
372
+ background: rgba(3, 6, 4, 0.90);
373
+ box-shadow: 0 14px 34px rgba(0, 0, 0, 0.38), inset 0 0 0 1px rgba(65, 255, 143, 0.08);
374
+ backdrop-filter: blur(12px);
375
+ color: var(--text);
376
+ pointer-events: none;
377
+ }
378
+ .graph-tooltip.visible { display: block; }
379
+ .tt-name {
380
+ color: var(--terminal);
381
+ font-weight: 850;
382
+ overflow-wrap: anywhere;
383
+ }
384
+ .tt-type {
385
+ margin-top: 4px;
386
+ font-size: 10px;
387
+ font-weight: 800;
388
+ letter-spacing: 0.08em;
389
+ text-transform: uppercase;
390
+ }
391
+ .tt-summary {
392
+ margin-top: 7px;
393
+ color: var(--muted);
394
+ font-size: 11px;
395
+ overflow-wrap: anywhere;
396
+ }
397
+ .tt-conns {
398
+ margin-top: 7px;
399
+ padding-top: 7px;
400
+ border-top: 1px solid rgba(65, 255, 143, 0.16);
401
+ color: var(--terminal-dim);
402
+ font-size: 10px;
403
+ font-weight: 760;
404
+ }
405
+ .lane-label {
406
+ fill: rgba(185, 251, 192, 0.34);
407
+ font-size: 12px;
408
+ font-weight: 900;
409
+ letter-spacing: 0.16em;
410
+ pointer-events: none;
411
+ }
412
+
413
+ .empty-state {
414
+ position: absolute;
415
+ inset: 54px 0 0;
416
+ display: grid;
417
+ place-content: center;
418
+ gap: 6px;
419
+ color: var(--muted);
420
+ text-align: center;
421
+ pointer-events: none;
422
+ }
423
+ .empty-state strong { color: var(--terminal); font-size: 18px; }
424
+ .empty-state.hidden { display: none; }
425
+
426
+ .details-panel {
427
+ grid-area: details;
428
+ min-height: 0;
429
+ overflow: auto;
430
+ padding: 12px;
431
+ }
432
+ .details-empty { color: var(--terminal-dim); }
433
+ .detail-title { margin-bottom: 8px; color: var(--text); font-weight: 780; font-size: 17px; overflow-wrap: anywhere; }
434
+ .detail-kind { margin-bottom: 10px; color: var(--terminal-strong); background: #07130d; }
435
+ .detail-row { padding: 9px 0; border-top: 1px solid var(--line); }
436
+ .detail-row dt { margin: 0 0 4px; color: var(--terminal-dim); font-size: 11px; font-weight: 760; text-transform: uppercase; }
437
+ .detail-row dd { margin: 0; color: var(--text); overflow-wrap: anywhere; white-space: pre-wrap; }
438
+
439
+ .entities-panel { grid-area: entities; }
440
+ .edges-panel { grid-area: edges; }
441
+ .review-panel { grid-area: review; }
442
+ .proof-panel { grid-area: proof; }
443
+ .table-panel { min-height: 0; overflow: hidden; }
444
+ .review-panel, .proof-panel { min-height: 0; overflow: hidden; }
445
+ .list { height: calc(100% - 48px); overflow: auto; padding: 0 8px 10px; }
446
+ .review-list, .proof-list {
447
+ height: calc(100% - 48px);
448
+ overflow: auto;
449
+ padding: 0 10px 12px;
450
+ }
451
+ .review-item {
452
+ padding: 10px 0;
453
+ border-top: 1px solid var(--line);
454
+ }
455
+ .review-title {
456
+ color: var(--terminal);
457
+ font-weight: 820;
458
+ overflow-wrap: anywhere;
459
+ }
460
+ .review-meta, .review-risks {
461
+ margin-top: 4px;
462
+ color: var(--terminal-dim);
463
+ font-size: 11px;
464
+ }
465
+ .review-summary {
466
+ margin-top: 6px;
467
+ color: var(--text);
468
+ overflow-wrap: anywhere;
469
+ }
470
+ .review-artifact {
471
+ margin-top: 10px;
472
+ border-top: 1px solid var(--line);
473
+ padding-top: 10px;
474
+ }
475
+ .review-artifact summary {
476
+ color: var(--terminal-strong);
477
+ cursor: pointer;
478
+ font-weight: 780;
479
+ }
480
+ .review-artifact pre {
481
+ margin: 10px 0 0;
482
+ white-space: pre-wrap;
483
+ color: var(--muted);
484
+ font-size: 11px;
485
+ }
486
+ .proof-list {
487
+ display: grid;
488
+ grid-template-columns: repeat(3, minmax(0, 1fr));
489
+ gap: 8px;
490
+ align-content: start;
491
+ }
492
+ .proof-item {
493
+ min-height: 62px;
494
+ padding: 10px;
495
+ border: 1px solid var(--line);
496
+ border-radius: 4px;
497
+ background: #06100b;
498
+ }
499
+ .proof-item strong {
500
+ display: block;
501
+ color: var(--terminal-strong);
502
+ font-size: 18px;
503
+ }
504
+ .proof-item span {
505
+ display: block;
506
+ margin-top: 5px;
507
+ color: var(--terminal-dim);
508
+ font-size: 10px;
509
+ font-weight: 760;
510
+ text-transform: uppercase;
511
+ }
512
+ .list-item {
513
+ width: 100%;
514
+ display: grid;
515
+ gap: 4px;
516
+ padding: 10px 8px;
517
+ border: 0;
518
+ border-top: 1px solid var(--line);
519
+ border-radius: 0;
520
+ background: transparent;
521
+ color: inherit;
522
+ text-align: left;
523
+ cursor: pointer;
524
+ }
525
+ .list-item:hover, .list-item.selected { background: rgba(65, 255, 143, 0.08); }
526
+ .item-title { color: var(--terminal); font-weight: 780; overflow-wrap: anywhere; }
527
+ .item-meta { color: var(--terminal-dim); font-size: 11px; overflow-wrap: anywhere; }
528
+
529
+ .edge-line { stroke: var(--edge); stroke-width: 1.35; marker-end: url(#arrow); opacity: 0.50; }
530
+ .edge-line.filtered { opacity: 0.05; }
531
+ .edge-line.selected, .edge-line.connected { stroke: var(--terminal-strong); stroke-width: 2.8; opacity: 1; }
532
+ .edge-line.review-low-confidence { stroke-dasharray: 5 4; stroke: var(--warn); }
533
+ .edge-line.review-missing-evidence { opacity: 0.34; stroke-dasharray: 3 5; }
534
+ .edge-line.review-invalidated { stroke: #68716c; stroke-dasharray: 2 5; }
535
+ .edge-hit { stroke: transparent; stroke-width: 18; cursor: pointer; }
536
+
537
+ .node { cursor: pointer; }
538
+ .node-body {
539
+ stroke-width: 1.5;
540
+ rx: 4;
541
+ filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.38));
542
+ }
543
+ .node.graph-memory .node-body {
544
+ fill: var(--memory-soft);
545
+ stroke: var(--memory);
546
+ }
547
+ .node.graph-code .node-body {
548
+ fill: var(--code-soft);
549
+ stroke: var(--code);
550
+ }
551
+ .node.graph-unknown .node-body {
552
+ fill: #151b18;
553
+ stroke: var(--terminal-dim);
554
+ }
555
+ .node.dependency-node .node-body {
556
+ fill: #101714;
557
+ stroke: #506c5a;
558
+ }
559
+ .node.dependency-node .node-title,
560
+ .node.dependency-node .node-type {
561
+ fill: #8aa394;
562
+ }
563
+ .node.selected .node-body, .node.connected .node-body {
564
+ stroke: var(--terminal-strong);
565
+ stroke-width: 2.8;
566
+ }
567
+ .node.filtered { opacity: 0.10; }
568
+ .node-title {
569
+ fill: var(--text);
570
+ font-size: 12px;
571
+ font-weight: 800;
572
+ pointer-events: none;
573
+ }
574
+ .node-type {
575
+ fill: var(--terminal-dim);
576
+ font-size: 9px;
577
+ font-weight: 760;
578
+ letter-spacing: 0.06em;
579
+ text-transform: uppercase;
580
+ pointer-events: none;
581
+ }
582
+ .node-port {
583
+ fill: var(--terminal-strong);
584
+ opacity: 0.88;
585
+ pointer-events: none;
586
+ }
587
+
588
+ @media (max-width: 1120px) {
589
+ .app-header {
590
+ grid-template-columns: 1fr;
591
+ align-items: stretch;
592
+ padding: 12px 14px;
593
+ }
594
+ .brand-block h1 { font-size: 24px; }
595
+ .app-header p { font-size: 12px; }
596
+ .status-strip { justify-content: flex-start; }
597
+ .status-pill { min-height: 24px; padding: 3px 8px; }
598
+ .layout {
599
+ grid-template-columns: 1fr;
600
+ grid-template-rows: minmax(620px, 78vh) auto auto minmax(220px, 36vh) minmax(220px, 36vh) minmax(220px, 36vh) minmax(220px, 36vh);
601
+ grid-template-areas:
602
+ "graph"
603
+ "controls"
604
+ "details"
605
+ "review"
606
+ "proof"
607
+ "entities"
608
+ "edges";
609
+ }
610
+ .metrics-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
611
+ .control-panel { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
612
+ .control-panel .panel-heading, .metrics-grid, .legend { grid-column: 1 / -1; }
613
+ .control-panel label, .control-panel button { margin-top: 0; }
614
+ .graph-panel { min-height: 620px; }
615
+ #graphCanvas, .graph-canvas-wrap, #graphSvg { min-height: 560px; }
616
+ }
617
+
618
+ @media (max-width: 620px) {
619
+ .app-header { padding: 12px; }
620
+ .layout { padding: 8px; gap: 8px; }
621
+ .control-panel { grid-template-columns: 1fr; }
622
+ .metrics-grid { grid-template-columns: 1fr 1fr; }
623
+ .proof-list { grid-template-columns: 1fr 1fr; }
624
+ .graph-toolbar { align-items: flex-start; flex-direction: column; }
625
+ .graph-actions { width: 100%; }
626
+ .interaction-hint { flex: 1; white-space: normal; }
627
+ #graphCanvas, .graph-canvas-wrap, #graphSvg { min-height: 450px; }
628
+ }