nowaikit 3.0.0 → 4.0.0

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 (235) hide show
  1. package/LICENSE +10 -10
  2. package/README.md +8 -6
  3. package/desktop/renderer/dist/assets/index-D46KUWoj.js +49 -0
  4. package/desktop/renderer/dist/index.html +5 -5
  5. package/desktop/serve.cjs +134 -10
  6. package/dist/a2a/agent-card.d.ts +8 -0
  7. package/dist/a2a/agent-card.d.ts.map +1 -0
  8. package/dist/a2a/agent-card.js +82 -0
  9. package/dist/a2a/agent-card.js.map +1 -0
  10. package/dist/a2a/index.d.ts +13 -0
  11. package/dist/a2a/index.d.ts.map +1 -0
  12. package/dist/a2a/index.js +74 -0
  13. package/dist/a2a/index.js.map +1 -0
  14. package/dist/a2a/task-manager.d.ts +20 -0
  15. package/dist/a2a/task-manager.d.ts.map +1 -0
  16. package/dist/a2a/task-manager.js +148 -0
  17. package/dist/a2a/task-manager.js.map +1 -0
  18. package/dist/a2a/types.d.ts +73 -0
  19. package/dist/a2a/types.d.ts.map +1 -0
  20. package/dist/a2a/types.js +6 -0
  21. package/dist/a2a/types.js.map +1 -0
  22. package/dist/api/index.d.ts +16 -0
  23. package/dist/api/index.d.ts.map +1 -0
  24. package/dist/api/index.js +106 -0
  25. package/dist/api/index.js.map +1 -0
  26. package/dist/cli/config-store.d.ts +31 -0
  27. package/dist/cli/config-store.d.ts.map +1 -1
  28. package/dist/cli/config-store.js +44 -1
  29. package/dist/cli/config-store.js.map +1 -1
  30. package/dist/cli/index.js +115 -9
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/cli/setup.d.ts.map +1 -1
  33. package/dist/cli/setup.js +669 -49
  34. package/dist/cli/setup.js.map +1 -1
  35. package/dist/cli/shortcuts.d.ts +2 -0
  36. package/dist/cli/shortcuts.d.ts.map +1 -0
  37. package/dist/cli/shortcuts.js +122 -0
  38. package/dist/cli/shortcuts.js.map +1 -0
  39. package/dist/dashboard/index.d.ts +7 -0
  40. package/dist/dashboard/index.d.ts.map +1 -0
  41. package/dist/dashboard/index.js +111 -0
  42. package/dist/dashboard/index.js.map +1 -0
  43. package/dist/direct/llm-client.d.ts +1 -1
  44. package/dist/direct/llm-client.d.ts.map +1 -1
  45. package/dist/direct/llm-client.js +9 -4
  46. package/dist/direct/llm-client.js.map +1 -1
  47. package/dist/prompts/capabilities/build-app.d.ts.map +1 -1
  48. package/dist/prompts/capabilities/build-app.js +2 -0
  49. package/dist/prompts/capabilities/build-app.js.map +1 -1
  50. package/dist/prompts/capabilities/build-atf-suite.d.ts +4 -0
  51. package/dist/prompts/capabilities/build-atf-suite.d.ts.map +1 -0
  52. package/dist/prompts/capabilities/build-atf-suite.js +143 -0
  53. package/dist/prompts/capabilities/build-atf-suite.js.map +1 -0
  54. package/dist/prompts/capabilities/build-business-rule.d.ts.map +1 -1
  55. package/dist/prompts/capabilities/build-business-rule.js +2 -0
  56. package/dist/prompts/capabilities/build-business-rule.js.map +1 -1
  57. package/dist/prompts/capabilities/build-catalog.d.ts.map +1 -1
  58. package/dist/prompts/capabilities/build-catalog.js +2 -0
  59. package/dist/prompts/capabilities/build-catalog.js.map +1 -1
  60. package/dist/prompts/capabilities/build-client-script.d.ts.map +1 -1
  61. package/dist/prompts/capabilities/build-client-script.js +2 -0
  62. package/dist/prompts/capabilities/build-client-script.js.map +1 -1
  63. package/dist/prompts/capabilities/build-flow.d.ts.map +1 -1
  64. package/dist/prompts/capabilities/build-flow.js +2 -0
  65. package/dist/prompts/capabilities/build-flow.js.map +1 -1
  66. package/dist/prompts/capabilities/build-portal.d.ts.map +1 -1
  67. package/dist/prompts/capabilities/build-portal.js +2 -0
  68. package/dist/prompts/capabilities/build-portal.js.map +1 -1
  69. package/dist/prompts/capabilities/build-rest-api.d.ts.map +1 -1
  70. package/dist/prompts/capabilities/build-rest-api.js +2 -0
  71. package/dist/prompts/capabilities/build-rest-api.js.map +1 -1
  72. package/dist/prompts/capabilities/build-test-plan.d.ts.map +1 -1
  73. package/dist/prompts/capabilities/build-test-plan.js +2 -0
  74. package/dist/prompts/capabilities/build-test-plan.js.map +1 -1
  75. package/dist/prompts/capabilities/build-uib.d.ts.map +1 -1
  76. package/dist/prompts/capabilities/build-uib.js +2 -0
  77. package/dist/prompts/capabilities/build-uib.js.map +1 -1
  78. package/dist/prompts/capabilities/docs-app.d.ts.map +1 -1
  79. package/dist/prompts/capabilities/docs-app.js +2 -0
  80. package/dist/prompts/capabilities/docs-app.js.map +1 -1
  81. package/dist/prompts/capabilities/docs-release.d.ts.map +1 -1
  82. package/dist/prompts/capabilities/docs-release.js +2 -0
  83. package/dist/prompts/capabilities/docs-release.js.map +1 -1
  84. package/dist/prompts/capabilities/docs-runbook.d.ts.map +1 -1
  85. package/dist/prompts/capabilities/docs-runbook.js +2 -0
  86. package/dist/prompts/capabilities/docs-runbook.js.map +1 -1
  87. package/dist/prompts/capabilities/docs-script.d.ts.map +1 -1
  88. package/dist/prompts/capabilities/docs-script.js +2 -0
  89. package/dist/prompts/capabilities/docs-script.js.map +1 -1
  90. package/dist/prompts/capabilities/ops-deploy.d.ts.map +1 -1
  91. package/dist/prompts/capabilities/ops-deploy.js +2 -0
  92. package/dist/prompts/capabilities/ops-deploy.js.map +1 -1
  93. package/dist/prompts/capabilities/ops-risk.d.ts.map +1 -1
  94. package/dist/prompts/capabilities/ops-risk.js +2 -0
  95. package/dist/prompts/capabilities/ops-risk.js.map +1 -1
  96. package/dist/prompts/capabilities/ops-triage.d.ts.map +1 -1
  97. package/dist/prompts/capabilities/ops-triage.js +2 -0
  98. package/dist/prompts/capabilities/ops-triage.js.map +1 -1
  99. package/dist/prompts/capabilities/review-acls.d.ts.map +1 -1
  100. package/dist/prompts/capabilities/review-acls.js +2 -0
  101. package/dist/prompts/capabilities/review-acls.js.map +1 -1
  102. package/dist/prompts/capabilities/review-code.d.ts.map +1 -1
  103. package/dist/prompts/capabilities/review-code.js +2 -0
  104. package/dist/prompts/capabilities/review-code.js.map +1 -1
  105. package/dist/prompts/capabilities/review-flows.d.ts.map +1 -1
  106. package/dist/prompts/capabilities/review-flows.js +2 -0
  107. package/dist/prompts/capabilities/review-flows.js.map +1 -1
  108. package/dist/prompts/capabilities/review-scripts.d.ts.map +1 -1
  109. package/dist/prompts/capabilities/review-scripts.js +2 -0
  110. package/dist/prompts/capabilities/review-scripts.js.map +1 -1
  111. package/dist/prompts/capabilities/scan-automation.d.ts.map +1 -1
  112. package/dist/prompts/capabilities/scan-automation.js +2 -0
  113. package/dist/prompts/capabilities/scan-automation.js.map +1 -1
  114. package/dist/prompts/capabilities/scan-cmdb.d.ts.map +1 -1
  115. package/dist/prompts/capabilities/scan-cmdb.js +2 -0
  116. package/dist/prompts/capabilities/scan-cmdb.js.map +1 -1
  117. package/dist/prompts/capabilities/scan-debt.d.ts.map +1 -1
  118. package/dist/prompts/capabilities/scan-debt.js +2 -0
  119. package/dist/prompts/capabilities/scan-debt.js.map +1 -1
  120. package/dist/prompts/capabilities/scan-health.d.ts.map +1 -1
  121. package/dist/prompts/capabilities/scan-health.js +2 -0
  122. package/dist/prompts/capabilities/scan-health.js.map +1 -1
  123. package/dist/prompts/capabilities/scan-security.d.ts.map +1 -1
  124. package/dist/prompts/capabilities/scan-security.js +2 -0
  125. package/dist/prompts/capabilities/scan-security.js.map +1 -1
  126. package/dist/prompts/capabilities/scan-upgrade.d.ts.map +1 -1
  127. package/dist/prompts/capabilities/scan-upgrade.js +2 -0
  128. package/dist/prompts/capabilities/scan-upgrade.js.map +1 -1
  129. package/dist/prompts/index.d.ts.map +1 -1
  130. package/dist/prompts/index.js +47 -8
  131. package/dist/prompts/index.js.map +1 -1
  132. package/dist/reports/brand.d.ts +79 -0
  133. package/dist/reports/brand.d.ts.map +1 -0
  134. package/dist/reports/brand.js +204 -0
  135. package/dist/reports/brand.js.map +1 -0
  136. package/dist/reports/charts.d.ts +11 -0
  137. package/dist/reports/charts.d.ts.map +1 -0
  138. package/dist/reports/charts.js +91 -0
  139. package/dist/reports/charts.js.map +1 -0
  140. package/dist/reports/index.d.ts +13 -0
  141. package/dist/reports/index.d.ts.map +1 -0
  142. package/dist/reports/index.js +65 -0
  143. package/dist/reports/index.js.map +1 -0
  144. package/dist/reports/parser.d.ts +13 -0
  145. package/dist/reports/parser.d.ts.map +1 -0
  146. package/dist/reports/parser.js +202 -0
  147. package/dist/reports/parser.js.map +1 -0
  148. package/dist/reports/pdf-generator.d.ts +8 -0
  149. package/dist/reports/pdf-generator.d.ts.map +1 -0
  150. package/dist/reports/pdf-generator.js +244 -0
  151. package/dist/reports/pdf-generator.js.map +1 -0
  152. package/dist/reports/pptx-generator.d.ts +8 -0
  153. package/dist/reports/pptx-generator.d.ts.map +1 -0
  154. package/dist/reports/pptx-generator.js +273 -0
  155. package/dist/reports/pptx-generator.js.map +1 -0
  156. package/dist/reports/types.d.ts +60 -0
  157. package/dist/reports/types.d.ts.map +1 -0
  158. package/dist/reports/types.js +7 -0
  159. package/dist/reports/types.js.map +1 -0
  160. package/dist/resources/index.d.ts.map +1 -1
  161. package/dist/resources/index.js +10 -0
  162. package/dist/resources/index.js.map +1 -1
  163. package/dist/resources/query-syntax.d.ts +6 -0
  164. package/dist/resources/query-syntax.d.ts.map +1 -0
  165. package/dist/resources/query-syntax.js +113 -0
  166. package/dist/resources/query-syntax.js.map +1 -0
  167. package/dist/sdk/index.d.ts +51 -0
  168. package/dist/sdk/index.d.ts.map +1 -0
  169. package/dist/sdk/index.js +55 -0
  170. package/dist/sdk/index.js.map +1 -0
  171. package/dist/server.d.ts +2 -1
  172. package/dist/server.d.ts.map +1 -1
  173. package/dist/server.js +103 -92
  174. package/dist/server.js.map +1 -1
  175. package/dist/servicenow/client.js +1 -1
  176. package/dist/servicenow/client.js.map +1 -1
  177. package/dist/tools/ai-agents.d.ts +145 -0
  178. package/dist/tools/ai-agents.d.ts.map +1 -0
  179. package/dist/tools/ai-agents.js +185 -0
  180. package/dist/tools/ai-agents.js.map +1 -0
  181. package/dist/tools/cmdb-reconciliation.d.ts +112 -0
  182. package/dist/tools/cmdb-reconciliation.d.ts.map +1 -0
  183. package/dist/tools/cmdb-reconciliation.js +267 -0
  184. package/dist/tools/cmdb-reconciliation.js.map +1 -0
  185. package/dist/tools/discovery.d.ts +34 -0
  186. package/dist/tools/discovery.d.ts.map +1 -0
  187. package/dist/tools/discovery.js +168 -0
  188. package/dist/tools/discovery.js.map +1 -0
  189. package/dist/tools/fluent.d.ts +105 -11
  190. package/dist/tools/fluent.d.ts.map +1 -1
  191. package/dist/tools/fluent.js +118 -1
  192. package/dist/tools/fluent.js.map +1 -1
  193. package/dist/tools/index.d.ts +840 -0
  194. package/dist/tools/index.d.ts.map +1 -1
  195. package/dist/tools/index.js +44 -6
  196. package/dist/tools/index.js.map +1 -1
  197. package/dist/tools/ml.d.ts +104 -0
  198. package/dist/tools/ml.d.ts.map +1 -1
  199. package/dist/tools/ml.js +139 -0
  200. package/dist/tools/ml.js.map +1 -1
  201. package/dist/tools/now-assist-skills.d.ts +129 -0
  202. package/dist/tools/now-assist-skills.d.ts.map +1 -0
  203. package/dist/tools/now-assist-skills.js +128 -0
  204. package/dist/tools/now-assist-skills.js.map +1 -0
  205. package/dist/tools/orchestration.d.ts +132 -0
  206. package/dist/tools/orchestration.d.ts.map +1 -0
  207. package/dist/tools/orchestration.js +320 -0
  208. package/dist/tools/orchestration.js.map +1 -0
  209. package/dist/tools/reporting.d.ts +127 -1
  210. package/dist/tools/reporting.d.ts.map +1 -1
  211. package/dist/tools/reporting.js +64 -0
  212. package/dist/tools/reporting.js.map +1 -1
  213. package/dist/tools/schema-cache.d.ts +44 -0
  214. package/dist/tools/schema-cache.d.ts.map +1 -0
  215. package/dist/tools/schema-cache.js +127 -0
  216. package/dist/tools/schema-cache.js.map +1 -0
  217. package/dist/tools-manifest.json +1250 -25
  218. package/dist/transport/auth-middleware.d.ts +16 -0
  219. package/dist/transport/auth-middleware.d.ts.map +1 -0
  220. package/dist/transport/auth-middleware.js +31 -0
  221. package/dist/transport/auth-middleware.js.map +1 -0
  222. package/dist/transport/http-server.d.ts +44 -0
  223. package/dist/transport/http-server.d.ts.map +1 -0
  224. package/dist/transport/http-server.js +172 -0
  225. package/dist/transport/http-server.js.map +1 -0
  226. package/dist/transport/index.d.ts +19 -0
  227. package/dist/transport/index.d.ts.map +1 -0
  228. package/dist/transport/index.js +105 -0
  229. package/dist/transport/index.js.map +1 -0
  230. package/dist/utils/permissions.d.ts +2 -0
  231. package/dist/utils/permissions.d.ts.map +1 -1
  232. package/dist/utils/permissions.js +8 -0
  233. package/dist/utils/permissions.js.map +1 -1
  234. package/package.json +27 -4
  235. package/desktop/renderer/dist/assets/index-B-6BYnh8.js +0 -49
@@ -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"}
@@ -0,0 +1,244 @@
1
+ import { BRAND, FONT_SIZES, severityColor, severityLabel, buildRecordLink, linkifyTextPdf } from './brand.js';
2
+ import { severityPieChart, categoryBarChart } from './charts.js';
3
+ const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low', 'info'];
4
+ /** Generate a branded PDF from ReportData. Returns file path and size. */
5
+ export async function generatePdf(data, outputPath) {
6
+ const { writeFileSync } = await import('fs');
7
+ // pdfmake v0.3: CJS module, use .default from ESM dynamic import
8
+ const pdfmake = (await import('pdfmake/build/pdfmake.js')).default;
9
+ const vfsFonts = (await import('pdfmake/build/vfs_fonts.js')).default;
10
+ // Register virtual file system for embedded Roboto fonts
11
+ pdfmake.addVirtualFileSystem(vfsFonts);
12
+ const content = [];
13
+ // ─── Cover Page ────────────────────────────────────────────────────────
14
+ content.push({
15
+ stack: [
16
+ { text: '', margin: [0, 80, 0, 0] },
17
+ {
18
+ canvas: [
19
+ { type: 'rect', x: 0, y: 0, w: 515, h: 4, r: 2, color: BRAND.teal },
20
+ ],
21
+ },
22
+ { text: data.title, style: 'coverTitle', margin: [0, 30, 0, 10] },
23
+ { text: data.capability ? `Capability: ${data.capability}` : '', style: 'coverSubtitle', margin: [0, 0, 0, 5] },
24
+ {
25
+ text: data.instanceUrl,
26
+ link: data.instanceUrl,
27
+ style: 'coverLink',
28
+ margin: [0, 5, 0, 5],
29
+ },
30
+ { text: `Instance: ${data.instanceName}`, style: 'coverDetail', margin: [0, 5, 0, 5] },
31
+ { text: `Report Date: ${data.scanDate}`, style: 'coverDetail', margin: [0, 5, 0, 40] },
32
+ {
33
+ canvas: [
34
+ { type: 'rect', x: 0, y: 0, w: 515, h: 2, r: 1, color: BRAND.grayLight },
35
+ ],
36
+ },
37
+ { text: 'Generated by NowAIKit', style: 'coverFooter', margin: [0, 15, 0, 0] },
38
+ { text: 'nowaikit.com', link: 'https://nowaikit.com', style: 'coverFooterLink' },
39
+ ],
40
+ pageBreak: 'after',
41
+ });
42
+ // ─── Executive Summary ─────────────────────────────────────────────────
43
+ content.push({ text: 'Executive Summary', style: 'sectionHeader', margin: [0, 0, 0, 15] });
44
+ // Health badge
45
+ if (data.metrics.overallHealth) {
46
+ const healthColor = data.metrics.overallHealth === 'healthy' ? BRAND.healthy
47
+ : data.metrics.overallHealth === 'degraded' ? BRAND.degraded : BRAND.criticalHealth;
48
+ content.push({
49
+ columns: [
50
+ { text: 'Overall Health: ', style: 'bodyBold', width: 'auto' },
51
+ {
52
+ text: ` ${data.metrics.overallHealth.toUpperCase()} `,
53
+ color: BRAND.white,
54
+ background: healthColor,
55
+ bold: true,
56
+ fontSize: 11,
57
+ margin: [5, 0, 0, 0],
58
+ width: 'auto',
59
+ },
60
+ ],
61
+ margin: [0, 0, 0, 10],
62
+ });
63
+ }
64
+ // Severity count boxes
65
+ const severityBoxes = SEVERITY_ORDER.map(sev => ({
66
+ stack: [
67
+ { text: data.metrics.severityCounts[sev].toString(), style: 'metricValue', color: severityColor(sev) },
68
+ { text: severityLabel(sev), style: 'metricLabel' },
69
+ ],
70
+ width: '*',
71
+ alignment: 'center',
72
+ }));
73
+ content.push({
74
+ columns: severityBoxes,
75
+ margin: [0, 5, 0, 15],
76
+ });
77
+ content.push({ text: `Total Findings: ${data.metrics.totalFindings}`, style: 'body', margin: [0, 0, 0, 10] });
78
+ if (data.executiveSummary) {
79
+ content.push({ text: linkifyTextPdf(data.executiveSummary, data.instanceUrl, { fontSize: FONT_SIZES.body, color: BRAND.text }), margin: [0, 0, 0, 10] });
80
+ }
81
+ // ─── Charts ────────────────────────────────────────────────────────────
82
+ if (data.metrics.totalFindings > 0) {
83
+ content.push({ text: '', pageBreak: 'before' });
84
+ content.push({ text: 'Findings Distribution', style: 'sectionHeader', margin: [0, 0, 0, 15] });
85
+ const pieSvg = severityPieChart(data.metrics.severityCounts, 180);
86
+ const barSvg = categoryBarChart(data.metrics.categoryBreakdown, 280);
87
+ content.push({
88
+ columns: [
89
+ {
90
+ stack: [
91
+ { text: 'By Severity', style: 'chartTitle', margin: [0, 0, 0, 8] },
92
+ { svg: pieSvg, width: 180 },
93
+ ],
94
+ width: '45%',
95
+ },
96
+ {
97
+ stack: [
98
+ { text: 'By Category', style: 'chartTitle', margin: [0, 0, 0, 8] },
99
+ { svg: barSvg, width: 280 },
100
+ ],
101
+ width: '55%',
102
+ },
103
+ ],
104
+ margin: [0, 0, 0, 20],
105
+ });
106
+ }
107
+ // ─── Findings by Section ───────────────────────────────────────────────
108
+ for (const section of data.sections) {
109
+ if (section.findings.length === 0 && section.tables.length === 0)
110
+ continue;
111
+ content.push({
112
+ text: [
113
+ { text: section.title, style: 'sectionHeader' },
114
+ section.findings.length > 0
115
+ ? { text: ` (${section.findings.length} findings)`, style: 'findingCount' }
116
+ : { text: '' },
117
+ ],
118
+ margin: [0, 15, 0, 10],
119
+ });
120
+ // Findings table
121
+ if (section.findings.length > 0) {
122
+ const tableBody = [
123
+ [
124
+ { text: 'Severity', style: 'tableHeader' },
125
+ { text: 'Finding', style: 'tableHeader' },
126
+ { text: 'Impact', style: 'tableHeader' },
127
+ { text: 'Recommendation', style: 'tableHeader' },
128
+ ],
129
+ ];
130
+ for (const finding of section.findings) {
131
+ const findingStack = [
132
+ { text: linkifyTextPdf(finding.title, data.instanceUrl, { bold: true, fontSize: 9 }) },
133
+ ];
134
+ if (finding.description !== finding.title) {
135
+ findingStack.push({ text: linkifyTextPdf(finding.description, data.instanceUrl, { fontSize: 8, color: BRAND.textLight }), margin: [0, 2, 0, 0] });
136
+ }
137
+ if (finding.evidence) {
138
+ findingStack.push({ text: linkifyTextPdf(finding.evidence, data.instanceUrl, { fontSize: 7, color: BRAND.gray, italics: true }), margin: [0, 2, 0, 0] });
139
+ }
140
+ if (finding.table && finding.sysId) {
141
+ findingStack.push({
142
+ text: 'View in ServiceNow',
143
+ link: buildRecordLink(data.instanceUrl, finding.table, finding.sysId),
144
+ fontSize: 8, color: BRAND.teal, decoration: 'underline', margin: [0, 2, 0, 0],
145
+ });
146
+ }
147
+ const row = [
148
+ { text: severityLabel(finding.severity), color: severityColor(finding.severity), bold: true, fontSize: 9 },
149
+ { stack: findingStack },
150
+ { text: linkifyTextPdf(finding.impact || '—', data.instanceUrl, { fontSize: 9, color: BRAND.textLight }) },
151
+ { text: linkifyTextPdf(finding.recommendation || '—', data.instanceUrl, { fontSize: 9 }) },
152
+ ];
153
+ tableBody.push(row);
154
+ }
155
+ content.push({
156
+ table: {
157
+ headerRows: 1,
158
+ widths: [55, '*', '*', '*'],
159
+ body: tableBody,
160
+ },
161
+ layout: {
162
+ hLineColor: () => BRAND.grayLight,
163
+ vLineColor: () => BRAND.grayLight,
164
+ hLineWidth: () => 0.5,
165
+ vLineWidth: () => 0.5,
166
+ paddingLeft: () => 6,
167
+ paddingRight: () => 6,
168
+ paddingTop: () => 4,
169
+ paddingBottom: () => 4,
170
+ fillColor: (rowIndex) => rowIndex === 0 ? BRAND.offWhite : null,
171
+ },
172
+ margin: [0, 0, 0, 10],
173
+ });
174
+ }
175
+ // Data tables from markdown
176
+ for (const table of section.tables) {
177
+ const tableBody = [
178
+ table.headers.map(h => ({ text: h, style: 'tableHeader' })),
179
+ ...table.rows.map(row => row.map(cell => ({ text: linkifyTextPdf(cell, data.instanceUrl, { fontSize: 9 }) }))),
180
+ ];
181
+ content.push({
182
+ table: {
183
+ headerRows: 1,
184
+ widths: Array(table.headers.length).fill('*'),
185
+ body: tableBody,
186
+ },
187
+ layout: {
188
+ hLineColor: () => BRAND.grayLight,
189
+ vLineColor: () => BRAND.grayLight,
190
+ hLineWidth: () => 0.5,
191
+ vLineWidth: () => 0.5,
192
+ paddingLeft: () => 5,
193
+ paddingRight: () => 5,
194
+ paddingTop: () => 3,
195
+ paddingBottom: () => 3,
196
+ fillColor: (rowIndex) => rowIndex === 0 ? BRAND.offWhite : null,
197
+ },
198
+ margin: [0, 5, 0, 10],
199
+ });
200
+ }
201
+ }
202
+ // ─── Build PDF Document Definition ─────────────────────────────────────
203
+ const docDefinition = {
204
+ content,
205
+ defaultStyle: {
206
+ font: 'Roboto',
207
+ fontSize: FONT_SIZES.body,
208
+ color: BRAND.text,
209
+ },
210
+ styles: {
211
+ coverTitle: { fontSize: FONT_SIZES.title, bold: true, color: BRAND.navy },
212
+ coverSubtitle: { fontSize: FONT_SIZES.subtitle, color: BRAND.teal },
213
+ coverLink: { fontSize: 12, color: BRAND.teal, decoration: 'underline' },
214
+ coverDetail: { fontSize: 12, color: BRAND.textLight },
215
+ coverFooter: { fontSize: 10, color: BRAND.gray, alignment: 'center' },
216
+ coverFooterLink: { fontSize: 10, color: BRAND.teal, decoration: 'underline', alignment: 'center' },
217
+ sectionHeader: { fontSize: FONT_SIZES.sectionHeader, bold: true, color: BRAND.navy },
218
+ chartTitle: { fontSize: 13, bold: true, color: BRAND.navy },
219
+ body: { fontSize: FONT_SIZES.body, color: BRAND.text },
220
+ bodyBold: { fontSize: FONT_SIZES.body, bold: true, color: BRAND.text },
221
+ metricValue: { fontSize: 24, bold: true, alignment: 'center' },
222
+ metricLabel: { fontSize: 9, color: BRAND.textLight, alignment: 'center' },
223
+ findingCount: { fontSize: 11, color: BRAND.gray },
224
+ tableHeader: { fontSize: 9, bold: true, color: BRAND.navy },
225
+ small: { fontSize: FONT_SIZES.small, color: BRAND.textLight },
226
+ },
227
+ footer: (currentPage, pageCount) => ({
228
+ columns: [
229
+ { text: `NowAIKit | nowaikit.com`, fontSize: 8, color: BRAND.gray, margin: [40, 0, 0, 0] },
230
+ { text: data.instanceName, fontSize: 8, color: BRAND.gray, alignment: 'center' },
231
+ { text: `Page ${currentPage} of ${pageCount}`, fontSize: 8, color: BRAND.gray, alignment: 'right', margin: [0, 0, 40, 0] },
232
+ ],
233
+ margin: [0, 10, 0, 0],
234
+ }),
235
+ pageMargins: [40, 40, 40, 50],
236
+ };
237
+ // Generate PDF buffer using pdfmake v0.3 promise-based API
238
+ const doc = pdfmake.createPdf(docDefinition);
239
+ const buffer = await doc.getBuffer();
240
+ const nodeBuffer = Buffer.from(buffer);
241
+ writeFileSync(outputPath, nodeBuffer);
242
+ return { filePath: outputPath, sizeBytes: nodeBuffer.length };
243
+ }
244
+ //# sourceMappingURL=pdf-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-generator.js","sourceRoot":"","sources":["../../src/reports/pdf-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * PPTX slide deck generator using pptxgenjs.
3
+ * Produces branded presentation with native charts and tables.
4
+ */
5
+ import type { ReportData, ReportResult } from './types.js';
6
+ /** Generate a branded PPTX from ReportData. Returns file path and size. */
7
+ export declare function generatePptx(data: ReportData, outputPath: string): Promise<ReportResult>;
8
+ //# sourceMappingURL=pptx-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pptx-generator.d.ts","sourceRoot":"","sources":["../../src/reports/pptx-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAY,MAAM,YAAY,CAAC;AAKrE,2EAA2E;AAC3E,wBAAsB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CA4S9F"}