Complete API documentation for the cctypes transcript discovery system.
- DiscoveryEngine
- TranscriptAnalyzer
- TypeScriptGenerator
- TypeScriptValidator
- Configuration Types
- Result Types
- Event System
- Examples
The main orchestrator for the discovery process, coordinating analysis, generation, and validation.
constructor(config: DiscoveryConfig)Creates a new discovery engine with the specified configuration.
Parameters:
config: DiscoveryConfig- Discovery configuration options
Example:
const engine = new DiscoveryEngine({
sources: {
files: ['./transcripts/**/*.jsonl']
},
output: {
outputDir: './generated',
generateGuards: true
},
analysis: {
minOccurrences: 3
}
});Executes the complete discovery process: analysis, generation, and validation.
Returns: Promise<DiscoveryState> - Final state of the discovery process
Example:
const result = await engine.discover();
if (result.phase === 'complete') {
console.log('Discovery completed successfully!');
console.log(`Found ${Object.keys(result.results.analysis.toolPatterns).length} tools`);
} else {
console.error('Discovery failed:', result.errors);
}Registers an event listener for discovery progress updates.
Parameters:
listener: (event: DiscoveryEvent) => void- Event handler function
Example:
engine.on((event) => {
switch (event.type) {
case 'progress':
console.log(`${event.data.phase}: ${event.data.progress}%`);
break;
case 'phase-change':
console.log(`Entering phase: ${event.data.phase}`);
break;
case 'error':
console.error('Discovery error:', event.data.status);
break;
case 'complete':
console.log('Discovery completed');
break;
}
});Aborts the current discovery process.
Example:
// Start discovery
const discoveryPromise = engine.discover();
// Abort after 30 seconds
setTimeout(() => {
engine.abort();
console.log('Discovery aborted due to timeout');
}, 30000);Returns the current state of the discovery process.
Returns: DiscoveryState - Current discovery state
Example:
const currentState = engine.getState();
console.log(`Current phase: ${currentState.phase}`);
console.log(`Progress: ${currentState.progress}%`);The configuration used by this discovery engine (read-only).
Indicates whether a discovery process is currently running.
Analyzes transcript entries to discover patterns and generate analysis results.
constructor(config?: AnalysisConfig)Parameters:
config?: AnalysisConfig- Optional analysis configuration
Analyzes transcript entries to discover patterns.
Parameters:
entries: TranscriptEntry[]- Array of transcript entries to analyze
Returns: Promise<AnalysisResult> - Analysis results with discovered patterns
Example:
const analyzer = new TranscriptAnalyzer({
minOccurrences: 3,
maxDepth: 5
});
const entries = await loadTranscriptEntries('./transcripts/*.jsonl');
const analysis = await analyzer.analyze(entries);
console.log(`Found ${Object.keys(analysis.toolPatterns).length} tool patterns`);
console.log(`Processed ${analysis.statistics.totalEntries} entries`);Analyzes tool usage patterns from tool invocation entries.
Parameters:
entries: ToolInvocationEntry[]- Tool invocation entries
Returns: Promise<Record<string, ToolPattern>> - Tool patterns keyed by tool name
Example:
const toolEntries = entries.filter(e => e.type === 'tool_use') as ToolInvocationEntry[];
const toolPatterns = await analyzer.analyzeToolPatterns(toolEntries);
Object.entries(toolPatterns).forEach(([toolName, pattern]) => {
console.log(`${toolName}: ${pattern.occurrences} uses, confidence: ${pattern.confidence}`);
});Analyzes message patterns from message entries.
Parameters:
entries: MessageEntry[]- Message entries
Returns: Promise<MessagePattern[]> - Discovered message patterns
Analyzes general entry patterns from all transcript entries.
Parameters:
entries: TranscriptEntry[]- All transcript entries
Returns: Promise<Record<string, EntryPattern>> - Entry patterns keyed by entry type
interface AnalysisConfig {
/** Minimum occurrences required to generate a pattern */
minOccurrences?: number; // default: 2
/** Whether to include optional properties in analysis */
includeOptionalProperties?: boolean; // default: true
/** Maximum depth for nested object analysis */
maxDepth?: number; // default: 5
/** Whether to collect value examples */
collectExamples?: boolean; // default: true
/** Maximum number of examples per pattern */
maxExamples?: number; // default: 10
}Generates TypeScript type definitions from analysis results.
constructor(config?: GenerationConfig)Generates TypeScript code from analysis results.
Parameters:
analysis: AnalysisResult- Results from transcript analysis
Returns: Promise<GeneratedCode> - Generated TypeScript code
Example:
const generator = new TypeScriptGenerator({
generateGuards: true,
generateExamples: true,
interfacePrefix: 'Discovered',
includeJSDoc: true
});
const generatedCode = await generator.generate(analysisResult);
console.log('Generated types:');
console.log(generatedCode.types);
if (generatedCode.guards) {
console.log('Generated type guards:');
console.log(generatedCode.guards);
}Generates TypeScript interfaces for tool input/output patterns.
Parameters:
toolPatterns: Record<string, ToolPattern>- Tool patterns from analysis
Returns: Promise<string> - Generated TypeScript interfaces
Generates type guard functions for runtime type checking.
Parameters:
analysis: AnalysisResult- Analysis results
Returns: Promise<string> - Generated type guard functions
Example:
const guards = await generator.generateTypeGuards(analysis);
console.log(guards);
// Output:
// export function isDiscoveredBashInput(value: unknown): value is DiscoveredBashInput {
// return typeof value === 'object' && value !== null &&
// 'command' in value && typeof (value as any).command === 'string';
// }Generates usage examples from analysis results.
Parameters:
analysis: AnalysisResult- Analysis results
Returns: Promise<string> - Generated usage examples
interface GenerationConfig {
/** Whether to generate type guards */
generateGuards?: boolean; // default: true
/** Whether to generate usage examples */
generateExamples?: boolean; // default: true
/** Prefix for generated interface names */
interfacePrefix?: string; // default: 'Discovered'
/** Whether to include JSDoc comments */
includeJSDoc?: boolean; // default: true
/** Indentation style */
indentation?: 'spaces' | 'tabs'; // default: 'spaces'
/** Number of spaces for indentation */
indentSize?: number; // default: 2
/** Whether to use semicolons */
useSemicolons?: boolean; // default: true
}Validates generated TypeScript code and checks compatibility with existing types.
constructor(config?: ValidationConfig)Validates generated TypeScript code.
Parameters:
generatedCode: GeneratedCode- Generated TypeScript codeanalysis: AnalysisResult- Original analysis results
Returns: Promise<ValidationResult> - Validation results
Example:
const validator = new TypeScriptValidator({
existingTypesDir: './src/types',
strictValidation: true
});
const validationResult = await validator.validate(generatedCode, analysis);
if (validationResult.valid) {
console.log('✅ Generated types are valid');
} else {
console.log('❌ Validation failed:');
validationResult.errors.forEach(error => {
console.log(` - [${error.type}] ${error.message}`);
if (error.suggestion) {
console.log(` Suggestion: ${error.suggestion}`);
}
});
}Validates TypeScript syntax of generated code.
Parameters:
code: string- TypeScript code to validate
Returns: Promise<ValidationError[]> - Syntax validation errors
validateCompatibility(generatedCode: GeneratedCode, existingTypesDir: string): Promise<CompatibilityReport>
Checks compatibility between generated types and existing type definitions.
Parameters:
generatedCode: GeneratedCode- Generated TypeScript codeexistingTypesDir: string- Directory containing existing type files
Returns: Promise<CompatibilityReport> - Compatibility analysis
Example:
const compatibilityReport = await validator.validateCompatibility(
generatedCode,
'./src/types'
);
console.log(`Compatible types: ${compatibilityReport.compatible.length}`);
console.log(`Conflicting types: ${compatibilityReport.conflicts.length}`);
compatibilityReport.conflicts.forEach(conflict => {
console.log(`Conflict: ${conflict.name} (${conflict.severity})`);
if (conflict.resolution) {
console.log(`Resolution: ${conflict.resolution}`);
}
});interface ValidationConfig {
/** Directory containing existing type definitions */
existingTypesDir?: string;
/** Whether to perform strict validation */
strictValidation?: boolean; // default: false
/** TypeScript compiler options */
compilerOptions?: ts.CompilerOptions;
/** Whether to check for naming conflicts */
checkNamingConflicts?: boolean; // default: true
}interface DiscoveryConfig {
/** Input sources for discovery */
sources: {
/** Directory containing transcript files */
transcriptDir?: string;
/** Specific transcript files to analyze */
files?: string[];
/** Raw transcript entries (for programmatic use) */
entries?: TranscriptEntry[];
};
/** Output configuration */
output: {
/** Output directory for generated types */
outputDir: string;
/** Generated TypeScript file name */
filename?: string; // default: 'discovered-types.ts'
/** Whether to generate type guards */
generateGuards?: boolean; // default: true
/** Whether to generate usage examples */
generateExamples?: boolean; // default: true
};
/** Analysis configuration */
analysis: {
/** Minimum occurrences required to generate a type */
minOccurrences?: number; // default: 2
/** Whether to include optional properties */
includeOptionalProperties?: boolean; // default: true
/** Maximum depth for nested object analysis */
maxDepth?: number; // default: 5
};
/** Validation configuration */
validation: {
/** Whether to validate against existing types */
validateAgainstExisting?: boolean; // default: true
/** Directory containing existing type definitions */
existingTypesDir?: string; // default: './src'
};
}interface AnalysisResult {
/** Tool usage patterns discovered */
toolPatterns: Record<string, ToolPattern>;
/** Message patterns discovered */
messagePatterns: MessagePattern[];
/** Entry patterns discovered */
entryPatterns: Record<string, EntryPattern>;
/** Statistics about the analysis */
statistics: AnalysisStatistics;
}interface ToolPattern {
/** Tool name */
name: string;
/** Number of occurrences found */
occurrences: number;
/** Input parameter patterns */
inputSchema: ParameterPattern;
/** Response patterns */
responseSchema: ParameterPattern;
/** Examples of actual usage */
examples: ToolUsageExample[];
/** Confidence score (0-1) for the pattern */
confidence: number;
}interface ParameterPattern {
/** TypeScript type string */
type: string;
/** Whether the parameter is required */
required: boolean;
/** Possible values (for enums/unions) */
values?: unknown[];
/** Nested properties (for objects) */
properties?: Record<string, ParameterPattern>;
/** Array item type (for arrays) */
items?: ParameterPattern;
/** Examples of actual values */
examples: unknown[];
/** Description inferred from usage */
description?: string;
}interface GeneratedCode {
/** Main type definitions */
types: string;
/** Type guard functions */
guards?: string;
/** Usage examples */
examples?: string;
/** Export statements */
exports: string;
}interface ValidationResult {
/** Whether validation passed */
valid: boolean;
/** Validation errors found */
errors: ValidationError[];
/** Warnings about potential issues */
warnings: ValidationWarning[];
/** Compatibility report with existing types */
compatibility: CompatibilityReport;
}interface DiscoveryState {
/** Current phase of discovery */
phase: 'initializing' | 'analyzing' | 'generating' | 'validating' | 'complete' | 'error';
/** Progress percentage (0-100) */
progress: number;
/** Current status message */
status: string;
/** Results from completed phases */
results: {
analysis?: AnalysisResult;
generation?: GeneratedCode;
validation?: ValidationResult;
};
/** Any errors that occurred */
errors: Error[];
/** Start time of discovery */
startTime: Date;
/** End time of discovery (if complete) */
endTime?: Date;
}interface DiscoveryEvent {
/** Event type */
type: 'progress' | 'phase-change' | 'error' | 'complete';
/** Event data */
data: DiscoveryState;
/** Timestamp of event */
timestamp: Date;
}| Event Type | Description | When Fired |
|---|---|---|
progress |
Progress update within current phase | Periodically during analysis, generation, validation |
phase-change |
Discovery entered a new phase | At the start of each major phase |
error |
An error occurred during discovery | When any recoverable or unrecoverable error happens |
complete |
Discovery process completed | When all phases complete successfully |
// Basic progress tracking
engine.on((event) => {
console.log(`[${event.type}] ${event.data.phase}: ${event.data.status}`);
});
// Progress bar implementation
engine.on((event) => {
if (event.type === 'progress') {
updateProgressBar(event.data.phase, event.data.progress);
}
});
// Error handling
engine.on((event) => {
if (event.type === 'error') {
logError('Discovery error:', event.data.errors);
// Optionally abort or retry
engine.abort();
}
});
// Phase-specific handling
engine.on((event) => {
if (event.type === 'phase-change') {
switch (event.data.phase) {
case 'analyzing':
console.log('Starting pattern analysis...');
break;
case 'generating':
console.log('Generating TypeScript types...');
break;
case 'validating':
console.log('Validating generated code...');
break;
case 'complete':
console.log('Discovery completed successfully!');
displayResults(event.data.results);
break;
}
}
});import { DiscoveryEngine } from 'cctypes/transcript/discovery';
async function basicDiscovery() {
const engine = new DiscoveryEngine({
sources: {
files: ['./transcripts/**/*.jsonl']
},
output: {
outputDir: './generated-types',
generateGuards: true,
generateExamples: true
},
analysis: {
minOccurrences: 2,
maxDepth: 5
}
});
const result = await engine.discover();
if (result.phase === 'complete' && result.results.analysis) {
console.log('Discovery completed!');
console.log(`Tools found: ${Object.keys(result.results.analysis.toolPatterns).length}`);
console.log(`Entries processed: ${result.results.analysis.statistics.totalEntries}`);
}
}import {
DiscoveryEngine,
TranscriptAnalyzer,
TypeScriptGenerator,
TypeScriptValidator
} from 'cctypes/transcript/discovery';
class CustomAnalyzer extends TranscriptAnalyzer {
protected override async analyzeToolPatterns(entries: ToolInvocationEntry[]) {
const patterns = await super.analyzeToolPatterns(entries);
// Custom analysis: boost confidence for frequently used tools
Object.values(patterns).forEach(pattern => {
if (pattern.occurrences > 100) {
pattern.confidence = Math.min(1.0, pattern.confidence + 0.1);
}
});
return patterns;
}
}
class CustomGenerator extends TypeScriptGenerator {
protected override generateInterface(name: string, pattern: ParameterPattern): string {
// Add custom JSDoc with confidence and occurrence info
const jsdoc = `/**\n * ${name} - Generated from transcript analysis\n * Occurrences: ${pattern.examples.length}\n */`;
const interfaceCode = super.generateInterface(name, pattern);
return `${jsdoc}\n${interfaceCode}`;
}
}
async function advancedDiscovery() {
const config = {
sources: {
transcriptDir: './transcripts'
},
output: {
outputDir: './src/generated',
filename: 'claude-types.ts'
},
analysis: {
minOccurrences: 5,
maxDepth: 6
},
validation: {
validateAgainstExisting: true,
existingTypesDir: './src/types'
}
};
const engine = new DiscoveryEngine(config);
// Use custom components
engine.setAnalyzer(new CustomAnalyzer());
engine.setGenerator(new CustomGenerator());
engine.setValidator(new TypeScriptValidator({ strictValidation: true }));
// Set up comprehensive event handling
engine.on((event) => {
switch (event.type) {
case 'progress':
console.log(`Progress: ${event.data.phase} ${event.data.progress}%`);
break;
case 'phase-change':
console.log(`Phase: ${event.data.phase} - ${event.data.status}`);
break;
case 'error':
console.error('Error:', event.data.errors);
break;
case 'complete':
console.log('Discovery completed successfully!');
displayDetailedResults(event.data);
break;
}
});
try {
const result = await engine.discover();
return result;
} catch (error) {
console.error('Discovery failed:', error);
throw error;
}
}
function displayDetailedResults(state: DiscoveryState) {
const { analysis, generation, validation } = state.results;
if (analysis) {
console.log('\n=== Analysis Results ===');
console.log(`Tools discovered: ${Object.keys(analysis.toolPatterns).length}`);
console.log(`Message patterns: ${analysis.messagePatterns.length}`);
console.log(`Processing time: ${analysis.statistics.processingTime}ms`);
// Show top tools by usage
const topTools = Object.entries(analysis.toolPatterns)
.sort(([,a], [,b]) => b.occurrences - a.occurrences)
.slice(0, 5);
console.log('\nTop 5 tools by usage:');
topTools.forEach(([name, pattern], i) => {
console.log(` ${i + 1}. ${name}: ${pattern.occurrences} uses (${Math.round(pattern.confidence * 100)}% confidence)`);
});
}
if (generation) {
console.log('\n=== Generation Results ===');
console.log(`Generated ${generation.types.length} characters of TypeScript code`);
if (generation.guards) {
console.log(`Generated type guards: ${generation.guards.split('function').length - 1}`);
}
}
if (validation) {
console.log('\n=== Validation Results ===');
console.log(`Valid: ${validation.valid ? '✅' : '❌'}`);
console.log(`Errors: ${validation.errors.length}`);
console.log(`Warnings: ${validation.warnings.length}`);
if (validation.errors.length > 0) {
console.log('\nValidation errors:');
validation.errors.forEach((error, i) => {
console.log(` ${i + 1}. [${error.type}] ${error.message}`);
});
}
}
}import { TranscriptAnalyzer } from 'cctypes/transcript/discovery';
import { createReadStream } from 'fs';
import { createInterface } from 'readline';
class StreamingAnalyzer extends TranscriptAnalyzer {
async analyzeFromStream(filePath: string): Promise<AnalysisResult> {
const entries: TranscriptEntry[] = [];
const fileStream = createReadStream(filePath);
const rl = createInterface({
input: fileStream,
crlfDelay: Infinity
});
for await (const line of rl) {
try {
const entry = JSON.parse(line) as TranscriptEntry;
entries.push(entry);
// Process in batches to manage memory
if (entries.length >= 1000) {
await this.processBatch(entries.splice(0, 1000));
}
} catch (error) {
console.warn(`Skipping invalid JSON line: ${line}`);
}
}
// Process remaining entries
if (entries.length > 0) {
await this.processBatch(entries);
}
return this.getAccumulatedResults();
}
private async processBatch(entries: TranscriptEntry[]): Promise<void> {
// Process batch and accumulate results
const batchAnalysis = await this.analyze(entries);
this.accumulateResults(batchAnalysis);
}
}
async function analyzeStreamingData() {
const analyzer = new StreamingAnalyzer();
const result = await analyzer.analyzeFromStream('./large-transcript.jsonl');
console.log('Streaming analysis completed:', result.statistics);
}// webpack-plugin.js
class TranscriptDiscoveryPlugin {
constructor(options = {}) {
this.options = {
transcriptPattern: './transcripts/**/*.jsonl',
outputDir: './src/generated',
...options
};
}
apply(compiler) {
compiler.hooks.beforeCompile.tapPromise('TranscriptDiscovery', async () => {
const { DiscoveryEngine } = await import('cctypes/transcript/discovery');
const engine = new DiscoveryEngine({
sources: { files: [this.options.transcriptPattern] },
output: { outputDir: this.options.outputDir },
analysis: { minOccurrences: 2 }
});
await engine.discover();
console.log('Transcript discovery completed before build');
});
}
}
module.exports = TranscriptDiscoveryPlugin;