@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,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":"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"}