nowaikit 3.1.0 → 4.0.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.
Files changed (229) hide show
  1. package/desktop/renderer/dist/assets/index-D46KUWoj.js +49 -0
  2. package/desktop/renderer/dist/index.html +5 -5
  3. package/desktop/serve.cjs +88 -0
  4. package/dist/a2a/agent-card.d.ts +8 -0
  5. package/dist/a2a/agent-card.d.ts.map +1 -0
  6. package/dist/a2a/agent-card.js +82 -0
  7. package/dist/a2a/agent-card.js.map +1 -0
  8. package/dist/a2a/index.d.ts +13 -0
  9. package/dist/a2a/index.d.ts.map +1 -0
  10. package/dist/a2a/index.js +74 -0
  11. package/dist/a2a/index.js.map +1 -0
  12. package/dist/a2a/task-manager.d.ts +20 -0
  13. package/dist/a2a/task-manager.d.ts.map +1 -0
  14. package/dist/a2a/task-manager.js +148 -0
  15. package/dist/a2a/task-manager.js.map +1 -0
  16. package/dist/a2a/types.d.ts +73 -0
  17. package/dist/a2a/types.d.ts.map +1 -0
  18. package/dist/a2a/types.js +6 -0
  19. package/dist/a2a/types.js.map +1 -0
  20. package/dist/api/index.d.ts +16 -0
  21. package/dist/api/index.d.ts.map +1 -0
  22. package/dist/api/index.js +106 -0
  23. package/dist/api/index.js.map +1 -0
  24. package/dist/cli/config-store.d.ts +9 -0
  25. package/dist/cli/config-store.d.ts.map +1 -1
  26. package/dist/cli/config-store.js.map +1 -1
  27. package/dist/cli/index.js +100 -6
  28. package/dist/cli/index.js.map +1 -1
  29. package/dist/cli/setup.d.ts.map +1 -1
  30. package/dist/cli/setup.js +196 -13
  31. package/dist/cli/setup.js.map +1 -1
  32. package/dist/cli/writers/index.d.ts.map +1 -1
  33. package/dist/cli/writers/index.js +4 -3
  34. package/dist/cli/writers/index.js.map +1 -1
  35. package/dist/dashboard/index.d.ts +7 -0
  36. package/dist/dashboard/index.d.ts.map +1 -0
  37. package/dist/dashboard/index.js +111 -0
  38. package/dist/dashboard/index.js.map +1 -0
  39. package/dist/direct/llm-client.d.ts +1 -1
  40. package/dist/direct/llm-client.d.ts.map +1 -1
  41. package/dist/direct/llm-client.js +6 -1
  42. package/dist/direct/llm-client.js.map +1 -1
  43. package/dist/prompts/capabilities/build-app.d.ts.map +1 -1
  44. package/dist/prompts/capabilities/build-app.js +2 -0
  45. package/dist/prompts/capabilities/build-app.js.map +1 -1
  46. package/dist/prompts/capabilities/build-atf-suite.d.ts +4 -0
  47. package/dist/prompts/capabilities/build-atf-suite.d.ts.map +1 -0
  48. package/dist/prompts/capabilities/build-atf-suite.js +143 -0
  49. package/dist/prompts/capabilities/build-atf-suite.js.map +1 -0
  50. package/dist/prompts/capabilities/build-business-rule.d.ts.map +1 -1
  51. package/dist/prompts/capabilities/build-business-rule.js +2 -0
  52. package/dist/prompts/capabilities/build-business-rule.js.map +1 -1
  53. package/dist/prompts/capabilities/build-catalog.d.ts.map +1 -1
  54. package/dist/prompts/capabilities/build-catalog.js +2 -0
  55. package/dist/prompts/capabilities/build-catalog.js.map +1 -1
  56. package/dist/prompts/capabilities/build-client-script.d.ts.map +1 -1
  57. package/dist/prompts/capabilities/build-client-script.js +2 -0
  58. package/dist/prompts/capabilities/build-client-script.js.map +1 -1
  59. package/dist/prompts/capabilities/build-flow.d.ts.map +1 -1
  60. package/dist/prompts/capabilities/build-flow.js +2 -0
  61. package/dist/prompts/capabilities/build-flow.js.map +1 -1
  62. package/dist/prompts/capabilities/build-portal.d.ts.map +1 -1
  63. package/dist/prompts/capabilities/build-portal.js +2 -0
  64. package/dist/prompts/capabilities/build-portal.js.map +1 -1
  65. package/dist/prompts/capabilities/build-rest-api.d.ts.map +1 -1
  66. package/dist/prompts/capabilities/build-rest-api.js +2 -0
  67. package/dist/prompts/capabilities/build-rest-api.js.map +1 -1
  68. package/dist/prompts/capabilities/build-test-plan.d.ts.map +1 -1
  69. package/dist/prompts/capabilities/build-test-plan.js +2 -0
  70. package/dist/prompts/capabilities/build-test-plan.js.map +1 -1
  71. package/dist/prompts/capabilities/build-uib.d.ts.map +1 -1
  72. package/dist/prompts/capabilities/build-uib.js +2 -0
  73. package/dist/prompts/capabilities/build-uib.js.map +1 -1
  74. package/dist/prompts/capabilities/docs-app.d.ts.map +1 -1
  75. package/dist/prompts/capabilities/docs-app.js +2 -0
  76. package/dist/prompts/capabilities/docs-app.js.map +1 -1
  77. package/dist/prompts/capabilities/docs-release.d.ts.map +1 -1
  78. package/dist/prompts/capabilities/docs-release.js +2 -0
  79. package/dist/prompts/capabilities/docs-release.js.map +1 -1
  80. package/dist/prompts/capabilities/docs-runbook.d.ts.map +1 -1
  81. package/dist/prompts/capabilities/docs-runbook.js +2 -0
  82. package/dist/prompts/capabilities/docs-runbook.js.map +1 -1
  83. package/dist/prompts/capabilities/docs-script.d.ts.map +1 -1
  84. package/dist/prompts/capabilities/docs-script.js +2 -0
  85. package/dist/prompts/capabilities/docs-script.js.map +1 -1
  86. package/dist/prompts/capabilities/ops-deploy.d.ts.map +1 -1
  87. package/dist/prompts/capabilities/ops-deploy.js +2 -0
  88. package/dist/prompts/capabilities/ops-deploy.js.map +1 -1
  89. package/dist/prompts/capabilities/ops-risk.d.ts.map +1 -1
  90. package/dist/prompts/capabilities/ops-risk.js +2 -0
  91. package/dist/prompts/capabilities/ops-risk.js.map +1 -1
  92. package/dist/prompts/capabilities/ops-triage.d.ts.map +1 -1
  93. package/dist/prompts/capabilities/ops-triage.js +2 -0
  94. package/dist/prompts/capabilities/ops-triage.js.map +1 -1
  95. package/dist/prompts/capabilities/review-acls.d.ts.map +1 -1
  96. package/dist/prompts/capabilities/review-acls.js +2 -0
  97. package/dist/prompts/capabilities/review-acls.js.map +1 -1
  98. package/dist/prompts/capabilities/review-code.d.ts.map +1 -1
  99. package/dist/prompts/capabilities/review-code.js +2 -0
  100. package/dist/prompts/capabilities/review-code.js.map +1 -1
  101. package/dist/prompts/capabilities/review-flows.d.ts.map +1 -1
  102. package/dist/prompts/capabilities/review-flows.js +2 -0
  103. package/dist/prompts/capabilities/review-flows.js.map +1 -1
  104. package/dist/prompts/capabilities/review-scripts.d.ts.map +1 -1
  105. package/dist/prompts/capabilities/review-scripts.js +2 -0
  106. package/dist/prompts/capabilities/review-scripts.js.map +1 -1
  107. package/dist/prompts/capabilities/scan-automation.d.ts.map +1 -1
  108. package/dist/prompts/capabilities/scan-automation.js +2 -0
  109. package/dist/prompts/capabilities/scan-automation.js.map +1 -1
  110. package/dist/prompts/capabilities/scan-cmdb.d.ts.map +1 -1
  111. package/dist/prompts/capabilities/scan-cmdb.js +2 -0
  112. package/dist/prompts/capabilities/scan-cmdb.js.map +1 -1
  113. package/dist/prompts/capabilities/scan-debt.d.ts.map +1 -1
  114. package/dist/prompts/capabilities/scan-debt.js +2 -0
  115. package/dist/prompts/capabilities/scan-debt.js.map +1 -1
  116. package/dist/prompts/capabilities/scan-health.d.ts.map +1 -1
  117. package/dist/prompts/capabilities/scan-health.js +2 -0
  118. package/dist/prompts/capabilities/scan-health.js.map +1 -1
  119. package/dist/prompts/capabilities/scan-security.d.ts.map +1 -1
  120. package/dist/prompts/capabilities/scan-security.js +2 -0
  121. package/dist/prompts/capabilities/scan-security.js.map +1 -1
  122. package/dist/prompts/capabilities/scan-upgrade.d.ts.map +1 -1
  123. package/dist/prompts/capabilities/scan-upgrade.js +2 -0
  124. package/dist/prompts/capabilities/scan-upgrade.js.map +1 -1
  125. package/dist/prompts/index.d.ts.map +1 -1
  126. package/dist/prompts/index.js +2 -0
  127. package/dist/prompts/index.js.map +1 -1
  128. package/dist/reports/brand.d.ts +79 -0
  129. package/dist/reports/brand.d.ts.map +1 -0
  130. package/dist/reports/brand.js +204 -0
  131. package/dist/reports/brand.js.map +1 -0
  132. package/dist/reports/charts.d.ts +11 -0
  133. package/dist/reports/charts.d.ts.map +1 -0
  134. package/dist/reports/charts.js +91 -0
  135. package/dist/reports/charts.js.map +1 -0
  136. package/dist/reports/index.d.ts +13 -0
  137. package/dist/reports/index.d.ts.map +1 -0
  138. package/dist/reports/index.js +65 -0
  139. package/dist/reports/index.js.map +1 -0
  140. package/dist/reports/parser.d.ts +13 -0
  141. package/dist/reports/parser.d.ts.map +1 -0
  142. package/dist/reports/parser.js +202 -0
  143. package/dist/reports/parser.js.map +1 -0
  144. package/dist/reports/pdf-generator.d.ts +8 -0
  145. package/dist/reports/pdf-generator.d.ts.map +1 -0
  146. package/dist/reports/pdf-generator.js +244 -0
  147. package/dist/reports/pdf-generator.js.map +1 -0
  148. package/dist/reports/pptx-generator.d.ts +8 -0
  149. package/dist/reports/pptx-generator.d.ts.map +1 -0
  150. package/dist/reports/pptx-generator.js +273 -0
  151. package/dist/reports/pptx-generator.js.map +1 -0
  152. package/dist/reports/types.d.ts +60 -0
  153. package/dist/reports/types.d.ts.map +1 -0
  154. package/dist/reports/types.js +7 -0
  155. package/dist/reports/types.js.map +1 -0
  156. package/dist/resources/index.d.ts.map +1 -1
  157. package/dist/resources/index.js +10 -0
  158. package/dist/resources/index.js.map +1 -1
  159. package/dist/resources/query-syntax.d.ts +6 -0
  160. package/dist/resources/query-syntax.d.ts.map +1 -0
  161. package/dist/resources/query-syntax.js +113 -0
  162. package/dist/resources/query-syntax.js.map +1 -0
  163. package/dist/sdk/index.d.ts +2 -0
  164. package/dist/sdk/index.d.ts.map +1 -1
  165. package/dist/sdk/index.js +2 -0
  166. package/dist/sdk/index.js.map +1 -1
  167. package/dist/server.d.ts +2 -1
  168. package/dist/server.d.ts.map +1 -1
  169. package/dist/server.js +103 -92
  170. package/dist/server.js.map +1 -1
  171. package/dist/tools/ai-agents.d.ts +145 -0
  172. package/dist/tools/ai-agents.d.ts.map +1 -0
  173. package/dist/tools/ai-agents.js +185 -0
  174. package/dist/tools/ai-agents.js.map +1 -0
  175. package/dist/tools/cmdb-reconciliation.d.ts +112 -0
  176. package/dist/tools/cmdb-reconciliation.d.ts.map +1 -0
  177. package/dist/tools/cmdb-reconciliation.js +267 -0
  178. package/dist/tools/cmdb-reconciliation.js.map +1 -0
  179. package/dist/tools/discovery.d.ts +34 -0
  180. package/dist/tools/discovery.d.ts.map +1 -0
  181. package/dist/tools/discovery.js +168 -0
  182. package/dist/tools/discovery.js.map +1 -0
  183. package/dist/tools/fluent.d.ts +105 -11
  184. package/dist/tools/fluent.d.ts.map +1 -1
  185. package/dist/tools/fluent.js +118 -1
  186. package/dist/tools/fluent.js.map +1 -1
  187. package/dist/tools/index.d.ts +840 -0
  188. package/dist/tools/index.d.ts.map +1 -1
  189. package/dist/tools/index.js +44 -6
  190. package/dist/tools/index.js.map +1 -1
  191. package/dist/tools/ml.d.ts +104 -0
  192. package/dist/tools/ml.d.ts.map +1 -1
  193. package/dist/tools/ml.js +139 -0
  194. package/dist/tools/ml.js.map +1 -1
  195. package/dist/tools/now-assist-skills.d.ts +129 -0
  196. package/dist/tools/now-assist-skills.d.ts.map +1 -0
  197. package/dist/tools/now-assist-skills.js +128 -0
  198. package/dist/tools/now-assist-skills.js.map +1 -0
  199. package/dist/tools/orchestration.d.ts +132 -0
  200. package/dist/tools/orchestration.d.ts.map +1 -0
  201. package/dist/tools/orchestration.js +320 -0
  202. package/dist/tools/orchestration.js.map +1 -0
  203. package/dist/tools/reporting.d.ts +127 -1
  204. package/dist/tools/reporting.d.ts.map +1 -1
  205. package/dist/tools/reporting.js +64 -0
  206. package/dist/tools/reporting.js.map +1 -1
  207. package/dist/tools/schema-cache.d.ts +44 -0
  208. package/dist/tools/schema-cache.d.ts.map +1 -0
  209. package/dist/tools/schema-cache.js +127 -0
  210. package/dist/tools/schema-cache.js.map +1 -0
  211. package/dist/tools-manifest.json +660 -0
  212. package/dist/transport/auth-middleware.d.ts +16 -0
  213. package/dist/transport/auth-middleware.d.ts.map +1 -0
  214. package/dist/transport/auth-middleware.js +31 -0
  215. package/dist/transport/auth-middleware.js.map +1 -0
  216. package/dist/transport/http-server.d.ts +44 -0
  217. package/dist/transport/http-server.d.ts.map +1 -0
  218. package/dist/transport/http-server.js +172 -0
  219. package/dist/transport/http-server.js.map +1 -0
  220. package/dist/transport/index.d.ts +19 -0
  221. package/dist/transport/index.d.ts.map +1 -0
  222. package/dist/transport/index.js +105 -0
  223. package/dist/transport/index.js.map +1 -0
  224. package/dist/utils/permissions.d.ts +2 -0
  225. package/dist/utils/permissions.d.ts.map +1 -1
  226. package/dist/utils/permissions.js +8 -0
  227. package/dist/utils/permissions.js.map +1 -1
  228. package/package.json +7 -1
  229. package/desktop/renderer/dist/assets/index-C_5k3daB.js +0 -49
@@ -0,0 +1,91 @@
1
+ import { severityColor, BRAND } from './brand.js';
2
+ const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
3
+ /** Escape XML special characters for safe SVG text content. */
4
+ function escXml(s) {
5
+ return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
6
+ }
7
+ /** Generate an SVG pie chart for severity distribution. */
8
+ export function severityPieChart(counts, size = 200) {
9
+ const total = Object.values(counts).reduce((a, b) => a + b, 0);
10
+ if (total === 0) {
11
+ return `<svg width="${size}" height="${size}" xmlns="http://www.w3.org/2000/svg">
12
+ <circle cx="${size / 2}" cy="${size / 2}" r="${size / 2 - 10}" fill="${BRAND.grayLight}" />
13
+ <text x="${size / 2}" y="${size / 2}" text-anchor="middle" dy="4" font-size="12" fill="${BRAND.textLight}">No findings</text>
14
+ </svg>`;
15
+ }
16
+ const cx = size / 2;
17
+ const cy = size / 2;
18
+ const radius = size / 2 - 10;
19
+ let startAngle = -Math.PI / 2; // Start from top
20
+ const paths = [];
21
+ const labels = [];
22
+ for (const sev of SEVERITY_ORDER) {
23
+ const count = counts[sev];
24
+ if (count === 0)
25
+ continue;
26
+ const sliceAngle = (count / total) * 2 * Math.PI;
27
+ const endAngle = startAngle + sliceAngle;
28
+ const x1 = cx + radius * Math.cos(startAngle);
29
+ const y1 = cy + radius * Math.sin(startAngle);
30
+ const x2 = cx + radius * Math.cos(endAngle);
31
+ const y2 = cy + radius * Math.sin(endAngle);
32
+ const largeArc = sliceAngle > Math.PI ? 1 : 0;
33
+ const color = severityColor(sev);
34
+ paths.push(`<path d="M ${cx} ${cy} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} Z" fill="${color}" stroke="white" stroke-width="1.5"/>`);
35
+ // Label at midpoint of arc
36
+ const midAngle = startAngle + sliceAngle / 2;
37
+ const labelRadius = radius * 0.65;
38
+ const lx = cx + labelRadius * Math.cos(midAngle);
39
+ const ly = cy + labelRadius * Math.sin(midAngle);
40
+ const pct = Math.round((count / total) * 100);
41
+ if (pct >= 5) {
42
+ labels.push(`<text x="${lx}" y="${ly}" text-anchor="middle" dy="4" font-size="10" font-weight="bold" fill="white">${count}</text>`);
43
+ }
44
+ startAngle = endAngle;
45
+ }
46
+ // Legend
47
+ const legendY = size + 8;
48
+ const legendItems = SEVERITY_ORDER
49
+ .filter(s => counts[s] > 0)
50
+ .map((sev, i) => {
51
+ const x = 10 + (i % 3) * 70;
52
+ const y = legendY + Math.floor(i / 3) * 16;
53
+ return `<rect x="${x}" y="${y}" width="10" height="10" rx="2" fill="${severityColor(sev)}"/>
54
+ <text x="${x + 14}" y="${y + 9}" font-size="9" fill="${BRAND.text}">${escXml(sev.charAt(0).toUpperCase() + sev.slice(1))} (${counts[sev]})</text>`;
55
+ });
56
+ const legendHeight = Math.ceil(SEVERITY_ORDER.filter(s => counts[s] > 0).length / 3) * 16 + 8;
57
+ const totalHeight = size + legendHeight + 12;
58
+ return `<svg width="${size}" height="${totalHeight}" xmlns="http://www.w3.org/2000/svg">
59
+ ${paths.join('\n ')}
60
+ ${labels.join('\n ')}
61
+ ${legendItems.join('\n ')}
62
+ </svg>`;
63
+ }
64
+ /** Generate an SVG horizontal bar chart for category breakdown. */
65
+ export function categoryBarChart(breakdown, width = 300, barHeight = 22) {
66
+ const entries = Object.entries(breakdown)
67
+ .sort((a, b) => b[1] - a[1])
68
+ .slice(0, 10); // Top 10 categories
69
+ if (entries.length === 0) {
70
+ return `<svg width="${width}" height="40" xmlns="http://www.w3.org/2000/svg">
71
+ <text x="${width / 2}" y="20" text-anchor="middle" font-size="12" fill="${BRAND.textLight}">No categories</text>
72
+ </svg>`;
73
+ }
74
+ const maxValue = Math.max(...entries.map(e => e[1]));
75
+ const labelWidth = 120;
76
+ const chartWidth = width - labelWidth - 40;
77
+ const padding = 4;
78
+ const totalHeight = entries.length * (barHeight + padding) + 10;
79
+ const bars = entries.map(([category, count], i) => {
80
+ const y = i * (barHeight + padding) + 5;
81
+ const barW = Math.max((count / maxValue) * chartWidth, 2);
82
+ const truncatedLabel = category.length > 18 ? category.slice(0, 16) + '...' : category;
83
+ return `<text x="${labelWidth - 5}" y="${y + barHeight / 2 + 4}" text-anchor="end" font-size="10" fill="${BRAND.text}">${escXml(truncatedLabel)}</text>
84
+ <rect x="${labelWidth}" y="${y}" width="${barW}" height="${barHeight}" rx="3" fill="${BRAND.teal}" opacity="0.85"/>
85
+ <text x="${labelWidth + barW + 5}" y="${y + barHeight / 2 + 4}" font-size="10" fill="${BRAND.textLight}">${count}</text>`;
86
+ });
87
+ return `<svg width="${width}" height="${totalHeight}" xmlns="http://www.w3.org/2000/svg">
88
+ ${bars.join('\n ')}
89
+ </svg>`;
90
+ }
91
+ //# sourceMappingURL=charts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"charts.js","sourceRoot":"","sources":["../../src/reports/charts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ReportFormat, ReportOptions, ReportResult } from './types.js';
2
+ /**
3
+ * Generate a branded report from capability markdown output.
4
+ *
5
+ * @param markdown - Raw markdown from LLM capability analysis
6
+ * @param format - Output format: 'pdf', 'pptx', or 'md'
7
+ * @param options - Report metadata (title, instance info, output directory)
8
+ * @returns File path and size of generated report
9
+ */
10
+ export declare function generateReport(markdown: string, format: ReportFormat, options: ReportOptions): Promise<ReportResult>;
11
+ export type { ReportData, ReportFormat, ReportOptions, ReportResult, ReportFinding, ReportMetrics, Severity } from './types.js';
12
+ export { parseMarkdown } from './parser.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reports/index.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG5E;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAwCvB;AAGD,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChI,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Report generation entry point.
3
+ * Lazy-loads PDF/PPTX generators to avoid startup cost for MCP mode.
4
+ *
5
+ * @example
6
+ * ```ts
7
+ * import { generateReport } from './reports/index.js';
8
+ *
9
+ * const result = await generateReport(markdown, 'pdf', {
10
+ * title: 'Instance Health Scan',
11
+ * instanceUrl: 'https://dev12345.service-now.com',
12
+ * instanceName: 'dev',
13
+ * });
14
+ * console.log(result.filePath); // /tmp/scan-health_dev_20260403.pdf
15
+ * ```
16
+ */
17
+ import { join } from 'path';
18
+ import { tmpdir } from 'os';
19
+ import { mkdirSync, existsSync } from 'fs';
20
+ import { parseMarkdown } from './parser.js';
21
+ /**
22
+ * Generate a branded report from capability markdown output.
23
+ *
24
+ * @param markdown - Raw markdown from LLM capability analysis
25
+ * @param format - Output format: 'pdf', 'pptx', or 'md'
26
+ * @param options - Report metadata (title, instance info, output directory)
27
+ * @returns File path and size of generated report
28
+ */
29
+ export async function generateReport(markdown, format, options) {
30
+ // Build output path
31
+ const outputDir = options.outputDir || join(tmpdir(), 'nowaikit-reports');
32
+ if (!existsSync(outputDir)) {
33
+ mkdirSync(outputDir, { recursive: true });
34
+ }
35
+ const sanitize = (s) => s.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 40);
36
+ const datestamp = new Date().toISOString().split('T')[0].replace(/-/g, '');
37
+ const baseName = `${sanitize(options.capability || 'report')}_${sanitize(options.instanceName)}_${datestamp}`;
38
+ const ext = format === 'md' ? 'md' : format;
39
+ const outputPath = join(outputDir, `${baseName}.${ext}`);
40
+ // For markdown, just write the raw content
41
+ if (format === 'md') {
42
+ const { writeFileSync } = await import('fs');
43
+ writeFileSync(outputPath, markdown);
44
+ return { filePath: outputPath, sizeBytes: Buffer.byteLength(markdown) };
45
+ }
46
+ // Parse markdown into structured report data
47
+ const reportData = parseMarkdown(markdown, {
48
+ title: options.title,
49
+ capability: options.capability || '',
50
+ instanceName: options.instanceName,
51
+ instanceUrl: options.instanceUrl,
52
+ });
53
+ // Lazy-load generators
54
+ if (format === 'pdf') {
55
+ const { generatePdf } = await import('./pdf-generator.js');
56
+ return generatePdf(reportData, outputPath);
57
+ }
58
+ if (format === 'pptx') {
59
+ const { generatePptx } = await import('./pptx-generator.js');
60
+ return generatePptx(reportData, outputPath);
61
+ }
62
+ throw new Error(`Unsupported report format: ${format}`);
63
+ }
64
+ export { parseMarkdown } from './parser.js';
65
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reports/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,MAAoB,EACpB,OAAsB;IAEtB,oBAAoB;IACpB,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAC1E,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS,EAAE,CAAC;IAC9G,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC;IAEzD,2CAA2C;IAC3C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC1E,CAAC;IAED,6CAA6C;IAC7C,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,EAAE;QACzC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,WAAW,EAAE,OAAO,CAAC,WAAW;KACjC,CAAC,CAAC;IAEH,uBAAuB;IACvB,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC3D,OAAO,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAC7D,OAAO,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC;AAID,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Markdown → ReportData parser.
3
+ * Extracts sections, findings, tables, and metrics from capability output.
4
+ */
5
+ import type { ReportData } from './types.js';
6
+ /** Parse capability markdown output into structured ReportData. */
7
+ export declare function parseMarkdown(markdown: string, options: {
8
+ title: string;
9
+ capability: string;
10
+ instanceName: string;
11
+ instanceUrl: string;
12
+ }): ReportData;
13
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/reports/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAsE,MAAM,YAAY,CAAC;AAkGjH,mEAAmE;AACnE,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACxF,UAAU,CA2HZ"}
@@ -0,0 +1,202 @@
1
+ const SEVERITY_PATTERN = /\[(CRITICAL|HIGH|MEDIUM|LOW|INFO)\]/i;
2
+ const SECTION_PATTERN = /^#{1,3}\s+(?:\d+\.\s*)?(.+)$/;
3
+ const TABLE_SEPARATOR = /^\s*\|[\s:|-]+\|\s*$/;
4
+ /** Parse a line of markdown for a severity-tagged finding. */
5
+ function parseFinding(line, category) {
6
+ const match = line.match(SEVERITY_PATTERN);
7
+ if (!match)
8
+ return null;
9
+ const severity = match[1].toLowerCase();
10
+ // Remove the severity tag and clean up the line
11
+ const rest = line.replace(SEVERITY_PATTERN, '').replace(/^[\s\-*]+/, '').trim();
12
+ // Try to split on common delimiters: " — ", " - ", ": "
13
+ const parts = rest.split(/\s+[—\-]\s+/);
14
+ const title = parts[0]?.trim() || rest;
15
+ const description = parts.slice(1).join(' — ').trim() || title;
16
+ return {
17
+ severity,
18
+ category,
19
+ title,
20
+ description,
21
+ };
22
+ }
23
+ /** Parse evidence, impact, recommendation from indented lines following a finding. */
24
+ function enrichFinding(finding, lines) {
25
+ for (const line of lines) {
26
+ const trimmed = line.trim();
27
+ const evidenceMatch = trimmed.match(/^Evidence:\s*(.+)/i);
28
+ if (evidenceMatch) {
29
+ finding.evidence = evidenceMatch[1].trim();
30
+ continue;
31
+ }
32
+ const impactMatch = trimmed.match(/^Impact:\s*(.+)/i);
33
+ if (impactMatch) {
34
+ finding.impact = impactMatch[1].trim();
35
+ continue;
36
+ }
37
+ const recMatch = trimmed.match(/^Recommendation:\s*(.+)/i);
38
+ if (recMatch) {
39
+ finding.recommendation = recMatch[1].trim();
40
+ continue;
41
+ }
42
+ }
43
+ }
44
+ /** Parse markdown pipe-delimited table into headers and rows. */
45
+ function parseTable(lines) {
46
+ if (lines.length < 2)
47
+ return null;
48
+ const parseRow = (line) => line.split('|').map(c => c.trim()).filter(c => c.length > 0);
49
+ const headers = parseRow(lines[0]);
50
+ if (headers.length === 0)
51
+ return null;
52
+ // Skip separator line (line[1])
53
+ const rows = [];
54
+ for (let i = 2; i < lines.length; i++) {
55
+ const row = parseRow(lines[i]);
56
+ if (row.length > 0)
57
+ rows.push(row);
58
+ }
59
+ if (rows.length === 0)
60
+ return null;
61
+ return { headers, rows };
62
+ }
63
+ /** Extract the executive summary from markdown. */
64
+ function extractExecutiveSummary(markdown) {
65
+ // Look for "EXECUTIVE SUMMARY" or "Executive Summary" heading
66
+ const pattern = /(?:^|\n)#+\s*(?:EXECUTIVE\s+SUMMARY|Executive\s+Summary)[^\n]*\n([\s\S]*?)(?=\n#|\n---|\n\*{3}|$)/i;
67
+ const match = markdown.match(pattern);
68
+ if (match) {
69
+ return match[1].trim().split('\n').filter(l => l.trim()).slice(0, 10).join('\n');
70
+ }
71
+ // Fallback: first paragraph after first heading
72
+ const firstParagraph = markdown.match(/^#+[^\n]+\n+([\s\S]*?)(?:\n\n|\n#)/);
73
+ if (firstParagraph) {
74
+ return firstParagraph[1].trim().split('\n').slice(0, 5).join('\n');
75
+ }
76
+ return '';
77
+ }
78
+ /** Detect overall health from markdown content. */
79
+ function detectOverallHealth(markdown) {
80
+ const healthMatch = markdown.match(/Overall\s+health:\s*(Healthy|Degraded|Critical)/i);
81
+ if (healthMatch) {
82
+ return healthMatch[1].toLowerCase();
83
+ }
84
+ return undefined;
85
+ }
86
+ /** Parse capability markdown output into structured ReportData. */
87
+ export function parseMarkdown(markdown, options) {
88
+ const lines = markdown.split('\n');
89
+ const sections = [];
90
+ const allFindings = [];
91
+ let currentSection = null;
92
+ let currentCategory = 'General';
93
+ let tableLines = [];
94
+ let inTable = false;
95
+ let findingContextLines = [];
96
+ let lastFinding = null;
97
+ const flushTable = () => {
98
+ if (inTable && tableLines.length > 0 && currentSection) {
99
+ const table = parseTable(tableLines);
100
+ if (table)
101
+ currentSection.tables.push(table);
102
+ tableLines = [];
103
+ inTable = false;
104
+ }
105
+ };
106
+ const flushFindingContext = () => {
107
+ if (lastFinding && findingContextLines.length > 0) {
108
+ enrichFinding(lastFinding, findingContextLines);
109
+ findingContextLines = [];
110
+ }
111
+ lastFinding = null;
112
+ };
113
+ for (let i = 0; i < lines.length; i++) {
114
+ const line = lines[i];
115
+ // Section header
116
+ const sectionMatch = line.match(SECTION_PATTERN);
117
+ if (sectionMatch && !inTable) {
118
+ flushTable();
119
+ flushFindingContext();
120
+ currentCategory = sectionMatch[1].trim();
121
+ currentSection = {
122
+ title: currentCategory,
123
+ content: '',
124
+ findings: [],
125
+ tables: [],
126
+ };
127
+ sections.push(currentSection);
128
+ continue;
129
+ }
130
+ // Table detection
131
+ if (line.trim().startsWith('|')) {
132
+ if (TABLE_SEPARATOR.test(line) && tableLines.length === 1) {
133
+ inTable = true;
134
+ tableLines.push(line);
135
+ continue;
136
+ }
137
+ if (inTable || tableLines.length === 0) {
138
+ tableLines.push(line);
139
+ if (!inTable && tableLines.length === 1)
140
+ continue; // Wait for separator
141
+ continue;
142
+ }
143
+ }
144
+ else if (inTable) {
145
+ flushTable();
146
+ }
147
+ else if (tableLines.length > 0) {
148
+ // Single pipe line that wasn't followed by separator — not a table
149
+ tableLines = [];
150
+ }
151
+ // Finding detection
152
+ const finding = parseFinding(line, currentCategory);
153
+ if (finding) {
154
+ flushFindingContext();
155
+ lastFinding = finding;
156
+ allFindings.push(finding);
157
+ if (currentSection)
158
+ currentSection.findings.push(finding);
159
+ continue;
160
+ }
161
+ // Context lines for findings (evidence, impact, recommendation)
162
+ if (lastFinding && line.match(/^\s+(Evidence|Impact|Recommendation):/i)) {
163
+ findingContextLines.push(line);
164
+ continue;
165
+ }
166
+ else if (lastFinding && line.trim() === '') {
167
+ flushFindingContext();
168
+ }
169
+ // Regular content
170
+ if (currentSection) {
171
+ currentSection.content += line + '\n';
172
+ }
173
+ }
174
+ flushTable();
175
+ flushFindingContext();
176
+ // Build metrics
177
+ const severityCounts = { critical: 0, high: 0, medium: 0, low: 0, info: 0 };
178
+ const categoryBreakdown = {};
179
+ for (const f of allFindings) {
180
+ severityCounts[f.severity]++;
181
+ categoryBreakdown[f.category] = (categoryBreakdown[f.category] || 0) + 1;
182
+ }
183
+ const metrics = {
184
+ severityCounts,
185
+ categoryBreakdown,
186
+ totalFindings: allFindings.length,
187
+ overallHealth: detectOverallHealth(markdown),
188
+ };
189
+ return {
190
+ title: options.title,
191
+ capability: options.capability,
192
+ instanceName: options.instanceName,
193
+ instanceUrl: options.instanceUrl,
194
+ scanDate: new Date().toISOString().split('T')[0],
195
+ executiveSummary: extractExecutiveSummary(markdown),
196
+ metrics,
197
+ sections,
198
+ findings: allFindings,
199
+ rawMarkdown: markdown,
200
+ };
201
+ }
202
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/reports/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * PDF report generator using pdfmake.
3
+ * Produces branded, multi-page PDF with charts, tables, and ServiceNow links.
4
+ */
5
+ import type { ReportData, ReportResult } from './types.js';
6
+ /** Generate a branded PDF from ReportData. Returns file path and size. */
7
+ export declare function generatePdf(data: ReportData, outputPath: string): Promise<ReportResult>;
8
+ //# sourceMappingURL=pdf-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.d.ts","sourceRoot":"","sources":["../../src/reports/pdf-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AAMrE,0EAA0E;AAC1E,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoQ7F"}