@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,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Inline Plugin System for StreamTTY
|
|
4
|
+
* Minimal but powerful plugin architecture
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PLUGIN_PRESETS = exports.syntaxHighlightPlugin = exports.securityPlugin = exports.mermaidPlugin = exports.mathPlugin = exports.PluginRegistry = void 0;
|
|
8
|
+
exports.createDefaultRegistry = createDefaultRegistry;
|
|
9
|
+
/**
|
|
10
|
+
* Plugin registry and executor
|
|
11
|
+
*/
|
|
12
|
+
class PluginRegistry {
|
|
13
|
+
plugins = new Map();
|
|
14
|
+
context;
|
|
15
|
+
initialized = false;
|
|
16
|
+
constructor() {
|
|
17
|
+
this.context = {
|
|
18
|
+
isStreaming: false,
|
|
19
|
+
totalChunksProcessed: 0,
|
|
20
|
+
lastChunkSize: 0,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Register a plugin
|
|
25
|
+
*/
|
|
26
|
+
register(plugin) {
|
|
27
|
+
if (this.plugins.has(plugin.name)) {
|
|
28
|
+
console.warn(`Plugin "${plugin.name}" already registered, replacing`);
|
|
29
|
+
}
|
|
30
|
+
this.plugins.set(plugin.name, plugin);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Unregister a plugin
|
|
34
|
+
*/
|
|
35
|
+
unregister(name) {
|
|
36
|
+
this.plugins.delete(name);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Initialize all plugins
|
|
40
|
+
*/
|
|
41
|
+
async init() {
|
|
42
|
+
if (this.initialized)
|
|
43
|
+
return;
|
|
44
|
+
for (const [, plugin] of this.plugins) {
|
|
45
|
+
try {
|
|
46
|
+
if (plugin.onInit) {
|
|
47
|
+
await plugin.onInit();
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
console.error(`Error initializing plugin "${plugin.name}":`, error);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
this.initialized = true;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Destroy all plugins
|
|
58
|
+
*/
|
|
59
|
+
async destroy() {
|
|
60
|
+
for (const [, plugin] of this.plugins) {
|
|
61
|
+
try {
|
|
62
|
+
if (plugin.onDestroy) {
|
|
63
|
+
await plugin.onDestroy();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error(`Error destroying plugin "${plugin.name}":`, error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
this.initialized = false;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Execute onChunk hooks
|
|
74
|
+
*/
|
|
75
|
+
async executeChunk(chunk) {
|
|
76
|
+
let result = chunk;
|
|
77
|
+
this.context.lastChunkSize = chunk.length;
|
|
78
|
+
this.context.isStreaming = true;
|
|
79
|
+
for (const [, plugin] of this.plugins) {
|
|
80
|
+
try {
|
|
81
|
+
if (plugin.onChunk) {
|
|
82
|
+
result = await plugin.onChunk(result, this.context);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
console.error(`Error in plugin "${plugin.name}" onChunk:`, error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
this.context.totalChunksProcessed++;
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Execute onTokens hooks
|
|
94
|
+
*/
|
|
95
|
+
async executeTokens(tokens) {
|
|
96
|
+
let result = tokens;
|
|
97
|
+
for (const [, plugin] of this.plugins) {
|
|
98
|
+
try {
|
|
99
|
+
if (plugin.onTokens) {
|
|
100
|
+
result = await plugin.onTokens(result, this.context);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error(`Error in plugin "${plugin.name}" onTokens:`, error);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Execute onRender hooks
|
|
111
|
+
*/
|
|
112
|
+
async executeRender(content) {
|
|
113
|
+
let result = content;
|
|
114
|
+
for (const [, plugin] of this.plugins) {
|
|
115
|
+
try {
|
|
116
|
+
if (plugin.onRender) {
|
|
117
|
+
result = await plugin.onRender(result, this.context);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
console.error(`Error in plugin "${plugin.name}" onRender:`, error);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Execute onError hooks
|
|
128
|
+
*/
|
|
129
|
+
async executeError(error) {
|
|
130
|
+
for (const [, plugin] of this.plugins) {
|
|
131
|
+
try {
|
|
132
|
+
if (plugin.onError) {
|
|
133
|
+
await plugin.onError(error, this.context);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (e) {
|
|
137
|
+
console.error(`Error in plugin "${plugin.name}" onError:`, e);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Execute onComplete hooks
|
|
143
|
+
*/
|
|
144
|
+
async executeComplete(stats) {
|
|
145
|
+
this.context.isStreaming = false;
|
|
146
|
+
for (const [, plugin] of this.plugins) {
|
|
147
|
+
try {
|
|
148
|
+
if (plugin.onComplete) {
|
|
149
|
+
await plugin.onComplete(stats, this.context);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error(`Error in plugin "${plugin.name}" onComplete:`, error);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get plugin by name
|
|
159
|
+
*/
|
|
160
|
+
get(name) {
|
|
161
|
+
return this.plugins.get(name);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* List all plugins
|
|
165
|
+
*/
|
|
166
|
+
list() {
|
|
167
|
+
return Array.from(this.plugins.values());
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Check if plugin exists
|
|
171
|
+
*/
|
|
172
|
+
has(name) {
|
|
173
|
+
return this.plugins.has(name);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
exports.PluginRegistry = PluginRegistry;
|
|
177
|
+
/**
|
|
178
|
+
* Built-in plugins
|
|
179
|
+
*/
|
|
180
|
+
const math_unicode_renderer_1 = require("../utils/math-unicode-renderer");
|
|
181
|
+
const mermaid_ascii_renderer_1 = require("../utils/mermaid-ascii-renderer");
|
|
182
|
+
const ansi_sanitizer_1 = require("../security/ansi-sanitizer");
|
|
183
|
+
const shiki_ansi_renderer_1 = require("../utils/shiki-ansi-renderer");
|
|
184
|
+
/**
|
|
185
|
+
* Math rendering plugin
|
|
186
|
+
*/
|
|
187
|
+
exports.mathPlugin = {
|
|
188
|
+
name: 'math',
|
|
189
|
+
description: 'Renders LaTeX math expressions to Unicode',
|
|
190
|
+
onTokens: async (tokens) => {
|
|
191
|
+
return tokens.map(token => {
|
|
192
|
+
if (token.type === 'paragraph' || token.type === 'text') {
|
|
193
|
+
// Check if content has math
|
|
194
|
+
if (token.content.includes('$')) {
|
|
195
|
+
token.content = (0, math_unicode_renderer_1.replaceMathInText)(token.content);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else if (token.type === 'codeblock' && token.lang === 'math') {
|
|
199
|
+
token.content = (0, math_unicode_renderer_1.renderMathToUnicode)(token.content);
|
|
200
|
+
}
|
|
201
|
+
return token;
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Mermaid rendering plugin
|
|
207
|
+
*/
|
|
208
|
+
exports.mermaidPlugin = {
|
|
209
|
+
name: 'mermaid',
|
|
210
|
+
description: 'Renders Mermaid diagrams to ASCII art',
|
|
211
|
+
onTokens: async (tokens) => {
|
|
212
|
+
return tokens.map(token => {
|
|
213
|
+
if (token.type === 'mermaid' || (token.type === 'codeblock' && token.lang === 'mermaid')) {
|
|
214
|
+
try {
|
|
215
|
+
token.content = (0, mermaid_ascii_renderer_1.renderMermaidToASCII)(token.content);
|
|
216
|
+
token.type = 'mermaid';
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.warn('Mermaid rendering error:', error);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return token;
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
/**
|
|
227
|
+
* Security/sanitization plugin
|
|
228
|
+
*/
|
|
229
|
+
exports.securityPlugin = {
|
|
230
|
+
name: 'security',
|
|
231
|
+
description: 'Sanitizes ANSI codes and prevents injection attacks',
|
|
232
|
+
onChunk: async (chunk) => {
|
|
233
|
+
return (0, ansi_sanitizer_1.sanitizeForTerminal)(chunk, {
|
|
234
|
+
stripAnsi: false, // Allow safe ANSI codes
|
|
235
|
+
maxLength: 1000000,
|
|
236
|
+
allowUnicode: true,
|
|
237
|
+
});
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
/**
|
|
241
|
+
* Syntax highlighting plugin
|
|
242
|
+
*/
|
|
243
|
+
exports.syntaxHighlightPlugin = {
|
|
244
|
+
name: 'syntax-highlight',
|
|
245
|
+
description: 'Adds syntax highlighting using Shiki',
|
|
246
|
+
onTokens: async (tokens) => {
|
|
247
|
+
const processedTokens = [];
|
|
248
|
+
for (const token of tokens) {
|
|
249
|
+
if (token.type === 'codeblock' && token.lang && token.lang !== 'mermaid') {
|
|
250
|
+
try {
|
|
251
|
+
const highlighted = await (0, shiki_ansi_renderer_1.highlightCodeWithShiki)(token.content, token.lang, 'nord');
|
|
252
|
+
token.content = highlighted;
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
// Fallback to unhighlighted
|
|
256
|
+
console.warn('Syntax highlighting error:', error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
processedTokens.push(token);
|
|
260
|
+
}
|
|
261
|
+
return processedTokens;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Create default plugin registry with built-in plugins
|
|
266
|
+
*/
|
|
267
|
+
function createDefaultRegistry() {
|
|
268
|
+
const registry = new PluginRegistry();
|
|
269
|
+
// Register built-in plugins
|
|
270
|
+
registry.register(exports.securityPlugin);
|
|
271
|
+
registry.register(exports.mathPlugin);
|
|
272
|
+
registry.register(exports.mermaidPlugin);
|
|
273
|
+
registry.register(exports.syntaxHighlightPlugin);
|
|
274
|
+
return registry;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Preset plugin configurations
|
|
278
|
+
*/
|
|
279
|
+
exports.PLUGIN_PRESETS = {
|
|
280
|
+
// Minimal: only security
|
|
281
|
+
minimal: [exports.securityPlugin],
|
|
282
|
+
// Standard: security + formatting
|
|
283
|
+
standard: [exports.securityPlugin, exports.mathPlugin, exports.mermaidPlugin],
|
|
284
|
+
// Full: everything
|
|
285
|
+
full: [exports.securityPlugin, exports.mathPlugin, exports.mermaidPlugin, exports.syntaxHighlightPlugin],
|
|
286
|
+
// AI-focused: security + math for formulas
|
|
287
|
+
ai: [exports.securityPlugin, exports.mathPlugin],
|
|
288
|
+
};
|
|
289
|
+
//# sourceMappingURL=plugin-system-inline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-system-inline.js","sourceRoot":"","sources":["../../src/plugins/plugin-system-inline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ParsedToken, RenderContext } from '../types';
|
|
2
|
+
import { TTYPlugin, PluginContext, TTYPluggableList, HookPhase, HookFunction, PluginResult } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Plugin system manager
|
|
5
|
+
* Handles plugin registration, loading, and execution
|
|
6
|
+
*/
|
|
7
|
+
export declare class PluginSystem {
|
|
8
|
+
private remarkPlugins;
|
|
9
|
+
private rehypePlugins;
|
|
10
|
+
private builtInPlugins;
|
|
11
|
+
private hooks;
|
|
12
|
+
constructor();
|
|
13
|
+
/**
|
|
14
|
+
* Initialize hook maps
|
|
15
|
+
*/
|
|
16
|
+
private initializeHooks;
|
|
17
|
+
/**
|
|
18
|
+
* Register a built-in plugin
|
|
19
|
+
*/
|
|
20
|
+
registerBuiltIn(plugin: TTYPlugin): void;
|
|
21
|
+
/**
|
|
22
|
+
* Load plugins from pluggable list
|
|
23
|
+
*/
|
|
24
|
+
loadPlugins(remarkPlugins?: TTYPluggableList, rehypePlugins?: TTYPluggableList): void;
|
|
25
|
+
/**
|
|
26
|
+
* Load a single plugin
|
|
27
|
+
*/
|
|
28
|
+
private loadPlugin;
|
|
29
|
+
/**
|
|
30
|
+
* Process markdown through remark plugins (pre-parse)
|
|
31
|
+
*/
|
|
32
|
+
processRemark(markdown: string, context: RenderContext): Promise<PluginResult<string>>;
|
|
33
|
+
/**
|
|
34
|
+
* Process tokens through rehype plugins (post-parse)
|
|
35
|
+
*/
|
|
36
|
+
processRehype(tokens: ParsedToken[], context: RenderContext): Promise<PluginResult<ParsedToken[]>>;
|
|
37
|
+
/**
|
|
38
|
+
* Get plugins sorted by priority
|
|
39
|
+
*/
|
|
40
|
+
private getSortedPlugins;
|
|
41
|
+
/**
|
|
42
|
+
* Register a hook
|
|
43
|
+
*/
|
|
44
|
+
registerHook(phase: HookPhase, hook: HookFunction): void;
|
|
45
|
+
/**
|
|
46
|
+
* Execute hooks for a phase
|
|
47
|
+
*/
|
|
48
|
+
executeHooks(phase: HookPhase, data: any, context: PluginContext): Promise<any>;
|
|
49
|
+
/**
|
|
50
|
+
* Clear all plugins
|
|
51
|
+
*/
|
|
52
|
+
clear(): void;
|
|
53
|
+
/**
|
|
54
|
+
* Get registered plugin count
|
|
55
|
+
*/
|
|
56
|
+
getPluginCount(): {
|
|
57
|
+
remark: number;
|
|
58
|
+
rehype: number;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Singleton plugin system instance
|
|
63
|
+
*/
|
|
64
|
+
export declare const pluginSystem: PluginSystem;
|
|
65
|
+
//# sourceMappingURL=plugin-system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-system.d.ts","sourceRoot":"","sources":["../../src/plugins/plugin-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EACH,SAAS,EAGT,aAAa,EAEb,gBAAgB,EAEhB,SAAS,EACT,YAAY,EAEZ,YAAY,EACf,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,qBAAa,YAAY;IACrB,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,aAAa,CAA+C;IACpE,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,KAAK,CAA6C;;IAM1D;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAIxC;;OAEG;IACH,WAAW,CACP,aAAa,CAAC,EAAE,gBAAgB,EAChC,aAAa,CAAC,EAAE,gBAAgB,GACjC,IAAI;IAcP;;OAEG;IACH,OAAO,CAAC,UAAU;IA+ClB;;OAEG;IACG,aAAa,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IA4BhC;;OAEG;IACG,aAAa,CACf,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,aAAa,GACvB,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IA4BvC;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAUxB;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAMxD;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;IAerF;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,cAAc,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAMvD;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,cAAqB,CAAC"}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pluginSystem = exports.PluginSystem = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Plugin system manager
|
|
6
|
+
* Handles plugin registration, loading, and execution
|
|
7
|
+
*/
|
|
8
|
+
class PluginSystem {
|
|
9
|
+
remarkPlugins = new Map();
|
|
10
|
+
rehypePlugins = new Map();
|
|
11
|
+
builtInPlugins = new Map();
|
|
12
|
+
hooks = new Map();
|
|
13
|
+
constructor() {
|
|
14
|
+
this.initializeHooks();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize hook maps
|
|
18
|
+
*/
|
|
19
|
+
initializeHooks() {
|
|
20
|
+
this.hooks.set('pre-parse', []);
|
|
21
|
+
this.hooks.set('post-parse', []);
|
|
22
|
+
this.hooks.set('pre-render', []);
|
|
23
|
+
this.hooks.set('post-render', []);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Register a built-in plugin
|
|
27
|
+
*/
|
|
28
|
+
registerBuiltIn(plugin) {
|
|
29
|
+
this.builtInPlugins.set(plugin.name, plugin);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Load plugins from pluggable list
|
|
33
|
+
*/
|
|
34
|
+
loadPlugins(remarkPlugins, rehypePlugins) {
|
|
35
|
+
if (remarkPlugins) {
|
|
36
|
+
for (const pluggable of remarkPlugins) {
|
|
37
|
+
this.loadPlugin(pluggable, 'remark');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (rehypePlugins) {
|
|
41
|
+
for (const pluggable of rehypePlugins) {
|
|
42
|
+
this.loadPlugin(pluggable, 'rehype');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load a single plugin
|
|
48
|
+
*/
|
|
49
|
+
loadPlugin(pluggable, expectedType) {
|
|
50
|
+
let plugin;
|
|
51
|
+
let options = {};
|
|
52
|
+
if (typeof pluggable === 'string') {
|
|
53
|
+
// Built-in plugin by name
|
|
54
|
+
const builtIn = this.builtInPlugins.get(pluggable);
|
|
55
|
+
if (!builtIn) {
|
|
56
|
+
console.warn(`Built-in plugin '${pluggable}' not found`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
plugin = builtIn;
|
|
60
|
+
}
|
|
61
|
+
else if (Array.isArray(pluggable)) {
|
|
62
|
+
// [plugin, options]
|
|
63
|
+
[plugin, options] = pluggable;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
// Direct plugin object
|
|
67
|
+
plugin = pluggable;
|
|
68
|
+
}
|
|
69
|
+
// Validate plugin type
|
|
70
|
+
if (plugin.type !== expectedType) {
|
|
71
|
+
console.warn(`Plugin '${plugin.name}' is type '${plugin.type}' but expected '${expectedType}'`);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
// Check if enabled
|
|
75
|
+
if (plugin.enabled === false) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Register plugin
|
|
79
|
+
const entry = {
|
|
80
|
+
plugin,
|
|
81
|
+
options,
|
|
82
|
+
hooks: new Map(),
|
|
83
|
+
};
|
|
84
|
+
if (plugin.type === 'remark') {
|
|
85
|
+
this.remarkPlugins.set(plugin.name, entry);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
this.rehypePlugins.set(plugin.name, entry);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Process markdown through remark plugins (pre-parse)
|
|
93
|
+
*/
|
|
94
|
+
async processRemark(markdown, context) {
|
|
95
|
+
let result = markdown;
|
|
96
|
+
const errors = [];
|
|
97
|
+
const warnings = [];
|
|
98
|
+
const pluginContext = {
|
|
99
|
+
renderContext: context,
|
|
100
|
+
metadata: new Map(),
|
|
101
|
+
options: {},
|
|
102
|
+
};
|
|
103
|
+
// Sort by priority
|
|
104
|
+
const sorted = this.getSortedPlugins(this.remarkPlugins);
|
|
105
|
+
for (const [name, entry] of sorted) {
|
|
106
|
+
try {
|
|
107
|
+
const remarkPlugin = entry.plugin;
|
|
108
|
+
pluginContext.options = entry.options;
|
|
109
|
+
result = await remarkPlugin.process(result, pluginContext);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
errors.push(error);
|
|
113
|
+
warnings.push(`Remark plugin '${name}' failed: ${error.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { data: result, errors, warnings };
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Process tokens through rehype plugins (post-parse)
|
|
120
|
+
*/
|
|
121
|
+
async processRehype(tokens, context) {
|
|
122
|
+
let result = tokens;
|
|
123
|
+
const errors = [];
|
|
124
|
+
const warnings = [];
|
|
125
|
+
const pluginContext = {
|
|
126
|
+
renderContext: context,
|
|
127
|
+
metadata: new Map(),
|
|
128
|
+
options: {},
|
|
129
|
+
};
|
|
130
|
+
// Sort by priority
|
|
131
|
+
const sorted = this.getSortedPlugins(this.rehypePlugins);
|
|
132
|
+
for (const [name, entry] of sorted) {
|
|
133
|
+
try {
|
|
134
|
+
const rehypePlugin = entry.plugin;
|
|
135
|
+
pluginContext.options = entry.options;
|
|
136
|
+
result = await rehypePlugin.process(result, pluginContext);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
errors.push(error);
|
|
140
|
+
warnings.push(`Rehype plugin '${name}' failed: ${error.message}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { data: result, errors, warnings };
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get plugins sorted by priority
|
|
147
|
+
*/
|
|
148
|
+
getSortedPlugins(plugins) {
|
|
149
|
+
return Array.from(plugins.entries()).sort((a, b) => {
|
|
150
|
+
const priorityA = a[1].plugin.priority ?? 100;
|
|
151
|
+
const priorityB = b[1].plugin.priority ?? 100;
|
|
152
|
+
return priorityA - priorityB;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Register a hook
|
|
157
|
+
*/
|
|
158
|
+
registerHook(phase, hook) {
|
|
159
|
+
const hooks = this.hooks.get(phase) || [];
|
|
160
|
+
hooks.push(hook);
|
|
161
|
+
this.hooks.set(phase, hooks);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Execute hooks for a phase
|
|
165
|
+
*/
|
|
166
|
+
async executeHooks(phase, data, context) {
|
|
167
|
+
const hooks = this.hooks.get(phase) || [];
|
|
168
|
+
let result = data;
|
|
169
|
+
for (const hook of hooks) {
|
|
170
|
+
try {
|
|
171
|
+
result = await hook(result, context);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.warn(`Hook execution failed in phase '${phase}':`, error);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Clear all plugins
|
|
181
|
+
*/
|
|
182
|
+
clear() {
|
|
183
|
+
this.remarkPlugins.clear();
|
|
184
|
+
this.rehypePlugins.clear();
|
|
185
|
+
this.initializeHooks();
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get registered plugin count
|
|
189
|
+
*/
|
|
190
|
+
getPluginCount() {
|
|
191
|
+
return {
|
|
192
|
+
remark: this.remarkPlugins.size,
|
|
193
|
+
rehype: this.rehypePlugins.size,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.PluginSystem = PluginSystem;
|
|
198
|
+
/**
|
|
199
|
+
* Singleton plugin system instance
|
|
200
|
+
*/
|
|
201
|
+
exports.pluginSystem = new PluginSystem();
|
|
202
|
+
//# sourceMappingURL=plugin-system.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-system.js","sourceRoot":"","sources":["../../src/plugins/plugin-system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { RehypePlugin } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Rehype plugin for TTY security hardening
|
|
4
|
+
* Validates and sanitizes tokens for safe rendering
|
|
5
|
+
*/
|
|
6
|
+
export declare const rehypeHarden: RehypePlugin;
|
|
7
|
+
/**
|
|
8
|
+
* Harden configuration
|
|
9
|
+
*/
|
|
10
|
+
export interface HardenConfig {
|
|
11
|
+
allowedLinkPrefixes?: string[];
|
|
12
|
+
allowedImagePrefixes?: string[];
|
|
13
|
+
stripDangerousAnsi?: boolean;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=harden.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harden.d.ts","sourceRoot":"","sources":["../../../src/plugins/rehype/harden.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,MAAM,UAAU,CAAC;AA8DvD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,YAkB1B,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAChC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rehypeHarden = void 0;
|
|
4
|
+
const ansi_sanitizer_1 = require("../../security/ansi-sanitizer");
|
|
5
|
+
/**
|
|
6
|
+
* Harden individual token
|
|
7
|
+
*/
|
|
8
|
+
function hardenToken(token, config) {
|
|
9
|
+
const hardened = { ...token };
|
|
10
|
+
// Sanitize content for ANSI if enabled
|
|
11
|
+
if (config.stripDangerousAnsi && hardened.content) {
|
|
12
|
+
hardened.content = (0, ansi_sanitizer_1.sanitizeForTerminal)(hardened.content);
|
|
13
|
+
}
|
|
14
|
+
// Validate links
|
|
15
|
+
if (token.type === 'link' && hardened.content) {
|
|
16
|
+
const isAllowed = config.allowedLinkPrefixes.some(prefix => prefix === '*' || hardened.content.startsWith(prefix));
|
|
17
|
+
if (!isAllowed) {
|
|
18
|
+
// Strip link, keep text
|
|
19
|
+
hardened.type = 'text';
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Validate images
|
|
23
|
+
if (token.type === 'image' && hardened.content) {
|
|
24
|
+
const isAllowed = config.allowedImagePrefixes.some(prefix => prefix === '*' || hardened.content.startsWith(prefix));
|
|
25
|
+
if (!isAllowed) {
|
|
26
|
+
// Convert to text
|
|
27
|
+
hardened.type = 'text';
|
|
28
|
+
hardened.content = `[Image: ${hardened.content}]`;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// Escape potential blessed tag injection in text content
|
|
32
|
+
if (['text', 'paragraph'].includes(hardened.type) && hardened.content) {
|
|
33
|
+
hardened.content = escapeBlessedTags(hardened.content);
|
|
34
|
+
}
|
|
35
|
+
return hardened;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Escape blessed tags in user content
|
|
39
|
+
*/
|
|
40
|
+
function escapeBlessedTags(content) {
|
|
41
|
+
// Only escape if tags are unbalanced or potentially malicious
|
|
42
|
+
const openTags = (content.match(/\{[a-z-]+}/gi) || []).length;
|
|
43
|
+
const closeTags = (content.match(/\{\/[a-z-]+}/gi) || []).length;
|
|
44
|
+
if (openTags !== closeTags) {
|
|
45
|
+
// Escape all braces
|
|
46
|
+
return content.replace(/\{/g, '\\{').replace(/\}/g, '\\}');
|
|
47
|
+
}
|
|
48
|
+
return content;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Rehype plugin for TTY security hardening
|
|
52
|
+
* Validates and sanitizes tokens for safe rendering
|
|
53
|
+
*/
|
|
54
|
+
exports.rehypeHarden = {
|
|
55
|
+
name: 'rehype-harden',
|
|
56
|
+
type: 'rehype',
|
|
57
|
+
priority: 1, // Run early
|
|
58
|
+
enabled: true,
|
|
59
|
+
async process(tokens, context) {
|
|
60
|
+
const config = context.options;
|
|
61
|
+
const allowedLinkPrefixes = config.allowedLinkPrefixes || ['http://', 'https://'];
|
|
62
|
+
const allowedImagePrefixes = config.allowedImagePrefixes || ['http://', 'https://'];
|
|
63
|
+
const stripDangerousAnsi = config.stripDangerousAnsi ?? true;
|
|
64
|
+
return tokens.map(token => hardenToken(token, {
|
|
65
|
+
allowedLinkPrefixes,
|
|
66
|
+
allowedImagePrefixes,
|
|
67
|
+
stripDangerousAnsi,
|
|
68
|
+
}));
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=harden.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harden.js","sourceRoot":"","sources":["../../../src/plugins/rehype/harden.ts"],"names":[],"mappings":";;;AAEA,kEAAoE;AAEpE;;GAEG;AACH,SAAS,WAAW,CAAC,KAAkB,EAAE,MAAyB;IAC9D,MAAM,QAAQ,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAE9B,uCAAuC;IACvC,IAAI,MAAM,CAAC,kBAAkB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAChD,QAAQ,CAAC,OAAO,GAAG,IAAA,oCAAmB,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACvD,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CACxD,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,wBAAwB;YACxB,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,kBAAkB;IAClB,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACxD,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CACxD,CAAC;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;YACb,kBAAkB;YAClB,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC;YACvB,QAAQ,CAAC,OAAO,GAAG,WAAW,QAAQ,CAAC,OAAO,GAAG,CAAC;QACtD,CAAC;IACL,CAAC;IAED,yDAAyD;IACzD,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACpE,QAAQ,CAAC,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,OAAe;IACtC,8DAA8D;IAC9D,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAEjE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACzB,oBAAoB;QACpB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;GAGG;AACU,QAAA,YAAY,GAAiB;IACtC,IAAI,EAAE,eAAe;IACrB,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,EAAE,YAAY;IACzB,OAAO,EAAE,IAAI;IAEb,KAAK,CAAC,OAAO,CAAC,MAAqB,EAAE,OAAsB;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAuB,CAAC;QAC/C,MAAM,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAClF,MAAM,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACpF,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,IAAI,CAAC;QAE7D,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE;YAC1C,mBAAmB;YACnB,oBAAoB;YACpB,kBAAkB;SACrB,CAAC,CAAC,CAAC;IACR,CAAC;CACJ,CAAC"}
|