@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.
Files changed (199) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +471 -0
  3. package/dist/ai-sdk-adapter.d.ts +113 -0
  4. package/dist/ai-sdk-adapter.d.ts.map +1 -0
  5. package/dist/ai-sdk-adapter.js +304 -0
  6. package/dist/ai-sdk-adapter.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +188 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/errors.d.ts +131 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +346 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/events.d.ts +185 -0
  16. package/dist/events.d.ts.map +1 -0
  17. package/dist/events.js +350 -0
  18. package/dist/events.js.map +1 -0
  19. package/dist/index.d.ts +117 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +323 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/parser/streaming-parser.d.ts +81 -0
  24. package/dist/parser/streaming-parser.d.ts.map +1 -0
  25. package/dist/parser/streaming-parser.js +522 -0
  26. package/dist/parser/streaming-parser.js.map +1 -0
  27. package/dist/performance.d.ts +139 -0
  28. package/dist/performance.d.ts.map +1 -0
  29. package/dist/performance.js +401 -0
  30. package/dist/performance.js.map +1 -0
  31. package/dist/plugins/index.d.ts +6 -0
  32. package/dist/plugins/index.d.ts.map +1 -0
  33. package/dist/plugins/index.js +22 -0
  34. package/dist/plugins/index.js.map +1 -0
  35. package/dist/plugins/plugin-system-inline.d.ts +116 -0
  36. package/dist/plugins/plugin-system-inline.d.ts.map +1 -0
  37. package/dist/plugins/plugin-system-inline.js +289 -0
  38. package/dist/plugins/plugin-system-inline.js.map +1 -0
  39. package/dist/plugins/plugin-system.d.ts +65 -0
  40. package/dist/plugins/plugin-system.d.ts.map +1 -0
  41. package/dist/plugins/plugin-system.js +202 -0
  42. package/dist/plugins/plugin-system.js.map +1 -0
  43. package/dist/plugins/rehype/harden.d.ts +15 -0
  44. package/dist/plugins/rehype/harden.d.ts.map +1 -0
  45. package/dist/plugins/rehype/harden.js +71 -0
  46. package/dist/plugins/rehype/harden.js.map +1 -0
  47. package/dist/plugins/rehype/index.d.ts +5 -0
  48. package/dist/plugins/rehype/index.d.ts.map +1 -0
  49. package/dist/plugins/rehype/index.js +21 -0
  50. package/dist/plugins/rehype/index.js.map +1 -0
  51. package/dist/plugins/remark/index.d.ts +6 -0
  52. package/dist/plugins/remark/index.d.ts.map +1 -0
  53. package/dist/plugins/remark/index.js +22 -0
  54. package/dist/plugins/remark/index.js.map +1 -0
  55. package/dist/plugins/remark/math.d.ts +7 -0
  56. package/dist/plugins/remark/math.d.ts.map +1 -0
  57. package/dist/plugins/remark/math.js +22 -0
  58. package/dist/plugins/remark/math.js.map +1 -0
  59. package/dist/plugins/remark/mermaid.d.ts +7 -0
  60. package/dist/plugins/remark/mermaid.d.ts.map +1 -0
  61. package/dist/plugins/remark/mermaid.js +19 -0
  62. package/dist/plugins/remark/mermaid.js.map +1 -0
  63. package/dist/plugins/types.d.ts +72 -0
  64. package/dist/plugins/types.d.ts.map +1 -0
  65. package/dist/plugins/types.js +3 -0
  66. package/dist/plugins/types.js.map +1 -0
  67. package/dist/renderer/blessed-renderer.d.ts +92 -0
  68. package/dist/renderer/blessed-renderer.d.ts.map +1 -0
  69. package/dist/renderer/blessed-renderer.js +610 -0
  70. package/dist/renderer/blessed-renderer.js.map +1 -0
  71. package/dist/renderers/index.d.ts +7 -0
  72. package/dist/renderers/index.d.ts.map +1 -0
  73. package/dist/renderers/index.js +21 -0
  74. package/dist/renderers/index.js.map +1 -0
  75. package/dist/renderers/math-renderer.d.ts +49 -0
  76. package/dist/renderers/math-renderer.d.ts.map +1 -0
  77. package/dist/renderers/math-renderer.js +193 -0
  78. package/dist/renderers/math-renderer.js.map +1 -0
  79. package/dist/renderers/mermaid-ascii.d.ts +14 -0
  80. package/dist/renderers/mermaid-ascii.d.ts.map +1 -0
  81. package/dist/renderers/mermaid-ascii.js +260 -0
  82. package/dist/renderers/mermaid-ascii.js.map +1 -0
  83. package/dist/renderers/mermaid-renderer.d.ts +79 -0
  84. package/dist/renderers/mermaid-renderer.d.ts.map +1 -0
  85. package/dist/renderers/mermaid-renderer.js +298 -0
  86. package/dist/renderers/mermaid-renderer.js.map +1 -0
  87. package/dist/renderers/shiki-ansi.d.ts +48 -0
  88. package/dist/renderers/shiki-ansi.d.ts.map +1 -0
  89. package/dist/renderers/shiki-ansi.js +206 -0
  90. package/dist/renderers/shiki-ansi.js.map +1 -0
  91. package/dist/renderers/table-ascii.d.ts +30 -0
  92. package/dist/renderers/table-ascii.d.ts.map +1 -0
  93. package/dist/renderers/table-ascii.js +243 -0
  94. package/dist/renderers/table-ascii.js.map +1 -0
  95. package/dist/renderers/table-renderer.d.ts +49 -0
  96. package/dist/renderers/table-renderer.d.ts.map +1 -0
  97. package/dist/renderers/table-renderer.js +224 -0
  98. package/dist/renderers/table-renderer.js.map +1 -0
  99. package/dist/renderers/unicode-math.d.ts +29 -0
  100. package/dist/renderers/unicode-math.d.ts.map +1 -0
  101. package/dist/renderers/unicode-math.js +181 -0
  102. package/dist/renderers/unicode-math.js.map +1 -0
  103. package/dist/security/ansi-sanitizer.d.ts +71 -0
  104. package/dist/security/ansi-sanitizer.d.ts.map +1 -0
  105. package/dist/security/ansi-sanitizer.js +275 -0
  106. package/dist/security/ansi-sanitizer.js.map +1 -0
  107. package/dist/security/chunk-processor.d.ts +81 -0
  108. package/dist/security/chunk-processor.d.ts.map +1 -0
  109. package/dist/security/chunk-processor.js +297 -0
  110. package/dist/security/chunk-processor.js.map +1 -0
  111. package/dist/security/index.d.ts +6 -0
  112. package/dist/security/index.d.ts.map +1 -0
  113. package/dist/security/index.js +22 -0
  114. package/dist/security/index.js.map +1 -0
  115. package/dist/security/input-validator.d.ts +55 -0
  116. package/dist/security/input-validator.d.ts.map +1 -0
  117. package/dist/security/input-validator.js +201 -0
  118. package/dist/security/input-validator.js.map +1 -0
  119. package/dist/stream-protocol.d.ts +61 -0
  120. package/dist/stream-protocol.d.ts.map +1 -0
  121. package/dist/stream-protocol.js +214 -0
  122. package/dist/stream-protocol.js.map +1 -0
  123. package/dist/streamdown-compat.d.ts +74 -0
  124. package/dist/streamdown-compat.d.ts.map +1 -0
  125. package/dist/streamdown-compat.js +241 -0
  126. package/dist/streamdown-compat.js.map +1 -0
  127. package/dist/streaming/stream-stats.d.ts +97 -0
  128. package/dist/streaming/stream-stats.d.ts.map +1 -0
  129. package/dist/streaming/stream-stats.js +217 -0
  130. package/dist/streaming/stream-stats.js.map +1 -0
  131. package/dist/streaming-integration.d.ts +71 -0
  132. package/dist/streaming-integration.d.ts.map +1 -0
  133. package/dist/streaming-integration.js +194 -0
  134. package/dist/streaming-integration.js.map +1 -0
  135. package/dist/themes/index.d.ts +59 -0
  136. package/dist/themes/index.d.ts.map +1 -0
  137. package/dist/themes/index.js +122 -0
  138. package/dist/themes/index.js.map +1 -0
  139. package/dist/types/index.d.ts +222 -0
  140. package/dist/types/index.d.ts.map +1 -0
  141. package/dist/types/index.js +3 -0
  142. package/dist/types/index.js.map +1 -0
  143. package/dist/types/plugin-types.d.ts +5 -0
  144. package/dist/types/plugin-types.d.ts.map +1 -0
  145. package/dist/types/plugin-types.js +6 -0
  146. package/dist/types/plugin-types.js.map +1 -0
  147. package/dist/types/stream-events.d.ts +71 -0
  148. package/dist/types/stream-events.d.ts.map +1 -0
  149. package/dist/types/stream-events.js +10 -0
  150. package/dist/types/stream-events.js.map +1 -0
  151. package/dist/utils/blessed-syntax-highlighter.d.ts +124 -0
  152. package/dist/utils/blessed-syntax-highlighter.d.ts.map +1 -0
  153. package/dist/utils/blessed-syntax-highlighter.js +440 -0
  154. package/dist/utils/blessed-syntax-highlighter.js.map +1 -0
  155. package/dist/utils/enhanced-table-renderer.d.ts +77 -0
  156. package/dist/utils/enhanced-table-renderer.d.ts.map +1 -0
  157. package/dist/utils/enhanced-table-renderer.js +376 -0
  158. package/dist/utils/enhanced-table-renderer.js.map +1 -0
  159. package/dist/utils/formatting.d.ts +100 -0
  160. package/dist/utils/formatting.d.ts.map +1 -0
  161. package/dist/utils/formatting.js +220 -0
  162. package/dist/utils/formatting.js.map +1 -0
  163. package/dist/utils/index.d.ts +5 -0
  164. package/dist/utils/index.d.ts.map +1 -0
  165. package/dist/utils/index.js +21 -0
  166. package/dist/utils/index.js.map +1 -0
  167. package/dist/utils/math-unicode-renderer.d.ts +38 -0
  168. package/dist/utils/math-unicode-renderer.d.ts.map +1 -0
  169. package/dist/utils/math-unicode-renderer.js +380 -0
  170. package/dist/utils/math-unicode-renderer.js.map +1 -0
  171. package/dist/utils/mermaid-ascii-renderer.d.ts +20 -0
  172. package/dist/utils/mermaid-ascii-renderer.d.ts.map +1 -0
  173. package/dist/utils/mermaid-ascii-renderer.js +325 -0
  174. package/dist/utils/mermaid-ascii-renderer.js.map +1 -0
  175. package/dist/utils/mermaid-ascii.d.ts +53 -0
  176. package/dist/utils/mermaid-ascii.d.ts.map +1 -0
  177. package/dist/utils/mermaid-ascii.js +181 -0
  178. package/dist/utils/mermaid-ascii.js.map +1 -0
  179. package/dist/utils/shiki-ansi-renderer.d.ts +29 -0
  180. package/dist/utils/shiki-ansi-renderer.d.ts.map +1 -0
  181. package/dist/utils/shiki-ansi-renderer.js +354 -0
  182. package/dist/utils/shiki-ansi-renderer.js.map +1 -0
  183. package/dist/utils/syntax-highlighter.d.ts +87 -0
  184. package/dist/utils/syntax-highlighter.d.ts.map +1 -0
  185. package/dist/utils/syntax-highlighter.js +265 -0
  186. package/dist/utils/syntax-highlighter.js.map +1 -0
  187. package/dist/utils/table-formatter-inline.d.ts +37 -0
  188. package/dist/utils/table-formatter-inline.d.ts.map +1 -0
  189. package/dist/utils/table-formatter-inline.js +337 -0
  190. package/dist/utils/table-formatter-inline.js.map +1 -0
  191. package/dist/utils/table.d.ts +35 -0
  192. package/dist/utils/table.d.ts.map +1 -0
  193. package/dist/utils/table.js +197 -0
  194. package/dist/utils/table.js.map +1 -0
  195. package/dist/widgets/stream-indicator.d.ts +130 -0
  196. package/dist/widgets/stream-indicator.d.ts.map +1 -0
  197. package/dist/widgets/stream-indicator.js +276 -0
  198. package/dist/widgets/stream-indicator.js.map +1 -0
  199. 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
+ '&lt;': '<',
67
+ '&gt;': '>',
68
+ '&quot;': '"',
69
+ '&#39;': "'",
70
+ '&apos;': "'",
71
+ '&nbsp;': ' ',
72
+ '&copy;': '©',
73
+ '&reg;': '®',
74
+ '&deg;': '°',
75
+ };
76
+ Object.entries(entities).forEach(([entity, char]) => {
77
+ result = result.replace(new RegExp(entity, 'g'), char);
78
+ });
79
+ // Decimal entities: &#123;
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: &#x1A;
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,6 @@
1
+ /**
2
+ * Security - Clean Exports
3
+ * Only exports the new ANSI sanitizer
4
+ */
5
+ export * from './ansi-sanitizer';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ '&': '&amp;',
149
+ '<': '&lt;',
150
+ '>': '&gt;',
151
+ '"': '&quot;',
152
+ "'": '&#39;',
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