harness-mcp-v2 3.2.6 → 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 (154) hide show
  1. package/README.md +7 -24
  2. package/build/data/schemas/v0/pipeline.d.ts.map +1 -1
  3. package/build/data/schemas/v0/pipeline.js +1985 -398
  4. package/build/data/schemas/v0/pipeline.js.map +1 -1
  5. package/build/data/schemas/v0/template.d.ts.map +1 -1
  6. package/build/data/schemas/v0/template.js +4143 -2125
  7. package/build/data/schemas/v0/template.js.map +1 -1
  8. package/build/data/schemas/v1/pipeline.d.ts.map +1 -1
  9. package/build/data/schemas/v1/pipeline.js +18 -20
  10. package/build/data/schemas/v1/pipeline.js.map +1 -1
  11. package/build/data/schemas/v1/template.d.ts.map +1 -1
  12. package/build/data/schemas/v1/template.js +18 -20
  13. package/build/data/schemas/v1/template.js.map +1 -1
  14. package/build/index.js +3 -3
  15. package/build/index.js.map +1 -1
  16. package/build/registry/extractors.d.ts +5 -0
  17. package/build/registry/extractors.d.ts.map +1 -1
  18. package/build/registry/extractors.js +6 -0
  19. package/build/registry/extractors.js.map +1 -1
  20. package/build/registry/index.d.ts.map +1 -1
  21. package/build/registry/index.js +0 -2
  22. package/build/registry/index.js.map +1 -1
  23. package/build/registry/toolsets/ai-evals.d.ts.map +1 -1
  24. package/build/registry/toolsets/ai-evals.js +10 -12
  25. package/build/registry/toolsets/ai-evals.js.map +1 -1
  26. package/build/registry/toolsets/ansible.d.ts.map +1 -1
  27. package/build/registry/toolsets/ansible.js +2 -3
  28. package/build/registry/toolsets/ansible.js.map +1 -1
  29. package/build/registry/toolsets/ccm.d.ts.map +1 -1
  30. package/build/registry/toolsets/ccm.js +117 -15
  31. package/build/registry/toolsets/ccm.js.map +1 -1
  32. package/build/registry/toolsets/iacm.d.ts.map +1 -1
  33. package/build/registry/toolsets/iacm.js +2 -3
  34. package/build/registry/toolsets/iacm.js.map +1 -1
  35. package/build/registry/toolsets/sto.d.ts.map +1 -1
  36. package/build/registry/toolsets/sto.js +4 -8
  37. package/build/registry/toolsets/sto.js.map +1 -1
  38. package/build/registry/types.d.ts +11 -3
  39. package/build/registry/types.d.ts.map +1 -1
  40. package/build/registry/types.js.map +1 -1
  41. package/build/search/entity-index.d.ts +14 -0
  42. package/build/search/entity-index.d.ts.map +1 -0
  43. package/build/search/entity-index.js +88 -0
  44. package/build/search/entity-index.js.map +1 -0
  45. package/build/search/manager.d.ts.map +1 -1
  46. package/build/search/manager.js +16 -12
  47. package/build/search/manager.js.map +1 -1
  48. package/build/tools/harness-diagnose.d.ts.map +1 -1
  49. package/build/tools/harness-diagnose.js +2 -57
  50. package/build/tools/harness-diagnose.js.map +1 -1
  51. package/build/tools/harness-execute.d.ts.map +1 -1
  52. package/build/tools/harness-execute.js +18 -9
  53. package/build/tools/harness-execute.js.map +1 -1
  54. package/build/tools/harness-get.d.ts.map +1 -1
  55. package/build/tools/harness-get.js +5 -6
  56. package/build/tools/harness-get.js.map +1 -1
  57. package/build/tools/harness-list.d.ts.map +1 -1
  58. package/build/tools/harness-list.js +5 -29
  59. package/build/tools/harness-list.js.map +1 -1
  60. package/build/tools/harness-search.d.ts.map +1 -1
  61. package/build/tools/harness-search.js +2 -0
  62. package/build/tools/harness-search.js.map +1 -1
  63. package/build/tools/harness-status.d.ts.map +1 -1
  64. package/build/tools/harness-status.js +1 -16
  65. package/build/tools/harness-status.js.map +1 -1
  66. package/build/tools/output-schemas.d.ts +0 -1
  67. package/build/tools/output-schemas.d.ts.map +1 -1
  68. package/build/tools/output-schemas.js +0 -1
  69. package/build/tools/output-schemas.js.map +1 -1
  70. package/build/utils/http-app.d.ts +13 -0
  71. package/build/utils/http-app.d.ts.map +1 -0
  72. package/build/utils/http-app.js +27 -0
  73. package/build/utils/http-app.js.map +1 -0
  74. package/build/utils/response-formatter.d.ts +0 -10
  75. package/build/utils/response-formatter.d.ts.map +1 -1
  76. package/build/utils/response-formatter.js +0 -21
  77. package/build/utils/response-formatter.js.map +1 -1
  78. package/build/utils/runtime-input-resolver.d.ts +10 -0
  79. package/build/utils/runtime-input-resolver.d.ts.map +1 -1
  80. package/build/utils/runtime-input-resolver.js +216 -0
  81. package/build/utils/runtime-input-resolver.js.map +1 -1
  82. package/package.json +1 -2
  83. package/build/registry/toolsets/visualizations.d.ts +0 -8
  84. package/build/registry/toolsets/visualizations.d.ts.map +0 -1
  85. package/build/registry/toolsets/visualizations.js +0 -116
  86. package/build/registry/toolsets/visualizations.js.map +0 -1
  87. package/build/utils/svg/architecture.d.ts +0 -40
  88. package/build/utils/svg/architecture.d.ts.map +0 -1
  89. package/build/utils/svg/architecture.js +0 -354
  90. package/build/utils/svg/architecture.js.map +0 -1
  91. package/build/utils/svg/charts/bar.d.ts +0 -11
  92. package/build/utils/svg/charts/bar.d.ts.map +0 -1
  93. package/build/utils/svg/charts/bar.js +0 -93
  94. package/build/utils/svg/charts/bar.js.map +0 -1
  95. package/build/utils/svg/charts/index.d.ts +0 -8
  96. package/build/utils/svg/charts/index.d.ts.map +0 -1
  97. package/build/utils/svg/charts/index.js +0 -4
  98. package/build/utils/svg/charts/index.js.map +0 -1
  99. package/build/utils/svg/charts/pie.d.ts +0 -10
  100. package/build/utils/svg/charts/pie.d.ts.map +0 -1
  101. package/build/utils/svg/charts/pie.js +0 -105
  102. package/build/utils/svg/charts/pie.js.map +0 -1
  103. package/build/utils/svg/charts/scatter.d.ts +0 -11
  104. package/build/utils/svg/charts/scatter.d.ts.map +0 -1
  105. package/build/utils/svg/charts/scatter.js +0 -101
  106. package/build/utils/svg/charts/scatter.js.map +0 -1
  107. package/build/utils/svg/charts/types.d.ts +0 -39
  108. package/build/utils/svg/charts/types.d.ts.map +0 -1
  109. package/build/utils/svg/charts/types.js +0 -5
  110. package/build/utils/svg/charts/types.js.map +0 -1
  111. package/build/utils/svg/colors.d.ts +0 -25
  112. package/build/utils/svg/colors.d.ts.map +0 -1
  113. package/build/utils/svg/colors.js +0 -66
  114. package/build/utils/svg/colors.js.map +0 -1
  115. package/build/utils/svg/escape.d.ts +0 -6
  116. package/build/utils/svg/escape.d.ts.map +0 -1
  117. package/build/utils/svg/escape.js +0 -20
  118. package/build/utils/svg/escape.js.map +0 -1
  119. package/build/utils/svg/executions-timeseries.d.ts +0 -12
  120. package/build/utils/svg/executions-timeseries.d.ts.map +0 -1
  121. package/build/utils/svg/executions-timeseries.js +0 -99
  122. package/build/utils/svg/executions-timeseries.js.map +0 -1
  123. package/build/utils/svg/index.d.ts +0 -15
  124. package/build/utils/svg/index.d.ts.map +0 -1
  125. package/build/utils/svg/index.js +0 -12
  126. package/build/utils/svg/index.js.map +0 -1
  127. package/build/utils/svg/list-visuals.d.ts +0 -15
  128. package/build/utils/svg/list-visuals.d.ts.map +0 -1
  129. package/build/utils/svg/list-visuals.js +0 -141
  130. package/build/utils/svg/list-visuals.js.map +0 -1
  131. package/build/utils/svg/mappers.d.ts +0 -16
  132. package/build/utils/svg/mappers.d.ts.map +0 -1
  133. package/build/utils/svg/mappers.js +0 -93
  134. package/build/utils/svg/mappers.js.map +0 -1
  135. package/build/utils/svg/render-png.d.ts +0 -17
  136. package/build/utils/svg/render-png.d.ts.map +0 -1
  137. package/build/utils/svg/render-png.js +0 -25
  138. package/build/utils/svg/render-png.js.map +0 -1
  139. package/build/utils/svg/stage-flow.d.ts +0 -11
  140. package/build/utils/svg/stage-flow.d.ts.map +0 -1
  141. package/build/utils/svg/stage-flow.js +0 -93
  142. package/build/utils/svg/stage-flow.js.map +0 -1
  143. package/build/utils/svg/status-summary.d.ts +0 -10
  144. package/build/utils/svg/status-summary.d.ts.map +0 -1
  145. package/build/utils/svg/status-summary.js +0 -73
  146. package/build/utils/svg/status-summary.js.map +0 -1
  147. package/build/utils/svg/timeline.d.ts +0 -12
  148. package/build/utils/svg/timeline.d.ts.map +0 -1
  149. package/build/utils/svg/timeline.js +0 -132
  150. package/build/utils/svg/timeline.js.map +0 -1
  151. package/build/utils/svg/types.d.ts +0 -63
  152. package/build/utils/svg/types.d.ts.map +0 -1
  153. package/build/utils/svg/types.js +0 -6
  154. 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,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
- * The import is dynamic because @resvg/resvg-js ships a native .node binary
8
- * that can fail to load when the host Node ABI doesn't match (e.g. Claude
9
- * Desktop's embedded Node). A top-level import would crash the entire server
10
- * at startup; dynamic import confines the failure to PNG rendering only.
11
- */
12
- export interface RenderPngOptions {
13
- /** Scale factor for higher DPI output. Default 2 (retina). */
14
- scale?: number;
15
- }
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;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAenG"}
@@ -1,25 +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
- * The import is dynamic because @resvg/resvg-js ships a native .node binary
8
- * that can fail to load when the host Node ABI doesn't match (e.g. Claude
9
- * Desktop's embedded Node). A top-level import would crash the entire server
10
- * at startup; dynamic import confines the failure to PNG rendering only.
11
- */
12
- export async function svgToPngBase64(svgString, options) {
13
- const scale = options?.scale ?? 2;
14
- const { Resvg } = await import("@resvg/resvg-js");
15
- const resvg = new Resvg(svgString, {
16
- fitTo: { mode: "zoom", value: scale },
17
- font: {
18
- loadSystemFonts: false,
19
- },
20
- });
21
- const rendered = resvg.render();
22
- const pngBuffer = rendered.asPng();
23
- return Buffer.from(pngBuffer).toString("base64");
24
- }
25
- //# 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":"AAAA;;;;;;;;;;GAUG;AAOH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,SAAiB,EAAE,OAA0B;IAChF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAElC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAElD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,SAAS,EAAE;QACjC,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE;QACrC,IAAI,EAAE;YACJ,eAAe,EAAE,KAAK;SACvB;KACF,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnD,CAAC"}
@@ -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"}
@@ -1,73 +0,0 @@
1
- /**
2
- * Project Health Dashboard — rich version with gradient cards, status bar, indicators.
3
- */
4
- import { getStatusColor, FONT_FAMILY, SURFACE_COLOR, BORDER_COLOR, TEXT_PRIMARY, TEXT_SECONDARY, TEXT_MUTED, svgDefs, } from "./colors.js";
5
- import { escapeXml, truncateLabel } from "./escape.js";
6
- const HEALTH_COLORS = {
7
- healthy: { color: "#10b981", bg: "#10b98120", label: "Healthy" },
8
- degraded: { color: "#f59e0b", bg: "#f59e0b20", label: "Degraded" },
9
- failing: { color: "#f43f5e", bg: "#f43f5e20", label: "Critical" },
10
- };
11
- export function renderStatusSummarySvg(data, options) {
12
- const W = options?.width ?? 620;
13
- const maxRecent = options?.maxRecent ?? 20;
14
- const PAD = 24;
15
- const HDR_H = 60;
16
- const CARD_H = 72;
17
- const CARD_GAP = 12;
18
- const CARD_W = Math.floor((W - PAD * 2 - CARD_GAP * 2) / 3);
19
- const RECENT_H = 42;
20
- const recent = data.recentExecutions.slice(0, maxRecent);
21
- const hasRecent = recent.length > 0;
22
- const cardsY = HDR_H + CARD_GAP;
23
- const recentY = cardsY + CARD_H + CARD_GAP;
24
- const H = recentY + (hasRecent ? RECENT_H + CARD_GAP : 0) + PAD;
25
- const health = HEALTH_COLORS[data.health] ?? HEALTH_COLORS.healthy;
26
- // Header with health badge
27
- const header = `
28
- <rect x="${PAD}" y="${PAD}" width="${W - PAD * 2}" height="${HDR_H - PAD}" rx="8" fill="${SURFACE_COLOR}" stroke="${BORDER_COLOR}" stroke-width="1" filter="url(#shadow)"/>
29
- <rect x="${PAD + 14}" y="${PAD + 8}" width="24" height="24" rx="6" fill="${health.bg}"/>
30
- <circle cx="${PAD + 26}" cy="${PAD + 20}" r="5" fill="${health.color}"/>
31
- <text x="${PAD + 46}" y="${PAD + 18}" fill="${TEXT_PRIMARY}" font-size="15" font-weight="700" font-family="${FONT_FAMILY}">${escapeXml(data.orgId)} / ${escapeXml(truncateLabel(data.projectId, 25))}</text>
32
- <rect x="${W - PAD - 90}" y="${PAD + 9}" width="76" height="22" rx="11" fill="${health.bg}" stroke="${health.color}" stroke-width="1"/>
33
- <text x="${W - PAD - 52}" y="${PAD + 24}" fill="${health.color}" font-size="10" font-weight="700" font-family="${FONT_FAMILY}" text-anchor="middle">${health.label}</text>
34
- `;
35
- // Metric cards
36
- const metrics = [
37
- { label: "Failed", value: data.counts.failed, color: getStatusColor("Failed"), icon: "\u2716" },
38
- { label: "Running", value: data.counts.running, color: getStatusColor("Running"), icon: "\u25B6" },
39
- { label: "Recent", value: data.counts.recent, color: TEXT_SECONDARY, icon: "\u25CF" },
40
- ];
41
- const cards = metrics.map((m, i) => {
42
- const cx = PAD + i * (CARD_W + CARD_GAP);
43
- return `
44
- <rect x="${cx}" y="${cardsY}" width="${CARD_W}" height="${CARD_H}" rx="8" fill="${SURFACE_COLOR}" stroke="${BORDER_COLOR}" stroke-width="1"/>
45
- <text x="${cx + 14}" y="${cardsY + 20}" fill="${m.color}" font-size="11" font-family="${FONT_FAMILY}">${m.icon} ${m.label}</text>
46
- <text x="${cx + CARD_W / 2}" y="${cardsY + 52}" fill="${m.color}" font-size="28" font-weight="800" font-family="${FONT_FAMILY}" text-anchor="middle">${m.value}</text>
47
- `;
48
- }).join("");
49
- // Recent executions bar
50
- let recentBar = "";
51
- if (hasRecent) {
52
- const barW = W - PAD * 2;
53
- const segW = barW / recent.length;
54
- const segments = recent.map((e, i) => {
55
- const sx = PAD + i * segW;
56
- const color = getStatusColor(e.status);
57
- return `<rect x="${sx}" y="${recentY + 18}" width="${Math.max(segW - 2, 3)}" height="18" rx="3" fill="${color}" opacity="0.85"><title>${escapeXml(e.pipeline)} \u2014 ${escapeXml(e.status)}</title></rect>`;
58
- }).join("");
59
- recentBar = `
60
- <text x="${PAD}" y="${recentY + 10}" fill="${TEXT_MUTED}" font-size="10" font-weight="600" font-family="${FONT_FAMILY}">RECENT EXECUTIONS</text>
61
- <text x="${W - PAD}" y="${recentY + 10}" fill="${TEXT_MUTED}" font-size="9" font-family="${FONT_FAMILY}" text-anchor="end">${recent.length} runs</text>
62
- ${segments}
63
- `;
64
- }
65
- return `<svg xmlns="http://www.w3.org/2000/svg" width="${W}" height="${H}" viewBox="0 0 ${W} ${H}">
66
- ${svgDefs(W, H)}
67
- <rect width="${W}" height="${H}" rx="12" fill="url(#bgGrad)"/>
68
- ${header}
69
- ${cards}
70
- ${recentBar}
71
- </svg>`;
72
- }
73
- //# sourceMappingURL=status-summary.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-summary.js","sourceRoot":"","sources":["../../../src/utils/svg/status-summary.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Pipeline Execution Timeline — horizontal Gantt chart.
3
- * Rich version: gradient bars, grid lines, header badge, duration labels, footer summary.
4
- */
5
- import type { ExecutionSummaryData } from "./types.js";
6
- export interface TimelineOptions {
7
- width?: number;
8
- showSteps?: boolean;
9
- maxStages?: number;
10
- }
11
- export declare function renderTimelineSvg(data: ExecutionSummaryData, options?: TimelineOptions): string;
12
- //# sourceMappingURL=timeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../../src/utils/svg/timeline.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AASvD,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,MAAM,CAkI/F"}