@xera-ai/core 0.4.1 → 0.4.3
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/bin/internal.js +604 -34
- package/dist/bin-internal/graph-render.d.ts +2 -0
- package/dist/bin-internal/graph-render.d.ts.map +1 -0
- package/dist/bin-internal/impact-prepare.d.ts +2 -0
- package/dist/bin-internal/impact-prepare.d.ts.map +1 -0
- package/dist/bin-internal/index.d.ts.map +1 -1
- package/dist/config/schema.d.ts +6 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/graph/impact.d.ts +31 -0
- package/dist/graph/impact.d.ts.map +1 -0
- package/dist/graph/index.d.ts +4 -0
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/render.d.ts +50 -0
- package/dist/graph/render.d.ts.map +1 -0
- package/dist/src/index.js +7 -0
- package/package.json +1 -1
- package/src/bin-internal/graph-render.ts +70 -0
- package/src/bin-internal/impact-prepare.ts +64 -0
- package/src/bin-internal/index.ts +4 -0
- package/src/config/schema.ts +12 -0
- package/src/graph/impact.ts +262 -0
- package/src/graph/index.ts +13 -0
- package/src/graph/render.ts +324 -0
- package/src/graph/templates/LICENSE-vis-network.txt +176 -0
- package/src/graph/templates/graph.css +88 -0
- package/src/graph/templates/graph.html.template +31 -0
- package/src/graph/templates/graph.js +101 -0
- package/src/graph/templates/vis-network.min.js +25000 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
var data = window.__GRAPH__ || { nodes: [], edges: [] };
|
|
3
|
+
var container = document.getElementById('canvas');
|
|
4
|
+
if (!container || typeof vis === 'undefined') {
|
|
5
|
+
document.body.innerHTML =
|
|
6
|
+
'<p style="padding:20px;color:#6B7280">Failed to load vis-network. Check console.</p>';
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
var nodes = new vis.DataSet(data.nodes);
|
|
11
|
+
var edges = new vis.DataSet(data.edges);
|
|
12
|
+
var network = new vis.Network(
|
|
13
|
+
container,
|
|
14
|
+
{ nodes: nodes, edges: edges },
|
|
15
|
+
{
|
|
16
|
+
physics: { stabilization: { iterations: 200 } },
|
|
17
|
+
interaction: { hover: true, navigationButtons: true, keyboard: true },
|
|
18
|
+
edges: {
|
|
19
|
+
smooth: { type: 'continuous', forceDirection: 'none', roundness: 0.4 },
|
|
20
|
+
font: { size: 9, color: '#6B7280' },
|
|
21
|
+
},
|
|
22
|
+
nodes: { font: { size: 11, color: '#1F2937' } },
|
|
23
|
+
},
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
var sidepanel = document.getElementById('sidepanel');
|
|
27
|
+
var spTitle = document.getElementById('sp-title');
|
|
28
|
+
var spDesc = document.getElementById('sp-desc');
|
|
29
|
+
var spActions = document.getElementById('sp-actions');
|
|
30
|
+
|
|
31
|
+
network.on('click', (params) => {
|
|
32
|
+
if (params.nodes.length === 0) {
|
|
33
|
+
sidepanel.classList.add('hidden');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
var nodeId = params.nodes[0];
|
|
37
|
+
var node = nodes.get(nodeId);
|
|
38
|
+
spTitle.textContent = node.label;
|
|
39
|
+
spDesc.textContent = node.title || '';
|
|
40
|
+
spActions.innerHTML = '';
|
|
41
|
+
var btn = null;
|
|
42
|
+
if (node.group === 'Ticket') {
|
|
43
|
+
btn = document.createElement('button');
|
|
44
|
+
btn.textContent = 'Copy /xera-impact command';
|
|
45
|
+
btn.onclick = () => {
|
|
46
|
+
navigator.clipboard?.writeText(`/xera-impact ${nodeId}`);
|
|
47
|
+
};
|
|
48
|
+
spActions.appendChild(btn);
|
|
49
|
+
}
|
|
50
|
+
sidepanel.classList.remove('hidden');
|
|
51
|
+
|
|
52
|
+
// Highlight ego-graph (depth 2)
|
|
53
|
+
var connected = network.getConnectedNodes(nodeId);
|
|
54
|
+
var connected2 = [];
|
|
55
|
+
connected.forEach((id) => {
|
|
56
|
+
Array.prototype.push.apply(connected2, network.getConnectedNodes(id));
|
|
57
|
+
});
|
|
58
|
+
var keep = new Set([nodeId].concat(connected).concat(connected2));
|
|
59
|
+
nodes.forEach((n) => {
|
|
60
|
+
var update = { id: n.id, opacity: keep.has(n.id) ? 1 : 0.2 };
|
|
61
|
+
nodes.update(update);
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
document.getElementById('reset').onclick = () => {
|
|
66
|
+
nodes.forEach((n) => {
|
|
67
|
+
nodes.update({ id: n.id, opacity: 1 });
|
|
68
|
+
});
|
|
69
|
+
sidepanel.classList.add('hidden');
|
|
70
|
+
network.fit();
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
document.getElementById('search').oninput = (e) => {
|
|
74
|
+
var q = e.target.value.toLowerCase();
|
|
75
|
+
if (!q) {
|
|
76
|
+
nodes.forEach((n) => {
|
|
77
|
+
nodes.update({ id: n.id, opacity: 1 });
|
|
78
|
+
});
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
nodes.forEach((n) => {
|
|
82
|
+
var matches =
|
|
83
|
+
(n.label || '').toLowerCase().includes(q) || (n.id || '').toLowerCase().includes(q);
|
|
84
|
+
nodes.update({ id: n.id, opacity: matches ? 1 : 0.2 });
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
['filter-pass', 'filter-fail', 'filter-p0'].forEach((id) => {
|
|
89
|
+
document.getElementById(id).onchange = () => {
|
|
90
|
+
var pass = document.getElementById('filter-pass').checked;
|
|
91
|
+
var fail = document.getElementById('filter-fail').checked;
|
|
92
|
+
nodes.forEach((n) => {
|
|
93
|
+
if (n.group !== 'Scenario') return;
|
|
94
|
+
var visible = true;
|
|
95
|
+
if (n.color === '#10B981' && !pass) visible = false;
|
|
96
|
+
if (n.color === '#EF4444' && !fail) visible = false;
|
|
97
|
+
nodes.update({ id: n.id, hidden: !visible });
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
})();
|