harness-mcp-v2 3.2.7 → 3.2.8

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.
Files changed (116) hide show
  1. package/README.md +7 -24
  2. package/build/registry/index.d.ts.map +1 -1
  3. package/build/registry/index.js +0 -2
  4. package/build/registry/index.js.map +1 -1
  5. package/build/registry/toolsets/ansible.d.ts.map +1 -1
  6. package/build/registry/toolsets/ansible.js +2 -3
  7. package/build/registry/toolsets/ansible.js.map +1 -1
  8. package/build/registry/toolsets/ccm.d.ts.map +1 -1
  9. package/build/registry/toolsets/ccm.js +3 -3
  10. package/build/registry/toolsets/ccm.js.map +1 -1
  11. package/build/registry/toolsets/iacm.d.ts.map +1 -1
  12. package/build/registry/toolsets/iacm.js +2 -3
  13. package/build/registry/toolsets/iacm.js.map +1 -1
  14. package/build/registry/toolsets/sto.d.ts.map +1 -1
  15. package/build/registry/toolsets/sto.js +4 -8
  16. package/build/registry/toolsets/sto.js.map +1 -1
  17. package/build/registry/types.d.ts +11 -3
  18. package/build/registry/types.d.ts.map +1 -1
  19. package/build/registry/types.js.map +1 -1
  20. package/build/tools/harness-diagnose.d.ts.map +1 -1
  21. package/build/tools/harness-diagnose.js +2 -57
  22. package/build/tools/harness-diagnose.js.map +1 -1
  23. package/build/tools/harness-get.d.ts.map +1 -1
  24. package/build/tools/harness-get.js +1 -0
  25. package/build/tools/harness-get.js.map +1 -1
  26. package/build/tools/harness-list.d.ts.map +1 -1
  27. package/build/tools/harness-list.js +1 -23
  28. package/build/tools/harness-list.js.map +1 -1
  29. package/build/tools/harness-status.d.ts.map +1 -1
  30. package/build/tools/harness-status.js +1 -16
  31. package/build/tools/harness-status.js.map +1 -1
  32. package/build/tools/output-schemas.d.ts +0 -1
  33. package/build/tools/output-schemas.d.ts.map +1 -1
  34. package/build/tools/output-schemas.js +0 -1
  35. package/build/tools/output-schemas.js.map +1 -1
  36. package/build/utils/response-formatter.d.ts +0 -10
  37. package/build/utils/response-formatter.d.ts.map +1 -1
  38. package/build/utils/response-formatter.js +0 -21
  39. package/build/utils/response-formatter.js.map +1 -1
  40. package/package.json +1 -2
  41. package/build/registry/toolsets/visualizations.d.ts +0 -8
  42. package/build/registry/toolsets/visualizations.d.ts.map +0 -1
  43. package/build/registry/toolsets/visualizations.js +0 -116
  44. package/build/registry/toolsets/visualizations.js.map +0 -1
  45. package/build/utils/svg/architecture.d.ts +0 -40
  46. package/build/utils/svg/architecture.d.ts.map +0 -1
  47. package/build/utils/svg/architecture.js +0 -354
  48. package/build/utils/svg/architecture.js.map +0 -1
  49. package/build/utils/svg/charts/bar.d.ts +0 -11
  50. package/build/utils/svg/charts/bar.d.ts.map +0 -1
  51. package/build/utils/svg/charts/bar.js +0 -93
  52. package/build/utils/svg/charts/bar.js.map +0 -1
  53. package/build/utils/svg/charts/index.d.ts +0 -8
  54. package/build/utils/svg/charts/index.d.ts.map +0 -1
  55. package/build/utils/svg/charts/index.js +0 -4
  56. package/build/utils/svg/charts/index.js.map +0 -1
  57. package/build/utils/svg/charts/pie.d.ts +0 -10
  58. package/build/utils/svg/charts/pie.d.ts.map +0 -1
  59. package/build/utils/svg/charts/pie.js +0 -105
  60. package/build/utils/svg/charts/pie.js.map +0 -1
  61. package/build/utils/svg/charts/scatter.d.ts +0 -11
  62. package/build/utils/svg/charts/scatter.d.ts.map +0 -1
  63. package/build/utils/svg/charts/scatter.js +0 -101
  64. package/build/utils/svg/charts/scatter.js.map +0 -1
  65. package/build/utils/svg/charts/types.d.ts +0 -39
  66. package/build/utils/svg/charts/types.d.ts.map +0 -1
  67. package/build/utils/svg/charts/types.js +0 -5
  68. package/build/utils/svg/charts/types.js.map +0 -1
  69. package/build/utils/svg/colors.d.ts +0 -25
  70. package/build/utils/svg/colors.d.ts.map +0 -1
  71. package/build/utils/svg/colors.js +0 -66
  72. package/build/utils/svg/colors.js.map +0 -1
  73. package/build/utils/svg/escape.d.ts +0 -6
  74. package/build/utils/svg/escape.d.ts.map +0 -1
  75. package/build/utils/svg/escape.js +0 -20
  76. package/build/utils/svg/escape.js.map +0 -1
  77. package/build/utils/svg/executions-timeseries.d.ts +0 -12
  78. package/build/utils/svg/executions-timeseries.d.ts.map +0 -1
  79. package/build/utils/svg/executions-timeseries.js +0 -99
  80. package/build/utils/svg/executions-timeseries.js.map +0 -1
  81. package/build/utils/svg/index.d.ts +0 -15
  82. package/build/utils/svg/index.d.ts.map +0 -1
  83. package/build/utils/svg/index.js +0 -12
  84. package/build/utils/svg/index.js.map +0 -1
  85. package/build/utils/svg/list-visuals.d.ts +0 -15
  86. package/build/utils/svg/list-visuals.d.ts.map +0 -1
  87. package/build/utils/svg/list-visuals.js +0 -141
  88. package/build/utils/svg/list-visuals.js.map +0 -1
  89. package/build/utils/svg/mappers.d.ts +0 -16
  90. package/build/utils/svg/mappers.d.ts.map +0 -1
  91. package/build/utils/svg/mappers.js +0 -93
  92. package/build/utils/svg/mappers.js.map +0 -1
  93. package/build/utils/svg/render-png-child.d.ts +0 -2
  94. package/build/utils/svg/render-png-child.d.ts.map +0 -1
  95. package/build/utils/svg/render-png-child.js +0 -30
  96. package/build/utils/svg/render-png-child.js.map +0 -1
  97. package/build/utils/svg/render-png.d.ts +0 -17
  98. package/build/utils/svg/render-png.d.ts.map +0 -1
  99. package/build/utils/svg/render-png.js +0 -112
  100. package/build/utils/svg/render-png.js.map +0 -1
  101. package/build/utils/svg/stage-flow.d.ts +0 -11
  102. package/build/utils/svg/stage-flow.d.ts.map +0 -1
  103. package/build/utils/svg/stage-flow.js +0 -93
  104. package/build/utils/svg/stage-flow.js.map +0 -1
  105. package/build/utils/svg/status-summary.d.ts +0 -10
  106. package/build/utils/svg/status-summary.d.ts.map +0 -1
  107. package/build/utils/svg/status-summary.js +0 -73
  108. package/build/utils/svg/status-summary.js.map +0 -1
  109. package/build/utils/svg/timeline.d.ts +0 -12
  110. package/build/utils/svg/timeline.d.ts.map +0 -1
  111. package/build/utils/svg/timeline.js +0 -132
  112. package/build/utils/svg/timeline.js.map +0 -1
  113. package/build/utils/svg/types.d.ts +0 -63
  114. package/build/utils/svg/types.d.ts.map +0 -1
  115. package/build/utils/svg/types.js +0 -6
  116. package/build/utils/svg/types.js.map +0 -1
@@ -1,15 +0,0 @@
1
- /**
2
- * Visual chart generation for harness_list results.
3
- * Builds charts from list result items based on resource type and visual_type.
4
- */
5
- export type ListVisualType = "timeseries" | "bar" | "pie";
6
- export interface ListVisualResult {
7
- svg: string;
8
- analysis: string;
9
- }
10
- /**
11
- * Generate a chart SVG from list result items.
12
- * Only works for execution-type resources. Returns null for non-execution types.
13
- */
14
- export declare function renderListVisual(resourceType: string, items: unknown[], visualType: ListVisualType): ListVisualResult | null;
15
- //# sourceMappingURL=list-visuals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-visuals.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/list-visuals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgHH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,OAAO,EAAE,EAChB,UAAU,EAAE,cAAc,GACzB,gBAAgB,GAAG,IAAI,CAwCzB"}
@@ -1,141 +0,0 @@
1
- /**
2
- * Visual chart generation for harness_list results.
3
- * Builds charts from list result items based on resource type and visual_type.
4
- */
5
- import { renderExecutionsTimeseriesSvg } from "./executions-timeseries.js";
6
- import { renderBarChartSvg } from "./charts/bar.js";
7
- import { renderPieChartSvg } from "./charts/pie.js";
8
- import { getStatusColor, CHART_PALETTE } from "./colors.js";
9
- // ─── Timeseries aggregation ──────────────────────────────────────────────────
10
- function toDateKey(ts) {
11
- const d = new Date(ts);
12
- return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, "0")}-${String(d.getUTCDate()).padStart(2, "0")}`;
13
- }
14
- function buildTimeseriesData(items, days) {
15
- const now = Date.now();
16
- const fromMs = now - days * 24 * 60 * 60 * 1000;
17
- const dayMap = new Map();
18
- for (let i = 0; i <= days; i++) {
19
- const key = toDateKey(fromMs + i * 86400000);
20
- dayMap.set(key, { date: key, Success: 0, Failed: 0, Expired: 0, Running: 0, Aborted: 0 });
21
- }
22
- let totalSuccess = 0, totalFailed = 0, totalExpired = 0, totalRunning = 0;
23
- for (const item of items) {
24
- if (item.startTs == null || item.startTs < fromMs)
25
- continue;
26
- const row = dayMap.get(toDateKey(item.startTs));
27
- if (!row)
28
- continue;
29
- const s = item.status ?? "Unknown";
30
- if (s === "Success") {
31
- row.Success++;
32
- totalSuccess++;
33
- }
34
- else if (s === "Failed" || s === "Errored") {
35
- row.Failed++;
36
- totalFailed++;
37
- }
38
- else if (s === "Expired") {
39
- row.Expired++;
40
- totalExpired++;
41
- }
42
- else if (s === "Running") {
43
- row.Running++;
44
- totalRunning++;
45
- }
46
- else if (s === "Aborted") {
47
- row.Aborted = (row.Aborted ?? 0) + 1;
48
- }
49
- }
50
- const sorted = Array.from(dayMap.keys()).sort();
51
- return {
52
- orgId: "", projectId: "",
53
- days: sorted.map((k) => dayMap.get(k)),
54
- totalSuccess, totalFailed, totalExpired, totalRunning,
55
- fromDate: sorted[0] ?? "", toDate: sorted[sorted.length - 1] ?? "",
56
- };
57
- }
58
- function aggregateByStatus(items) {
59
- const counts = new Map();
60
- for (const item of items) {
61
- const s = item.status ?? "Unknown";
62
- counts.set(s, (counts.get(s) ?? 0) + 1);
63
- }
64
- return Array.from(counts.entries())
65
- .sort((a, b) => b[1] - a[1])
66
- .map(([label, value]) => ({ label, value, color: getStatusColor(label) }));
67
- }
68
- // ─── Pipeline aggregation ────────────────────────────────────────────────────
69
- function aggregateByPipeline(items) {
70
- const counts = new Map();
71
- for (const item of items) {
72
- const p = item.pipelineIdentifier ?? item.name ?? "unknown";
73
- counts.set(p, (counts.get(p) ?? 0) + 1);
74
- }
75
- return Array.from(counts.entries())
76
- .sort((a, b) => b[1] - a[1])
77
- .map(([label, value], i) => ({ label, value, color: CHART_PALETTE[i % CHART_PALETTE.length] }));
78
- }
79
- // ─── Analysis text ───────────────────────────────────────────────────────────
80
- function buildAnalysis(title, items) {
81
- const total = items.reduce((s, i) => s + i.value, 0);
82
- const lines = [
83
- `## ${title}`,
84
- "",
85
- `**Total**: ${total} across ${items.length} categories.`,
86
- "",
87
- "### Breakdown",
88
- ...items.map((i) => `- **${i.label}**: ${i.value} (${total > 0 ? Math.round((i.value / total) * 100) : 0}%)`),
89
- ];
90
- if (items.length > 1) {
91
- const top = items[0];
92
- lines.push("", "### Key Insights");
93
- lines.push(`- **${top.label}** is the largest at ${total > 0 ? Math.round((top.value / total) * 100) : 0}% of total.`);
94
- if (items.length >= 3) {
95
- const topTwo = items.slice(0, 2).reduce((s, i) => s + i.value, 0);
96
- lines.push(`- Top 2 represent ${total > 0 ? Math.round((topTwo / total) * 100) : 0}% of total.`);
97
- }
98
- }
99
- return lines.join("\n");
100
- }
101
- /**
102
- * Generate a chart SVG from list result items.
103
- * Only works for execution-type resources. Returns null for non-execution types.
104
- */
105
- export function renderListVisual(resourceType, items, visualType) {
106
- // Only execution resources support visuals
107
- if (resourceType !== "execution")
108
- return null;
109
- const execItems = items;
110
- if (execItems.length === 0)
111
- return null;
112
- switch (visualType) {
113
- case "timeseries": {
114
- const data = buildTimeseriesData(execItems, 30);
115
- const svg = renderExecutionsTimeseriesSvg(data, { width: 900 });
116
- const analysis = [
117
- `## Execution Timeseries (last 30 days)`,
118
- "",
119
- `**${data.totalSuccess}** success, **${data.totalFailed}** failed, **${data.totalExpired}** expired, **${data.totalRunning}** running.`,
120
- "",
121
- `Active days: ${data.days.filter((d) => d.Success + d.Failed + d.Expired + d.Running > 0).length} of ${data.days.length}.`,
122
- ].join("\n");
123
- return { svg, analysis };
124
- }
125
- case "pie": {
126
- const counts = aggregateByStatus(execItems);
127
- const total = counts.reduce((s, c) => s + c.value, 0);
128
- const svg = renderPieChartSvg({ title: "Executions by status", subtitle: `${total} executions`, slices: counts }, { donut: true });
129
- return { svg, analysis: buildAnalysis("Executions by status", counts) };
130
- }
131
- case "bar": {
132
- const counts = aggregateByPipeline(execItems);
133
- const total = counts.reduce((s, c) => s + c.value, 0);
134
- const svg = renderBarChartSvg({ title: "Executions by pipeline", subtitle: `${total} executions`, items: counts });
135
- return { svg, analysis: buildAnalysis("Executions by pipeline", counts) };
136
- }
137
- default:
138
- return null;
139
- }
140
- }
141
- //# sourceMappingURL=list-visuals.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list-visuals.js","sourceRoot":"","sources":["../../../src/utils/svg/list-visuals.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- /**
2
- * Data converters that map tool output → SVG renderer input types.
3
- * Keeps SVG module decoupled from Harness API / diagnose internals.
4
- */
5
- import type { ExecutionSummaryData, ProjectHealthData } from "./types.js";
6
- /**
7
- * Maps the diagnose pipeline handler's result → ExecutionSummaryData.
8
- * Returns null if the data doesn't contain the expected structure.
9
- */
10
- export declare function toExecutionSummaryData(diagnoseResult: Record<string, unknown>): ExecutionSummaryData | null;
11
- /**
12
- * Maps the harness_status tool's output → ProjectHealthData.
13
- * Returns null if the data doesn't contain the expected structure.
14
- */
15
- export declare function toProjectHealthData(statusResult: Record<string, unknown>, orgId: string, projectId: string): ProjectHealthData | null;
16
- //# sourceMappingURL=mappers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mappers.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/mappers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAsC,iBAAiB,EAAmB,MAAM,YAAY,CAAC;AAsC/H;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,oBAAoB,GAAG,IAAI,CA+C3G;AAoBD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,iBAAiB,GAAG,IAAI,CA0B1B"}
@@ -1,93 +0,0 @@
1
- /**
2
- * Data converters that map tool output → SVG renderer input types.
3
- * Keeps SVG module decoupled from Harness API / diagnose internals.
4
- */
5
- function asStatus(s) {
6
- if (typeof s === "string")
7
- return s;
8
- return "Unknown";
9
- }
10
- function asNum(v) {
11
- return typeof v === "number" ? v : 0;
12
- }
13
- function asStr(v) {
14
- return typeof v === "string" ? v : "";
15
- }
16
- /**
17
- * Maps the diagnose pipeline handler's result → ExecutionSummaryData.
18
- * Returns null if the data doesn't contain the expected structure.
19
- */
20
- export function toExecutionSummaryData(diagnoseResult) {
21
- const exec = diagnoseResult.execution;
22
- if (!exec)
23
- return null;
24
- const pipelineName = exec.pipeline?.name ?? exec.pipeline?.identifier ?? "Pipeline";
25
- const executionId = asStr(exec.execution?.id);
26
- const status = asStatus(exec.execution?.status);
27
- const totalDurationMs = asNum(exec.timing?.duration_ms);
28
- if (!executionId)
29
- return null;
30
- const rawStages = exec.stages;
31
- if (!Array.isArray(rawStages)) {
32
- return { pipelineName, executionId, status, totalDurationMs, stages: [] };
33
- }
34
- // Compute base start time from earliest stage
35
- let baseStartMs = Infinity;
36
- for (const s of rawStages) {
37
- if (s.started_at) {
38
- const t = new Date(s.started_at).getTime();
39
- if (t < baseStartMs)
40
- baseStartMs = t;
41
- }
42
- }
43
- if (!isFinite(baseStartMs))
44
- baseStartMs = 0;
45
- const stages = rawStages.map((s) => {
46
- const startMs = s.started_at ? new Date(s.started_at).getTime() : baseStartMs;
47
- const durationMs = asNum(s.duration_ms);
48
- const steps = (s.steps ?? []).map((step) => ({
49
- name: step.name ?? "Step",
50
- status: asStatus(step.status),
51
- durationMs: asNum(step.duration_ms),
52
- failureMessage: step.failure_message,
53
- }));
54
- return {
55
- name: s.name ?? s.identifier ?? "Stage",
56
- status: asStatus(s.status),
57
- startMs,
58
- durationMs,
59
- steps,
60
- };
61
- });
62
- return { pipelineName, executionId, status, totalDurationMs, stages };
63
- }
64
- /**
65
- * Maps the harness_status tool's output → ProjectHealthData.
66
- * Returns null if the data doesn't contain the expected structure.
67
- */
68
- export function toProjectHealthData(statusResult, orgId, projectId) {
69
- const sr = statusResult;
70
- const summary = sr.summary;
71
- if (!summary)
72
- return null;
73
- const health = (summary.health === "healthy" || summary.health === "degraded" || summary.health === "failing")
74
- ? summary.health
75
- : "healthy";
76
- const recentExecutions = (sr.recent_activity ?? []).map((e) => ({
77
- id: asStr(e.execution_id),
78
- pipeline: asStr(e.pipeline),
79
- status: asStatus(e.status),
80
- }));
81
- return {
82
- orgId,
83
- projectId,
84
- health,
85
- counts: {
86
- failed: asNum(summary.total_failed),
87
- running: asNum(summary.total_running),
88
- recent: asNum(summary.total_recent),
89
- },
90
- recentExecutions,
91
- };
92
- }
93
- //# sourceMappingURL=mappers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mappers.js","sourceRoot":"","sources":["../../../src/utils/svg/mappers.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=render-png-child.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-png-child.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/render-png-child.ts"],"names":[],"mappings":""}
@@ -1,30 +0,0 @@
1
- /**
2
- * Child-process entry point for SVG → PNG conversion.
3
- *
4
- * Runs in a separate Node process so a native resvg panic (SIGSEGV) cannot
5
- * kill the MCP server. Reads JSON from stdin, writes JSON to stdout.
6
- */
7
- import { text } from "node:stream/consumers";
8
- import { stdin } from "node:process";
9
- async function main() {
10
- const raw = await text(stdin);
11
- const { svg, scale } = JSON.parse(raw);
12
- if (typeof svg !== "string" || !svg) {
13
- process.stderr.write("Missing svg input");
14
- process.exit(1);
15
- }
16
- const { Resvg } = await import("@resvg/resvg-js");
17
- const resvg = new Resvg(svg, {
18
- fitTo: { mode: "zoom", value: scale ?? 2 },
19
- font: {
20
- loadSystemFonts: false,
21
- },
22
- });
23
- const pngBuffer = resvg.render().asPng();
24
- process.stdout.write(JSON.stringify({ base64: Buffer.from(pngBuffer).toString("base64") }));
25
- }
26
- main().catch((err) => {
27
- process.stderr.write(err instanceof Error ? err.message : String(err));
28
- process.exit(1);
29
- });
30
- //# sourceMappingURL=render-png-child.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-png-child.js","sourceRoot":"","sources":["../../../src/utils/svg/render-png-child.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAOrC,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IAErD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE;QAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC,EAAE;QAC1C,IAAI,EAAE;YACJ,eAAe,EAAE,KAAK;SACvB;KACF,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,17 +0,0 @@
1
- /**
2
- * SVG → PNG conversion via @resvg/resvg-js.
3
- *
4
- * MCP clients (Cursor, Claude Desktop) reject image/svg+xml — only raster
5
- * formats are supported. This converts our SVG strings to PNG buffers.
6
- *
7
- * Rendering runs in a child process so a native resvg panic (SIGSEGV) cannot
8
- * kill the MCP server. JS-level failures are surfaced as catchable errors.
9
- */
10
- export interface RenderPngOptions {
11
- /** Scale factor for higher DPI output. Default 2 (retina). */
12
- scale?: number;
13
- }
14
- /** Reject obviously invalid SVG before spawning the native renderer. */
15
- export declare function validateSvgInput(svgString: string): void;
16
- export declare function svgToPngBase64(svgString: string, options?: RenderPngOptions): Promise<string>;
17
- //# sourceMappingURL=render-png.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-png.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/render-png.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA+BD,wEAAwE;AACxE,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAiBxD;AA6DD,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAInG"}
@@ -1,112 +0,0 @@
1
- /**
2
- * SVG → PNG conversion via @resvg/resvg-js.
3
- *
4
- * MCP clients (Cursor, Claude Desktop) reject image/svg+xml — only raster
5
- * formats are supported. This converts our SVG strings to PNG buffers.
6
- *
7
- * Rendering runs in a child process so a native resvg panic (SIGSEGV) cannot
8
- * kill the MCP server. JS-level failures are surfaced as catchable errors.
9
- */
10
- import { spawn } from "node:child_process";
11
- import { existsSync } from "node:fs";
12
- import { fileURLToPath } from "node:url";
13
- import path from "node:path";
14
- const RENDER_TIMEOUT_MS = 30_000;
15
- // Resolved once per module load — the path never changes at runtime.
16
- let _childScriptPath;
17
- function resolveChildScript() {
18
- if (_childScriptPath)
19
- return _childScriptPath;
20
- const dir = path.dirname(fileURLToPath(import.meta.url));
21
- const adjacent = path.join(dir, "render-png-child.js");
22
- if (existsSync(adjacent)) {
23
- _childScriptPath = adjacent;
24
- return _childScriptPath;
25
- }
26
- // Vitest loads parent from src/ but the child entry is compiled under build/.
27
- const packageRoot = path.resolve(dir, "../../..");
28
- const buildScript = path.join(packageRoot, "build/utils/svg/render-png-child.js");
29
- if (existsSync(buildScript)) {
30
- _childScriptPath = buildScript;
31
- return _childScriptPath;
32
- }
33
- throw new Error("render-png-child.js not found. Run pnpm build before rendering SVG.");
34
- }
35
- const SVG_WIDTH_RE = /\bwidth="([^"]+)"/i;
36
- const SVG_HEIGHT_RE = /\bheight="([^"]+)"/i;
37
- /** Reject obviously invalid SVG before spawning the native renderer. */
38
- export function validateSvgInput(svgString) {
39
- const trimmed = svgString.trim();
40
- if (!trimmed) {
41
- throw new Error("SVG input is empty");
42
- }
43
- if (!/<svg[\s>]/i.test(trimmed)) {
44
- throw new Error("SVG input missing <svg> root element");
45
- }
46
- for (const [attr, re] of [["width", SVG_WIDTH_RE], ["height", SVG_HEIGHT_RE]]) {
47
- const match = trimmed.match(re);
48
- if (!match?.[1])
49
- continue;
50
- const value = Number.parseFloat(match[1]);
51
- if (Number.isNaN(value) || value <= 0) {
52
- throw new Error(`SVG has invalid ${attr}: ${match[1]}`);
53
- }
54
- }
55
- }
56
- function renderInChildProcess(svgString, scale) {
57
- const payload = JSON.stringify({ svg: svgString, scale });
58
- return new Promise((resolve, reject) => {
59
- const child = spawn(process.execPath, [resolveChildScript()], {
60
- stdio: ["pipe", "pipe", "pipe"],
61
- });
62
- const timeout = setTimeout(() => {
63
- child.kill("SIGKILL");
64
- reject(new Error(`SVG render timed out after ${RENDER_TIMEOUT_MS}ms`));
65
- }, RENDER_TIMEOUT_MS);
66
- let stdout = "";
67
- let stderr = "";
68
- child.stdout.setEncoding("utf8");
69
- child.stderr.setEncoding("utf8");
70
- child.stdout.on("data", (chunk) => {
71
- stdout += chunk;
72
- });
73
- child.stderr.on("data", (chunk) => {
74
- stderr += chunk;
75
- });
76
- child.on("error", (err) => {
77
- clearTimeout(timeout);
78
- reject(new Error(`Failed to spawn SVG render child: ${err.message}`));
79
- });
80
- child.on("close", (code, signal) => {
81
- clearTimeout(timeout);
82
- if (code === 0) {
83
- try {
84
- const parsed = JSON.parse(stdout);
85
- if (typeof parsed.base64 !== "string") {
86
- throw new Error("missing base64 field");
87
- }
88
- resolve(parsed.base64);
89
- }
90
- catch {
91
- reject(new Error(`SVG render produced invalid output${stderr ? `: ${stderr}` : ""}`));
92
- }
93
- return;
94
- }
95
- const detail = stderr.trim() || (signal ? `signal ${signal}` : `exit ${code}`);
96
- reject(new Error(`SVG render failed (${detail})`));
97
- });
98
- // Suppress EPIPE: if the child crashes before reading stdin, the broken
99
- // pipe emits an error on child.stdin. Without this handler it would be an
100
- // uncaught EventEmitter error that kills the parent — the close handler
101
- // below will still fire and surface the child's non-zero exit code.
102
- child.stdin.on("error", () => { });
103
- child.stdin.write(payload);
104
- child.stdin.end();
105
- });
106
- }
107
- export async function svgToPngBase64(svgString, options) {
108
- validateSvgInput(svgString);
109
- const scale = options?.scale ?? 2;
110
- return renderInChildProcess(svgString, scale);
111
- }
112
- //# sourceMappingURL=render-png.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"render-png.js","sourceRoot":"","sources":["../../../src/utils/svg/render-png.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Pipeline Stage Flow — left-to-right DAG flowchart.
3
- * Rich version: gradient nodes, status badges, step counts, connecting arrows.
4
- */
5
- import type { ExecutionSummaryData } from "./types.js";
6
- export interface StageFlowOptions {
7
- width?: number;
8
- maxStages?: number;
9
- }
10
- export declare function renderStageFlowSvg(data: ExecutionSummaryData, options?: StageFlowOptions): string;
11
- //# sourceMappingURL=stage-flow.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stage-flow.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/stage-flow.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAQvD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAUD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAuFjG"}
@@ -1,93 +0,0 @@
1
- /**
2
- * Pipeline Stage Flow — left-to-right DAG flowchart.
3
- * Rich version: gradient nodes, status badges, step counts, connecting arrows.
4
- */
5
- import { getStatusColor, getStatusLightColor, FONT_FAMILY, TEXT_PRIMARY, TEXT_MUTED, BORDER_COLOR, SURFACE_COLOR, svgDefs, } from "./colors.js";
6
- import { escapeXml, truncateLabel } from "./escape.js";
7
- function fmtDur(ms) {
8
- if (ms < 1000)
9
- return `${ms}ms`;
10
- const s = Math.floor(ms / 1000);
11
- if (s < 60)
12
- return `${s}s`;
13
- const m = Math.floor(s / 60), rs = s % 60;
14
- return rs > 0 ? `${m}m ${rs}s` : `${m}m`;
15
- }
16
- export function renderStageFlowSvg(data, options) {
17
- const maxStages = options?.maxStages ?? 20;
18
- const PAD = 24;
19
- const NODE_W = 130;
20
- const NODE_H = 64;
21
- const ARROW_GAP = 44;
22
- const NODE_SPACING = NODE_W + ARROW_GAP;
23
- const HDR_H = 48;
24
- let stages = data.stages;
25
- let truncated = 0;
26
- if (stages.length > maxStages) {
27
- truncated = stages.length - maxStages;
28
- stages = stages.slice(0, maxStages);
29
- }
30
- const nodeCount = stages.length + (truncated > 0 ? 1 : 0);
31
- const W = options?.width ?? Math.max(400, PAD * 2 + nodeCount * NODE_SPACING - ARROW_GAP);
32
- const nodesY = HDR_H + 24;
33
- const H = nodesY + NODE_H + PAD + 8;
34
- const statusIcon = (s) => s === "Success" ? "\u2714" : s === "Failed" || s === "Errored" ? "\u2716" : s === "Running" ? "\u25B6" : "\u25CF";
35
- const nodes = [];
36
- const arrows = [];
37
- const gradients = [];
38
- for (let i = 0; i < stages.length; i++) {
39
- const stage = stages[i];
40
- const x = PAD + i * NODE_SPACING;
41
- const y = nodesY;
42
- const color = getStatusColor(stage.status);
43
- const light = getStatusLightColor(stage.status);
44
- const label = escapeXml(truncateLabel(stage.name, 14));
45
- const stepCount = stage.steps.length;
46
- const dur = stage.durationMs > 0 ? fmtDur(stage.durationMs) : "";
47
- const gId = `nf${i}`;
48
- gradients.push(`<linearGradient id="${gId}" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="${light}" stop-opacity="0.15"/><stop offset="100%" stop-color="${color}" stop-opacity="0.08"/></linearGradient>`);
49
- // Node
50
- nodes.push(`
51
- <rect x="${x}" y="${y}" width="${NODE_W}" height="${NODE_H}" rx="10" fill="url(#${gId})" stroke="${color}" stroke-width="2" filter="url(#shadow)"/>
52
- <text x="${x + NODE_W / 2}" y="${y + 20}" fill="${TEXT_PRIMARY}" font-size="11" font-weight="700" font-family="${FONT_FAMILY}" text-anchor="middle">${label}</text>
53
- <text x="${x + 10}" y="${y + 38}" fill="${color}" font-size="10" font-family="${FONT_FAMILY}">${statusIcon(stage.status)} ${escapeXml(stage.status)}</text>
54
- ${dur ? `<text x="${x + NODE_W - 10}" y="${y + 38}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" text-anchor="end">${dur}</text>` : ""}
55
- ${stepCount > 0 ? `<text x="${x + NODE_W / 2}" y="${y + 54}" fill="${TEXT_MUTED}" font-size="8" font-family="${FONT_FAMILY}" text-anchor="middle">${stepCount} step${stepCount > 1 ? "s" : ""}</text>` : ""}
56
- `);
57
- // Arrow
58
- if (i < stages.length - 1 || truncated > 0) {
59
- const ax1 = x + NODE_W + 4;
60
- const ax2 = x + NODE_SPACING - 4;
61
- const ay = y + NODE_H / 2;
62
- arrows.push(`<line x1="${ax1}" y1="${ay}" x2="${ax2 - 8}" y2="${ay}" stroke="${BORDER_COLOR}" stroke-width="2" marker-end="url(#arrow)"/>`);
63
- }
64
- }
65
- // Truncation node
66
- if (truncated > 0) {
67
- const x = PAD + stages.length * NODE_SPACING;
68
- const y = nodesY;
69
- nodes.push(`
70
- <rect x="${x}" y="${y}" width="${NODE_W}" height="${NODE_H}" rx="10" fill="none" stroke="${BORDER_COLOR}" stroke-width="1.5" stroke-dasharray="6,4"/>
71
- <text x="${x + NODE_W / 2}" y="${y + 36}" fill="${TEXT_MUTED}" font-size="11" font-weight="600" font-family="${FONT_FAMILY}" text-anchor="middle">+${truncated} more</text>
72
- `);
73
- }
74
- const title = escapeXml(truncateLabel(data.pipelineName, 50));
75
- const statusColor = getStatusColor(data.status);
76
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}">
77
- ${svgDefs(W, H)}
78
- <defs>
79
- <marker id="arrow" markerWidth="10" markerHeight="8" refX="9" refY="4" orient="auto">
80
- <polygon points="0 0, 10 4, 0 8" fill="${BORDER_COLOR}"/>
81
- </marker>
82
- ${gradients.join("")}
83
- </defs>
84
- <rect width="${W}" height="${H}" rx="12" fill="url(#bgGrad)"/>
85
- <rect x="${PAD}" y="${PAD - 4}" width="${W - PAD * 2}" height="32" rx="8" fill="${SURFACE_COLOR}" stroke="${BORDER_COLOR}" stroke-width="1"/>
86
- <rect x="${PAD + 10}" y="${PAD + 2}" width="20" height="20" rx="5" fill="${statusColor}" opacity="0.15"/>
87
- <text x="${PAD + 20}" y="${PAD + 17}" fill="${statusColor}" font-size="11" font-family="${FONT_FAMILY}" text-anchor="middle">${statusIcon(data.status)}</text>
88
- <text x="${PAD + 38}" y="${PAD + 17}" fill="${TEXT_PRIMARY}" font-size="13" font-weight="700" font-family="${FONT_FAMILY}">${title}</text>
89
- ${arrows.join("\n")}
90
- ${nodes.join("\n")}
91
- </svg>`;
92
- }
93
- //# sourceMappingURL=stage-flow.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stage-flow.js","sourceRoot":"","sources":["../../../src/utils/svg/stage-flow.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Project Health Dashboard — rich version with gradient cards, status bar, indicators.
3
- */
4
- import type { ProjectHealthData } from "./types.js";
5
- export interface StatusSummaryOptions {
6
- width?: number;
7
- maxRecent?: number;
8
- }
9
- export declare function renderStatusSummarySvg(data: ProjectHealthData, options?: StatusSummaryOptions): string;
10
- //# sourceMappingURL=status-summary.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-summary.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/status-summary.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpD,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,MAAM,CAsEtG"}