@codebolt/agent 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ /**
2
+ * SystemPrompt class for loading and managing system prompts from YAML files
3
+ */
4
+ declare class SystemPrompt {
5
+ private filepath;
6
+ private key;
7
+ /**
8
+ * Creates a SystemPrompt instance
9
+ * @param {string} filepath - Path to the YAML file containing prompts
10
+ * @param {string} key - Key identifier for the specific prompt
11
+ */
12
+ constructor(filepath?: string, key?: string);
13
+ /**
14
+ * Loads and returns the prompt text
15
+ * @returns {string} The prompt text
16
+ * @throws {Error} If file cannot be read or parsed
17
+ */
18
+ toPromptText(): string;
19
+ }
20
+ export { SystemPrompt };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SystemPrompt = void 0;
7
+ const js_yaml_1 = __importDefault(require("js-yaml"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ /**
11
+ * SystemPrompt class for loading and managing system prompts from YAML files
12
+ */
13
+ class SystemPrompt {
14
+ /**
15
+ * Creates a SystemPrompt instance
16
+ * @param {string} filepath - Path to the YAML file containing prompts
17
+ * @param {string} key - Key identifier for the specific prompt
18
+ */
19
+ constructor(filepath = "", key = "") {
20
+ this.filepath = filepath;
21
+ this.key = key;
22
+ }
23
+ /**
24
+ * Loads and returns the prompt text
25
+ * @returns {string} The prompt text
26
+ * @throws {Error} If file cannot be read or parsed
27
+ */
28
+ toPromptText() {
29
+ try {
30
+ const absolutePath = path_1.default.resolve(this.filepath);
31
+ const fileContents = fs_1.default.readFileSync(absolutePath, 'utf8');
32
+ const data = js_yaml_1.default.load(fileContents);
33
+ if (!data || typeof data !== 'object') {
34
+ throw new Error('Invalid YAML structure');
35
+ }
36
+ if (!data[this.key]) {
37
+ throw new Error(`Prompt not found for key: ${this.key}`);
38
+ }
39
+ const promptData = data[this.key];
40
+ return typeof promptData === 'string' ? promptData : promptData.prompt;
41
+ }
42
+ catch (error) {
43
+ console.error(`SystemPrompt Error: ${error instanceof Error ? error.message : 'Unknown error'}`);
44
+ throw error; // Re-throw to allow caller handling
45
+ }
46
+ }
47
+ }
48
+ exports.SystemPrompt = SystemPrompt;
@@ -0,0 +1,37 @@
1
+ import { UserMessage } from "./usermessage";
2
+ import type { UserMessageContent } from "./types/libFunctionTypes";
3
+ import type { Tools, UserMessages } from "./types/InternalTypes";
4
+ /**
5
+ * Class representing a task instruction.
6
+ * Handles loading task data and converting it to prompts.
7
+ */
8
+ declare class TaskInstruction {
9
+ /** Available tools for the task */
10
+ tools: Tools;
11
+ /** Messages from the user for this task */
12
+ userMessages: UserMessageContent[];
13
+ /** The user message object containing input */
14
+ userMessage: UserMessage;
15
+ /** Path to the YAML file with task instructions */
16
+ filepath: string;
17
+ /** The section reference within the YAML file */
18
+ refsection: string;
19
+ /**
20
+ * Creates a new TaskInstruction instance.
21
+ *
22
+ * @param tools - Tools available for this task
23
+ * @param userMessage - User message containing task instructions
24
+ * @param filepath - Path to the YAML file with task data
25
+ * @param refsection - Section name within the YAML file
26
+ */
27
+ constructor(tools: Tools | undefined, userMessage: UserMessage, filepath?: string, refsection?: string);
28
+ /**
29
+ * Converts the task instruction to a prompt format.
30
+ * Loads data from YAML file and combines with user message.
31
+ *
32
+ * @returns Promise with an array of user message content blocks
33
+ * @throws Error if there's an issue processing the task instruction
34
+ */
35
+ toPrompt(): Promise<UserMessages[]>;
36
+ }
37
+ export { TaskInstruction };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TaskInstruction = void 0;
4
+ /**
5
+ * Encapsulates task instructions and their related metadata.
6
+ * Handles loading and processing of task instructions from YAML files.
7
+ */
8
+ const yaml = require('js-yaml');
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ /**
12
+ * Class representing a task instruction.
13
+ * Handles loading task data and converting it to prompts.
14
+ */
15
+ class TaskInstruction {
16
+ /**
17
+ * Creates a new TaskInstruction instance.
18
+ *
19
+ * @param tools - Tools available for this task
20
+ * @param userMessage - User message containing task instructions
21
+ * @param filepath - Path to the YAML file with task data
22
+ * @param refsection - Section name within the YAML file
23
+ */
24
+ constructor(tools = {}, userMessage, filepath = "", refsection = "") {
25
+ /** Messages from the user for this task */
26
+ this.userMessages = [];
27
+ this.tools = tools;
28
+ this.userMessage = userMessage;
29
+ this.filepath = filepath;
30
+ this.refsection = refsection;
31
+ }
32
+ /**
33
+ * Converts the task instruction to a prompt format.
34
+ * Loads data from YAML file and combines with user message.
35
+ *
36
+ * @returns Promise with an array of user message content blocks
37
+ * @throws Error if there's an issue processing the task instruction
38
+ */
39
+ async toPrompt() {
40
+ try {
41
+ this.userMessages = await this.userMessage.toPrompt();
42
+ const fileContents = fs.readFileSync(path.resolve(this.filepath), 'utf8');
43
+ const data = yaml.load(fileContents);
44
+ const task = data[this.refsection];
45
+ this.userMessages.push({
46
+ type: "text",
47
+ text: `Task Description: ${task.description}\nExpected Output: ${task.expected_output}`
48
+ });
49
+ return this.userMessages;
50
+ }
51
+ catch (error) {
52
+ console.error(`Error processing task instruction: ${error}`);
53
+ throw error;
54
+ }
55
+ }
56
+ }
57
+ exports.TaskInstruction = TaskInstruction;
@@ -0,0 +1,499 @@
1
+ /**
2
+ * Internal TypeScript types for the codeboltjs library implementation
3
+ *
4
+ * This file contains types that are used internally by the library:
5
+ * - Internal class structures
6
+ * - Implementation-specific interfaces
7
+ * - Private API types
8
+ * - Module-specific types
9
+ * - WebSocket management types
10
+ */
11
+ import { EventEmitter } from 'events';
12
+ import WebSocket from 'ws';
13
+ import type { PendingRequest } from './commonTypes';
14
+ export interface WebSocketManager {
15
+ websocket: WebSocket | null;
16
+ isConnected: boolean;
17
+ reconnectAttempts: number;
18
+ maxReconnectAttempts: number;
19
+ reconnectInterval: number;
20
+ messageQueue: any[];
21
+ pendingRequests: Map<string, PendingRequest>;
22
+ }
23
+ export interface WebSocketConfig {
24
+ url: string;
25
+ timeout: number;
26
+ reconnectInterval: number;
27
+ maxReconnectAttempts: number;
28
+ autoReconnect: boolean;
29
+ }
30
+ export interface MessageManagerConfig {
31
+ timeout: number;
32
+ retryAttempts: number;
33
+ retryDelay: number;
34
+ }
35
+ export interface MessageQueueItem {
36
+ message: any;
37
+ timestamp: number;
38
+ priority: number;
39
+ retryCount: number;
40
+ maxRetries: number;
41
+ }
42
+ export interface ModuleManager {
43
+ fs: any;
44
+ git: any;
45
+ llm: any;
46
+ browser: any;
47
+ chat: any;
48
+ terminal: any;
49
+ codeutils: any;
50
+ crawler: any;
51
+ search: any;
52
+ knowledge: any;
53
+ rag: any;
54
+ codeparsers: any;
55
+ outputparsers: any;
56
+ project: any;
57
+ dbmemory: any;
58
+ cbstate: any;
59
+ taskplaner: any;
60
+ vectordb: any;
61
+ debug: any;
62
+ tokenizer: any;
63
+ chatSummary: any;
64
+ mcp: any;
65
+ agent: any;
66
+ utils: any;
67
+ }
68
+ export interface ASTNode {
69
+ /** Type of the AST node */
70
+ type: string;
71
+ /** Start position in the source code */
72
+ start?: number;
73
+ /** End position in the source code */
74
+ end?: number;
75
+ /** Line number where the node starts */
76
+ line?: number;
77
+ /** Column number where the node starts */
78
+ column?: number;
79
+ /** Child nodes */
80
+ children?: ASTNode[];
81
+ /** Node value/content */
82
+ value?: any;
83
+ /** Additional node properties */
84
+ [key: string]: any;
85
+ }
86
+ export interface ParserConfig {
87
+ language: string;
88
+ options: {
89
+ includeComments?: boolean;
90
+ includeLocations?: boolean;
91
+ tolerant?: boolean;
92
+ };
93
+ }
94
+ export interface JSTreeStructureItem {
95
+ /** Type of the item (function, class, variable, etc.) */
96
+ type: string;
97
+ /** Name of the code structure item */
98
+ name: string;
99
+ /** Start line number */
100
+ startLine: number;
101
+ /** End line number */
102
+ endLine: number;
103
+ /** Start column number */
104
+ startColumn: number;
105
+ /** End column number */
106
+ endColumn: number;
107
+ /** Node type from the AST */
108
+ nodeType: string;
109
+ }
110
+ export interface JSTreeResponse {
111
+ /** Event type */
112
+ event: string;
113
+ /** Response payload */
114
+ payload?: {
115
+ /** File path that was parsed */
116
+ filePath: string;
117
+ /** Parsed structure items */
118
+ structure: JSTreeStructureItem[];
119
+ };
120
+ /** Error message if parsing failed */
121
+ error?: string;
122
+ }
123
+ export interface LanguageParser {
124
+ [key: string]: {
125
+ parser: any;
126
+ query: any;
127
+ };
128
+ }
129
+ export interface CacheManager {
130
+ get<T>(key: string): T | undefined;
131
+ set<T>(key: string, value: T, ttl?: number): void;
132
+ delete(key: string): boolean;
133
+ clear(): void;
134
+ size(): number;
135
+ }
136
+ export interface CacheEntry<T = any> {
137
+ value: T;
138
+ timestamp: number;
139
+ ttl: number;
140
+ accessCount: number;
141
+ lastAccessed: number;
142
+ }
143
+ export interface InternalState {
144
+ isInitialized: boolean;
145
+ isConnected: boolean;
146
+ lastHeartbeat: number;
147
+ sessionId: string;
148
+ userId?: string;
149
+ activeRequests: Set<string>;
150
+ moduleStates: Map<string, any>;
151
+ errorCount: number;
152
+ lastError?: Error;
153
+ }
154
+ export interface StateChangeEvent {
155
+ type: 'state_change';
156
+ property: keyof InternalState;
157
+ oldValue: any;
158
+ newValue: any;
159
+ timestamp: number;
160
+ }
161
+ export interface InternalError extends Error {
162
+ code: string;
163
+ module: string;
164
+ severity: 'low' | 'medium' | 'high' | 'critical';
165
+ context?: Record<string, any>;
166
+ timestamp: number;
167
+ stackTrace?: string;
168
+ }
169
+ export declare class InternalError extends Error {
170
+ code: string;
171
+ module: string;
172
+ severity: 'low' | 'medium' | 'high' | 'critical';
173
+ context?: Record<string, any> | undefined;
174
+ constructor(message: string, code: string, module: string, severity?: 'low' | 'medium' | 'high' | 'critical', context?: Record<string, any> | undefined);
175
+ }
176
+ export interface InternalEventMap {
177
+ 'websocket:connected': () => void;
178
+ 'websocket:disconnected': () => void;
179
+ 'websocket:error': (error: Error) => void;
180
+ 'websocket:message': (message: any) => void;
181
+ 'websocket:reconnecting': (attempt: number) => void;
182
+ 'module:loaded': (moduleName: string) => void;
183
+ 'module:error': (moduleName: string, error: Error) => void;
184
+ 'cache:hit': (key: string) => void;
185
+ 'cache:miss': (key: string) => void;
186
+ 'cache:evicted': (key: string) => void;
187
+ 'state:changed': (event: StateChangeEvent) => void;
188
+ 'request:started': (requestId: string) => void;
189
+ 'request:completed': (requestId: string, duration: number) => void;
190
+ 'request:failed': (requestId: string, error: Error) => void;
191
+ }
192
+ export interface InternalEventEmitter extends EventEmitter {
193
+ on<K extends keyof InternalEventMap>(event: K, listener: InternalEventMap[K]): this;
194
+ off<K extends keyof InternalEventMap>(event: K, listener: InternalEventMap[K]): this;
195
+ emit<K extends keyof InternalEventMap>(event: K, ...args: Parameters<InternalEventMap[K]>): boolean;
196
+ }
197
+ export interface RequestTracker {
198
+ id: string;
199
+ type: string;
200
+ module: string;
201
+ startTime: number;
202
+ endTime?: number;
203
+ status: 'pending' | 'success' | 'error' | 'timeout';
204
+ error?: Error;
205
+ metadata?: Record<string, any>;
206
+ }
207
+ export interface RequestMetrics {
208
+ totalRequests: number;
209
+ successfulRequests: number;
210
+ failedRequests: number;
211
+ averageResponseTime: number;
212
+ requestsByModule: Map<string, number>;
213
+ errorsByType: Map<string, number>;
214
+ }
215
+ export interface PerformanceMetrics {
216
+ memoryUsage: {
217
+ rss: number;
218
+ heapTotal: number;
219
+ heapUsed: number;
220
+ external: number;
221
+ };
222
+ cpuUsage: {
223
+ user: number;
224
+ system: number;
225
+ };
226
+ eventLoopLag: number;
227
+ gcStats?: {
228
+ totalHeapSize: number;
229
+ totalHeapSizeExecutable: number;
230
+ totalPhysicalSize: number;
231
+ totalAvailableSize: number;
232
+ usedHeapSize: number;
233
+ heapSizeLimit: number;
234
+ };
235
+ }
236
+ export interface PerformanceMonitor {
237
+ start(): void;
238
+ stop(): void;
239
+ getMetrics(): PerformanceMetrics;
240
+ reset(): void;
241
+ isRunning(): boolean;
242
+ }
243
+ export interface InternalLogger {
244
+ debug(message: string, meta?: Record<string, any>): void;
245
+ info(message: string, meta?: Record<string, any>): void;
246
+ warn(message: string, meta?: Record<string, any>): void;
247
+ error(message: string, error?: Error, meta?: Record<string, any>): void;
248
+ setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void;
249
+ getLevel(): string;
250
+ }
251
+ export interface LogEntry {
252
+ level: 'debug' | 'info' | 'warn' | 'error';
253
+ message: string;
254
+ timestamp: number;
255
+ module?: string;
256
+ requestId?: string;
257
+ meta?: Record<string, any>;
258
+ error?: {
259
+ name: string;
260
+ message: string;
261
+ stack?: string;
262
+ };
263
+ }
264
+ export interface ModuleDefinition {
265
+ name: string;
266
+ path: string;
267
+ dependencies: string[];
268
+ version: string;
269
+ exports: string[];
270
+ config?: Record<string, any>;
271
+ }
272
+ export interface ModuleLoader {
273
+ load(name: string): Promise<any>;
274
+ unload(name: string): Promise<void>;
275
+ reload(name: string): Promise<any>;
276
+ isLoaded(name: string): boolean;
277
+ getLoadedModules(): string[];
278
+ }
279
+ export interface ConfigurationManager {
280
+ get<T>(key: string): T | undefined;
281
+ set<T>(key: string, value: T): void;
282
+ has(key: string): boolean;
283
+ delete(key: string): boolean;
284
+ getAll(): Record<string, any>;
285
+ merge(config: Record<string, any>): void;
286
+ validate(schema: any): boolean;
287
+ }
288
+ export interface ConfigurationSchema {
289
+ type: 'object';
290
+ properties: Record<string, {
291
+ type: string;
292
+ required?: boolean;
293
+ default?: any;
294
+ description?: string;
295
+ }>;
296
+ required?: string[];
297
+ }
298
+ export interface QueueManager<T = any> {
299
+ enqueue(item: T, priority?: number): void;
300
+ dequeue(): T | undefined;
301
+ peek(): T | undefined;
302
+ size(): number;
303
+ isEmpty(): boolean;
304
+ clear(): void;
305
+ }
306
+ export interface PriorityQueue<T = any> extends QueueManager<T> {
307
+ enqueuePriority(item: T, priority: number): void;
308
+ dequeuePriority(): T | undefined;
309
+ }
310
+ export interface ConnectionPool {
311
+ acquire(): Promise<WebSocket>;
312
+ release(connection: WebSocket): void;
313
+ destroy(connection: WebSocket): void;
314
+ size(): number;
315
+ available(): number;
316
+ pending(): number;
317
+ close(): Promise<void>;
318
+ }
319
+ export interface PoolConfiguration {
320
+ min: number;
321
+ max: number;
322
+ acquireTimeoutMillis: number;
323
+ idleTimeoutMillis: number;
324
+ createTimeoutMillis: number;
325
+ destroyTimeoutMillis: number;
326
+ reapIntervalMillis: number;
327
+ }
328
+ export interface SecurityContext {
329
+ userId?: string;
330
+ sessionId: string;
331
+ permissions: string[];
332
+ roles: string[];
333
+ isAuthenticated: boolean;
334
+ expiresAt?: number;
335
+ }
336
+ export interface SecurityManager {
337
+ authenticate(credentials: any): Promise<SecurityContext>;
338
+ authorize(action: string, resource?: string): boolean;
339
+ validateSession(sessionId: string): boolean;
340
+ revokeSession(sessionId: string): void;
341
+ hasPermission(permission: string): boolean;
342
+ }
343
+ export interface ValidationRule {
344
+ field: string;
345
+ type: 'required' | 'string' | 'number' | 'boolean' | 'array' | 'object' | 'custom';
346
+ message?: string;
347
+ validator?: (value: any) => boolean;
348
+ options?: Record<string, any>;
349
+ }
350
+ export interface ValidationResult {
351
+ isValid: boolean;
352
+ errors: Array<{
353
+ field: string;
354
+ message: string;
355
+ value?: any;
356
+ }>;
357
+ }
358
+ export interface Validator {
359
+ validate(data: any, rules: ValidationRule[]): ValidationResult;
360
+ addRule(rule: ValidationRule): void;
361
+ removeRule(field: string): void;
362
+ hasRule(field: string): boolean;
363
+ }
364
+ export interface Serializer<T = any> {
365
+ serialize(data: T): string | Buffer;
366
+ deserialize(data: string | Buffer): T;
367
+ getContentType(): string;
368
+ }
369
+ export interface SerializationManager {
370
+ register(name: string, serializer: Serializer): void;
371
+ unregister(name: string): void;
372
+ get(name: string): Serializer | undefined;
373
+ serialize(data: any, format?: string): string | Buffer;
374
+ deserialize(data: string | Buffer, format?: string): any;
375
+ }
376
+ export interface Plugin {
377
+ name: string;
378
+ version: string;
379
+ initialize(context: PluginContext): Promise<void>;
380
+ destroy(): Promise<void>;
381
+ dependencies?: string[];
382
+ config?: Record<string, any>;
383
+ }
384
+ export interface PluginContext {
385
+ logger: InternalLogger;
386
+ config: ConfigurationManager;
387
+ events: InternalEventEmitter;
388
+ state: InternalState;
389
+ registerHandler(type: string, handler: Function): void;
390
+ unregisterHandler(type: string, handler: Function): void;
391
+ }
392
+ export interface PluginManager {
393
+ load(plugin: Plugin): Promise<void>;
394
+ unload(name: string): Promise<void>;
395
+ isLoaded(name: string): boolean;
396
+ getLoaded(): Plugin[];
397
+ enable(name: string): void;
398
+ disable(name: string): void;
399
+ }
400
+ export interface HealthCheck {
401
+ name: string;
402
+ check(): Promise<HealthStatus>;
403
+ timeout?: number;
404
+ interval?: number;
405
+ }
406
+ export interface HealthStatus {
407
+ status: 'healthy' | 'unhealthy' | 'degraded';
408
+ message?: string;
409
+ timestamp: number;
410
+ metadata?: Record<string, any>;
411
+ }
412
+ export interface HealthMonitor {
413
+ register(check: HealthCheck): void;
414
+ unregister(name: string): void;
415
+ checkAll(): Promise<Map<string, HealthStatus>>;
416
+ getStatus(name: string): HealthStatus | undefined;
417
+ isHealthy(): boolean;
418
+ }
419
+ export interface CircuitBreakerConfig {
420
+ failureThreshold: number;
421
+ resetTimeout: number;
422
+ monitoringPeriod: number;
423
+ expectedErrorCodes?: string[];
424
+ }
425
+ export interface CircuitBreaker {
426
+ execute<T>(operation: () => Promise<T>): Promise<T>;
427
+ getState(): 'closed' | 'open' | 'half-open';
428
+ getFailureRate(): number;
429
+ reset(): void;
430
+ forceOpen(): void;
431
+ forceClose(): void;
432
+ }
433
+ /**
434
+ * Interface for tools that can be used within tasks.
435
+ */
436
+ export interface Tools {
437
+ [key: string]: {
438
+ /** Description of what the tool does */
439
+ description: string;
440
+ /** How to use the tool correctly */
441
+ usage: string;
442
+ /** Optional example demonstrating tool usage */
443
+ example?: string;
444
+ };
445
+ }
446
+ /**
447
+ * Interface for task data structure as loaded from YAML.
448
+ */
449
+ export interface TaskData {
450
+ [key: string]: {
451
+ /** Description of what the task should accomplish */
452
+ description: string;
453
+ /** Expected output format or content */
454
+ expected_output: string;
455
+ };
456
+ }
457
+ /**
458
+ * Interface for user message structure in tasks.
459
+ */
460
+ export interface UserMessages {
461
+ /** The type of user message */
462
+ type: string;
463
+ /** The text content of the message */
464
+ text: string;
465
+ }
466
+ /**
467
+ * Interface for system prompt data loaded from YAML.
468
+ */
469
+ export interface PromptData {
470
+ [key: string]: {
471
+ prompt: string;
472
+ };
473
+ }
474
+ /**
475
+ * Interface for user message structure in agent lib.
476
+ */
477
+ export interface Message {
478
+ /** The actual text content of the user message */
479
+ userMessage: string;
480
+ /** Optional list of files mentioned in the message */
481
+ mentionedFiles?: string[];
482
+ /** List of MCP (Model Context Protocol) tools mentioned */
483
+ mentionedMCPs: {
484
+ toolbox: string;
485
+ toolName: string;
486
+ }[];
487
+ /** List of agents mentioned in the message */
488
+ mentionedAgents: any[];
489
+ remixPrompt?: string;
490
+ }
491
+ /**
492
+ * Interface for file listing result.
493
+ */
494
+ export interface FileListResult {
495
+ /** Whether the listing operation was successful */
496
+ success: boolean;
497
+ /** The result of the listing operation as a string */
498
+ result: string;
499
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * Internal TypeScript types for the codeboltjs library implementation
4
+ *
5
+ * This file contains types that are used internally by the library:
6
+ * - Internal class structures
7
+ * - Implementation-specific interfaces
8
+ * - Private API types
9
+ * - Module-specific types
10
+ * - WebSocket management types
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.InternalError = void 0;
14
+ class InternalError extends Error {
15
+ constructor(message, code, module, severity = 'medium', context) {
16
+ super(message);
17
+ this.code = code;
18
+ this.module = module;
19
+ this.severity = severity;
20
+ this.context = context;
21
+ this.name = 'InternalError';
22
+ this.timestamp = Date.now();
23
+ this.stackTrace = this.stack;
24
+ }
25
+ }
26
+ exports.InternalError = InternalError;
27
+ // ================================
28
+ // Parser Internal Types
29
+ // ================================
30
+ // LanguageParser interface already defined above at line 154