@rcs-lang/language-service
Section titled “@rcs-lang/language-service”Advanced language service implementation for RCL (Rich Communication Language) providing IDE features like code completion, diagnostics, hover information, and more. Powers the RCL VSCode extension and can be integrated into other editors.
Installation
Section titled “Installation”bun add @rcs-lang/language-serviceFeatures
Section titled “Features”- 🔍 Go to Definition - Navigate to symbol definitions across files
- 📝 Code Completion - Context-aware suggestions for agents, flows, messages
- 🔎 Find References - Locate all usages of symbols
- 💡 Hover Information - Rich tooltips with documentation and type info
- ⚠️ Diagnostics - Real-time error and warning detection
- 🔄 Rename - Safe symbol renaming across entire workspace
- 📑 Document Symbols - Outline view support for navigation
- 🎨 Semantic Highlighting - Enhanced syntax coloring based on semantics
Quick Start
Section titled “Quick Start”import { LanguageService } from '@rcs-lang/language-service';
const service = new LanguageService();
// Initialize with workspaceawait service.initialize({ workspaceFolders: ['/path/to/workspace']});
// Get completionsconst completions = await service.getCompletions({ uri: 'file:///example.rcl', position: { line: 10, character: 15 }});
// Get diagnosticsconst diagnostics = await service.getDiagnostics('file:///example.rcl');
// Go to definitionconst definition = await service.getDefinition({ uri: 'file:///example.rcl', position: { line: 5, character: 10 }});Architecture
Section titled “Architecture”The language service is built on several key components working together:
RclProgram
Section titled “RclProgram”Central coordinator that manages the compilation state and provides unified access to language features:
import { RclProgram } from '@rcs-lang/language-service';
const program = new RclProgram({ workspaceFolder: '/path/to/workspace', fileSystem: fileSystemInstance});
// Add files to programawait program.addFile('file:///agent.rcl');
// Get parsed fileconst file = program.getFile('file:///agent.rcl');
// Get all symbols in workspaceconst symbols = program.getSymbols();WorkspaceIndex
Section titled “WorkspaceIndex”Maintains an index of all symbols across the workspace for fast lookups and cross-file references:
import { WorkspaceIndex } from '@rcs-lang/language-service';
const index = new WorkspaceIndex();
// Index filesawait index.indexFile('file:///agent.rcl', ast);
// Find symbol definitionsconst definitions = index.findDefinitions('AgentName');
// Find all referencesconst references = index.findReferences('MessageName');
// Get symbols in fileconst fileSymbols = index.getSymbolsInFile('file:///agent.rcl');Language Providers
Section titled “Language Providers”Modular providers implement specific language features:
CompletionProvider
Section titled “CompletionProvider”Provides context-aware code completion:
import { CompletionProvider } from '@rcs-lang/language-service';
const provider = new CompletionProvider(program);
const completions = await provider.getCompletions({ uri: 'file:///example.rcl', position: { line: 10, character: 15 }});
// Returns different completions based on context:// - Agent section: flow names, config options// - Flow section: state names, transition patterns// - Message section: message types, RCS features// - Match block: pattern suggestionsDefinitionProvider
Section titled “DefinitionProvider”Implements go-to-definition functionality:
import { DefinitionProvider } from '@rcs-lang/language-service';
const provider = new DefinitionProvider(program);
const definition = await provider.getDefinition({ uri: 'file:///example.rcl', position: { line: 5, character: 10 }});
// Returns definition location for:// - Agent references// - Flow references// - Message references// - State references// - Variable referencesHoverProvider
Section titled “HoverProvider”Provides rich tooltip information:
import { HoverProvider } from '@rcs-lang/language-service';
const provider = new HoverProvider(program);
const hover = await provider.getHover({ uri: 'file:///example.rcl', position: { line: 8, character: 12 }});
// Returns hover info with:// - Symbol documentation// - Type information// - Usage examples// - Quick actionsReferencesProvider
Section titled “ReferencesProvider”Finds all references to a symbol:
import { ReferencesProvider } from '@rcs-lang/language-service';
const provider = new ReferencesProvider(program);
const references = await provider.getReferences({ uri: 'file:///example.rcl', position: { line: 5, character: 10 }, includeDeclaration: true});
// Returns all locations where symbol is usedRenameProvider
Section titled “RenameProvider”Safe symbol renaming across workspace:
import { RenameProvider } from '@rcs-lang/language-service';
const provider = new RenameProvider(program);
// Check if rename is validconst prepareResult = await provider.prepareRename({ uri: 'file:///example.rcl', position: { line: 5, character: 10 }});
// Perform renameconst workspaceEdit = await provider.rename({ uri: 'file:///example.rcl', position: { line: 5, character: 10 }, newName: 'NewAgentName'});
// Returns workspace edit with all necessary changesValidators
Section titled “Validators”Built-in validators provide real-time diagnostics:
SemanticValidator
Section titled “SemanticValidator”Validates semantic correctness:
import { SemanticValidator } from '@rcs-lang/language-service';
const validator = new SemanticValidator(program);
const diagnostics = await validator.validate('file:///example.rcl');
// Checks for:// - Undefined message references// - Unreachable flow states// - Type mismatches// - Circular dependencies// - Unused symbolsImportResolver
Section titled “ImportResolver”Validates imports and module resolution:
import { ImportResolver } from '@rcs-lang/language-service';
const resolver = new ImportResolver(program);
// Resolve import pathconst resolved = await resolver.resolve('shared/common', 'file:///agent.rcl');
// Validate all imports in fileconst diagnostics = await resolver.validateImports('file:///agent.rcl');Language Server Protocol Integration
Section titled “Language Server Protocol Integration”VSCode Extension
Section titled “VSCode Extension”import { createConnection, TextDocuments, ProposedFeatures} from 'vscode-languageserver/node';import { LanguageService } from '@rcs-lang/language-service';
const connection = createConnection(ProposedFeatures.all);const documents = new TextDocuments(TextDocument);const service = new LanguageService();
// Initializeconnection.onInitialize(async (params) => { await service.initialize(params); return { capabilities: { completionProvider: { triggerCharacters: ['.', '@', ':'] }, definitionProvider: true, hoverProvider: true, referencesProvider: true, renameProvider: true, diagnosticProvider: true } };});
// Handle LSP requestsconnection.onCompletion(async (params) => { return service.getCompletions(params);});
connection.onDefinition(async (params) => { return service.getDefinition(params);});Configuration
Section titled “Configuration”Language Service Config
Section titled “Language Service Config”interface LanguageServiceConfig { // Enable/disable specific features features?: { completion?: boolean; hover?: boolean; definition?: boolean; references?: boolean; rename?: boolean; diagnostics?: boolean; semanticHighlighting?: boolean; };
// Validation settings validation?: { syntaxErrors?: boolean; semanticErrors?: boolean; styleWarnings?: boolean; unusedSymbols?: boolean; };
// Performance tuning indexing?: { maxFileSize?: number; excludePatterns?: string[]; debounceMs?: number; };}