@nicomatt69/streamtty 0.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.
- package/LICENSE +21 -0
- package/README.md +471 -0
- package/dist/ai-sdk-adapter.d.ts +113 -0
- package/dist/ai-sdk-adapter.d.ts.map +1 -0
- package/dist/ai-sdk-adapter.js +304 -0
- package/dist/ai-sdk-adapter.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +188 -0
- package/dist/cli.js.map +1 -0
- package/dist/errors.d.ts +131 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +346 -0
- package/dist/errors.js.map +1 -0
- package/dist/events.d.ts +185 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +350 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +117 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +323 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/streaming-parser.d.ts +81 -0
- package/dist/parser/streaming-parser.d.ts.map +1 -0
- package/dist/parser/streaming-parser.js +522 -0
- package/dist/parser/streaming-parser.js.map +1 -0
- package/dist/performance.d.ts +139 -0
- package/dist/performance.d.ts.map +1 -0
- package/dist/performance.js +401 -0
- package/dist/performance.js.map +1 -0
- package/dist/plugins/index.d.ts +6 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +22 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/plugin-system-inline.d.ts +116 -0
- package/dist/plugins/plugin-system-inline.d.ts.map +1 -0
- package/dist/plugins/plugin-system-inline.js +289 -0
- package/dist/plugins/plugin-system-inline.js.map +1 -0
- package/dist/plugins/plugin-system.d.ts +65 -0
- package/dist/plugins/plugin-system.d.ts.map +1 -0
- package/dist/plugins/plugin-system.js +202 -0
- package/dist/plugins/plugin-system.js.map +1 -0
- package/dist/plugins/rehype/harden.d.ts +15 -0
- package/dist/plugins/rehype/harden.d.ts.map +1 -0
- package/dist/plugins/rehype/harden.js +71 -0
- package/dist/plugins/rehype/harden.js.map +1 -0
- package/dist/plugins/rehype/index.d.ts +5 -0
- package/dist/plugins/rehype/index.d.ts.map +1 -0
- package/dist/plugins/rehype/index.js +21 -0
- package/dist/plugins/rehype/index.js.map +1 -0
- package/dist/plugins/remark/index.d.ts +6 -0
- package/dist/plugins/remark/index.d.ts.map +1 -0
- package/dist/plugins/remark/index.js +22 -0
- package/dist/plugins/remark/index.js.map +1 -0
- package/dist/plugins/remark/math.d.ts +7 -0
- package/dist/plugins/remark/math.d.ts.map +1 -0
- package/dist/plugins/remark/math.js +22 -0
- package/dist/plugins/remark/math.js.map +1 -0
- package/dist/plugins/remark/mermaid.d.ts +7 -0
- package/dist/plugins/remark/mermaid.d.ts.map +1 -0
- package/dist/plugins/remark/mermaid.js +19 -0
- package/dist/plugins/remark/mermaid.js.map +1 -0
- package/dist/plugins/types.d.ts +72 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +3 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/renderer/blessed-renderer.d.ts +92 -0
- package/dist/renderer/blessed-renderer.d.ts.map +1 -0
- package/dist/renderer/blessed-renderer.js +610 -0
- package/dist/renderer/blessed-renderer.js.map +1 -0
- package/dist/renderers/index.d.ts +7 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +21 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/math-renderer.d.ts +49 -0
- package/dist/renderers/math-renderer.d.ts.map +1 -0
- package/dist/renderers/math-renderer.js +193 -0
- package/dist/renderers/math-renderer.js.map +1 -0
- package/dist/renderers/mermaid-ascii.d.ts +14 -0
- package/dist/renderers/mermaid-ascii.d.ts.map +1 -0
- package/dist/renderers/mermaid-ascii.js +260 -0
- package/dist/renderers/mermaid-ascii.js.map +1 -0
- package/dist/renderers/mermaid-renderer.d.ts +79 -0
- package/dist/renderers/mermaid-renderer.d.ts.map +1 -0
- package/dist/renderers/mermaid-renderer.js +298 -0
- package/dist/renderers/mermaid-renderer.js.map +1 -0
- package/dist/renderers/shiki-ansi.d.ts +48 -0
- package/dist/renderers/shiki-ansi.d.ts.map +1 -0
- package/dist/renderers/shiki-ansi.js +206 -0
- package/dist/renderers/shiki-ansi.js.map +1 -0
- package/dist/renderers/table-ascii.d.ts +30 -0
- package/dist/renderers/table-ascii.d.ts.map +1 -0
- package/dist/renderers/table-ascii.js +243 -0
- package/dist/renderers/table-ascii.js.map +1 -0
- package/dist/renderers/table-renderer.d.ts +49 -0
- package/dist/renderers/table-renderer.d.ts.map +1 -0
- package/dist/renderers/table-renderer.js +224 -0
- package/dist/renderers/table-renderer.js.map +1 -0
- package/dist/renderers/unicode-math.d.ts +29 -0
- package/dist/renderers/unicode-math.d.ts.map +1 -0
- package/dist/renderers/unicode-math.js +181 -0
- package/dist/renderers/unicode-math.js.map +1 -0
- package/dist/security/ansi-sanitizer.d.ts +71 -0
- package/dist/security/ansi-sanitizer.d.ts.map +1 -0
- package/dist/security/ansi-sanitizer.js +275 -0
- package/dist/security/ansi-sanitizer.js.map +1 -0
- package/dist/security/chunk-processor.d.ts +81 -0
- package/dist/security/chunk-processor.d.ts.map +1 -0
- package/dist/security/chunk-processor.js +297 -0
- package/dist/security/chunk-processor.js.map +1 -0
- package/dist/security/index.d.ts +6 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +22 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/input-validator.d.ts +55 -0
- package/dist/security/input-validator.d.ts.map +1 -0
- package/dist/security/input-validator.js +201 -0
- package/dist/security/input-validator.js.map +1 -0
- package/dist/stream-protocol.d.ts +61 -0
- package/dist/stream-protocol.d.ts.map +1 -0
- package/dist/stream-protocol.js +214 -0
- package/dist/stream-protocol.js.map +1 -0
- package/dist/streamdown-compat.d.ts +74 -0
- package/dist/streamdown-compat.d.ts.map +1 -0
- package/dist/streamdown-compat.js +241 -0
- package/dist/streamdown-compat.js.map +1 -0
- package/dist/streaming/stream-stats.d.ts +97 -0
- package/dist/streaming/stream-stats.d.ts.map +1 -0
- package/dist/streaming/stream-stats.js +217 -0
- package/dist/streaming/stream-stats.js.map +1 -0
- package/dist/streaming-integration.d.ts +71 -0
- package/dist/streaming-integration.d.ts.map +1 -0
- package/dist/streaming-integration.js +194 -0
- package/dist/streaming-integration.js.map +1 -0
- package/dist/themes/index.d.ts +59 -0
- package/dist/themes/index.d.ts.map +1 -0
- package/dist/themes/index.js +122 -0
- package/dist/themes/index.js.map +1 -0
- package/dist/types/index.d.ts +222 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/plugin-types.d.ts +5 -0
- package/dist/types/plugin-types.d.ts.map +1 -0
- package/dist/types/plugin-types.js +6 -0
- package/dist/types/plugin-types.js.map +1 -0
- package/dist/types/stream-events.d.ts +71 -0
- package/dist/types/stream-events.d.ts.map +1 -0
- package/dist/types/stream-events.js +10 -0
- package/dist/types/stream-events.js.map +1 -0
- package/dist/utils/blessed-syntax-highlighter.d.ts +124 -0
- package/dist/utils/blessed-syntax-highlighter.d.ts.map +1 -0
- package/dist/utils/blessed-syntax-highlighter.js +440 -0
- package/dist/utils/blessed-syntax-highlighter.js.map +1 -0
- package/dist/utils/enhanced-table-renderer.d.ts +77 -0
- package/dist/utils/enhanced-table-renderer.d.ts.map +1 -0
- package/dist/utils/enhanced-table-renderer.js +376 -0
- package/dist/utils/enhanced-table-renderer.js.map +1 -0
- package/dist/utils/formatting.d.ts +100 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +220 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +21 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/math-unicode-renderer.d.ts +38 -0
- package/dist/utils/math-unicode-renderer.d.ts.map +1 -0
- package/dist/utils/math-unicode-renderer.js +380 -0
- package/dist/utils/math-unicode-renderer.js.map +1 -0
- package/dist/utils/mermaid-ascii-renderer.d.ts +20 -0
- package/dist/utils/mermaid-ascii-renderer.d.ts.map +1 -0
- package/dist/utils/mermaid-ascii-renderer.js +325 -0
- package/dist/utils/mermaid-ascii-renderer.js.map +1 -0
- package/dist/utils/mermaid-ascii.d.ts +53 -0
- package/dist/utils/mermaid-ascii.d.ts.map +1 -0
- package/dist/utils/mermaid-ascii.js +181 -0
- package/dist/utils/mermaid-ascii.js.map +1 -0
- package/dist/utils/shiki-ansi-renderer.d.ts +29 -0
- package/dist/utils/shiki-ansi-renderer.d.ts.map +1 -0
- package/dist/utils/shiki-ansi-renderer.js +354 -0
- package/dist/utils/shiki-ansi-renderer.js.map +1 -0
- package/dist/utils/syntax-highlighter.d.ts +87 -0
- package/dist/utils/syntax-highlighter.d.ts.map +1 -0
- package/dist/utils/syntax-highlighter.js +265 -0
- package/dist/utils/syntax-highlighter.js.map +1 -0
- package/dist/utils/table-formatter-inline.d.ts +37 -0
- package/dist/utils/table-formatter-inline.d.ts.map +1 -0
- package/dist/utils/table-formatter-inline.js +337 -0
- package/dist/utils/table-formatter-inline.js.map +1 -0
- package/dist/utils/table.d.ts +35 -0
- package/dist/utils/table.d.ts.map +1 -0
- package/dist/utils/table.js +197 -0
- package/dist/utils/table.js.map +1 -0
- package/dist/widgets/stream-indicator.d.ts +130 -0
- package/dist/widgets/stream-indicator.d.ts.map +1 -0
- package/dist/widgets/stream-indicator.js +276 -0
- package/dist/widgets/stream-indicator.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Inline security validation and sanitization for streaming chunks
|
|
4
|
+
* Handles all 10 edge cases for robust streaming
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.isEmptyChunk = isEmptyChunk;
|
|
8
|
+
exports.handleLargeChunk = handleLargeChunk;
|
|
9
|
+
exports.normalizeLineEndings = normalizeLineEndings;
|
|
10
|
+
exports.decodeHtmlEntities = decodeHtmlEntities;
|
|
11
|
+
exports.normalizeUnicode = normalizeUnicode;
|
|
12
|
+
exports.validateUTF8 = validateUTF8;
|
|
13
|
+
exports.stripDangerousAnsiCodes = stripDangerousAnsiCodes;
|
|
14
|
+
exports.stripControlChars = stripControlChars;
|
|
15
|
+
exports.stripNullBytes = stripNullBytes;
|
|
16
|
+
exports.validateNestingDepth = validateNestingDepth;
|
|
17
|
+
exports.validateChunk = validateChunk;
|
|
18
|
+
exports.sanitizeChunk = sanitizeChunk;
|
|
19
|
+
exports.processChunk = processChunk;
|
|
20
|
+
exports.detectSuspiciousPatterns = detectSuspiciousPatterns;
|
|
21
|
+
/**
|
|
22
|
+
* Edge Case 1: Validate empty chunks
|
|
23
|
+
*/
|
|
24
|
+
function isEmptyChunk(chunk) {
|
|
25
|
+
return !chunk || chunk.trim().length === 0;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Edge Case 2: Handle very large chunks (> 50KB)
|
|
29
|
+
*/
|
|
30
|
+
function handleLargeChunk(chunk, maxSize = 50 * 1024) {
|
|
31
|
+
const byteLength = Buffer.byteLength(chunk, 'utf-8');
|
|
32
|
+
if (byteLength > maxSize) {
|
|
33
|
+
// Split at line boundary to preserve structure
|
|
34
|
+
const lines = chunk.split('\n');
|
|
35
|
+
let result = '';
|
|
36
|
+
let currentSize = 0;
|
|
37
|
+
for (const line of lines) {
|
|
38
|
+
const lineSize = Buffer.byteLength(line + '\n', 'utf-8');
|
|
39
|
+
if (currentSize + lineSize > maxSize) {
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
result += line + '\n';
|
|
43
|
+
currentSize += lineSize;
|
|
44
|
+
}
|
|
45
|
+
return result || chunk.substring(0, maxSize);
|
|
46
|
+
}
|
|
47
|
+
return chunk;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Edge Case 3: Normalize mixed line endings
|
|
51
|
+
* Handles \r\n, \r, and \n
|
|
52
|
+
*/
|
|
53
|
+
function normalizeLineEndings(chunk) {
|
|
54
|
+
return chunk
|
|
55
|
+
.replace(/\r\n/g, '\n') // Windows to Unix
|
|
56
|
+
.replace(/\r/g, '\n'); // Old Mac to Unix
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Edge Case 4: Decode HTML entities comprehensively
|
|
60
|
+
*/
|
|
61
|
+
function decodeHtmlEntities(chunk) {
|
|
62
|
+
let result = chunk;
|
|
63
|
+
// Named entities
|
|
64
|
+
const entities = {
|
|
65
|
+
'&': '&',
|
|
66
|
+
'<': '<',
|
|
67
|
+
'>': '>',
|
|
68
|
+
'"': '"',
|
|
69
|
+
''': "'",
|
|
70
|
+
''': "'",
|
|
71
|
+
' ': ' ',
|
|
72
|
+
'©': '©',
|
|
73
|
+
'®': '®',
|
|
74
|
+
'°': '°',
|
|
75
|
+
};
|
|
76
|
+
Object.entries(entities).forEach(([entity, char]) => {
|
|
77
|
+
result = result.replace(new RegExp(entity, 'g'), char);
|
|
78
|
+
});
|
|
79
|
+
// Decimal entities: {
|
|
80
|
+
result = result.replace(/&#(\d+);/g, (match, num) => {
|
|
81
|
+
try {
|
|
82
|
+
return String.fromCharCode(parseInt(num, 10));
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
return match;
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// Hex entities: 
|
|
89
|
+
result = result.replace(/&#x([a-fA-F0-9]+);/g, (match, hex) => {
|
|
90
|
+
try {
|
|
91
|
+
return String.fromCharCode(parseInt(hex, 16));
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return match;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Edge Case 5: Unicode normalization NFC
|
|
101
|
+
*/
|
|
102
|
+
function normalizeUnicode(chunk) {
|
|
103
|
+
try {
|
|
104
|
+
return chunk.normalize('NFC');
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// If normalization fails, return as-is
|
|
108
|
+
return chunk;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Edge Case 6: Validate UTF-8 encoding
|
|
113
|
+
*/
|
|
114
|
+
function validateUTF8(chunk) {
|
|
115
|
+
try {
|
|
116
|
+
// Try to encode and decode - this validates UTF-8
|
|
117
|
+
const encoded = Buffer.from(chunk, 'utf-8');
|
|
118
|
+
const decoded = encoded.toString('utf-8');
|
|
119
|
+
// Check for replacement characters (indicates invalid UTF-8)
|
|
120
|
+
if (decoded.includes('�')) {
|
|
121
|
+
return { valid: false, error: 'Invalid UTF-8 sequences detected' };
|
|
122
|
+
}
|
|
123
|
+
return { valid: true };
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return {
|
|
127
|
+
valid: false,
|
|
128
|
+
error: error instanceof Error ? error.message : 'UTF-8 validation failed',
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Edge Case 7: Strip dangerous ANSI escape sequences
|
|
134
|
+
* Keep safe ones for terminal colors
|
|
135
|
+
*/
|
|
136
|
+
function stripDangerousAnsiCodes(chunk) {
|
|
137
|
+
// Dangerous patterns: cursor movement, clear screen, title setting
|
|
138
|
+
return chunk
|
|
139
|
+
// Clear screen / clear line
|
|
140
|
+
.replace(/\x1b\[2J/g, '')
|
|
141
|
+
.replace(/\x1b\[K/g, '')
|
|
142
|
+
// Cursor movement (ESC[H, ESC[A, ESC[B, etc)
|
|
143
|
+
.replace(/\x1b\[\d+[ABCDEFf]/g, '')
|
|
144
|
+
// Save/restore cursor
|
|
145
|
+
.replace(/\x1b\[s/g, '')
|
|
146
|
+
.replace(/\x1b\[u/g, '')
|
|
147
|
+
// Set title
|
|
148
|
+
.replace(/\x1b\][0-2];[^\x1b]*(?:\x1b\\|BEL)/g, '')
|
|
149
|
+
// Other dangerous sequences
|
|
150
|
+
.replace(/\x1b\(B/g, '')
|
|
151
|
+
.replace(/\x1b\)0/g, '');
|
|
152
|
+
// But KEEP color codes like \x1b[31m
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Edge Case 8: Remove control characters (but keep safe ones)
|
|
156
|
+
*/
|
|
157
|
+
function stripControlChars(chunk) {
|
|
158
|
+
// Keep common safe ones: \n, \t, \r (normalized earlier)
|
|
159
|
+
return chunk
|
|
160
|
+
.split('')
|
|
161
|
+
.filter(char => {
|
|
162
|
+
const code = char.charCodeAt(0);
|
|
163
|
+
// Allow: tab (9), newline (10), carriage return (13)
|
|
164
|
+
// Disallow: other control chars (0-8, 11-12, 14-31)
|
|
165
|
+
if (code === 9 || code === 10 || code === 13)
|
|
166
|
+
return true;
|
|
167
|
+
// Allow normal characters (32+)
|
|
168
|
+
if (code >= 32)
|
|
169
|
+
return true;
|
|
170
|
+
// Allow high unicode (127+)
|
|
171
|
+
if (code >= 127)
|
|
172
|
+
return true;
|
|
173
|
+
return false;
|
|
174
|
+
})
|
|
175
|
+
.join('');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Edge Case 9: Remove null bytes
|
|
179
|
+
*/
|
|
180
|
+
function stripNullBytes(chunk) {
|
|
181
|
+
return chunk.replace(/\0/g, '');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Edge Case 10: Validate bracket/brace nesting depth
|
|
185
|
+
* Prevents stack overflow attacks
|
|
186
|
+
*/
|
|
187
|
+
function validateNestingDepth(chunk, maxDepth = 100) {
|
|
188
|
+
let depth = 0;
|
|
189
|
+
let maxReached = 0;
|
|
190
|
+
for (const char of chunk) {
|
|
191
|
+
if (char === '[' || char === '(' || char === '{') {
|
|
192
|
+
depth++;
|
|
193
|
+
maxReached = Math.max(maxReached, depth);
|
|
194
|
+
}
|
|
195
|
+
else if (char === ']' || char === ')' || char === '}') {
|
|
196
|
+
depth = Math.max(0, depth - 1);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
valid: maxReached <= maxDepth,
|
|
201
|
+
depth: maxReached,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Comprehensive chunk validation
|
|
206
|
+
*/
|
|
207
|
+
function validateChunk(chunk) {
|
|
208
|
+
// Check 1: Empty
|
|
209
|
+
if (isEmptyChunk(chunk)) {
|
|
210
|
+
return { valid: false, error: 'Empty chunk' };
|
|
211
|
+
}
|
|
212
|
+
// Check 2: UTF-8 validity
|
|
213
|
+
const utf8Check = validateUTF8(chunk);
|
|
214
|
+
if (!utf8Check.valid) {
|
|
215
|
+
return { valid: false, error: utf8Check.error };
|
|
216
|
+
}
|
|
217
|
+
// Check 3: Nesting depth
|
|
218
|
+
const nestingCheck = validateNestingDepth(chunk);
|
|
219
|
+
if (!nestingCheck.valid) {
|
|
220
|
+
return { valid: false, error: `Nesting depth too deep: ${nestingCheck.depth}` };
|
|
221
|
+
}
|
|
222
|
+
return { valid: true };
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Comprehensive chunk sanitization (handles all edge cases)
|
|
226
|
+
*/
|
|
227
|
+
function sanitizeChunk(chunk, options = {}) {
|
|
228
|
+
const { mode = 'balanced', maxBufferSize = 1024 * 100, // 100KB
|
|
229
|
+
stripControlChars: strip = true, stripDangerousAnsi: stripAnsi = true, } = options;
|
|
230
|
+
let result = chunk;
|
|
231
|
+
// 1. Handle large chunks
|
|
232
|
+
result = handleLargeChunk(result, maxBufferSize);
|
|
233
|
+
// 2. Normalize line endings
|
|
234
|
+
result = normalizeLineEndings(result);
|
|
235
|
+
// 3. Decode HTML entities
|
|
236
|
+
if (mode !== 'strict') {
|
|
237
|
+
result = decodeHtmlEntities(result);
|
|
238
|
+
}
|
|
239
|
+
// 4. Normalize unicode
|
|
240
|
+
result = normalizeUnicode(result);
|
|
241
|
+
// 5. Strip dangerous ANSI codes
|
|
242
|
+
if (stripAnsi) {
|
|
243
|
+
result = stripDangerousAnsiCodes(result);
|
|
244
|
+
}
|
|
245
|
+
// 6. Strip control characters
|
|
246
|
+
if (strip) {
|
|
247
|
+
result = stripControlChars(result);
|
|
248
|
+
}
|
|
249
|
+
// 7. Remove null bytes
|
|
250
|
+
result = stripNullBytes(result);
|
|
251
|
+
// 8. Remove trailing/leading whitespace (but preserve indentation)
|
|
252
|
+
if (mode === 'strict') {
|
|
253
|
+
result = result.trim();
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Full validation + sanitization pipeline
|
|
259
|
+
*/
|
|
260
|
+
function processChunk(chunk, options = {}) {
|
|
261
|
+
// Validate
|
|
262
|
+
const validation = validateChunk(chunk);
|
|
263
|
+
if (!validation.valid) {
|
|
264
|
+
return validation;
|
|
265
|
+
}
|
|
266
|
+
// Sanitize
|
|
267
|
+
const sanitized = sanitizeChunk(chunk, options);
|
|
268
|
+
return {
|
|
269
|
+
valid: true,
|
|
270
|
+
sanitized,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Detect suspicious patterns
|
|
275
|
+
*/
|
|
276
|
+
function detectSuspiciousPatterns(chunk) {
|
|
277
|
+
const warnings = [];
|
|
278
|
+
// Check for potential XSS
|
|
279
|
+
if (/<script|javascript:/i.test(chunk)) {
|
|
280
|
+
warnings.push('Potential XSS detected');
|
|
281
|
+
}
|
|
282
|
+
// Check for path traversal
|
|
283
|
+
if (/\.\.\//g.test(chunk)) {
|
|
284
|
+
warnings.push('Path traversal detected');
|
|
285
|
+
}
|
|
286
|
+
// Check for SQL injection patterns
|
|
287
|
+
if (/('|").*--.*/i.test(chunk)) {
|
|
288
|
+
warnings.push('SQL injection pattern detected');
|
|
289
|
+
}
|
|
290
|
+
// Check for excessive special chars
|
|
291
|
+
const specialCharCount = (chunk.match(/[!@#$%^&*()_+=\[\]{};:'"<>,.?/]/g) || []).length;
|
|
292
|
+
if (specialCharCount > chunk.length * 0.3) {
|
|
293
|
+
warnings.push('Unusual character density');
|
|
294
|
+
}
|
|
295
|
+
return warnings;
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=chunk-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chunk-processor.js","sourceRoot":"","sources":["../../src/security/chunk-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security - Clean Exports
|
|
4
|
+
* Only exports the new ANSI sanitizer
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./ansi-sanitizer"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/security/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,mDAAiC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { SecurityConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Input validator for markdown content
|
|
4
|
+
* Prevents buffer overflow, injection attacks, and validates content
|
|
5
|
+
*/
|
|
6
|
+
export declare class InputValidator {
|
|
7
|
+
private config;
|
|
8
|
+
constructor(config?: SecurityConfig);
|
|
9
|
+
/**
|
|
10
|
+
* Validate markdown input
|
|
11
|
+
*/
|
|
12
|
+
validate(input: string): ValidationResult;
|
|
13
|
+
/**
|
|
14
|
+
* Validate link prefixes
|
|
15
|
+
*/
|
|
16
|
+
private validateLinks;
|
|
17
|
+
/**
|
|
18
|
+
* Validate image prefixes
|
|
19
|
+
*/
|
|
20
|
+
private validateImages;
|
|
21
|
+
/**
|
|
22
|
+
* Check for blessed tag injection
|
|
23
|
+
*/
|
|
24
|
+
private checkBlessedInjection;
|
|
25
|
+
/**
|
|
26
|
+
* Sanitize HTML entities
|
|
27
|
+
*/
|
|
28
|
+
private sanitizeHtmlEntities;
|
|
29
|
+
/**
|
|
30
|
+
* Update configuration
|
|
31
|
+
*/
|
|
32
|
+
updateConfig(config: Partial<SecurityConfig>): void;
|
|
33
|
+
/**
|
|
34
|
+
* Get current configuration
|
|
35
|
+
*/
|
|
36
|
+
getConfig(): Required<SecurityConfig>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Validation result
|
|
40
|
+
*/
|
|
41
|
+
export interface ValidationResult {
|
|
42
|
+
valid: boolean;
|
|
43
|
+
sanitized: string;
|
|
44
|
+
errors: string[];
|
|
45
|
+
warnings: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Singleton instance
|
|
49
|
+
*/
|
|
50
|
+
export declare const inputValidator: InputValidator;
|
|
51
|
+
/**
|
|
52
|
+
* Validate input with default validator
|
|
53
|
+
*/
|
|
54
|
+
export declare function validateInput(input: string, config?: SecurityConfig): ValidationResult;
|
|
55
|
+
//# sourceMappingURL=input-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validator.d.ts","sourceRoot":"","sources":["../../src/security/input-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C;;;GAGG;AACH,qBAAa,cAAc;IACvB,OAAO,CAAC,MAAM,CAA2B;gBAE7B,MAAM,GAAE,cAAmB;IAWvC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;IA0DzC;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiC5B;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,IAAI;IAInD;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,cAAc,CAAC;CAGxC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,gBAAuB,CAAC;AAEnD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,gBAAgB,CAMtF"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.inputValidator = exports.InputValidator = void 0;
|
|
4
|
+
exports.validateInput = validateInput;
|
|
5
|
+
const ansi_sanitizer_1 = require("./ansi-sanitizer");
|
|
6
|
+
/**
|
|
7
|
+
* Input validator for markdown content
|
|
8
|
+
* Prevents buffer overflow, injection attacks, and validates content
|
|
9
|
+
*/
|
|
10
|
+
class InputValidator {
|
|
11
|
+
config;
|
|
12
|
+
constructor(config = {}) {
|
|
13
|
+
this.config = {
|
|
14
|
+
enabled: config.enabled ?? true,
|
|
15
|
+
allowedLinkPrefixes: config.allowedLinkPrefixes ?? ['http://', 'https://'],
|
|
16
|
+
allowedImagePrefixes: config.allowedImagePrefixes ?? ['http://', 'https://'],
|
|
17
|
+
maxBufferSize: config.maxBufferSize ?? 10 * 1024 * 1024, // 10MB default
|
|
18
|
+
stripDangerousAnsi: config.stripDangerousAnsi ?? true,
|
|
19
|
+
sanitizeHtml: config.sanitizeHtml ?? true,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Validate markdown input
|
|
24
|
+
*/
|
|
25
|
+
validate(input) {
|
|
26
|
+
const errors = [];
|
|
27
|
+
const warnings = [];
|
|
28
|
+
let sanitized = input;
|
|
29
|
+
if (!this.config.enabled) {
|
|
30
|
+
return { valid: true, sanitized, errors, warnings };
|
|
31
|
+
}
|
|
32
|
+
// Check buffer size
|
|
33
|
+
if (input.length > this.config.maxBufferSize) {
|
|
34
|
+
errors.push(`Input exceeds maximum buffer size (${input.length} > ${this.config.maxBufferSize})`);
|
|
35
|
+
return { valid: false, sanitized, errors, warnings };
|
|
36
|
+
}
|
|
37
|
+
// Sanitize ANSI codes if enabled
|
|
38
|
+
if (this.config.stripDangerousAnsi) {
|
|
39
|
+
const originalLength = sanitized.length;
|
|
40
|
+
sanitized = (0, ansi_sanitizer_1.sanitizeForTerminal)(sanitized);
|
|
41
|
+
if (sanitized.length !== originalLength) {
|
|
42
|
+
warnings.push('Dangerous ANSI escape sequences were removed');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Validate links
|
|
46
|
+
const linkValidation = this.validateLinks(sanitized);
|
|
47
|
+
if (!linkValidation.valid) {
|
|
48
|
+
warnings.push(...linkValidation.warnings);
|
|
49
|
+
}
|
|
50
|
+
// Validate images
|
|
51
|
+
const imageValidation = this.validateImages(sanitized);
|
|
52
|
+
if (!imageValidation.valid) {
|
|
53
|
+
warnings.push(...imageValidation.warnings);
|
|
54
|
+
}
|
|
55
|
+
// Check for blessed tag injection
|
|
56
|
+
const injectionCheck = this.checkBlessedInjection(sanitized);
|
|
57
|
+
if (!injectionCheck.valid) {
|
|
58
|
+
errors.push(...injectionCheck.errors);
|
|
59
|
+
sanitized = injectionCheck.sanitized;
|
|
60
|
+
}
|
|
61
|
+
// Sanitize HTML if enabled
|
|
62
|
+
if (this.config.sanitizeHtml) {
|
|
63
|
+
sanitized = this.sanitizeHtmlEntities(sanitized);
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
valid: errors.length === 0,
|
|
67
|
+
sanitized,
|
|
68
|
+
errors,
|
|
69
|
+
warnings,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate link prefixes
|
|
74
|
+
*/
|
|
75
|
+
validateLinks(input) {
|
|
76
|
+
const warnings = [];
|
|
77
|
+
const linkRegex = /\[([^\]]+)\]\(([^)]+)\)/g;
|
|
78
|
+
let match;
|
|
79
|
+
while ((match = linkRegex.exec(input)) !== null) {
|
|
80
|
+
const url = match[2];
|
|
81
|
+
const isAllowed = this.config.allowedLinkPrefixes.some(prefix => prefix === '*' || url.startsWith(prefix));
|
|
82
|
+
if (!isAllowed) {
|
|
83
|
+
warnings.push(`Link with prefix '${url.split(':')[0]}' is not in allowed list`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
valid: true, // Links are warnings, not errors
|
|
88
|
+
sanitized: input,
|
|
89
|
+
warnings,
|
|
90
|
+
errors: [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validate image prefixes
|
|
95
|
+
*/
|
|
96
|
+
validateImages(input) {
|
|
97
|
+
const warnings = [];
|
|
98
|
+
const imageRegex = /!\[([^\]]*)\]\(([^)]+)\)/g;
|
|
99
|
+
let match;
|
|
100
|
+
while ((match = imageRegex.exec(input)) !== null) {
|
|
101
|
+
const url = match[2];
|
|
102
|
+
const isAllowed = this.config.allowedImagePrefixes.some(prefix => prefix === '*' || url.startsWith(prefix));
|
|
103
|
+
if (!isAllowed) {
|
|
104
|
+
warnings.push(`Image with prefix '${url.split(':')[0]}' is not in allowed list`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
valid: true, // Images are warnings, not errors
|
|
109
|
+
sanitized: input,
|
|
110
|
+
warnings,
|
|
111
|
+
errors: [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check for blessed tag injection
|
|
116
|
+
*/
|
|
117
|
+
checkBlessedInjection(input) {
|
|
118
|
+
const errors = [];
|
|
119
|
+
let sanitized = input;
|
|
120
|
+
// Check for unbalanced tags
|
|
121
|
+
const openTags = (input.match(/\{[a-z-]+}/gi) || []).length;
|
|
122
|
+
const closeTags = (input.match(/\{\/[a-z-]+}/gi) || []).length;
|
|
123
|
+
if (openTags !== closeTags) {
|
|
124
|
+
errors.push('Unbalanced blessed tags detected');
|
|
125
|
+
// Escape all blessed tags
|
|
126
|
+
sanitized = sanitized.replace(/\{/g, '\\{');
|
|
127
|
+
}
|
|
128
|
+
// Check for potentially malicious tags
|
|
129
|
+
const dangerousTags = ['open', 'close', 'exec', 'eval'];
|
|
130
|
+
for (const tag of dangerousTags) {
|
|
131
|
+
if (input.includes(`{${tag}}`) || input.includes(`{/${tag}}`)) {
|
|
132
|
+
errors.push(`Potentially dangerous blessed tag detected: ${tag}`);
|
|
133
|
+
sanitized = sanitized.replace(new RegExp(`\\{\\/?${tag}\\}`, 'gi'), '');
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
valid: errors.length === 0,
|
|
138
|
+
sanitized,
|
|
139
|
+
errors,
|
|
140
|
+
warnings: [],
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Sanitize HTML entities
|
|
145
|
+
*/
|
|
146
|
+
sanitizeHtmlEntities(input) {
|
|
147
|
+
const entityMap = {
|
|
148
|
+
'&': '&',
|
|
149
|
+
'<': '<',
|
|
150
|
+
'>': '>',
|
|
151
|
+
'"': '"',
|
|
152
|
+
"'": ''',
|
|
153
|
+
};
|
|
154
|
+
// Only sanitize if not already in markdown code
|
|
155
|
+
let result = input;
|
|
156
|
+
const codeBlockRegex = /```[\s\S]*?```|`[^`]+`/g;
|
|
157
|
+
const codeBlocks = [];
|
|
158
|
+
// Preserve code blocks
|
|
159
|
+
result = result.replace(codeBlockRegex, (match) => {
|
|
160
|
+
codeBlocks.push(match);
|
|
161
|
+
return `__CODE_BLOCK_${codeBlocks.length - 1}__`;
|
|
162
|
+
});
|
|
163
|
+
// Sanitize outside code blocks (only in HTML contexts)
|
|
164
|
+
result = result.replace(/<[^>]+>/g, (tag) => {
|
|
165
|
+
return tag.replace(/[&<>"']/g, char => entityMap[char] || char);
|
|
166
|
+
});
|
|
167
|
+
// Restore code blocks
|
|
168
|
+
result = result.replace(/__CODE_BLOCK_(\d+)__/g, (match, index) => {
|
|
169
|
+
return codeBlocks[parseInt(index)];
|
|
170
|
+
});
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Update configuration
|
|
175
|
+
*/
|
|
176
|
+
updateConfig(config) {
|
|
177
|
+
this.config = { ...this.config, ...config };
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get current configuration
|
|
181
|
+
*/
|
|
182
|
+
getConfig() {
|
|
183
|
+
return { ...this.config };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.InputValidator = InputValidator;
|
|
187
|
+
/**
|
|
188
|
+
* Singleton instance
|
|
189
|
+
*/
|
|
190
|
+
exports.inputValidator = new InputValidator();
|
|
191
|
+
/**
|
|
192
|
+
* Validate input with default validator
|
|
193
|
+
*/
|
|
194
|
+
function validateInput(input, config) {
|
|
195
|
+
if (config) {
|
|
196
|
+
const validator = new InputValidator(config);
|
|
197
|
+
return validator.validate(input);
|
|
198
|
+
}
|
|
199
|
+
return exports.inputValidator.validate(input);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=input-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validator.js","sourceRoot":"","sources":["../../src/security/input-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream Protocol Implementation
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for validating, transforming, and
|
|
5
|
+
* processing stream events according to the AI SDK protocol.
|
|
6
|
+
*/
|
|
7
|
+
import { StreamEvent, StreamEventOptions, ToolCallEvent, ToolResultEvent, TextDeltaEvent, ThinkingEvent, StatusEvent, ErrorEvent } from './types/stream-events';
|
|
8
|
+
export declare class StreamProtocol {
|
|
9
|
+
private static readonly VALID_EVENT_TYPES;
|
|
10
|
+
/**
|
|
11
|
+
* Validate a stream event structure
|
|
12
|
+
*/
|
|
13
|
+
static validateEvent(event: any): event is StreamEvent;
|
|
14
|
+
private static validateToolCallEvent;
|
|
15
|
+
private static validateToolResultEvent;
|
|
16
|
+
private static validateTextDeltaEvent;
|
|
17
|
+
private static validateThinkingEvent;
|
|
18
|
+
private static validateStatusEvent;
|
|
19
|
+
private static validateErrorEvent;
|
|
20
|
+
/**
|
|
21
|
+
* Transform a generic event into a typed event
|
|
22
|
+
*/
|
|
23
|
+
static transformEvent(event: StreamEvent): StreamEvent;
|
|
24
|
+
/**
|
|
25
|
+
* Create a text delta event
|
|
26
|
+
*/
|
|
27
|
+
static createTextDelta(content: string, metadata?: Record<string, any>): TextDeltaEvent;
|
|
28
|
+
/**
|
|
29
|
+
* Create a tool call event
|
|
30
|
+
*/
|
|
31
|
+
static createToolCall(toolName: string, toolArgs: Record<string, any>, metadata?: Record<string, any>): ToolCallEvent;
|
|
32
|
+
/**
|
|
33
|
+
* Create a tool result event
|
|
34
|
+
*/
|
|
35
|
+
static createToolResult(toolResult: any, metadata?: Record<string, any>): ToolResultEvent;
|
|
36
|
+
/**
|
|
37
|
+
* Create a thinking event
|
|
38
|
+
*/
|
|
39
|
+
static createThinking(content: string, metadata?: Record<string, any>): ThinkingEvent;
|
|
40
|
+
/**
|
|
41
|
+
* Create a reasoning event
|
|
42
|
+
*/
|
|
43
|
+
static createReasoning(content: string, metadata?: Record<string, any>): ThinkingEvent;
|
|
44
|
+
/**
|
|
45
|
+
* Create a status event
|
|
46
|
+
*/
|
|
47
|
+
static createStatus(content: string, status?: 'pending' | 'running' | 'completed' | 'failed', metadata?: Record<string, any>): StatusEvent;
|
|
48
|
+
/**
|
|
49
|
+
* Create an error event
|
|
50
|
+
*/
|
|
51
|
+
static createError(content: string, error?: Error, metadata?: Record<string, any>): ErrorEvent;
|
|
52
|
+
/**
|
|
53
|
+
* Check if an event should be rendered based on options
|
|
54
|
+
*/
|
|
55
|
+
static shouldRenderEvent(event: StreamEvent, options?: StreamEventOptions): boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Get event priority for rendering order
|
|
58
|
+
*/
|
|
59
|
+
static getEventPriority(event: StreamEvent): number;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=stream-protocol.d.ts.map
|