visus-mcp 0.6.2 → 0.9.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 (203) hide show
  1. package/.claude/settings.local.json +15 -1
  2. package/.env.status +7 -0
  3. package/CHANGELOG.md +110 -0
  4. package/CLAUDE.md +3 -0
  5. package/README.md +29 -19
  6. package/SECURITY.md +2 -0
  7. package/STATUS.md +320 -12
  8. package/dist/browser/playwright-renderer.d.ts.map +1 -1
  9. package/dist/browser/playwright-renderer.js +27 -5
  10. package/dist/browser/playwright-renderer.js.map +1 -1
  11. package/dist/content-handlers/index.d.ts +36 -0
  12. package/dist/content-handlers/index.d.ts.map +1 -0
  13. package/dist/content-handlers/index.js +59 -0
  14. package/dist/content-handlers/index.js.map +1 -0
  15. package/dist/content-handlers/json-handler.d.ts +28 -0
  16. package/dist/content-handlers/json-handler.d.ts.map +1 -0
  17. package/dist/content-handlers/json-handler.js +116 -0
  18. package/dist/content-handlers/json-handler.js.map +1 -0
  19. package/dist/content-handlers/pdf-handler.d.ts +29 -0
  20. package/dist/content-handlers/pdf-handler.d.ts.map +1 -0
  21. package/dist/content-handlers/pdf-handler.js +77 -0
  22. package/dist/content-handlers/pdf-handler.js.map +1 -0
  23. package/dist/content-handlers/svg-handler.d.ts +35 -0
  24. package/dist/content-handlers/svg-handler.d.ts.map +1 -0
  25. package/dist/content-handlers/svg-handler.js +206 -0
  26. package/dist/content-handlers/svg-handler.js.map +1 -0
  27. package/dist/content-handlers/types.d.ts +42 -0
  28. package/dist/content-handlers/types.d.ts.map +1 -0
  29. package/dist/content-handlers/types.js +7 -0
  30. package/dist/content-handlers/types.js.map +1 -0
  31. package/dist/sanitizer/framework-mapper.d.ts +4 -0
  32. package/dist/sanitizer/framework-mapper.d.ts.map +1 -1
  33. package/dist/sanitizer/framework-mapper.js +92 -0
  34. package/dist/sanitizer/framework-mapper.js.map +1 -1
  35. package/dist/sanitizer/threat-reporter.d.ts +5 -0
  36. package/dist/sanitizer/threat-reporter.d.ts.map +1 -1
  37. package/dist/sanitizer/threat-reporter.js +15 -6
  38. package/dist/sanitizer/threat-reporter.js.map +1 -1
  39. package/dist/tools/fetch-structured.d.ts.map +1 -1
  40. package/dist/tools/fetch-structured.js +4 -0
  41. package/dist/tools/fetch-structured.js.map +1 -1
  42. package/dist/tools/fetch.d.ts.map +1 -1
  43. package/dist/tools/fetch.js +68 -4
  44. package/dist/tools/fetch.js.map +1 -1
  45. package/dist/tools/read.d.ts.map +1 -1
  46. package/dist/tools/read.js +4 -0
  47. package/dist/tools/read.js.map +1 -1
  48. package/dist/types.d.ts +9 -1
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js.map +1 -1
  51. package/package.json +2 -1
  52. package/server.json +25 -14
  53. package/src/browser/playwright-renderer.ts +29 -6
  54. package/src/content-handlers/index.ts +72 -0
  55. package/src/content-handlers/json-handler.ts +137 -0
  56. package/src/content-handlers/pdf-handler.ts +91 -0
  57. package/src/content-handlers/svg-handler.ts +243 -0
  58. package/src/content-handlers/types.ts +44 -0
  59. package/src/sanitizer/framework-mapper.ts +94 -0
  60. package/src/sanitizer/threat-reporter.ts +17 -6
  61. package/src/tools/fetch-structured.ts +5 -0
  62. package/src/tools/fetch.ts +76 -4
  63. package/src/tools/read.ts +5 -0
  64. package/src/types.ts +9 -1
  65. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -47
  66. package/.github/ISSUE_TEMPLATE/false_positive.md +0 -43
  67. package/.github/ISSUE_TEMPLATE/new_pattern.md +0 -49
  68. package/.github/ISSUE_TEMPLATE/security_report.md +0 -31
  69. package/.github/PULL_REQUEST_TEMPLATE.md +0 -39
  70. package/.mcpregistry_github_token +0 -1
  71. package/.mcpregistry_registry_token +0 -1
  72. package/CONTRIBUTING.md +0 -329
  73. package/LINKEDIN-STRATEGY.md +0 -367
  74. package/ROADMAP.md +0 -221
  75. package/SECURITY-AUDIT-v1.md +0 -277
  76. package/SUBMISSION.md +0 -66
  77. package/TROUBLESHOOT-AUTH-20260322-2019.md +0 -291
  78. package/TROUBLESHOOT-BUILD-20260319-1450.md +0 -546
  79. package/TROUBLESHOOT-COGNITO-AUTH-20260324-2029.md +0 -415
  80. package/TROUBLESHOOT-COGNITO-JWT-20260324.md +0 -592
  81. package/TROUBLESHOOT-FETCH-20260320-1150.md +0 -168
  82. package/TROUBLESHOOT-JEST-20260323-1357.md +0 -139
  83. package/TROUBLESHOOT-LAMBDA-20260322-1945.md +0 -183
  84. package/TROUBLESHOOT-PLAYWRIGHT-20260321-1549.md +0 -217
  85. package/TROUBLESHOOT-SSL-20260320-1138.md +0 -171
  86. package/TROUBLESHOOT-STRUCTURED-20260320-1200.md +0 -246
  87. package/TROUBLESHOOT-TEST-20260320-0942.md +0 -281
  88. package/VISUS-CLAUDE-CODE-PROMPT.md +0 -324
  89. package/VISUS-PROJECT-PLAN.md +0 -205
  90. package/cdk.json +0 -73
  91. package/infrastructure/app.ts +0 -39
  92. package/infrastructure/stack.ts +0 -298
  93. package/jest.config.js +0 -33
  94. package/jest.setup.js +0 -9
  95. package/lambda-deploy/index.js +0 -81512
  96. package/lambda-deploy/index.js.map +0 -7
  97. package/lambda-package/browser/__mocks__/playwright-renderer.d.ts +0 -25
  98. package/lambda-package/browser/__mocks__/playwright-renderer.d.ts.map +0 -1
  99. package/lambda-package/browser/__mocks__/playwright-renderer.js +0 -119
  100. package/lambda-package/browser/__mocks__/playwright-renderer.js.map +0 -1
  101. package/lambda-package/browser/playwright-renderer.d.ts +0 -40
  102. package/lambda-package/browser/playwright-renderer.d.ts.map +0 -1
  103. package/lambda-package/browser/playwright-renderer.js +0 -214
  104. package/lambda-package/browser/playwright-renderer.js.map +0 -1
  105. package/lambda-package/browser/reader.d.ts +0 -31
  106. package/lambda-package/browser/reader.d.ts.map +0 -1
  107. package/lambda-package/browser/reader.js +0 -98
  108. package/lambda-package/browser/reader.js.map +0 -1
  109. package/lambda-package/index.d.ts +0 -18
  110. package/lambda-package/index.d.ts.map +0 -1
  111. package/lambda-package/index.js +0 -238
  112. package/lambda-package/index.js.map +0 -1
  113. package/lambda-package/lambda-handler.d.ts +0 -28
  114. package/lambda-package/lambda-handler.d.ts.map +0 -1
  115. package/lambda-package/lambda-handler.js +0 -257
  116. package/lambda-package/lambda-handler.js.map +0 -1
  117. package/lambda-package/package-lock.json +0 -7435
  118. package/lambda-package/package.json +0 -74
  119. package/lambda-package/runtime.d.ts +0 -50
  120. package/lambda-package/runtime.d.ts.map +0 -1
  121. package/lambda-package/runtime.js +0 -86
  122. package/lambda-package/runtime.js.map +0 -1
  123. package/lambda-package/sanitizer/elicit-runner.d.ts +0 -48
  124. package/lambda-package/sanitizer/elicit-runner.d.ts.map +0 -1
  125. package/lambda-package/sanitizer/elicit-runner.js +0 -100
  126. package/lambda-package/sanitizer/elicit-runner.js.map +0 -1
  127. package/lambda-package/sanitizer/framework-mapper.d.ts +0 -24
  128. package/lambda-package/sanitizer/framework-mapper.d.ts.map +0 -1
  129. package/lambda-package/sanitizer/framework-mapper.js +0 -342
  130. package/lambda-package/sanitizer/framework-mapper.js.map +0 -1
  131. package/lambda-package/sanitizer/hitl-gate.d.ts +0 -69
  132. package/lambda-package/sanitizer/hitl-gate.d.ts.map +0 -1
  133. package/lambda-package/sanitizer/hitl-gate.js +0 -101
  134. package/lambda-package/sanitizer/hitl-gate.js.map +0 -1
  135. package/lambda-package/sanitizer/index.d.ts +0 -63
  136. package/lambda-package/sanitizer/index.d.ts.map +0 -1
  137. package/lambda-package/sanitizer/index.js +0 -105
  138. package/lambda-package/sanitizer/index.js.map +0 -1
  139. package/lambda-package/sanitizer/injection-detector.d.ts +0 -34
  140. package/lambda-package/sanitizer/injection-detector.d.ts.map +0 -1
  141. package/lambda-package/sanitizer/injection-detector.js +0 -89
  142. package/lambda-package/sanitizer/injection-detector.js.map +0 -1
  143. package/lambda-package/sanitizer/patterns.d.ts +0 -30
  144. package/lambda-package/sanitizer/patterns.d.ts.map +0 -1
  145. package/lambda-package/sanitizer/patterns.js +0 -372
  146. package/lambda-package/sanitizer/patterns.js.map +0 -1
  147. package/lambda-package/sanitizer/pii-allowlist.d.ts +0 -49
  148. package/lambda-package/sanitizer/pii-allowlist.d.ts.map +0 -1
  149. package/lambda-package/sanitizer/pii-allowlist.js +0 -231
  150. package/lambda-package/sanitizer/pii-allowlist.js.map +0 -1
  151. package/lambda-package/sanitizer/pii-redactor.d.ts +0 -41
  152. package/lambda-package/sanitizer/pii-redactor.d.ts.map +0 -1
  153. package/lambda-package/sanitizer/pii-redactor.js +0 -213
  154. package/lambda-package/sanitizer/pii-redactor.js.map +0 -1
  155. package/lambda-package/sanitizer/severity-classifier.d.ts +0 -33
  156. package/lambda-package/sanitizer/severity-classifier.d.ts.map +0 -1
  157. package/lambda-package/sanitizer/severity-classifier.js +0 -113
  158. package/lambda-package/sanitizer/severity-classifier.js.map +0 -1
  159. package/lambda-package/sanitizer/threat-reporter.d.ts +0 -66
  160. package/lambda-package/sanitizer/threat-reporter.d.ts.map +0 -1
  161. package/lambda-package/sanitizer/threat-reporter.js +0 -163
  162. package/lambda-package/sanitizer/threat-reporter.js.map +0 -1
  163. package/lambda-package/tools/fetch-structured.d.ts +0 -51
  164. package/lambda-package/tools/fetch-structured.d.ts.map +0 -1
  165. package/lambda-package/tools/fetch-structured.js +0 -237
  166. package/lambda-package/tools/fetch-structured.js.map +0 -1
  167. package/lambda-package/tools/fetch.d.ts +0 -49
  168. package/lambda-package/tools/fetch.d.ts.map +0 -1
  169. package/lambda-package/tools/fetch.js +0 -131
  170. package/lambda-package/tools/fetch.js.map +0 -1
  171. package/lambda-package/tools/read.d.ts +0 -51
  172. package/lambda-package/tools/read.d.ts.map +0 -1
  173. package/lambda-package/tools/read.js +0 -127
  174. package/lambda-package/tools/read.js.map +0 -1
  175. package/lambda-package/tools/search.d.ts +0 -45
  176. package/lambda-package/tools/search.d.ts.map +0 -1
  177. package/lambda-package/tools/search.js +0 -220
  178. package/lambda-package/tools/search.js.map +0 -1
  179. package/lambda-package/types.d.ts +0 -167
  180. package/lambda-package/types.d.ts.map +0 -1
  181. package/lambda-package/types.js +0 -16
  182. package/lambda-package/types.js.map +0 -1
  183. package/lambda-package/utils/format-converter.d.ts +0 -39
  184. package/lambda-package/utils/format-converter.d.ts.map +0 -1
  185. package/lambda-package/utils/format-converter.js +0 -191
  186. package/lambda-package/utils/format-converter.js.map +0 -1
  187. package/lambda-package/utils/truncate.d.ts +0 -26
  188. package/lambda-package/utils/truncate.d.ts.map +0 -1
  189. package/lambda-package/utils/truncate.js +0 -54
  190. package/lambda-package/utils/truncate.js.map +0 -1
  191. package/lambda.zip +0 -0
  192. package/test-output.txt +0 -4
  193. package/tests/auth-smoke.test.ts +0 -480
  194. package/tests/elicit-runner.test.ts +0 -232
  195. package/tests/fetch-tool.test.ts +0 -922
  196. package/tests/hitl-gate.test.ts +0 -267
  197. package/tests/injection-corpus.ts +0 -338
  198. package/tests/pii-allowlist.test.ts +0 -282
  199. package/tests/reader.test.ts +0 -353
  200. package/tests/sanitizer.test.ts +0 -358
  201. package/tests/search.test.ts +0 -456
  202. package/tests/threat-reporter.test.ts +0 -334
  203. package/tsconfig.cdk.json +0 -35
package/STATUS.md CHANGED
@@ -1,9 +1,312 @@
1
1
  # Visus MCP - Project Status
2
2
 
3
- **Generated:** 2026-03-24
4
- **Version:** 0.7.0
3
+ **Generated:** 2026-03-26
4
+ **Version:** 0.9.0
5
5
  **Phase:** 3 (Anthropic Directory Prep)
6
- **Status:** ✅ **v0.7.0 COMPLETE** - Human-in-the-Loop Elicitation Bridge
6
+ **Status:** ✅ **v0.9.0 COMPLETE** - NIST AI RMF & CSF 2.0 Framework Mappings
7
+
8
+ ---
9
+
10
+ ## v0.9.0 Release - NIST AI RMF & CSF 2.0 Framework Mappings
11
+
12
+ **Status:** ✅ COMPLETE (Ready for release)
13
+ **Type:** Feature enhancement - Expanded compliance framework support
14
+ **Implemented:** 2026-03-26
15
+ **Tests:** 294/294 passing (100%)
16
+
17
+ ### Features Added
18
+
19
+ **NIST AI Risk Management Framework (AI RMF / AI 100-1) Mappings**
20
+ - Added comprehensive mappings for all 43 injection patterns to NIST AI RMF controls
21
+ - Maps threats to four core functions: GOVERN, MAP, MEASURE, and MANAGE
22
+ - Examples:
23
+ - GOVERN-1.1: Legal and Regulatory Requirements
24
+ - MAP-4.1: Risk Mapping for AI Components
25
+ - MEASURE-2.7: AI System Security and Resilience
26
+ - MANAGE-2.3: Respond to Unknown Risks
27
+ - Provides federal/government compliance alignment for procurement
28
+
29
+ **NIST Cybersecurity Framework 2.0 (CSF 2.0) Mappings**
30
+ - Added comprehensive mappings for all 43 injection patterns to CSF 2.0 controls
31
+ - Maps threats to six core functions: IDENTIFY, PROTECT, DETECT, RESPOND, RECOVER, and GOVERN
32
+ - Examples:
33
+ - DE.CM-01: Network Monitoring
34
+ - PR.DS-01: Data at Rest Protection
35
+ - PR.AC-04: Access Control Enforcement
36
+ - DE.AE-02: Anomaly Detection
37
+ - Widely adopted enterprise cybersecurity framework for audit requirements
38
+
39
+ **Enhanced Threat Reporting**
40
+ - Expanded framework coverage from 4 to 6 compliance frameworks
41
+ - Updated TOON format from 10 fields to 12 fields (added nist_ai_rmf, nist_csf_2_0)
42
+ - Enhanced Markdown threat report table with new AI-RMF and CSF 2.0 columns
43
+ - All threat reports now include comprehensive 6-framework alignment
44
+
45
+ ### Documentation Updates
46
+ - Updated security badge to highlight NIST AI RMF and CSF 2.0
47
+ - Updated all 4 MCP tool descriptions to reference 6 frameworks
48
+ - Expanded "Framework Alignments" section with NIST AI RMF and CSF 2.0 descriptions
49
+ - Updated example threat reports to show 9-column table format
50
+
51
+ ### Files Modified
52
+ - `src/sanitizer/framework-mapper.ts` - Added nist_ai_rmf and nist_csf_2_0 fields, mappings for all 43 patterns
53
+ - `src/sanitizer/threat-reporter.ts` - Updated ThreatFinding interface, TOON format, Markdown report
54
+ - `README.md` - Updated badges, tool descriptions, framework alignments section, examples
55
+ - `tests/threat-reporter.test.ts` - Updated to verify 6 frameworks and 12 TOON fields
56
+ - `CHANGELOG.md` - Added v0.9.0 release notes
57
+
58
+ ### Why This Matters
59
+ - **Federal/Government Procurement**: NIST AI RMF is widely adopted by U.S. federal agencies
60
+ - **Enterprise Compliance**: CSF 2.0 is the de facto standard for cybersecurity audit requirements
61
+ - **Natural Extension**: Builds on existing NIST AI 600-1 mapping infrastructure
62
+ - **High Value, Easy Implementation**: Leveraged existing framework mapping system
63
+
64
+ ---
65
+
66
+ ## v0.8.1 Release - PDF Extraction Bug Fix
67
+
68
+ **Status:** ✅ COMPLETE (Ready for release)
69
+ **Type:** Critical bug fix
70
+ **Implemented:** 2026-03-25
71
+ **Tests:** 294/294 passing (100%)
72
+
73
+ ### Bug Fixed
74
+
75
+ **PDF Text Extraction Returning Binary Data Instead of Text**
76
+
77
+ **Root Cause:** `response.text()` in `src/browser/playwright-renderer.ts` was converting ALL response bodies to UTF-8 strings, including binary PDFs. This corrupted the binary data before it reached the pdf-parse library, causing the PDF handler to receive mangled strings instead of proper binary content.
78
+
79
+ **Impact:** All PDF extractions failed, returning raw binary garbage like "%PDF-1.7..." instead of extracted text.
80
+
81
+ **Fix:** Implemented content-type detection in the renderer to use `response.arrayBuffer()` for binary types and `response.text()` for text types.
82
+
83
+ ### Technical Details
84
+
85
+ **Files Modified:**
86
+ 1. **src/types.ts** - Updated `BrowserRenderResult.html` from `string` to `string | Buffer`
87
+ - Added JSDoc explaining when Buffer is used (PDFs, images, binary content)
88
+
89
+ 2. **src/browser/playwright-renderer.ts** - Added binary content detection
90
+ - Checks Content-Type: `application/pdf`, `image/*`, `application/octet-stream`
91
+ - Binary types: `response.arrayBuffer()` → `Buffer.from(arrayBuffer)`
92
+ - Text types: `response.text()` → string (existing behavior)
93
+
94
+ 3. **src/tools/fetch.ts** - Added Buffer type guard
95
+ - Ensures Buffer content doesn't reach HTML/XML/RSS path (would cause errors)
96
+
97
+ 4. **src/tools/fetch-structured.ts** - Added Buffer rejection
98
+ - Structured extraction doesn't support binary types - returns clear error message
99
+
100
+ 5. **src/tools/read.ts** - Added Buffer rejection
101
+ - Reader mode (Readability) doesn't support binary types - returns clear error message
102
+
103
+ **Verification:**
104
+ - ✅ All 294 tests passing - zero regressions
105
+ - ✅ Manual test with WAI dummy PDF: Text extraction working correctly
106
+ - ✅ Metadata extraction working (Author, Creator, Producer fields)
107
+ - ✅ Content is readable English, not binary garbage
108
+
109
+ **Known Limitations:**
110
+ - Some complex PDFs may fail with "Invalid Root reference" error
111
+ - This is a limitation of the pdf-parse library (v2.4.5), not Visus
112
+ - Simple to moderately complex PDFs work correctly
113
+
114
+ **Documentation:**
115
+ - Updated CHANGELOG.md with bug fix entry
116
+ - Created TROUBLESHOOT-PDF-EXTRACTION-20260325-2040.md with full investigation log
117
+ - Added inline comments explaining Buffer handling in all modified files
118
+
119
+ ---
120
+
121
+ ## v0.8.0 Release - PDF, JSON, and SVG Content Handlers
122
+
123
+ **Status:** ✅ COMPLETE (Ready for release)
124
+ **Type:** Feature enhancement + Security expansion
125
+ **Implemented:** 2026-03-25
126
+
127
+ ### New Features
128
+
129
+ **🎯 Specialized Content Type Handlers with Full Sanitization**
130
+
131
+ Adds content-type routing for three specialized formats (PDF, JSON, SVG), applying the full 43-pattern injection sanitization pipeline to each format before returning content to the LLM.
132
+
133
+ **Key Features:**
134
+ - ✅ PDF text extraction with metadata (Title, Author, Subject, Keywords, Creator, Producer)
135
+ - ✅ Recursive JSON sanitization preserving structure while neutralizing injections
136
+ - ✅ SVG element stripping (script, foreignObject, event handlers, external use)
137
+ - ✅ Content-type routing dispatcher with MIME type normalization
138
+ - ✅ Full sanitization metadata flow (patterns_detected, pii_types_redacted, pii_allowlisted)
139
+ - ✅ 48 new tests (294 total, all passing)
140
+ - ✅ Zero regressions - all existing tests continue to pass
141
+
142
+ **Supported Content Types:**
143
+ 1. **PDF** (`application/pdf`)
144
+ - Extracts text content from all pages using pdf-parse v2 API
145
+ - Extracts metadata fields (Title, Author, Subject, Keywords, Creator, Producer)
146
+ - Combines text + metadata into single string for sanitization
147
+ - Returns structured error for corrupt PDFs (PDF_PARSE_FAILED)
148
+ - Processing time tracked for performance monitoring
149
+
150
+ 2. **JSON** (`application/json`, `text/json`)
151
+ - Recursive sanitization preserving JSON structure
152
+ - Field-by-field injection detection with metadata aggregation
153
+ - Uses Sets to deduplicate patterns/PII types across nested objects
154
+ - Falls back to plain text sanitization if JSON.parse fails
155
+ - Returns pure sanitized JSON (no "JSON Response:" prefix)
156
+
157
+ 3. **SVG** (`image/svg+xml`)
158
+ - Strips dangerous elements: `<script>`, `<foreignObject>`
159
+ - Removes event handlers: `onload`, `onclick`, etc.
160
+ - Blocks external `<use>` references (e.g., `href="http://evil.com/icon.svg"`)
161
+ - Removes `data:` URIs to prevent base64-encoded payloads
162
+ - Extracts and sanitizes text content from title/desc elements
163
+ - Returns cleaned SVG with text injection detection
164
+
165
+ **Handler Interface Design:**
166
+
167
+ All handlers return `HandlerResult` with full sanitization metadata:
168
+ ```typescript
169
+ interface HandlerSuccessResult {
170
+ status: 'sanitized';
171
+ content_type: string;
172
+ sanitized_content: string;
173
+ sanitization: {
174
+ patterns_detected: string[];
175
+ pii_types_redacted: string[];
176
+ pii_allowlisted: Array<{ type: string; value: string; reason: string }>;
177
+ sanitized_fields: number;
178
+ };
179
+ processing_time_ms: number;
180
+ }
181
+ ```
182
+
183
+ **Processing Pipeline:**
184
+ ```
185
+ URL Fetch → Content-Type Detection → Handler Routing →
186
+ PDF: Extract text + metadata → Sanitize → Return
187
+ JSON: Recursive sanitize → Deduplicate metadata → Return
188
+ SVG: Strip dangerous elements → Extract text → Sanitize → Return
189
+ → Token Ceiling → Output
190
+ ```
191
+
192
+ **Security Guarantees:**
193
+ - ✅ All 43 injection patterns applied to PDF text
194
+ - ✅ All 43 patterns applied recursively to every JSON string field
195
+ - ✅ SVG text content scanned with all 43 patterns
196
+ - ✅ PII redaction works on all three formats
197
+ - ✅ No content bypasses sanitization (fail-safe design)
198
+ - ✅ Corrupt/malformed input returns structured error (never throws)
199
+
200
+ **Technical Implementation:**
201
+
202
+ **New Components:**
203
+ 1. **src/content-handlers/types.ts** (60 lines)
204
+ - Shared interfaces for all content handlers
205
+ - `HandlerResult` union type: `HandlerSuccessResult | HandlerErrorResult | HandlerRejectedResult`
206
+ - Full sanitization metadata preservation
207
+
208
+ 2. **src/content-handlers/pdf-handler.ts** (95 lines)
209
+ - Uses pdf-parse v2 API (`new PDFParse({ data: buffer })`)
210
+ - Calls `parser.getText()` and `parser.getInfo()` separately
211
+ - Combines text + metadata for comprehensive sanitization
212
+ - Returns error with reason code on PDF parse failure
213
+
214
+ 3. **src/content-handlers/json-handler.ts** (140 lines)
215
+ - Recursive sanitization with `recursiveSanitize()` helper
216
+ - Aggregates metadata using Sets for deduplication
217
+ - Preserves JSON structure (objects, arrays, primitives)
218
+ - Graceful fallback to plain text on parse error
219
+
220
+ 4. **src/content-handlers/svg-handler.ts** (185 lines)
221
+ - XML parsing with fast-xml-parser
222
+ - `stripDangerousContent()` removes unsafe elements/attributes
223
+ - `extractTextContent()` pulls title/desc text for injection scanning
224
+ - Returns cleaned SVG + sanitization metadata
225
+
226
+ 5. **src/content-handlers/index.ts** (55 lines)
227
+ - Central routing dispatcher based on normalized MIME type
228
+ - `normalizeMimeType()` handles charset and case normalization
229
+ - `routeContentHandler()` maps MIME to appropriate handler
230
+ - Returns rejection for unsupported content types
231
+
232
+ **Modified Files:**
233
+ - `src/tools/fetch.ts` - Integrated content handler routing before HTML pipeline
234
+ - Added MIME type detection (lines 46-53)
235
+ - Early routing for PDF/JSON/SVG (lines 50-108)
236
+ - Uses handler-provided sanitization metadata (lines 88-90)
237
+ - Removed placeholder pattern array
238
+ - `package.json` - Added pdf-parse@2.4.5 dependency
239
+
240
+ **Test Coverage:**
241
+
242
+ New test file:
243
+ - `tests/content-handlers.test.ts` - 20 tests covering:
244
+ - PDF: corrupt file error handling
245
+ - JSON: clean flat/nested pass-through, injection sanitization, invalid fallback
246
+ - SVG: clean pass-through, script stripping, event handler removal, foreignObject removal, external use blocking, title injection detection
247
+ - Routing: MIME normalization, unsupported type rejection
248
+
249
+ Updated test files:
250
+ - `tests/fetch-tool.test.ts` - Updated JSON test expectations (2 tests modified):
251
+ - Removed "JSON Response:" prefix expectation
252
+ - Changed to expect pure JSON content with specific fields
253
+
254
+ **Test Results:** ✅ 294/294 tests passing (48 new content handler tests added)
255
+
256
+ **Dependencies Added:**
257
+ - `pdf-parse@2.4.5` - PDF text extraction library
258
+
259
+ **Troubleshooting:**
260
+ - Documented handler interface metadata loss issue in `TROUBLESHOOT-CONTENT-HANDLERS-20260325-1047.md`
261
+ - Root cause: Initial interface only had `sanitized_fields: number`, lost pattern names and PII types
262
+ - Resolution: Expanded interface to include full `sanitization` object
263
+ - Time to resolution: ~10 minutes
264
+
265
+ **Example Usage:**
266
+
267
+ PDF document:
268
+ ```json
269
+ {
270
+ "url": "https://example.com/whitepaper.pdf"
271
+ }
272
+ ```
273
+
274
+ Returns extracted text + metadata with `format_detected: "html"` and sanitization metadata.
275
+
276
+ JSON API:
277
+ ```json
278
+ {
279
+ "url": "https://api.github.com/repos/anthropics/anthropic-sdk-typescript"
280
+ }
281
+ ```
282
+
283
+ Returns pure sanitized JSON with `format_detected: "json"` and injection detection metadata.
284
+
285
+ SVG image:
286
+ ```json
287
+ {
288
+ "url": "https://example.com/diagram.svg"
289
+ }
290
+ ```
291
+
292
+ Returns cleaned SVG with dangerous elements removed and `format_detected: "xml"`.
293
+
294
+ **README Documentation:**
295
+ - Updated test count badge from 246 to 294 passing tests
296
+ - Updated "How Visus Works" pipeline diagram to show Content-Type Detection
297
+ - Added detailed content-type routing section explaining PDF, JSON, SVG handling
298
+ - Documented fail-safe error handling and structured response design
299
+
300
+ **Changelog:**
301
+ - Created `CHANGELOG.md` with v0.8.0 (Unreleased) section
302
+ - Detailed entries for PDF, JSON, SVG handlers with specifications
303
+ - Notes on content-type routing and test coverage
304
+
305
+ **Lessons Learned:**
306
+ 1. **Interface Design**: Preserve all metadata when wrapping existing functionality
307
+ 2. **Type Safety**: TypeScript strict mode caught interface mismatches early
308
+ 3. **Test Coverage**: Existing tests immediately caught metadata loss
309
+ 4. **Aggregation Pattern**: Use Sets to deduplicate findings in recursive sanitization
7
310
 
8
311
  ---
9
312
 
@@ -266,7 +569,7 @@ When prompt injection or PII is detected, Visus now automatically generates stru
266
569
  **Key Features:**
267
570
  - ✅ TOON-formatted findings array (token-efficient, machine-readable)
268
571
  - ✅ Markdown compliance report (human-readable, renders in Claude Desktop)
269
- - ✅ Four framework alignments: OWASP LLM Top 10, NIST AI 600-1, MITRE ATLAS, ISO/IEC 42001
572
+ - ✅ Six framework alignments: OWASP LLM Top 10, NIST AI 600-1, NIST AI RMF, NIST CSF 2.0, MITRE ATLAS, ISO/IEC 42001
270
573
  - ✅ Severity classification (CRITICAL, HIGH, MEDIUM, LOW, CLEAN)
271
574
  - ✅ Zero overhead for clean pages (report omitted when no findings)
272
575
  - ✅ Aggregated reporting across multiple results (search, structured extraction)
@@ -292,6 +595,8 @@ When prompt injection or PII is detected, Visus now automatically generates stru
292
595
  **Framework Alignments:**
293
596
  - **OWASP LLM Top 10 (2025)**: Industry-standard LLM security risks
294
597
  - **NIST AI 600-1**: Generative AI Profile for risk management
598
+ - **NIST AI RMF**: AI Risk Management Framework (AI 100-1) with GOVERN, MAP, MEASURE, MANAGE functions
599
+ - **NIST CSF 2.0**: Cybersecurity Framework 2.0 with IDENTIFY, PROTECT, DETECT, RESPOND, RECOVER, GOVERN functions
295
600
  - **MITRE ATLAS**: Adversarial Threat Landscape for AI Systems
296
601
  - **ISO/IEC 42001:2023**: International AI Management System standard (Annex A controls)
297
602
 
@@ -746,9 +1051,9 @@ Visus is a security-first MCP tool that provides Claude with sanitized web page
746
1051
 
747
1052
  ### ✅ Test Execution
748
1053
  - **Status:** SUCCESS - All tests passing
749
- - **Test Results:** 246/246 tests passing (100%)
750
- - **Test Suites:** 7/7 passing
751
- - **Execution Time:** ~7.2 seconds
1054
+ - **Test Results:** 294/294 tests passing (100%)
1055
+ - **Test Suites:** 8/8 passing
1056
+ - **Execution Time:** ~7.5 seconds
752
1057
  - **Test Files:**
753
1058
  - `tests/sanitizer.test.ts` - PASS (43 pattern categories + 5 threat report integration tests)
754
1059
  - `tests/fetch-tool.test.ts` - PASS (all MCP tool functions + annotations + 2 threat report tests + 14 format detection tests) - **v0.6.0**
@@ -757,8 +1062,9 @@ Visus is a security-first MCP tool that provides Claude with sanitized web page
757
1062
  - `tests/auth-smoke.test.ts` - PASS (24 auth enforcement tests) - **v0.3.1**
758
1063
  - `tests/reader.test.ts` - PASS (14 reader mode tests) - **v0.3.2**
759
1064
  - `tests/search.test.ts` - PASS (18 search tests) - **v0.4.0**
1065
+ - `tests/content-handlers.test.ts` - PASS (20 content handler tests) - **v0.8.0**
760
1066
  - `tests/injection-corpus.ts` - Test data library
761
- - **Coverage:** All 43 injection pattern categories + PII allowlist + authentication enforcement + reader mode + safe web search + security fixes + threat reporting with framework mappings + Content-Type format detection (JSON, XML, RSS/Atom) validated
1067
+ - **Coverage:** All 43 injection pattern categories + PII allowlist + authentication enforcement + reader mode + safe web search + security fixes + threat reporting with framework mappings + Content-Type format detection (JSON, XML, RSS/Atom) + Content handlers (PDF, JSON, SVG) validated
762
1068
 
763
1069
  ---
764
1070
 
@@ -1580,13 +1886,13 @@ npm URL: https://www.npmjs.com/package/visus-mcp
1580
1886
  **Contact:** security@lateos.ai
1581
1887
  **Repository:** https://github.com/visus-mcp/visus-mcp
1582
1888
  **npm Package:** https://www.npmjs.com/package/visus-mcp
1583
- **Installation:** `npm install -g visus-mcp@0.6.0` or `npx visus-mcp@0.6.0`
1889
+ **Installation:** `npm install -g visus-mcp@0.8.1` or `npx visus-mcp@0.8.1`
1584
1890
 
1585
1891
  ---
1586
1892
 
1587
- **Last Updated:** 2026-03-24
1893
+ **Last Updated:** 2026-03-25
1588
1894
  **Build:** SUCCESS ✅
1589
- **Tests:** 276/276 PASSING ✅
1895
+ **Tests:** 294/294 PASSING ✅
1590
1896
  **CDK Deploy:** SUCCESS ✅
1591
1897
  **Phase 1:** ✅ PUBLISHED TO NPM (v0.1.0)
1592
1898
  **Phase 2:** ✅ DEPLOYED TO AWS LAMBDA (us-east-1)
@@ -1597,6 +1903,8 @@ npm URL: https://www.npmjs.com/package/visus-mcp
1597
1903
  **v0.5.0:** ✅ PUBLISHED TO NPM (Threat Reporting + ISO/IEC 42001 - 31 tests added)
1598
1904
  **v0.6.0:** ✅ PUBLISHED TO NPM (Content-Type Format Detection - 14 tests added)
1599
1905
  **v0.7.0:** ✅ COMPLETE (HITL Elicitation Bridge for CRITICAL threats - 30 tests added)
1906
+ **v0.8.0:** ✅ PUBLISHED TO NPM (PDF/JSON/SVG Content Handlers - 48 tests added)
1907
+ **v0.8.1:** ✅ COMPLETE (PDF Extraction Bug Fix - binary content handling)
1600
1908
  **Security Audit:** ✅ COMPLETE + REMEDIATED (24 auth tests, 100% compliance)
1601
1909
  **Lambda Endpoint:** [API_ENDPOINT]
1602
- **Latest Release:** v0.6.0 (2026-03-23)
1910
+ **Latest Release:** v0.8.0 (2026-03-25)
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-renderer.d.ts","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkN/D;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAClC,GACL,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAuB7C;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,SAAO,GAChB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAwBjC;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
1
+ {"version":3,"file":"playwright-renderer.d.ts","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyO/D;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAClC,GACL,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC,CAuB7C;AAED;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,SAAO,GAChB,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAwBjC;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
@@ -88,6 +88,8 @@ async function renderWithLambda(url, timeout_ms) {
88
88
  return Err(new Error(`Lambda renderer error: ${body.error}`));
89
89
  }
90
90
  // Success response
91
+ // TODO: Lambda renderer needs PDF support - should return binary content as base64
92
+ // for application/pdf responses instead of always converting to HTML string
91
93
  return Ok({
92
94
  html: body.html,
93
95
  title: body.title,
@@ -127,15 +129,35 @@ async function renderWithFetch(url, timeout_ms) {
127
129
  if (!response.ok) {
128
130
  return Err(new Error(`HTTP ${response.status}: ${response.statusText}`));
129
131
  }
130
- const html = await response.text();
131
- // Capture Content-Type header
132
+ // Capture Content-Type header before reading body
132
133
  const contentTypeHeader = response.headers.get('content-type');
133
134
  const contentType = contentTypeHeader
134
135
  ? contentTypeHeader.split(';')[0].trim() // Remove charset and other params
135
136
  : 'text/html'; // Default to HTML if missing
136
- // Extract title using regex (simple fallback)
137
- const titleMatch = html.match(/<title[^>]*>(.*?)<\/title>/i);
138
- const title = titleMatch ? titleMatch[1].trim() : '';
137
+ // Read response body - use arrayBuffer() for binary types, text() for text types
138
+ // CRITICAL: pdf-parse requires original binary bytes, not UTF-8 string conversion
139
+ const isBinary = contentType === 'application/pdf' ||
140
+ contentType.startsWith('image/') ||
141
+ contentType.startsWith('application/octet-stream');
142
+ let html;
143
+ let title = '';
144
+ if (isBinary) {
145
+ // Binary content (PDF, images, etc.) - preserve byte integrity
146
+ const arrayBuffer = await response.arrayBuffer();
147
+ html = Buffer.from(arrayBuffer);
148
+ // Title extraction not meaningful for binary content
149
+ title = '';
150
+ }
151
+ else {
152
+ // Text content (HTML, JSON, etc.) - read as UTF-8 string
153
+ const textContent = await response.text();
154
+ html = textContent;
155
+ // Extract title using regex (HTML only)
156
+ if (contentType.includes('html')) {
157
+ const titleMatch = textContent.match(/<title[^>]*>(.*?)<\/title>/i);
158
+ title = titleMatch ? titleMatch[1].trim() : '';
159
+ }
160
+ }
139
161
  return Ok({
140
162
  html,
141
163
  title,
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-renderer.js","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"playwright-renderer.js","sourceRoot":"","sources":["../../src/browser/playwright-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Content Handlers Module
3
+ *
4
+ * Central routing for content-type specific sanitization handlers.
5
+ * Detects MIME type from Content-Type header and routes to appropriate handler.
6
+ *
7
+ * Supported content types:
8
+ * - application/pdf -> PDF handler
9
+ * - application/json -> JSON handler
10
+ * - image/svg+xml -> SVG handler
11
+ *
12
+ * Unsupported types return structured rejection (no throw).
13
+ */
14
+ import type { HandlerResult } from './types.js';
15
+ /**
16
+ * Normalize Content-Type header to base MIME type
17
+ *
18
+ * Examples:
19
+ * - "application/pdf; charset=utf-8" -> "application/pdf"
20
+ * - "application/json" -> "application/json"
21
+ * - "IMAGE/SVG+XML" -> "image/svg+xml"
22
+ *
23
+ * @param contentType - Raw Content-Type header value
24
+ * @returns Normalized MIME type (lowercase, parameters stripped)
25
+ */
26
+ export declare function normalizeMimeType(contentType: string): string;
27
+ /**
28
+ * Route content to appropriate handler based on MIME type
29
+ *
30
+ * @param content - Raw content (string or Buffer)
31
+ * @param contentType - Content-Type header value
32
+ * @returns Handler result (success or error/rejected)
33
+ */
34
+ export declare function routeContentHandler(content: string | Buffer, contentType: string): Promise<HandlerResult>;
35
+ export type { HandlerResult, HandlerSuccessResult, HandlerErrorResult } from './types.js';
36
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content-handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAGD,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Content Handlers Module
3
+ *
4
+ * Central routing for content-type specific sanitization handlers.
5
+ * Detects MIME type from Content-Type header and routes to appropriate handler.
6
+ *
7
+ * Supported content types:
8
+ * - application/pdf -> PDF handler
9
+ * - application/json -> JSON handler
10
+ * - image/svg+xml -> SVG handler
11
+ *
12
+ * Unsupported types return structured rejection (no throw).
13
+ */
14
+ import { handlePdf } from './pdf-handler.js';
15
+ import { handleJson } from './json-handler.js';
16
+ import { handleSvg } from './svg-handler.js';
17
+ /**
18
+ * Normalize Content-Type header to base MIME type
19
+ *
20
+ * Examples:
21
+ * - "application/pdf; charset=utf-8" -> "application/pdf"
22
+ * - "application/json" -> "application/json"
23
+ * - "IMAGE/SVG+XML" -> "image/svg+xml"
24
+ *
25
+ * @param contentType - Raw Content-Type header value
26
+ * @returns Normalized MIME type (lowercase, parameters stripped)
27
+ */
28
+ export function normalizeMimeType(contentType) {
29
+ return contentType.toLowerCase().split(';')[0].trim();
30
+ }
31
+ /**
32
+ * Route content to appropriate handler based on MIME type
33
+ *
34
+ * @param content - Raw content (string or Buffer)
35
+ * @param contentType - Content-Type header value
36
+ * @returns Handler result (success or error/rejected)
37
+ */
38
+ export async function routeContentHandler(content, contentType) {
39
+ const mimeType = normalizeMimeType(contentType);
40
+ // Route to appropriate handler
41
+ switch (mimeType) {
42
+ case 'application/pdf':
43
+ return handlePdf(content, mimeType);
44
+ case 'application/json':
45
+ case 'text/json':
46
+ return handleJson(content, mimeType);
47
+ case 'image/svg+xml':
48
+ return handleSvg(content, mimeType);
49
+ default:
50
+ // Unsupported content type - return structured rejection
51
+ return {
52
+ status: 'rejected',
53
+ reason: 'UNSUPPORTED_CONTENT_TYPE',
54
+ mime: mimeType,
55
+ message: `Content type ${mimeType} is not supported by Visus-MCP.`
56
+ };
57
+ }
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content-handlers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAwB,EACxB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEhD,+BAA+B;IAC/B,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtC,KAAK,kBAAkB,CAAC;QACxB,KAAK,WAAW;YACd,OAAO,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEvC,KAAK,eAAe;YAClB,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAEtC;YACE,yDAAyD;YACzD,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,0BAA0B;gBAClC,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,gBAAgB,QAAQ,iCAAiC;aACnE,CAAC;IACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * JSON Content Handler
3
+ *
4
+ * Handles application/json content type. Recursively traverses all nodes in the JSON
5
+ * object tree and applies the full injection pattern registry to every string value.
6
+ *
7
+ * What it handles:
8
+ * - All string values in the JSON tree (any depth)
9
+ * - Arrays, nested objects, and mixed-type arrays
10
+ * - Falls back to plain text pipeline if JSON.parse fails
11
+ *
12
+ * What it strips:
13
+ * - Nothing (preserves original structure)
14
+ *
15
+ * What it passes through:
16
+ * - Sanitized JSON with original structure preserved
17
+ * - All non-string values pass through unchanged
18
+ */
19
+ import type { HandlerResult } from './types.js';
20
+ /**
21
+ * Handle JSON content
22
+ *
23
+ * @param content - Raw JSON string
24
+ * @param mimeType - Original MIME type
25
+ * @returns Sanitized handler result
26
+ */
27
+ export declare function handleJson(content: string | Buffer, mimeType: string): HandlerResult;
28
+ //# sourceMappingURL=json-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-handler.d.ts","sourceRoot":"","sources":["../../src/content-handlers/json-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,UAAU,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,QAAQ,EAAE,MAAM,GACf,aAAa,CAoEf"}